@humain/ui 2.1.63 → 2.1.65
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/organisms/ai/AIToolCall/AIToolCall.d.ts +9 -3
- package/dist/components/organisms/ai/AIToolRun/index.d.ts +1 -1
- package/dist/components/organisms/ai/AIToolRun/validation.d.ts +24 -3
- package/dist/components/organisms/ai/_shared/format-ai-duration.d.ts +1 -0
- package/dist/components/organisms/ai/_shared/workflow-step-renderer.d.ts +1 -0
- package/dist/index.js +52 -52
- package/dist/index151.js +1 -1
- package/dist/index174.js +7 -339
- package/dist/index174.js.map +1 -1
- package/dist/index175.js +310 -137
- package/dist/index175.js.map +1 -1
- package/dist/index176.js +148 -174
- package/dist/index176.js.map +1 -1
- package/dist/index177.js +186 -78
- package/dist/index177.js.map +1 -1
- package/dist/index178.js +74 -124
- package/dist/index178.js.map +1 -1
- package/dist/index179.js +133 -1
- package/dist/index179.js.map +1 -0
- package/dist/index180.js +2 -201
- package/dist/index181.js +201 -0
- package/dist/{index180.js.map → index181.js.map} +1 -1
- package/dist/index183.js +130 -166
- package/dist/index183.js.map +1 -1
- package/dist/index184.js +195 -983
- package/dist/index184.js.map +1 -1
- package/dist/index185.js +1069 -369
- package/dist/index185.js.map +1 -1
- package/dist/index186.js +395 -197
- package/dist/index186.js.map +1 -1
- package/dist/index187.js +198 -243
- package/dist/index187.js.map +1 -1
- package/dist/index188.js +263 -3
- package/dist/index188.js.map +1 -1
- package/dist/index189.js +3 -209
- package/dist/index189.js.map +1 -1
- package/dist/index190.js +190 -777
- package/dist/index190.js.map +1 -1
- package/dist/index191.js +771 -252
- package/dist/index191.js.map +1 -1
- package/dist/index192.js +250 -65
- package/dist/index192.js.map +1 -1
- package/dist/index193.js +72 -523
- package/dist/index193.js.map +1 -1
- package/dist/index194.js +537 -144
- package/dist/index194.js.map +1 -1
- package/dist/index195.js +139 -720
- package/dist/index195.js.map +1 -1
- package/dist/index196.js +707 -167
- package/dist/index196.js.map +1 -1
- package/dist/index197.js +175 -151
- package/dist/index197.js.map +1 -1
- package/dist/index198.js +152 -487
- package/dist/index198.js.map +1 -1
- package/dist/index199.js +472 -225
- package/dist/index199.js.map +1 -1
- package/dist/index200.js +236 -260
- package/dist/index200.js.map +1 -1
- package/dist/index201.js +265 -215
- package/dist/index201.js.map +1 -1
- package/dist/index202.js +207 -307
- package/dist/index202.js.map +1 -1
- package/dist/index203.js +302 -135
- package/dist/index203.js.map +1 -1
- package/dist/index204.js +140 -271
- package/dist/index204.js.map +1 -1
- package/dist/index205.js +263 -253
- package/dist/index205.js.map +1 -1
- package/dist/index206.js +244 -137
- package/dist/index206.js.map +1 -1
- package/dist/index207.js +100 -238
- package/dist/index207.js.map +1 -1
- package/dist/index208.js +278 -74
- package/dist/index208.js.map +1 -1
- package/dist/index209.js +56 -97
- package/dist/index209.js.map +1 -1
- package/dist/index210.js +142 -47
- package/dist/index210.js.map +1 -1
- package/dist/index211.js +38 -84
- package/dist/index211.js.map +1 -1
- package/dist/index212.js +72 -252
- package/dist/index212.js.map +1 -1
- package/dist/index213.js +274 -26
- package/dist/index213.js.map +1 -1
- package/dist/index214.js +29 -94
- package/dist/index214.js.map +1 -1
- package/dist/index215.js +98 -25
- package/dist/index215.js.map +1 -1
- package/dist/index216.js +20 -565
- package/dist/index216.js.map +1 -1
- package/dist/index217.js +564 -17
- package/dist/index217.js.map +1 -1
- package/dist/index218.js +20 -23
- package/dist/index218.js.map +1 -1
- package/dist/index219.js +20 -95
- package/dist/index219.js.map +1 -1
- package/dist/index220.js +92 -88
- package/dist/index220.js.map +1 -1
- package/dist/index221.js +97 -29
- package/dist/index221.js.map +1 -1
- package/dist/index222.js +24 -470
- package/dist/index222.js.map +1 -1
- package/dist/index223.js +446 -196
- package/dist/index223.js.map +1 -1
- package/dist/index224.js +199 -729
- package/dist/index224.js.map +1 -1
- package/dist/index225.js +750 -61
- package/dist/index225.js.map +1 -1
- package/dist/index226.js +58 -181
- package/dist/index226.js.map +1 -1
- package/dist/index227.js +175 -259
- package/dist/index227.js.map +1 -1
- package/dist/index228.js +246 -172
- package/dist/index228.js.map +1 -1
- package/dist/index229.js +195 -32
- package/dist/index229.js.map +1 -1
- package/dist/index230.js +12 -40
- package/dist/index230.js.map +1 -1
- package/dist/index231.js +23 -26
- package/dist/index231.js.map +1 -1
- package/dist/index232.js +45 -22
- package/dist/index232.js.map +1 -1
- package/dist/index233.js +27 -48
- package/dist/index233.js.map +1 -1
- package/dist/index234.js +52 -26
- package/dist/index234.js.map +1 -1
- package/dist/index235.js +40 -225
- package/dist/index235.js.map +1 -1
- package/dist/index236.js +217 -39
- package/dist/index236.js.map +1 -1
- package/dist/index237.js +50 -0
- package/dist/index237.js.map +1 -0
- package/dist/styles.css +1 -1
- package/dist/wc/AIToolCall.js +218 -0
- package/dist/wc/AIToolCall.js.map +1 -0
- package/dist/wc/hf-ai-tool-call.js +34 -219
- package/dist/wc/hf-ai-tool-call.js.map +1 -1
- package/dist/wc/hf-ai-tool-run.js +673 -576
- package/dist/wc/hf-ai-tool-run.js.map +1 -1
- package/dist/wc/workflow-step-renderer.js +79 -78
- package/dist/wc/workflow-step-renderer.js.map +1 -1
- package/dist/wc-react/AIToolCall.js +218 -0
- package/dist/wc-react/AIToolCall.js.map +1 -0
- package/dist/wc-react/hf-ai-tool-call.js +32 -217
- package/dist/wc-react/hf-ai-tool-call.js.map +1 -1
- package/dist/wc-react/hf-ai-tool-run.js +698 -601
- package/dist/wc-react/hf-ai-tool-run.js.map +1 -1
- package/dist/wc-react/workflow-step-renderer.js +58 -57
- package/dist/wc-react/workflow-step-renderer.js.map +1 -1
- package/package.json +1 -1
- package/skills/humain-ui/SKILL.md +1 -1
- package/skills/humain-ui-wc/SKILL.md +1 -1
- package/skills/humain-ui-wc.skill +0 -0
- package/skills/humain-ui.skill +0 -0
- package/dist/index182.js +0 -143
- package/dist/index182.js.map +0 -1
- package/dist/wc/wrench.js +0 -10
- package/dist/wc/wrench.js.map +0 -1
- package/dist/wc-react/wrench.js +0 -10
- package/dist/wc-react/wrench.js.map +0 -1
package/dist/index187.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index187.js","names":[],"sources":["../src/components/organisms/overlays/Tooltip/Tooltip.tsx"],"sourcesContent":["'use client';\n\nimport { Tooltip as TooltipPrimitive } from '@base-ui/react/tooltip';\nimport { cva } from 'class-variance-authority';\nimport * as React from 'react';\nimport { cn, extractText } from '@/lib/utils';\n\nconst tooltipVariants = cva(\n 'data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 motion-reduce:animate-none z-50 w-fit max-w-xs origin-(--transform-origin) px-3 py-1.5 text-xs shadow-[var(--shadow-tooltip)]',\n {\n variants: {\n variant: {\n primary: 'bg-foreground text-background',\n secondary:\n 'bg-secondary text-secondary-foreground border border-border shadow-sm',\n info: 'bg-info text-primary-foreground',\n success: 'bg-success text-primary-foreground',\n warning: 'bg-warning text-primary-foreground',\n destructive: 'bg-destructive text-primary-foreground',\n },\n shape: {\n default: 'rounded-md',\n rounded: 'rounded-full',\n },\n },\n defaultVariants: {\n variant: 'primary',\n shape: 'default',\n },\n },\n);\n\nconst arrowVariants = cva(\n 'size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] z-50 data-[side=bottom]:top-1 data-[side=left]:top-1/2! data-[side=left]:-right-1 data-[side=left]:-translate-y-1/2 data-[side=right]:top-1/2! data-[side=right]:-left-1 data-[side=right]:-translate-y-1/2 data-[side=top]:-bottom-2.5',\n {\n variants: {\n variant: {\n primary: 'bg-foreground fill-foreground',\n secondary: 'bg-secondary fill-secondary',\n info: 'bg-info fill-info',\n success: 'bg-success fill-success',\n warning: 'bg-warning fill-warning',\n destructive: 'bg-destructive fill-destructive',\n },\n },\n defaultVariants: {\n variant: 'primary',\n },\n },\n);\n\ntype TooltipVariant =\n | 'primary'\n | 'secondary'\n | 'info'\n | 'success'\n | 'warning'\n | 'destructive';\ntype TooltipShape = 'default' | 'rounded';\ntype TooltipPosition = 'top' | 'bottom' | 'left' | 'right' | 'none';\n\n// =============================================================================\n// Base Tooltip Sub-components\n// =============================================================================\n\nfunction TooltipProvider({\n delay = 0,\n ...props\n}: TooltipPrimitive.Provider.Props) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delay={delay}\n {...props}\n />\n );\n}\n\nfunction TooltipRoot(props: TooltipPrimitive.Root.Props) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />;\n}\n\nconst TooltipTrigger = React.forwardRef<\n HTMLButtonElement,\n TooltipPrimitive.Trigger.Props\n>(function TooltipTrigger(props, ref) {\n return (\n <TooltipPrimitive.Trigger\n ref={ref}\n data-slot=\"tooltip-trigger\"\n {...props}\n />\n );\n});\n\ninterface TooltipPopupProps\n extends TooltipPrimitive.Popup.Props,\n Pick<\n TooltipPrimitive.Positioner.Props,\n 'align' | 'alignOffset' | 'side' | 'sideOffset'\n > {\n variant?: TooltipVariant;\n shape?: TooltipShape;\n /** Optional Base UI portal container for the tooltip popup. */\n container?: TooltipPrimitive.Portal.Props['container'];\n /** When true or position is 'none', hides the arrow */\n hideArrow?: boolean;\n}\n\nfunction TooltipPopup({\n className,\n side = 'top',\n sideOffset = 4,\n align = 'center',\n alignOffset = 0,\n variant = 'primary',\n shape = 'default',\n hideArrow = false,\n container,\n children,\n ...props\n}: TooltipPopupProps) {\n return (\n <TooltipPrimitive.Portal container={container}>\n <TooltipPrimitive.Positioner\n align={align}\n alignOffset={alignOffset}\n side={side}\n sideOffset={sideOffset}\n className=\"isolate z-50\"\n >\n <TooltipPrimitive.Popup\n data-slot=\"tooltip-popup\"\n className={cn(tooltipVariants({ variant, shape }), className)}\n {...props}\n >\n {children}\n {!hideArrow && (\n <TooltipPrimitive.Arrow className={arrowVariants({ variant })} />\n )}\n </TooltipPrimitive.Popup>\n </TooltipPrimitive.Positioner>\n </TooltipPrimitive.Portal>\n );\n}\n\n// =============================================================================\n// Rich Content Sub-components\n// =============================================================================\n\nfunction TooltipIcon({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <span\n data-slot=\"tooltip-icon\"\n className={cn('shrink-0 [&>svg]:size-4', className)}\n >\n {children}\n </span>\n );\n}\nTooltipIcon.displayName = 'Tooltip.Icon';\n\nfunction TooltipAvatar({\n src,\n alt,\n children,\n className,\n}: {\n src?: string;\n alt: string;\n children?: React.ReactNode;\n className?: string;\n}) {\n if (children) {\n return (\n <span data-slot=\"tooltip-avatar\" className={cn('shrink-0', className)}>\n {children}\n </span>\n );\n }\n return (\n <img\n data-slot=\"tooltip-avatar\"\n src={src}\n alt={alt}\n className={cn('size-4 shrink-0 rounded-full object-cover', className)}\n />\n );\n}\nTooltipAvatar.displayName = 'Tooltip.Avatar';\n\nfunction TooltipContent({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <div\n data-slot=\"tooltip-content\"\n className={cn('flex flex-col gap-0.5', className)}\n >\n {children}\n </div>\n );\n}\nTooltipContent.displayName = 'Tooltip.Content';\n\nfunction TooltipTitle({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <span\n data-slot=\"tooltip-title\"\n className={cn('text-xs font-semibold leading-4', className)}\n >\n {children}\n </span>\n );\n}\nTooltipTitle.displayName = 'Tooltip.Title';\n\ninterface TooltipSubtitleProps {\n children: React.ReactNode;\n className?: string;\n /** Variant affects subtitle opacity */\n variant?: TooltipVariant;\n}\n\nfunction TooltipSubtitle({\n children,\n className,\n variant = 'primary',\n}: TooltipSubtitleProps) {\n const subtitleClass =\n variant === 'secondary'\n ? 'text-muted-foreground'\n : 'text-inherit opacity-70';\n\n return (\n <span\n data-slot=\"tooltip-subtitle\"\n className={cn('text-xs font-medium leading-4', subtitleClass, className)}\n >\n {children}\n </span>\n );\n}\nTooltipSubtitle.displayName = 'Tooltip.Subtitle';\n\nfunction TooltipBadge({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <span data-slot=\"tooltip-badge\" className={cn('shrink-0', className)}>\n {children}\n </span>\n );\n}\nTooltipBadge.displayName = 'Tooltip.Badge';\n\ninterface TooltipImageProps {\n src: string;\n alt: string;\n layout?: 'vertical' | 'horizontal';\n className?: string;\n}\n\nfunction TooltipImage({\n src,\n alt,\n layout = 'vertical',\n className,\n}: TooltipImageProps) {\n return (\n <img\n data-slot=\"tooltip-image\"\n src={src}\n alt={alt}\n className={cn(\n 'rounded-md object-cover',\n layout === 'vertical' ? 'w-full h-20' : 'w-20 h-14 shrink-0',\n className,\n )}\n />\n );\n}\nTooltipImage.displayName = 'Tooltip.Image';\n\n// =============================================================================\n// High-level Tooltip Wrapper Component\n// =============================================================================\n\ninterface TooltipProps {\n /** The element that triggers the tooltip (required) */\n trigger: React.ReactElement;\n /** The main tooltip text */\n content: React.ReactNode;\n /** Style variant */\n variant?: TooltipVariant;\n /** Shape variant */\n shape?: TooltipShape;\n /** Arrow position - 'none' hides the arrow */\n position?: TooltipPosition;\n /** Alignment of tooltip relative to trigger */\n align?: 'start' | 'center' | 'end';\n /** Delay in ms before showing tooltip */\n delayDuration?: number;\n /** Distance from trigger */\n sideOffset?: number;\n /** Optional icon before content */\n icon?: React.ReactNode;\n /** Optional avatar - string for src or ReactNode for custom */\n avatar?: string | React.ReactNode;\n /** Optional supporting text */\n subtitle?: React.ReactNode;\n /** Optional badge element */\n badge?: React.ReactNode;\n /** Optional image */\n image?: string;\n /** Image layout - auto-detected or override */\n imageLayout?: 'vertical' | 'horizontal';\n /** Optional Base UI portal container. Takes precedence over the trigger owner document. */\n container?: TooltipPrimitive.Portal.Props['container'];\n /** Override content with custom children */\n children?: React.ReactNode;\n}\n\ninterface TooltipRenderedContentProps {\n children?: React.ReactNode;\n content: React.ReactNode;\n variant: TooltipVariant;\n icon?: React.ReactNode;\n avatar?: string | React.ReactNode;\n subtitle?: React.ReactNode;\n badge?: React.ReactNode;\n image?: string;\n imageLayout: 'vertical' | 'horizontal';\n hasRichContent: React.ReactNode;\n contentAlt: string;\n}\n\nfunction TooltipRenderedContent({\n children,\n content,\n variant,\n icon,\n avatar,\n subtitle,\n badge,\n image,\n imageLayout,\n hasRichContent,\n contentAlt,\n}: TooltipRenderedContentProps) {\n if (children) return children;\n\n const subtitleElement = subtitle && (\n <TooltipSubtitle variant={variant}>{subtitle}</TooltipSubtitle>\n );\n\n if (image) {\n return (\n <div\n className={cn(\n 'flex gap-1.5 delight-tooltip-stagger',\n imageLayout === 'vertical' ? 'flex-col' : 'flex-row items-center',\n )}\n >\n <TooltipImage\n src={image}\n alt={contentAlt}\n layout={imageLayout}\n className=\"delight-tooltip-image\"\n />\n <TooltipContent>\n <TooltipTitle>{content}</TooltipTitle>\n {subtitleElement}\n </TooltipContent>\n </div>\n );\n }\n\n if (!hasRichContent) return content;\n\n return (\n <div className=\"flex items-center gap-1.5 delight-tooltip-stagger\">\n {avatar &&\n (typeof avatar === 'string' ? (\n <TooltipAvatar src={avatar} alt={contentAlt} />\n ) : (\n <TooltipAvatar alt={contentAlt}>{avatar}</TooltipAvatar>\n ))}\n {icon && <TooltipIcon>{icon}</TooltipIcon>}\n <TooltipContent>\n <TooltipTitle>{content}</TooltipTitle>\n {subtitleElement}\n </TooltipContent>\n {badge && <TooltipBadge>{badge}</TooltipBadge>}\n </div>\n );\n}\n\nconst Tooltip = ({\n trigger,\n content,\n variant = 'primary',\n shape = 'default',\n position = 'top',\n align = 'center',\n delayDuration,\n sideOffset = 6,\n icon,\n avatar,\n subtitle,\n badge,\n image,\n imageLayout,\n container,\n children,\n}: TooltipProps) => {\n const [triggerElement, setTriggerElement] =\n React.useState<HTMLElement | null>(null);\n const [triggerPortalContainer, setTriggerPortalContainer] =\n React.useState<HTMLElement | null>(null);\n const setTriggerRef = React.useCallback((element: HTMLElement | null) => {\n setTriggerElement((currentElement) =>\n currentElement === element ? currentElement : element,\n );\n }, []);\n\n React.useEffect(() => {\n const nextContainer = triggerElement?.ownerDocument.body ?? null;\n setTriggerPortalContainer((currentContainer) =>\n currentContainer === nextContainer ? currentContainer : nextContainer,\n );\n }, [triggerElement]);\n\n // Determine if we have rich content\n const hasRichContent = icon || avatar || subtitle || badge || image;\n\n const resolvedImageLayout = imageLayout ?? 'vertical';\n const contentAlt = extractText(content);\n const portalContainer =\n container === undefined ? triggerPortalContainer : container;\n\n return (\n <TooltipProvider delay={delayDuration}>\n <TooltipRoot>\n <TooltipTrigger ref={setTriggerRef} render={trigger} />\n <TooltipPopup\n container={portalContainer}\n side={position === 'none' ? 'top' : position}\n align={align}\n sideOffset={sideOffset}\n variant={variant}\n shape={shape}\n hideArrow={position === 'none'}\n className={cn(hasRichContent && 'p-2')}\n >\n <TooltipRenderedContent\n content={content}\n variant={variant}\n icon={icon}\n avatar={avatar}\n subtitle={subtitle}\n badge={badge}\n image={image}\n imageLayout={resolvedImageLayout}\n hasRichContent={hasRichContent}\n contentAlt={contentAlt}\n >\n {children}\n </TooltipRenderedContent>\n </TooltipPopup>\n </TooltipRoot>\n </TooltipProvider>\n );\n};\n\nTooltip.displayName = 'Tooltip';\nTooltipProvider.displayName = 'Tooltip.Provider';\nTooltipRoot.displayName = 'Tooltip.Root';\nTooltipTrigger.displayName = 'Tooltip.Trigger';\nTooltipPopup.displayName = 'Tooltip.Popup';\n\n/**\n * Tooltip component with dot notation for compound parts.\n *\n * @example\n * ```tsx\n * // Simple usage (recommended for most cases)\n * <Tooltip trigger={<Button>Hover me</Button>} content=\"Tooltip text\" />\n *\n * // With variants\n * <Tooltip trigger={<Button>Save</Button>} content=\"Saved!\" variant=\"success\" shape=\"rounded\" />\n *\n * // With rich content\n * <Tooltip trigger={<Button>Info</Button>} content=\"Title\" icon={<InfoIcon />} subtitle=\"Description\" />\n *\n * // Advanced usage with dot notation\n * <Tooltip.Root>\n * <Tooltip.Trigger render={<Button>Hover me</Button>} />\n * <Tooltip.Popup variant=\"info\">\n * <Tooltip.Icon><InfoIcon /></Tooltip.Icon>\n * <Tooltip.Content>\n * <Tooltip.Title>Title</Tooltip.Title>\n * <Tooltip.Subtitle>Description</Tooltip.Subtitle>\n * </Tooltip.Content>\n * </Tooltip.Popup>\n * </Tooltip.Root>\n * ```\n */\nconst TooltipCompound = Object.assign(Tooltip, {\n Root: TooltipRoot,\n Provider: TooltipProvider,\n Trigger: TooltipTrigger,\n Popup: TooltipPopup,\n Icon: TooltipIcon,\n Avatar: TooltipAvatar,\n Content: TooltipContent,\n Title: TooltipTitle,\n Subtitle: TooltipSubtitle,\n Badge: TooltipBadge,\n Image: TooltipImage,\n});\n\nexport type { TooltipPosition, TooltipProps, TooltipShape, TooltipVariant };\nexport {\n arrowVariants,\n TooltipAvatar,\n TooltipBadge,\n TooltipCompound as Tooltip,\n TooltipContent,\n TooltipIcon,\n TooltipImage,\n TooltipPopup,\n TooltipProvider,\n TooltipRoot,\n TooltipSubtitle,\n TooltipTitle,\n TooltipTrigger,\n tooltipVariants,\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index187.js","names":[],"sources":["../src/components/organisms/content/ActivityFeed/ActivityFeed.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport * as React from 'react';\nimport { Badge, type BadgeProps } from '@/components/atoms/display/Badge';\nimport { Avatar, type AvatarProps } from '@/components/molecules/data/Avatar';\nimport { FileTypeIcon } from '@/components/molecules/files/FileUpload';\nimport { cn } from '@/lib/utils';\n\n/* -------------------------------------------------------------------------------------------------\n * ActivityFeed Types and Variants\n * -------------------------------------------------------------------------------------------------*/\n\nconst activityFeedVariants = cva('flex flex-col', {\n variants: {\n divider: {\n divider: 'divide-y divide-border',\n connector: 'px-6 py-4',\n none: 'gap-4',\n },\n },\n defaultVariants: {\n divider: 'divider',\n },\n});\n\nconst activityItemVariants = cva('flex gap-3 relative', {\n variants: {\n type: {\n notifications: '',\n messages: '',\n },\n divider: {\n divider: 'px-4 py-4',\n connector: 'pt-0',\n none: 'px-4 py-4',\n },\n },\n defaultVariants: {\n type: 'notifications',\n divider: 'divider',\n },\n});\n\n/* -------------------------------------------------------------------------------------------------\n * ActivityFeedItemContent - Renders different content types\n * -------------------------------------------------------------------------------------------------*/\n\nexport type ActivityItemContentType = 'file' | 'message' | 'labels' | 'simple';\n\nexport interface FileContent {\n type: 'file';\n fileName: string;\n fileSize: string;\n fileExtension?: string;\n}\n\nexport interface MessageContent {\n type: 'message';\n message: string;\n /** Optional @mentions to highlight */\n mentions?: string[];\n}\n\nexport interface LabelsContent {\n type: 'labels';\n labels: Array<{\n text: string;\n color?: BadgeProps['color'];\n }>;\n}\n\nexport interface SimpleContent {\n type: 'simple';\n}\n\nexport type ActivityContent =\n | FileContent\n | MessageContent\n | LabelsContent\n | SimpleContent;\n\n/* -------------------------------------------------------------------------------------------------\n * ActivityFeedItem\n * -------------------------------------------------------------------------------------------------*/\n\nexport interface ActivityFeedItemProps\n extends Omit<React.HTMLAttributes<HTMLElement>, 'content'> {\n /** User/person info */\n user: {\n name: string;\n avatarSrc?: string;\n online?: boolean;\n };\n /** Timestamp (e.g., \"Just now\", \"2 mins ago\", \"5:20pm 20 Jan 2025\") */\n timestamp: string;\n /** Machine-readable ISO 8601 timestamp for the <time> element */\n dateTime?: string;\n /** Activity description with optional link text */\n activity: {\n /** Plain text part of activity (e.g., \"Added a file to\") */\n text: string;\n /** Link text to highlight (e.g., \"Marketing site redesign\") */\n link?: string;\n /** Link href */\n linkHref?: string;\n };\n /** Additional content (file attachment, message bubble, labels) */\n content?: ActivityContent;\n /** Show unread dot indicator */\n unread?: boolean;\n /** Avatar size */\n avatarSize?: AvatarProps['size'];\n /** Divider style - affects connector line visibility */\n divider?: 'divider' | 'connector' | 'none';\n /** Feed type */\n feedType?: 'notifications' | 'messages';\n /** For messages type: show username handle */\n userHandle?: string;\n /** Whether to show content details. Defaults to true. */\n expanded?: boolean;\n /** Internal: whether this is the last item (hides connector) */\n isLast?: boolean;\n}\n\nfunction getActivityFeedItemKey(item: ActivityFeedItemProps): React.Key {\n return (\n item.id ??\n `${item.user.name}:${item.timestamp}:${item.activity.text}:${item.activity.link ?? 'no-link'}`\n );\n}\n\ninterface MessageSegment {\n key: string;\n text: string;\n isMention: boolean;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction getMessageSegments(\n message: string,\n mentions: string[],\n): MessageSegment[] {\n const mentionSet = new Set<string>();\n\n for (const mention of mentions) {\n const trimmedMention = mention.trim();\n if (trimmedMention) {\n mentionSet.add(trimmedMention);\n }\n }\n\n const uniqueMentions = Array.from(mentionSet);\n\n if (uniqueMentions.length === 0) {\n return [];\n }\n\n const mentionPattern = new RegExp(\n `@(?:${uniqueMentions.map(escapeRegExp).join('|')})`,\n 'gi',\n );\n const segments: MessageSegment[] = [];\n let cursor = 0;\n\n for (const match of message.matchAll(mentionPattern)) {\n const start = match.index ?? 0;\n const text = match[0];\n const end = start + text.length;\n\n if (start > cursor) {\n segments.push({\n key: `text:${cursor}:${start}`,\n text: message.slice(cursor, start),\n isMention: false,\n });\n }\n\n segments.push({\n key: `mention:${start}:${end}:${text.toLowerCase()}`,\n text,\n isMention: true,\n });\n cursor = end;\n }\n\n if (cursor < message.length) {\n segments.push({\n key: `text:${cursor}:${message.length}`,\n text: message.slice(cursor),\n isMention: false,\n });\n }\n\n return segments;\n}\n\ninterface ActivityFeedItemContentProps {\n content?: ActivityContent;\n expanded?: boolean;\n}\n\nfunction ActivityFeedMessageContent({\n message,\n mentions,\n}: {\n message: string;\n mentions?: string[];\n}) {\n if (!mentions || mentions.length === 0) {\n return <>{`\"${message}\"`}</>;\n }\n\n return (\n <>\n {getMessageSegments(message, mentions).map((segment) => (\n <span\n key={segment.key}\n className={\n segment.isMention ? 'font-semibold text-primary' : undefined\n }\n >\n {segment.text}\n </span>\n ))}\n </>\n );\n}\n\nfunction ActivityFeedItemContent({\n content,\n expanded,\n}: ActivityFeedItemContentProps) {\n if (!content || expanded === false) return null;\n\n switch (content.type) {\n case 'file':\n return (\n <div className=\"group/file flex gap-3 items-start w-full mt-3 rounded-lg transition-[background-color,transform] duration-150 ease-out motion-reduce:transition-none hover:bg-muted/40 active:scale-[0.99] motion-reduce:active:scale-100 cursor-default\">\n <FileTypeIcon extension={content.fileExtension} size=\"md\" />\n <div className=\"flex flex-col min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-secondary-foreground truncate\">\n {content.fileName}\n </p>\n <p className=\"text-sm text-muted-foreground\">{content.fileSize}</p>\n </div>\n </div>\n );\n\n case 'message':\n return (\n <div className=\"mt-3 border border-border rounded-ee-md rounded-es-md rounded-se-md p-3 shadow-xs w-full transition-shadow duration-200 ease-out hover:shadow-sm motion-reduce:transition-none\">\n <p className=\"text-sm text-secondary-foreground\">\n <ActivityFeedMessageContent\n message={content.message}\n mentions={content.mentions}\n />\n </p>\n </div>\n );\n\n case 'labels':\n return (\n <div className=\"flex flex-wrap gap-1 mt-3\">\n {content.labels.map((label, i) => (\n <Badge\n key={label.text}\n variant=\"outline\"\n color={label.color || 'primary'}\n size=\"sm\"\n className=\"delight-stagger transition-transform duration-150 ease-out motion-reduce:transition-none hover:scale-105 motion-reduce:hover:scale-100\"\n style={\n {\n '--delight-delay': `${i * 50}ms`,\n } as React.CSSProperties\n }\n >\n {label.text}\n </Badge>\n ))}\n </div>\n );\n\n default:\n return null;\n }\n}\n\nconst ActivityFeedItem = React.memo(\n React.forwardRef<HTMLElement, ActivityFeedItemProps>(\n (\n {\n className,\n user,\n timestamp,\n dateTime,\n activity,\n content,\n unread = false,\n avatarSize = 'lg',\n divider = 'divider',\n feedType = 'notifications',\n userHandle,\n expanded,\n isLast = false,\n ...props\n },\n ref,\n ) => {\n return (\n <article\n ref={ref}\n data-slot=\"activity-feed-item\"\n aria-label={`${user.name}: ${activity.text}${activity.link ? ` ${activity.link}` : ''}`}\n className={cn(\n activityItemVariants({ type: feedType, divider }),\n 'transition-colors duration-150 ease-out motion-reduce:transition-none',\n 'hover:bg-muted/30',\n className,\n )}\n {...props}\n >\n {/* Avatar wrap with connector */}\n <div\n className={cn(\n 'flex flex-col items-center gap-0.5 self-stretch shrink-0',\n divider === 'connector' && !isLast && 'pb-0.5',\n )}\n >\n <Avatar\n src={user.avatarSrc}\n fallback={user.name}\n size={avatarSize}\n indicator={\n user.online === true\n ? 'online'\n : user.online === false\n ? 'offline'\n : undefined\n }\n />\n {/* Connector line - only show for connector divider and not last item */}\n {divider === 'connector' && !isLast && (\n <div className=\"flex-1 w-0.5 min-h-4 rounded-sm bg-border delight-connector-grow\" />\n )}\n </div>\n\n {/* Content */}\n <div\n className={cn(\n 'flex flex-col flex-1 min-w-0',\n divider === 'connector' && 'pb-8',\n )}\n >\n {/* Header */}\n <div className=\"flex flex-col\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"text-sm font-medium text-secondary-foreground\">\n {user.name}\n </span>\n {feedType === 'messages' && userHandle && (\n <span className=\"text-sm text-muted-foreground\">\n @{userHandle}\n </span>\n )}\n {dateTime ? (\n <time\n dateTime={dateTime}\n className=\"text-xs text-muted-foreground\"\n >\n {timestamp}\n </time>\n ) : (\n <span className=\"text-xs text-muted-foreground\">\n {timestamp}\n </span>\n )}\n </div>\n\n {/* Activity description */}\n <p className=\"text-sm text-muted-foreground\">\n {activity.text}\n {activity.link && (\n <>\n {' '}\n {activity.linkHref ? (\n <a\n href={activity.linkHref}\n className=\"font-medium text-primary hover:text-primary/80 transition-colors duration-150 ease-out focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-1 rounded-sm\"\n >\n {activity.link}\n </a>\n ) : (\n <span className=\"font-medium text-secondary-foreground\">\n {activity.link}\n </span>\n )}\n </>\n )}\n </p>\n </div>\n\n {/* Additional content */}\n <ActivityFeedItemContent content={content} expanded={expanded} />\n </div>\n\n {/* Unread indicator */}\n {unread && (\n <div className=\"absolute top-2 end-1 size-2.5\" aria-hidden=\"true\">\n <div className=\"size-2 rounded-full bg-primary delight-unread-pulse\" />\n </div>\n )}\n </article>\n );\n },\n ),\n);\n\nActivityFeedItem.displayName = 'ActivityFeedItem';\n\n/* -------------------------------------------------------------------------------------------------\n * ActivityFeed\n * -------------------------------------------------------------------------------------------------*/\n\nexport interface ActivityFeedProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof activityFeedVariants> {\n /** Feed items */\n items?: ActivityFeedItemProps[];\n /** Feed type affects styling */\n type?: 'notifications' | 'messages';\n /** Whether the feed is loading/updating (sets aria-busy) */\n loading?: boolean;\n /** Children (alternative to items prop — note: stagger animations are not auto-applied to children) */\n children?: React.ReactNode;\n}\n\nconst ActivityFeed = React.forwardRef<HTMLDivElement, ActivityFeedProps>(\n (\n {\n className,\n divider = 'divider',\n items,\n type = 'notifications',\n loading,\n children,\n ...props\n },\n ref,\n ) => {\n return (\n <div\n ref={ref}\n data-slot=\"activity-feed\"\n role=\"feed\"\n aria-label=\"Activity feed\"\n aria-busy={loading || undefined}\n className={cn(activityFeedVariants({ divider }), className)}\n {...props}\n >\n {items\n ? items.map((item, index) => (\n <ActivityFeedItem\n key={getActivityFeedItemKey(item)}\n {...item}\n aria-setsize={items.length}\n aria-posinset={index + 1}\n divider={divider ?? 'divider'}\n feedType={type}\n isLast={index === items.length - 1}\n className={cn('delight-stagger', item.className)}\n style={\n {\n '--delight-delay': `${index * 60}ms`,\n ...item.style,\n } as React.CSSProperties\n }\n />\n ))\n : children}\n </div>\n );\n },\n);\n\nActivityFeed.displayName = 'ActivityFeed';\n\nexport {\n ActivityFeed,\n ActivityFeedItem,\n activityFeedVariants,\n activityItemVariants,\n};\n"],"mappings":"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"}
|
package/dist/index188.js
CHANGED
|
@@ -1,6 +1,266 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn, extractText } from "./index2.js";
|
|
3
|
+
import { cva } from "class-variance-authority";
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
import { Tooltip } from "@base-ui/react/tooltip";
|
|
7
|
+
//#region src/components/organisms/overlays/Tooltip/Tooltip.tsx
|
|
8
|
+
var tooltipVariants = cva("data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 motion-reduce:animate-none z-50 w-fit max-w-xs origin-(--transform-origin) px-3 py-1.5 text-xs shadow-[var(--shadow-tooltip)]", {
|
|
9
|
+
variants: {
|
|
10
|
+
variant: {
|
|
11
|
+
primary: "bg-foreground text-background",
|
|
12
|
+
secondary: "bg-secondary text-secondary-foreground border border-border shadow-sm",
|
|
13
|
+
info: "bg-info text-primary-foreground",
|
|
14
|
+
success: "bg-success text-primary-foreground",
|
|
15
|
+
warning: "bg-warning text-primary-foreground",
|
|
16
|
+
destructive: "bg-destructive text-primary-foreground"
|
|
17
|
+
},
|
|
18
|
+
shape: {
|
|
19
|
+
default: "rounded-md",
|
|
20
|
+
rounded: "rounded-full"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
defaultVariants: {
|
|
24
|
+
variant: "primary",
|
|
25
|
+
shape: "default"
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
var arrowVariants = cva("size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] z-50 data-[side=bottom]:top-1 data-[side=left]:top-1/2! data-[side=left]:-right-1 data-[side=left]:-translate-y-1/2 data-[side=right]:top-1/2! data-[side=right]:-left-1 data-[side=right]:-translate-y-1/2 data-[side=top]:-bottom-2.5", {
|
|
29
|
+
variants: { variant: {
|
|
30
|
+
primary: "bg-foreground fill-foreground",
|
|
31
|
+
secondary: "bg-secondary fill-secondary",
|
|
32
|
+
info: "bg-info fill-info",
|
|
33
|
+
success: "bg-success fill-success",
|
|
34
|
+
warning: "bg-warning fill-warning",
|
|
35
|
+
destructive: "bg-destructive fill-destructive"
|
|
36
|
+
} },
|
|
37
|
+
defaultVariants: { variant: "primary" }
|
|
38
|
+
});
|
|
39
|
+
function TooltipProvider({ delay = 0, ...props }) {
|
|
40
|
+
return /* @__PURE__ */ jsx(Tooltip.Provider, {
|
|
41
|
+
"data-slot": "tooltip-provider",
|
|
42
|
+
delay,
|
|
43
|
+
...props
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
function TooltipRoot(props) {
|
|
47
|
+
return /* @__PURE__ */ jsx(Tooltip.Root, {
|
|
48
|
+
"data-slot": "tooltip",
|
|
49
|
+
...props
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
var TooltipTrigger = React.forwardRef(function TooltipTrigger(props, ref) {
|
|
53
|
+
return /* @__PURE__ */ jsx(Tooltip.Trigger, {
|
|
54
|
+
ref,
|
|
55
|
+
"data-slot": "tooltip-trigger",
|
|
56
|
+
...props
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
function TooltipPopup({ className, side = "top", sideOffset = 4, align = "center", alignOffset = 0, variant = "primary", shape = "default", hideArrow = false, container, children, ...props }) {
|
|
60
|
+
return /* @__PURE__ */ jsx(Tooltip.Portal, {
|
|
61
|
+
container,
|
|
62
|
+
children: /* @__PURE__ */ jsx(Tooltip.Positioner, {
|
|
63
|
+
align,
|
|
64
|
+
alignOffset,
|
|
65
|
+
side,
|
|
66
|
+
sideOffset,
|
|
67
|
+
className: "isolate z-50",
|
|
68
|
+
children: /* @__PURE__ */ jsxs(Tooltip.Popup, {
|
|
69
|
+
"data-slot": "tooltip-popup",
|
|
70
|
+
className: cn(tooltipVariants({
|
|
71
|
+
variant,
|
|
72
|
+
shape
|
|
73
|
+
}), className),
|
|
74
|
+
...props,
|
|
75
|
+
children: [children, !hideArrow && /* @__PURE__ */ jsx(Tooltip.Arrow, { className: arrowVariants({ variant }) })]
|
|
76
|
+
})
|
|
77
|
+
})
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
function TooltipIcon({ children, className }) {
|
|
81
|
+
return /* @__PURE__ */ jsx("span", {
|
|
82
|
+
"data-slot": "tooltip-icon",
|
|
83
|
+
className: cn("shrink-0 [&>svg]:size-4", className),
|
|
84
|
+
children
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
TooltipIcon.displayName = "Tooltip.Icon";
|
|
88
|
+
function TooltipAvatar({ src, alt, children, className }) {
|
|
89
|
+
if (children) return /* @__PURE__ */ jsx("span", {
|
|
90
|
+
"data-slot": "tooltip-avatar",
|
|
91
|
+
className: cn("shrink-0", className),
|
|
92
|
+
children
|
|
93
|
+
});
|
|
94
|
+
return /* @__PURE__ */ jsx("img", {
|
|
95
|
+
"data-slot": "tooltip-avatar",
|
|
96
|
+
src,
|
|
97
|
+
alt,
|
|
98
|
+
className: cn("size-4 shrink-0 rounded-full object-cover", className)
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
TooltipAvatar.displayName = "Tooltip.Avatar";
|
|
102
|
+
function TooltipContent({ children, className }) {
|
|
103
|
+
return /* @__PURE__ */ jsx("div", {
|
|
104
|
+
"data-slot": "tooltip-content",
|
|
105
|
+
className: cn("flex flex-col gap-0.5", className),
|
|
106
|
+
children
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
TooltipContent.displayName = "Tooltip.Content";
|
|
110
|
+
function TooltipTitle({ children, className }) {
|
|
111
|
+
return /* @__PURE__ */ jsx("span", {
|
|
112
|
+
"data-slot": "tooltip-title",
|
|
113
|
+
className: cn("text-xs font-semibold leading-4", className),
|
|
114
|
+
children
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
TooltipTitle.displayName = "Tooltip.Title";
|
|
118
|
+
function TooltipSubtitle({ children, className, variant = "primary" }) {
|
|
119
|
+
return /* @__PURE__ */ jsx("span", {
|
|
120
|
+
"data-slot": "tooltip-subtitle",
|
|
121
|
+
className: cn("text-xs font-medium leading-4", variant === "secondary" ? "text-muted-foreground" : "text-inherit opacity-70", className),
|
|
122
|
+
children
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
TooltipSubtitle.displayName = "Tooltip.Subtitle";
|
|
126
|
+
function TooltipBadge({ children, className }) {
|
|
127
|
+
return /* @__PURE__ */ jsx("span", {
|
|
128
|
+
"data-slot": "tooltip-badge",
|
|
129
|
+
className: cn("shrink-0", className),
|
|
130
|
+
children
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
TooltipBadge.displayName = "Tooltip.Badge";
|
|
134
|
+
function TooltipImage({ src, alt, layout = "vertical", className }) {
|
|
135
|
+
return /* @__PURE__ */ jsx("img", {
|
|
136
|
+
"data-slot": "tooltip-image",
|
|
137
|
+
src,
|
|
138
|
+
alt,
|
|
139
|
+
className: cn("rounded-md object-cover", layout === "vertical" ? "w-full h-20" : "w-20 h-14 shrink-0", className)
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
TooltipImage.displayName = "Tooltip.Image";
|
|
143
|
+
function TooltipRenderedContent({ children, content, variant, icon, avatar, subtitle, badge, image, imageLayout, hasRichContent, contentAlt }) {
|
|
144
|
+
if (children) return children;
|
|
145
|
+
const subtitleElement = subtitle && /* @__PURE__ */ jsx(TooltipSubtitle, {
|
|
146
|
+
variant,
|
|
147
|
+
children: subtitle
|
|
148
|
+
});
|
|
149
|
+
if (image) return /* @__PURE__ */ jsxs("div", {
|
|
150
|
+
className: cn("flex gap-1.5 delight-tooltip-stagger", imageLayout === "vertical" ? "flex-col" : "flex-row items-center"),
|
|
151
|
+
children: [/* @__PURE__ */ jsx(TooltipImage, {
|
|
152
|
+
src: image,
|
|
153
|
+
alt: contentAlt,
|
|
154
|
+
layout: imageLayout,
|
|
155
|
+
className: "delight-tooltip-image"
|
|
156
|
+
}), /* @__PURE__ */ jsxs(TooltipContent, { children: [/* @__PURE__ */ jsx(TooltipTitle, { children: content }), subtitleElement] })]
|
|
157
|
+
});
|
|
158
|
+
if (!hasRichContent) return content;
|
|
159
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
160
|
+
className: "flex items-center gap-1.5 delight-tooltip-stagger",
|
|
161
|
+
children: [
|
|
162
|
+
avatar && (typeof avatar === "string" ? /* @__PURE__ */ jsx(TooltipAvatar, {
|
|
163
|
+
src: avatar,
|
|
164
|
+
alt: contentAlt
|
|
165
|
+
}) : /* @__PURE__ */ jsx(TooltipAvatar, {
|
|
166
|
+
alt: contentAlt,
|
|
167
|
+
children: avatar
|
|
168
|
+
})),
|
|
169
|
+
icon && /* @__PURE__ */ jsx(TooltipIcon, { children: icon }),
|
|
170
|
+
/* @__PURE__ */ jsxs(TooltipContent, { children: [/* @__PURE__ */ jsx(TooltipTitle, { children: content }), subtitleElement] }),
|
|
171
|
+
badge && /* @__PURE__ */ jsx(TooltipBadge, { children: badge })
|
|
172
|
+
]
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
var Tooltip$1 = ({ trigger, content, variant = "primary", shape = "default", position = "top", align = "center", delayDuration, sideOffset = 6, icon, avatar, subtitle, badge, image, imageLayout, container, children }) => {
|
|
176
|
+
const [triggerElement, setTriggerElement] = React.useState(null);
|
|
177
|
+
const [triggerPortalContainer, setTriggerPortalContainer] = React.useState(null);
|
|
178
|
+
const setTriggerRef = React.useCallback((element) => {
|
|
179
|
+
setTriggerElement((currentElement) => currentElement === element ? currentElement : element);
|
|
180
|
+
}, []);
|
|
181
|
+
React.useEffect(() => {
|
|
182
|
+
const nextContainer = triggerElement?.ownerDocument.body ?? null;
|
|
183
|
+
setTriggerPortalContainer((currentContainer) => currentContainer === nextContainer ? currentContainer : nextContainer);
|
|
184
|
+
}, [triggerElement]);
|
|
185
|
+
const hasRichContent = icon || avatar || subtitle || badge || image;
|
|
186
|
+
const resolvedImageLayout = imageLayout ?? "vertical";
|
|
187
|
+
const contentAlt = extractText(content);
|
|
188
|
+
return /* @__PURE__ */ jsx(TooltipProvider, {
|
|
189
|
+
delay: delayDuration,
|
|
190
|
+
children: /* @__PURE__ */ jsxs(TooltipRoot, { children: [/* @__PURE__ */ jsx(TooltipTrigger, {
|
|
191
|
+
ref: setTriggerRef,
|
|
192
|
+
render: trigger
|
|
193
|
+
}), /* @__PURE__ */ jsx(TooltipPopup, {
|
|
194
|
+
container: container === void 0 ? triggerPortalContainer : container,
|
|
195
|
+
side: position === "none" ? "top" : position,
|
|
196
|
+
align,
|
|
197
|
+
sideOffset,
|
|
198
|
+
variant,
|
|
199
|
+
shape,
|
|
200
|
+
hideArrow: position === "none",
|
|
201
|
+
className: cn(hasRichContent && "p-2"),
|
|
202
|
+
children: /* @__PURE__ */ jsx(TooltipRenderedContent, {
|
|
203
|
+
content,
|
|
204
|
+
variant,
|
|
205
|
+
icon,
|
|
206
|
+
avatar,
|
|
207
|
+
subtitle,
|
|
208
|
+
badge,
|
|
209
|
+
image,
|
|
210
|
+
imageLayout: resolvedImageLayout,
|
|
211
|
+
hasRichContent,
|
|
212
|
+
contentAlt,
|
|
213
|
+
children
|
|
214
|
+
})
|
|
215
|
+
})] })
|
|
216
|
+
});
|
|
217
|
+
};
|
|
218
|
+
Tooltip$1.displayName = "Tooltip";
|
|
219
|
+
TooltipProvider.displayName = "Tooltip.Provider";
|
|
220
|
+
TooltipRoot.displayName = "Tooltip.Root";
|
|
221
|
+
TooltipTrigger.displayName = "Tooltip.Trigger";
|
|
222
|
+
TooltipPopup.displayName = "Tooltip.Popup";
|
|
223
|
+
/**
|
|
224
|
+
* Tooltip component with dot notation for compound parts.
|
|
225
|
+
*
|
|
226
|
+
* @example
|
|
227
|
+
* ```tsx
|
|
228
|
+
* // Simple usage (recommended for most cases)
|
|
229
|
+
* <Tooltip trigger={<Button>Hover me</Button>} content="Tooltip text" />
|
|
230
|
+
*
|
|
231
|
+
* // With variants
|
|
232
|
+
* <Tooltip trigger={<Button>Save</Button>} content="Saved!" variant="success" shape="rounded" />
|
|
233
|
+
*
|
|
234
|
+
* // With rich content
|
|
235
|
+
* <Tooltip trigger={<Button>Info</Button>} content="Title" icon={<InfoIcon />} subtitle="Description" />
|
|
236
|
+
*
|
|
237
|
+
* // Advanced usage with dot notation
|
|
238
|
+
* <Tooltip.Root>
|
|
239
|
+
* <Tooltip.Trigger render={<Button>Hover me</Button>} />
|
|
240
|
+
* <Tooltip.Popup variant="info">
|
|
241
|
+
* <Tooltip.Icon><InfoIcon /></Tooltip.Icon>
|
|
242
|
+
* <Tooltip.Content>
|
|
243
|
+
* <Tooltip.Title>Title</Tooltip.Title>
|
|
244
|
+
* <Tooltip.Subtitle>Description</Tooltip.Subtitle>
|
|
245
|
+
* </Tooltip.Content>
|
|
246
|
+
* </Tooltip.Popup>
|
|
247
|
+
* </Tooltip.Root>
|
|
248
|
+
* ```
|
|
249
|
+
*/
|
|
250
|
+
var TooltipCompound = Object.assign(Tooltip$1, {
|
|
251
|
+
Root: TooltipRoot,
|
|
252
|
+
Provider: TooltipProvider,
|
|
253
|
+
Trigger: TooltipTrigger,
|
|
254
|
+
Popup: TooltipPopup,
|
|
255
|
+
Icon: TooltipIcon,
|
|
256
|
+
Avatar: TooltipAvatar,
|
|
257
|
+
Content: TooltipContent,
|
|
258
|
+
Title: TooltipTitle,
|
|
259
|
+
Subtitle: TooltipSubtitle,
|
|
260
|
+
Badge: TooltipBadge,
|
|
261
|
+
Image: TooltipImage
|
|
262
|
+
});
|
|
3
263
|
//#endregion
|
|
4
|
-
export {
|
|
264
|
+
export { TooltipCompound as Tooltip, TooltipAvatar, TooltipBadge, TooltipContent, TooltipIcon, TooltipImage, TooltipPopup, TooltipProvider, TooltipRoot, TooltipSubtitle, TooltipTitle, TooltipTrigger, arrowVariants, tooltipVariants };
|
|
5
265
|
|
|
6
266
|
//# sourceMappingURL=index188.js.map
|
package/dist/index188.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index188.js","names":[],"sources":["../src/components/organisms/content/DataTable/DataTableHitArea.ts"],"sourcesContent":["export const dataTableTouchTargetClassName =\n 'relative before:absolute before:left-1/2 before:top-1/2 before:h-full before:min-h-11 before:w-full before:min-w-11 before:-translate-x-1/2 before:-translate-y-1/2 before:rounded-[inherit] before:content-[\"\"]';\n"],"mappings":";AAAA,IAAa,gCACX"}
|
|
1
|
+
{"version":3,"file":"index188.js","names":[],"sources":["../src/components/organisms/overlays/Tooltip/Tooltip.tsx"],"sourcesContent":["'use client';\n\nimport { Tooltip as TooltipPrimitive } from '@base-ui/react/tooltip';\nimport { cva } from 'class-variance-authority';\nimport * as React from 'react';\nimport { cn, extractText } from '@/lib/utils';\n\nconst tooltipVariants = cva(\n 'data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 motion-reduce:animate-none z-50 w-fit max-w-xs origin-(--transform-origin) px-3 py-1.5 text-xs shadow-[var(--shadow-tooltip)]',\n {\n variants: {\n variant: {\n primary: 'bg-foreground text-background',\n secondary:\n 'bg-secondary text-secondary-foreground border border-border shadow-sm',\n info: 'bg-info text-primary-foreground',\n success: 'bg-success text-primary-foreground',\n warning: 'bg-warning text-primary-foreground',\n destructive: 'bg-destructive text-primary-foreground',\n },\n shape: {\n default: 'rounded-md',\n rounded: 'rounded-full',\n },\n },\n defaultVariants: {\n variant: 'primary',\n shape: 'default',\n },\n },\n);\n\nconst arrowVariants = cva(\n 'size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] z-50 data-[side=bottom]:top-1 data-[side=left]:top-1/2! data-[side=left]:-right-1 data-[side=left]:-translate-y-1/2 data-[side=right]:top-1/2! data-[side=right]:-left-1 data-[side=right]:-translate-y-1/2 data-[side=top]:-bottom-2.5',\n {\n variants: {\n variant: {\n primary: 'bg-foreground fill-foreground',\n secondary: 'bg-secondary fill-secondary',\n info: 'bg-info fill-info',\n success: 'bg-success fill-success',\n warning: 'bg-warning fill-warning',\n destructive: 'bg-destructive fill-destructive',\n },\n },\n defaultVariants: {\n variant: 'primary',\n },\n },\n);\n\ntype TooltipVariant =\n | 'primary'\n | 'secondary'\n | 'info'\n | 'success'\n | 'warning'\n | 'destructive';\ntype TooltipShape = 'default' | 'rounded';\ntype TooltipPosition = 'top' | 'bottom' | 'left' | 'right' | 'none';\n\n// =============================================================================\n// Base Tooltip Sub-components\n// =============================================================================\n\nfunction TooltipProvider({\n delay = 0,\n ...props\n}: TooltipPrimitive.Provider.Props) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delay={delay}\n {...props}\n />\n );\n}\n\nfunction TooltipRoot(props: TooltipPrimitive.Root.Props) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />;\n}\n\nconst TooltipTrigger = React.forwardRef<\n HTMLButtonElement,\n TooltipPrimitive.Trigger.Props\n>(function TooltipTrigger(props, ref) {\n return (\n <TooltipPrimitive.Trigger\n ref={ref}\n data-slot=\"tooltip-trigger\"\n {...props}\n />\n );\n});\n\ninterface TooltipPopupProps\n extends TooltipPrimitive.Popup.Props,\n Pick<\n TooltipPrimitive.Positioner.Props,\n 'align' | 'alignOffset' | 'side' | 'sideOffset'\n > {\n variant?: TooltipVariant;\n shape?: TooltipShape;\n /** Optional Base UI portal container for the tooltip popup. */\n container?: TooltipPrimitive.Portal.Props['container'];\n /** When true or position is 'none', hides the arrow */\n hideArrow?: boolean;\n}\n\nfunction TooltipPopup({\n className,\n side = 'top',\n sideOffset = 4,\n align = 'center',\n alignOffset = 0,\n variant = 'primary',\n shape = 'default',\n hideArrow = false,\n container,\n children,\n ...props\n}: TooltipPopupProps) {\n return (\n <TooltipPrimitive.Portal container={container}>\n <TooltipPrimitive.Positioner\n align={align}\n alignOffset={alignOffset}\n side={side}\n sideOffset={sideOffset}\n className=\"isolate z-50\"\n >\n <TooltipPrimitive.Popup\n data-slot=\"tooltip-popup\"\n className={cn(tooltipVariants({ variant, shape }), className)}\n {...props}\n >\n {children}\n {!hideArrow && (\n <TooltipPrimitive.Arrow className={arrowVariants({ variant })} />\n )}\n </TooltipPrimitive.Popup>\n </TooltipPrimitive.Positioner>\n </TooltipPrimitive.Portal>\n );\n}\n\n// =============================================================================\n// Rich Content Sub-components\n// =============================================================================\n\nfunction TooltipIcon({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <span\n data-slot=\"tooltip-icon\"\n className={cn('shrink-0 [&>svg]:size-4', className)}\n >\n {children}\n </span>\n );\n}\nTooltipIcon.displayName = 'Tooltip.Icon';\n\nfunction TooltipAvatar({\n src,\n alt,\n children,\n className,\n}: {\n src?: string;\n alt: string;\n children?: React.ReactNode;\n className?: string;\n}) {\n if (children) {\n return (\n <span data-slot=\"tooltip-avatar\" className={cn('shrink-0', className)}>\n {children}\n </span>\n );\n }\n return (\n <img\n data-slot=\"tooltip-avatar\"\n src={src}\n alt={alt}\n className={cn('size-4 shrink-0 rounded-full object-cover', className)}\n />\n );\n}\nTooltipAvatar.displayName = 'Tooltip.Avatar';\n\nfunction TooltipContent({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <div\n data-slot=\"tooltip-content\"\n className={cn('flex flex-col gap-0.5', className)}\n >\n {children}\n </div>\n );\n}\nTooltipContent.displayName = 'Tooltip.Content';\n\nfunction TooltipTitle({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <span\n data-slot=\"tooltip-title\"\n className={cn('text-xs font-semibold leading-4', className)}\n >\n {children}\n </span>\n );\n}\nTooltipTitle.displayName = 'Tooltip.Title';\n\ninterface TooltipSubtitleProps {\n children: React.ReactNode;\n className?: string;\n /** Variant affects subtitle opacity */\n variant?: TooltipVariant;\n}\n\nfunction TooltipSubtitle({\n children,\n className,\n variant = 'primary',\n}: TooltipSubtitleProps) {\n const subtitleClass =\n variant === 'secondary'\n ? 'text-muted-foreground'\n : 'text-inherit opacity-70';\n\n return (\n <span\n data-slot=\"tooltip-subtitle\"\n className={cn('text-xs font-medium leading-4', subtitleClass, className)}\n >\n {children}\n </span>\n );\n}\nTooltipSubtitle.displayName = 'Tooltip.Subtitle';\n\nfunction TooltipBadge({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <span data-slot=\"tooltip-badge\" className={cn('shrink-0', className)}>\n {children}\n </span>\n );\n}\nTooltipBadge.displayName = 'Tooltip.Badge';\n\ninterface TooltipImageProps {\n src: string;\n alt: string;\n layout?: 'vertical' | 'horizontal';\n className?: string;\n}\n\nfunction TooltipImage({\n src,\n alt,\n layout = 'vertical',\n className,\n}: TooltipImageProps) {\n return (\n <img\n data-slot=\"tooltip-image\"\n src={src}\n alt={alt}\n className={cn(\n 'rounded-md object-cover',\n layout === 'vertical' ? 'w-full h-20' : 'w-20 h-14 shrink-0',\n className,\n )}\n />\n );\n}\nTooltipImage.displayName = 'Tooltip.Image';\n\n// =============================================================================\n// High-level Tooltip Wrapper Component\n// =============================================================================\n\ninterface TooltipProps {\n /** The element that triggers the tooltip (required) */\n trigger: React.ReactElement;\n /** The main tooltip text */\n content: React.ReactNode;\n /** Style variant */\n variant?: TooltipVariant;\n /** Shape variant */\n shape?: TooltipShape;\n /** Arrow position - 'none' hides the arrow */\n position?: TooltipPosition;\n /** Alignment of tooltip relative to trigger */\n align?: 'start' | 'center' | 'end';\n /** Delay in ms before showing tooltip */\n delayDuration?: number;\n /** Distance from trigger */\n sideOffset?: number;\n /** Optional icon before content */\n icon?: React.ReactNode;\n /** Optional avatar - string for src or ReactNode for custom */\n avatar?: string | React.ReactNode;\n /** Optional supporting text */\n subtitle?: React.ReactNode;\n /** Optional badge element */\n badge?: React.ReactNode;\n /** Optional image */\n image?: string;\n /** Image layout - auto-detected or override */\n imageLayout?: 'vertical' | 'horizontal';\n /** Optional Base UI portal container. Takes precedence over the trigger owner document. */\n container?: TooltipPrimitive.Portal.Props['container'];\n /** Override content with custom children */\n children?: React.ReactNode;\n}\n\ninterface TooltipRenderedContentProps {\n children?: React.ReactNode;\n content: React.ReactNode;\n variant: TooltipVariant;\n icon?: React.ReactNode;\n avatar?: string | React.ReactNode;\n subtitle?: React.ReactNode;\n badge?: React.ReactNode;\n image?: string;\n imageLayout: 'vertical' | 'horizontal';\n hasRichContent: React.ReactNode;\n contentAlt: string;\n}\n\nfunction TooltipRenderedContent({\n children,\n content,\n variant,\n icon,\n avatar,\n subtitle,\n badge,\n image,\n imageLayout,\n hasRichContent,\n contentAlt,\n}: TooltipRenderedContentProps) {\n if (children) return children;\n\n const subtitleElement = subtitle && (\n <TooltipSubtitle variant={variant}>{subtitle}</TooltipSubtitle>\n );\n\n if (image) {\n return (\n <div\n className={cn(\n 'flex gap-1.5 delight-tooltip-stagger',\n imageLayout === 'vertical' ? 'flex-col' : 'flex-row items-center',\n )}\n >\n <TooltipImage\n src={image}\n alt={contentAlt}\n layout={imageLayout}\n className=\"delight-tooltip-image\"\n />\n <TooltipContent>\n <TooltipTitle>{content}</TooltipTitle>\n {subtitleElement}\n </TooltipContent>\n </div>\n );\n }\n\n if (!hasRichContent) return content;\n\n return (\n <div className=\"flex items-center gap-1.5 delight-tooltip-stagger\">\n {avatar &&\n (typeof avatar === 'string' ? (\n <TooltipAvatar src={avatar} alt={contentAlt} />\n ) : (\n <TooltipAvatar alt={contentAlt}>{avatar}</TooltipAvatar>\n ))}\n {icon && <TooltipIcon>{icon}</TooltipIcon>}\n <TooltipContent>\n <TooltipTitle>{content}</TooltipTitle>\n {subtitleElement}\n </TooltipContent>\n {badge && <TooltipBadge>{badge}</TooltipBadge>}\n </div>\n );\n}\n\nconst Tooltip = ({\n trigger,\n content,\n variant = 'primary',\n shape = 'default',\n position = 'top',\n align = 'center',\n delayDuration,\n sideOffset = 6,\n icon,\n avatar,\n subtitle,\n badge,\n image,\n imageLayout,\n container,\n children,\n}: TooltipProps) => {\n const [triggerElement, setTriggerElement] =\n React.useState<HTMLElement | null>(null);\n const [triggerPortalContainer, setTriggerPortalContainer] =\n React.useState<HTMLElement | null>(null);\n const setTriggerRef = React.useCallback((element: HTMLElement | null) => {\n setTriggerElement((currentElement) =>\n currentElement === element ? currentElement : element,\n );\n }, []);\n\n React.useEffect(() => {\n const nextContainer = triggerElement?.ownerDocument.body ?? null;\n setTriggerPortalContainer((currentContainer) =>\n currentContainer === nextContainer ? currentContainer : nextContainer,\n );\n }, [triggerElement]);\n\n // Determine if we have rich content\n const hasRichContent = icon || avatar || subtitle || badge || image;\n\n const resolvedImageLayout = imageLayout ?? 'vertical';\n const contentAlt = extractText(content);\n const portalContainer =\n container === undefined ? triggerPortalContainer : container;\n\n return (\n <TooltipProvider delay={delayDuration}>\n <TooltipRoot>\n <TooltipTrigger ref={setTriggerRef} render={trigger} />\n <TooltipPopup\n container={portalContainer}\n side={position === 'none' ? 'top' : position}\n align={align}\n sideOffset={sideOffset}\n variant={variant}\n shape={shape}\n hideArrow={position === 'none'}\n className={cn(hasRichContent && 'p-2')}\n >\n <TooltipRenderedContent\n content={content}\n variant={variant}\n icon={icon}\n avatar={avatar}\n subtitle={subtitle}\n badge={badge}\n image={image}\n imageLayout={resolvedImageLayout}\n hasRichContent={hasRichContent}\n contentAlt={contentAlt}\n >\n {children}\n </TooltipRenderedContent>\n </TooltipPopup>\n </TooltipRoot>\n </TooltipProvider>\n );\n};\n\nTooltip.displayName = 'Tooltip';\nTooltipProvider.displayName = 'Tooltip.Provider';\nTooltipRoot.displayName = 'Tooltip.Root';\nTooltipTrigger.displayName = 'Tooltip.Trigger';\nTooltipPopup.displayName = 'Tooltip.Popup';\n\n/**\n * Tooltip component with dot notation for compound parts.\n *\n * @example\n * ```tsx\n * // Simple usage (recommended for most cases)\n * <Tooltip trigger={<Button>Hover me</Button>} content=\"Tooltip text\" />\n *\n * // With variants\n * <Tooltip trigger={<Button>Save</Button>} content=\"Saved!\" variant=\"success\" shape=\"rounded\" />\n *\n * // With rich content\n * <Tooltip trigger={<Button>Info</Button>} content=\"Title\" icon={<InfoIcon />} subtitle=\"Description\" />\n *\n * // Advanced usage with dot notation\n * <Tooltip.Root>\n * <Tooltip.Trigger render={<Button>Hover me</Button>} />\n * <Tooltip.Popup variant=\"info\">\n * <Tooltip.Icon><InfoIcon /></Tooltip.Icon>\n * <Tooltip.Content>\n * <Tooltip.Title>Title</Tooltip.Title>\n * <Tooltip.Subtitle>Description</Tooltip.Subtitle>\n * </Tooltip.Content>\n * </Tooltip.Popup>\n * </Tooltip.Root>\n * ```\n */\nconst TooltipCompound = Object.assign(Tooltip, {\n Root: TooltipRoot,\n Provider: TooltipProvider,\n Trigger: TooltipTrigger,\n Popup: TooltipPopup,\n Icon: TooltipIcon,\n Avatar: TooltipAvatar,\n Content: TooltipContent,\n Title: TooltipTitle,\n Subtitle: TooltipSubtitle,\n Badge: TooltipBadge,\n Image: TooltipImage,\n});\n\nexport type { TooltipPosition, TooltipProps, TooltipShape, TooltipVariant };\nexport {\n arrowVariants,\n TooltipAvatar,\n TooltipBadge,\n TooltipCompound as Tooltip,\n TooltipContent,\n TooltipIcon,\n TooltipImage,\n TooltipPopup,\n TooltipProvider,\n TooltipRoot,\n TooltipSubtitle,\n TooltipTitle,\n TooltipTrigger,\n tooltipVariants,\n};\n"],"mappings":"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"}
|
package/dist/index189.js
CHANGED
|
@@ -1,212 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import { Badge } from "./index14.js";
|
|
4
|
-
import { Progress } from "./index17.js";
|
|
5
|
-
import { Rating } from "./index18.js";
|
|
6
|
-
import { SparklineChart } from "./index23.js";
|
|
7
|
-
import { Switch } from "./index42.js";
|
|
8
|
-
import { Avatar } from "./index70.js";
|
|
9
|
-
import { dataTableTouchTargetClassName } from "./index188.js";
|
|
10
|
-
import { ArrowDown, ArrowUp, MoreHorizontal } from "lucide-react";
|
|
11
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
12
|
-
//#region src/components/organisms/content/DataTable/DataTableCell.tsx
|
|
13
|
-
var textToneClassName = {
|
|
14
|
-
foreground: "text-foreground",
|
|
15
|
-
secondary: "text-secondary-foreground",
|
|
16
|
-
muted: "text-muted-foreground",
|
|
17
|
-
success: "text-success",
|
|
18
|
-
warning: "text-warning",
|
|
19
|
-
destructive: "text-destructive"
|
|
20
|
-
};
|
|
21
|
-
function getSentiment(value) {
|
|
22
|
-
if (value > 0) return "positive";
|
|
23
|
-
if (value < 0) return "negative";
|
|
24
|
-
return "neutral";
|
|
25
|
-
}
|
|
26
|
-
function formatTrendValue(value) {
|
|
27
|
-
const absoluteValue = Math.abs(value);
|
|
28
|
-
return `${Number.isInteger(absoluteValue) ? absoluteValue : absoluteValue.toFixed(1)}%`;
|
|
29
|
-
}
|
|
30
|
-
function getActionButtonSize({ children, icon, iconOnly, size }) {
|
|
31
|
-
if (size) return size;
|
|
32
|
-
return iconOnly ?? (icon && !children) ? "icon-sm" : "sm";
|
|
33
|
-
}
|
|
34
|
-
function DataTableCellRoot({ className, ...props }) {
|
|
35
|
-
return /* @__PURE__ */ jsx("div", {
|
|
36
|
-
"data-slot": "data-table-cell-content",
|
|
37
|
-
className: cn("flex min-w-0 items-center gap-3", className),
|
|
38
|
-
...props
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
DataTableCellRoot.displayName = "DataTableCell";
|
|
42
|
-
function DataTableTextCell({ className, primary, children, supportingText, lead = true, tone = lead ? "foreground" : "secondary", supportingTone = "muted", primaryClassName, supportingClassName, ...props }) {
|
|
43
|
-
const primaryContent = primary ?? children;
|
|
44
|
-
return /* @__PURE__ */ jsxs("div", {
|
|
45
|
-
"data-slot": "data-table-cell-text",
|
|
46
|
-
className: cn("flex min-w-0 flex-col", className),
|
|
47
|
-
...props,
|
|
48
|
-
children: [/* @__PURE__ */ jsx("span", {
|
|
49
|
-
className: cn("truncate text-sm", lead ? "font-medium" : "font-regular", textToneClassName[tone], primaryClassName),
|
|
50
|
-
children: primaryContent
|
|
51
|
-
}), supportingText ? /* @__PURE__ */ jsx("span", {
|
|
52
|
-
className: cn("truncate text-sm font-light", textToneClassName[supportingTone], supportingClassName),
|
|
53
|
-
children: supportingText
|
|
54
|
-
}) : null]
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
DataTableTextCell.displayName = "DataTableCell.Text";
|
|
58
|
-
function DataTableAvatarCell({ className, name, supportingText, src, alt = "", fallback, avatar, avatarSize = "lg", avatarShape = "circle", lead = true, ...props }) {
|
|
59
|
-
return /* @__PURE__ */ jsxs(DataTableCellRoot, {
|
|
60
|
-
className,
|
|
61
|
-
...props,
|
|
62
|
-
children: [avatar ?? /* @__PURE__ */ jsx(Avatar, {
|
|
63
|
-
src,
|
|
64
|
-
alt,
|
|
65
|
-
fallback: fallback ?? (typeof name === "string" ? name : void 0),
|
|
66
|
-
size: avatarSize,
|
|
67
|
-
shape: avatarShape
|
|
68
|
-
}), /* @__PURE__ */ jsx(DataTableTextCell, {
|
|
69
|
-
className: "min-w-0",
|
|
70
|
-
primary: name,
|
|
71
|
-
supportingText,
|
|
72
|
-
lead
|
|
73
|
-
})]
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
DataTableAvatarCell.displayName = "DataTableCell.Avatar";
|
|
77
|
-
function DataTableBadgesCell({ className, items, max = items.length, overflowLabel = (count) => `+${count}`, size = "sm", color = "secondary", variant = "soft", shape = "rounded", ...props }) {
|
|
78
|
-
const visibleCount = Math.max(0, Math.min(items.length, max));
|
|
79
|
-
const visibleItems = items.slice(0, visibleCount);
|
|
80
|
-
const overflowCount = items.length - visibleItems.length;
|
|
81
|
-
return /* @__PURE__ */ jsxs("div", {
|
|
82
|
-
"data-slot": "data-table-cell-badges",
|
|
83
|
-
className: cn("flex min-w-0 flex-wrap items-center gap-1", className),
|
|
84
|
-
...props,
|
|
85
|
-
children: [visibleItems.map((item, index) => /* @__PURE__ */ jsx(Badge, {
|
|
86
|
-
color: item.color ?? color,
|
|
87
|
-
variant: item.variant ?? variant,
|
|
88
|
-
shape: item.shape ?? shape,
|
|
89
|
-
size,
|
|
90
|
-
className: item.className,
|
|
91
|
-
children: item.label
|
|
92
|
-
}, `${String(item.label)}-${index}`)), overflowCount > 0 ? /* @__PURE__ */ jsx(Badge, {
|
|
93
|
-
color: "secondary",
|
|
94
|
-
variant: "soft",
|
|
95
|
-
shape,
|
|
96
|
-
size,
|
|
97
|
-
children: overflowLabel(overflowCount)
|
|
98
|
-
}) : null]
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
DataTableBadgesCell.displayName = "DataTableCell.Badges";
|
|
102
|
-
function DataTableProgressCell({ className, value, max = 100, label, supportingText, progressClassName, ...props }) {
|
|
103
|
-
const percentage = Math.min(100, Math.max(0, value / (Number.isFinite(max) && max > 0 ? max : 100) * 100));
|
|
104
|
-
const visibleLabel = label ?? `${Math.round(percentage)}%`;
|
|
105
|
-
return /* @__PURE__ */ jsxs("div", {
|
|
106
|
-
"data-slot": "data-table-cell-progress",
|
|
107
|
-
className: cn("flex min-w-40 items-center gap-3", className),
|
|
108
|
-
...props,
|
|
109
|
-
children: [
|
|
110
|
-
/* @__PURE__ */ jsx("span", {
|
|
111
|
-
className: "w-10 shrink-0 text-sm text-secondary-foreground",
|
|
112
|
-
children: visibleLabel
|
|
113
|
-
}),
|
|
114
|
-
/* @__PURE__ */ jsx(Progress, {
|
|
115
|
-
value: percentage,
|
|
116
|
-
className: cn("min-w-24 flex-1", progressClassName)
|
|
117
|
-
}),
|
|
118
|
-
supportingText ? /* @__PURE__ */ jsx("span", {
|
|
119
|
-
className: "shrink-0 text-sm text-foreground",
|
|
120
|
-
children: supportingText
|
|
121
|
-
}) : null
|
|
122
|
-
]
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
DataTableProgressCell.displayName = "DataTableCell.Progress";
|
|
126
|
-
function DataTableTrendCell({ className, value, sentiment = getSentiment(value), showIcon = true, formatValue = formatTrendValue, ...props }) {
|
|
127
|
-
const Icon = sentiment === "positive" ? ArrowUp : sentiment === "negative" ? ArrowDown : null;
|
|
128
|
-
return /* @__PURE__ */ jsxs("span", {
|
|
129
|
-
"data-slot": "data-table-cell-trend",
|
|
130
|
-
className: cn("inline-flex items-center gap-1 text-sm font-medium", sentiment === "positive" ? "text-success" : sentiment === "negative" ? "text-destructive" : "text-secondary-foreground", className),
|
|
131
|
-
...props,
|
|
132
|
-
children: [showIcon && Icon ? /* @__PURE__ */ jsx(Icon, {
|
|
133
|
-
className: "size-3",
|
|
134
|
-
"aria-hidden": "true"
|
|
135
|
-
}) : null, formatValue(value)]
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
DataTableTrendCell.displayName = "DataTableCell.Trend";
|
|
139
|
-
function DataTableSparklineCell({ className, data, color = "primary", width = 108, height = 24, ...props }) {
|
|
140
|
-
return /* @__PURE__ */ jsx("div", {
|
|
141
|
-
"data-slot": "data-table-cell-sparkline",
|
|
142
|
-
className: cn("flex items-center", className),
|
|
143
|
-
...props,
|
|
144
|
-
children: /* @__PURE__ */ jsx(SparklineChart, {
|
|
145
|
-
data,
|
|
146
|
-
color,
|
|
147
|
-
width,
|
|
148
|
-
height
|
|
149
|
-
})
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
DataTableSparklineCell.displayName = "DataTableCell.Sparkline";
|
|
153
|
-
function DataTableRatingCell({ className, size = "md", ...props }) {
|
|
154
|
-
return /* @__PURE__ */ jsx(Rating, {
|
|
155
|
-
"data-slot": "data-table-cell-rating",
|
|
156
|
-
className,
|
|
157
|
-
size,
|
|
158
|
-
...props
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
DataTableRatingCell.displayName = "DataTableCell.Rating";
|
|
162
|
-
function DataTableSwitchCell(props) {
|
|
163
|
-
return /* @__PURE__ */ jsx(Switch, {
|
|
164
|
-
"data-slot": "data-table-cell-switch",
|
|
165
|
-
size: "sm",
|
|
166
|
-
...props
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
DataTableSwitchCell.displayName = "DataTableCell.Switch";
|
|
170
|
-
function DataTableActionsCell({ className, actions, ...props }) {
|
|
171
|
-
return /* @__PURE__ */ jsx("div", {
|
|
172
|
-
"data-slot": "data-table-cell-actions",
|
|
173
|
-
className: cn("flex items-center justify-end gap-1", className),
|
|
174
|
-
...props,
|
|
175
|
-
children: actions.map((action) => {
|
|
176
|
-
const iconOnly = action.iconOnly ?? !action.children;
|
|
177
|
-
const size = getActionButtonSize({
|
|
178
|
-
children: action.children,
|
|
179
|
-
icon: action.icon,
|
|
180
|
-
iconOnly,
|
|
181
|
-
size: action.size
|
|
182
|
-
});
|
|
183
|
-
return /* @__PURE__ */ jsx(Button, {
|
|
184
|
-
appearance: action.appearance ?? "ghost",
|
|
185
|
-
variant: action.variant ?? "secondary",
|
|
186
|
-
size,
|
|
187
|
-
iconOnly,
|
|
188
|
-
"aria-label": action.label,
|
|
189
|
-
onClick: action.onClick,
|
|
190
|
-
className: cn(dataTableTouchTargetClassName, action.className),
|
|
191
|
-
children: action.icon ?? action.children ?? /* @__PURE__ */ jsx(MoreHorizontal, {})
|
|
192
|
-
}, action.label);
|
|
193
|
-
})
|
|
194
|
-
});
|
|
195
|
-
}
|
|
196
|
-
DataTableActionsCell.displayName = "DataTableCell.Actions";
|
|
197
|
-
var DataTableCell = Object.assign(DataTableCellRoot, {
|
|
198
|
-
Root: DataTableCellRoot,
|
|
199
|
-
Text: DataTableTextCell,
|
|
200
|
-
Avatar: DataTableAvatarCell,
|
|
201
|
-
Badges: DataTableBadgesCell,
|
|
202
|
-
Progress: DataTableProgressCell,
|
|
203
|
-
Trend: DataTableTrendCell,
|
|
204
|
-
Sparkline: DataTableSparklineCell,
|
|
205
|
-
Rating: DataTableRatingCell,
|
|
206
|
-
Switch: DataTableSwitchCell,
|
|
207
|
-
Actions: DataTableActionsCell
|
|
208
|
-
});
|
|
1
|
+
//#region src/components/organisms/content/DataTable/DataTableHitArea.ts
|
|
2
|
+
var dataTableTouchTargetClassName = "relative before:absolute before:left-1/2 before:top-1/2 before:h-full before:min-h-11 before:w-full before:min-w-11 before:-translate-x-1/2 before:-translate-y-1/2 before:rounded-[inherit] before:content-[\"\"]";
|
|
209
3
|
//#endregion
|
|
210
|
-
export {
|
|
4
|
+
export { dataTableTouchTargetClassName };
|
|
211
5
|
|
|
212
6
|
//# sourceMappingURL=index189.js.map
|