@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.
Files changed (160) hide show
  1. package/dist/components/organisms/ai/AIToolCall/AIToolCall.d.ts +9 -3
  2. package/dist/components/organisms/ai/AIToolRun/index.d.ts +1 -1
  3. package/dist/components/organisms/ai/AIToolRun/validation.d.ts +24 -3
  4. package/dist/components/organisms/ai/_shared/format-ai-duration.d.ts +1 -0
  5. package/dist/components/organisms/ai/_shared/workflow-step-renderer.d.ts +1 -0
  6. package/dist/index.js +52 -52
  7. package/dist/index151.js +1 -1
  8. package/dist/index174.js +7 -339
  9. package/dist/index174.js.map +1 -1
  10. package/dist/index175.js +310 -137
  11. package/dist/index175.js.map +1 -1
  12. package/dist/index176.js +148 -174
  13. package/dist/index176.js.map +1 -1
  14. package/dist/index177.js +186 -78
  15. package/dist/index177.js.map +1 -1
  16. package/dist/index178.js +74 -124
  17. package/dist/index178.js.map +1 -1
  18. package/dist/index179.js +133 -1
  19. package/dist/index179.js.map +1 -0
  20. package/dist/index180.js +2 -201
  21. package/dist/index181.js +201 -0
  22. package/dist/{index180.js.map → index181.js.map} +1 -1
  23. package/dist/index183.js +130 -166
  24. package/dist/index183.js.map +1 -1
  25. package/dist/index184.js +195 -983
  26. package/dist/index184.js.map +1 -1
  27. package/dist/index185.js +1069 -369
  28. package/dist/index185.js.map +1 -1
  29. package/dist/index186.js +395 -197
  30. package/dist/index186.js.map +1 -1
  31. package/dist/index187.js +198 -243
  32. package/dist/index187.js.map +1 -1
  33. package/dist/index188.js +263 -3
  34. package/dist/index188.js.map +1 -1
  35. package/dist/index189.js +3 -209
  36. package/dist/index189.js.map +1 -1
  37. package/dist/index190.js +190 -777
  38. package/dist/index190.js.map +1 -1
  39. package/dist/index191.js +771 -252
  40. package/dist/index191.js.map +1 -1
  41. package/dist/index192.js +250 -65
  42. package/dist/index192.js.map +1 -1
  43. package/dist/index193.js +72 -523
  44. package/dist/index193.js.map +1 -1
  45. package/dist/index194.js +537 -144
  46. package/dist/index194.js.map +1 -1
  47. package/dist/index195.js +139 -720
  48. package/dist/index195.js.map +1 -1
  49. package/dist/index196.js +707 -167
  50. package/dist/index196.js.map +1 -1
  51. package/dist/index197.js +175 -151
  52. package/dist/index197.js.map +1 -1
  53. package/dist/index198.js +152 -487
  54. package/dist/index198.js.map +1 -1
  55. package/dist/index199.js +472 -225
  56. package/dist/index199.js.map +1 -1
  57. package/dist/index200.js +236 -260
  58. package/dist/index200.js.map +1 -1
  59. package/dist/index201.js +265 -215
  60. package/dist/index201.js.map +1 -1
  61. package/dist/index202.js +207 -307
  62. package/dist/index202.js.map +1 -1
  63. package/dist/index203.js +302 -135
  64. package/dist/index203.js.map +1 -1
  65. package/dist/index204.js +140 -271
  66. package/dist/index204.js.map +1 -1
  67. package/dist/index205.js +263 -253
  68. package/dist/index205.js.map +1 -1
  69. package/dist/index206.js +244 -137
  70. package/dist/index206.js.map +1 -1
  71. package/dist/index207.js +100 -238
  72. package/dist/index207.js.map +1 -1
  73. package/dist/index208.js +278 -74
  74. package/dist/index208.js.map +1 -1
  75. package/dist/index209.js +56 -97
  76. package/dist/index209.js.map +1 -1
  77. package/dist/index210.js +142 -47
  78. package/dist/index210.js.map +1 -1
  79. package/dist/index211.js +38 -84
  80. package/dist/index211.js.map +1 -1
  81. package/dist/index212.js +72 -252
  82. package/dist/index212.js.map +1 -1
  83. package/dist/index213.js +274 -26
  84. package/dist/index213.js.map +1 -1
  85. package/dist/index214.js +29 -94
  86. package/dist/index214.js.map +1 -1
  87. package/dist/index215.js +98 -25
  88. package/dist/index215.js.map +1 -1
  89. package/dist/index216.js +20 -565
  90. package/dist/index216.js.map +1 -1
  91. package/dist/index217.js +564 -17
  92. package/dist/index217.js.map +1 -1
  93. package/dist/index218.js +20 -23
  94. package/dist/index218.js.map +1 -1
  95. package/dist/index219.js +20 -95
  96. package/dist/index219.js.map +1 -1
  97. package/dist/index220.js +92 -88
  98. package/dist/index220.js.map +1 -1
  99. package/dist/index221.js +97 -29
  100. package/dist/index221.js.map +1 -1
  101. package/dist/index222.js +24 -470
  102. package/dist/index222.js.map +1 -1
  103. package/dist/index223.js +446 -196
  104. package/dist/index223.js.map +1 -1
  105. package/dist/index224.js +199 -729
  106. package/dist/index224.js.map +1 -1
  107. package/dist/index225.js +750 -61
  108. package/dist/index225.js.map +1 -1
  109. package/dist/index226.js +58 -181
  110. package/dist/index226.js.map +1 -1
  111. package/dist/index227.js +175 -259
  112. package/dist/index227.js.map +1 -1
  113. package/dist/index228.js +246 -172
  114. package/dist/index228.js.map +1 -1
  115. package/dist/index229.js +195 -32
  116. package/dist/index229.js.map +1 -1
  117. package/dist/index230.js +12 -40
  118. package/dist/index230.js.map +1 -1
  119. package/dist/index231.js +23 -26
  120. package/dist/index231.js.map +1 -1
  121. package/dist/index232.js +45 -22
  122. package/dist/index232.js.map +1 -1
  123. package/dist/index233.js +27 -48
  124. package/dist/index233.js.map +1 -1
  125. package/dist/index234.js +52 -26
  126. package/dist/index234.js.map +1 -1
  127. package/dist/index235.js +40 -225
  128. package/dist/index235.js.map +1 -1
  129. package/dist/index236.js +217 -39
  130. package/dist/index236.js.map +1 -1
  131. package/dist/index237.js +50 -0
  132. package/dist/index237.js.map +1 -0
  133. package/dist/styles.css +1 -1
  134. package/dist/wc/AIToolCall.js +218 -0
  135. package/dist/wc/AIToolCall.js.map +1 -0
  136. package/dist/wc/hf-ai-tool-call.js +34 -219
  137. package/dist/wc/hf-ai-tool-call.js.map +1 -1
  138. package/dist/wc/hf-ai-tool-run.js +673 -576
  139. package/dist/wc/hf-ai-tool-run.js.map +1 -1
  140. package/dist/wc/workflow-step-renderer.js +79 -78
  141. package/dist/wc/workflow-step-renderer.js.map +1 -1
  142. package/dist/wc-react/AIToolCall.js +218 -0
  143. package/dist/wc-react/AIToolCall.js.map +1 -0
  144. package/dist/wc-react/hf-ai-tool-call.js +32 -217
  145. package/dist/wc-react/hf-ai-tool-call.js.map +1 -1
  146. package/dist/wc-react/hf-ai-tool-run.js +698 -601
  147. package/dist/wc-react/hf-ai-tool-run.js.map +1 -1
  148. package/dist/wc-react/workflow-step-renderer.js +58 -57
  149. package/dist/wc-react/workflow-step-renderer.js.map +1 -1
  150. package/package.json +1 -1
  151. package/skills/humain-ui/SKILL.md +1 -1
  152. package/skills/humain-ui-wc/SKILL.md +1 -1
  153. package/skills/humain-ui-wc.skill +0 -0
  154. package/skills/humain-ui.skill +0 -0
  155. package/dist/index182.js +0 -143
  156. package/dist/index182.js.map +0 -1
  157. package/dist/wc/wrench.js +0 -10
  158. package/dist/wc/wrench.js.map +0 -1
  159. package/dist/wc-react/wrench.js +0 -10
  160. package/dist/wc-react/wrench.js.map +0 -1
@@ -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
- //#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-[\"\"]";
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 { dataTableTouchTargetClassName };
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
@@ -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
- import { cn } from "./index2.js";
2
- import { Button } from "./index5.js";
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 { DataTableActionsCell, DataTableAvatarCell, DataTableBadgesCell, DataTableCell, DataTableCellRoot, DataTableProgressCell, DataTableRatingCell, DataTableSparklineCell, DataTableSwitchCell, DataTableTextCell, DataTableTrendCell };
4
+ export { dataTableTouchTargetClassName };
211
5
 
212
6
  //# sourceMappingURL=index189.js.map