@humain/ui 2.2.3 → 2.2.5
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/templates/AppShell/AppShell.d.ts +1 -1
- package/dist/components/templates/AppSidebar/AppSidebar.constants.d.ts +1 -1
- package/dist/index11.js +4 -4
- package/dist/index11.js.map +1 -1
- package/dist/index110.js +4 -4
- package/dist/index110.js.map +1 -1
- package/dist/index134.js +4 -4
- package/dist/index134.js.map +1 -1
- package/dist/index135.js +2 -2
- package/dist/index135.js.map +1 -1
- package/dist/index151.js +3 -3
- package/dist/index151.js.map +1 -1
- package/dist/index152.js +2 -2
- package/dist/index152.js.map +1 -1
- package/dist/index155.js +1 -1
- package/dist/index155.js.map +1 -1
- package/dist/index173.js +1 -1
- package/dist/index173.js.map +1 -1
- package/dist/index184.js +1 -1
- package/dist/index184.js.map +1 -1
- package/dist/index188.js +4 -4
- package/dist/index188.js.map +1 -1
- package/dist/index201.js +1 -1
- package/dist/index201.js.map +1 -1
- package/dist/index217.js +1 -1
- package/dist/index217.js.map +1 -1
- package/dist/index223.js.map +1 -1
- package/dist/index225.js +3 -3
- package/dist/index225.js.map +1 -1
- package/dist/index228.js +1 -1
- package/dist/index228.js.map +1 -1
- package/dist/index24.js +1 -1
- package/dist/index24.js.map +1 -1
- package/dist/index25.js +4 -4
- package/dist/index25.js.map +1 -1
- package/dist/index39.js +2 -2
- package/dist/index39.js.map +1 -1
- package/dist/index5.js +8 -8
- package/dist/index5.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/wc/AIScrollButton.js +8 -8
- package/dist/wc/AIScrollButton.js.map +1 -1
- package/dist/wc/AISource.js +46 -46
- package/dist/wc/AISource.js.map +1 -1
- package/dist/wc/AIToolCall.js +9 -9
- package/dist/wc/AIToolCall.js.map +1 -1
- package/dist/wc/AppSidebar.constants.js +1 -1
- package/dist/wc/AppSidebar.constants.js.map +1 -1
- package/dist/wc/Badge.js +9 -9
- package/dist/wc/Badge.js.map +1 -1
- package/dist/wc/Checkbox.js +22 -22
- package/dist/wc/Checkbox.js.map +1 -1
- package/dist/wc/Pagination.js +4 -4
- package/dist/wc/Pagination.js.map +1 -1
- package/dist/wc/Switch.js +23 -23
- package/dist/wc/Switch.js.map +1 -1
- package/dist/wc/Tabs.js +110 -110
- package/dist/wc/Tabs.js.map +1 -1
- package/dist/wc/Tooltip.js +28 -28
- package/dist/wc/Tooltip.js.map +1 -1
- package/dist/wc/button.js +33 -33
- package/dist/wc/button.js.map +1 -1
- package/dist/wc/hf-alert.js +10 -10
- package/dist/wc/hf-alert.js.map +1 -1
- package/dist/wc/hf-app-shell.js.map +1 -1
- package/dist/wc/hf-app-sidebar.js +3 -3
- package/dist/wc/hf-app-sidebar.js.map +1 -1
- package/dist/wc/hf-nav-account-menu.js +8 -8
- package/dist/wc/hf-nav-account-menu.js.map +1 -1
- package/dist/wc/hf-steps.js +8 -8
- package/dist/wc/hf-steps.js.map +1 -1
- package/dist/wc/markdown-renderer.js +5 -5
- package/dist/wc/markdown-renderer.js.map +1 -1
- package/dist/wc/selection-group.js +6 -6
- package/dist/wc/selection-group.js.map +1 -1
- package/dist/wc-react/AIScrollButton.js +18 -18
- package/dist/wc-react/AIScrollButton.js.map +1 -1
- package/dist/wc-react/AISource.js +8 -8
- package/dist/wc-react/AISource.js.map +1 -1
- package/dist/wc-react/AIToolCall.js +42 -42
- package/dist/wc-react/AIToolCall.js.map +1 -1
- package/dist/wc-react/AppSidebar.constants.js +1 -1
- package/dist/wc-react/AppSidebar.constants.js.map +1 -1
- package/dist/wc-react/Badge.js +16 -16
- package/dist/wc-react/Badge.js.map +1 -1
- package/dist/wc-react/Checkbox.js +14 -14
- package/dist/wc-react/Checkbox.js.map +1 -1
- package/dist/wc-react/Pagination.js +130 -130
- package/dist/wc-react/Pagination.js.map +1 -1
- package/dist/wc-react/Switch.js +2 -2
- package/dist/wc-react/Switch.js.map +1 -1
- package/dist/wc-react/Tabs.js +38 -38
- package/dist/wc-react/Tabs.js.map +1 -1
- package/dist/wc-react/Tooltip.js +22 -22
- package/dist/wc-react/Tooltip.js.map +1 -1
- package/dist/wc-react/button.js +8 -8
- package/dist/wc-react/button.js.map +1 -1
- package/dist/wc-react/hf-alert.js +28 -28
- package/dist/wc-react/hf-alert.js.map +1 -1
- package/dist/wc-react/hf-app-shell.js.map +1 -1
- package/dist/wc-react/hf-app-sidebar.js +3 -3
- package/dist/wc-react/hf-app-sidebar.js.map +1 -1
- package/dist/wc-react/hf-nav-account-menu.js +7 -7
- package/dist/wc-react/hf-nav-account-menu.js.map +1 -1
- package/dist/wc-react/hf-steps.js +16 -16
- package/dist/wc-react/hf-steps.js.map +1 -1
- package/dist/wc-react/markdown-renderer.js +5 -5
- package/dist/wc-react/markdown-renderer.js.map +1 -1
- package/dist/wc-react/selection-group.js +1 -1
- package/dist/wc-react/selection-group.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/src/tokens.css +10 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tooltip.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":"Tooltip.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-info-foreground',\n success: 'bg-success text-success-foreground',\n warning: 'bg-warning text-warning-foreground',\n destructive: 'bg-destructive text-destructive-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/wc-react/button.js
CHANGED
|
@@ -71,22 +71,22 @@ var C = /* @__PURE__ */ l.forwardRef(function(e, t) {
|
|
|
71
71
|
{
|
|
72
72
|
appearance: "solid",
|
|
73
73
|
variant: "info",
|
|
74
|
-
className: "bg-info text-
|
|
74
|
+
className: "bg-info text-info-foreground hover:bg-info/80"
|
|
75
75
|
},
|
|
76
76
|
{
|
|
77
77
|
appearance: "solid",
|
|
78
78
|
variant: "success",
|
|
79
|
-
className: "bg-success text-
|
|
79
|
+
className: "bg-success text-success-foreground hover:bg-success/80"
|
|
80
80
|
},
|
|
81
81
|
{
|
|
82
82
|
appearance: "solid",
|
|
83
83
|
variant: "warning",
|
|
84
|
-
className: "bg-warning text-
|
|
84
|
+
className: "bg-warning text-warning-foreground hover:bg-warning/80"
|
|
85
85
|
},
|
|
86
86
|
{
|
|
87
87
|
appearance: "solid",
|
|
88
88
|
variant: "destructive",
|
|
89
|
-
className: "bg-destructive text-
|
|
89
|
+
className: "bg-destructive text-destructive-foreground hover:bg-destructive/80"
|
|
90
90
|
},
|
|
91
91
|
{
|
|
92
92
|
appearance: "gradient",
|
|
@@ -101,22 +101,22 @@ var C = /* @__PURE__ */ l.forwardRef(function(e, t) {
|
|
|
101
101
|
{
|
|
102
102
|
appearance: "gradient",
|
|
103
103
|
variant: "info",
|
|
104
|
-
className: "from-info to-info/60 text-
|
|
104
|
+
className: "from-info to-info/60 text-info-foreground hover:from-info/60 hover:to-info"
|
|
105
105
|
},
|
|
106
106
|
{
|
|
107
107
|
appearance: "gradient",
|
|
108
108
|
variant: "success",
|
|
109
|
-
className: "from-success to-success/60 text-
|
|
109
|
+
className: "from-success to-success/60 text-success-foreground hover:from-success/60 hover:to-success"
|
|
110
110
|
},
|
|
111
111
|
{
|
|
112
112
|
appearance: "gradient",
|
|
113
113
|
variant: "warning",
|
|
114
|
-
className: "from-warning to-warning/60 text-
|
|
114
|
+
className: "from-warning to-warning/60 text-warning-foreground hover:from-warning/60 hover:to-warning"
|
|
115
115
|
},
|
|
116
116
|
{
|
|
117
117
|
appearance: "gradient",
|
|
118
118
|
variant: "destructive",
|
|
119
|
-
className: "from-destructive to-destructive/60 text-
|
|
119
|
+
className: "from-destructive to-destructive/60 text-destructive-foreground hover:from-destructive/60 hover:to-destructive"
|
|
120
120
|
},
|
|
121
121
|
{
|
|
122
122
|
appearance: "soft",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"button.js","names":["Button"],"sources":["../../../../../../../../../../../Users/akarim/Documents/test/humain_foundation_ui/node_modules/.bun/@base-ui+react@1.6.0+1c528c44af60ea5b/node_modules/@base-ui/react/button/Button.mjs","../../src/components/ui/button.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { useButton } from \"../internals/use-button/useButton.mjs\";\nimport { useRenderElement } from \"../internals/useRenderElement.mjs\";\n/**\n * A button component that can be used to trigger actions.\n * Renders a `<button>` element.\n *\n * Documentation: [Base UI Button](https://base-ui.com/react/components/button)\n */\nexport const Button = /*#__PURE__*/React.forwardRef(function Button(componentProps, forwardedRef) {\n const {\n render,\n className,\n disabled = false,\n focusableWhenDisabled = false,\n nativeButton = true,\n style,\n ...elementProps\n } = componentProps;\n const {\n getButtonProps,\n buttonRef\n } = useButton({\n disabled,\n focusableWhenDisabled,\n native: nativeButton\n });\n const state = {\n disabled\n };\n return useRenderElement('button', componentProps, {\n state,\n ref: [forwardedRef, buttonRef],\n props: [elementProps, getButtonProps]\n });\n});\nif (process.env.NODE_ENV !== \"production\") Button.displayName = \"Button\";","import { Button as ButtonPrimitive } from '@base-ui/react/button';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { Check, X } from 'lucide-react';\nimport * as React from 'react';\nimport { GradientBorder } from '@/components/ui/gradient-border';\nimport { Spinner } from '@/components/ui/spinner';\nimport { cn } from '@/lib/utils';\n\nconst buttonFocusExpansionClassName =\n 'focus-visible:scale-[1.015] motion-reduce:focus-visible:scale-100';\n\nconst buttonVariants = cva(\n \"focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 border border-transparent bg-clip-padding text-sm font-medium focus-visible:ring-[3px] aria-invalid:ring-[3px] [&_svg:not([class*='size-'])]:size-4 inline-flex origin-center items-center justify-center whitespace-nowrap transition-[color,background-color,border-color,box-shadow,transform,opacity] duration-200 ease-smooth motion-reduce:transition-none disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none shrink-0 [&_svg]:shrink-0 outline-none group/button select-none\",\n {\n variants: {\n appearance: {\n solid: `${buttonFocusExpansionClassName} delight-click-ripple`,\n gradient: `${buttonFocusExpansionClassName} bg-linear-[113deg] hover:opacity-80 delight-click-ripple`,\n soft: `${buttonFocusExpansionClassName} delight-click-ripple`,\n outline: `${buttonFocusExpansionClassName} bg-background shadow-xs`,\n ghost: `${buttonFocusExpansionClassName} bg-transparent`,\n link: 'border-none bg-transparent p-0 h-auto underline-offset-4 hover:underline focus-visible:ring-0 focus-visible:border-transparent',\n ai: `${buttonFocusExpansionClassName} bg-transparent border-0`,\n },\n variant: {\n primary: '',\n secondary: '',\n info: '',\n success: '',\n warning: '',\n destructive: '',\n },\n size: {\n default:\n 'h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pe-2 has-data-[icon=inline-start]:ps-2',\n xs: \"h-6 gap-1 px-2 text-xs has-data-[icon=inline-end]:pe-1.5 has-data-[icon=inline-start]:ps-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: 'h-8 gap-1 px-2.5 has-data-[icon=inline-end]:pe-1.5 has-data-[icon=inline-start]:ps-1.5',\n md: 'h-10 gap-1.5 px-3.5 has-data-[icon=inline-end]:pe-3 has-data-[icon=inline-start]:ps-3',\n lg: 'h-11 gap-2 px-4 has-data-[icon=inline-end]:pe-3.5 has-data-[icon=inline-start]:ps-3.5',\n xl: \"h-12 gap-2 px-4.5 text-base has-data-[icon=inline-end]:pe-4 has-data-[icon=inline-start]:ps-4 [&_svg:not([class*='size-'])]:size-5\",\n '2xl':\n \"h-14 gap-2.5 px-5 text-lg has-data-[icon=inline-end]:pe-4.5 has-data-[icon=inline-start]:ps-4.5 [&_svg:not([class*='size-'])]:size-6\",\n icon: 'size-9',\n 'icon-xs': \"size-6 [&_svg:not([class*='size-'])]:size-3\",\n 'icon-sm': 'size-8',\n 'icon-lg': 'size-10',\n 'icon-xl': \"size-12 [&_svg:not([class*='size-'])]:size-5\",\n 'icon-2xl': \"size-14 [&_svg:not([class*='size-'])]:size-6\",\n },\n shape: {\n rounded: 'rounded-md',\n round: 'rounded-full',\n },\n },\n compoundVariants: [\n // ===== SOLID =====\n {\n appearance: 'solid',\n variant: 'primary',\n className: 'bg-primary text-primary-foreground hover:bg-primary-hover',\n },\n {\n appearance: 'solid',\n variant: 'secondary',\n className:\n 'bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground',\n },\n {\n appearance: 'solid',\n variant: 'info',\n className: 'bg-info text-primary-foreground hover:bg-info/80',\n },\n {\n appearance: 'solid',\n variant: 'success',\n className: 'bg-success text-primary-foreground hover:bg-success/80',\n },\n {\n appearance: 'solid',\n variant: 'warning',\n className: 'bg-warning text-primary-foreground hover:bg-warning/80',\n },\n {\n appearance: 'solid',\n variant: 'destructive',\n className:\n 'bg-destructive text-primary-foreground hover:bg-destructive/80',\n },\n\n // ===== GRADIENT =====\n {\n appearance: 'gradient',\n variant: 'primary',\n className:\n 'from-custom-tw-gradient-from to-custom-tw-gradient-to text-primary-foreground hover:from-custom-tw-gradient-to hover:to-custom-tw-gradient-from',\n },\n {\n appearance: 'gradient',\n variant: 'secondary',\n className:\n 'from-secondary to-secondary/60 text-secondary-foreground hover:from-secondary/60 hover:to-secondary',\n },\n {\n appearance: 'gradient',\n variant: 'info',\n className:\n 'from-info to-info/60 text-primary-foreground hover:from-info/60 hover:to-info',\n },\n {\n appearance: 'gradient',\n variant: 'success',\n className:\n 'from-success to-success/60 text-primary-foreground hover:from-success/60 hover:to-success',\n },\n {\n appearance: 'gradient',\n variant: 'warning',\n className:\n 'from-warning to-warning/60 text-primary-foreground hover:from-warning/60 hover:to-warning',\n },\n {\n appearance: 'gradient',\n variant: 'destructive',\n className:\n 'from-destructive to-destructive/60 text-primary-foreground hover:from-destructive/60 hover:to-destructive',\n },\n\n // ===== SOFT =====\n {\n appearance: 'soft',\n variant: 'primary',\n className:\n 'bg-primary/10 border-primary text-primary hover:bg-primary/20 hover:text-primary dark:bg-primary/30 dark:border-primary dark:text-primary dark:hover:bg-primary/50 shadow-xs',\n },\n {\n appearance: 'soft',\n variant: 'secondary',\n className:\n 'bg-secondary/10 text-secondary-foreground hover:bg-secondary/20',\n },\n {\n appearance: 'soft',\n variant: 'info',\n className: 'bg-info/10 text-info hover:bg-info/20',\n },\n {\n appearance: 'soft',\n variant: 'success',\n className: 'bg-success/10 text-success hover:bg-success/20',\n },\n {\n appearance: 'soft',\n variant: 'warning',\n className: 'bg-warning/10 text-warning hover:bg-warning/20',\n },\n {\n appearance: 'soft',\n variant: 'destructive',\n className:\n 'bg-destructive/10 hover:bg-destructive/20 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/20 text-destructive focus-visible:border-destructive/40 dark:hover:bg-destructive/30',\n },\n\n // ===== OUTLINE =====\n {\n appearance: 'outline',\n className:\n 'bg-card border-border backdrop-blur-[2px] shadow-none supports-backdrop-filter:backdrop-blur-[2px]',\n },\n {\n appearance: 'outline',\n shape: 'rounded',\n className: 'rounded-xl',\n },\n {\n appearance: 'outline',\n size: 'xs',\n className: 'h-[26px] gap-1 px-2',\n },\n {\n appearance: 'outline',\n size: 'sm',\n className: 'h-8 gap-1.5 px-2.5',\n },\n {\n appearance: 'outline',\n size: 'default',\n className: 'h-9 gap-2 px-4',\n },\n {\n appearance: 'outline',\n size: 'md',\n className: 'h-10 gap-2 px-4',\n },\n {\n appearance: 'outline',\n size: 'lg',\n className: 'h-10 gap-2 px-4.5',\n },\n {\n appearance: 'outline',\n variant: 'primary',\n className: 'border-border text-foreground hover:bg-muted/50',\n },\n {\n appearance: 'outline',\n variant: 'secondary',\n className:\n 'border-border text-secondary-foreground hover:bg-muted/50 aria-expanded:bg-muted/50 aria-expanded:text-foreground',\n },\n {\n appearance: 'outline',\n variant: 'info',\n className: 'border-border text-info hover:bg-info/10',\n },\n {\n appearance: 'outline',\n variant: 'success',\n className: 'border-border text-success hover:bg-success/10',\n },\n {\n appearance: 'outline',\n variant: 'warning',\n className: 'border-border text-warning hover:bg-warning/10',\n },\n {\n appearance: 'outline',\n variant: 'destructive',\n className: 'border-border text-destructive hover:bg-destructive/10',\n },\n\n // ===== GHOST =====\n {\n appearance: 'ghost',\n variant: 'primary',\n className: 'text-primary hover:bg-primary/10',\n },\n {\n appearance: 'ghost',\n variant: 'secondary',\n className:\n 'hover:bg-muted hover:text-foreground dark:hover:bg-muted/50 aria-expanded:bg-muted aria-expanded:text-foreground',\n },\n {\n appearance: 'ghost',\n variant: 'info',\n className: 'text-info hover:bg-info/10',\n },\n {\n appearance: 'ghost',\n variant: 'success',\n className: 'text-success hover:bg-success/10',\n },\n {\n appearance: 'ghost',\n variant: 'warning',\n className: 'text-warning hover:bg-warning/10',\n },\n {\n appearance: 'ghost',\n variant: 'destructive',\n className: 'text-destructive hover:bg-destructive/10',\n },\n\n // ===== AI (inner button styling — GradientBorder wraps externally) =====\n {\n appearance: 'ai',\n variant: 'primary',\n className: 'text-primary hover:bg-primary/10',\n },\n {\n appearance: 'ai',\n variant: 'secondary',\n className: 'text-secondary-foreground hover:bg-muted',\n },\n\n // ===== LINK =====\n { appearance: 'link', variant: 'primary', className: 'text-primary' },\n {\n appearance: 'link',\n variant: 'secondary',\n className: 'text-secondary-foreground',\n },\n { appearance: 'link', variant: 'info', className: 'text-info' },\n { appearance: 'link', variant: 'success', className: 'text-success' },\n { appearance: 'link', variant: 'warning', className: 'text-warning' },\n {\n appearance: 'link',\n variant: 'destructive',\n className: 'text-destructive hover:text-destructive/80',\n },\n ],\n defaultVariants: {\n appearance: 'solid',\n variant: 'primary',\n size: 'default',\n shape: 'rounded',\n },\n },\n);\n\ntype DotColor = 'success' | 'error' | 'warning' | 'brand' | 'gray';\n\ntype ButtonAppearance =\n | 'solid'\n | 'gradient'\n | 'soft'\n | 'outline'\n | 'ghost'\n | 'link'\n | 'ai';\ntype ButtonVariant =\n | 'primary'\n | 'secondary'\n | 'info'\n | 'success'\n | 'warning'\n | 'destructive';\ntype ButtonShape = 'rounded' | 'round';\n\n/**\n * Render prop type for polymorphic rendering.\n * Accepts either a React element or a function that receives props and returns an element.\n * @template Props The props to be passed to the rendered element\n */\ntype RenderProp<Props> =\n | React.ReactElement\n | ((props: Props) => React.ReactElement);\n\nexport interface ButtonProps\n extends React.ComponentProps<'button'>,\n Pick<VariantProps<typeof buttonVariants>, 'size'> {\n /** Visual appearance - how the button renders */\n appearance?: ButtonAppearance;\n /** Semantic variant - what the button means */\n variant?: ButtonVariant;\n /** Shape of the button corners */\n shape?: ButtonShape;\n /** Shows a loading spinner and disables the button */\n loading?: boolean;\n /** Set to false when render targets a non-button element. */\n nativeButton?: boolean;\n /** Icon displayed at the start (inline-start) of the button text - respects RTL */\n startIcon?: React.ReactNode;\n /** Icon displayed at the end (inline-end) of the button text - respects RTL */\n endIcon?: React.ReactNode;\n /** Shows a colored dot indicator before the button text */\n dotIndicator?: boolean;\n /** Color of the dot indicator */\n dotColor?: DotColor;\n /** Badge content displayed after the button label. Text badges are styled from the button appearance and variant. */\n badge?: React.ReactNode;\n /** For icon-only buttons - renders just the icon without text wrapper */\n iconOnly?: boolean;\n /** Enables animated gradient border (only for appearance=\"ai\"). Auto-true when loading. */\n animated?: boolean;\n /**\n * Render prop for polymorphic rendering. Accepts either a React element or a render function.\n * Use this to render the button as a different element (e.g., link) while preserving button styles.\n * Note: When render is provided, loading/startIcon/endIcon/dotIndicator/badge are ignored.\n */\n render?: RenderProp<React.ComponentProps<'button'>>;\n}\n\nconst dotColorClasses: Record<DotColor, string> = {\n success: 'bg-success',\n error: 'bg-destructive',\n warning: 'bg-warning',\n brand: 'bg-primary',\n gray: 'bg-muted',\n};\n\nconst devWarnings = new Set<string>();\n\n/** Icon-only size variants for type-safe detection */\nconst ICON_SIZES = [\n 'icon',\n 'icon-xs',\n 'icon-sm',\n 'icon-lg',\n 'icon-xl',\n 'icon-2xl',\n] as const;\n\nconst SUCCESS_FLASH_DURATION_MS = 600;\n\nconst buttonBadgeShapeClasses: Record<ButtonShape, string> = {\n round: 'rounded-full',\n rounded: 'rounded-sm',\n};\n\nconst buttonBadgeWhiteColorClasses: Record<ButtonVariant, string> = {\n primary: 'text-primary',\n secondary: 'text-secondary-foreground',\n info: 'text-info',\n success: 'text-success',\n warning: 'text-warning',\n destructive: 'text-destructive',\n};\n\nconst buttonBadgeSoftColorClasses: Record<ButtonVariant, string> = {\n primary:\n 'bg-soft-primary text-soft-primary-foreground hover:bg-opacity-primary-20 dark:bg-soft-primary dark:text-soft-primary-foreground',\n secondary:\n 'bg-soft-secondary text-soft-secondary-foreground hover:bg-opacity-secondary-20 dark:bg-soft-secondary dark:text-soft-secondary-foreground',\n info: 'bg-soft-info text-soft-info-foreground hover:bg-opacity-info-20 dark:bg-soft-info dark:text-soft-info-foreground',\n success:\n 'bg-soft-success text-soft-success-foreground hover:bg-opacity-success-20 dark:bg-soft-success dark:text-soft-success-foreground',\n warning:\n 'bg-soft-warning text-soft-warning-foreground hover:bg-opacity-warning-20 dark:bg-soft-warning dark:text-soft-warning-foreground',\n destructive:\n 'bg-soft-destructive text-soft-destructive-foreground hover:bg-opacity-destructive-20 dark:bg-soft-destructive dark:text-soft-destructive-foreground',\n};\n\ntype LoadingSuccessState = {\n wasLoading: boolean;\n visible: boolean;\n token: number;\n};\n\nconst Dot = ({\n color = 'success',\n className,\n}: {\n color?: DotColor;\n className?: string;\n}) => (\n <span\n aria-hidden=\"true\"\n className={cn(\n 'size-2 rounded-full shrink-0 delight-breathing',\n dotColorClasses[color],\n className,\n )}\n />\n);\n\nfunction ButtonBadge({\n appearance,\n badge,\n shape,\n variant,\n}: {\n appearance: ButtonAppearance;\n badge: React.ReactNode;\n shape: ButtonShape;\n variant: ButtonVariant;\n}) {\n if (React.isValidElement(badge)) {\n return badge;\n }\n\n if (badge === true || badge === false || badge == null) {\n return null;\n }\n\n const badgeVariant =\n (appearance === 'solid' || appearance === 'gradient') &&\n variant !== 'secondary'\n ? 'white'\n : 'soft';\n\n return (\n <span\n data-slot=\"badge\"\n className={cn(\n 'inline-flex h-5 shrink-0 items-center justify-center gap-1.5 whitespace-nowrap px-2 py-0.5 text-xs font-medium transition-colors [&>svg]:size-3 [&>svg]:shrink-0 [&>svg]:pointer-events-none',\n buttonBadgeShapeClasses[shape],\n badgeVariant === 'white'\n ? 'bg-opacity-white-80 transition-opacity hover:opacity-80 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-current/50'\n : buttonBadgeSoftColorClasses[variant],\n badgeVariant === 'white' && buttonBadgeWhiteColorClasses[variant],\n )}\n >\n {badge}\n </span>\n );\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n children,\n loading = false,\n disabled,\n startIcon,\n endIcon,\n dotIndicator = false,\n dotColor = 'success',\n badge,\n iconOnly = false,\n animated,\n render,\n className,\n appearance = 'solid',\n variant = 'primary',\n shape = 'rounded',\n size = 'default',\n ...props\n },\n ref,\n ) => {\n // Dev-mode warning for icon-only buttons missing accessible label (once)\n if (\n process.env.NODE_ENV !== 'production' &&\n !devWarnings.has('icon-a11y')\n ) {\n const hasIconSize = ICON_SIZES.includes(\n size as (typeof ICON_SIZES)[number],\n );\n if (\n (iconOnly || hasIconSize) &&\n !props['aria-label'] &&\n !props['aria-labelledby']\n ) {\n devWarnings.add('icon-a11y');\n console.warn(\n 'Button: Icon-only buttons require an `aria-label` or `aria-labelledby` for accessibility.',\n );\n }\n }\n\n // Track loading→done transition before paint so the button never commits a\n // stale success state after the loading prop changes.\n const [successState, setSuccessState] = React.useState<LoadingSuccessState>(\n () => ({\n wasLoading: loading,\n visible: false,\n token: 0,\n }),\n );\n\n if (successState.wasLoading !== loading) {\n const shouldFlash = successState.wasLoading && !loading;\n setSuccessState({\n wasLoading: loading,\n visible: shouldFlash,\n token: shouldFlash ? successState.token + 1 : successState.token,\n });\n }\n\n React.useEffect(() => {\n if (!successState.visible) return;\n const token = successState.token;\n const timer = setTimeout(() => {\n setSuccessState((current) =>\n current.token === token ? { ...current, visible: false } : current,\n );\n }, SUCCESS_FLASH_DURATION_MS);\n return () => clearTimeout(timer);\n }, [successState.visible, successState.token]);\n\n const showSuccess = successState.visible && !loading;\n\n const isAi = appearance === 'ai';\n const isAnimated = isAi ? (animated ?? loading) : false;\n\n const buttonClassName = cn(\n buttonVariants({ appearance, variant, shape, size }),\n className,\n );\n\n // When render prop is provided, pass through to primitive\n // (ignores loading/startIcon/endIcon/dotIndicator/badge)\n if (render) {\n return (\n <ButtonPrimitive\n ref={ref}\n data-slot=\"button\"\n className={buttonClassName}\n render={render}\n {...props}\n >\n {children}\n </ButtonPrimitive>\n );\n }\n\n // Determine if this is an icon-only button based on size or explicit prop\n const isIconOnly =\n iconOnly || ICON_SIZES.includes(size as (typeof ICON_SIZES)[number]);\n const shouldComposeBadgeLabel =\n !isIconOnly &&\n !props['aria-label'] &&\n !props['aria-labelledby'] &&\n (typeof children === 'string' || typeof children === 'number') &&\n (typeof badge === 'string' || typeof badge === 'number');\n const buttonProps = shouldComposeBadgeLabel\n ? { ...props, 'aria-label': `${children} ${badge}` }\n : props;\n const buttonBadge = !isIconOnly ? (\n <ButtonBadge\n appearance={appearance}\n badge={badge}\n shape={shape}\n variant={variant}\n />\n ) : null;\n\n // Build the button element (icon-only or full)\n const buttonElement = isIconOnly ? (\n <ButtonPrimitive\n ref={isAi ? undefined : ref}\n data-slot=\"button\"\n disabled={disabled || loading}\n className={cn(buttonClassName, loading && 'relative')}\n {...buttonProps}\n >\n {loading ? (\n <Spinner className=\"delight-fade-in\" />\n ) : showSuccess ? (\n <Check className=\"delight-bounce-in\" />\n ) : (\n children\n )}\n </ButtonPrimitive>\n ) : (\n <ButtonPrimitive\n ref={isAi ? undefined : ref}\n data-slot=\"button\"\n disabled={disabled || loading}\n className={cn(buttonClassName, (loading || showSuccess) && 'relative')}\n {...buttonProps}\n >\n {loading && <Spinner className=\"absolute delight-fade-in\" />}\n {showSuccess && !loading && (\n <Check className=\"absolute delight-bounce-in\" />\n )}\n <span\n className={cn(\n 'flex items-center gap-2',\n (loading || showSuccess) && 'invisible',\n )}\n >\n {dotIndicator && <Dot color={dotColor} />}\n {startIcon}\n {children}\n {endIcon}\n {buttonBadge}\n </span>\n </ButtonPrimitive>\n );\n\n if (isAi) {\n return (\n <GradientBorder\n ref={ref as React.Ref<HTMLDivElement>}\n animated={isAnimated}\n active\n disabled={disabled}\n className=\"w-auto inline-flex motion-reduce:animate-none\"\n innerClassName=\"flex\"\n >\n {buttonElement}\n </GradientBorder>\n );\n }\n\n return buttonElement;\n },\n);\n\nButton.displayName = 'Button';\n\n/**\n * Clear/Close icon button - a ghost button specifically for close/clear actions\n * Commonly used in tags, dialogs, and dismissible elements\n */\nexport interface ClearButtonProps\n extends Omit<\n ButtonProps,\n | 'appearance'\n | 'variant'\n | 'children'\n | 'startIcon'\n | 'endIcon'\n | 'dotIndicator'\n > {\n /** Size of the clear button */\n size?: 'icon-xs' | 'icon-sm' | 'icon' | 'icon-lg' | 'icon-xl' | 'icon-2xl';\n}\n\nfunction ClearButton({\n className,\n size = 'icon-sm',\n ...props\n}: ClearButtonProps) {\n return (\n <Button\n appearance=\"ghost\"\n variant=\"secondary\"\n size={size}\n iconOnly\n className={cn(\n 'text-text-quaternary hover:text-secondary-foreground',\n className,\n )}\n aria-label=\"Clear\"\n {...props}\n >\n <X />\n </Button>\n );\n}\n\nClearButton.displayName = 'ClearButton';\n\nexport type { ButtonAppearance, ButtonShape, ButtonVariant };\nexport { Button, buttonVariants, ClearButton, Dot };\n"],"x_google_ignoreList":[0],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"button.js","names":["Button"],"sources":["../../../../../../../../../../../Users/akarim/Documents/test/humain_foundation_ui/node_modules/.bun/@base-ui+react@1.6.0+1c528c44af60ea5b/node_modules/@base-ui/react/button/Button.mjs","../../src/components/ui/button.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { useButton } from \"../internals/use-button/useButton.mjs\";\nimport { useRenderElement } from \"../internals/useRenderElement.mjs\";\n/**\n * A button component that can be used to trigger actions.\n * Renders a `<button>` element.\n *\n * Documentation: [Base UI Button](https://base-ui.com/react/components/button)\n */\nexport const Button = /*#__PURE__*/React.forwardRef(function Button(componentProps, forwardedRef) {\n const {\n render,\n className,\n disabled = false,\n focusableWhenDisabled = false,\n nativeButton = true,\n style,\n ...elementProps\n } = componentProps;\n const {\n getButtonProps,\n buttonRef\n } = useButton({\n disabled,\n focusableWhenDisabled,\n native: nativeButton\n });\n const state = {\n disabled\n };\n return useRenderElement('button', componentProps, {\n state,\n ref: [forwardedRef, buttonRef],\n props: [elementProps, getButtonProps]\n });\n});\nif (process.env.NODE_ENV !== \"production\") Button.displayName = \"Button\";","import { Button as ButtonPrimitive } from '@base-ui/react/button';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { Check, X } from 'lucide-react';\nimport * as React from 'react';\nimport { GradientBorder } from '@/components/ui/gradient-border';\nimport { Spinner } from '@/components/ui/spinner';\nimport { cn } from '@/lib/utils';\n\nconst buttonFocusExpansionClassName =\n 'focus-visible:scale-[1.015] motion-reduce:focus-visible:scale-100';\n\nconst buttonVariants = cva(\n \"focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 border border-transparent bg-clip-padding text-sm font-medium focus-visible:ring-[3px] aria-invalid:ring-[3px] [&_svg:not([class*='size-'])]:size-4 inline-flex origin-center items-center justify-center whitespace-nowrap transition-[color,background-color,border-color,box-shadow,transform,opacity] duration-200 ease-smooth motion-reduce:transition-none disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none shrink-0 [&_svg]:shrink-0 outline-none group/button select-none\",\n {\n variants: {\n appearance: {\n solid: `${buttonFocusExpansionClassName} delight-click-ripple`,\n gradient: `${buttonFocusExpansionClassName} bg-linear-[113deg] hover:opacity-80 delight-click-ripple`,\n soft: `${buttonFocusExpansionClassName} delight-click-ripple`,\n outline: `${buttonFocusExpansionClassName} bg-background shadow-xs`,\n ghost: `${buttonFocusExpansionClassName} bg-transparent`,\n link: 'border-none bg-transparent p-0 h-auto underline-offset-4 hover:underline focus-visible:ring-0 focus-visible:border-transparent',\n ai: `${buttonFocusExpansionClassName} bg-transparent border-0`,\n },\n variant: {\n primary: '',\n secondary: '',\n info: '',\n success: '',\n warning: '',\n destructive: '',\n },\n size: {\n default:\n 'h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pe-2 has-data-[icon=inline-start]:ps-2',\n xs: \"h-6 gap-1 px-2 text-xs has-data-[icon=inline-end]:pe-1.5 has-data-[icon=inline-start]:ps-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: 'h-8 gap-1 px-2.5 has-data-[icon=inline-end]:pe-1.5 has-data-[icon=inline-start]:ps-1.5',\n md: 'h-10 gap-1.5 px-3.5 has-data-[icon=inline-end]:pe-3 has-data-[icon=inline-start]:ps-3',\n lg: 'h-11 gap-2 px-4 has-data-[icon=inline-end]:pe-3.5 has-data-[icon=inline-start]:ps-3.5',\n xl: \"h-12 gap-2 px-4.5 text-base has-data-[icon=inline-end]:pe-4 has-data-[icon=inline-start]:ps-4 [&_svg:not([class*='size-'])]:size-5\",\n '2xl':\n \"h-14 gap-2.5 px-5 text-lg has-data-[icon=inline-end]:pe-4.5 has-data-[icon=inline-start]:ps-4.5 [&_svg:not([class*='size-'])]:size-6\",\n icon: 'size-9',\n 'icon-xs': \"size-6 [&_svg:not([class*='size-'])]:size-3\",\n 'icon-sm': 'size-8',\n 'icon-lg': 'size-10',\n 'icon-xl': \"size-12 [&_svg:not([class*='size-'])]:size-5\",\n 'icon-2xl': \"size-14 [&_svg:not([class*='size-'])]:size-6\",\n },\n shape: {\n rounded: 'rounded-md',\n round: 'rounded-full',\n },\n },\n compoundVariants: [\n // ===== SOLID =====\n {\n appearance: 'solid',\n variant: 'primary',\n className: 'bg-primary text-primary-foreground hover:bg-primary-hover',\n },\n {\n appearance: 'solid',\n variant: 'secondary',\n className:\n 'bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground',\n },\n {\n appearance: 'solid',\n variant: 'info',\n className: 'bg-info text-info-foreground hover:bg-info/80',\n },\n {\n appearance: 'solid',\n variant: 'success',\n className: 'bg-success text-success-foreground hover:bg-success/80',\n },\n {\n appearance: 'solid',\n variant: 'warning',\n className: 'bg-warning text-warning-foreground hover:bg-warning/80',\n },\n {\n appearance: 'solid',\n variant: 'destructive',\n className:\n 'bg-destructive text-destructive-foreground hover:bg-destructive/80',\n },\n\n // ===== GRADIENT =====\n {\n appearance: 'gradient',\n variant: 'primary',\n className:\n 'from-custom-tw-gradient-from to-custom-tw-gradient-to text-primary-foreground hover:from-custom-tw-gradient-to hover:to-custom-tw-gradient-from',\n },\n {\n appearance: 'gradient',\n variant: 'secondary',\n className:\n 'from-secondary to-secondary/60 text-secondary-foreground hover:from-secondary/60 hover:to-secondary',\n },\n {\n appearance: 'gradient',\n variant: 'info',\n className:\n 'from-info to-info/60 text-info-foreground hover:from-info/60 hover:to-info',\n },\n {\n appearance: 'gradient',\n variant: 'success',\n className:\n 'from-success to-success/60 text-success-foreground hover:from-success/60 hover:to-success',\n },\n {\n appearance: 'gradient',\n variant: 'warning',\n className:\n 'from-warning to-warning/60 text-warning-foreground hover:from-warning/60 hover:to-warning',\n },\n {\n appearance: 'gradient',\n variant: 'destructive',\n className:\n 'from-destructive to-destructive/60 text-destructive-foreground hover:from-destructive/60 hover:to-destructive',\n },\n\n // ===== SOFT =====\n {\n appearance: 'soft',\n variant: 'primary',\n className:\n 'bg-primary/10 border-primary text-primary hover:bg-primary/20 hover:text-primary dark:bg-primary/30 dark:border-primary dark:text-primary dark:hover:bg-primary/50 shadow-xs',\n },\n {\n appearance: 'soft',\n variant: 'secondary',\n className:\n 'bg-secondary/10 text-secondary-foreground hover:bg-secondary/20',\n },\n {\n appearance: 'soft',\n variant: 'info',\n className: 'bg-info/10 text-info hover:bg-info/20',\n },\n {\n appearance: 'soft',\n variant: 'success',\n className: 'bg-success/10 text-success hover:bg-success/20',\n },\n {\n appearance: 'soft',\n variant: 'warning',\n className: 'bg-warning/10 text-warning hover:bg-warning/20',\n },\n {\n appearance: 'soft',\n variant: 'destructive',\n className:\n 'bg-destructive/10 hover:bg-destructive/20 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/20 text-destructive focus-visible:border-destructive/40 dark:hover:bg-destructive/30',\n },\n\n // ===== OUTLINE =====\n {\n appearance: 'outline',\n className:\n 'bg-card border-border backdrop-blur-[2px] shadow-none supports-backdrop-filter:backdrop-blur-[2px]',\n },\n {\n appearance: 'outline',\n shape: 'rounded',\n className: 'rounded-xl',\n },\n {\n appearance: 'outline',\n size: 'xs',\n className: 'h-[26px] gap-1 px-2',\n },\n {\n appearance: 'outline',\n size: 'sm',\n className: 'h-8 gap-1.5 px-2.5',\n },\n {\n appearance: 'outline',\n size: 'default',\n className: 'h-9 gap-2 px-4',\n },\n {\n appearance: 'outline',\n size: 'md',\n className: 'h-10 gap-2 px-4',\n },\n {\n appearance: 'outline',\n size: 'lg',\n className: 'h-10 gap-2 px-4.5',\n },\n {\n appearance: 'outline',\n variant: 'primary',\n className: 'border-border text-foreground hover:bg-muted/50',\n },\n {\n appearance: 'outline',\n variant: 'secondary',\n className:\n 'border-border text-secondary-foreground hover:bg-muted/50 aria-expanded:bg-muted/50 aria-expanded:text-foreground',\n },\n {\n appearance: 'outline',\n variant: 'info',\n className: 'border-border text-info hover:bg-info/10',\n },\n {\n appearance: 'outline',\n variant: 'success',\n className: 'border-border text-success hover:bg-success/10',\n },\n {\n appearance: 'outline',\n variant: 'warning',\n className: 'border-border text-warning hover:bg-warning/10',\n },\n {\n appearance: 'outline',\n variant: 'destructive',\n className: 'border-border text-destructive hover:bg-destructive/10',\n },\n\n // ===== GHOST =====\n {\n appearance: 'ghost',\n variant: 'primary',\n className: 'text-primary hover:bg-primary/10',\n },\n {\n appearance: 'ghost',\n variant: 'secondary',\n className:\n 'hover:bg-muted hover:text-foreground dark:hover:bg-muted/50 aria-expanded:bg-muted aria-expanded:text-foreground',\n },\n {\n appearance: 'ghost',\n variant: 'info',\n className: 'text-info hover:bg-info/10',\n },\n {\n appearance: 'ghost',\n variant: 'success',\n className: 'text-success hover:bg-success/10',\n },\n {\n appearance: 'ghost',\n variant: 'warning',\n className: 'text-warning hover:bg-warning/10',\n },\n {\n appearance: 'ghost',\n variant: 'destructive',\n className: 'text-destructive hover:bg-destructive/10',\n },\n\n // ===== AI (inner button styling — GradientBorder wraps externally) =====\n {\n appearance: 'ai',\n variant: 'primary',\n className: 'text-primary hover:bg-primary/10',\n },\n {\n appearance: 'ai',\n variant: 'secondary',\n className: 'text-secondary-foreground hover:bg-muted',\n },\n\n // ===== LINK =====\n { appearance: 'link', variant: 'primary', className: 'text-primary' },\n {\n appearance: 'link',\n variant: 'secondary',\n className: 'text-secondary-foreground',\n },\n { appearance: 'link', variant: 'info', className: 'text-info' },\n { appearance: 'link', variant: 'success', className: 'text-success' },\n { appearance: 'link', variant: 'warning', className: 'text-warning' },\n {\n appearance: 'link',\n variant: 'destructive',\n className: 'text-destructive hover:text-destructive/80',\n },\n ],\n defaultVariants: {\n appearance: 'solid',\n variant: 'primary',\n size: 'default',\n shape: 'rounded',\n },\n },\n);\n\ntype DotColor = 'success' | 'error' | 'warning' | 'brand' | 'gray';\n\ntype ButtonAppearance =\n | 'solid'\n | 'gradient'\n | 'soft'\n | 'outline'\n | 'ghost'\n | 'link'\n | 'ai';\ntype ButtonVariant =\n | 'primary'\n | 'secondary'\n | 'info'\n | 'success'\n | 'warning'\n | 'destructive';\ntype ButtonShape = 'rounded' | 'round';\n\n/**\n * Render prop type for polymorphic rendering.\n * Accepts either a React element or a function that receives props and returns an element.\n * @template Props The props to be passed to the rendered element\n */\ntype RenderProp<Props> =\n | React.ReactElement\n | ((props: Props) => React.ReactElement);\n\nexport interface ButtonProps\n extends React.ComponentProps<'button'>,\n Pick<VariantProps<typeof buttonVariants>, 'size'> {\n /** Visual appearance - how the button renders */\n appearance?: ButtonAppearance;\n /** Semantic variant - what the button means */\n variant?: ButtonVariant;\n /** Shape of the button corners */\n shape?: ButtonShape;\n /** Shows a loading spinner and disables the button */\n loading?: boolean;\n /** Set to false when render targets a non-button element. */\n nativeButton?: boolean;\n /** Icon displayed at the start (inline-start) of the button text - respects RTL */\n startIcon?: React.ReactNode;\n /** Icon displayed at the end (inline-end) of the button text - respects RTL */\n endIcon?: React.ReactNode;\n /** Shows a colored dot indicator before the button text */\n dotIndicator?: boolean;\n /** Color of the dot indicator */\n dotColor?: DotColor;\n /** Badge content displayed after the button label. Text badges are styled from the button appearance and variant. */\n badge?: React.ReactNode;\n /** For icon-only buttons - renders just the icon without text wrapper */\n iconOnly?: boolean;\n /** Enables animated gradient border (only for appearance=\"ai\"). Auto-true when loading. */\n animated?: boolean;\n /**\n * Render prop for polymorphic rendering. Accepts either a React element or a render function.\n * Use this to render the button as a different element (e.g., link) while preserving button styles.\n * Note: When render is provided, loading/startIcon/endIcon/dotIndicator/badge are ignored.\n */\n render?: RenderProp<React.ComponentProps<'button'>>;\n}\n\nconst dotColorClasses: Record<DotColor, string> = {\n success: 'bg-success',\n error: 'bg-destructive',\n warning: 'bg-warning',\n brand: 'bg-primary',\n gray: 'bg-muted',\n};\n\nconst devWarnings = new Set<string>();\n\n/** Icon-only size variants for type-safe detection */\nconst ICON_SIZES = [\n 'icon',\n 'icon-xs',\n 'icon-sm',\n 'icon-lg',\n 'icon-xl',\n 'icon-2xl',\n] as const;\n\nconst SUCCESS_FLASH_DURATION_MS = 600;\n\nconst buttonBadgeShapeClasses: Record<ButtonShape, string> = {\n round: 'rounded-full',\n rounded: 'rounded-sm',\n};\n\nconst buttonBadgeWhiteColorClasses: Record<ButtonVariant, string> = {\n primary: 'text-primary',\n secondary: 'text-secondary-foreground',\n info: 'text-info',\n success: 'text-success',\n warning: 'text-warning',\n destructive: 'text-destructive',\n};\n\nconst buttonBadgeSoftColorClasses: Record<ButtonVariant, string> = {\n primary:\n 'bg-soft-primary text-soft-primary-foreground hover:bg-opacity-primary-20 dark:bg-soft-primary dark:text-soft-primary-foreground',\n secondary:\n 'bg-soft-secondary text-soft-secondary-foreground hover:bg-opacity-secondary-20 dark:bg-soft-secondary dark:text-soft-secondary-foreground',\n info: 'bg-soft-info text-soft-info-foreground hover:bg-opacity-info-20 dark:bg-soft-info dark:text-soft-info-foreground',\n success:\n 'bg-soft-success text-soft-success-foreground hover:bg-opacity-success-20 dark:bg-soft-success dark:text-soft-success-foreground',\n warning:\n 'bg-soft-warning text-soft-warning-foreground hover:bg-opacity-warning-20 dark:bg-soft-warning dark:text-soft-warning-foreground',\n destructive:\n 'bg-soft-destructive text-soft-destructive-foreground hover:bg-opacity-destructive-20 dark:bg-soft-destructive dark:text-soft-destructive-foreground',\n};\n\ntype LoadingSuccessState = {\n wasLoading: boolean;\n visible: boolean;\n token: number;\n};\n\nconst Dot = ({\n color = 'success',\n className,\n}: {\n color?: DotColor;\n className?: string;\n}) => (\n <span\n aria-hidden=\"true\"\n className={cn(\n 'size-2 rounded-full shrink-0 delight-breathing',\n dotColorClasses[color],\n className,\n )}\n />\n);\n\nfunction ButtonBadge({\n appearance,\n badge,\n shape,\n variant,\n}: {\n appearance: ButtonAppearance;\n badge: React.ReactNode;\n shape: ButtonShape;\n variant: ButtonVariant;\n}) {\n if (React.isValidElement(badge)) {\n return badge;\n }\n\n if (badge === true || badge === false || badge == null) {\n return null;\n }\n\n const badgeVariant =\n (appearance === 'solid' || appearance === 'gradient') &&\n variant !== 'secondary'\n ? 'white'\n : 'soft';\n\n return (\n <span\n data-slot=\"badge\"\n className={cn(\n 'inline-flex h-5 shrink-0 items-center justify-center gap-1.5 whitespace-nowrap px-2 py-0.5 text-xs font-medium transition-colors [&>svg]:size-3 [&>svg]:shrink-0 [&>svg]:pointer-events-none',\n buttonBadgeShapeClasses[shape],\n badgeVariant === 'white'\n ? 'bg-opacity-white-80 transition-opacity hover:opacity-80 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-current/50'\n : buttonBadgeSoftColorClasses[variant],\n badgeVariant === 'white' && buttonBadgeWhiteColorClasses[variant],\n )}\n >\n {badge}\n </span>\n );\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n children,\n loading = false,\n disabled,\n startIcon,\n endIcon,\n dotIndicator = false,\n dotColor = 'success',\n badge,\n iconOnly = false,\n animated,\n render,\n className,\n appearance = 'solid',\n variant = 'primary',\n shape = 'rounded',\n size = 'default',\n ...props\n },\n ref,\n ) => {\n // Dev-mode warning for icon-only buttons missing accessible label (once)\n if (\n process.env.NODE_ENV !== 'production' &&\n !devWarnings.has('icon-a11y')\n ) {\n const hasIconSize = ICON_SIZES.includes(\n size as (typeof ICON_SIZES)[number],\n );\n if (\n (iconOnly || hasIconSize) &&\n !props['aria-label'] &&\n !props['aria-labelledby']\n ) {\n devWarnings.add('icon-a11y');\n console.warn(\n 'Button: Icon-only buttons require an `aria-label` or `aria-labelledby` for accessibility.',\n );\n }\n }\n\n // Track loading→done transition before paint so the button never commits a\n // stale success state after the loading prop changes.\n const [successState, setSuccessState] = React.useState<LoadingSuccessState>(\n () => ({\n wasLoading: loading,\n visible: false,\n token: 0,\n }),\n );\n\n if (successState.wasLoading !== loading) {\n const shouldFlash = successState.wasLoading && !loading;\n setSuccessState({\n wasLoading: loading,\n visible: shouldFlash,\n token: shouldFlash ? successState.token + 1 : successState.token,\n });\n }\n\n React.useEffect(() => {\n if (!successState.visible) return;\n const token = successState.token;\n const timer = setTimeout(() => {\n setSuccessState((current) =>\n current.token === token ? { ...current, visible: false } : current,\n );\n }, SUCCESS_FLASH_DURATION_MS);\n return () => clearTimeout(timer);\n }, [successState.visible, successState.token]);\n\n const showSuccess = successState.visible && !loading;\n\n const isAi = appearance === 'ai';\n const isAnimated = isAi ? (animated ?? loading) : false;\n\n const buttonClassName = cn(\n buttonVariants({ appearance, variant, shape, size }),\n className,\n );\n\n // When render prop is provided, pass through to primitive\n // (ignores loading/startIcon/endIcon/dotIndicator/badge)\n if (render) {\n return (\n <ButtonPrimitive\n ref={ref}\n data-slot=\"button\"\n className={buttonClassName}\n render={render}\n {...props}\n >\n {children}\n </ButtonPrimitive>\n );\n }\n\n // Determine if this is an icon-only button based on size or explicit prop\n const isIconOnly =\n iconOnly || ICON_SIZES.includes(size as (typeof ICON_SIZES)[number]);\n const shouldComposeBadgeLabel =\n !isIconOnly &&\n !props['aria-label'] &&\n !props['aria-labelledby'] &&\n (typeof children === 'string' || typeof children === 'number') &&\n (typeof badge === 'string' || typeof badge === 'number');\n const buttonProps = shouldComposeBadgeLabel\n ? { ...props, 'aria-label': `${children} ${badge}` }\n : props;\n const buttonBadge = !isIconOnly ? (\n <ButtonBadge\n appearance={appearance}\n badge={badge}\n shape={shape}\n variant={variant}\n />\n ) : null;\n\n // Build the button element (icon-only or full)\n const buttonElement = isIconOnly ? (\n <ButtonPrimitive\n ref={isAi ? undefined : ref}\n data-slot=\"button\"\n disabled={disabled || loading}\n className={cn(buttonClassName, loading && 'relative')}\n {...buttonProps}\n >\n {loading ? (\n <Spinner className=\"delight-fade-in\" />\n ) : showSuccess ? (\n <Check className=\"delight-bounce-in\" />\n ) : (\n children\n )}\n </ButtonPrimitive>\n ) : (\n <ButtonPrimitive\n ref={isAi ? undefined : ref}\n data-slot=\"button\"\n disabled={disabled || loading}\n className={cn(buttonClassName, (loading || showSuccess) && 'relative')}\n {...buttonProps}\n >\n {loading && <Spinner className=\"absolute delight-fade-in\" />}\n {showSuccess && !loading && (\n <Check className=\"absolute delight-bounce-in\" />\n )}\n <span\n className={cn(\n 'flex items-center gap-2',\n (loading || showSuccess) && 'invisible',\n )}\n >\n {dotIndicator && <Dot color={dotColor} />}\n {startIcon}\n {children}\n {endIcon}\n {buttonBadge}\n </span>\n </ButtonPrimitive>\n );\n\n if (isAi) {\n return (\n <GradientBorder\n ref={ref as React.Ref<HTMLDivElement>}\n animated={isAnimated}\n active\n disabled={disabled}\n className=\"w-auto inline-flex motion-reduce:animate-none\"\n innerClassName=\"flex\"\n >\n {buttonElement}\n </GradientBorder>\n );\n }\n\n return buttonElement;\n },\n);\n\nButton.displayName = 'Button';\n\n/**\n * Clear/Close icon button - a ghost button specifically for close/clear actions\n * Commonly used in tags, dialogs, and dismissible elements\n */\nexport interface ClearButtonProps\n extends Omit<\n ButtonProps,\n | 'appearance'\n | 'variant'\n | 'children'\n | 'startIcon'\n | 'endIcon'\n | 'dotIndicator'\n > {\n /** Size of the clear button */\n size?: 'icon-xs' | 'icon-sm' | 'icon' | 'icon-lg' | 'icon-xl' | 'icon-2xl';\n}\n\nfunction ClearButton({\n className,\n size = 'icon-sm',\n ...props\n}: ClearButtonProps) {\n return (\n <Button\n appearance=\"ghost\"\n variant=\"secondary\"\n size={size}\n iconOnly\n className={cn(\n 'text-text-quaternary hover:text-secondary-foreground',\n className,\n )}\n aria-label=\"Clear\"\n {...props}\n >\n <X />\n </Button>\n );\n}\n\nClearButton.displayName = 'ClearButton';\n\nexport type { ButtonAppearance, ButtonShape, ButtonVariant };\nexport { Button, buttonVariants, ClearButton, Dot };\n"],"x_google_ignoreList":[0],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@ import { t as W } from "./button.js";
|
|
|
9
9
|
import * as i from "react";
|
|
10
10
|
import p from "react";
|
|
11
11
|
import { createRoot as Z } from "react-dom/client";
|
|
12
|
-
import { jsx as
|
|
12
|
+
import { jsx as s, jsxs as w } from "react/jsx-runtime";
|
|
13
13
|
var S = M("relative flex gap-3 rounded-lg px-4 py-3 text-sm motion-safe:animate-in motion-safe:fade-in-0 motion-safe:slide-in-from-top-1 [&>svg]:shrink-0 [&>svg]:size-4 [&>svg]:mt-0.5 [&>svg]:motion-safe:animate-in [&>svg]:motion-safe:fade-in-0 [&>svg]:motion-safe:zoom-in-75 [&>svg]:motion-safe:duration-300 [&>svg]:motion-safe:delay-75", {
|
|
14
14
|
variants: {
|
|
15
15
|
appearance: {
|
|
@@ -59,22 +59,22 @@ var S = M("relative flex gap-3 rounded-lg px-4 py-3 text-sm motion-safe:animate-
|
|
|
59
59
|
{
|
|
60
60
|
appearance: "solid",
|
|
61
61
|
variant: "info",
|
|
62
|
-
className: "bg-info text-
|
|
62
|
+
className: "bg-info text-info-foreground [&>svg]:text-info-foreground"
|
|
63
63
|
},
|
|
64
64
|
{
|
|
65
65
|
appearance: "solid",
|
|
66
66
|
variant: "success",
|
|
67
|
-
className: "bg-success text-
|
|
67
|
+
className: "bg-success text-success-foreground [&>svg]:text-success-foreground"
|
|
68
68
|
},
|
|
69
69
|
{
|
|
70
70
|
appearance: "solid",
|
|
71
71
|
variant: "warning",
|
|
72
|
-
className: "bg-warning text-
|
|
72
|
+
className: "bg-warning text-warning-foreground [&>svg]:text-warning-foreground"
|
|
73
73
|
},
|
|
74
74
|
{
|
|
75
75
|
appearance: "solid",
|
|
76
76
|
variant: "destructive",
|
|
77
|
-
className: "bg-destructive text-
|
|
77
|
+
className: "bg-destructive text-destructive-foreground [&>svg]:text-destructive-foreground"
|
|
78
78
|
},
|
|
79
79
|
{
|
|
80
80
|
appearance: "soft",
|
|
@@ -107,11 +107,11 @@ var S = M("relative flex gap-3 rounded-lg px-4 py-3 text-sm motion-safe:animate-
|
|
|
107
107
|
variant: "default"
|
|
108
108
|
}
|
|
109
109
|
}), X = {
|
|
110
|
-
default: /* @__PURE__ */
|
|
111
|
-
info: /* @__PURE__ */
|
|
112
|
-
success: /* @__PURE__ */
|
|
113
|
-
warning: /* @__PURE__ */
|
|
114
|
-
destructive: /* @__PURE__ */
|
|
110
|
+
default: /* @__PURE__ */ s($, {}),
|
|
111
|
+
info: /* @__PURE__ */ s(H, {}),
|
|
112
|
+
success: /* @__PURE__ */ s(L, {}),
|
|
113
|
+
warning: /* @__PURE__ */ s(x, {}),
|
|
114
|
+
destructive: /* @__PURE__ */ s(x, {})
|
|
115
115
|
}, q = {
|
|
116
116
|
default: "secondary",
|
|
117
117
|
info: "info",
|
|
@@ -130,7 +130,7 @@ var S = M("relative flex gap-3 rounded-lg px-4 py-3 text-sm motion-safe:animate-
|
|
|
130
130
|
success: "text-success",
|
|
131
131
|
warning: "text-warning",
|
|
132
132
|
destructive: "text-destructive"
|
|
133
|
-
},
|
|
133
|
+
}, y = i.forwardRef(({ className: e, appearance: r = "outline", variant: t = "default", title: a, description: l, icon: v, closable: k = !1, onClose: u, action: d, children: A, dismissDuration: m = 200, ...T }, V) => {
|
|
134
134
|
const [f, z] = i.useState(!1), g = i.useRef(null), n = t ?? "default";
|
|
135
135
|
i.useImperativeHandle(V, () => g.current);
|
|
136
136
|
const D = v !== !1 ? v || X[n] : null, j = i.useCallback(() => {
|
|
@@ -154,7 +154,7 @@ var S = M("relative flex gap-3 rounded-lg px-4 py-3 text-sm motion-safe:animate-
|
|
|
154
154
|
appearance: "outline",
|
|
155
155
|
variant: q[n]
|
|
156
156
|
}, P = n === "destructive" || n === "warning" ? "alert" : "status", B = () => r === "solid" ? "text-current/80 hover:text-current hover:bg-current/10" : r === "outline" || n === "default" ? "text-muted-foreground hover:text-foreground hover:bg-muted" : o("hover:bg-current/10", _[n]);
|
|
157
|
-
return /* @__PURE__ */
|
|
157
|
+
return /* @__PURE__ */ w("div", {
|
|
158
158
|
ref: g,
|
|
159
159
|
role: P,
|
|
160
160
|
"data-slot": "alert",
|
|
@@ -170,15 +170,15 @@ var S = M("relative flex gap-3 rounded-lg px-4 py-3 text-sm motion-safe:animate-
|
|
|
170
170
|
...T,
|
|
171
171
|
children: [
|
|
172
172
|
D,
|
|
173
|
-
/* @__PURE__ */
|
|
173
|
+
/* @__PURE__ */ w("div", {
|
|
174
174
|
className: "flex flex-1 flex-col gap-0.5 min-w-0",
|
|
175
175
|
children: [
|
|
176
|
-
|
|
177
|
-
l && /* @__PURE__ */
|
|
176
|
+
a && /* @__PURE__ */ s(C, { children: a }),
|
|
177
|
+
l && /* @__PURE__ */ s(N, { children: l }),
|
|
178
178
|
A
|
|
179
179
|
]
|
|
180
180
|
}),
|
|
181
|
-
d && /* @__PURE__ */
|
|
181
|
+
d && /* @__PURE__ */ s(W, {
|
|
182
182
|
size: "xs",
|
|
183
183
|
shape: "rounded",
|
|
184
184
|
onClick: d.onClick,
|
|
@@ -186,27 +186,27 @@ var S = M("relative flex gap-3 rounded-lg px-4 py-3 text-sm motion-safe:animate-
|
|
|
186
186
|
...d.props,
|
|
187
187
|
children: d.label
|
|
188
188
|
}),
|
|
189
|
-
k && /* @__PURE__ */
|
|
189
|
+
k && /* @__PURE__ */ s("button", {
|
|
190
190
|
type: "button",
|
|
191
191
|
onClick: j,
|
|
192
192
|
className: o("relative shrink-0 size-6 inline-flex items-center justify-center rounded transition-all duration-200 ease-smooth motion-reduce:transition-none", 'after:absolute after:inset-[-10px] after:content-[""]', "focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:outline-none", "active:scale-90 motion-reduce:active:scale-100", B()),
|
|
193
193
|
"aria-label": "Dismiss alert",
|
|
194
|
-
children: /* @__PURE__ */
|
|
194
|
+
children: /* @__PURE__ */ s(I, { className: "size-3.5" })
|
|
195
195
|
})
|
|
196
196
|
]
|
|
197
197
|
});
|
|
198
198
|
});
|
|
199
|
-
|
|
200
|
-
var C = i.forwardRef(({ className: e, children: r, ...t },
|
|
201
|
-
ref:
|
|
199
|
+
y.displayName = "Alert";
|
|
200
|
+
var C = i.forwardRef(({ className: e, children: r, ...t }, a) => /* @__PURE__ */ s("h5", {
|
|
201
|
+
ref: a,
|
|
202
202
|
"data-slot": "alert-title",
|
|
203
203
|
className: o("font-medium leading-5", e),
|
|
204
204
|
...t,
|
|
205
205
|
children: r
|
|
206
206
|
}));
|
|
207
207
|
C.displayName = "AlertTitle";
|
|
208
|
-
var N = i.forwardRef(({ className: e, children: r, ...t },
|
|
209
|
-
ref:
|
|
208
|
+
var N = i.forwardRef(({ className: e, children: r, ...t }, a) => /* @__PURE__ */ s("p", {
|
|
209
|
+
ref: a,
|
|
210
210
|
"data-slot": "alert-description",
|
|
211
211
|
className: o("text-sm leading-5 opacity-80", e),
|
|
212
212
|
...t,
|
|
@@ -224,10 +224,10 @@ function G(e) {
|
|
|
224
224
|
} };
|
|
225
225
|
}
|
|
226
226
|
function J(e) {
|
|
227
|
-
const { _hostElement: r, ...t } = e,
|
|
228
|
-
return p.createElement(
|
|
227
|
+
const { _hostElement: r, ...t } = e, a = p.useMemo(() => r ? G(r) : {}, [r]);
|
|
228
|
+
return p.createElement(y, {
|
|
229
229
|
...t,
|
|
230
|
-
...
|
|
230
|
+
...a
|
|
231
231
|
});
|
|
232
232
|
}
|
|
233
233
|
var c = {
|
|
@@ -278,10 +278,10 @@ var c = {
|
|
|
278
278
|
_render() {
|
|
279
279
|
if (!this._root || !this._childrenContainer) return;
|
|
280
280
|
const e = {};
|
|
281
|
-
for (const [t,
|
|
281
|
+
for (const [t, a] of Object.entries(c)) if (t in this._props) e[t] = this._props[t];
|
|
282
282
|
else {
|
|
283
283
|
const l = t.replace(/([A-Z])/g, "-$1").toLowerCase();
|
|
284
|
-
e[t] = b(this.getAttribute(l),
|
|
284
|
+
e[t] = b(this.getAttribute(l), a);
|
|
285
285
|
}
|
|
286
286
|
const r = p.createElement(J, {
|
|
287
287
|
...e,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hf-alert.js","names":[],"sources":["../../src/components/molecules/feedback/Alert/Alert.tsx","../../src/wc/hf-alert.ts"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport { AlertCircle, AlertTriangle, CheckCircle, Info, X } from 'lucide-react';\nimport * as React from 'react';\nimport { Button, type ButtonProps } from '@/components/atoms/buttons/Button';\nimport { cn } from '@/lib/utils';\n\nconst alertVariants = cva(\n 'relative flex gap-3 rounded-lg px-4 py-3 text-sm motion-safe:animate-in motion-safe:fade-in-0 motion-safe:slide-in-from-top-1 [&>svg]:shrink-0 [&>svg]:size-4 [&>svg]:mt-0.5 [&>svg]:motion-safe:animate-in [&>svg]:motion-safe:fade-in-0 [&>svg]:motion-safe:zoom-in-75 [&>svg]:motion-safe:duration-300 [&>svg]:motion-safe:delay-75',\n {\n variants: {\n appearance: {\n outline: 'bg-card border',\n solid: '',\n soft: '',\n },\n variant: {\n default: '',\n info: '',\n success: '',\n warning: '',\n destructive: '',\n },\n },\n compoundVariants: [\n // ===== OUTLINE =====\n {\n appearance: 'outline',\n variant: 'default',\n className:\n 'border-border text-card-foreground [&>svg]:text-muted-foreground',\n },\n {\n appearance: 'outline',\n variant: 'info',\n className: 'border-info text-info [&>svg]:text-info',\n },\n {\n appearance: 'outline',\n variant: 'success',\n className: 'border-success text-success [&>svg]:text-success',\n },\n {\n appearance: 'outline',\n variant: 'warning',\n className: 'border-warning text-warning [&>svg]:text-warning',\n },\n {\n appearance: 'outline',\n variant: 'destructive',\n className:\n 'border-destructive text-destructive [&>svg]:text-destructive',\n },\n\n // ===== SOLID =====\n {\n appearance: 'solid',\n variant: 'default',\n className:\n 'bg-primary text-primary-foreground [&>svg]:text-primary-foreground',\n },\n {\n appearance: 'solid',\n variant: 'info',\n className:\n 'bg-info text-primary-foreground [&>svg]:text-primary-foreground',\n },\n {\n appearance: 'solid',\n variant: 'success',\n className:\n 'bg-success text-primary-foreground [&>svg]:text-primary-foreground',\n },\n {\n appearance: 'solid',\n variant: 'warning',\n className:\n 'bg-warning text-primary-foreground [&>svg]:text-primary-foreground',\n },\n {\n appearance: 'solid',\n variant: 'destructive',\n className:\n 'bg-destructive text-primary-foreground [&>svg]:text-primary-foreground',\n },\n\n // ===== SOFT =====\n {\n appearance: 'soft',\n variant: 'default',\n className:\n 'bg-primary/10 text-card-foreground [&>svg]:text-primary dark:bg-primary/20',\n },\n {\n appearance: 'soft',\n variant: 'info',\n className: 'bg-info/10 text-info [&>svg]:text-info dark:bg-info/20',\n },\n {\n appearance: 'soft',\n variant: 'success',\n className:\n 'bg-success/10 text-success [&>svg]:text-success dark:bg-success/20',\n },\n {\n appearance: 'soft',\n variant: 'warning',\n className:\n 'bg-warning/10 text-warning [&>svg]:text-warning dark:bg-warning/20',\n },\n {\n appearance: 'soft',\n variant: 'destructive',\n className:\n 'bg-destructive/10 text-destructive [&>svg]:text-destructive dark:bg-destructive/20',\n },\n ],\n defaultVariants: {\n appearance: 'outline',\n variant: 'default',\n },\n },\n);\n\ntype AlertVariant = NonNullable<VariantProps<typeof alertVariants>['variant']>;\ntype AlertAppearance = NonNullable<\n VariantProps<typeof alertVariants>['appearance']\n>;\n\n/** Default icon mapping for each variant */\nconst defaultIcons: Record<AlertVariant, React.ReactNode> = {\n default: <AlertCircle />,\n info: <Info />,\n success: <CheckCircle />,\n warning: <AlertTriangle />,\n destructive: <AlertTriangle />,\n};\n\n/** Maps alert variant to button variant for soft/outline appearances */\nconst alertToButtonVariant = {\n default: 'secondary',\n info: 'info',\n success: 'success',\n warning: 'warning',\n destructive: 'destructive',\n} as const;\n\n/** Maps alert variant to button variant for soft appearance (uses primary for default) */\nconst alertToSolidButtonVariant = {\n default: 'primary',\n info: 'info',\n success: 'success',\n warning: 'warning',\n destructive: 'destructive',\n} as const;\n\n/** Maps alert variant to text color class */\nconst variantTextClass = {\n default: 'text-primary',\n info: 'text-info',\n success: 'text-success',\n warning: 'text-warning',\n destructive: 'text-destructive',\n} as const;\n\nexport interface AlertProps\n extends Omit<React.ComponentProps<'div'>, 'title'>,\n VariantProps<typeof alertVariants> {\n /** Alert title - displayed prominently */\n title?: React.ReactNode;\n /** Alert description - secondary text */\n description?: React.ReactNode;\n /** Custom icon to display. Set to `false` to hide the icon entirely */\n icon?: React.ReactNode | false;\n /** Show close button */\n closable?: boolean;\n /** Callback when close button is clicked */\n onClose?: () => void;\n /** Action button configuration */\n action?: {\n label: string;\n onClick?: () => void;\n props?: Omit<ButtonProps, 'children' | 'onClick'>;\n };\n /** Duration of dismiss animation in ms (0 to disable) */\n dismissDuration?: number;\n}\n\nconst Alert = React.forwardRef<HTMLDivElement, AlertProps>(\n (\n {\n className,\n appearance = 'outline',\n variant = 'default',\n title,\n description,\n icon,\n closable = false,\n onClose,\n action,\n children,\n dismissDuration = 200,\n ...props\n },\n ref,\n ) => {\n const [dismissing, setDismissing] = React.useState(false);\n const internalRef = React.useRef<HTMLDivElement>(null);\n const resolvedVariant = variant ?? 'default';\n\n // Merge refs\n React.useImperativeHandle(ref, () => internalRef.current as HTMLDivElement);\n\n const showIcon = icon !== false;\n const iconElement = showIcon ? icon || defaultIcons[resolvedVariant] : null;\n\n const handleClose = React.useCallback(() => {\n if (dismissDuration <= 0) {\n onClose?.();\n return;\n }\n // Use ref-based window access per ADR-010\n const win = internalRef.current?.ownerDocument.defaultView;\n const prefersReducedMotion =\n win?.matchMedia('(prefers-reduced-motion: reduce)').matches ?? false;\n if (prefersReducedMotion) {\n onClose?.();\n return;\n }\n setDismissing(true);\n }, [dismissDuration, onClose]);\n\n // Determine button styling based on appearance and variant\n const getActionButtonProps = (): Partial<ButtonProps> => {\n if (appearance === 'solid') {\n return {\n appearance: 'outline',\n variant: 'secondary',\n className: cn(\n 'bg-background/90 border-background/20 hover:bg-background',\n variantTextClass[resolvedVariant],\n ),\n };\n }\n if (appearance === 'soft') {\n return {\n appearance: 'solid',\n variant: alertToSolidButtonVariant[resolvedVariant],\n };\n }\n // outline appearance\n return {\n appearance: 'outline',\n variant: alertToButtonVariant[resolvedVariant],\n };\n };\n\n const alertRole =\n resolvedVariant === 'destructive' || resolvedVariant === 'warning'\n ? 'alert'\n : 'status';\n\n const getCloseButtonClass = () => {\n if (appearance === 'solid') {\n return 'text-current/80 hover:text-current hover:bg-current/10';\n }\n if (appearance === 'outline' || resolvedVariant === 'default') {\n return 'text-muted-foreground hover:text-foreground hover:bg-muted';\n }\n // soft appearance with colored variant\n return cn('hover:bg-current/10', variantTextClass[resolvedVariant]);\n };\n\n return (\n <div\n ref={internalRef}\n role={alertRole}\n data-slot=\"alert\"\n data-dismissing={dismissing || undefined}\n className={cn(\n alertVariants({ appearance, variant }),\n dismissing &&\n 'motion-safe:animate-out motion-safe:fade-out-0 motion-safe:slide-out-to-right-2',\n className,\n )}\n style={\n dismissing ? { animationDuration: `${dismissDuration}ms` } : undefined\n }\n onAnimationEnd={(e) => {\n if (dismissing && e.target === e.currentTarget) {\n onClose?.();\n }\n }}\n {...props}\n >\n {iconElement}\n\n <div className=\"flex flex-1 flex-col gap-0.5 min-w-0\">\n {title && <AlertTitle>{title}</AlertTitle>}\n {description && <AlertDescription>{description}</AlertDescription>}\n {children}\n </div>\n\n {action && (\n <Button\n size=\"xs\"\n shape=\"rounded\"\n onClick={action.onClick}\n {...getActionButtonProps()}\n {...action.props}\n >\n {action.label}\n </Button>\n )}\n\n {closable && (\n <button\n type=\"button\"\n onClick={handleClose}\n className={cn(\n 'relative shrink-0 size-6 inline-flex items-center justify-center rounded transition-all duration-200 ease-smooth motion-reduce:transition-none',\n 'after:absolute after:inset-[-10px] after:content-[\"\"]',\n 'focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:outline-none',\n 'active:scale-90 motion-reduce:active:scale-100',\n getCloseButtonClass(),\n )}\n aria-label=\"Dismiss alert\"\n >\n <X className=\"size-3.5\" />\n </button>\n )}\n </div>\n );\n },\n);\n\nAlert.displayName = 'Alert';\n\n/** Alert title component */\nconst AlertTitle = React.forwardRef<\n HTMLHeadingElement,\n React.ComponentProps<'h5'>\n>(({ className, children, ...props }, ref) => (\n <h5\n ref={ref}\n data-slot=\"alert-title\"\n className={cn('font-medium leading-5', className)}\n {...props}\n >\n {children}\n </h5>\n));\n\nAlertTitle.displayName = 'AlertTitle';\n\n/** Alert description component */\nconst AlertDescription = React.forwardRef<\n HTMLParagraphElement,\n React.ComponentProps<'p'>\n>(({ className, children, ...props }, ref) => (\n <p\n ref={ref}\n data-slot=\"alert-description\"\n className={cn('text-sm leading-5 opacity-80', className)}\n {...props}\n >\n {children}\n </p>\n));\n\nAlertDescription.displayName = 'AlertDescription';\n\nexport type { AlertAppearance, AlertVariant };\nexport { Alert, AlertDescription, AlertTitle, alertVariants };\n","/**\n * Web Component wrapper for Alert\n * Custom element: <hf-alert>\n *\n * @generated by scripts/generate-wc-components.ts\n * DO NOT EDIT MANUALLY\n */\n\nimport React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { Alert } from '../components/molecules/feedback/Alert';\nimport { parseAttr, parseValue, type PropDefs } from './_shared';\n\n/**\n * Event wrapper that dispatches custom DOM events\n */\nfunction createEventDispatcher(element: HTMLElement) {\n return {\n onClose: (value: unknown) => {\n const CustomEventConstructor =\n element.ownerDocument.defaultView?.CustomEvent ?? CustomEvent;\n element.dispatchEvent(new CustomEventConstructor('close', {\n detail: value,\n bubbles: true,\n composed: true\n }));\n }\n };\n}\n\n/**\n * Wrapper component that connects React events to DOM custom events\n */\nfunction AlertWrapper(props: React.ComponentProps<typeof Alert> & { _hostElement?: HTMLElement }) {\n const { _hostElement, ...restProps } = props;\n\n const eventHandlers = React.useMemo(() => {\n if (!_hostElement) return {};\n return createEventDispatcher(_hostElement);\n }, [_hostElement]);\n\n return React.createElement(Alert, { ...restProps, ...eventHandlers });\n}\n\n/**\n * Prop type definitions for attribute parsing\n */\nconst propTypes: PropDefs = {\n appearance: 'string',\n variant: 'string',\n title: 'string',\n description: 'string',\n icon: 'json',\n closable: 'boolean',\n action: 'json',\n dismissDuration: 'number'\n};\n\nclass AlertWC extends HTMLElement {\n private _root: ReturnType<typeof createRoot> | null = null;\n private _childrenContainer: HTMLDivElement | null = null;\n private _props: Record<string, unknown> = {};\n private _initialized = false;\n\n connectedCallback() {\n setTimeout(() => this._initialize(), 0);\n }\n\n private _initialize() {\n if (this._initialized) return;\n this._initialized = true;\n\n const originalChildren: Node[] = [];\n for (const child of Array.from(this.childNodes)) {\n if (child.nodeType === Node.TEXT_NODE && !child.textContent?.trim()) {\n continue;\n }\n originalChildren.push(child);\n }\n\n const reactContainer = this.ownerDocument.createElement('div');\n reactContainer.style.display = 'contents';\n\n this._childrenContainer = this.ownerDocument.createElement('div');\n this._childrenContainer.style.display = 'contents';\n\n originalChildren.forEach((child) => this._childrenContainer!.appendChild(child));\n\n while (this.firstChild) this.removeChild(this.firstChild);\n this.appendChild(reactContainer);\n\n this._root = createRoot(reactContainer);\n this._render();\n }\n\n disconnectedCallback() {\n this._root?.unmount();\n this._root = null;\n }\n\n attributeChangedCallback(_name: string, _oldValue: string | null, _newValue: string | null) {\n this._render();\n }\n\n static get observedAttributes() {\n return Object.keys(propTypes).map((prop) =>\n prop.replace(/([A-Z])/g, '-$1').toLowerCase(),\n );\n }\n\n _setProp(name: string, value: unknown) {\n const propType = propTypes[name] || 'string';\n this._props[name] = parseValue(value, propType);\n this._render();\n }\n\n _getProp(name: string): unknown {\n if (name in this._props) {\n return this._props[name];\n }\n const attrName = name.replace(/([A-Z])/g, '-$1').toLowerCase();\n const propType = propTypes[name] || 'string';\n return parseAttr(this.getAttribute(attrName), propType);\n }\n\n private _render() {\n if (!this._root || !this._childrenContainer) return;\n\n const props: Record<string, unknown> = {};\n for (const [propName, propType] of Object.entries(propTypes)) {\n if (propName in this._props) {\n props[propName] = this._props[propName];\n } else {\n const attrName = propName.replace(/([A-Z])/g, '-$1').toLowerCase();\n props[propName] = parseAttr(this.getAttribute(attrName), propType);\n }\n }\n\n const element = React.createElement(\n AlertWrapper,\n { ...props, _hostElement: this },\n React.createElement('span', {\n ref: (el: HTMLSpanElement | null) => {\n if (el && this._childrenContainer) {\n el.replaceWith(this._childrenContainer);\n }\n },\n style: { display: 'contents' },\n }),\n );\n\n this._root.render(element);\n }\n}\n\nfor (const propName of Object.keys(propTypes)) {\n Object.defineProperty(AlertWC.prototype, propName, {\n get() {\n return this._getProp(propName);\n },\n set(value: unknown) {\n this._setProp(propName, value);\n },\n enumerable: true,\n configurable: true,\n });\n}\n\nif (typeof customElements !== 'undefined' && !customElements.get('hf-alert')) {\n customElements.define('hf-alert', AlertWC);\n}\n\nexport { AlertWC };\nexport default AlertWC;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hf-alert.js","names":[],"sources":["../../src/components/molecules/feedback/Alert/Alert.tsx","../../src/wc/hf-alert.ts"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport { AlertCircle, AlertTriangle, CheckCircle, Info, X } from 'lucide-react';\nimport * as React from 'react';\nimport { Button, type ButtonProps } from '@/components/atoms/buttons/Button';\nimport { cn } from '@/lib/utils';\n\nconst alertVariants = cva(\n 'relative flex gap-3 rounded-lg px-4 py-3 text-sm motion-safe:animate-in motion-safe:fade-in-0 motion-safe:slide-in-from-top-1 [&>svg]:shrink-0 [&>svg]:size-4 [&>svg]:mt-0.5 [&>svg]:motion-safe:animate-in [&>svg]:motion-safe:fade-in-0 [&>svg]:motion-safe:zoom-in-75 [&>svg]:motion-safe:duration-300 [&>svg]:motion-safe:delay-75',\n {\n variants: {\n appearance: {\n outline: 'bg-card border',\n solid: '',\n soft: '',\n },\n variant: {\n default: '',\n info: '',\n success: '',\n warning: '',\n destructive: '',\n },\n },\n compoundVariants: [\n // ===== OUTLINE =====\n {\n appearance: 'outline',\n variant: 'default',\n className:\n 'border-border text-card-foreground [&>svg]:text-muted-foreground',\n },\n {\n appearance: 'outline',\n variant: 'info',\n className: 'border-info text-info [&>svg]:text-info',\n },\n {\n appearance: 'outline',\n variant: 'success',\n className: 'border-success text-success [&>svg]:text-success',\n },\n {\n appearance: 'outline',\n variant: 'warning',\n className: 'border-warning text-warning [&>svg]:text-warning',\n },\n {\n appearance: 'outline',\n variant: 'destructive',\n className:\n 'border-destructive text-destructive [&>svg]:text-destructive',\n },\n\n // ===== SOLID =====\n {\n appearance: 'solid',\n variant: 'default',\n className:\n 'bg-primary text-primary-foreground [&>svg]:text-primary-foreground',\n },\n {\n appearance: 'solid',\n variant: 'info',\n className: 'bg-info text-info-foreground [&>svg]:text-info-foreground',\n },\n {\n appearance: 'solid',\n variant: 'success',\n className:\n 'bg-success text-success-foreground [&>svg]:text-success-foreground',\n },\n {\n appearance: 'solid',\n variant: 'warning',\n className:\n 'bg-warning text-warning-foreground [&>svg]:text-warning-foreground',\n },\n {\n appearance: 'solid',\n variant: 'destructive',\n className:\n 'bg-destructive text-destructive-foreground [&>svg]:text-destructive-foreground',\n },\n\n // ===== SOFT =====\n {\n appearance: 'soft',\n variant: 'default',\n className:\n 'bg-primary/10 text-card-foreground [&>svg]:text-primary dark:bg-primary/20',\n },\n {\n appearance: 'soft',\n variant: 'info',\n className: 'bg-info/10 text-info [&>svg]:text-info dark:bg-info/20',\n },\n {\n appearance: 'soft',\n variant: 'success',\n className:\n 'bg-success/10 text-success [&>svg]:text-success dark:bg-success/20',\n },\n {\n appearance: 'soft',\n variant: 'warning',\n className:\n 'bg-warning/10 text-warning [&>svg]:text-warning dark:bg-warning/20',\n },\n {\n appearance: 'soft',\n variant: 'destructive',\n className:\n 'bg-destructive/10 text-destructive [&>svg]:text-destructive dark:bg-destructive/20',\n },\n ],\n defaultVariants: {\n appearance: 'outline',\n variant: 'default',\n },\n },\n);\n\ntype AlertVariant = NonNullable<VariantProps<typeof alertVariants>['variant']>;\ntype AlertAppearance = NonNullable<\n VariantProps<typeof alertVariants>['appearance']\n>;\n\n/** Default icon mapping for each variant */\nconst defaultIcons: Record<AlertVariant, React.ReactNode> = {\n default: <AlertCircle />,\n info: <Info />,\n success: <CheckCircle />,\n warning: <AlertTriangle />,\n destructive: <AlertTriangle />,\n};\n\n/** Maps alert variant to button variant for soft/outline appearances */\nconst alertToButtonVariant = {\n default: 'secondary',\n info: 'info',\n success: 'success',\n warning: 'warning',\n destructive: 'destructive',\n} as const;\n\n/** Maps alert variant to button variant for soft appearance (uses primary for default) */\nconst alertToSolidButtonVariant = {\n default: 'primary',\n info: 'info',\n success: 'success',\n warning: 'warning',\n destructive: 'destructive',\n} as const;\n\n/** Maps alert variant to text color class */\nconst variantTextClass = {\n default: 'text-primary',\n info: 'text-info',\n success: 'text-success',\n warning: 'text-warning',\n destructive: 'text-destructive',\n} as const;\n\nexport interface AlertProps\n extends Omit<React.ComponentProps<'div'>, 'title'>,\n VariantProps<typeof alertVariants> {\n /** Alert title - displayed prominently */\n title?: React.ReactNode;\n /** Alert description - secondary text */\n description?: React.ReactNode;\n /** Custom icon to display. Set to `false` to hide the icon entirely */\n icon?: React.ReactNode | false;\n /** Show close button */\n closable?: boolean;\n /** Callback when close button is clicked */\n onClose?: () => void;\n /** Action button configuration */\n action?: {\n label: string;\n onClick?: () => void;\n props?: Omit<ButtonProps, 'children' | 'onClick'>;\n };\n /** Duration of dismiss animation in ms (0 to disable) */\n dismissDuration?: number;\n}\n\nconst Alert = React.forwardRef<HTMLDivElement, AlertProps>(\n (\n {\n className,\n appearance = 'outline',\n variant = 'default',\n title,\n description,\n icon,\n closable = false,\n onClose,\n action,\n children,\n dismissDuration = 200,\n ...props\n },\n ref,\n ) => {\n const [dismissing, setDismissing] = React.useState(false);\n const internalRef = React.useRef<HTMLDivElement>(null);\n const resolvedVariant = variant ?? 'default';\n\n // Merge refs\n React.useImperativeHandle(ref, () => internalRef.current as HTMLDivElement);\n\n const showIcon = icon !== false;\n const iconElement = showIcon ? icon || defaultIcons[resolvedVariant] : null;\n\n const handleClose = React.useCallback(() => {\n if (dismissDuration <= 0) {\n onClose?.();\n return;\n }\n // Use ref-based window access per ADR-010\n const win = internalRef.current?.ownerDocument.defaultView;\n const prefersReducedMotion =\n win?.matchMedia('(prefers-reduced-motion: reduce)').matches ?? false;\n if (prefersReducedMotion) {\n onClose?.();\n return;\n }\n setDismissing(true);\n }, [dismissDuration, onClose]);\n\n // Determine button styling based on appearance and variant\n const getActionButtonProps = (): Partial<ButtonProps> => {\n if (appearance === 'solid') {\n return {\n appearance: 'outline',\n variant: 'secondary',\n className: cn(\n 'bg-background/90 border-background/20 hover:bg-background',\n variantTextClass[resolvedVariant],\n ),\n };\n }\n if (appearance === 'soft') {\n return {\n appearance: 'solid',\n variant: alertToSolidButtonVariant[resolvedVariant],\n };\n }\n // outline appearance\n return {\n appearance: 'outline',\n variant: alertToButtonVariant[resolvedVariant],\n };\n };\n\n const alertRole =\n resolvedVariant === 'destructive' || resolvedVariant === 'warning'\n ? 'alert'\n : 'status';\n\n const getCloseButtonClass = () => {\n if (appearance === 'solid') {\n return 'text-current/80 hover:text-current hover:bg-current/10';\n }\n if (appearance === 'outline' || resolvedVariant === 'default') {\n return 'text-muted-foreground hover:text-foreground hover:bg-muted';\n }\n // soft appearance with colored variant\n return cn('hover:bg-current/10', variantTextClass[resolvedVariant]);\n };\n\n return (\n <div\n ref={internalRef}\n role={alertRole}\n data-slot=\"alert\"\n data-dismissing={dismissing || undefined}\n className={cn(\n alertVariants({ appearance, variant }),\n dismissing &&\n 'motion-safe:animate-out motion-safe:fade-out-0 motion-safe:slide-out-to-right-2',\n className,\n )}\n style={\n dismissing ? { animationDuration: `${dismissDuration}ms` } : undefined\n }\n onAnimationEnd={(e) => {\n if (dismissing && e.target === e.currentTarget) {\n onClose?.();\n }\n }}\n {...props}\n >\n {iconElement}\n\n <div className=\"flex flex-1 flex-col gap-0.5 min-w-0\">\n {title && <AlertTitle>{title}</AlertTitle>}\n {description && <AlertDescription>{description}</AlertDescription>}\n {children}\n </div>\n\n {action && (\n <Button\n size=\"xs\"\n shape=\"rounded\"\n onClick={action.onClick}\n {...getActionButtonProps()}\n {...action.props}\n >\n {action.label}\n </Button>\n )}\n\n {closable && (\n <button\n type=\"button\"\n onClick={handleClose}\n className={cn(\n 'relative shrink-0 size-6 inline-flex items-center justify-center rounded transition-all duration-200 ease-smooth motion-reduce:transition-none',\n 'after:absolute after:inset-[-10px] after:content-[\"\"]',\n 'focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:outline-none',\n 'active:scale-90 motion-reduce:active:scale-100',\n getCloseButtonClass(),\n )}\n aria-label=\"Dismiss alert\"\n >\n <X className=\"size-3.5\" />\n </button>\n )}\n </div>\n );\n },\n);\n\nAlert.displayName = 'Alert';\n\n/** Alert title component */\nconst AlertTitle = React.forwardRef<\n HTMLHeadingElement,\n React.ComponentProps<'h5'>\n>(({ className, children, ...props }, ref) => (\n <h5\n ref={ref}\n data-slot=\"alert-title\"\n className={cn('font-medium leading-5', className)}\n {...props}\n >\n {children}\n </h5>\n));\n\nAlertTitle.displayName = 'AlertTitle';\n\n/** Alert description component */\nconst AlertDescription = React.forwardRef<\n HTMLParagraphElement,\n React.ComponentProps<'p'>\n>(({ className, children, ...props }, ref) => (\n <p\n ref={ref}\n data-slot=\"alert-description\"\n className={cn('text-sm leading-5 opacity-80', className)}\n {...props}\n >\n {children}\n </p>\n));\n\nAlertDescription.displayName = 'AlertDescription';\n\nexport type { AlertAppearance, AlertVariant };\nexport { Alert, AlertDescription, AlertTitle, alertVariants };\n","/**\n * Web Component wrapper for Alert\n * Custom element: <hf-alert>\n *\n * @generated by scripts/generate-wc-components.ts\n * DO NOT EDIT MANUALLY\n */\n\nimport React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { Alert } from '../components/molecules/feedback/Alert';\nimport { parseAttr, parseValue, type PropDefs } from './_shared';\n\n/**\n * Event wrapper that dispatches custom DOM events\n */\nfunction createEventDispatcher(element: HTMLElement) {\n return {\n onClose: (value: unknown) => {\n const CustomEventConstructor =\n element.ownerDocument.defaultView?.CustomEvent ?? CustomEvent;\n element.dispatchEvent(new CustomEventConstructor('close', {\n detail: value,\n bubbles: true,\n composed: true\n }));\n }\n };\n}\n\n/**\n * Wrapper component that connects React events to DOM custom events\n */\nfunction AlertWrapper(props: React.ComponentProps<typeof Alert> & { _hostElement?: HTMLElement }) {\n const { _hostElement, ...restProps } = props;\n\n const eventHandlers = React.useMemo(() => {\n if (!_hostElement) return {};\n return createEventDispatcher(_hostElement);\n }, [_hostElement]);\n\n return React.createElement(Alert, { ...restProps, ...eventHandlers });\n}\n\n/**\n * Prop type definitions for attribute parsing\n */\nconst propTypes: PropDefs = {\n appearance: 'string',\n variant: 'string',\n title: 'string',\n description: 'string',\n icon: 'json',\n closable: 'boolean',\n action: 'json',\n dismissDuration: 'number'\n};\n\nclass AlertWC extends HTMLElement {\n private _root: ReturnType<typeof createRoot> | null = null;\n private _childrenContainer: HTMLDivElement | null = null;\n private _props: Record<string, unknown> = {};\n private _initialized = false;\n\n connectedCallback() {\n setTimeout(() => this._initialize(), 0);\n }\n\n private _initialize() {\n if (this._initialized) return;\n this._initialized = true;\n\n const originalChildren: Node[] = [];\n for (const child of Array.from(this.childNodes)) {\n if (child.nodeType === Node.TEXT_NODE && !child.textContent?.trim()) {\n continue;\n }\n originalChildren.push(child);\n }\n\n const reactContainer = this.ownerDocument.createElement('div');\n reactContainer.style.display = 'contents';\n\n this._childrenContainer = this.ownerDocument.createElement('div');\n this._childrenContainer.style.display = 'contents';\n\n originalChildren.forEach((child) => this._childrenContainer!.appendChild(child));\n\n while (this.firstChild) this.removeChild(this.firstChild);\n this.appendChild(reactContainer);\n\n this._root = createRoot(reactContainer);\n this._render();\n }\n\n disconnectedCallback() {\n this._root?.unmount();\n this._root = null;\n }\n\n attributeChangedCallback(_name: string, _oldValue: string | null, _newValue: string | null) {\n this._render();\n }\n\n static get observedAttributes() {\n return Object.keys(propTypes).map((prop) =>\n prop.replace(/([A-Z])/g, '-$1').toLowerCase(),\n );\n }\n\n _setProp(name: string, value: unknown) {\n const propType = propTypes[name] || 'string';\n this._props[name] = parseValue(value, propType);\n this._render();\n }\n\n _getProp(name: string): unknown {\n if (name in this._props) {\n return this._props[name];\n }\n const attrName = name.replace(/([A-Z])/g, '-$1').toLowerCase();\n const propType = propTypes[name] || 'string';\n return parseAttr(this.getAttribute(attrName), propType);\n }\n\n private _render() {\n if (!this._root || !this._childrenContainer) return;\n\n const props: Record<string, unknown> = {};\n for (const [propName, propType] of Object.entries(propTypes)) {\n if (propName in this._props) {\n props[propName] = this._props[propName];\n } else {\n const attrName = propName.replace(/([A-Z])/g, '-$1').toLowerCase();\n props[propName] = parseAttr(this.getAttribute(attrName), propType);\n }\n }\n\n const element = React.createElement(\n AlertWrapper,\n { ...props, _hostElement: this },\n React.createElement('span', {\n ref: (el: HTMLSpanElement | null) => {\n if (el && this._childrenContainer) {\n el.replaceWith(this._childrenContainer);\n }\n },\n style: { display: 'contents' },\n }),\n );\n\n this._root.render(element);\n }\n}\n\nfor (const propName of Object.keys(propTypes)) {\n Object.defineProperty(AlertWC.prototype, propName, {\n get() {\n return this._getProp(propName);\n },\n set(value: unknown) {\n this._setProp(propName, value);\n },\n enumerable: true,\n configurable: true,\n });\n}\n\nif (typeof customElements !== 'undefined' && !customElements.get('hf-alert')) {\n customElements.define('hf-alert', AlertWC);\n}\n\nexport { AlertWC };\nexport default AlertWC;\n"],"mappings":"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"}
|