@humain/ui 2.1.62 → 2.1.65

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/dist/components/organisms/ai/AIToolCall/AIToolCall.d.ts +9 -3
  2. package/dist/components/organisms/ai/AIToolRun/index.d.ts +1 -1
  3. package/dist/components/organisms/ai/AIToolRun/validation.d.ts +24 -3
  4. package/dist/components/organisms/ai/_shared/format-ai-duration.d.ts +1 -0
  5. package/dist/components/organisms/ai/_shared/workflow-step-renderer.d.ts +1 -0
  6. package/dist/index.js +52 -52
  7. package/dist/index151.js +1 -1
  8. package/dist/index174.js +10 -333
  9. package/dist/index174.js.map +1 -1
  10. package/dist/index175.js +310 -137
  11. package/dist/index175.js.map +1 -1
  12. package/dist/index176.js +148 -174
  13. package/dist/index176.js.map +1 -1
  14. package/dist/index177.js +186 -78
  15. package/dist/index177.js.map +1 -1
  16. package/dist/index178.js +74 -124
  17. package/dist/index178.js.map +1 -1
  18. package/dist/index179.js +133 -1
  19. package/dist/index179.js.map +1 -0
  20. package/dist/index180.js +2 -201
  21. package/dist/index181.js +201 -0
  22. package/dist/{index180.js.map → index181.js.map} +1 -1
  23. package/dist/index183.js +130 -166
  24. package/dist/index183.js.map +1 -1
  25. package/dist/index184.js +195 -983
  26. package/dist/index184.js.map +1 -1
  27. package/dist/index185.js +1069 -369
  28. package/dist/index185.js.map +1 -1
  29. package/dist/index186.js +395 -197
  30. package/dist/index186.js.map +1 -1
  31. package/dist/index187.js +198 -243
  32. package/dist/index187.js.map +1 -1
  33. package/dist/index188.js +263 -3
  34. package/dist/index188.js.map +1 -1
  35. package/dist/index189.js +3 -209
  36. package/dist/index189.js.map +1 -1
  37. package/dist/index190.js +190 -777
  38. package/dist/index190.js.map +1 -1
  39. package/dist/index191.js +771 -252
  40. package/dist/index191.js.map +1 -1
  41. package/dist/index192.js +250 -65
  42. package/dist/index192.js.map +1 -1
  43. package/dist/index193.js +72 -523
  44. package/dist/index193.js.map +1 -1
  45. package/dist/index194.js +537 -144
  46. package/dist/index194.js.map +1 -1
  47. package/dist/index195.js +139 -720
  48. package/dist/index195.js.map +1 -1
  49. package/dist/index196.js +707 -167
  50. package/dist/index196.js.map +1 -1
  51. package/dist/index197.js +175 -151
  52. package/dist/index197.js.map +1 -1
  53. package/dist/index198.js +152 -487
  54. package/dist/index198.js.map +1 -1
  55. package/dist/index199.js +472 -225
  56. package/dist/index199.js.map +1 -1
  57. package/dist/index200.js +236 -260
  58. package/dist/index200.js.map +1 -1
  59. package/dist/index201.js +265 -215
  60. package/dist/index201.js.map +1 -1
  61. package/dist/index202.js +207 -307
  62. package/dist/index202.js.map +1 -1
  63. package/dist/index203.js +302 -135
  64. package/dist/index203.js.map +1 -1
  65. package/dist/index204.js +140 -271
  66. package/dist/index204.js.map +1 -1
  67. package/dist/index205.js +263 -253
  68. package/dist/index205.js.map +1 -1
  69. package/dist/index206.js +244 -137
  70. package/dist/index206.js.map +1 -1
  71. package/dist/index207.js +100 -238
  72. package/dist/index207.js.map +1 -1
  73. package/dist/index208.js +278 -74
  74. package/dist/index208.js.map +1 -1
  75. package/dist/index209.js +56 -97
  76. package/dist/index209.js.map +1 -1
  77. package/dist/index210.js +142 -47
  78. package/dist/index210.js.map +1 -1
  79. package/dist/index211.js +38 -84
  80. package/dist/index211.js.map +1 -1
  81. package/dist/index212.js +72 -252
  82. package/dist/index212.js.map +1 -1
  83. package/dist/index213.js +274 -26
  84. package/dist/index213.js.map +1 -1
  85. package/dist/index214.js +29 -94
  86. package/dist/index214.js.map +1 -1
  87. package/dist/index215.js +98 -25
  88. package/dist/index215.js.map +1 -1
  89. package/dist/index216.js +20 -565
  90. package/dist/index216.js.map +1 -1
  91. package/dist/index217.js +564 -17
  92. package/dist/index217.js.map +1 -1
  93. package/dist/index218.js +20 -23
  94. package/dist/index218.js.map +1 -1
  95. package/dist/index219.js +20 -95
  96. package/dist/index219.js.map +1 -1
  97. package/dist/index220.js +92 -88
  98. package/dist/index220.js.map +1 -1
  99. package/dist/index221.js +97 -29
  100. package/dist/index221.js.map +1 -1
  101. package/dist/index222.js +24 -470
  102. package/dist/index222.js.map +1 -1
  103. package/dist/index223.js +446 -196
  104. package/dist/index223.js.map +1 -1
  105. package/dist/index224.js +199 -729
  106. package/dist/index224.js.map +1 -1
  107. package/dist/index225.js +750 -61
  108. package/dist/index225.js.map +1 -1
  109. package/dist/index226.js +58 -181
  110. package/dist/index226.js.map +1 -1
  111. package/dist/index227.js +175 -259
  112. package/dist/index227.js.map +1 -1
  113. package/dist/index228.js +246 -172
  114. package/dist/index228.js.map +1 -1
  115. package/dist/index229.js +195 -32
  116. package/dist/index229.js.map +1 -1
  117. package/dist/index230.js +12 -40
  118. package/dist/index230.js.map +1 -1
  119. package/dist/index231.js +23 -26
  120. package/dist/index231.js.map +1 -1
  121. package/dist/index232.js +45 -22
  122. package/dist/index232.js.map +1 -1
  123. package/dist/index233.js +27 -48
  124. package/dist/index233.js.map +1 -1
  125. package/dist/index234.js +52 -26
  126. package/dist/index234.js.map +1 -1
  127. package/dist/index235.js +40 -225
  128. package/dist/index235.js.map +1 -1
  129. package/dist/index236.js +217 -39
  130. package/dist/index236.js.map +1 -1
  131. package/dist/index237.js +50 -0
  132. package/dist/index237.js.map +1 -0
  133. package/dist/styles.css +1 -1
  134. package/dist/wc/AIToolCall.js +218 -0
  135. package/dist/wc/AIToolCall.js.map +1 -0
  136. package/dist/wc/hf-ai-tool-call.js +34 -219
  137. package/dist/wc/hf-ai-tool-call.js.map +1 -1
  138. package/dist/wc/hf-ai-tool-run.js +673 -576
  139. package/dist/wc/hf-ai-tool-run.js.map +1 -1
  140. package/dist/wc/workflow-step-renderer.js +94 -86
  141. package/dist/wc/workflow-step-renderer.js.map +1 -1
  142. package/dist/wc-react/AIToolCall.js +218 -0
  143. package/dist/wc-react/AIToolCall.js.map +1 -0
  144. package/dist/wc-react/hf-ai-tool-call.js +32 -217
  145. package/dist/wc-react/hf-ai-tool-call.js.map +1 -1
  146. package/dist/wc-react/hf-ai-tool-run.js +698 -601
  147. package/dist/wc-react/hf-ai-tool-run.js.map +1 -1
  148. package/dist/wc-react/workflow-step-renderer.js +76 -68
  149. package/dist/wc-react/workflow-step-renderer.js.map +1 -1
  150. package/package.json +1 -1
  151. package/skills/humain-ui/SKILL.md +1 -1
  152. package/skills/humain-ui-wc/SKILL.md +1 -1
  153. package/skills/humain-ui-wc.skill +0 -0
  154. package/skills/humain-ui.skill +0 -0
  155. package/dist/index182.js +0 -143
  156. package/dist/index182.js.map +0 -1
  157. package/dist/wc/wrench.js +0 -10
  158. package/dist/wc/wrench.js.map +0 -1
  159. package/dist/wc-react/wrench.js +0 -10
  160. package/dist/wc-react/wrench.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index204.js","names":[],"sources":["../src/components/organisms/menus/CommandMenu/CommandMenu.tsx"],"sourcesContent":["'use client';\n\nimport {\n ArrowDown,\n ArrowUp,\n CornerDownLeft,\n Search,\n Settings,\n} from 'lucide-react';\nimport * as React from 'react';\nimport { Button, ClearButton } from '@/components/atoms/buttons/Button';\nimport { Avatar } from '@/components/molecules/data/Avatar';\nimport { Kbd } from '@/components/molecules/data/Kbd';\nimport {\n Command,\n CommandDialog,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n} from '@/components/ui/command';\nimport { cn } from '@/lib/utils';\n\nconst DEFAULT_COMMAND_MENU_MAX_HEIGHT = 336;\nconst DEFAULT_COMMAND_MENU_PLACEHOLDER = 'Type a command or search...';\nconst COMMAND_MENU_SHELL_CLASS_NAME =\n 'w-full max-w-[508px] overflow-hidden rounded-xl border border-input bg-background shadow-lg';\n\nfunction getCommandMenuMaxHeight(maxHeight: number): number {\n return Number.isFinite(maxHeight) && maxHeight >= 0\n ? maxHeight\n : DEFAULT_COMMAND_MENU_MAX_HEIGHT;\n}\n\n// ============================================\n// Types\n// ============================================\n\nexport interface CommandMenuOption {\n /** Unique identifier for the option */\n id: string;\n /** Display label for the option */\n label: string;\n /** Optional subtitle (e.g., @username, email) */\n subtitle?: string;\n /** Optional icon to display (mutually exclusive with avatar) */\n icon?: React.ReactNode;\n /** Optional avatar configuration */\n avatar?: {\n src?: string;\n fallback?: string;\n };\n /** Whether the option is disabled */\n disabled?: boolean;\n /** Keyboard shortcut to display */\n shortcut?: string;\n}\n\nexport interface CommandMenuGroup {\n /** Unique identifier for the group */\n id: string;\n /** Group label/heading */\n label: string;\n /** Options in this group */\n options: CommandMenuOption[];\n}\n\nexport interface CommandMenuFooterHint {\n /** Icon or keyboard key indicator */\n keys: React.ReactNode;\n /** Text describing the action */\n label: string;\n}\n\nexport interface CommandMenuProps {\n /** Whether the command menu is open */\n open?: boolean;\n /** Callback when open state changes */\n onOpenChange?: (open: boolean) => void;\n /** Placeholder text for the search input */\n placeholder?: string;\n /** Text to show when no results found */\n emptyText?: string;\n /** Empty state content (replaces emptyText when provided) */\n emptyState?: React.ReactNode;\n /** Flat list of options */\n options?: CommandMenuOption[];\n /** Grouped options */\n groups?: CommandMenuGroup[];\n /** Callback when an option is selected */\n onSelect?: (id: string, option: CommandMenuOption) => void;\n /** Whether to show keyboard shortcut badge in input */\n showShortcut?: boolean;\n /** Keyboard shortcut text to display (auto-detects platform when omitted) */\n shortcutText?: string;\n /** Whether to show the footer with navigation hints */\n showFooter?: boolean;\n /** Custom footer hints */\n footerHints?: CommandMenuFooterHint[];\n /** Whether to show settings button in footer */\n showSettingsButton?: boolean;\n /** Callback when settings button is clicked */\n onSettingsClick?: () => void;\n /** Additional class name for the dialog */\n className?: string;\n /** Maximum height of the list */\n maxHeight?: number;\n /** Custom filter function */\n filter?: (value: string, search: string) => number;\n /** Children for custom content */\n children?: React.ReactNode;\n}\n\n// ============================================\n// Platform detection\n// ============================================\n\nfunction usePlatformShortcut() {\n const [shortcut, setShortcut] = React.useState('\\u2318/');\n React.useEffect(() => {\n if (!/Mac|iPhone|iPad/i.test(navigator.userAgent)) {\n setShortcut('Ctrl /');\n }\n }, []);\n return shortcut;\n}\n\n// ============================================\n// Keyboard Shortcut Badge (uses Kbd wrapper)\n// ============================================\n\nfunction CommandShortcutBadge({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <Kbd variant=\"solid\" size=\"sm\" className={cn('shadow-xs', className)}>\n {children}\n </Kbd>\n );\n}\nCommandShortcutBadge.displayName = 'CommandMenu.ShortcutBadge';\n\n// ============================================\n// Footer Navigation Icon (uses Kbd wrapper)\n// ============================================\n\nfunction FooterNavIcon({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <Kbd variant=\"footer\" size=\"sm\" className={cn('p-1.5', className)}>\n {children}\n </Kbd>\n );\n}\nFooterNavIcon.displayName = 'CommandMenu.FooterNavIcon';\n\nfunction FooterNavText({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <span\n className={cn('text-sm font-semibold text-text-quaternary', className)}\n >\n {children}\n </span>\n );\n}\nFooterNavText.displayName = 'CommandMenu.FooterNavText';\n\n// ============================================\n// Default Footer Hints\n// ============================================\n\nconst defaultFooterHints: CommandMenuFooterHint[] = [\n {\n keys: (\n <div className=\"flex items-center gap-1\">\n <FooterNavIcon>\n <ArrowUp className=\"size-2.5 text-text-quaternary\" />\n </FooterNavIcon>\n <FooterNavIcon>\n <ArrowDown className=\"size-2.5 text-text-quaternary\" />\n </FooterNavIcon>\n </div>\n ),\n label: 'to navigate',\n },\n {\n keys: (\n <FooterNavIcon>\n <CornerDownLeft className=\"size-2.5 text-text-quaternary\" />\n </FooterNavIcon>\n ),\n label: 'to select',\n },\n {\n keys: (\n <FooterNavIcon className=\"px-1.5 py-1\">\n <span className=\"text-xs font-semibold text-text-quaternary\">esc</span>\n </FooterNavIcon>\n ),\n label: 'to close',\n },\n];\n\n// ============================================\n// Command Menu Footer\n// ============================================\n\nexport interface CommandMenuFooterProps {\n hints?: CommandMenuFooterHint[];\n showSettingsButton?: boolean;\n onSettingsClick?: () => void;\n className?: string;\n}\n\nfunction CommandMenuFooter({\n hints = defaultFooterHints,\n showSettingsButton = false,\n onSettingsClick,\n className,\n}: CommandMenuFooterProps) {\n return (\n <div\n data-slot=\"command-menu-footer\"\n className={cn(\n 'flex items-center gap-3 border-t border-border bg-card/80 py-2 pe-2 ps-[18px] supports-backdrop-filter:backdrop-blur',\n className,\n )}\n >\n <div className=\"hidden flex-1 items-start gap-4 [@media(hover:hover)]:flex\">\n {hints.map((hint) => (\n <div key={hint.label} className=\"flex items-center gap-2\">\n {hint.keys}\n <FooterNavText>{hint.label}</FooterNavText>\n </div>\n ))}\n </div>\n {showSettingsButton && (\n <Button\n appearance=\"ghost\"\n variant=\"secondary\"\n size=\"icon\"\n className=\"group ms-auto rounded-full bg-muted\"\n onClick={onSettingsClick}\n aria-label=\"Settings\"\n >\n <Settings className=\"size-5 text-muted-foreground transition-transform duration-300 ease-out group-hover:rotate-90 motion-reduce:transition-none\" />\n </Button>\n )}\n </div>\n );\n}\nCommandMenuFooter.displayName = 'CommandMenu.Footer';\n\n// ============================================\n// Command Menu Item\n// ============================================\n\nexport interface CommandMenuItemProps\n extends Omit<\n React.ComponentProps<typeof CommandItem>,\n 'onSelect' | 'showCheckIndicator' | 'value'\n > {\n option: CommandMenuOption;\n onSelect?: (id: string, option: CommandMenuOption) => void;\n}\n\nfunction CommandMenuItem({\n option,\n onSelect,\n className,\n ...props\n}: CommandMenuItemProps) {\n return (\n <CommandItem\n value={option.id}\n disabled={option.disabled}\n showCheckIndicator={false}\n onSelect={() => onSelect?.(option.id, option)}\n className={cn(\n 'flex cursor-pointer items-center gap-2 transition-colors duration-150 motion-reduce:transition-none',\n className,\n )}\n {...props}\n >\n {option.avatar && (\n <Avatar\n src={option.avatar.src}\n fallback={option.avatar.fallback || option.label.charAt(0)}\n size=\"sm\"\n className=\"size-6 shrink-0\"\n />\n )}\n {option.icon && !option.avatar && (\n <span className=\"flex size-4 shrink-0 items-center justify-center text-muted-foreground [&_svg]:size-4\">\n {option.icon}\n </span>\n )}\n <div className=\"flex min-w-0 flex-1 items-center gap-2 text-sm leading-5\">\n <span className=\"min-w-0 truncate font-normal text-foreground\">\n {option.label}\n </span>\n {option.subtitle && (\n <span className=\"min-w-0 truncate font-normal text-muted-foreground\">\n {option.subtitle}\n </span>\n )}\n </div>\n {option.shortcut && (\n <CommandShortcutBadge className=\"transition-colors duration-150 group-data-[selected=true]/command-item:bg-primary/10 group-data-[selected=true]/command-item:text-primary\">\n {option.shortcut}\n </CommandShortcutBadge>\n )}\n </CommandItem>\n );\n}\nCommandMenuItem.displayName = 'CommandMenu.Item';\n\n// ============================================\n// Command Menu Group Header\n// ============================================\n\nfunction CommandMenuGroupHeader({\n children,\n className,\n ...props\n}: React.ComponentProps<'h3'>) {\n return (\n <h3\n data-slot=\"command-menu-group-header\"\n className={cn(\n 'px-2 py-1.5 text-xs font-medium text-muted-foreground',\n className,\n )}\n {...props}\n >\n {children}\n </h3>\n );\n}\nCommandMenuGroupHeader.displayName = 'CommandMenu.GroupHeader';\n\n// ============================================\n// Shared Command Menu Body (internal)\n// ============================================\n\ninterface CommandMenuBodyProps {\n children?: React.ReactNode;\n groups: CommandMenuGroup[];\n options: CommandMenuOption[];\n onSelect?: (id: string, option: CommandMenuOption) => void;\n onClose?: () => void;\n placeholder: string;\n emptyText: string;\n emptyState?: React.ReactNode;\n showShortcut: boolean;\n shortcutText: string;\n showFooter: boolean;\n footerHints?: CommandMenuFooterHint[];\n showSettingsButton: boolean;\n onSettingsClick?: () => void;\n maxHeight: number;\n filter?: (value: string, search: string) => number;\n}\n\ninterface CommandMenuBodyContentProps {\n children?: React.ReactNode;\n groups: CommandMenuGroup[];\n options: CommandMenuOption[];\n optionRenderer: (option: CommandMenuOption) => React.ReactNode;\n}\n\ninterface CommandMenuGroupSectionProps {\n group: CommandMenuGroup;\n optionRenderer: (option: CommandMenuOption) => React.ReactNode;\n}\n\nfunction CommandMenuGroupSection({\n group,\n optionRenderer,\n}: CommandMenuGroupSectionProps) {\n const headingId = React.useId();\n\n return (\n <CommandGroup aria-labelledby={headingId} className=\"px-2 py-1\">\n <CommandMenuGroupHeader id={headingId}>\n {group.label}\n </CommandMenuGroupHeader>\n <div className=\"flex flex-col\">{group.options.map(optionRenderer)}</div>\n </CommandGroup>\n );\n}\nCommandMenuGroupSection.displayName = 'CommandMenu.GroupSection';\n\nfunction CommandMenuBodyContent({\n children,\n groups,\n options,\n optionRenderer,\n}: CommandMenuBodyContentProps) {\n if (children) return children;\n\n if (groups.length > 0) {\n return groups.map((group, index) => (\n <React.Fragment key={group.id}>\n {index > 0 && <CommandSeparator className=\"mx-0\" />}\n <CommandMenuGroupSection\n group={group}\n optionRenderer={optionRenderer}\n />\n </React.Fragment>\n ));\n }\n\n return <div className=\"flex flex-col p-2\">{options.map(optionRenderer)}</div>;\n}\n\nfunction CommandMenuBody({\n children,\n groups,\n options,\n onSelect,\n onClose,\n placeholder,\n emptyText,\n emptyState,\n showShortcut,\n shortcutText,\n showFooter,\n footerHints,\n showSettingsButton,\n onSettingsClick,\n maxHeight,\n filter,\n}: CommandMenuBodyProps) {\n const safeMaxHeight = getCommandMenuMaxHeight(maxHeight);\n const renderOption = (option: CommandMenuOption) => (\n <CommandMenuItem key={option.id} option={option} onSelect={onSelect} />\n );\n\n return (\n <Command\n filter={filter}\n className=\"rounded-none border-0 shadow-none\"\n data-slot=\"command-menu\"\n >\n <search\n aria-label=\"Command menu search\"\n className=\"block border-b border-input bg-background\"\n >\n <CommandInput\n render={({ clearSearch, value, ...inputProps }) => {\n const canClose = typeof onClose === 'function';\n const clearOrClose = () => {\n if (value) {\n clearSearch();\n return;\n }\n onClose?.();\n };\n\n return (\n <div\n data-slot=\"command-menu-input\"\n cmdk-input-wrapper=\"\"\n className=\"flex h-11 items-center gap-2 px-3\"\n >\n <Search\n className=\"size-4 shrink-0 text-muted-foreground opacity-50\"\n aria-hidden=\"true\"\n />\n <input\n {...inputProps}\n value={value}\n placeholder={placeholder}\n aria-label={placeholder}\n className=\"min-w-0 flex-1 bg-transparent text-sm leading-5 text-foreground outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50\"\n />\n {showShortcut && (\n <CommandShortcutBadge>{shortcutText}</CommandShortcutBadge>\n )}\n <ClearButton\n size=\"icon-xs\"\n className=\"-me-1 rounded-sm p-0 opacity-50 hover:opacity-80 focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:size-4\"\n disabled={!value && !canClose}\n aria-label={\n value\n ? 'Clear search'\n : canClose\n ? 'Close command menu'\n : 'Clear search'\n }\n onClick={clearOrClose}\n />\n </div>\n );\n }}\n />\n </search>\n\n <CommandList\n style={{ maxHeight: safeMaxHeight }}\n className=\"overflow-y-auto p-0\"\n >\n <CommandEmpty className=\"py-6 text-center text-sm text-muted-foreground animate-in fade-in-0 duration-200 motion-reduce:animate-none\">\n {emptyState || emptyText}\n </CommandEmpty>\n <CommandMenuBodyContent\n groups={groups}\n options={options}\n optionRenderer={renderOption}\n >\n {children}\n </CommandMenuBodyContent>\n </CommandList>\n\n {showFooter && (\n <CommandMenuFooter\n hints={footerHints}\n showSettingsButton={showSettingsButton}\n onSettingsClick={onSettingsClick}\n />\n )}\n </Command>\n );\n}\nCommandMenuBody.displayName = 'CommandMenu.Body';\n\n// ============================================\n// Main Command Menu Component\n// ============================================\n\nfunction CommandMenu({\n open,\n onOpenChange,\n placeholder = DEFAULT_COMMAND_MENU_PLACEHOLDER,\n emptyText = 'No results found.',\n emptyState,\n options = [],\n groups = [],\n onSelect,\n showShortcut = false,\n shortcutText,\n showFooter = false,\n footerHints,\n showSettingsButton = false,\n onSettingsClick,\n className,\n maxHeight = DEFAULT_COMMAND_MENU_MAX_HEIGHT,\n filter,\n children,\n}: CommandMenuProps) {\n const platformShortcut = usePlatformShortcut();\n const resolvedShortcut = shortcutText ?? platformShortcut;\n\n return (\n <CommandDialog\n open={open}\n onOpenChange={onOpenChange}\n className={cn('max-w-[508px] sm:max-w-[508px]', className)}\n >\n <CommandMenuBody\n placeholder={placeholder}\n emptyText={emptyText}\n emptyState={emptyState}\n options={options}\n groups={groups}\n onSelect={onSelect}\n onClose={() => onOpenChange?.(false)}\n showShortcut={showShortcut}\n shortcutText={resolvedShortcut}\n showFooter={showFooter}\n footerHints={footerHints}\n showSettingsButton={showSettingsButton}\n onSettingsClick={onSettingsClick}\n maxHeight={maxHeight}\n filter={filter}\n >\n {children}\n </CommandMenuBody>\n </CommandDialog>\n );\n}\nCommandMenu.displayName = 'CommandMenu';\n\n// ============================================\n// Standalone Command Menu (non-dialog version)\n// ============================================\n\nexport interface CommandMenuPanelProps\n extends Omit<CommandMenuProps, 'open' | 'onOpenChange'> {\n /** Additional class name */\n className?: string;\n}\n\nfunction CommandMenuPanel({\n placeholder = DEFAULT_COMMAND_MENU_PLACEHOLDER,\n emptyText = 'No results found.',\n emptyState,\n options = [],\n groups = [],\n onSelect,\n showShortcut = false,\n shortcutText,\n showFooter = false,\n footerHints,\n showSettingsButton = false,\n onSettingsClick,\n className,\n maxHeight = DEFAULT_COMMAND_MENU_MAX_HEIGHT,\n filter,\n children,\n}: CommandMenuPanelProps) {\n const platformShortcut = usePlatformShortcut();\n const resolvedShortcut = shortcutText ?? platformShortcut;\n\n return (\n <div\n data-slot=\"command-menu-panel\"\n className={cn(COMMAND_MENU_SHELL_CLASS_NAME, className)}\n >\n <CommandMenuBody\n placeholder={placeholder}\n emptyText={emptyText}\n emptyState={emptyState}\n options={options}\n groups={groups}\n onSelect={onSelect}\n showShortcut={showShortcut}\n shortcutText={resolvedShortcut}\n showFooter={showFooter}\n footerHints={footerHints}\n showSettingsButton={showSettingsButton}\n onSettingsClick={onSettingsClick}\n maxHeight={maxHeight}\n filter={filter}\n >\n {children}\n </CommandMenuBody>\n </div>\n );\n}\nCommandMenuPanel.displayName = 'CommandMenu.Panel';\n\n// ============================================\n// Exports\n// ============================================\n\nexport {\n CommandMenu,\n CommandMenuFooter,\n CommandMenuGroupHeader,\n CommandMenuItem,\n CommandMenuPanel,\n CommandShortcutBadge,\n defaultFooterHints,\n FooterNavIcon,\n FooterNavText,\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index204.js","names":[],"sources":["../src/components/organisms/layout/SectionHeader/SectionHeader.tsx"],"sourcesContent":["'use client';\n\nimport { Search } from 'lucide-react';\nimport * as React from 'react';\nimport { Button, type ButtonProps } from '@/components/atoms/buttons/Button';\nimport { ButtonGroup } from '@/components/atoms/buttons/ButtonGroup';\nimport { Input, type InputProps } from '@/components/atoms/forms/Input';\nimport { Separator } from '@/components/atoms/layout/Separator';\nimport { Tabs } from '@/components/molecules/navigation/Tabs';\nimport { cn } from '@/lib/utils';\n\nexport type SectionHeaderSize = 'sm' | 'md';\nexport type SectionHeaderHeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\ntype SectionHeaderHeadingTag = `h${SectionHeaderHeadingLevel}`;\n\nexport interface SectionHeaderAction\n extends Omit<ButtonProps, 'children' | 'render'> {\n label: React.ReactNode;\n}\n\nexport interface SectionHeaderTab {\n label: React.ReactNode;\n value?: string;\n active?: boolean;\n leadingIcon?: React.ReactNode;\n onClick?: React.MouseEventHandler<HTMLButtonElement>;\n}\n\nexport interface SectionHeaderSearchProps\n extends Omit<\n InputProps,\n 'size' | 'shape' | 'startIcon' | 'endIcon' | 'appearance'\n > {\n placeholder?: string;\n ariaLabel?: string;\n /** Optional interactive filter control rendered beside the search input */\n filterButton?: React.ReactNode;\n}\n\nexport interface SectionHeaderProps\n extends Omit<React.ComponentPropsWithoutRef<'header'>, 'title'> {\n /** Section title */\n title: React.ReactNode;\n /** Supporting text below the title */\n supportingText?: React.ReactNode;\n /** Heading/text size from the Figma variants */\n size?: SectionHeaderSize;\n /** Semantic heading level for the section title */\n headingLevel?: SectionHeaderHeadingLevel;\n /** Action buttons rendered to the right of the title block */\n actions?: SectionHeaderAction[];\n /** Optional grouped actions rendered as a segmented control */\n buttonGroup?: SectionHeaderAction[];\n /** Optional search input rendered to the right of the title block */\n search?: SectionHeaderSearchProps;\n /** Optional tabs row rendered below the header controls */\n tabs?: SectionHeaderTab[];\n /** Trailing menu control rendered after the action buttons */\n menuButton?: React.ReactNode;\n /** Show the bottom divider */\n showDivider?: boolean;\n}\n\ntype SectionHeaderControlProps = Pick<\n SectionHeaderProps,\n 'actions' | 'buttonGroup' | 'search'\n>;\n\nconst controlTouchTargetClassName = 'min-h-11 min-w-11 shrink-0';\n\nfunction getHeadingTag(\n headingLevel: SectionHeaderHeadingLevel,\n): SectionHeaderHeadingTag {\n return `h${headingLevel}` as SectionHeaderHeadingTag;\n}\n\nfunction SectionHeaderTouchTargetControl({\n control,\n}: {\n control: React.ReactNode;\n}): React.ReactNode {\n if (React.isValidElement<{ className?: string }>(control)) {\n return React.cloneElement(control, {\n className: cn(control.props.className, controlTouchTargetClassName),\n });\n }\n\n return (\n <span\n className={cn(\n 'inline-flex items-center justify-center',\n controlTouchTargetClassName,\n )}\n >\n {control}\n </span>\n );\n}\n\nfunction getSectionHeaderActionKey(\n action: SectionHeaderAction,\n index: number,\n prefix = 'section-header-action',\n): React.Key {\n return typeof action.label === 'string'\n ? `${action.label}-${index}`\n : `${prefix}-${index}`;\n}\n\nfunction SectionHeaderActionButton({\n action,\n className,\n}: {\n action: SectionHeaderAction;\n className?: string;\n}): React.JSX.Element {\n const { label, className: actionClassName, ...buttonProps } = action;\n\n return (\n <Button\n appearance=\"solid\"\n size=\"default\"\n shape=\"rounded\"\n className={cn(\n 'h-10 rounded-xl px-2 text-xs font-medium',\n actionClassName,\n className,\n )}\n {...buttonProps}\n >\n {label}\n </Button>\n );\n}\n\nfunction SectionHeaderButtonGroup({\n actions,\n}: {\n actions: SectionHeaderAction[];\n}): React.JSX.Element {\n return (\n <ButtonGroup\n aria-label=\"Section header controls\"\n shape=\"rounded\"\n className=\"overflow-hidden rounded-xl\"\n >\n {actions.map((action, index) => {\n const { label, className, ...buttonProps } = action;\n\n return (\n <Button\n key={getSectionHeaderActionKey(\n action,\n index,\n 'section-header-group-action',\n )}\n appearance={\n (buttonProps.appearance as ButtonProps['appearance']) ?? 'soft'\n }\n variant={\n (buttonProps.variant as ButtonProps['variant']) ?? 'primary'\n }\n size=\"md\"\n shape=\"rounded\"\n className={cn(\n 'border-transparent px-3 text-xs font-medium shadow-none',\n className,\n )}\n {...buttonProps}\n >\n {label}\n </Button>\n );\n })}\n </ButtonGroup>\n );\n}\n\nfunction getTabValue(tab: SectionHeaderTab, index: number): string {\n if (tab.value !== undefined) {\n return tab.value;\n }\n\n if (typeof tab.label === 'string') {\n return `${tab.label}-${index}`;\n }\n\n return `section-header-tab-${index}`;\n}\n\nfunction SectionHeaderTabs({\n tabs,\n}: {\n tabs: SectionHeaderTab[];\n}): React.JSX.Element {\n const tabValues = tabs.map((tab, index) => getTabValue(tab, index));\n const tabListKey = JSON.stringify(tabValues);\n const activeIndex = tabs.findIndex((tab) => tab.active);\n const activeValue = activeIndex >= 0 ? tabValues[activeIndex] : undefined;\n\n return (\n <Tabs\n key={tabListKey}\n value={activeValue}\n defaultValue={activeValue ?? tabValues[0]}\n className=\"w-full\"\n >\n <Tabs.List\n variant=\"boxed\"\n size=\"sm\"\n align=\"stretch\"\n aria-label=\"Section header tabs\"\n className=\"w-full overflow-x-auto overflow-y-hidden rounded-[8px] border border-border bg-card p-1 shadow-sm\"\n >\n {tabs.map((tab, index) => {\n const value = tabValues[index];\n return (\n <Tabs.Trigger\n key={value}\n value={value}\n icon={tab.leadingIcon}\n className=\"min-w-max flex-1 rounded-[10px] px-3 py-1\"\n onClick={tab.onClick}\n >\n <span className=\"whitespace-nowrap\">{tab.label}</span>\n </Tabs.Trigger>\n );\n })}\n </Tabs.List>\n </Tabs>\n );\n}\n\nfunction SectionHeaderControls({\n actions,\n buttonGroup,\n search,\n}: SectionHeaderControlProps): React.JSX.Element {\n return (\n <React.Fragment>\n {search ? <SectionHeaderSearchField search={search} /> : null}\n {buttonGroup?.length ? (\n <SectionHeaderButtonGroup actions={buttonGroup} />\n ) : null}\n {actions?.length ? (\n <div className=\"flex flex-wrap items-center gap-3 md:flex-nowrap\">\n {actions.map((action, index) => (\n <SectionHeaderActionButton\n key={getSectionHeaderActionKey(action, index)}\n action={action}\n />\n ))}\n </div>\n ) : null}\n </React.Fragment>\n );\n}\n\nfunction SectionHeaderSearchField({\n search,\n}: {\n search: SectionHeaderSearchProps;\n}): React.JSX.Element {\n const {\n className: searchClassName,\n placeholder,\n ariaLabel,\n filterButton,\n ...searchProps\n } = search;\n const searchInput = (\n <Input\n size=\"md\"\n shape=\"rounded\"\n aria-label={ariaLabel ?? 'Search'}\n placeholder={placeholder ?? 'Search'}\n startIcon={<Search className=\"size-4\" />}\n className={cn(\n filterButton ? 'min-w-0 flex-1' : 'w-full max-w-[320px]',\n searchClassName,\n )}\n {...searchProps}\n />\n );\n\n if (filterButton) {\n return (\n <div\n data-slot=\"section-header-search\"\n className=\"flex w-full max-w-[376px] items-center gap-2\"\n >\n {searchInput}\n <SectionHeaderTouchTargetControl control={filterButton} />\n </div>\n );\n }\n\n return searchInput;\n}\n\nconst SectionHeader = React.forwardRef<HTMLElement, SectionHeaderProps>(\n (\n {\n title,\n supportingText,\n size = 'md',\n headingLevel = 2,\n actions,\n buttonGroup,\n search,\n tabs,\n menuButton = null,\n showDivider = true,\n className,\n ...props\n },\n ref,\n ) => {\n const hasSearch = Boolean(search);\n const hasButtonGroup = Boolean(buttonGroup?.length);\n const hasActions = Boolean(actions?.length);\n const hasInlineControls = hasSearch || hasButtonGroup || hasActions;\n const hasHeaderControls = hasInlineControls || Boolean(menuButton);\n const HeadingTag = getHeadingTag(headingLevel);\n\n return (\n <header\n ref={ref}\n data-slot=\"section-header\"\n className={cn('relative flex w-full flex-col gap-4', className)}\n {...props}\n >\n <div className=\"grid w-full grid-cols-[minmax(0,1fr)_auto] items-start gap-x-4 gap-y-3\">\n <div\n className={cn(\n 'col-start-1 row-start-1 flex min-w-0 flex-col justify-center gap-0.5',\n menuButton ? 'pe-8 md:pe-0' : null,\n )}\n >\n <HeadingTag\n className={cn(\n 'line-clamp-2 w-full break-words font-semibold text-foreground',\n size === 'sm'\n ? 'text-[14px] leading-5'\n : 'text-[18px] leading-7',\n )}\n >\n {title}\n </HeadingTag>\n {supportingText ? (\n <p className=\"line-clamp-2 w-full break-words text-sm leading-5 text-secondary-foreground\">\n {supportingText}\n </p>\n ) : null}\n </div>\n\n {hasHeaderControls ? (\n <div\n className={cn(\n 'col-span-2 row-start-2 flex flex-wrap items-center gap-3 md:col-span-1 md:col-start-2 md:row-start-1 md:flex-nowrap md:justify-end',\n !hasInlineControls && 'contents md:flex',\n )}\n >\n <SectionHeaderControls\n actions={actions}\n buttonGroup={buttonGroup}\n search={search}\n />\n {menuButton ? (\n <div className=\"absolute end-0 top-0 md:static\">\n <SectionHeaderTouchTargetControl control={menuButton} />\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n\n {tabs?.length ? <SectionHeaderTabs tabs={tabs} /> : null}\n\n {showDivider ? <Separator aria-hidden=\"true\" /> : null}\n </header>\n );\n },\n);\n\nSectionHeader.displayName = 'SectionHeader';\n\nexport { SectionHeader };\n"],"mappings":"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"}