@humain/ui 2.2.6 → 2.2.9
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/index101.js +2 -2
- package/dist/index101.js.map +1 -1
- package/dist/index103.js +3 -3
- package/dist/index103.js.map +1 -1
- package/dist/index108.js +1 -1
- package/dist/index108.js.map +1 -1
- package/dist/index117.js +1 -1
- package/dist/index117.js.map +1 -1
- package/dist/index122.js +6 -6
- package/dist/index122.js.map +1 -1
- package/dist/index126.js +1 -1
- package/dist/index126.js.map +1 -1
- package/dist/index130.js +2 -2
- package/dist/index130.js.map +1 -1
- package/dist/index146.js +4 -4
- package/dist/index146.js.map +1 -1
- package/dist/index152.js +1 -1
- package/dist/index152.js.map +1 -1
- package/dist/index154.js +2 -2
- package/dist/index154.js.map +1 -1
- package/dist/index166.js +1 -1
- package/dist/index166.js.map +1 -1
- package/dist/index168.js +1 -1
- package/dist/index168.js.map +1 -1
- package/dist/index169.js +1 -1
- package/dist/index169.js.map +1 -1
- package/dist/index173.js +2 -2
- package/dist/index173.js.map +1 -1
- package/dist/index175.js +4 -4
- package/dist/index175.js.map +1 -1
- package/dist/index176.js +2 -2
- package/dist/index176.js.map +1 -1
- package/dist/index177.js +2 -2
- package/dist/index177.js.map +1 -1
- package/dist/index184.js +1 -1
- package/dist/index184.js.map +1 -1
- package/dist/index191.js +3 -3
- package/dist/index191.js.map +1 -1
- package/dist/index192.js +2 -2
- package/dist/index192.js.map +1 -1
- package/dist/index201.js +2 -2
- package/dist/index201.js.map +1 -1
- package/dist/index204.js +4 -4
- package/dist/index204.js.map +1 -1
- package/dist/index228.js +1 -1
- package/dist/index228.js.map +1 -1
- package/dist/index229.js +1 -1
- package/dist/index229.js.map +1 -1
- package/dist/index24.js +2 -2
- package/dist/index24.js.map +1 -1
- package/dist/index5.js +1 -1
- package/dist/index5.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/wc/AICodeBlock.js +41 -41
- package/dist/wc/AICodeBlock.js.map +1 -1
- package/dist/wc/AIMermaidDiagram.js +7 -7
- package/dist/wc/AIMermaidDiagram.js.map +1 -1
- package/dist/wc/AIMessage.js +6 -6
- package/dist/wc/AIMessage.js.map +1 -1
- package/dist/wc/AISource.js +2 -2
- package/dist/wc/AISource.js.map +1 -1
- package/dist/wc/AIToolCall.js +1 -1
- package/dist/wc/AIToolCall.js.map +1 -1
- package/dist/wc/Breadcrumb.js +43 -43
- package/dist/wc/Breadcrumb.js.map +1 -1
- package/dist/wc/DropdownMenu.js +9 -9
- package/dist/wc/DropdownMenu.js.map +1 -1
- package/dist/wc/Kbd.js +22 -22
- package/dist/wc/Kbd.js.map +1 -1
- package/dist/wc/button.js +7 -7
- package/dist/wc/button.js.map +1 -1
- package/dist/wc/close-button.js +19 -19
- package/dist/wc/close-button.js.map +1 -1
- package/dist/wc/hf-ai-prompt-suggestion.js +14 -14
- package/dist/wc/hf-ai-prompt-suggestion.js.map +1 -1
- package/dist/wc/hf-ai-reasoning-block.js +13 -13
- package/dist/wc/hf-ai-reasoning-block.js.map +1 -1
- package/dist/wc/hf-ai-steps.js +53 -53
- package/dist/wc/hf-ai-steps.js.map +1 -1
- package/dist/wc/hf-ai-system-message.js +26 -26
- package/dist/wc/hf-ai-system-message.js.map +1 -1
- package/dist/wc/hf-code-snippet.js +35 -35
- package/dist/wc/hf-code-snippet.js.map +1 -1
- package/dist/wc/hf-command-menu.js +39 -39
- package/dist/wc/hf-command-menu.js.map +1 -1
- package/dist/wc/hf-data-table.js +3 -3
- package/dist/wc/hf-data-table.js.map +1 -1
- package/dist/wc/hf-display-value.js +50 -50
- package/dist/wc/hf-display-value.js.map +1 -1
- package/dist/wc/hf-nav-account-menu.js +5 -5
- package/dist/wc/hf-nav-account-menu.js.map +1 -1
- package/dist/wc/hf-rich-textarea.js +1 -1
- package/dist/wc/hf-rich-textarea.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 +1 -1
- package/dist/wc/markdown-renderer.js.map +1 -1
- package/dist/wc/selection-group.js +26 -26
- package/dist/wc/selection-group.js.map +1 -1
- package/dist/wc/syntax-highlight.js +4 -4
- package/dist/wc/syntax-highlight.js.map +1 -1
- package/dist/wc/workflow-step-renderer.js +51 -51
- package/dist/wc/workflow-step-renderer.js.map +1 -1
- package/dist/wc-react/AICodeBlock.js +17 -17
- package/dist/wc-react/AICodeBlock.js.map +1 -1
- package/dist/wc-react/AIMermaidDiagram.js +16 -16
- package/dist/wc-react/AIMermaidDiagram.js.map +1 -1
- package/dist/wc-react/AIMessage.js +7 -7
- package/dist/wc-react/AIMessage.js.map +1 -1
- package/dist/wc-react/AISource.js +41 -41
- package/dist/wc-react/AISource.js.map +1 -1
- package/dist/wc-react/AIToolCall.js +6 -6
- package/dist/wc-react/AIToolCall.js.map +1 -1
- package/dist/wc-react/Breadcrumb.js +18 -18
- package/dist/wc-react/Breadcrumb.js.map +1 -1
- package/dist/wc-react/DropdownMenu.js +27 -27
- package/dist/wc-react/DropdownMenu.js.map +1 -1
- package/dist/wc-react/Kbd.js +17 -17
- package/dist/wc-react/Kbd.js.map +1 -1
- package/dist/wc-react/button.js +12 -12
- package/dist/wc-react/button.js.map +1 -1
- package/dist/wc-react/close-button.js +19 -19
- package/dist/wc-react/close-button.js.map +1 -1
- package/dist/wc-react/hf-ai-prompt-suggestion.js +1 -1
- package/dist/wc-react/hf-ai-prompt-suggestion.js.map +1 -1
- package/dist/wc-react/hf-ai-reasoning-block.js +1 -1
- package/dist/wc-react/hf-ai-reasoning-block.js.map +1 -1
- package/dist/wc-react/hf-ai-steps.js +33 -33
- package/dist/wc-react/hf-ai-steps.js.map +1 -1
- package/dist/wc-react/hf-ai-system-message.js +9 -9
- package/dist/wc-react/hf-ai-system-message.js.map +1 -1
- package/dist/wc-react/hf-code-snippet.js +3 -3
- package/dist/wc-react/hf-code-snippet.js.map +1 -1
- package/dist/wc-react/hf-command-menu.js +56 -56
- package/dist/wc-react/hf-command-menu.js.map +1 -1
- package/dist/wc-react/hf-data-table.js +3 -3
- package/dist/wc-react/hf-data-table.js.map +1 -1
- package/dist/wc-react/hf-display-value.js +58 -58
- package/dist/wc-react/hf-display-value.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-rich-textarea.js +5 -5
- package/dist/wc-react/hf-rich-textarea.js.map +1 -1
- package/dist/wc-react/hf-steps.js +2 -2
- package/dist/wc-react/hf-steps.js.map +1 -1
- package/dist/wc-react/markdown-renderer.js +1 -1
- package/dist/wc-react/markdown-renderer.js.map +1 -1
- package/dist/wc-react/selection-group.js +7 -7
- package/dist/wc-react/selection-group.js.map +1 -1
- package/dist/wc-react/syntax-highlight.js +4 -4
- package/dist/wc-react/syntax-highlight.js.map +1 -1
- package/dist/wc-react/workflow-step-renderer.js +44 -44
- package/dist/wc-react/workflow-step-renderer.js.map +1 -1
- package/package.json +1 -1
- package/skills/humain-ui/SKILL.md +1 -1
- package/skills/humain-ui-wc/SKILL.md +1 -1
- package/skills/humain-ui-wc.skill +0 -0
- package/skills/humain-ui.skill +0 -0
- package/src/tokens.css +4 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hf-nav-account-menu.js","names":[],"sources":["../../../../../../../../../../../Users/akarim/Documents/test/humain_foundation_ui/node_modules/.bun/lucide-react@1.27.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/log-out.mjs","../../src/components/templates/NavAccountMenu/NavAccountMenu.tsx","../../src/wc/hf-nav-account-menu.ts"],"sourcesContent":["/**\n * @license lucide-react v1.27.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"m16 17 5-5-5-5\", key: \"1bji2h\" }],\n [\"path\", { d: \"M21 12H9\", key: \"dn1m92\" }],\n [\"path\", { d: \"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\", key: \"1uf3rs\" }]\n];\nconst LogOut = createLucideIcon(\"log-out\", __iconNode);\n\nexport { __iconNode, LogOut as default };\n//# sourceMappingURL=log-out.mjs.map\n","'use client';\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { ChevronRight, LogOut } from 'lucide-react';\nimport * as React from 'react';\nimport { Switch } from '@/components/atoms/forms/Switch/Switch';\nimport { Kbd } from '@/components/molecules/data/Kbd';\nimport {\n PopoverRoot as PopoverBase,\n PopoverPopup as PopoverContentBase,\n PopoverTrigger as PopoverTriggerBase,\n} from '@/components/organisms/overlays/Popover';\nimport { useControllableState } from '@/hooks/use-controllable-state';\nimport { createSafeContext } from '@/lib/create-safe-context';\nimport { cn } from '@/lib/utils';\n\n// ============================================\n// Context for NavAccountMenu\n// ============================================\n\ninterface NavAccountMenuContextValue {\n type: 'card' | 'simple';\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\nconst [NavAccountMenuContext, useNavAccountMenuContext] =\n createSafeContext<NavAccountMenuContextValue>('NavAccountMenu');\n\n// ============================================\n// NavAccountMenu (Root)\n// ============================================\n\nexport interface NavAccountMenuProps {\n /** Trigger variant style */\n type?: 'card' | 'simple';\n /** Controlled open state */\n open?: boolean;\n /** Callback when open state changes */\n onOpenChange?: (open: boolean) => void;\n /** Initial open state for uncontrolled mode */\n defaultOpen?: boolean;\n /** Children (trigger + content) */\n children: React.ReactNode;\n}\n\nfunction NavAccountMenu({\n type = 'card',\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n children,\n}: NavAccountMenuProps) {\n const [open, handleOpenChange] = useControllableState({\n value: controlledOpen,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n\n const contextValue = React.useMemo(\n () => ({\n type,\n open,\n onOpenChange: handleOpenChange,\n }),\n [type, open, handleOpenChange],\n );\n\n return (\n <NavAccountMenuContext.Provider value={contextValue}>\n <PopoverBase open={open} onOpenChange={handleOpenChange}>\n <div data-slot=\"nav-account-menu\">{children}</div>\n </PopoverBase>\n </NavAccountMenuContext.Provider>\n );\n}\n\n// ============================================\n// NavAccountMenuTrigger\n// ============================================\n\nconst triggerVariants = cva(\n 'flex items-center gap-4 w-full text-left cursor-pointer transition-colors duration-200 ease-smooth outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring motion-reduce:transition-none',\n {\n variants: {\n type: {\n card: 'bg-surface-1 border border-border rounded-xl shadow-xs p-3 hover:bg-surface-2',\n simple: 'border border-border px-2 py-3 hover:bg-surface-2 rounded-lg',\n },\n },\n defaultVariants: {\n type: 'card',\n },\n },\n);\n\nexport interface NavAccountMenuTriggerProps\n extends VariantProps<typeof triggerVariants> {\n /** Avatar element (use Avatar component) */\n avatar?: React.ReactNode;\n /** User display name */\n name: string;\n /** User email address */\n email?: string;\n /** Optional badge after name (e.g., \"External\" tag) */\n badge?: React.ReactNode;\n /** Show logout button instead of chevron (for 'simple' type) */\n showLogoutButton?: boolean;\n /** Logout callback for simple variant */\n onLogout?: () => void;\n /** Show only avatar without name/email - useful for collapsed sidebar */\n compact?: boolean;\n /** Additional className */\n className?: string;\n}\n\nfunction NavAccountMenuTrigger({\n avatar,\n name,\n email,\n badge,\n showLogoutButton,\n onLogout,\n compact = false,\n className,\n}: NavAccountMenuTriggerProps) {\n const { type, open } = useNavAccountMenuContext();\n\n const handleLogoutClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n onLogout?.();\n };\n\n const avatarContent = avatar ? (\n <div className=\"shrink-0\">{avatar}</div>\n ) : null;\n const accountDetails = !compact ? (\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"min-w-0 truncate text-sm font-semibold text-foreground\">\n {name}\n </span>\n {badge && <span className=\"shrink-0\">{badge}</span>}\n </div>\n {email && (\n <span className=\"truncate text-sm text-muted-foreground\">{email}</span>\n )}\n </div>\n ) : null;\n\n if (type === 'simple' && showLogoutButton && !compact) {\n return (\n <div\n data-slot=\"nav-account-menu-trigger\"\n className={cn(triggerVariants({ type }), 'group/trigger', className)}\n >\n <PopoverTriggerBase\n render={\n <button\n type=\"button\"\n aria-haspopup=\"true\"\n className=\"flex min-w-0 flex-1 items-center gap-4 text-left outline-none\"\n />\n }\n >\n {avatarContent}\n {accountDetails}\n </PopoverTriggerBase>\n <button\n type=\"button\"\n onClick={handleLogoutClick}\n className=\"shrink-0 rounded-md p-1.5 text-text-quaternary transition-colors duration-200 ease-smooth hover:bg-muted hover:text-secondary-foreground focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring motion-reduce:transition-none\"\n aria-label=\"Sign out\"\n >\n <LogOut className=\"size-5\" />\n </button>\n </div>\n );\n }\n\n return (\n <PopoverTriggerBase\n render={\n <button\n type=\"button\"\n data-slot=\"nav-account-menu-trigger\"\n aria-haspopup=\"true\"\n aria-label={compact ? `${name} account menu` : undefined}\n className={cn(\n triggerVariants({ type }),\n 'group/trigger',\n compact ? 'w-auto justify-center' : 'max-w-[280px]',\n className,\n )}\n />\n }\n >\n {avatarContent}\n {!compact && (\n <>\n {accountDetails}\n <ChevronRight\n className={cn(\n 'size-4 shrink-0 text-muted-foreground transition-transform duration-200 ease-smooth motion-reduce:transition-none',\n open ? 'rotate-180' : 'rtl:rotate-180',\n )}\n />\n </>\n )}\n </PopoverTriggerBase>\n );\n}\n\n// ============================================\n// NavAccountMenuContent\n// ============================================\n\nexport interface NavAccountMenuContentProps {\n /** Popover side positioning */\n side?: 'top' | 'right' | 'bottom' | 'left';\n /** Popover alignment */\n align?: 'start' | 'center' | 'end';\n /** Side offset */\n sideOffset?: number;\n /** Children */\n children: React.ReactNode;\n /** Additional className */\n className?: string;\n}\n\nfunction NavAccountMenuContent({\n side = 'right',\n align = 'end',\n sideOffset = 8,\n children,\n className,\n}: NavAccountMenuContentProps) {\n return (\n <PopoverContentBase\n side={side}\n align={align}\n sideOffset={sideOffset}\n aria-label=\"Account menu\"\n data-slot=\"nav-account-menu-content\"\n className={cn(\n 'w-[300px] max-w-[calc(100vw-2rem)] p-0 gap-0 bg-popover border border-border rounded-[14px] overflow-hidden',\n 'shadow-[0px_12px_16px_-4px_color-mix(in_srgb,var(--foreground)_8%,transparent),0px_4px_6px_-2px_color-mix(in_srgb,var(--foreground)_3%,transparent),0px_2px_2px_-1px_color-mix(in_srgb,var(--foreground)_4%,transparent)]',\n 'data-open:animate-in data-closed:animate-out',\n 'data-closed:fade-out-0 data-open:fade-in-0',\n 'data-closed:zoom-out-95 data-open:zoom-in-95',\n 'data-[side=bottom]:slide-in-from-top-2',\n 'data-[side=left]:slide-in-from-right-2',\n 'data-[side=right]:slide-in-from-left-2',\n 'data-[side=top]:slide-in-from-bottom-2',\n 'duration-200 motion-reduce:animate-none',\n className,\n )}\n >\n <div className=\"flex flex-col py-2\" role=\"menu\" aria-label=\"Account menu\">\n {children}\n </div>\n </PopoverContentBase>\n );\n}\n\n// ============================================\n// NavAccountMenuHeader\n// ============================================\n\nexport interface NavAccountMenuHeaderProps {\n /** Header title (e.g. \"Profile\") */\n title: string;\n /** Subtitle text or custom React node (e.g. \"Last login 22 May, 2026 11:30pm\") */\n subtitle?: React.ReactNode;\n /** Additional className */\n className?: string;\n}\n\nfunction NavAccountMenuHeader({\n title,\n subtitle,\n className,\n}: NavAccountMenuHeaderProps) {\n return (\n <div\n data-slot=\"nav-account-menu-header\"\n className={cn('px-6 pb-3 delight-fade-in', className)}\n >\n <p className=\"text-base font-semibold text-foreground\">{title}</p>\n {subtitle &&\n (typeof subtitle === 'string' ? (\n <p className=\"mt-2 text-sm text-muted-foreground\">{subtitle}</p>\n ) : (\n <div className=\"mt-2\">{subtitle}</div>\n ))}\n </div>\n );\n}\n\n// ============================================\n// NavAccountMenuSection\n// ============================================\n\nexport interface NavAccountMenuSectionProps {\n /** Optional section header label */\n label?: string;\n /** Show top border separator between sections */\n bordered?: boolean;\n /** Section content */\n children: React.ReactNode;\n /** Additional className */\n className?: string;\n}\n\nfunction NavAccountMenuSection({\n label,\n bordered = false,\n children,\n className,\n}: NavAccountMenuSectionProps) {\n return (\n <section\n data-slot=\"nav-account-menu-section\"\n aria-label={label}\n className={cn(\n 'flex flex-col gap-1 py-1.5',\n bordered && 'border-t border-border',\n className,\n )}\n >\n {label && (\n <div className=\"px-3 pt-1.5 pb-1\">\n <span className=\"text-xs font-semibold text-muted-foreground\">\n {label}\n </span>\n </div>\n )}\n {children}\n </section>\n );\n}\n\n// ============================================\n// NavAccountMenuItem\n// ============================================\n\n/**\n * Props passed to the render function for custom menu item rendering.\n */\nexport interface NavAccountMenuItemRenderProps {\n /** Combined className for styling */\n className: string;\n /** Click handler that closes menu and triggers onSelect */\n onClick: () => void;\n /** Menu item content (icon, label, shortcut) */\n children: React.ReactNode;\n}\n\n/**\n * Render prop type for polymorphic rendering.\n * Accepts a function that receives props and returns an element.\n */\ntype NavAccountMenuItemRenderFn = (\n props: NavAccountMenuItemRenderProps,\n) => React.ReactElement;\n\nexport interface NavAccountMenuItemProps {\n /** Left icon (20px) */\n icon?: React.ReactNode;\n /** Keyboard shortcut display */\n shortcut?: string;\n /** Destructive styling (red) */\n destructive?: boolean;\n /** Disabled state */\n disabled?: boolean;\n /** Selection callback */\n onSelect?: () => void;\n /**\n * Render prop for polymorphic rendering.\n * Use this to render the menu item as a different element (e.g., link).\n * @example\n * <NavAccountMenuItem\n * icon={<User01 />}\n * render={(props) => <a {...props} href=\"/profile\" />}\n * >\n * View profile\n * </NavAccountMenuItem>\n */\n render?: NavAccountMenuItemRenderFn;\n /** Label text */\n children: React.ReactNode;\n /** Additional className */\n className?: string;\n}\n\nfunction NavAccountMenuItem({\n icon,\n shortcut,\n destructive = false,\n disabled = false,\n onSelect,\n render,\n children,\n className,\n}: NavAccountMenuItemProps) {\n const { onOpenChange } = useNavAccountMenuContext();\n\n const handleClick = () => {\n if (disabled) return;\n onSelect?.();\n onOpenChange(false);\n };\n\n const content = (\n <div className=\"flex flex-1 gap-2 items-center overflow-hidden p-2 rounded-md transition-[background-color] duration-200 ease-smooth delight-selection-press motion-reduce:transition-none\">\n <div className=\"flex flex-1 gap-2 items-center min-w-0\">\n {icon && (\n <span\n className={cn(\n 'shrink-0 [&>svg]:size-4 transition-transform duration-200 ease-smooth group-hover/menuitem:translate-x-0.5 motion-reduce:transition-none',\n destructive ? 'text-destructive' : 'text-foreground',\n )}\n >\n {icon}\n </span>\n )}\n <span\n className={cn(\n 'flex-1 text-sm truncate',\n destructive ? 'text-destructive' : 'text-secondary-foreground',\n )}\n >\n {children}\n </span>\n </div>\n {shortcut && (\n <Kbd variant=\"outline\" size=\"xs\" className=\"shrink-0\">\n {shortcut}\n </Kbd>\n )}\n </div>\n );\n\n const baseClassName = cn(\n 'group/menuitem flex items-center px-1.5 py-0 w-full text-left cursor-pointer outline-none',\n 'hover:[&>div]:bg-muted focus-visible:[&>div]:bg-muted',\n 'focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-ring',\n disabled && 'pointer-events-none opacity-50',\n className,\n );\n\n if (render) {\n return render({\n className: baseClassName,\n onClick: handleClick,\n children: content,\n });\n }\n\n return (\n <button\n type=\"button\"\n role=\"menuitem\"\n data-slot=\"nav-account-menu-item\"\n className={baseClassName}\n onClick={handleClick}\n disabled={disabled}\n aria-disabled={disabled || undefined}\n >\n {content}\n </button>\n );\n}\n\n// ============================================\n// NavAccountMenuAccount\n// ============================================\n\nexport interface NavAccountMenuAccountProps {\n /** Avatar element */\n avatar?: React.ReactNode;\n /** Account display name */\n name: string;\n /** Account email */\n email: string;\n /** Whether this account is currently selected */\n selected?: boolean;\n /** Selection callback */\n onSelect?: () => void;\n /** Additional className */\n className?: string;\n}\n\nfunction NavAccountMenuAccount({\n avatar,\n name,\n email,\n selected = false,\n onSelect,\n className,\n}: NavAccountMenuAccountProps) {\n return (\n <div\n data-slot=\"nav-account-menu-account\"\n className={cn('flex items-center px-1.5 py-0 w-full', className)}\n >\n <button\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={selected}\n aria-label={`Switch to ${name} (${email})`}\n className={cn(\n 'relative flex flex-1 gap-2 items-center overflow-hidden px-2 py-1.5 rounded-md cursor-pointer outline-none',\n 'hover:bg-muted focus-visible:bg-muted',\n 'transition-colors duration-200 ease-smooth motion-reduce:transition-none',\n 'focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-ring',\n 'text-left',\n selected && 'bg-surface-2',\n )}\n onClick={onSelect}\n >\n {avatar && <div className=\"shrink-0\">{avatar}</div>}\n <div className=\"flex flex-col min-w-0 flex-1\">\n <span className=\"text-sm font-semibold text-foreground truncate\">\n {name}\n </span>\n <span className=\"text-sm text-muted-foreground truncate\">\n {email}\n </span>\n </div>\n {/* Radio indicator */}\n <div\n aria-hidden=\"true\"\n className={cn(\n 'size-4 rounded-full border-2 shrink-0 flex items-center justify-center transition-colors duration-200 ease-smooth motion-reduce:transition-none',\n selected\n ? 'bg-primary border-primary'\n : 'border-border bg-transparent',\n )}\n >\n {selected && (\n <div className=\"size-1.5 rounded-full bg-background delight-check-bounce\" />\n )}\n </div>\n </button>\n </div>\n );\n}\n\n// ============================================\n// NavAccountMenuSeparator\n// ============================================\n\nexport interface NavAccountMenuSeparatorProps {\n /** Additional className */\n className?: string;\n}\n\nfunction NavAccountMenuSeparator({ className }: NavAccountMenuSeparatorProps) {\n return (\n <hr\n data-slot=\"nav-account-menu-separator\"\n className={cn('h-px border-0 bg-border mx-5', className)}\n />\n );\n}\n\n// ============================================\n// NavAccountMenuFooter\n// ============================================\n\nexport interface NavAccountMenuFooterProps {\n /** Footer content (typically buttons) */\n children: React.ReactNode;\n /** Additional className */\n className?: string;\n}\n\nfunction NavAccountMenuFooter({\n children,\n className,\n}: NavAccountMenuFooterProps) {\n return (\n <div\n data-slot=\"nav-account-menu-footer\"\n className={cn('flex items-center justify-center px-5 pt-4', className)}\n >\n {children}\n </div>\n );\n}\n\n// ============================================\n// NavAccountMenuThemeSwitch (uses Switch theme variant)\n// ============================================\n\nexport interface NavAccountMenuThemeSwitchProps {\n /** Switch theme variant to render */\n variant?:\n | 'theme-gradient'\n | 'theme-switch'\n | 'theme-pill'\n | 'theme-segmented';\n /** Switch size */\n size?: 'sm' | 'md' | 'lg';\n /** Controlled checked state (dark = checked) */\n checked?: boolean;\n /** Callback when checked state changes */\n onCheckedChange?: (checked: boolean) => void;\n /** Optional label displayed next to the switch (e.g. \"Light Mode\") */\n label?: string;\n /** Additional className */\n className?: string;\n}\n\nfunction NavAccountMenuThemeSwitch({\n variant = 'theme-gradient',\n size = 'sm',\n checked,\n onCheckedChange,\n label,\n className,\n}: NavAccountMenuThemeSwitchProps) {\n const switchId = React.useId();\n const labelId = label ? `${switchId}-label` : undefined;\n\n return (\n <div\n data-slot=\"nav-account-menu-theme-switch\"\n className={cn('flex items-center px-1.5 py-0', className)}\n >\n <div className=\"flex items-center gap-2.5 p-2\">\n <Switch\n id={switchId}\n variant={variant}\n size={size}\n checked={checked}\n onCheckedChange={onCheckedChange}\n aria-labelledby={labelId}\n aria-label={label ? undefined : 'Theme selector'}\n />\n {label && (\n <label\n htmlFor={switchId}\n id={labelId}\n className=\"cursor-pointer text-sm text-secondary-foreground\"\n >\n {label}\n </label>\n )}\n </div>\n </div>\n );\n}\n\n// ============================================\n// Display Names\n// ============================================\n\nNavAccountMenu.displayName = 'NavAccountMenu';\nNavAccountMenuTrigger.displayName = 'NavAccountMenuTrigger';\nNavAccountMenuContent.displayName = 'NavAccountMenuContent';\nNavAccountMenuHeader.displayName = 'NavAccountMenuHeader';\nNavAccountMenuSection.displayName = 'NavAccountMenuSection';\nNavAccountMenuItem.displayName = 'NavAccountMenuItem';\nNavAccountMenuAccount.displayName = 'NavAccountMenuAccount';\nNavAccountMenuSeparator.displayName = 'NavAccountMenuSeparator';\nNavAccountMenuFooter.displayName = 'NavAccountMenuFooter';\nNavAccountMenuThemeSwitch.displayName = 'NavAccountMenuThemeSwitch';\n\n// ============================================\n// Exports\n// ============================================\n\nexport {\n NavAccountMenu,\n NavAccountMenuAccount,\n NavAccountMenuContent,\n NavAccountMenuFooter,\n NavAccountMenuHeader,\n NavAccountMenuItem,\n NavAccountMenuSection,\n NavAccountMenuSeparator,\n NavAccountMenuThemeSwitch,\n NavAccountMenuTrigger,\n triggerVariants as navAccountMenuTriggerVariants,\n};\n","/**\n * Web Component wrapper for NavAccountMenu\n * Custom element: <hf-nav-account-menu>\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 { NavAccountMenu } from '../components/templates/NavAccountMenu';\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 onOpenChange: (open: boolean) => {\n const CustomEventConstructor =\n element.ownerDocument.defaultView?.CustomEvent ?? CustomEvent;\n element.dispatchEvent(new CustomEventConstructor('open-change', {\n detail: open,\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 NavAccountMenuWrapper(props: React.ComponentProps<typeof NavAccountMenu> & { _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(NavAccountMenu, { ...restProps, ...eventHandlers });\n}\n\n/**\n * Prop type definitions for attribute parsing\n */\nconst propTypes: PropDefs = {\n type: 'string',\n open: 'boolean',\n defaultOpen: 'boolean'\n};\n\nclass NavAccountMenuWC 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 NavAccountMenuWrapper,\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(NavAccountMenuWC.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-nav-account-menu')) {\n customElements.define('hf-nav-account-menu', NavAccountMenuWC);\n}\n\nexport { NavAccountMenuWC };\nexport default NavAccountMenuWC;\n"],"x_google_ignoreList":[0],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hf-nav-account-menu.js","names":[],"sources":["../../../../../../../../../../../Users/akarim/Documents/test/humain_foundation_ui/node_modules/.bun/lucide-react@1.27.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/log-out.mjs","../../src/components/templates/NavAccountMenu/NavAccountMenu.tsx","../../src/wc/hf-nav-account-menu.ts"],"sourcesContent":["/**\n * @license lucide-react v1.27.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"m16 17 5-5-5-5\", key: \"1bji2h\" }],\n [\"path\", { d: \"M21 12H9\", key: \"dn1m92\" }],\n [\"path\", { d: \"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\", key: \"1uf3rs\" }]\n];\nconst LogOut = createLucideIcon(\"log-out\", __iconNode);\n\nexport { __iconNode, LogOut as default };\n//# sourceMappingURL=log-out.mjs.map\n","'use client';\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { ChevronRight, LogOut } from 'lucide-react';\nimport * as React from 'react';\nimport { Switch } from '@/components/atoms/forms/Switch/Switch';\nimport { Kbd } from '@/components/molecules/data/Kbd';\nimport {\n PopoverRoot as PopoverBase,\n PopoverPopup as PopoverContentBase,\n PopoverTrigger as PopoverTriggerBase,\n} from '@/components/organisms/overlays/Popover';\nimport { useControllableState } from '@/hooks/use-controllable-state';\nimport { createSafeContext } from '@/lib/create-safe-context';\nimport { cn } from '@/lib/utils';\n\n// ============================================\n// Context for NavAccountMenu\n// ============================================\n\ninterface NavAccountMenuContextValue {\n type: 'card' | 'simple';\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\nconst [NavAccountMenuContext, useNavAccountMenuContext] =\n createSafeContext<NavAccountMenuContextValue>('NavAccountMenu');\n\n// ============================================\n// NavAccountMenu (Root)\n// ============================================\n\nexport interface NavAccountMenuProps {\n /** Trigger variant style */\n type?: 'card' | 'simple';\n /** Controlled open state */\n open?: boolean;\n /** Callback when open state changes */\n onOpenChange?: (open: boolean) => void;\n /** Initial open state for uncontrolled mode */\n defaultOpen?: boolean;\n /** Children (trigger + content) */\n children: React.ReactNode;\n}\n\nfunction NavAccountMenu({\n type = 'card',\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n children,\n}: NavAccountMenuProps) {\n const [open, handleOpenChange] = useControllableState({\n value: controlledOpen,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n\n const contextValue = React.useMemo(\n () => ({\n type,\n open,\n onOpenChange: handleOpenChange,\n }),\n [type, open, handleOpenChange],\n );\n\n return (\n <NavAccountMenuContext.Provider value={contextValue}>\n <PopoverBase open={open} onOpenChange={handleOpenChange}>\n <div data-slot=\"nav-account-menu\">{children}</div>\n </PopoverBase>\n </NavAccountMenuContext.Provider>\n );\n}\n\n// ============================================\n// NavAccountMenuTrigger\n// ============================================\n\nconst triggerVariants = cva(\n 'flex items-center gap-4 w-full text-left cursor-pointer transition-colors duration-200 ease-smooth outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring motion-reduce:transition-none',\n {\n variants: {\n type: {\n card: 'bg-surface-1 border border-border rounded-xl shadow-xs p-3 hover:bg-surface-2',\n simple: 'border border-border px-2 py-3 hover:bg-surface-2 rounded-lg',\n },\n },\n defaultVariants: {\n type: 'card',\n },\n },\n);\n\nexport interface NavAccountMenuTriggerProps\n extends VariantProps<typeof triggerVariants> {\n /** Avatar element (use Avatar component) */\n avatar?: React.ReactNode;\n /** User display name */\n name: string;\n /** User email address */\n email?: string;\n /** Optional badge after name (e.g., \"External\" tag) */\n badge?: React.ReactNode;\n /** Show logout button instead of chevron (for 'simple' type) */\n showLogoutButton?: boolean;\n /** Logout callback for simple variant */\n onLogout?: () => void;\n /** Show only avatar without name/email - useful for collapsed sidebar */\n compact?: boolean;\n /** Additional className */\n className?: string;\n}\n\nfunction NavAccountMenuTrigger({\n avatar,\n name,\n email,\n badge,\n showLogoutButton,\n onLogout,\n compact = false,\n className,\n}: NavAccountMenuTriggerProps) {\n const { type, open } = useNavAccountMenuContext();\n\n const handleLogoutClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n onLogout?.();\n };\n\n const avatarContent = avatar ? (\n <div className=\"shrink-0\">{avatar}</div>\n ) : null;\n const accountDetails = !compact ? (\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"min-w-0 truncate text-sm font-semibold text-foreground\">\n {name}\n </span>\n {badge && <span className=\"shrink-0\">{badge}</span>}\n </div>\n {email && (\n <span className=\"truncate text-sm text-muted-foreground\">{email}</span>\n )}\n </div>\n ) : null;\n\n if (type === 'simple' && showLogoutButton && !compact) {\n return (\n <div\n data-slot=\"nav-account-menu-trigger\"\n className={cn(triggerVariants({ type }), 'group/trigger', className)}\n >\n <PopoverTriggerBase\n render={\n <button\n type=\"button\"\n aria-haspopup=\"true\"\n className=\"flex min-w-0 flex-1 items-center gap-4 text-left outline-none\"\n />\n }\n >\n {avatarContent}\n {accountDetails}\n </PopoverTriggerBase>\n <button\n type=\"button\"\n onClick={handleLogoutClick}\n className=\"shrink-0 rounded-md p-1.5 text-muted-foreground transition-colors duration-200 ease-smooth hover:bg-muted hover:text-secondary-foreground focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring motion-reduce:transition-none\"\n aria-label=\"Sign out\"\n >\n <LogOut className=\"size-5\" />\n </button>\n </div>\n );\n }\n\n return (\n <PopoverTriggerBase\n render={\n <button\n type=\"button\"\n data-slot=\"nav-account-menu-trigger\"\n aria-haspopup=\"true\"\n aria-label={compact ? `${name} account menu` : undefined}\n className={cn(\n triggerVariants({ type }),\n 'group/trigger',\n compact ? 'w-auto justify-center' : 'max-w-[280px]',\n className,\n )}\n />\n }\n >\n {avatarContent}\n {!compact && (\n <>\n {accountDetails}\n <ChevronRight\n className={cn(\n 'size-4 shrink-0 text-muted-foreground transition-transform duration-200 ease-smooth motion-reduce:transition-none',\n open ? 'rotate-180' : 'rtl:rotate-180',\n )}\n />\n </>\n )}\n </PopoverTriggerBase>\n );\n}\n\n// ============================================\n// NavAccountMenuContent\n// ============================================\n\nexport interface NavAccountMenuContentProps {\n /** Popover side positioning */\n side?: 'top' | 'right' | 'bottom' | 'left';\n /** Popover alignment */\n align?: 'start' | 'center' | 'end';\n /** Side offset */\n sideOffset?: number;\n /** Children */\n children: React.ReactNode;\n /** Additional className */\n className?: string;\n}\n\nfunction NavAccountMenuContent({\n side = 'right',\n align = 'end',\n sideOffset = 8,\n children,\n className,\n}: NavAccountMenuContentProps) {\n return (\n <PopoverContentBase\n side={side}\n align={align}\n sideOffset={sideOffset}\n aria-label=\"Account menu\"\n data-slot=\"nav-account-menu-content\"\n className={cn(\n 'w-[300px] max-w-[calc(100vw-2rem)] p-0 gap-0 bg-popover border border-border rounded-[14px] overflow-hidden',\n 'shadow-[0px_12px_16px_-4px_color-mix(in_srgb,var(--foreground)_8%,transparent),0px_4px_6px_-2px_color-mix(in_srgb,var(--foreground)_3%,transparent),0px_2px_2px_-1px_color-mix(in_srgb,var(--foreground)_4%,transparent)]',\n 'data-open:animate-in data-closed:animate-out',\n 'data-closed:fade-out-0 data-open:fade-in-0',\n 'data-closed:zoom-out-95 data-open:zoom-in-95',\n 'data-[side=bottom]:slide-in-from-top-2',\n 'data-[side=left]:slide-in-from-right-2',\n 'data-[side=right]:slide-in-from-left-2',\n 'data-[side=top]:slide-in-from-bottom-2',\n 'duration-200 motion-reduce:animate-none',\n className,\n )}\n >\n <div className=\"flex flex-col py-2\" role=\"menu\" aria-label=\"Account menu\">\n {children}\n </div>\n </PopoverContentBase>\n );\n}\n\n// ============================================\n// NavAccountMenuHeader\n// ============================================\n\nexport interface NavAccountMenuHeaderProps {\n /** Header title (e.g. \"Profile\") */\n title: string;\n /** Subtitle text or custom React node (e.g. \"Last login 22 May, 2026 11:30pm\") */\n subtitle?: React.ReactNode;\n /** Additional className */\n className?: string;\n}\n\nfunction NavAccountMenuHeader({\n title,\n subtitle,\n className,\n}: NavAccountMenuHeaderProps) {\n return (\n <div\n data-slot=\"nav-account-menu-header\"\n className={cn('px-6 pb-3 delight-fade-in', className)}\n >\n <p className=\"text-base font-semibold text-foreground\">{title}</p>\n {subtitle &&\n (typeof subtitle === 'string' ? (\n <p className=\"mt-2 text-sm text-muted-foreground\">{subtitle}</p>\n ) : (\n <div className=\"mt-2\">{subtitle}</div>\n ))}\n </div>\n );\n}\n\n// ============================================\n// NavAccountMenuSection\n// ============================================\n\nexport interface NavAccountMenuSectionProps {\n /** Optional section header label */\n label?: string;\n /** Show top border separator between sections */\n bordered?: boolean;\n /** Section content */\n children: React.ReactNode;\n /** Additional className */\n className?: string;\n}\n\nfunction NavAccountMenuSection({\n label,\n bordered = false,\n children,\n className,\n}: NavAccountMenuSectionProps) {\n return (\n <section\n data-slot=\"nav-account-menu-section\"\n aria-label={label}\n className={cn(\n 'flex flex-col gap-1 py-1.5',\n bordered && 'border-t border-border',\n className,\n )}\n >\n {label && (\n <div className=\"px-3 pt-1.5 pb-1\">\n <span className=\"text-xs font-semibold text-muted-foreground\">\n {label}\n </span>\n </div>\n )}\n {children}\n </section>\n );\n}\n\n// ============================================\n// NavAccountMenuItem\n// ============================================\n\n/**\n * Props passed to the render function for custom menu item rendering.\n */\nexport interface NavAccountMenuItemRenderProps {\n /** Combined className for styling */\n className: string;\n /** Click handler that closes menu and triggers onSelect */\n onClick: () => void;\n /** Menu item content (icon, label, shortcut) */\n children: React.ReactNode;\n}\n\n/**\n * Render prop type for polymorphic rendering.\n * Accepts a function that receives props and returns an element.\n */\ntype NavAccountMenuItemRenderFn = (\n props: NavAccountMenuItemRenderProps,\n) => React.ReactElement;\n\nexport interface NavAccountMenuItemProps {\n /** Left icon (20px) */\n icon?: React.ReactNode;\n /** Keyboard shortcut display */\n shortcut?: string;\n /** Destructive styling (red) */\n destructive?: boolean;\n /** Disabled state */\n disabled?: boolean;\n /** Selection callback */\n onSelect?: () => void;\n /**\n * Render prop for polymorphic rendering.\n * Use this to render the menu item as a different element (e.g., link).\n * @example\n * <NavAccountMenuItem\n * icon={<User01 />}\n * render={(props) => <a {...props} href=\"/profile\" />}\n * >\n * View profile\n * </NavAccountMenuItem>\n */\n render?: NavAccountMenuItemRenderFn;\n /** Label text */\n children: React.ReactNode;\n /** Additional className */\n className?: string;\n}\n\nfunction NavAccountMenuItem({\n icon,\n shortcut,\n destructive = false,\n disabled = false,\n onSelect,\n render,\n children,\n className,\n}: NavAccountMenuItemProps) {\n const { onOpenChange } = useNavAccountMenuContext();\n\n const handleClick = () => {\n if (disabled) return;\n onSelect?.();\n onOpenChange(false);\n };\n\n const content = (\n <div className=\"flex flex-1 gap-2 items-center overflow-hidden p-2 rounded-md transition-[background-color] duration-200 ease-smooth delight-selection-press motion-reduce:transition-none\">\n <div className=\"flex flex-1 gap-2 items-center min-w-0\">\n {icon && (\n <span\n className={cn(\n 'shrink-0 [&>svg]:size-4 transition-transform duration-200 ease-smooth group-hover/menuitem:translate-x-0.5 motion-reduce:transition-none',\n destructive ? 'text-destructive' : 'text-foreground',\n )}\n >\n {icon}\n </span>\n )}\n <span\n className={cn(\n 'flex-1 text-sm truncate',\n destructive ? 'text-destructive' : 'text-secondary-foreground',\n )}\n >\n {children}\n </span>\n </div>\n {shortcut && (\n <Kbd variant=\"outline\" size=\"xs\" className=\"shrink-0\">\n {shortcut}\n </Kbd>\n )}\n </div>\n );\n\n const baseClassName = cn(\n 'group/menuitem flex items-center px-1.5 py-0 w-full text-left cursor-pointer outline-none',\n 'hover:[&>div]:bg-muted focus-visible:[&>div]:bg-muted',\n 'focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-ring',\n disabled && 'pointer-events-none opacity-50',\n className,\n );\n\n if (render) {\n return render({\n className: baseClassName,\n onClick: handleClick,\n children: content,\n });\n }\n\n return (\n <button\n type=\"button\"\n role=\"menuitem\"\n data-slot=\"nav-account-menu-item\"\n className={baseClassName}\n onClick={handleClick}\n disabled={disabled}\n aria-disabled={disabled || undefined}\n >\n {content}\n </button>\n );\n}\n\n// ============================================\n// NavAccountMenuAccount\n// ============================================\n\nexport interface NavAccountMenuAccountProps {\n /** Avatar element */\n avatar?: React.ReactNode;\n /** Account display name */\n name: string;\n /** Account email */\n email: string;\n /** Whether this account is currently selected */\n selected?: boolean;\n /** Selection callback */\n onSelect?: () => void;\n /** Additional className */\n className?: string;\n}\n\nfunction NavAccountMenuAccount({\n avatar,\n name,\n email,\n selected = false,\n onSelect,\n className,\n}: NavAccountMenuAccountProps) {\n return (\n <div\n data-slot=\"nav-account-menu-account\"\n className={cn('flex items-center px-1.5 py-0 w-full', className)}\n >\n <button\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={selected}\n aria-label={`Switch to ${name} (${email})`}\n className={cn(\n 'relative flex flex-1 gap-2 items-center overflow-hidden px-2 py-1.5 rounded-md cursor-pointer outline-none',\n 'hover:bg-muted focus-visible:bg-muted',\n 'transition-colors duration-200 ease-smooth motion-reduce:transition-none',\n 'focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-ring',\n 'text-left',\n selected && 'bg-surface-2',\n )}\n onClick={onSelect}\n >\n {avatar && <div className=\"shrink-0\">{avatar}</div>}\n <div className=\"flex flex-col min-w-0 flex-1\">\n <span className=\"text-sm font-semibold text-foreground truncate\">\n {name}\n </span>\n <span className=\"text-sm text-muted-foreground truncate\">\n {email}\n </span>\n </div>\n {/* Radio indicator */}\n <div\n aria-hidden=\"true\"\n className={cn(\n 'size-4 rounded-full border-2 shrink-0 flex items-center justify-center transition-colors duration-200 ease-smooth motion-reduce:transition-none',\n selected\n ? 'bg-primary border-primary'\n : 'border-border bg-transparent',\n )}\n >\n {selected && (\n <div className=\"size-1.5 rounded-full bg-background delight-check-bounce\" />\n )}\n </div>\n </button>\n </div>\n );\n}\n\n// ============================================\n// NavAccountMenuSeparator\n// ============================================\n\nexport interface NavAccountMenuSeparatorProps {\n /** Additional className */\n className?: string;\n}\n\nfunction NavAccountMenuSeparator({ className }: NavAccountMenuSeparatorProps) {\n return (\n <hr\n data-slot=\"nav-account-menu-separator\"\n className={cn('h-px border-0 bg-border mx-5', className)}\n />\n );\n}\n\n// ============================================\n// NavAccountMenuFooter\n// ============================================\n\nexport interface NavAccountMenuFooterProps {\n /** Footer content (typically buttons) */\n children: React.ReactNode;\n /** Additional className */\n className?: string;\n}\n\nfunction NavAccountMenuFooter({\n children,\n className,\n}: NavAccountMenuFooterProps) {\n return (\n <div\n data-slot=\"nav-account-menu-footer\"\n className={cn('flex items-center justify-center px-5 pt-4', className)}\n >\n {children}\n </div>\n );\n}\n\n// ============================================\n// NavAccountMenuThemeSwitch (uses Switch theme variant)\n// ============================================\n\nexport interface NavAccountMenuThemeSwitchProps {\n /** Switch theme variant to render */\n variant?:\n | 'theme-gradient'\n | 'theme-switch'\n | 'theme-pill'\n | 'theme-segmented';\n /** Switch size */\n size?: 'sm' | 'md' | 'lg';\n /** Controlled checked state (dark = checked) */\n checked?: boolean;\n /** Callback when checked state changes */\n onCheckedChange?: (checked: boolean) => void;\n /** Optional label displayed next to the switch (e.g. \"Light Mode\") */\n label?: string;\n /** Additional className */\n className?: string;\n}\n\nfunction NavAccountMenuThemeSwitch({\n variant = 'theme-gradient',\n size = 'sm',\n checked,\n onCheckedChange,\n label,\n className,\n}: NavAccountMenuThemeSwitchProps) {\n const switchId = React.useId();\n const labelId = label ? `${switchId}-label` : undefined;\n\n return (\n <div\n data-slot=\"nav-account-menu-theme-switch\"\n className={cn('flex items-center px-1.5 py-0', className)}\n >\n <div className=\"flex items-center gap-2.5 p-2\">\n <Switch\n id={switchId}\n variant={variant}\n size={size}\n checked={checked}\n onCheckedChange={onCheckedChange}\n aria-labelledby={labelId}\n aria-label={label ? undefined : 'Theme selector'}\n />\n {label && (\n <label\n htmlFor={switchId}\n id={labelId}\n className=\"cursor-pointer text-sm text-secondary-foreground\"\n >\n {label}\n </label>\n )}\n </div>\n </div>\n );\n}\n\n// ============================================\n// Display Names\n// ============================================\n\nNavAccountMenu.displayName = 'NavAccountMenu';\nNavAccountMenuTrigger.displayName = 'NavAccountMenuTrigger';\nNavAccountMenuContent.displayName = 'NavAccountMenuContent';\nNavAccountMenuHeader.displayName = 'NavAccountMenuHeader';\nNavAccountMenuSection.displayName = 'NavAccountMenuSection';\nNavAccountMenuItem.displayName = 'NavAccountMenuItem';\nNavAccountMenuAccount.displayName = 'NavAccountMenuAccount';\nNavAccountMenuSeparator.displayName = 'NavAccountMenuSeparator';\nNavAccountMenuFooter.displayName = 'NavAccountMenuFooter';\nNavAccountMenuThemeSwitch.displayName = 'NavAccountMenuThemeSwitch';\n\n// ============================================\n// Exports\n// ============================================\n\nexport {\n NavAccountMenu,\n NavAccountMenuAccount,\n NavAccountMenuContent,\n NavAccountMenuFooter,\n NavAccountMenuHeader,\n NavAccountMenuItem,\n NavAccountMenuSection,\n NavAccountMenuSeparator,\n NavAccountMenuThemeSwitch,\n NavAccountMenuTrigger,\n triggerVariants as navAccountMenuTriggerVariants,\n};\n","/**\n * Web Component wrapper for NavAccountMenu\n * Custom element: <hf-nav-account-menu>\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 { NavAccountMenu } from '../components/templates/NavAccountMenu';\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 onOpenChange: (open: boolean) => {\n const CustomEventConstructor =\n element.ownerDocument.defaultView?.CustomEvent ?? CustomEvent;\n element.dispatchEvent(new CustomEventConstructor('open-change', {\n detail: open,\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 NavAccountMenuWrapper(props: React.ComponentProps<typeof NavAccountMenu> & { _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(NavAccountMenu, { ...restProps, ...eventHandlers });\n}\n\n/**\n * Prop type definitions for attribute parsing\n */\nconst propTypes: PropDefs = {\n type: 'string',\n open: 'boolean',\n defaultOpen: 'boolean'\n};\n\nclass NavAccountMenuWC 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 NavAccountMenuWrapper,\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(NavAccountMenuWC.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-nav-account-menu')) {\n customElements.define('hf-nav-account-menu', NavAccountMenuWC);\n}\n\nexport { NavAccountMenuWC };\nexport default NavAccountMenuWC;\n"],"x_google_ignoreList":[0],"mappings":";;;;;;;;;;;;;AASA,IAAM,IAAa;AAAA,EACjB,CAAC,QAAQ;AAAA,IAAE,GAAG;AAAA,IAAkB,KAAK;AAAA,EAAS,CAAC;AAAA,EAC/C,CAAC,QAAQ;AAAA,IAAE,GAAG;AAAA,IAAY,KAAK;AAAA,EAAS,CAAC;AAAA,EACzC,CAAC,QAAQ;AAAA,IAAE,GAAG;AAAA,IAA2C,KAAK;AAAA,EAAS,CAAC;AAC1E,GACM,IAAS,EAAiB,WAAW,CAAU,GCY/C,CAAC,GAAuB,CAAA,IAC5B,EAA8C,gBAAgB;AAmBhE,SAAS,EAAe,EACtB,MAAA,IAAO,QACP,MAAM,GACN,aAAA,IAAc,IACd,cAAA,GACA,UAAA,EAAA,GACsB;AACtB,QAAM,CAAC,GAAM,CAAA,IAAoB,EAAqB;AAAA,IACpD,OAAO;AAAA,IACP,cAAc;AAAA,IACd,UAAU;AAAA,EACZ,CAAC,GAEK,IAAe,EAAM,QAAA,OAClB;AAAA,IACL,MAAA;AAAA,IACA,MAAA;AAAA,IACA,cAAc;AAAA,EAChB,IACA;AAAA,IAAC;AAAA,IAAM;AAAA,IAAM;AAAA,EAAgB,CAC/B;AAEA,SACE,gBAAA,EAAC,EAAsB,UAAvB;AAAA,IAAgC,OAAO;AAAA,cACrC,gBAAA,EAAC,GAAD;AAAA,MAAmB,MAAA;AAAA,MAAM,cAAc;AAAA,gBACrC,gBAAA,EAAC,OAAD;AAAA,QAAK,aAAU;AAAA,QAAoB,UAAA;AAAA,MAAc,CAAA;AAAA,IACtC,CAAA;AAAA,EACiB,CAAA;AAEpC;AAMA,IAAM,IAAkB,EACtB,mOACA;AAAA,EACE,UAAU,EACR,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,EACV,EACF;AAAA,EACA,iBAAiB,EACf,MAAM,OACR;AACF,CACF;AAsBA,SAAS,EAAsB,EAC7B,QAAA,GACA,MAAA,GACA,OAAA,GACA,OAAA,GACA,kBAAA,GACA,UAAA,GACA,SAAA,IAAU,IACV,WAAA,EAAA,GAC6B;AAC7B,QAAM,EAAE,MAAA,GAAM,MAAA,EAAA,IAAS,EAAyB,GAE1C,IAAA,CAAqB,MAAwB;AACjD,IAAA,EAAE,gBAAgB,GAClB,IAAW;AAAA,EACb,GAEM,IAAgB,IACpB,gBAAA,EAAC,OAAD;AAAA,IAAK,WAAU;AAAA,cAAY;AAAA,EAAY,CAAA,IACrC,MACE,IAAkB,IAYpB,OAXF,gBAAA,EAAC,OAAD;AAAA,IAAK,WAAU;AAAA,cAAf,CACE,gBAAA,EAAC,OAAD;AAAA,MAAK,WAAU;AAAA,gBAAf,CACE,gBAAA,EAAC,QAAD;AAAA,QAAM,WAAU;AAAA,kBACb;AAAA,MACG,CAAA,GACL,KAAS,gBAAA,EAAC,QAAD;AAAA,QAAM,WAAU;AAAA,kBAAY;AAAA,MAAY,CAAA,CAC/C;AAAA,QACJ,KACC,gBAAA,EAAC,QAAD;AAAA,MAAM,WAAU;AAAA,gBAA0C;AAAA,IAAY,CAAA,CAErE;AAAA;AAGP,SAAI,MAAS,YAAY,KAAoB,CAAC,IAE1C,gBAAA,EAAC,OAAD;AAAA,IACE,aAAU;AAAA,IACV,WAAW,EAAG,EAAgB,EAAE,MAAA,EAAK,CAAC,GAAG,iBAAiB,CAAS;AAAA,cAFrE,CAIE,gBAAA,EAAC,GAAD;AAAA,MACE,QACE,gBAAA,EAAC,UAAD;AAAA,QACE,MAAK;AAAA,QACL,iBAAc;AAAA,QACd,WAAU;AAAA,MACX,CAAA;AAAA,gBANL,CASG,GACA,CACiB;AAAA,QACpB,gBAAA,EAAC,UAAD;AAAA,MACE,MAAK;AAAA,MACL,SAAS;AAAA,MACT,WAAU;AAAA,MACV,cAAW;AAAA,gBAEX,gBAAA,EAAC,GAAD,EAAQ,WAAU,SAAU,CAAA;AAAA,IACtB,CAAA,CACL;AAAA,OAKP,gBAAA,EAAC,GAAD;AAAA,IACE,QACE,gBAAA,EAAC,UAAD;AAAA,MACE,MAAK;AAAA,MACL,aAAU;AAAA,MACV,iBAAc;AAAA,MACd,cAAY,IAAU,GAAG,CAAA,kBAAsB;AAAA,MAC/C,WAAW,EACT,EAAgB,EAAE,MAAA,EAAK,CAAC,GACxB,iBACA,IAAU,0BAA0B,iBACpC,CACF;AAAA,IACD,CAAA;AAAA,cAbL,CAgBG,GACA,CAAC,KACA,gBAAA,EAAA,GAAA,EAAA,UAAA,CACG,GACD,gBAAA,EAAC,GAAD,EACE,WAAW,EACT,qHACA,IAAO,eAAe,gBACxB,EACD,CAAA,CACD,EAAA,CAAA,CAEc;AAAA;AAExB;AAmBA,SAAS,EAAsB,EAC7B,MAAA,IAAO,SACP,OAAA,IAAQ,OACR,YAAA,IAAa,GACb,UAAA,GACA,WAAA,EAAA,GAC6B;AAC7B,SACE,gBAAA,EAAC,GAAD;AAAA,IACQ,MAAA;AAAA,IACC,OAAA;AAAA,IACK,YAAA;AAAA,IACZ,cAAW;AAAA,IACX,aAAU;AAAA,IACV,WAAW,EACT,+GACA,6NACA,gDACA,8CACA,gDACA,0CACA,0CACA,0CACA,0CACA,2CACA,CACF;AAAA,cAEA,gBAAA,EAAC,OAAD;AAAA,MAAK,WAAU;AAAA,MAAqB,MAAK;AAAA,MAAO,cAAW;AAAA,MACxD,UAAA;AAAA,IACE,CAAA;AAAA,EACa,CAAA;AAExB;AAeA,SAAS,EAAqB,EAC5B,OAAA,GACA,UAAA,GACA,WAAA,EAAA,GAC4B;AAC5B,SACE,gBAAA,EAAC,OAAD;AAAA,IACE,aAAU;AAAA,IACV,WAAW,EAAG,6BAA6B,CAAS;AAAA,cAFtD,CAIE,gBAAA,EAAC,KAAD;AAAA,MAAG,WAAU;AAAA,gBAA2C;AAAA,IAAS,CAAA,GAChE,MACE,OAAO,KAAa,WACnB,gBAAA,EAAC,KAAD;AAAA,MAAG,WAAU;AAAA,gBAAsC;AAAA,IAAY,CAAA,IAE/D,gBAAA,EAAC,OAAD;AAAA,MAAK,WAAU;AAAA,gBAAQ;AAAA,IAAc,CAAA,EAEtC;AAAA;AAET;AAiBA,SAAS,EAAsB,EAC7B,OAAA,GACA,UAAA,IAAW,IACX,UAAA,GACA,WAAA,EAAA,GAC6B;AAC7B,SACE,gBAAA,EAAC,WAAD;AAAA,IACE,aAAU;AAAA,IACV,cAAY;AAAA,IACZ,WAAW,EACT,8BACA,KAAY,0BACZ,CACF;AAAA,cAPF,CASG,KACC,gBAAA,EAAC,OAAD;AAAA,MAAK,WAAU;AAAA,gBACb,gBAAA,EAAC,QAAD;AAAA,QAAM,WAAU;AAAA,kBACb;AAAA,MACG,CAAA;AAAA,IACH,CAAA,GAEN,CACM;AAAA;AAEb;AAuDA,SAAS,EAAmB,EAC1B,MAAA,GACA,UAAA,GACA,aAAA,IAAc,IACd,UAAA,IAAW,IACX,UAAA,GACA,QAAA,GACA,UAAA,GACA,WAAA,EAAA,GAC0B;AAC1B,QAAM,EAAE,cAAA,EAAA,IAAiB,EAAyB,GAE5C,IAAA,MAAoB;AACxB,IAAI,MACJ,IAAW,GACX,EAAa,EAAK;AAAA,EACpB,GAEM,IACJ,gBAAA,EAAC,OAAD;AAAA,IAAK,WAAU;AAAA,cAAf,CACE,gBAAA,EAAC,OAAD;AAAA,MAAK,WAAU;AAAA,gBAAf,CACG,KACC,gBAAA,EAAC,QAAD;AAAA,QACE,WAAW,EACT,4IACA,IAAc,qBAAqB,iBACrC;AAAA,kBAEC;AAAA,MACG,CAAA,GAER,gBAAA,EAAC,QAAD;AAAA,QACE,WAAW,EACT,2BACA,IAAc,qBAAqB,2BACrC;AAAA,QAEC,UAAA;AAAA,MACG,CAAA,CACH;AAAA,QACJ,KACC,gBAAA,EAAC,GAAD;AAAA,MAAK,SAAQ;AAAA,MAAU,MAAK;AAAA,MAAK,WAAU;AAAA,gBACxC;AAAA,IACE,CAAA,CAEJ;AAAA,MAGD,IAAgB,EACpB,6FACA,yDACA,0FACA,KAAY,kCACZ,CACF;AAEA,SAAI,IACK,EAAO;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,IACT,UAAU;AAAA,EACZ,CAAC,IAID,gBAAA,EAAC,UAAD;AAAA,IACE,MAAK;AAAA,IACL,MAAK;AAAA,IACL,aAAU;AAAA,IACV,WAAW;AAAA,IACX,SAAS;AAAA,IACC,UAAA;AAAA,IACV,iBAAe,KAAY;AAAA,cAE1B;AAAA,EACK,CAAA;AAEZ;AAqBA,SAAS,EAAsB,EAC7B,QAAA,GACA,MAAA,GACA,OAAA,GACA,UAAA,IAAW,IACX,UAAA,GACA,WAAA,EAAA,GAC6B;AAC7B,SACE,gBAAA,EAAC,OAAD;AAAA,IACE,aAAU;AAAA,IACV,WAAW,EAAG,wCAAwC,CAAS;AAAA,cAE/D,gBAAA,EAAC,UAAD;AAAA,MACE,MAAK;AAAA,MACL,MAAK;AAAA,MACL,gBAAc;AAAA,MACd,cAAY,aAAa,CAAA,KAAS,CAAA;AAAA,MAClC,WAAW,EACT,8GACA,yCACA,4EACA,0FACA,aACA,KAAY,cACd;AAAA,MACA,SAAS;AAAA,gBAbX;AAAA,QAeG,KAAU,gBAAA,EAAC,OAAD;AAAA,UAAK,WAAU;AAAA,oBAAY;AAAA,QAAY,CAAA;AAAA,QAClD,gBAAA,EAAC,OAAD;AAAA,UAAK,WAAU;AAAA,oBAAf,CACE,gBAAA,EAAC,QAAD;AAAA,YAAM,WAAU;AAAA,sBACb;AAAA,UACG,CAAA,GACN,gBAAA,EAAC,QAAD;AAAA,YAAM,WAAU;AAAA,sBACb;AAAA,UACG,CAAA,CACH;AAAA;QAEL,gBAAA,EAAC,OAAD;AAAA,UACE,eAAY;AAAA,UACZ,WAAW,EACT,mJACA,IACI,8BACA,8BACN;AAAA,oBAEC,KACC,gBAAA,EAAC,OAAD,EAAK,WAAU,2DAA4D,CAAA;AAAA,QAE1E,CAAA;AAAA,MACC;AAAA;EACL,CAAA;AAET;AAWA,SAAS,EAAwB,EAAE,WAAA,EAAA,GAA2C;AAC5E,SACE,gBAAA,EAAC,MAAD;AAAA,IACE,aAAU;AAAA,IACV,WAAW,EAAG,gCAAgC,CAAS;AAAA,EACxD,CAAA;AAEL;AAaA,SAAS,EAAqB,EAC5B,UAAA,GACA,WAAA,EAAA,GAC4B;AAC5B,SACE,gBAAA,EAAC,OAAD;AAAA,IACE,aAAU;AAAA,IACV,WAAW,EAAG,8CAA8C,CAAS;AAAA,IAEpE,UAAA;AAAA,EACE,CAAA;AAET;AAyBA,SAAS,EAA0B,EACjC,SAAA,IAAU,kBACV,MAAA,IAAO,MACP,SAAA,GACA,iBAAA,GACA,OAAA,GACA,WAAA,EAAA,GACiC;AACjC,QAAM,IAAW,EAAM,MAAM,GACvB,IAAU,IAAQ,GAAG,CAAA,WAAmB;AAE9C,SACE,gBAAA,EAAC,OAAD;AAAA,IACE,aAAU;AAAA,IACV,WAAW,EAAG,iCAAiC,CAAS;AAAA,cAExD,gBAAA,EAAC,OAAD;AAAA,MAAK,WAAU;AAAA,gBAAf,CACE,gBAAA,EAAC,GAAD;AAAA,QACE,IAAI;AAAA,QACK,SAAA;AAAA,QACH,MAAA;AAAA,QACG,SAAA;AAAA,QACQ,iBAAA;AAAA,QACjB,mBAAiB;AAAA,QACjB,cAAY,IAAQ,SAAY;AAAA,MACjC,CAAA,GACA,KACC,gBAAA,EAAC,SAAD;AAAA,QACE,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,WAAU;AAAA,kBAET;AAAA,MACI,CAAA,CAEN;AAAA;EACF,CAAA;AAET;AAMA,EAAe,cAAc;AAC7B,EAAsB,cAAc;AACpC,EAAsB,cAAc;AACpC,EAAqB,cAAc;AACnC,EAAsB,cAAc;AACpC,EAAmB,cAAc;AACjC,EAAsB,cAAc;AACpC,EAAwB,cAAc;AACtC,EAAqB,cAAc;AACnC,EAA0B,cAAc;AC5oBxC,SAAS,EAAsB,GAAsB;AACnD,SAAO,EACL,cAAA,CAAe,MAAkB;AAC/B,UAAM,IACJ,EAAQ,cAAc,aAAa,eAAe;AACpD,IAAA,EAAQ,cAAc,IAAI,EAAuB,eAAe;AAAA,MAC9D,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,UAAU;AAAA,IACZ,CAAC,CAAC;AAAA,EACJ,EACF;AACF;AAKA,SAAS,EAAsB,GAAqF;AAClH,QAAM,EAAE,cAAA,GAAc,GAAG,EAAA,IAAc,GAEjC,IAAgB,EAAM,QAAA,MACrB,IACE,EAAsB,CAAY,IADf,CAAC,GAE1B,CAAC,CAAY,CAAC;AAEjB,SAAO,EAAM,cAAc,GAAgB;AAAA,IAAE,GAAG;AAAA,IAAW,GAAG;AAAA,EAAc,CAAC;AAC/E;AAKA,IAAM,IAAsB;AAAA,EACxB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,aAAa;AACjB,GAEM,IAAN,cAA+B,YAAY;AAAA,EACzC,QAAsD;AAAA,EACtD,qBAAoD;AAAA,EACpD,SAA0C,CAAC;AAAA,EAC3C,eAAuB;AAAA,EAEvB,oBAAoB;AAClB,eAAA,MAAiB,KAAK,YAAY,GAAG,CAAC;AAAA,EACxC;AAAA,EAEA,cAAsB;AACpB,QAAI,KAAK,aAAc;AACvB,SAAK,eAAe;AAEpB,UAAM,IAA2B,CAAC;AAClC,eAAW,KAAS,MAAM,KAAK,KAAK,UAAU;AAC5C,MAAI,EAAM,aAAa,KAAK,aAAa,CAAC,EAAM,aAAa,KAAK,KAGlE,EAAiB,KAAK,CAAK;AAG7B,UAAM,IAAiB,KAAK,cAAc,cAAc,KAAK;AAQ7D,SAPA,EAAe,MAAM,UAAU,YAE/B,KAAK,qBAAqB,KAAK,cAAc,cAAc,KAAK,GAChE,KAAK,mBAAmB,MAAM,UAAU,YAExC,EAAiB,QAAA,CAAS,MAAU,KAAK,mBAAoB,YAAY,CAAK,CAAC,GAExE,KAAK,aAAY,MAAK,YAAY,KAAK,UAAU;AACxD,SAAK,YAAY,CAAc,GAE/B,KAAK,QAAQ,EAAW,CAAc,GACtC,KAAK,QAAQ;AAAA,EACf;AAAA,EAEA,uBAAuB;AACrB,SAAK,OAAO,QAAQ,GACpB,KAAK,QAAQ;AAAA,EACf;AAAA,EAEA,yBAAyB,GAAe,GAA0B,GAA0B;AAC1F,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,WAAW,qBAAqB;AAC9B,WAAO,OAAO,KAAK,CAAS,EAAE,IAAA,CAAK,MACjC,EAAK,QAAQ,YAAY,KAAK,EAAE,YAAY,CAC9C;AAAA,EACF;AAAA,EAEA,SAAS,GAAc,GAAgB;AACrC,UAAM,IAAW,EAAU,CAAA,KAAS;AACpC,SAAK,OAAO,CAAA,IAAQ,EAAW,GAAO,CAAQ,GAC9C,KAAK,QAAQ;AAAA,EACf;AAAA,EAEA,SAAS,GAAuB;AAC9B,QAAI,KAAQ,KAAK,OACf,QAAO,KAAK,OAAO,CAAA;AAErB,UAAM,IAAW,EAAK,QAAQ,YAAY,KAAK,EAAE,YAAY,GACvD,IAAW,EAAU,CAAA,KAAS;AACpC,WAAO,EAAU,KAAK,aAAa,CAAQ,GAAG,CAAQ;AAAA,EACxD;AAAA,EAEA,UAAkB;AAChB,QAAI,CAAC,KAAK,SAAS,CAAC,KAAK,mBAAoB;AAE7C,UAAM,IAAiC,CAAC;AACxC,eAAW,CAAC,GAAU,CAAA,KAAa,OAAO,QAAQ,CAAS,EACzD,KAAI,KAAY,KAAK,OACnB,CAAA,EAAM,CAAA,IAAY,KAAK,OAAO,CAAA;AAAA,SACzB;AACL,YAAM,IAAW,EAAS,QAAQ,YAAY,KAAK,EAAE,YAAY;AACjE,MAAA,EAAM,CAAA,IAAY,EAAU,KAAK,aAAa,CAAQ,GAAG,CAAQ;AAAA,IACnE;AAGF,UAAM,IAAU,EAAM,cACpB,GACA;AAAA,MAAE,GAAG;AAAA,MAAO,cAAc;AAAA,IAAK,GAC/B,EAAM,cAAc,QAAQ;AAAA,MAC1B,KAAA,CAAM,MAA+B;AACnC,QAAI,KAAM,KAAK,sBACb,EAAG,YAAY,KAAK,kBAAkB;AAAA,MAE1C;AAAA,MACA,OAAO,EAAE,SAAS,WAAW;AAAA,IAC/B,CAAC,CACH;AAEA,SAAK,MAAM,OAAO,CAAO;AAAA,EAC3B;AACF;AAEA,WAAW,KAAY,OAAO,KAAK,CAAS,EAC1C,QAAO,eAAe,EAAiB,WAAW,GAAU;AAAA,EAC1D,MAAM;AACJ,WAAO,KAAK,SAAS,CAAQ;AAAA,EAC/B;AAAA,EACA,IAAI,GAAgB;AAClB,SAAK,SAAS,GAAU,CAAK;AAAA,EAC/B;AAAA,EACA,YAAY;AAAA,EACZ,cAAc;AAChB,CAAC;AAGC,OAAO,iBAAmB,OAAe,CAAC,eAAe,IAAI,qBAAqB,KACpF,eAAe,OAAO,uBAAuB,CAAgB"}
|
|
@@ -256,7 +256,7 @@ function Le({ className: e, onAiAssist: o, onUndo: r, onRedo: a, onExpand: s, sh
|
|
|
256
256
|
]
|
|
257
257
|
});
|
|
258
258
|
}
|
|
259
|
-
var $ = y.forwardRef(({ label: e, hint: o, error: r, required: a, showHelpIcon: s, onHelpClick: m, showCharCount: C, maxLength: n = R, charCount: v, showResizeHandle: p = !0, showAiAssist: h = !0, showExpand: I = !0, onAiAssist: H, onUndo: P, onRedo:
|
|
259
|
+
var $ = y.forwardRef(({ label: e, hint: o, error: r, required: a, showHelpIcon: s, onHelpClick: m, showCharCount: C, maxLength: n = R, charCount: v, showResizeHandle: p = !0, showAiAssist: h = !0, showExpand: I = !0, onAiAssist: H, onUndo: P, onRedo: F, onExpand: U, rtl: c, formatting: q, onFormatChange: B, className: O, disabled: T, id: S, value: b, defaultValue: M, onChange: Z, ...W }, X) => {
|
|
260
260
|
const G = y.useId(), g = S || G, A = `${g}-hint`, D = `${g}-error`, [Q, J] = y.useState(M?.toString() || ""), K = b !== void 0 ? b.toString() : Q, x = ze(n), _ = Ve(v, K.length), w = _ >= x * 0.9, Y = _ >= x * 0.75;
|
|
261
261
|
let k;
|
|
262
262
|
r ? k = D : o && (k = A);
|
|
@@ -284,7 +284,7 @@ var $ = y.forwardRef(({ label: e, hint: o, error: r, required: a, showHelpIcon:
|
|
|
284
284
|
s && /* @__PURE__ */ t("button", {
|
|
285
285
|
type: "button",
|
|
286
286
|
onClick: m,
|
|
287
|
-
className: "text-muted-foreground hover:text-
|
|
287
|
+
className: "text-muted-foreground hover:text-secondary-foreground transition-colors duration-200 ease-smooth motion-reduce:transition-none focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded-full",
|
|
288
288
|
"aria-label": "Help",
|
|
289
289
|
children: /* @__PURE__ */ t(re, { className: "size-4" })
|
|
290
290
|
})
|
|
@@ -296,13 +296,13 @@ var $ = y.forwardRef(({ label: e, hint: o, error: r, required: a, showHelpIcon:
|
|
|
296
296
|
children: [/* @__PURE__ */ t(Le, {
|
|
297
297
|
onAiAssist: H,
|
|
298
298
|
onUndo: P,
|
|
299
|
-
onRedo:
|
|
300
|
-
onExpand:
|
|
299
|
+
onRedo: F,
|
|
300
|
+
onExpand: U,
|
|
301
301
|
showAiAssist: h,
|
|
302
302
|
showExpand: I,
|
|
303
303
|
disabled: T,
|
|
304
304
|
rtl: c,
|
|
305
|
-
formatting:
|
|
305
|
+
formatting: q,
|
|
306
306
|
onFormatChange: B
|
|
307
307
|
}), /* @__PURE__ */ t(ue, {
|
|
308
308
|
ref: X,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hf-rich-textarea.js","names":["__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode"],"sources":["../../../../../../../../../../../Users/akarim/Documents/test/humain_foundation_ui/node_modules/.bun/lucide-react@1.27.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/bold.mjs","../../../../../../../../../../../Users/akarim/Documents/test/humain_foundation_ui/node_modules/.bun/lucide-react@1.27.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/expand.mjs","../../../../../../../../../../../Users/akarim/Documents/test/humain_foundation_ui/node_modules/.bun/lucide-react@1.27.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/italic.mjs","../../../../../../../../../../../Users/akarim/Documents/test/humain_foundation_ui/node_modules/.bun/lucide-react@1.27.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/link.mjs","../../../../../../../../../../../Users/akarim/Documents/test/humain_foundation_ui/node_modules/.bun/lucide-react@1.27.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/redo-2.mjs","../../../../../../../../../../../Users/akarim/Documents/test/humain_foundation_ui/node_modules/.bun/lucide-react@1.27.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/type.mjs","../../../../../../../../../../../Users/akarim/Documents/test/humain_foundation_ui/node_modules/.bun/lucide-react@1.27.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/underline.mjs","../../../../../../../../../../../Users/akarim/Documents/test/humain_foundation_ui/node_modules/.bun/lucide-react@1.27.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/undo-2.mjs","../../src/components/molecules/forms/RichTextarea/RichTextarea.tsx","../../src/wc/hf-rich-textarea.ts"],"sourcesContent":["/**\n * @license lucide-react v1.27.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n { d: \"M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8\", key: \"mg9rjx\" }\n ]\n];\nconst Bold = createLucideIcon(\"bold\", __iconNode);\n\nexport { __iconNode, Bold as default };\n//# sourceMappingURL=bold.mjs.map\n","/**\n * @license lucide-react v1.27.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"m15 15 6 6\", key: \"1s409w\" }],\n [\"path\", { d: \"m15 9 6-6\", key: \"ko1vev\" }],\n [\"path\", { d: \"M21 16v5h-5\", key: \"1ck2sf\" }],\n [\"path\", { d: \"M21 8V3h-5\", key: \"1qoq8a\" }],\n [\"path\", { d: \"M3 16v5h5\", key: \"1t08am\" }],\n [\"path\", { d: \"m3 21 6-6\", key: \"wwnumi\" }],\n [\"path\", { d: \"M3 8V3h5\", key: \"1ln10m\" }],\n [\"path\", { d: \"M9 9 3 3\", key: \"v551iv\" }]\n];\nconst Expand = createLucideIcon(\"expand\", __iconNode);\n\nexport { __iconNode, Expand as default };\n//# sourceMappingURL=expand.mjs.map\n","/**\n * @license lucide-react v1.27.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"line\", { x1: \"19\", x2: \"10\", y1: \"4\", y2: \"4\", key: \"15jd3p\" }],\n [\"line\", { x1: \"14\", x2: \"5\", y1: \"20\", y2: \"20\", key: \"bu0au3\" }],\n [\"line\", { x1: \"15\", x2: \"9\", y1: \"4\", y2: \"20\", key: \"uljnxc\" }]\n];\nconst Italic = createLucideIcon(\"italic\", __iconNode);\n\nexport { __iconNode, Italic as default };\n//# sourceMappingURL=italic.mjs.map\n","/**\n * @license lucide-react v1.27.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\", key: \"1cjeqo\" }],\n [\"path\", { d: \"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\", key: \"19qd67\" }]\n];\nconst Link = createLucideIcon(\"link\", __iconNode);\n\nexport { __iconNode, Link as default };\n//# sourceMappingURL=link.mjs.map\n","/**\n * @license lucide-react v1.27.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"m15 14 5-5-5-5\", key: \"12vg1m\" }],\n [\"path\", { d: \"M20 9H9.5A5.5 5.5 0 0 0 4 14.5A5.5 5.5 0 0 0 9.5 20H13\", key: \"6uklza\" }]\n];\nconst Redo2 = createLucideIcon(\"redo-2\", __iconNode);\n\nexport { __iconNode, Redo2 as default };\n//# sourceMappingURL=redo-2.mjs.map\n","/**\n * @license lucide-react v1.27.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 4v16\", key: \"1654pz\" }],\n [\"path\", { d: \"M4 7V5a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v2\", key: \"e0r10z\" }],\n [\"path\", { d: \"M9 20h6\", key: \"s66wpe\" }]\n];\nconst Type = createLucideIcon(\"type\", __iconNode);\n\nexport { __iconNode, Type as default };\n//# sourceMappingURL=type.mjs.map\n","/**\n * @license lucide-react v1.27.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M6 4v6a6 6 0 0 0 12 0V4\", key: \"9kb039\" }],\n [\"line\", { x1: \"4\", x2: \"20\", y1: \"20\", y2: \"20\", key: \"nun2al\" }]\n];\nconst Underline = createLucideIcon(\"underline\", __iconNode);\n\nexport { __iconNode, Underline as default };\n//# sourceMappingURL=underline.mjs.map\n","/**\n * @license lucide-react v1.27.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M9 14 4 9l5-5\", key: \"102s5s\" }],\n [\"path\", { d: \"M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11\", key: \"f3b9sd\" }]\n];\nconst Undo2 = createLucideIcon(\"undo-2\", __iconNode);\n\nexport { __iconNode, Undo2 as default };\n//# sourceMappingURL=undo-2.mjs.map\n","import {\n Bold,\n ChevronDown,\n Expand,\n HelpCircle,\n Italic,\n Link,\n List,\n MoreHorizontal,\n Paperclip,\n Redo2,\n Sparkles,\n Table,\n Type,\n Underline,\n Undo2,\n} from 'lucide-react';\nimport * as React from 'react';\nimport { Label } from '@/components/ui/label';\nimport { Separator } from '@/components/ui/separator';\nimport { Textarea as TextareaBase } from '@/components/ui/textarea';\nimport { Toggle } from '@/components/ui/toggle';\nimport { cn } from '@/lib/utils';\n\nconst DEFAULT_MAX_LENGTH = 3000;\n\nfunction getMaxLength(maxLength: number): number {\n return Number.isFinite(maxLength) && maxLength >= 0\n ? Math.floor(maxLength)\n : DEFAULT_MAX_LENGTH;\n}\n\nfunction getCharCount(charCount: number | undefined, fallback: number): number {\n return typeof charCount === 'number' &&\n Number.isFinite(charCount) &&\n charCount >= 0\n ? Math.floor(charCount)\n : fallback;\n}\n\n// ---------------------------------------------------------------------------\n// RichTextarea Toolbar Button\n// ---------------------------------------------------------------------------\n\ninterface ToolbarButtonProps\n extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'value'> {\n icon: React.ReactNode;\n pressed?: boolean;\n hasDropdown?: boolean;\n}\n\nconst ToolbarButton = React.forwardRef<HTMLButtonElement, ToolbarButtonProps>(\n ({ icon, pressed, hasDropdown, className, ...props }, ref) => {\n if (hasDropdown) {\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-haspopup=\"true\"\n className={cn(\n 'group/dropdown inline-flex h-8 items-center justify-center gap-1 rounded px-1.5 py-1 text-foreground transition-[color,background-color,transform] duration-200 ease-smooth motion-reduce:transition-none',\n 'hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n 'active:scale-95 motion-reduce:active:scale-100',\n 'disabled:pointer-events-none disabled:opacity-50',\n pressed && 'bg-muted',\n className,\n )}\n {...props}\n >\n <span className=\"[&>svg]:size-4\">{icon}</span>\n <ChevronDown className=\"size-4 text-muted-foreground transition-transform duration-200 ease-smooth motion-reduce:transition-none group-hover/dropdown:translate-y-0.5\" />\n </button>\n );\n }\n\n return (\n <Toggle\n ref={ref}\n pressed={pressed}\n size=\"sm\"\n className={className}\n disabled={props.disabled}\n onClick={props.onClick}\n aria-label={props['aria-label']}\n >\n <span className=\"[&>svg]:size-5\">{icon}</span>\n </Toggle>\n );\n },\n);\n\nToolbarButton.displayName = 'ToolbarButton';\n\n// ---------------------------------------------------------------------------\n// RichTextarea Toolbar Divider\n// ---------------------------------------------------------------------------\n\nfunction ToolbarDivider() {\n return (\n <Separator\n orientation=\"vertical\"\n className=\"mx-0.5 h-5 w-px bg-surface-2\"\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// RichTextarea Toolbar\n// ---------------------------------------------------------------------------\n\nexport interface RichTextareaToolbarProps {\n className?: string;\n /** Called when AI assist button is clicked */\n onAiAssist?: () => void;\n /** Called when undo is clicked */\n onUndo?: () => void;\n /** Called when redo is clicked */\n onRedo?: () => void;\n /** Called when expand/fullscreen button is clicked */\n onExpand?: () => void;\n /** Show AI assist button */\n showAiAssist?: boolean;\n /** Show expand button */\n showExpand?: boolean;\n /** Disabled state */\n disabled?: boolean;\n /** RTL mode */\n rtl?: boolean;\n /** Formatting state */\n formatting?: {\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n };\n /** Formatting callbacks */\n onFormatChange?: (format: 'bold' | 'italic' | 'underline') => void;\n}\n\nfunction RichTextareaToolbar({\n className,\n onAiAssist,\n onUndo,\n onRedo,\n onExpand,\n showAiAssist = true,\n showExpand = true,\n disabled,\n rtl,\n formatting = {},\n onFormatChange,\n}: RichTextareaToolbarProps) {\n return (\n <div\n data-slot=\"rich-textarea-toolbar\"\n role=\"toolbar\"\n aria-label=\"Formatting toolbar\"\n className={cn(\n 'flex flex-wrap items-center gap-2 rounded-t-xl border border-input border-b-0 bg-muted/30 p-2 transition-[border-color] duration-200 ease-smooth motion-reduce:transition-none group-has-[:focus-visible]/editor:border-ring group-has-[[aria-invalid=true]]/editor:border-destructive',\n rtl && 'flex-row-reverse',\n className,\n )}\n dir={rtl ? 'rtl' : 'ltr'}\n >\n {/* AI Assist */}\n {showAiAssist && (\n <>\n <ToolbarButton\n icon={\n <Sparkles className=\"size-5 text-primary transition-transform duration-300 ease-smooth motion-reduce:transition-none group-hover/toggle:rotate-12\" />\n }\n onClick={onAiAssist}\n disabled={disabled}\n aria-label=\"AI Assist\"\n />\n <ToolbarDivider />\n </>\n )}\n\n {/* Undo/Redo */}\n <div className=\"flex items-center gap-2\">\n <ToolbarButton\n icon={<Undo2 />}\n onClick={onUndo}\n disabled={disabled}\n aria-label=\"Undo\"\n />\n <ToolbarButton\n icon={<Redo2 />}\n onClick={onRedo}\n disabled={disabled}\n aria-label=\"Redo\"\n />\n </div>\n\n <ToolbarDivider />\n\n {/* Text formatting dropdown */}\n <ToolbarButton\n icon={<Type />}\n hasDropdown\n disabled={disabled}\n aria-label=\"Text formatting\"\n />\n\n {/* Text color dropdown */}\n <ToolbarButton\n icon={\n <span className=\"relative\">\n <span className=\"text-sm font-bold\">A</span>\n <span className=\"absolute bottom-0 left-0 right-0 h-0.5 bg-foreground\" />\n </span>\n }\n hasDropdown\n disabled={disabled}\n aria-label=\"Text color\"\n />\n\n {/* Bold/Italic/Underline */}\n <ToolbarButton\n icon={<Bold />}\n pressed={formatting.bold}\n onClick={() => onFormatChange?.('bold')}\n disabled={disabled}\n aria-label=\"Bold\"\n />\n <ToolbarButton\n icon={<Italic />}\n pressed={formatting.italic}\n onClick={() => onFormatChange?.('italic')}\n disabled={disabled}\n aria-label=\"Italic\"\n />\n <ToolbarButton\n icon={<Underline />}\n pressed={formatting.underline}\n onClick={() => onFormatChange?.('underline')}\n disabled={disabled}\n aria-label=\"Underline\"\n />\n\n {/* List dropdown */}\n <ToolbarButton\n icon={<List />}\n hasDropdown\n disabled={disabled}\n aria-label=\"List options\"\n />\n\n <ToolbarDivider />\n\n {/* Link */}\n <ToolbarButton\n icon={<Link />}\n disabled={disabled}\n aria-label=\"Insert link\"\n />\n\n {/* Table dropdown */}\n <ToolbarButton\n icon={<Table />}\n hasDropdown\n disabled={disabled}\n aria-label=\"Table options\"\n />\n\n {/* Attachment */}\n <ToolbarButton\n icon={<Paperclip />}\n disabled={disabled}\n aria-label=\"Attach file\"\n />\n\n {/* More options */}\n <ToolbarButton\n icon={<MoreHorizontal />}\n disabled={disabled}\n aria-label=\"More options\"\n />\n\n {/* Expand */}\n {showExpand && (\n <ToolbarButton\n icon={\n <Expand className=\"transition-transform duration-200 ease-smooth motion-reduce:transition-none group-hover/toggle:scale-110\" />\n }\n onClick={onExpand}\n disabled={disabled}\n aria-label=\"Expand\"\n className=\"ms-auto\"\n />\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// RichTextarea Component\n// ---------------------------------------------------------------------------\n\nexport interface RichTextareaProps\n extends Omit<React.ComponentProps<typeof TextareaBase>, 'children'> {\n /** Label text displayed above the editor */\n label?: string;\n /** Hint text displayed below the editor */\n hint?: string;\n /** Error message displayed below the editor */\n error?: string;\n /** Show required indicator */\n required?: boolean;\n /** Show help icon next to label */\n showHelpIcon?: boolean;\n /** Callback when help icon is clicked */\n onHelpClick?: () => void;\n /** Show character count */\n showCharCount?: boolean;\n /** Maximum character count */\n maxLength?: number;\n /** Current character count (controlled) */\n charCount?: number;\n /** Show resize handle */\n showResizeHandle?: boolean;\n /** Show AI assist button in toolbar */\n showAiAssist?: boolean;\n /** Show expand button in toolbar */\n showExpand?: boolean;\n /** Called when AI assist button is clicked */\n onAiAssist?: () => void;\n /** Called when undo is clicked */\n onUndo?: () => void;\n /** Called when redo is clicked */\n onRedo?: () => void;\n /** Called when expand button is clicked */\n onExpand?: () => void;\n /** RTL mode */\n rtl?: boolean;\n /** Formatting state */\n formatting?: {\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n };\n /** Formatting callbacks */\n onFormatChange?: (format: 'bold' | 'italic' | 'underline') => void;\n}\n\nconst RichTextarea = React.forwardRef<HTMLTextAreaElement, RichTextareaProps>(\n (\n {\n label,\n hint,\n error,\n required,\n showHelpIcon,\n onHelpClick,\n showCharCount,\n maxLength = DEFAULT_MAX_LENGTH,\n charCount,\n showResizeHandle = true,\n showAiAssist = true,\n showExpand = true,\n onAiAssist,\n onUndo,\n onRedo,\n onExpand,\n rtl,\n formatting,\n onFormatChange,\n className,\n disabled,\n id,\n value,\n defaultValue,\n onChange,\n ...props\n },\n ref,\n ) => {\n const generatedId = React.useId();\n const textareaId = id || generatedId;\n const hintId = `${textareaId}-hint`;\n const errorId = `${textareaId}-error`;\n\n // Track character count internally if not controlled\n const [internalValue, setInternalValue] = React.useState(\n defaultValue?.toString() || '',\n );\n const currentValue = value !== undefined ? value.toString() : internalValue;\n const safeMaxLength = getMaxLength(maxLength);\n const currentCharCount = getCharCount(charCount, currentValue.length);\n const isNearLimit = currentCharCount >= safeMaxLength * 0.9;\n const isApproachingLimit = currentCharCount >= safeMaxLength * 0.75;\n let describedById: string | undefined;\n if (error) {\n describedById = errorId;\n } else if (hint) {\n describedById = hintId;\n }\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n if (value === undefined) {\n setInternalValue(e.target.value);\n }\n onChange?.(e);\n };\n\n const isDestructive = !!error;\n\n return (\n <div\n data-slot=\"rich-textarea\"\n className={cn('flex flex-col gap-1.5 w-full', rtl && 'text-right')}\n dir={rtl ? 'rtl' : 'ltr'}\n >\n {/* Label */}\n {label && (\n <div\n className={cn(\n 'flex items-center gap-0.5',\n rtl && 'flex-row-reverse',\n )}\n >\n <Label\n htmlFor={textareaId}\n className=\"text-sm font-medium leading-5 text-secondary-foreground\"\n >\n {label}\n </Label>\n {required && (\n <span\n className=\"text-sm font-medium leading-5 text-destructive\"\n aria-hidden=\"true\"\n >\n *\n </span>\n )}\n {showHelpIcon && (\n <button\n type=\"button\"\n onClick={onHelpClick}\n className=\"text-muted-foreground hover:text-text-quaternary transition-colors duration-200 ease-smooth motion-reduce:transition-none focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded-full\"\n aria-label=\"Help\"\n >\n <HelpCircle className=\"size-4\" />\n </button>\n )}\n </div>\n )}\n\n {/* Toolbar + Textarea (gapless for connected borders) */}\n <div data-slot=\"rich-textarea-control\" className=\"group/editor\">\n <RichTextareaToolbar\n onAiAssist={onAiAssist}\n onUndo={onUndo}\n onRedo={onRedo}\n onExpand={onExpand}\n showAiAssist={showAiAssist}\n showExpand={showExpand}\n disabled={disabled}\n rtl={rtl}\n formatting={formatting}\n onFormatChange={onFormatChange}\n />\n\n <TextareaBase\n ref={ref}\n data-slot=\"rich-textarea-editor\"\n id={textareaId}\n value={value}\n defaultValue={defaultValue}\n onChange={handleChange}\n disabled={disabled}\n aria-invalid={isDestructive}\n aria-required={required || undefined}\n aria-describedby={describedById}\n maxLength={safeMaxLength}\n className={cn(\n 'min-h-30 rounded-t-none border-t-0',\n isDestructive &&\n 'border-destructive focus-visible:border-destructive focus-visible:ring-destructive/20',\n !showResizeHandle && 'resize-none',\n rtl && 'text-right',\n className,\n )}\n dir={rtl ? 'rtl' : 'ltr'}\n {...props}\n />\n </div>\n\n {/* Hint/Error and Character Count */}\n <div\n className={cn(\n 'flex items-start gap-4 text-sm leading-5',\n rtl ? 'flex-row-reverse' : 'justify-between',\n )}\n >\n {/* Hint or error */}\n <div className=\"flex-1\">\n {error ? (\n <p\n id={errorId}\n className=\"text-destructive animate-in fade-in-0 slide-in-from-top-1 duration-200 motion-reduce:animate-none\"\n >\n {error}\n </p>\n ) : hint ? (\n <p id={hintId} className=\"text-muted-foreground\">\n {hint}\n </p>\n ) : null}\n </div>\n\n {/* Character count — only announces via aria-live when near the limit (≥90%) */}\n {showCharCount && (\n <span\n role={isNearLimit ? 'status' : undefined}\n aria-live={isNearLimit ? 'polite' : 'off'}\n className={cn(\n 'whitespace-nowrap transition-colors duration-300 ease-out motion-reduce:transition-none',\n isNearLimit\n ? 'text-destructive font-medium'\n : isApproachingLimit\n ? 'text-secondary-foreground'\n : 'text-muted-foreground',\n rtl && 'text-start',\n )}\n >\n {currentCharCount}/{safeMaxLength}\n </span>\n )}\n </div>\n </div>\n );\n },\n);\n\nRichTextarea.displayName = 'RichTextarea';\n\nexport { RichTextarea, RichTextareaToolbar, ToolbarButton, ToolbarDivider };\n","/**\n * Web Component wrapper for RichTextarea\n * Custom element: <hf-rich-textarea>\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 { RichTextarea } from '../components/molecules/forms/RichTextarea';\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 onHelpClick: (value: unknown) => {\n const CustomEventConstructor =\n element.ownerDocument.defaultView?.CustomEvent ?? CustomEvent;\n element.dispatchEvent(new CustomEventConstructor('help-click', {\n detail: value,\n bubbles: true,\n composed: true\n }));\n },\n onAiAssist: (value: unknown) => {\n const CustomEventConstructor =\n element.ownerDocument.defaultView?.CustomEvent ?? CustomEvent;\n element.dispatchEvent(new CustomEventConstructor('ai-assist', {\n detail: value,\n bubbles: true,\n composed: true\n }));\n },\n onUndo: (value: unknown) => {\n const CustomEventConstructor =\n element.ownerDocument.defaultView?.CustomEvent ?? CustomEvent;\n element.dispatchEvent(new CustomEventConstructor('undo', {\n detail: value,\n bubbles: true,\n composed: true\n }));\n },\n onRedo: (value: unknown) => {\n const CustomEventConstructor =\n element.ownerDocument.defaultView?.CustomEvent ?? CustomEvent;\n element.dispatchEvent(new CustomEventConstructor('redo', {\n detail: value,\n bubbles: true,\n composed: true\n }));\n },\n onExpand: (value: unknown) => {\n const CustomEventConstructor =\n element.ownerDocument.defaultView?.CustomEvent ?? CustomEvent;\n element.dispatchEvent(new CustomEventConstructor('expand', {\n detail: value,\n bubbles: true,\n composed: true\n }));\n },\n onFormatChange: (value: unknown) => {\n const CustomEventConstructor =\n element.ownerDocument.defaultView?.CustomEvent ?? CustomEvent;\n element.dispatchEvent(new CustomEventConstructor('format-change', {\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 RichTextareaWrapper(props: React.ComponentProps<typeof RichTextarea> & { _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(RichTextarea, { ...restProps, ...eventHandlers });\n}\n\n/**\n * Prop type definitions for attribute parsing\n */\nconst propTypes: PropDefs = {\n label: 'string',\n hint: 'string',\n error: 'string',\n required: 'boolean',\n showHelpIcon: 'boolean',\n showCharCount: 'boolean',\n maxLength: 'number',\n charCount: 'number',\n showResizeHandle: 'boolean',\n showAiAssist: 'boolean',\n showExpand: 'boolean',\n rtl: 'boolean',\n formatting: 'json'\n};\n\nclass RichTextareaWC 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) 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 RichTextareaWrapper,\n { ...props, _hostElement: this },\n );\n\n this._root.render(element);\n }\n}\n\nfor (const propName of Object.keys(propTypes)) {\n Object.defineProperty(RichTextareaWC.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-rich-textarea')) {\n customElements.define('hf-rich-textarea', RichTextareaWC);\n}\n\nexport { RichTextareaWC };\nexport default RichTextareaWC;\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hf-rich-textarea.js","names":["__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode"],"sources":["../../../../../../../../../../../Users/akarim/Documents/test/humain_foundation_ui/node_modules/.bun/lucide-react@1.27.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/bold.mjs","../../../../../../../../../../../Users/akarim/Documents/test/humain_foundation_ui/node_modules/.bun/lucide-react@1.27.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/expand.mjs","../../../../../../../../../../../Users/akarim/Documents/test/humain_foundation_ui/node_modules/.bun/lucide-react@1.27.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/italic.mjs","../../../../../../../../../../../Users/akarim/Documents/test/humain_foundation_ui/node_modules/.bun/lucide-react@1.27.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/link.mjs","../../../../../../../../../../../Users/akarim/Documents/test/humain_foundation_ui/node_modules/.bun/lucide-react@1.27.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/redo-2.mjs","../../../../../../../../../../../Users/akarim/Documents/test/humain_foundation_ui/node_modules/.bun/lucide-react@1.27.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/type.mjs","../../../../../../../../../../../Users/akarim/Documents/test/humain_foundation_ui/node_modules/.bun/lucide-react@1.27.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/underline.mjs","../../../../../../../../../../../Users/akarim/Documents/test/humain_foundation_ui/node_modules/.bun/lucide-react@1.27.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/undo-2.mjs","../../src/components/molecules/forms/RichTextarea/RichTextarea.tsx","../../src/wc/hf-rich-textarea.ts"],"sourcesContent":["/**\n * @license lucide-react v1.27.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n { d: \"M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8\", key: \"mg9rjx\" }\n ]\n];\nconst Bold = createLucideIcon(\"bold\", __iconNode);\n\nexport { __iconNode, Bold as default };\n//# sourceMappingURL=bold.mjs.map\n","/**\n * @license lucide-react v1.27.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"m15 15 6 6\", key: \"1s409w\" }],\n [\"path\", { d: \"m15 9 6-6\", key: \"ko1vev\" }],\n [\"path\", { d: \"M21 16v5h-5\", key: \"1ck2sf\" }],\n [\"path\", { d: \"M21 8V3h-5\", key: \"1qoq8a\" }],\n [\"path\", { d: \"M3 16v5h5\", key: \"1t08am\" }],\n [\"path\", { d: \"m3 21 6-6\", key: \"wwnumi\" }],\n [\"path\", { d: \"M3 8V3h5\", key: \"1ln10m\" }],\n [\"path\", { d: \"M9 9 3 3\", key: \"v551iv\" }]\n];\nconst Expand = createLucideIcon(\"expand\", __iconNode);\n\nexport { __iconNode, Expand as default };\n//# sourceMappingURL=expand.mjs.map\n","/**\n * @license lucide-react v1.27.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"line\", { x1: \"19\", x2: \"10\", y1: \"4\", y2: \"4\", key: \"15jd3p\" }],\n [\"line\", { x1: \"14\", x2: \"5\", y1: \"20\", y2: \"20\", key: \"bu0au3\" }],\n [\"line\", { x1: \"15\", x2: \"9\", y1: \"4\", y2: \"20\", key: \"uljnxc\" }]\n];\nconst Italic = createLucideIcon(\"italic\", __iconNode);\n\nexport { __iconNode, Italic as default };\n//# sourceMappingURL=italic.mjs.map\n","/**\n * @license lucide-react v1.27.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\", key: \"1cjeqo\" }],\n [\"path\", { d: \"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\", key: \"19qd67\" }]\n];\nconst Link = createLucideIcon(\"link\", __iconNode);\n\nexport { __iconNode, Link as default };\n//# sourceMappingURL=link.mjs.map\n","/**\n * @license lucide-react v1.27.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"m15 14 5-5-5-5\", key: \"12vg1m\" }],\n [\"path\", { d: \"M20 9H9.5A5.5 5.5 0 0 0 4 14.5A5.5 5.5 0 0 0 9.5 20H13\", key: \"6uklza\" }]\n];\nconst Redo2 = createLucideIcon(\"redo-2\", __iconNode);\n\nexport { __iconNode, Redo2 as default };\n//# sourceMappingURL=redo-2.mjs.map\n","/**\n * @license lucide-react v1.27.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 4v16\", key: \"1654pz\" }],\n [\"path\", { d: \"M4 7V5a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v2\", key: \"e0r10z\" }],\n [\"path\", { d: \"M9 20h6\", key: \"s66wpe\" }]\n];\nconst Type = createLucideIcon(\"type\", __iconNode);\n\nexport { __iconNode, Type as default };\n//# sourceMappingURL=type.mjs.map\n","/**\n * @license lucide-react v1.27.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M6 4v6a6 6 0 0 0 12 0V4\", key: \"9kb039\" }],\n [\"line\", { x1: \"4\", x2: \"20\", y1: \"20\", y2: \"20\", key: \"nun2al\" }]\n];\nconst Underline = createLucideIcon(\"underline\", __iconNode);\n\nexport { __iconNode, Underline as default };\n//# sourceMappingURL=underline.mjs.map\n","/**\n * @license lucide-react v1.27.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M9 14 4 9l5-5\", key: \"102s5s\" }],\n [\"path\", { d: \"M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11\", key: \"f3b9sd\" }]\n];\nconst Undo2 = createLucideIcon(\"undo-2\", __iconNode);\n\nexport { __iconNode, Undo2 as default };\n//# sourceMappingURL=undo-2.mjs.map\n","import {\n Bold,\n ChevronDown,\n Expand,\n HelpCircle,\n Italic,\n Link,\n List,\n MoreHorizontal,\n Paperclip,\n Redo2,\n Sparkles,\n Table,\n Type,\n Underline,\n Undo2,\n} from 'lucide-react';\nimport * as React from 'react';\nimport { Label } from '@/components/ui/label';\nimport { Separator } from '@/components/ui/separator';\nimport { Textarea as TextareaBase } from '@/components/ui/textarea';\nimport { Toggle } from '@/components/ui/toggle';\nimport { cn } from '@/lib/utils';\n\nconst DEFAULT_MAX_LENGTH = 3000;\n\nfunction getMaxLength(maxLength: number): number {\n return Number.isFinite(maxLength) && maxLength >= 0\n ? Math.floor(maxLength)\n : DEFAULT_MAX_LENGTH;\n}\n\nfunction getCharCount(charCount: number | undefined, fallback: number): number {\n return typeof charCount === 'number' &&\n Number.isFinite(charCount) &&\n charCount >= 0\n ? Math.floor(charCount)\n : fallback;\n}\n\n// ---------------------------------------------------------------------------\n// RichTextarea Toolbar Button\n// ---------------------------------------------------------------------------\n\ninterface ToolbarButtonProps\n extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'value'> {\n icon: React.ReactNode;\n pressed?: boolean;\n hasDropdown?: boolean;\n}\n\nconst ToolbarButton = React.forwardRef<HTMLButtonElement, ToolbarButtonProps>(\n ({ icon, pressed, hasDropdown, className, ...props }, ref) => {\n if (hasDropdown) {\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-haspopup=\"true\"\n className={cn(\n 'group/dropdown inline-flex h-8 items-center justify-center gap-1 rounded px-1.5 py-1 text-foreground transition-[color,background-color,transform] duration-200 ease-smooth motion-reduce:transition-none',\n 'hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n 'active:scale-95 motion-reduce:active:scale-100',\n 'disabled:pointer-events-none disabled:opacity-50',\n pressed && 'bg-muted',\n className,\n )}\n {...props}\n >\n <span className=\"[&>svg]:size-4\">{icon}</span>\n <ChevronDown className=\"size-4 text-muted-foreground transition-transform duration-200 ease-smooth motion-reduce:transition-none group-hover/dropdown:translate-y-0.5\" />\n </button>\n );\n }\n\n return (\n <Toggle\n ref={ref}\n pressed={pressed}\n size=\"sm\"\n className={className}\n disabled={props.disabled}\n onClick={props.onClick}\n aria-label={props['aria-label']}\n >\n <span className=\"[&>svg]:size-5\">{icon}</span>\n </Toggle>\n );\n },\n);\n\nToolbarButton.displayName = 'ToolbarButton';\n\n// ---------------------------------------------------------------------------\n// RichTextarea Toolbar Divider\n// ---------------------------------------------------------------------------\n\nfunction ToolbarDivider() {\n return (\n <Separator\n orientation=\"vertical\"\n className=\"mx-0.5 h-5 w-px bg-surface-2\"\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// RichTextarea Toolbar\n// ---------------------------------------------------------------------------\n\nexport interface RichTextareaToolbarProps {\n className?: string;\n /** Called when AI assist button is clicked */\n onAiAssist?: () => void;\n /** Called when undo is clicked */\n onUndo?: () => void;\n /** Called when redo is clicked */\n onRedo?: () => void;\n /** Called when expand/fullscreen button is clicked */\n onExpand?: () => void;\n /** Show AI assist button */\n showAiAssist?: boolean;\n /** Show expand button */\n showExpand?: boolean;\n /** Disabled state */\n disabled?: boolean;\n /** RTL mode */\n rtl?: boolean;\n /** Formatting state */\n formatting?: {\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n };\n /** Formatting callbacks */\n onFormatChange?: (format: 'bold' | 'italic' | 'underline') => void;\n}\n\nfunction RichTextareaToolbar({\n className,\n onAiAssist,\n onUndo,\n onRedo,\n onExpand,\n showAiAssist = true,\n showExpand = true,\n disabled,\n rtl,\n formatting = {},\n onFormatChange,\n}: RichTextareaToolbarProps) {\n return (\n <div\n data-slot=\"rich-textarea-toolbar\"\n role=\"toolbar\"\n aria-label=\"Formatting toolbar\"\n className={cn(\n 'flex flex-wrap items-center gap-2 rounded-t-xl border border-input border-b-0 bg-muted/30 p-2 transition-[border-color] duration-200 ease-smooth motion-reduce:transition-none group-has-[:focus-visible]/editor:border-ring group-has-[[aria-invalid=true]]/editor:border-destructive',\n rtl && 'flex-row-reverse',\n className,\n )}\n dir={rtl ? 'rtl' : 'ltr'}\n >\n {/* AI Assist */}\n {showAiAssist && (\n <>\n <ToolbarButton\n icon={\n <Sparkles className=\"size-5 text-primary transition-transform duration-300 ease-smooth motion-reduce:transition-none group-hover/toggle:rotate-12\" />\n }\n onClick={onAiAssist}\n disabled={disabled}\n aria-label=\"AI Assist\"\n />\n <ToolbarDivider />\n </>\n )}\n\n {/* Undo/Redo */}\n <div className=\"flex items-center gap-2\">\n <ToolbarButton\n icon={<Undo2 />}\n onClick={onUndo}\n disabled={disabled}\n aria-label=\"Undo\"\n />\n <ToolbarButton\n icon={<Redo2 />}\n onClick={onRedo}\n disabled={disabled}\n aria-label=\"Redo\"\n />\n </div>\n\n <ToolbarDivider />\n\n {/* Text formatting dropdown */}\n <ToolbarButton\n icon={<Type />}\n hasDropdown\n disabled={disabled}\n aria-label=\"Text formatting\"\n />\n\n {/* Text color dropdown */}\n <ToolbarButton\n icon={\n <span className=\"relative\">\n <span className=\"text-sm font-bold\">A</span>\n <span className=\"absolute bottom-0 left-0 right-0 h-0.5 bg-foreground\" />\n </span>\n }\n hasDropdown\n disabled={disabled}\n aria-label=\"Text color\"\n />\n\n {/* Bold/Italic/Underline */}\n <ToolbarButton\n icon={<Bold />}\n pressed={formatting.bold}\n onClick={() => onFormatChange?.('bold')}\n disabled={disabled}\n aria-label=\"Bold\"\n />\n <ToolbarButton\n icon={<Italic />}\n pressed={formatting.italic}\n onClick={() => onFormatChange?.('italic')}\n disabled={disabled}\n aria-label=\"Italic\"\n />\n <ToolbarButton\n icon={<Underline />}\n pressed={formatting.underline}\n onClick={() => onFormatChange?.('underline')}\n disabled={disabled}\n aria-label=\"Underline\"\n />\n\n {/* List dropdown */}\n <ToolbarButton\n icon={<List />}\n hasDropdown\n disabled={disabled}\n aria-label=\"List options\"\n />\n\n <ToolbarDivider />\n\n {/* Link */}\n <ToolbarButton\n icon={<Link />}\n disabled={disabled}\n aria-label=\"Insert link\"\n />\n\n {/* Table dropdown */}\n <ToolbarButton\n icon={<Table />}\n hasDropdown\n disabled={disabled}\n aria-label=\"Table options\"\n />\n\n {/* Attachment */}\n <ToolbarButton\n icon={<Paperclip />}\n disabled={disabled}\n aria-label=\"Attach file\"\n />\n\n {/* More options */}\n <ToolbarButton\n icon={<MoreHorizontal />}\n disabled={disabled}\n aria-label=\"More options\"\n />\n\n {/* Expand */}\n {showExpand && (\n <ToolbarButton\n icon={\n <Expand className=\"transition-transform duration-200 ease-smooth motion-reduce:transition-none group-hover/toggle:scale-110\" />\n }\n onClick={onExpand}\n disabled={disabled}\n aria-label=\"Expand\"\n className=\"ms-auto\"\n />\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// RichTextarea Component\n// ---------------------------------------------------------------------------\n\nexport interface RichTextareaProps\n extends Omit<React.ComponentProps<typeof TextareaBase>, 'children'> {\n /** Label text displayed above the editor */\n label?: string;\n /** Hint text displayed below the editor */\n hint?: string;\n /** Error message displayed below the editor */\n error?: string;\n /** Show required indicator */\n required?: boolean;\n /** Show help icon next to label */\n showHelpIcon?: boolean;\n /** Callback when help icon is clicked */\n onHelpClick?: () => void;\n /** Show character count */\n showCharCount?: boolean;\n /** Maximum character count */\n maxLength?: number;\n /** Current character count (controlled) */\n charCount?: number;\n /** Show resize handle */\n showResizeHandle?: boolean;\n /** Show AI assist button in toolbar */\n showAiAssist?: boolean;\n /** Show expand button in toolbar */\n showExpand?: boolean;\n /** Called when AI assist button is clicked */\n onAiAssist?: () => void;\n /** Called when undo is clicked */\n onUndo?: () => void;\n /** Called when redo is clicked */\n onRedo?: () => void;\n /** Called when expand button is clicked */\n onExpand?: () => void;\n /** RTL mode */\n rtl?: boolean;\n /** Formatting state */\n formatting?: {\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n };\n /** Formatting callbacks */\n onFormatChange?: (format: 'bold' | 'italic' | 'underline') => void;\n}\n\nconst RichTextarea = React.forwardRef<HTMLTextAreaElement, RichTextareaProps>(\n (\n {\n label,\n hint,\n error,\n required,\n showHelpIcon,\n onHelpClick,\n showCharCount,\n maxLength = DEFAULT_MAX_LENGTH,\n charCount,\n showResizeHandle = true,\n showAiAssist = true,\n showExpand = true,\n onAiAssist,\n onUndo,\n onRedo,\n onExpand,\n rtl,\n formatting,\n onFormatChange,\n className,\n disabled,\n id,\n value,\n defaultValue,\n onChange,\n ...props\n },\n ref,\n ) => {\n const generatedId = React.useId();\n const textareaId = id || generatedId;\n const hintId = `${textareaId}-hint`;\n const errorId = `${textareaId}-error`;\n\n // Track character count internally if not controlled\n const [internalValue, setInternalValue] = React.useState(\n defaultValue?.toString() || '',\n );\n const currentValue = value !== undefined ? value.toString() : internalValue;\n const safeMaxLength = getMaxLength(maxLength);\n const currentCharCount = getCharCount(charCount, currentValue.length);\n const isNearLimit = currentCharCount >= safeMaxLength * 0.9;\n const isApproachingLimit = currentCharCount >= safeMaxLength * 0.75;\n let describedById: string | undefined;\n if (error) {\n describedById = errorId;\n } else if (hint) {\n describedById = hintId;\n }\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n if (value === undefined) {\n setInternalValue(e.target.value);\n }\n onChange?.(e);\n };\n\n const isDestructive = !!error;\n\n return (\n <div\n data-slot=\"rich-textarea\"\n className={cn('flex flex-col gap-1.5 w-full', rtl && 'text-right')}\n dir={rtl ? 'rtl' : 'ltr'}\n >\n {/* Label */}\n {label && (\n <div\n className={cn(\n 'flex items-center gap-0.5',\n rtl && 'flex-row-reverse',\n )}\n >\n <Label\n htmlFor={textareaId}\n className=\"text-sm font-medium leading-5 text-secondary-foreground\"\n >\n {label}\n </Label>\n {required && (\n <span\n className=\"text-sm font-medium leading-5 text-destructive\"\n aria-hidden=\"true\"\n >\n *\n </span>\n )}\n {showHelpIcon && (\n <button\n type=\"button\"\n onClick={onHelpClick}\n className=\"text-muted-foreground hover:text-secondary-foreground transition-colors duration-200 ease-smooth motion-reduce:transition-none focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded-full\"\n aria-label=\"Help\"\n >\n <HelpCircle className=\"size-4\" />\n </button>\n )}\n </div>\n )}\n\n {/* Toolbar + Textarea (gapless for connected borders) */}\n <div data-slot=\"rich-textarea-control\" className=\"group/editor\">\n <RichTextareaToolbar\n onAiAssist={onAiAssist}\n onUndo={onUndo}\n onRedo={onRedo}\n onExpand={onExpand}\n showAiAssist={showAiAssist}\n showExpand={showExpand}\n disabled={disabled}\n rtl={rtl}\n formatting={formatting}\n onFormatChange={onFormatChange}\n />\n\n <TextareaBase\n ref={ref}\n data-slot=\"rich-textarea-editor\"\n id={textareaId}\n value={value}\n defaultValue={defaultValue}\n onChange={handleChange}\n disabled={disabled}\n aria-invalid={isDestructive}\n aria-required={required || undefined}\n aria-describedby={describedById}\n maxLength={safeMaxLength}\n className={cn(\n 'min-h-30 rounded-t-none border-t-0',\n isDestructive &&\n 'border-destructive focus-visible:border-destructive focus-visible:ring-destructive/20',\n !showResizeHandle && 'resize-none',\n rtl && 'text-right',\n className,\n )}\n dir={rtl ? 'rtl' : 'ltr'}\n {...props}\n />\n </div>\n\n {/* Hint/Error and Character Count */}\n <div\n className={cn(\n 'flex items-start gap-4 text-sm leading-5',\n rtl ? 'flex-row-reverse' : 'justify-between',\n )}\n >\n {/* Hint or error */}\n <div className=\"flex-1\">\n {error ? (\n <p\n id={errorId}\n className=\"text-destructive animate-in fade-in-0 slide-in-from-top-1 duration-200 motion-reduce:animate-none\"\n >\n {error}\n </p>\n ) : hint ? (\n <p id={hintId} className=\"text-muted-foreground\">\n {hint}\n </p>\n ) : null}\n </div>\n\n {/* Character count — only announces via aria-live when near the limit (≥90%) */}\n {showCharCount && (\n <span\n role={isNearLimit ? 'status' : undefined}\n aria-live={isNearLimit ? 'polite' : 'off'}\n className={cn(\n 'whitespace-nowrap transition-colors duration-300 ease-out motion-reduce:transition-none',\n isNearLimit\n ? 'text-destructive font-medium'\n : isApproachingLimit\n ? 'text-secondary-foreground'\n : 'text-muted-foreground',\n rtl && 'text-start',\n )}\n >\n {currentCharCount}/{safeMaxLength}\n </span>\n )}\n </div>\n </div>\n );\n },\n);\n\nRichTextarea.displayName = 'RichTextarea';\n\nexport { RichTextarea, RichTextareaToolbar, ToolbarButton, ToolbarDivider };\n","/**\n * Web Component wrapper for RichTextarea\n * Custom element: <hf-rich-textarea>\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 { RichTextarea } from '../components/molecules/forms/RichTextarea';\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 onHelpClick: (value: unknown) => {\n const CustomEventConstructor =\n element.ownerDocument.defaultView?.CustomEvent ?? CustomEvent;\n element.dispatchEvent(new CustomEventConstructor('help-click', {\n detail: value,\n bubbles: true,\n composed: true\n }));\n },\n onAiAssist: (value: unknown) => {\n const CustomEventConstructor =\n element.ownerDocument.defaultView?.CustomEvent ?? CustomEvent;\n element.dispatchEvent(new CustomEventConstructor('ai-assist', {\n detail: value,\n bubbles: true,\n composed: true\n }));\n },\n onUndo: (value: unknown) => {\n const CustomEventConstructor =\n element.ownerDocument.defaultView?.CustomEvent ?? CustomEvent;\n element.dispatchEvent(new CustomEventConstructor('undo', {\n detail: value,\n bubbles: true,\n composed: true\n }));\n },\n onRedo: (value: unknown) => {\n const CustomEventConstructor =\n element.ownerDocument.defaultView?.CustomEvent ?? CustomEvent;\n element.dispatchEvent(new CustomEventConstructor('redo', {\n detail: value,\n bubbles: true,\n composed: true\n }));\n },\n onExpand: (value: unknown) => {\n const CustomEventConstructor =\n element.ownerDocument.defaultView?.CustomEvent ?? CustomEvent;\n element.dispatchEvent(new CustomEventConstructor('expand', {\n detail: value,\n bubbles: true,\n composed: true\n }));\n },\n onFormatChange: (value: unknown) => {\n const CustomEventConstructor =\n element.ownerDocument.defaultView?.CustomEvent ?? CustomEvent;\n element.dispatchEvent(new CustomEventConstructor('format-change', {\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 RichTextareaWrapper(props: React.ComponentProps<typeof RichTextarea> & { _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(RichTextarea, { ...restProps, ...eventHandlers });\n}\n\n/**\n * Prop type definitions for attribute parsing\n */\nconst propTypes: PropDefs = {\n label: 'string',\n hint: 'string',\n error: 'string',\n required: 'boolean',\n showHelpIcon: 'boolean',\n showCharCount: 'boolean',\n maxLength: 'number',\n charCount: 'number',\n showResizeHandle: 'boolean',\n showAiAssist: 'boolean',\n showExpand: 'boolean',\n rtl: 'boolean',\n formatting: 'json'\n};\n\nclass RichTextareaWC 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) 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 RichTextareaWrapper,\n { ...props, _hostElement: this },\n );\n\n this._root.render(element);\n }\n}\n\nfor (const propName of Object.keys(propTypes)) {\n Object.defineProperty(RichTextareaWC.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-rich-textarea')) {\n customElements.define('hf-rich-textarea', RichTextareaWC);\n}\n\nexport { RichTextareaWC };\nexport default RichTextareaWC;\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7],"mappings":"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"}
|
|
@@ -41,10 +41,10 @@ var H = _("flex items-center justify-center shrink-0 size-[38px] font-medium tex
|
|
|
41
41
|
variants: { status: {
|
|
42
42
|
complete: "text-card-foreground",
|
|
43
43
|
active: "text-card-foreground",
|
|
44
|
-
incomplete: "text-
|
|
44
|
+
incomplete: "text-secondary-foreground"
|
|
45
45
|
} },
|
|
46
46
|
defaultVariants: { status: "incomplete" }
|
|
47
|
-
}), Z = _("text-sm leading-5 text-
|
|
47
|
+
}), Z = _("text-sm leading-5 text-secondary-foreground"), [F, X] = L("Steps"), w = l.createContext(0);
|
|
48
48
|
function q({ index: e, status: t, shape: r, bulletType: o }) {
|
|
49
49
|
return o === "icon" ? t === "complete" ? /* @__PURE__ */ n(D, { className: "size-[22px] delight-check-draw" }) : t === "active" ? /* @__PURE__ */ n("div", { className: c("size-5 bg-primary", r === "rounded" ? "rounded-sm" : "rounded-full") }) : /* @__PURE__ */ n("div", { className: "size-1.5 rounded-full bg-current" }) : e + 1;
|
|
50
50
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hf-steps.js","names":[],"sources":["../../src/components/organisms/content/Steps/Steps.tsx","../../src/wc/hf-steps.ts"],"sourcesContent":["import { cva } from 'class-variance-authority';\nimport { Check } from 'lucide-react';\nimport * as React from 'react';\nimport { createSafeContext } from '@/lib/create-safe-context';\nimport { cn, extractText } from '@/lib/utils';\n\n/* -----------------------------------------------------------------------------\n * Types\n * -------------------------------------------------------------------------- */\n\nexport type StepStatus = 'complete' | 'active' | 'incomplete';\n\nexport interface StepData {\n label: string;\n subtext?: string;\n}\n\nexport interface StepsProps {\n /** Steps data for flat API */\n steps?: StepData[];\n /** Current step index (0-based) for flat API */\n currentStep?: number;\n /** Orientation of the steps */\n orientation?: 'horizontal' | 'vertical';\n /** Shape of step indicators */\n shape?: 'rounded' | 'round';\n /** Type of bullet content */\n bulletType?: 'text' | 'icon';\n /** Callback when a step is clicked */\n onStepClick?: (index: number) => void;\n /** Children for compound API */\n children?: React.ReactNode;\n /** Additional className */\n className?: string;\n}\n\nexport interface StepsItemProps {\n /** Override auto-calculated status */\n status?: StepStatus;\n /** Click handler for this step */\n onClick?: () => void;\n /** Step label content */\n children: React.ReactNode;\n /** Additional className */\n className?: string;\n}\n\nexport interface StepsSubtextProps {\n children: React.ReactNode;\n className?: string;\n}\n\n/* -----------------------------------------------------------------------------\n * Variants\n * -------------------------------------------------------------------------- */\n\nconst stepIndicatorVariants = cva(\n 'flex items-center justify-center shrink-0 size-[38px] font-medium text-lg transition-all duration-200 ease-out motion-reduce:transition-none',\n {\n variants: {\n shape: {\n rounded: 'rounded-lg',\n round: 'rounded-full',\n },\n status: {\n complete: 'bg-primary text-primary-foreground shadow-sm',\n active: 'bg-background border-2 border-primary text-primary shadow-sm',\n incomplete: 'bg-accent text-muted-foreground',\n },\n },\n defaultVariants: {\n shape: 'rounded',\n status: 'incomplete',\n },\n },\n);\n\nconst stepConnectorVariants = cva(\n 'shrink-0 transition-colors duration-200 ease-out motion-reduce:transition-none',\n {\n variants: {\n orientation: {\n // Horizontal: fluid width fills available space; mt-[18px] centers 2px line with 38px indicator\n horizontal: 'h-0.5 flex-1 min-w-4 mx-2 mt-[18px]',\n // Vertical: fixed size, centered under 38px indicator\n vertical: 'w-0.5 h-[30px] my-1 ml-[18px]',\n },\n status: {\n complete: 'bg-primary',\n incomplete: 'bg-border',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n status: 'incomplete',\n },\n },\n);\n\nconst stepLabelVariants = cva('text-base leading-6', {\n variants: {\n status: {\n complete: 'text-card-foreground',\n active: 'text-card-foreground',\n incomplete: 'text-muted-foreground',\n },\n },\n defaultVariants: {\n status: 'incomplete',\n },\n});\n\nconst stepSubtextVariants = cva('text-sm leading-5 text-muted-foreground');\n\n/* -----------------------------------------------------------------------------\n * Context\n * -------------------------------------------------------------------------- */\n\ninterface StepsContextValue {\n orientation: 'horizontal' | 'vertical';\n shape: 'rounded' | 'round';\n bulletType: 'text' | 'icon';\n onStepClick?: (index: number) => void;\n getStepStatus: (index: number) => StepStatus;\n}\n\nconst [StepsContext, useStepsContext] =\n createSafeContext<StepsContextValue>('Steps');\n\n/** Per-item index context — injected by Steps parent via Children.map or flat API */\nconst StepIndexContext = React.createContext<number>(0);\n\n/* -----------------------------------------------------------------------------\n * Sub-components\n * -------------------------------------------------------------------------- */\n\ninterface StepIndicatorProps {\n index: number;\n status: StepStatus;\n shape: 'rounded' | 'round';\n bulletType: 'text' | 'icon';\n}\n\nfunction StepIndicatorContent({\n index,\n status,\n shape,\n bulletType,\n}: StepIndicatorProps) {\n if (bulletType === 'icon') {\n if (status === 'complete') {\n return <Check className=\"size-[22px] delight-check-draw\" />;\n }\n if (status === 'active') {\n return (\n <div\n className={cn(\n 'size-5 bg-primary',\n shape === 'rounded' ? 'rounded-sm' : 'rounded-full',\n )}\n />\n );\n }\n\n return <div className=\"size-1.5 rounded-full bg-current\" />;\n }\n\n return index + 1;\n}\n\nfunction StepIndicator({\n index,\n status,\n shape,\n bulletType,\n}: StepIndicatorProps) {\n return (\n <div\n data-slot=\"steps-indicator\"\n aria-hidden=\"true\"\n className={cn(\n stepIndicatorVariants({ shape, status }),\n status === 'complete' && 'delight-check-bounce',\n status === 'active' && 'delight-pulse-once',\n )}\n >\n <StepIndicatorContent\n index={index}\n status={status}\n shape={shape}\n bulletType={bulletType}\n />\n </div>\n );\n}\n\nStepIndicator.displayName = 'StepIndicator';\n\ninterface StepConnectorProps {\n orientation: 'horizontal' | 'vertical';\n isComplete: boolean;\n}\n\nfunction StepConnector({ orientation, isComplete }: StepConnectorProps) {\n return (\n <div\n data-slot=\"steps-connector\"\n aria-hidden=\"true\"\n className={cn(\n stepConnectorVariants({\n orientation,\n status: isComplete ? 'complete' : 'incomplete',\n }),\n isComplete && 'delight-connector-fill',\n )}\n />\n );\n}\n\nStepConnector.displayName = 'StepConnector';\n\nfunction StepsSubtext({ children, className }: StepsSubtextProps) {\n return (\n <span\n data-slot=\"steps-subtext\"\n className={cn(stepSubtextVariants(), className)}\n >\n {children}\n </span>\n );\n}\n\nStepsSubtext.displayName = 'Steps.Subtext';\n\nfunction StepsItem({\n status: statusOverride,\n onClick,\n children,\n className,\n}: StepsItemProps) {\n const ctx = useStepsContext();\n const index = React.useContext(StepIndexContext);\n const status = statusOverride ?? ctx.getStepStatus(index);\n const isFirst = index === 0;\n const handleClick =\n onClick ?? (ctx.onStepClick ? () => ctx.onStepClick?.(index) : undefined);\n\n // Extract subtext from children\n let label: React.ReactNode = null;\n let subtext: React.ReactNode = null;\n\n React.Children.forEach(children, (child) => {\n if (React.isValidElement(child) && child.type === StepsSubtext) {\n subtext = child;\n } else if (child != null && child !== false) {\n label = child;\n }\n });\n\n // Connector colored based on previous step's completion (source step, not destination)\n const prevStepStatus = !isFirst ? ctx.getStepStatus(index - 1) : undefined;\n const connector = !isFirst && (\n <StepConnector\n orientation={ctx.orientation}\n isComplete={prevStepStatus === 'complete'}\n />\n );\n\n const isHorizontal = ctx.orientation === 'horizontal';\n\n // Build indicator element\n const indicator = (\n <StepIndicator\n index={index}\n status={status}\n shape={ctx.shape}\n bulletType={ctx.bulletType}\n />\n );\n\n // Build label element\n // In horizontal mode, w-0 ensures the label doesn't affect the indicator column width.\n // The text overflows visually (centered under the 38px indicator) but the layout\n // width stays fixed, keeping all connectors equally spaced (matching Figma spec).\n const labelElement = (\n <div\n data-slot=\"steps-label\"\n className={cn(\n 'flex flex-col',\n isHorizontal\n ? 'items-center gap-0.5 text-center w-0 whitespace-nowrap'\n : 'items-start gap-0.5 ml-2.5',\n )}\n >\n <span className={stepLabelVariants({ status })}>{label}</span>\n {subtext}\n </div>\n );\n\n // Layout differs by orientation:\n // - Horizontal: connector + (indicator column), items-start so indicators align at top\n // - Vertical: connector above, indicator + label in row\n const content = isHorizontal ? (\n <div className=\"flex w-full items-start\">\n {connector}\n <div className=\"flex flex-col items-center\">\n {indicator}\n {labelElement}\n </div>\n </div>\n ) : (\n <div className=\"flex flex-col items-start\">\n {connector}\n <div className=\"flex items-center\">\n {indicator}\n {labelElement}\n </div>\n </div>\n );\n\n const labelText = React.useMemo(() => extractText(label), [label]);\n const statusSuffix =\n status === 'complete'\n ? ', completed'\n : status === 'active'\n ? ', current'\n : '';\n\n return (\n <li\n data-slot=\"steps-item\"\n aria-current={status === 'active' ? 'step' : undefined}\n aria-label={\n !handleClick && labelText\n ? `Step ${index + 1}: ${labelText}${statusSuffix}`\n : undefined\n }\n className={cn(\n isHorizontal && !isFirst && 'flex-1',\n !handleClick && className,\n )}\n >\n {handleClick ? (\n <button\n type=\"button\"\n onClick={handleClick}\n aria-label={`Step ${index + 1}: ${labelText || ''}${statusSuffix}`}\n className={cn(\n 'cursor-pointer',\n isHorizontal && 'w-full',\n className,\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2 focus-visible:ring-offset-background rounded-sm',\n )}\n >\n {content}\n </button>\n ) : (\n content\n )}\n </li>\n );\n}\n\nStepsItem.displayName = 'Steps.Item';\n\n/* -----------------------------------------------------------------------------\n * Main Component\n * -------------------------------------------------------------------------- */\n\n/**\n * Steps displays a multi-step progress indicator for wizards and workflows.\n * Supports horizontal/vertical orientation, numbered or icon bullets, and clickable steps.\n *\n * @llms Wizard/workflow progress with horizontal/vertical layout, numbered or icon steps\n * @example\n * ```tsx\n * <Steps\n * steps={[{ label: 'Details' }, { label: 'Payment' }, { label: 'Confirm' }]}\n * currentStep={1}\n * orientation=\"horizontal\"\n * />\n * ```\n */\nfunction Steps({\n steps,\n currentStep = 0,\n orientation = 'horizontal',\n shape = 'rounded',\n bulletType = 'text',\n onStepClick,\n children,\n className,\n}: StepsProps) {\n const getStepStatus = React.useCallback(\n (index: number): StepStatus => {\n if (index < currentStep) return 'complete';\n if (index === currentStep) return 'active';\n return 'incomplete';\n },\n [currentStep],\n );\n\n const contextValue = React.useMemo<StepsContextValue>(\n () => ({\n orientation,\n shape,\n bulletType,\n onStepClick,\n getStepStatus,\n }),\n [orientation, shape, bulletType, onStepClick, getStepStatus],\n );\n\n // Determine if using flat API or compound API\n const useCompoundAPI = !steps && React.Children.count(children) > 0;\n\n const renderFlatAPI = () => {\n if (!steps || steps.length === 0) return null;\n\n return steps.map((step, index) => (\n <StepIndexContext.Provider key={`${index}-${step.label}`} value={index}>\n <StepsItem>\n {step.label}\n {step.subtext && <StepsSubtext>{step.subtext}</StepsSubtext>}\n </StepsItem>\n </StepIndexContext.Provider>\n ));\n };\n\n const renderCompoundAPI = () => {\n return React.Children.map(children, (child, index) => (\n <StepIndexContext.Provider value={index}>\n {child}\n </StepIndexContext.Provider>\n ));\n };\n\n return (\n <StepsContext.Provider value={contextValue}>\n <nav\n aria-label=\"Progress steps\"\n data-slot=\"steps\"\n // biome-ignore lint/a11y/noNoninteractiveTabindex: Focusable scroll region satisfies axe scrollable-region-focusable.\n tabIndex={0}\n className={cn(\n 'overflow-x-auto focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring',\n className,\n )}\n >\n <ol\n data-slot=\"steps-list\"\n className={cn(\n 'flex',\n orientation === 'horizontal'\n ? 'flex-row items-start px-4'\n : 'flex-col items-start',\n )}\n >\n {useCompoundAPI ? renderCompoundAPI() : renderFlatAPI()}\n </ol>\n </nav>\n </StepsContext.Provider>\n );\n}\n\nSteps.displayName = 'Steps';\n\n/* -----------------------------------------------------------------------------\n * Compound Export\n * -------------------------------------------------------------------------- */\n\n/**\n * @llms Wizard/workflow progress with horizontal/vertical layout, numbered or icon steps\n */\nexport const StepsCompound = Object.assign(Steps, {\n Item: StepsItem,\n Subtext: StepsSubtext,\n});\n\nexport {\n StepsCompound as Steps,\n StepsItem,\n StepsSubtext,\n stepConnectorVariants,\n stepIndicatorVariants,\n stepLabelVariants,\n stepSubtextVariants,\n};\n","/**\n * Web Component wrapper for Steps\n * Custom element: <hf-steps>\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 { Steps } from '../components/organisms/content/Steps';\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 onStepClick: (index: number) => {\n const CustomEventConstructor =\n element.ownerDocument.defaultView?.CustomEvent ?? CustomEvent;\n element.dispatchEvent(new CustomEventConstructor('step-click', {\n detail: index,\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 StepsWrapper(props: React.ComponentProps<typeof Steps> & { _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(Steps, { ...restProps, ...eventHandlers });\n}\n\n/**\n * Prop type definitions for attribute parsing\n */\nconst propTypes: PropDefs = {\n steps: 'json',\n currentStep: 'number',\n orientation: 'string',\n shape: 'string',\n bulletType: 'string',\n className: 'string'\n};\n\nclass StepsWC 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 StepsWrapper,\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(StepsWC.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-steps')) {\n customElements.define('hf-steps', StepsWC);\n}\n\nexport { StepsWC };\nexport default StepsWC;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hf-steps.js","names":[],"sources":["../../src/components/organisms/content/Steps/Steps.tsx","../../src/wc/hf-steps.ts"],"sourcesContent":["import { cva } from 'class-variance-authority';\nimport { Check } from 'lucide-react';\nimport * as React from 'react';\nimport { createSafeContext } from '@/lib/create-safe-context';\nimport { cn, extractText } from '@/lib/utils';\n\n/* -----------------------------------------------------------------------------\n * Types\n * -------------------------------------------------------------------------- */\n\nexport type StepStatus = 'complete' | 'active' | 'incomplete';\n\nexport interface StepData {\n label: string;\n subtext?: string;\n}\n\nexport interface StepsProps {\n /** Steps data for flat API */\n steps?: StepData[];\n /** Current step index (0-based) for flat API */\n currentStep?: number;\n /** Orientation of the steps */\n orientation?: 'horizontal' | 'vertical';\n /** Shape of step indicators */\n shape?: 'rounded' | 'round';\n /** Type of bullet content */\n bulletType?: 'text' | 'icon';\n /** Callback when a step is clicked */\n onStepClick?: (index: number) => void;\n /** Children for compound API */\n children?: React.ReactNode;\n /** Additional className */\n className?: string;\n}\n\nexport interface StepsItemProps {\n /** Override auto-calculated status */\n status?: StepStatus;\n /** Click handler for this step */\n onClick?: () => void;\n /** Step label content */\n children: React.ReactNode;\n /** Additional className */\n className?: string;\n}\n\nexport interface StepsSubtextProps {\n children: React.ReactNode;\n className?: string;\n}\n\n/* -----------------------------------------------------------------------------\n * Variants\n * -------------------------------------------------------------------------- */\n\nconst stepIndicatorVariants = cva(\n 'flex items-center justify-center shrink-0 size-[38px] font-medium text-lg transition-all duration-200 ease-out motion-reduce:transition-none',\n {\n variants: {\n shape: {\n rounded: 'rounded-lg',\n round: 'rounded-full',\n },\n status: {\n complete: 'bg-primary text-primary-foreground shadow-sm',\n active: 'bg-background border-2 border-primary text-primary shadow-sm',\n incomplete: 'bg-accent text-muted-foreground',\n },\n },\n defaultVariants: {\n shape: 'rounded',\n status: 'incomplete',\n },\n },\n);\n\nconst stepConnectorVariants = cva(\n 'shrink-0 transition-colors duration-200 ease-out motion-reduce:transition-none',\n {\n variants: {\n orientation: {\n // Horizontal: fluid width fills available space; mt-[18px] centers 2px line with 38px indicator\n horizontal: 'h-0.5 flex-1 min-w-4 mx-2 mt-[18px]',\n // Vertical: fixed size, centered under 38px indicator\n vertical: 'w-0.5 h-[30px] my-1 ml-[18px]',\n },\n status: {\n complete: 'bg-primary',\n incomplete: 'bg-border',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n status: 'incomplete',\n },\n },\n);\n\nconst stepLabelVariants = cva('text-base leading-6', {\n variants: {\n status: {\n complete: 'text-card-foreground',\n active: 'text-card-foreground',\n incomplete: 'text-secondary-foreground',\n },\n },\n defaultVariants: {\n status: 'incomplete',\n },\n});\n\nconst stepSubtextVariants = cva('text-sm leading-5 text-secondary-foreground');\n\n/* -----------------------------------------------------------------------------\n * Context\n * -------------------------------------------------------------------------- */\n\ninterface StepsContextValue {\n orientation: 'horizontal' | 'vertical';\n shape: 'rounded' | 'round';\n bulletType: 'text' | 'icon';\n onStepClick?: (index: number) => void;\n getStepStatus: (index: number) => StepStatus;\n}\n\nconst [StepsContext, useStepsContext] =\n createSafeContext<StepsContextValue>('Steps');\n\n/** Per-item index context — injected by Steps parent via Children.map or flat API */\nconst StepIndexContext = React.createContext<number>(0);\n\n/* -----------------------------------------------------------------------------\n * Sub-components\n * -------------------------------------------------------------------------- */\n\ninterface StepIndicatorProps {\n index: number;\n status: StepStatus;\n shape: 'rounded' | 'round';\n bulletType: 'text' | 'icon';\n}\n\nfunction StepIndicatorContent({\n index,\n status,\n shape,\n bulletType,\n}: StepIndicatorProps) {\n if (bulletType === 'icon') {\n if (status === 'complete') {\n return <Check className=\"size-[22px] delight-check-draw\" />;\n }\n if (status === 'active') {\n return (\n <div\n className={cn(\n 'size-5 bg-primary',\n shape === 'rounded' ? 'rounded-sm' : 'rounded-full',\n )}\n />\n );\n }\n\n return <div className=\"size-1.5 rounded-full bg-current\" />;\n }\n\n return index + 1;\n}\n\nfunction StepIndicator({\n index,\n status,\n shape,\n bulletType,\n}: StepIndicatorProps) {\n return (\n <div\n data-slot=\"steps-indicator\"\n aria-hidden=\"true\"\n className={cn(\n stepIndicatorVariants({ shape, status }),\n status === 'complete' && 'delight-check-bounce',\n status === 'active' && 'delight-pulse-once',\n )}\n >\n <StepIndicatorContent\n index={index}\n status={status}\n shape={shape}\n bulletType={bulletType}\n />\n </div>\n );\n}\n\nStepIndicator.displayName = 'StepIndicator';\n\ninterface StepConnectorProps {\n orientation: 'horizontal' | 'vertical';\n isComplete: boolean;\n}\n\nfunction StepConnector({ orientation, isComplete }: StepConnectorProps) {\n return (\n <div\n data-slot=\"steps-connector\"\n aria-hidden=\"true\"\n className={cn(\n stepConnectorVariants({\n orientation,\n status: isComplete ? 'complete' : 'incomplete',\n }),\n isComplete && 'delight-connector-fill',\n )}\n />\n );\n}\n\nStepConnector.displayName = 'StepConnector';\n\nfunction StepsSubtext({ children, className }: StepsSubtextProps) {\n return (\n <span\n data-slot=\"steps-subtext\"\n className={cn(stepSubtextVariants(), className)}\n >\n {children}\n </span>\n );\n}\n\nStepsSubtext.displayName = 'Steps.Subtext';\n\nfunction StepsItem({\n status: statusOverride,\n onClick,\n children,\n className,\n}: StepsItemProps) {\n const ctx = useStepsContext();\n const index = React.useContext(StepIndexContext);\n const status = statusOverride ?? ctx.getStepStatus(index);\n const isFirst = index === 0;\n const handleClick =\n onClick ?? (ctx.onStepClick ? () => ctx.onStepClick?.(index) : undefined);\n\n // Extract subtext from children\n let label: React.ReactNode = null;\n let subtext: React.ReactNode = null;\n\n React.Children.forEach(children, (child) => {\n if (React.isValidElement(child) && child.type === StepsSubtext) {\n subtext = child;\n } else if (child != null && child !== false) {\n label = child;\n }\n });\n\n // Connector colored based on previous step's completion (source step, not destination)\n const prevStepStatus = !isFirst ? ctx.getStepStatus(index - 1) : undefined;\n const connector = !isFirst && (\n <StepConnector\n orientation={ctx.orientation}\n isComplete={prevStepStatus === 'complete'}\n />\n );\n\n const isHorizontal = ctx.orientation === 'horizontal';\n\n // Build indicator element\n const indicator = (\n <StepIndicator\n index={index}\n status={status}\n shape={ctx.shape}\n bulletType={ctx.bulletType}\n />\n );\n\n // Build label element\n // In horizontal mode, w-0 ensures the label doesn't affect the indicator column width.\n // The text overflows visually (centered under the 38px indicator) but the layout\n // width stays fixed, keeping all connectors equally spaced (matching Figma spec).\n const labelElement = (\n <div\n data-slot=\"steps-label\"\n className={cn(\n 'flex flex-col',\n isHorizontal\n ? 'items-center gap-0.5 text-center w-0 whitespace-nowrap'\n : 'items-start gap-0.5 ml-2.5',\n )}\n >\n <span className={stepLabelVariants({ status })}>{label}</span>\n {subtext}\n </div>\n );\n\n // Layout differs by orientation:\n // - Horizontal: connector + (indicator column), items-start so indicators align at top\n // - Vertical: connector above, indicator + label in row\n const content = isHorizontal ? (\n <div className=\"flex w-full items-start\">\n {connector}\n <div className=\"flex flex-col items-center\">\n {indicator}\n {labelElement}\n </div>\n </div>\n ) : (\n <div className=\"flex flex-col items-start\">\n {connector}\n <div className=\"flex items-center\">\n {indicator}\n {labelElement}\n </div>\n </div>\n );\n\n const labelText = React.useMemo(() => extractText(label), [label]);\n const statusSuffix =\n status === 'complete'\n ? ', completed'\n : status === 'active'\n ? ', current'\n : '';\n\n return (\n <li\n data-slot=\"steps-item\"\n aria-current={status === 'active' ? 'step' : undefined}\n aria-label={\n !handleClick && labelText\n ? `Step ${index + 1}: ${labelText}${statusSuffix}`\n : undefined\n }\n className={cn(\n isHorizontal && !isFirst && 'flex-1',\n !handleClick && className,\n )}\n >\n {handleClick ? (\n <button\n type=\"button\"\n onClick={handleClick}\n aria-label={`Step ${index + 1}: ${labelText || ''}${statusSuffix}`}\n className={cn(\n 'cursor-pointer',\n isHorizontal && 'w-full',\n className,\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2 focus-visible:ring-offset-background rounded-sm',\n )}\n >\n {content}\n </button>\n ) : (\n content\n )}\n </li>\n );\n}\n\nStepsItem.displayName = 'Steps.Item';\n\n/* -----------------------------------------------------------------------------\n * Main Component\n * -------------------------------------------------------------------------- */\n\n/**\n * Steps displays a multi-step progress indicator for wizards and workflows.\n * Supports horizontal/vertical orientation, numbered or icon bullets, and clickable steps.\n *\n * @llms Wizard/workflow progress with horizontal/vertical layout, numbered or icon steps\n * @example\n * ```tsx\n * <Steps\n * steps={[{ label: 'Details' }, { label: 'Payment' }, { label: 'Confirm' }]}\n * currentStep={1}\n * orientation=\"horizontal\"\n * />\n * ```\n */\nfunction Steps({\n steps,\n currentStep = 0,\n orientation = 'horizontal',\n shape = 'rounded',\n bulletType = 'text',\n onStepClick,\n children,\n className,\n}: StepsProps) {\n const getStepStatus = React.useCallback(\n (index: number): StepStatus => {\n if (index < currentStep) return 'complete';\n if (index === currentStep) return 'active';\n return 'incomplete';\n },\n [currentStep],\n );\n\n const contextValue = React.useMemo<StepsContextValue>(\n () => ({\n orientation,\n shape,\n bulletType,\n onStepClick,\n getStepStatus,\n }),\n [orientation, shape, bulletType, onStepClick, getStepStatus],\n );\n\n // Determine if using flat API or compound API\n const useCompoundAPI = !steps && React.Children.count(children) > 0;\n\n const renderFlatAPI = () => {\n if (!steps || steps.length === 0) return null;\n\n return steps.map((step, index) => (\n <StepIndexContext.Provider key={`${index}-${step.label}`} value={index}>\n <StepsItem>\n {step.label}\n {step.subtext && <StepsSubtext>{step.subtext}</StepsSubtext>}\n </StepsItem>\n </StepIndexContext.Provider>\n ));\n };\n\n const renderCompoundAPI = () => {\n return React.Children.map(children, (child, index) => (\n <StepIndexContext.Provider value={index}>\n {child}\n </StepIndexContext.Provider>\n ));\n };\n\n return (\n <StepsContext.Provider value={contextValue}>\n <nav\n aria-label=\"Progress steps\"\n data-slot=\"steps\"\n // biome-ignore lint/a11y/noNoninteractiveTabindex: Focusable scroll region satisfies axe scrollable-region-focusable.\n tabIndex={0}\n className={cn(\n 'overflow-x-auto focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring',\n className,\n )}\n >\n <ol\n data-slot=\"steps-list\"\n className={cn(\n 'flex',\n orientation === 'horizontal'\n ? 'flex-row items-start px-4'\n : 'flex-col items-start',\n )}\n >\n {useCompoundAPI ? renderCompoundAPI() : renderFlatAPI()}\n </ol>\n </nav>\n </StepsContext.Provider>\n );\n}\n\nSteps.displayName = 'Steps';\n\n/* -----------------------------------------------------------------------------\n * Compound Export\n * -------------------------------------------------------------------------- */\n\n/**\n * @llms Wizard/workflow progress with horizontal/vertical layout, numbered or icon steps\n */\nexport const StepsCompound = Object.assign(Steps, {\n Item: StepsItem,\n Subtext: StepsSubtext,\n});\n\nexport {\n StepsCompound as Steps,\n StepsItem,\n StepsSubtext,\n stepConnectorVariants,\n stepIndicatorVariants,\n stepLabelVariants,\n stepSubtextVariants,\n};\n","/**\n * Web Component wrapper for Steps\n * Custom element: <hf-steps>\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 { Steps } from '../components/organisms/content/Steps';\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 onStepClick: (index: number) => {\n const CustomEventConstructor =\n element.ownerDocument.defaultView?.CustomEvent ?? CustomEvent;\n element.dispatchEvent(new CustomEventConstructor('step-click', {\n detail: index,\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 StepsWrapper(props: React.ComponentProps<typeof Steps> & { _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(Steps, { ...restProps, ...eventHandlers });\n}\n\n/**\n * Prop type definitions for attribute parsing\n */\nconst propTypes: PropDefs = {\n steps: 'json',\n currentStep: 'number',\n orientation: 'string',\n shape: 'string',\n bulletType: 'string',\n className: 'string'\n};\n\nclass StepsWC 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 StepsWrapper,\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(StepsWC.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-steps')) {\n customElements.define('hf-steps', StepsWC);\n}\n\nexport { StepsWC };\nexport default StepsWC;\n"],"mappings":"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"}
|