@humain/ui 2.2.7 → 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-ai-prompt-suggestion.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/arrow-right.mjs","../../src/components/organisms/ai/AIPromptSuggestion/AIPromptSuggestion.tsx","../../src/wc/hf-ai-prompt-suggestion.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: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"m12 5 7 7-7 7\", key: \"xquz4c\" }]\n];\nconst ArrowRight = createLucideIcon(\"arrow-right\", __iconNode);\n\nexport { __iconNode, ArrowRight as default };\n//# sourceMappingURL=arrow-right.mjs.map\n","import { cva, type VariantProps } from 'class-variance-authority';\nimport { ArrowRight, Sparkles } from 'lucide-react';\nimport * as React from 'react';\nimport { cn } from '@/lib/utils';\n\n// =============================================================================\n// Variants\n// =============================================================================\n\nconst promptSuggestionVariants = cva(\n 'group inline-flex items-center gap-2 transition-all cursor-pointer',\n {\n variants: {\n variant: {\n default:\n 'px-4 py-2.5 rounded-full border border-border bg-background hover:border-border hover:shadow-sm text-secondary-foreground hover:text-foreground',\n outline:\n 'px-4 py-2.5 rounded-full border border-border bg-transparent hover:bg-muted text-secondary-foreground hover:text-foreground',\n ghost:\n 'px-3 py-2 rounded-lg hover:bg-accent text-muted-foreground hover:text-foreground',\n card: 'flex-col items-start p-4 rounded-xl border border-border bg-background hover:border-primary hover:shadow-md',\n highlight:\n 'text-primary hover:text-primary underline underline-offset-2',\n },\n size: {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-base',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'md',\n },\n },\n);\n\n// =============================================================================\n// Main AIPromptSuggestion Component\n// =============================================================================\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction getSuggestionLimit(max: number | undefined): number | null {\n return typeof max === 'number' && Number.isFinite(max) && max > 0\n ? Math.floor(max)\n : null;\n}\n\ninterface HighlightedTextPart {\n key: string;\n text: string;\n highlighted: boolean;\n}\n\nfunction getHighlightedTextParts(\n text: string,\n highlight: string,\n): HighlightedTextPart[] {\n const escapedHighlight = escapeRegExp(highlight);\n const parts = text.split(new RegExp(`(${escapedHighlight})`, 'gi'));\n const normalizedHighlight = highlight.toLowerCase();\n let offset = 0;\n\n return parts.map((part) => {\n const partOffset = offset;\n offset += part.length;\n\n return {\n key: `${partOffset}:${part.toLowerCase() === normalizedHighlight ? 'highlight' : 'plain'}:${part}`,\n text: part,\n highlighted: part.toLowerCase() === normalizedHighlight,\n };\n });\n}\n\nexport interface AIPromptSuggestionProps\n extends VariantProps<typeof promptSuggestionVariants> {\n /** Suggestion text */\n children: string;\n /** Click handler */\n onClick?: () => void;\n /** Optional icon */\n icon?: React.ReactNode;\n /** Show arrow icon on hover */\n showArrow?: boolean;\n /** Highlight specific text within the suggestion */\n highlight?: string;\n /** Additional class name */\n className?: string;\n}\n\nfunction AIPromptSuggestion({\n children,\n onClick,\n icon,\n showArrow = false,\n highlight,\n variant,\n size,\n className,\n}: AIPromptSuggestionProps) {\n const renderedText = React.useMemo(() => {\n if (!highlight) {\n return <span>{children}</span>;\n }\n\n const parts = getHighlightedTextParts(children, highlight);\n\n return (\n <span>\n {parts.map((part) =>\n part.highlighted ? (\n <span key={part.key} className=\"text-primary font-medium\">\n {part.text}\n </span>\n ) : (\n <span key={part.key}>{part.text}</span>\n ),\n )}\n </span>\n );\n }, [children, highlight]);\n\n return (\n <button\n type=\"button\"\n data-slot=\"ai-prompt-suggestion\"\n onClick={onClick}\n className={cn(\n promptSuggestionVariants({ variant, size }),\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring',\n className,\n )}\n >\n {icon && (\n <span className=\"shrink-0\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n {renderedText}\n {showArrow && variant !== 'highlight' && (\n <ArrowRight\n className=\"size-4 opacity-0 -translate-x-1 group-hover:opacity-100 group-hover:translate-x-0 transition-all motion-reduce:transition-none\"\n aria-hidden=\"true\"\n />\n )}\n </button>\n );\n}\n\nAIPromptSuggestion.displayName = 'AIPromptSuggestion';\n\n// =============================================================================\n// Prompt Suggestion Card (Enhanced variant)\n// =============================================================================\n\nexport interface AIPromptSuggestionCardProps {\n /** Card title */\n title: string;\n /** Card description */\n description?: string;\n /** Icon to display */\n icon?: React.ReactNode;\n /** Click handler */\n onClick?: () => void;\n /** Whether the card is featured/highlighted */\n featured?: boolean;\n /** Additional class name */\n className?: string;\n}\n\nfunction AIPromptSuggestionCard({\n title,\n description,\n icon,\n onClick,\n featured = false,\n className,\n}: AIPromptSuggestionCardProps) {\n return (\n <button\n type=\"button\"\n data-slot=\"ai-prompt-suggestion-card\"\n onClick={onClick}\n className={cn(\n 'group flex flex-col items-start gap-2 p-4 rounded-xl border transition-all text-left focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring',\n featured\n ? 'border-primary bg-primary/10 hover:border-primary hover:shadow-md'\n : 'border-border bg-background hover:border-border hover:shadow-md',\n className,\n )}\n >\n {icon && (\n <div\n className={cn(\n 'size-8 rounded-lg flex items-center justify-center',\n featured\n ? 'bg-primary/20 text-primary'\n : 'bg-accent text-muted-foreground',\n )}\n >\n {icon}\n </div>\n )}\n <div className=\"space-y-1\">\n <h4 className=\"text-sm font-medium text-foreground group-hover:text-primary transition-colors\">\n {title}\n </h4>\n {description && (\n <p className=\"text-xs text-text-quaternary line-clamp-2\">\n {description}\n </p>\n )}\n </div>\n </button>\n );\n}\n\nAIPromptSuggestionCard.displayName = 'AIPromptSuggestionCard';\n\n// =============================================================================\n// Prompt Suggestion List\n// =============================================================================\n\nexport interface AIPromptSuggestionListProps {\n /** Array of suggestions */\n suggestions: Array<{\n text: string;\n icon?: React.ReactNode;\n }>;\n /** Click handler (receives suggestion text) */\n onSelect?: (text: string) => void;\n /** Variant for all suggestions */\n variant?: AIPromptSuggestionProps['variant'];\n /** Layout direction */\n direction?: 'horizontal' | 'vertical';\n /** Maximum suggestions to show */\n max?: number;\n /** Additional class name */\n className?: string;\n}\n\nfunction AIPromptSuggestionList({\n suggestions,\n onSelect,\n variant = 'default',\n direction = 'horizontal',\n max,\n className,\n}: AIPromptSuggestionListProps) {\n const limit = getSuggestionLimit(max);\n const visibleSuggestions =\n limit === null ? suggestions : suggestions.slice(0, limit);\n\n return (\n <section\n data-slot=\"ai-prompt-suggestion-list\"\n aria-label=\"Prompt suggestions\"\n className={cn(\n 'flex gap-2',\n direction === 'horizontal' ? 'flex-wrap' : 'flex-col',\n className,\n )}\n >\n {visibleSuggestions.map((suggestion) => (\n <AIPromptSuggestion\n key={suggestion.text}\n variant={variant}\n icon={suggestion.icon}\n onClick={() => onSelect?.(suggestion.text)}\n >\n {suggestion.text}\n </AIPromptSuggestion>\n ))}\n </section>\n );\n}\n\nAIPromptSuggestionList.displayName = 'AIPromptSuggestionList';\n\n// =============================================================================\n// Quick Actions Grid\n// =============================================================================\n\nexport interface QuickAction {\n id: string;\n title: string;\n description?: string;\n icon?: React.ReactNode;\n prompt: string;\n}\n\nexport interface AIQuickActionsProps {\n /** Array of quick actions */\n actions: QuickAction[];\n /** Click handler (receives action prompt) */\n onSelect?: (prompt: string) => void;\n /** Visual variant */\n variant?: 'card' | 'pill';\n /** Number of columns (only for card variant) */\n columns?: 2 | 3 | 4;\n /** Additional class name */\n className?: string;\n}\n\nfunction AIQuickActions({\n actions,\n onSelect,\n variant = 'card',\n columns = 2,\n className,\n}: AIQuickActionsProps) {\n const gridCols = {\n 2: 'grid-cols-2',\n 3: 'grid-cols-3',\n 4: 'grid-cols-4',\n };\n\n if (variant === 'pill') {\n return (\n <div className={cn('flex flex-wrap gap-2', className)}>\n {actions.map((action) => (\n <AIPromptSuggestion\n key={action.id}\n icon={action.icon || <Sparkles className=\"size-4\" />}\n onClick={() => onSelect?.(action.prompt)}\n >\n {action.title}\n </AIPromptSuggestion>\n ))}\n </div>\n );\n }\n\n return (\n <div className={cn('grid gap-3', gridCols[columns], className)}>\n {actions.map((action) => (\n <AIPromptSuggestionCard\n key={action.id}\n title={action.title}\n description={action.description}\n icon={action.icon || <Sparkles className=\"size-4\" />}\n onClick={() => onSelect?.(action.prompt)}\n />\n ))}\n </div>\n );\n}\n\nAIQuickActions.displayName = 'AIQuickActions';\n\nexport {\n AIPromptSuggestion,\n AIPromptSuggestionCard,\n AIPromptSuggestionList,\n AIQuickActions,\n promptSuggestionVariants,\n};\n","/**\n * Web Component wrapper for AIPromptSuggestion\n * Custom element: <hf-ai-prompt-suggestion>\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 { AIPromptSuggestion } from '../components/organisms/ai/AIPromptSuggestion';\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 onClick: (value: unknown) => {\n const CustomEventConstructor =\n element.ownerDocument.defaultView?.CustomEvent ?? CustomEvent;\n element.dispatchEvent(new CustomEventConstructor('click', {\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 AIPromptSuggestionWrapper(props: React.ComponentProps<typeof AIPromptSuggestion> & { _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(AIPromptSuggestion, { ...restProps, ...eventHandlers });\n}\n\n/**\n * Prop type definitions for attribute parsing\n */\nconst propTypes: PropDefs = {\n variant: 'string',\n size: 'string',\n icon: 'json',\n showArrow: 'boolean',\n highlight: 'string',\n className: 'string'\n};\n\nclass AIPromptSuggestionWC 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 AIPromptSuggestionWrapper,\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(AIPromptSuggestionWC.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-ai-prompt-suggestion')) {\n customElements.define('hf-ai-prompt-suggestion', AIPromptSuggestionWC);\n}\n\nexport { AIPromptSuggestionWC };\nexport default AIPromptSuggestionWC;\n"],"x_google_ignoreList":[0],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hf-ai-prompt-suggestion.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/arrow-right.mjs","../../src/components/organisms/ai/AIPromptSuggestion/AIPromptSuggestion.tsx","../../src/wc/hf-ai-prompt-suggestion.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: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"m12 5 7 7-7 7\", key: \"xquz4c\" }]\n];\nconst ArrowRight = createLucideIcon(\"arrow-right\", __iconNode);\n\nexport { __iconNode, ArrowRight as default };\n//# sourceMappingURL=arrow-right.mjs.map\n","import { cva, type VariantProps } from 'class-variance-authority';\nimport { ArrowRight, Sparkles } from 'lucide-react';\nimport * as React from 'react';\nimport { cn } from '@/lib/utils';\n\n// =============================================================================\n// Variants\n// =============================================================================\n\nconst promptSuggestionVariants = cva(\n 'group inline-flex items-center gap-2 transition-all cursor-pointer',\n {\n variants: {\n variant: {\n default:\n 'px-4 py-2.5 rounded-full border border-border bg-background hover:border-border hover:shadow-sm text-secondary-foreground hover:text-foreground',\n outline:\n 'px-4 py-2.5 rounded-full border border-border bg-transparent hover:bg-muted text-secondary-foreground hover:text-foreground',\n ghost:\n 'px-3 py-2 rounded-lg hover:bg-accent text-muted-foreground hover:text-foreground',\n card: 'flex-col items-start p-4 rounded-xl border border-border bg-background hover:border-primary hover:shadow-md',\n highlight:\n 'text-primary hover:text-primary underline underline-offset-2',\n },\n size: {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-base',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'md',\n },\n },\n);\n\n// =============================================================================\n// Main AIPromptSuggestion Component\n// =============================================================================\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction getSuggestionLimit(max: number | undefined): number | null {\n return typeof max === 'number' && Number.isFinite(max) && max > 0\n ? Math.floor(max)\n : null;\n}\n\ninterface HighlightedTextPart {\n key: string;\n text: string;\n highlighted: boolean;\n}\n\nfunction getHighlightedTextParts(\n text: string,\n highlight: string,\n): HighlightedTextPart[] {\n const escapedHighlight = escapeRegExp(highlight);\n const parts = text.split(new RegExp(`(${escapedHighlight})`, 'gi'));\n const normalizedHighlight = highlight.toLowerCase();\n let offset = 0;\n\n return parts.map((part) => {\n const partOffset = offset;\n offset += part.length;\n\n return {\n key: `${partOffset}:${part.toLowerCase() === normalizedHighlight ? 'highlight' : 'plain'}:${part}`,\n text: part,\n highlighted: part.toLowerCase() === normalizedHighlight,\n };\n });\n}\n\nexport interface AIPromptSuggestionProps\n extends VariantProps<typeof promptSuggestionVariants> {\n /** Suggestion text */\n children: string;\n /** Click handler */\n onClick?: () => void;\n /** Optional icon */\n icon?: React.ReactNode;\n /** Show arrow icon on hover */\n showArrow?: boolean;\n /** Highlight specific text within the suggestion */\n highlight?: string;\n /** Additional class name */\n className?: string;\n}\n\nfunction AIPromptSuggestion({\n children,\n onClick,\n icon,\n showArrow = false,\n highlight,\n variant,\n size,\n className,\n}: AIPromptSuggestionProps) {\n const renderedText = React.useMemo(() => {\n if (!highlight) {\n return <span>{children}</span>;\n }\n\n const parts = getHighlightedTextParts(children, highlight);\n\n return (\n <span>\n {parts.map((part) =>\n part.highlighted ? (\n <span key={part.key} className=\"text-primary font-medium\">\n {part.text}\n </span>\n ) : (\n <span key={part.key}>{part.text}</span>\n ),\n )}\n </span>\n );\n }, [children, highlight]);\n\n return (\n <button\n type=\"button\"\n data-slot=\"ai-prompt-suggestion\"\n onClick={onClick}\n className={cn(\n promptSuggestionVariants({ variant, size }),\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring',\n className,\n )}\n >\n {icon && (\n <span className=\"shrink-0\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n {renderedText}\n {showArrow && variant !== 'highlight' && (\n <ArrowRight\n className=\"size-4 opacity-0 -translate-x-1 group-hover:opacity-100 group-hover:translate-x-0 transition-all motion-reduce:transition-none\"\n aria-hidden=\"true\"\n />\n )}\n </button>\n );\n}\n\nAIPromptSuggestion.displayName = 'AIPromptSuggestion';\n\n// =============================================================================\n// Prompt Suggestion Card (Enhanced variant)\n// =============================================================================\n\nexport interface AIPromptSuggestionCardProps {\n /** Card title */\n title: string;\n /** Card description */\n description?: string;\n /** Icon to display */\n icon?: React.ReactNode;\n /** Click handler */\n onClick?: () => void;\n /** Whether the card is featured/highlighted */\n featured?: boolean;\n /** Additional class name */\n className?: string;\n}\n\nfunction AIPromptSuggestionCard({\n title,\n description,\n icon,\n onClick,\n featured = false,\n className,\n}: AIPromptSuggestionCardProps) {\n return (\n <button\n type=\"button\"\n data-slot=\"ai-prompt-suggestion-card\"\n onClick={onClick}\n className={cn(\n 'group flex flex-col items-start gap-2 p-4 rounded-xl border transition-all text-left focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring',\n featured\n ? 'border-primary bg-primary/10 hover:border-primary hover:shadow-md'\n : 'border-border bg-background hover:border-border hover:shadow-md',\n className,\n )}\n >\n {icon && (\n <div\n className={cn(\n 'size-8 rounded-lg flex items-center justify-center',\n featured\n ? 'bg-primary/20 text-primary'\n : 'bg-accent text-muted-foreground',\n )}\n >\n {icon}\n </div>\n )}\n <div className=\"space-y-1\">\n <h4 className=\"text-sm font-medium text-foreground group-hover:text-primary transition-colors\">\n {title}\n </h4>\n {description && (\n <p className=\"text-xs text-secondary-foreground line-clamp-2\">\n {description}\n </p>\n )}\n </div>\n </button>\n );\n}\n\nAIPromptSuggestionCard.displayName = 'AIPromptSuggestionCard';\n\n// =============================================================================\n// Prompt Suggestion List\n// =============================================================================\n\nexport interface AIPromptSuggestionListProps {\n /** Array of suggestions */\n suggestions: Array<{\n text: string;\n icon?: React.ReactNode;\n }>;\n /** Click handler (receives suggestion text) */\n onSelect?: (text: string) => void;\n /** Variant for all suggestions */\n variant?: AIPromptSuggestionProps['variant'];\n /** Layout direction */\n direction?: 'horizontal' | 'vertical';\n /** Maximum suggestions to show */\n max?: number;\n /** Additional class name */\n className?: string;\n}\n\nfunction AIPromptSuggestionList({\n suggestions,\n onSelect,\n variant = 'default',\n direction = 'horizontal',\n max,\n className,\n}: AIPromptSuggestionListProps) {\n const limit = getSuggestionLimit(max);\n const visibleSuggestions =\n limit === null ? suggestions : suggestions.slice(0, limit);\n\n return (\n <section\n data-slot=\"ai-prompt-suggestion-list\"\n aria-label=\"Prompt suggestions\"\n className={cn(\n 'flex gap-2',\n direction === 'horizontal' ? 'flex-wrap' : 'flex-col',\n className,\n )}\n >\n {visibleSuggestions.map((suggestion) => (\n <AIPromptSuggestion\n key={suggestion.text}\n variant={variant}\n icon={suggestion.icon}\n onClick={() => onSelect?.(suggestion.text)}\n >\n {suggestion.text}\n </AIPromptSuggestion>\n ))}\n </section>\n );\n}\n\nAIPromptSuggestionList.displayName = 'AIPromptSuggestionList';\n\n// =============================================================================\n// Quick Actions Grid\n// =============================================================================\n\nexport interface QuickAction {\n id: string;\n title: string;\n description?: string;\n icon?: React.ReactNode;\n prompt: string;\n}\n\nexport interface AIQuickActionsProps {\n /** Array of quick actions */\n actions: QuickAction[];\n /** Click handler (receives action prompt) */\n onSelect?: (prompt: string) => void;\n /** Visual variant */\n variant?: 'card' | 'pill';\n /** Number of columns (only for card variant) */\n columns?: 2 | 3 | 4;\n /** Additional class name */\n className?: string;\n}\n\nfunction AIQuickActions({\n actions,\n onSelect,\n variant = 'card',\n columns = 2,\n className,\n}: AIQuickActionsProps) {\n const gridCols = {\n 2: 'grid-cols-2',\n 3: 'grid-cols-3',\n 4: 'grid-cols-4',\n };\n\n if (variant === 'pill') {\n return (\n <div className={cn('flex flex-wrap gap-2', className)}>\n {actions.map((action) => (\n <AIPromptSuggestion\n key={action.id}\n icon={action.icon || <Sparkles className=\"size-4\" />}\n onClick={() => onSelect?.(action.prompt)}\n >\n {action.title}\n </AIPromptSuggestion>\n ))}\n </div>\n );\n }\n\n return (\n <div className={cn('grid gap-3', gridCols[columns], className)}>\n {actions.map((action) => (\n <AIPromptSuggestionCard\n key={action.id}\n title={action.title}\n description={action.description}\n icon={action.icon || <Sparkles className=\"size-4\" />}\n onClick={() => onSelect?.(action.prompt)}\n />\n ))}\n </div>\n );\n}\n\nAIQuickActions.displayName = 'AIQuickActions';\n\nexport {\n AIPromptSuggestion,\n AIPromptSuggestionCard,\n AIPromptSuggestionList,\n AIQuickActions,\n promptSuggestionVariants,\n};\n","/**\n * Web Component wrapper for AIPromptSuggestion\n * Custom element: <hf-ai-prompt-suggestion>\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 { AIPromptSuggestion } from '../components/organisms/ai/AIPromptSuggestion';\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 onClick: (value: unknown) => {\n const CustomEventConstructor =\n element.ownerDocument.defaultView?.CustomEvent ?? CustomEvent;\n element.dispatchEvent(new CustomEventConstructor('click', {\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 AIPromptSuggestionWrapper(props: React.ComponentProps<typeof AIPromptSuggestion> & { _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(AIPromptSuggestion, { ...restProps, ...eventHandlers });\n}\n\n/**\n * Prop type definitions for attribute parsing\n */\nconst propTypes: PropDefs = {\n variant: 'string',\n size: 'string',\n icon: 'json',\n showArrow: 'boolean',\n highlight: 'string',\n className: 'string'\n};\n\nclass AIPromptSuggestionWC 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 AIPromptSuggestionWrapper,\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(AIPromptSuggestionWC.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-ai-prompt-suggestion')) {\n customElements.define('hf-ai-prompt-suggestion', AIPromptSuggestionWC);\n}\n\nexport { AIPromptSuggestionWC };\nexport default AIPromptSuggestionWC;\n"],"x_google_ignoreList":[0],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { a as k } from "./rolldown-runtime.js";
|
|
2
2
|
import { i as T, n as E, t as A } from "./vendor/react.js";
|
|
3
|
-
import { n as
|
|
3
|
+
import { n as o } from "./utils.js";
|
|
4
4
|
import { c as w, s as h } from "./_shared.js";
|
|
5
5
|
import { t as z } from "./createLucideIcon.js";
|
|
6
6
|
import { t as R } from "./chevron-down.js";
|
|
@@ -42,7 +42,7 @@ var D = [
|
|
|
42
42
|
});
|
|
43
43
|
function g({ className: e }) {
|
|
44
44
|
return /* @__PURE__ */ (0, n.jsxs)("div", {
|
|
45
|
-
className:
|
|
45
|
+
className: o("flex items-center gap-1", e),
|
|
46
46
|
role: "status",
|
|
47
47
|
"aria-label": "Thinking",
|
|
48
48
|
children: [
|
|
@@ -88,18 +88,18 @@ function g({ className: e }) {
|
|
|
88
88
|
]
|
|
89
89
|
});
|
|
90
90
|
}
|
|
91
|
-
function b({ title: e = "Reasoning", isOpen: r, onToggle: t, isStreaming: i = !1, duration: a, contentId:
|
|
91
|
+
function b({ title: e = "Reasoning", isOpen: r, onToggle: t, isStreaming: i = !1, duration: a, contentId: s, className: u }) {
|
|
92
92
|
return /* @__PURE__ */ (0, n.jsxs)("button", {
|
|
93
93
|
type: "button",
|
|
94
94
|
onClick: t,
|
|
95
95
|
"aria-expanded": r,
|
|
96
|
-
"aria-controls":
|
|
97
|
-
className:
|
|
96
|
+
"aria-controls": s,
|
|
97
|
+
className: o("flex items-center justify-between w-full px-4 py-3 transition-colors hover:bg-foreground/5 focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-ring rounded-xl", u),
|
|
98
98
|
children: [/* @__PURE__ */ (0, n.jsxs)("div", {
|
|
99
99
|
className: "flex items-center gap-2",
|
|
100
100
|
children: [
|
|
101
101
|
/* @__PURE__ */ (0, n.jsx)(f, {
|
|
102
|
-
className:
|
|
102
|
+
className: o("size-4", i ? "text-primary" : "text-muted-foreground"),
|
|
103
103
|
"aria-hidden": "true"
|
|
104
104
|
}),
|
|
105
105
|
/* @__PURE__ */ (0, n.jsx)("span", {
|
|
@@ -124,7 +124,7 @@ function b({ title: e = "Reasoning", isOpen: r, onToggle: t, isStreaming: i = !1
|
|
|
124
124
|
b.displayName = "AIReasoningTrigger";
|
|
125
125
|
function x({ children: e, markdown: r = !0, className: t }) {
|
|
126
126
|
return /* @__PURE__ */ (0, n.jsx)("div", {
|
|
127
|
-
className:
|
|
127
|
+
className: o("px-4 pb-4", t),
|
|
128
128
|
children: r && typeof e == "string" ? /* @__PURE__ */ (0, n.jsx)(M, {
|
|
129
129
|
className: "text-sm text-secondary-foreground",
|
|
130
130
|
children: e
|
|
@@ -135,7 +135,7 @@ function x({ children: e, markdown: r = !0, className: t }) {
|
|
|
135
135
|
});
|
|
136
136
|
}
|
|
137
137
|
x.displayName = "AIReasoningContent";
|
|
138
|
-
function y({ children: e, title: r = "Reasoning", open: t, defaultOpen: i = !1, onOpenChange: a, isStreaming:
|
|
138
|
+
function y({ children: e, title: r = "Reasoning", open: t, defaultOpen: i = !1, onOpenChange: a, isStreaming: s = !1, markdown: u = !0, duration: v, variant: N, className: C }) {
|
|
139
139
|
const m = d.useId(), [p, j] = V({
|
|
140
140
|
value: t,
|
|
141
141
|
defaultValue: i,
|
|
@@ -145,15 +145,15 @@ function y({ children: e, title: r = "Reasoning", open: t, defaultOpen: i = !1,
|
|
|
145
145
|
};
|
|
146
146
|
return /* @__PURE__ */ (0, n.jsxs)("div", {
|
|
147
147
|
"data-slot": "ai-reasoning-block",
|
|
148
|
-
className:
|
|
149
|
-
variant:
|
|
150
|
-
state:
|
|
148
|
+
className: o(L({
|
|
149
|
+
variant: s ? "thinking" : N,
|
|
150
|
+
state: s ? "streaming" : "idle"
|
|
151
151
|
}), C),
|
|
152
152
|
children: [/* @__PURE__ */ (0, n.jsx)(b, {
|
|
153
153
|
title: r,
|
|
154
154
|
isOpen: p,
|
|
155
155
|
onToggle: I,
|
|
156
|
-
isStreaming:
|
|
156
|
+
isStreaming: s,
|
|
157
157
|
duration: v,
|
|
158
158
|
contentId: m
|
|
159
159
|
}), /* @__PURE__ */ (0, n.jsx)(B, { children: p && /* @__PURE__ */ (0, n.jsx)(c.section, {
|
|
@@ -196,7 +196,7 @@ function q({ text: e = "Thinking...", isThinking: r = !0, action: t, className:
|
|
|
196
196
|
opacity: 0,
|
|
197
197
|
y: -10
|
|
198
198
|
},
|
|
199
|
-
className:
|
|
199
|
+
className: o("flex items-center justify-between px-4 py-2 rounded-lg bg-primary/10 border border-primary motion-reduce:animate-none", i),
|
|
200
200
|
children: [/* @__PURE__ */ (0, n.jsxs)("div", {
|
|
201
201
|
className: "flex items-center gap-2",
|
|
202
202
|
children: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hf-ai-reasoning-block.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/lightbulb.mjs","../../src/components/organisms/ai/AIReasoningBlock/AIReasoningBlock.tsx","../../src/wc/hf-ai-reasoning-block.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 {\n d: \"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5\",\n key: \"1gvzjb\"\n }\n ],\n [\"path\", { d: \"M9 18h6\", key: \"x1upvd\" }],\n [\"path\", { d: \"M10 22h4\", key: \"ceow96\" }]\n];\nconst Lightbulb = createLucideIcon(\"lightbulb\", __iconNode);\n\nexport { __iconNode, Lightbulb as default };\n//# sourceMappingURL=lightbulb.mjs.map\n","import { cva, type VariantProps } from 'class-variance-authority';\nimport { ChevronDown, ChevronRight, Lightbulb } from 'lucide-react';\nimport { AnimatePresence, motion } from 'motion/react';\nimport * as React from 'react';\nimport { MarkdownRenderer } from '@/components/organisms/ai/_shared/markdown-renderer';\nimport { useControllableState } from '@/hooks/use-controllable-state';\nimport { cn } from '@/lib/utils';\n\n// =============================================================================\n// Variants\n// =============================================================================\n\nconst reasoningBlockVariants = cva(\n 'overflow-hidden rounded-xl border transition-colors',\n {\n variants: {\n variant: {\n default: 'border-border bg-muted',\n thinking: 'border-primary bg-primary/10',\n subtle: 'border-border bg-background',\n },\n state: {\n idle: '',\n streaming: 'border-primary',\n },\n },\n defaultVariants: {\n variant: 'default',\n state: 'idle',\n },\n },\n);\n\n// =============================================================================\n// Thinking Indicator\n// =============================================================================\n\ninterface ThinkingIndicatorProps {\n className?: string;\n}\n\nfunction ThinkingIndicator({ className }: ThinkingIndicatorProps) {\n return (\n <div\n className={cn('flex items-center gap-1', className)}\n role=\"status\"\n aria-label=\"Thinking\"\n >\n <motion.span\n className=\"size-1.5 rounded-full bg-primary motion-reduce:animate-none\"\n animate={{ opacity: [0.3, 1, 0.3] }}\n transition={{\n duration: 1.5,\n repeat: Number.POSITIVE_INFINITY,\n delay: 0,\n }}\n />\n <motion.span\n className=\"size-1.5 rounded-full bg-primary motion-reduce:animate-none\"\n animate={{ opacity: [0.3, 1, 0.3] }}\n transition={{\n duration: 1.5,\n repeat: Number.POSITIVE_INFINITY,\n delay: 0.2,\n }}\n />\n <motion.span\n className=\"size-1.5 rounded-full bg-primary motion-reduce:animate-none\"\n animate={{ opacity: [0.3, 1, 0.3] }}\n transition={{\n duration: 1.5,\n repeat: Number.POSITIVE_INFINITY,\n delay: 0.4,\n }}\n />\n </div>\n );\n}\n\n// =============================================================================\n// Reasoning Trigger (Header)\n// =============================================================================\n\nexport interface AIReasoningTriggerProps {\n /** Title text */\n title?: string;\n /** Whether the block is expanded */\n isOpen: boolean;\n /** Callback to toggle open state */\n onToggle: () => void;\n /** Whether AI is currently streaming/thinking */\n isStreaming?: boolean;\n /** Duration text to display */\n duration?: string;\n /** ID of the controlled content panel */\n contentId?: string;\n /** Additional class name */\n className?: string;\n}\n\nfunction AIReasoningTrigger({\n title = 'Reasoning',\n isOpen,\n onToggle,\n isStreaming = false,\n duration,\n contentId,\n className,\n}: AIReasoningTriggerProps) {\n return (\n <button\n type=\"button\"\n onClick={onToggle}\n aria-expanded={isOpen}\n aria-controls={contentId}\n className={cn(\n 'flex items-center justify-between w-full px-4 py-3 transition-colors hover:bg-foreground/5 focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-ring rounded-xl',\n className,\n )}\n >\n <div className=\"flex items-center gap-2\">\n <Lightbulb\n className={cn(\n 'size-4',\n isStreaming ? 'text-primary' : 'text-text-quaternary',\n )}\n aria-hidden=\"true\"\n />\n <span className=\"text-sm font-medium text-foreground\">{title}</span>\n {isStreaming && <ThinkingIndicator />}\n {duration && !isStreaming && (\n <span className=\"text-xs text-muted-foreground\">{duration}</span>\n )}\n </div>\n {isOpen ? (\n <ChevronDown\n className=\"size-4 text-muted-foreground transition-transform\"\n aria-hidden=\"true\"\n />\n ) : (\n <ChevronRight\n className=\"size-4 text-muted-foreground rtl:rotate-180 transition-transform\"\n aria-hidden=\"true\"\n />\n )}\n </button>\n );\n}\n\nAIReasoningTrigger.displayName = 'AIReasoningTrigger';\n\n// =============================================================================\n// Reasoning Content\n// =============================================================================\n\nexport interface AIReasoningContentProps {\n /** Content to display (can be markdown string or ReactNode) */\n children: React.ReactNode;\n /** Whether to render as markdown */\n markdown?: boolean;\n /** Additional class name */\n className?: string;\n}\n\nfunction AIReasoningContent({\n children,\n markdown = true,\n className,\n}: AIReasoningContentProps) {\n return (\n <div className={cn('px-4 pb-4', className)}>\n {markdown && typeof children === 'string' ? (\n <MarkdownRenderer className=\"text-sm text-secondary-foreground\">\n {children}\n </MarkdownRenderer>\n ) : (\n <div className=\"text-sm text-secondary-foreground\">{children}</div>\n )}\n </div>\n );\n}\n\nAIReasoningContent.displayName = 'AIReasoningContent';\n\n// =============================================================================\n// Main AIReasoningBlock Component\n// =============================================================================\n\nexport interface AIReasoningBlockProps\n extends VariantProps<typeof reasoningBlockVariants> {\n /** Reasoning content (markdown string or ReactNode) */\n children: React.ReactNode;\n /** Title for the reasoning block */\n title?: string;\n /** Controlled open state */\n open?: boolean;\n /** Default open state (uncontrolled) */\n defaultOpen?: boolean;\n /** Callback when open state changes */\n onOpenChange?: (open: boolean) => void;\n /** Whether AI is currently streaming/thinking */\n isStreaming?: boolean;\n /** Whether to render content as markdown */\n markdown?: boolean;\n /** Duration text to display */\n duration?: string;\n /** Additional class name */\n className?: string;\n}\n\nfunction AIReasoningBlock({\n children,\n title = 'Reasoning',\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n isStreaming = false,\n markdown = true,\n duration,\n variant,\n className,\n}: AIReasoningBlockProps) {\n const contentId = React.useId();\n\n const [isOpen, setIsOpen] = useControllableState({\n value: controlledOpen,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n\n const handleToggle = () => {\n setIsOpen(!isOpen);\n };\n\n return (\n <div\n data-slot=\"ai-reasoning-block\"\n className={cn(\n reasoningBlockVariants({\n variant: isStreaming ? 'thinking' : variant,\n state: isStreaming ? 'streaming' : 'idle',\n }),\n className,\n )}\n >\n <AIReasoningTrigger\n title={title}\n isOpen={isOpen}\n onToggle={handleToggle}\n isStreaming={isStreaming}\n duration={duration}\n contentId={contentId}\n />\n\n <AnimatePresence>\n {isOpen && (\n <motion.section\n id={contentId}\n aria-label={title}\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: 'auto', opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={{ duration: 0.2 }}\n className=\"overflow-hidden\"\n >\n <AIReasoningContent markdown={markdown}>\n {children}\n </AIReasoningContent>\n </motion.section>\n )}\n </AnimatePresence>\n </div>\n );\n}\n\nAIReasoningBlock.displayName = 'AIReasoningBlock';\n\n// =============================================================================\n// Thinking Bar (Minimal variant)\n// =============================================================================\n\nexport interface AIThinkingBarProps {\n /** Text to display */\n text?: string;\n /** Whether thinking is active */\n isThinking?: boolean;\n /** Action button content */\n action?: React.ReactNode;\n /** Additional class name */\n className?: string;\n}\n\nfunction AIThinkingBar({\n text = 'Thinking...',\n isThinking = true,\n action,\n className,\n}: AIThinkingBarProps) {\n if (!isThinking) return null;\n\n return (\n <motion.div\n data-slot=\"ai-thinking-bar\"\n initial={{ opacity: 0, y: -10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -10 }}\n className={cn(\n 'flex items-center justify-between px-4 py-2 rounded-lg bg-primary/10 border border-primary motion-reduce:animate-none',\n className,\n )}\n >\n <div className=\"flex items-center gap-2\">\n <Lightbulb className=\"size-4 text-primary\" aria-hidden=\"true\" />\n <span className=\"text-sm text-primary\">{text}</span>\n <ThinkingIndicator />\n </div>\n {action}\n </motion.div>\n );\n}\n\nAIThinkingBar.displayName = 'AIThinkingBar';\n\nexport {\n AIReasoningBlock,\n AIReasoningContent,\n AIReasoningTrigger,\n AIThinkingBar,\n reasoningBlockVariants,\n ThinkingIndicator,\n};\n","/**\n * Web Component wrapper for AIReasoningBlock\n * Custom element: <hf-ai-reasoning-block>\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 { AIReasoningBlock } from '../components/organisms/ai/AIReasoningBlock';\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 AIReasoningBlockWrapper(props: React.ComponentProps<typeof AIReasoningBlock> & { _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(AIReasoningBlock, { ...restProps, ...eventHandlers });\n}\n\n/**\n * Prop type definitions for attribute parsing\n */\nconst propTypes: PropDefs = {\n variant: 'string',\n state: 'string',\n title: 'string',\n open: 'boolean',\n defaultOpen: 'boolean',\n isStreaming: 'boolean',\n markdown: 'boolean',\n duration: 'string',\n className: 'string'\n};\n\nclass AIReasoningBlockWC 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 AIReasoningBlockWrapper,\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(AIReasoningBlockWC.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-ai-reasoning-block')) {\n customElements.define('hf-ai-reasoning-block', AIReasoningBlockWC);\n}\n\nexport { AIReasoningBlockWC };\nexport default AIReasoningBlockWC;\n"],"x_google_ignoreList":[0],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hf-ai-reasoning-block.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/lightbulb.mjs","../../src/components/organisms/ai/AIReasoningBlock/AIReasoningBlock.tsx","../../src/wc/hf-ai-reasoning-block.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 {\n d: \"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5\",\n key: \"1gvzjb\"\n }\n ],\n [\"path\", { d: \"M9 18h6\", key: \"x1upvd\" }],\n [\"path\", { d: \"M10 22h4\", key: \"ceow96\" }]\n];\nconst Lightbulb = createLucideIcon(\"lightbulb\", __iconNode);\n\nexport { __iconNode, Lightbulb as default };\n//# sourceMappingURL=lightbulb.mjs.map\n","import { cva, type VariantProps } from 'class-variance-authority';\nimport { ChevronDown, ChevronRight, Lightbulb } from 'lucide-react';\nimport { AnimatePresence, motion } from 'motion/react';\nimport * as React from 'react';\nimport { MarkdownRenderer } from '@/components/organisms/ai/_shared/markdown-renderer';\nimport { useControllableState } from '@/hooks/use-controllable-state';\nimport { cn } from '@/lib/utils';\n\n// =============================================================================\n// Variants\n// =============================================================================\n\nconst reasoningBlockVariants = cva(\n 'overflow-hidden rounded-xl border transition-colors',\n {\n variants: {\n variant: {\n default: 'border-border bg-muted',\n thinking: 'border-primary bg-primary/10',\n subtle: 'border-border bg-background',\n },\n state: {\n idle: '',\n streaming: 'border-primary',\n },\n },\n defaultVariants: {\n variant: 'default',\n state: 'idle',\n },\n },\n);\n\n// =============================================================================\n// Thinking Indicator\n// =============================================================================\n\ninterface ThinkingIndicatorProps {\n className?: string;\n}\n\nfunction ThinkingIndicator({ className }: ThinkingIndicatorProps) {\n return (\n <div\n className={cn('flex items-center gap-1', className)}\n role=\"status\"\n aria-label=\"Thinking\"\n >\n <motion.span\n className=\"size-1.5 rounded-full bg-primary motion-reduce:animate-none\"\n animate={{ opacity: [0.3, 1, 0.3] }}\n transition={{\n duration: 1.5,\n repeat: Number.POSITIVE_INFINITY,\n delay: 0,\n }}\n />\n <motion.span\n className=\"size-1.5 rounded-full bg-primary motion-reduce:animate-none\"\n animate={{ opacity: [0.3, 1, 0.3] }}\n transition={{\n duration: 1.5,\n repeat: Number.POSITIVE_INFINITY,\n delay: 0.2,\n }}\n />\n <motion.span\n className=\"size-1.5 rounded-full bg-primary motion-reduce:animate-none\"\n animate={{ opacity: [0.3, 1, 0.3] }}\n transition={{\n duration: 1.5,\n repeat: Number.POSITIVE_INFINITY,\n delay: 0.4,\n }}\n />\n </div>\n );\n}\n\n// =============================================================================\n// Reasoning Trigger (Header)\n// =============================================================================\n\nexport interface AIReasoningTriggerProps {\n /** Title text */\n title?: string;\n /** Whether the block is expanded */\n isOpen: boolean;\n /** Callback to toggle open state */\n onToggle: () => void;\n /** Whether AI is currently streaming/thinking */\n isStreaming?: boolean;\n /** Duration text to display */\n duration?: string;\n /** ID of the controlled content panel */\n contentId?: string;\n /** Additional class name */\n className?: string;\n}\n\nfunction AIReasoningTrigger({\n title = 'Reasoning',\n isOpen,\n onToggle,\n isStreaming = false,\n duration,\n contentId,\n className,\n}: AIReasoningTriggerProps) {\n return (\n <button\n type=\"button\"\n onClick={onToggle}\n aria-expanded={isOpen}\n aria-controls={contentId}\n className={cn(\n 'flex items-center justify-between w-full px-4 py-3 transition-colors hover:bg-foreground/5 focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-ring rounded-xl',\n className,\n )}\n >\n <div className=\"flex items-center gap-2\">\n <Lightbulb\n className={cn(\n 'size-4',\n isStreaming ? 'text-primary' : 'text-muted-foreground',\n )}\n aria-hidden=\"true\"\n />\n <span className=\"text-sm font-medium text-foreground\">{title}</span>\n {isStreaming && <ThinkingIndicator />}\n {duration && !isStreaming && (\n <span className=\"text-xs text-muted-foreground\">{duration}</span>\n )}\n </div>\n {isOpen ? (\n <ChevronDown\n className=\"size-4 text-muted-foreground transition-transform\"\n aria-hidden=\"true\"\n />\n ) : (\n <ChevronRight\n className=\"size-4 text-muted-foreground rtl:rotate-180 transition-transform\"\n aria-hidden=\"true\"\n />\n )}\n </button>\n );\n}\n\nAIReasoningTrigger.displayName = 'AIReasoningTrigger';\n\n// =============================================================================\n// Reasoning Content\n// =============================================================================\n\nexport interface AIReasoningContentProps {\n /** Content to display (can be markdown string or ReactNode) */\n children: React.ReactNode;\n /** Whether to render as markdown */\n markdown?: boolean;\n /** Additional class name */\n className?: string;\n}\n\nfunction AIReasoningContent({\n children,\n markdown = true,\n className,\n}: AIReasoningContentProps) {\n return (\n <div className={cn('px-4 pb-4', className)}>\n {markdown && typeof children === 'string' ? (\n <MarkdownRenderer className=\"text-sm text-secondary-foreground\">\n {children}\n </MarkdownRenderer>\n ) : (\n <div className=\"text-sm text-secondary-foreground\">{children}</div>\n )}\n </div>\n );\n}\n\nAIReasoningContent.displayName = 'AIReasoningContent';\n\n// =============================================================================\n// Main AIReasoningBlock Component\n// =============================================================================\n\nexport interface AIReasoningBlockProps\n extends VariantProps<typeof reasoningBlockVariants> {\n /** Reasoning content (markdown string or ReactNode) */\n children: React.ReactNode;\n /** Title for the reasoning block */\n title?: string;\n /** Controlled open state */\n open?: boolean;\n /** Default open state (uncontrolled) */\n defaultOpen?: boolean;\n /** Callback when open state changes */\n onOpenChange?: (open: boolean) => void;\n /** Whether AI is currently streaming/thinking */\n isStreaming?: boolean;\n /** Whether to render content as markdown */\n markdown?: boolean;\n /** Duration text to display */\n duration?: string;\n /** Additional class name */\n className?: string;\n}\n\nfunction AIReasoningBlock({\n children,\n title = 'Reasoning',\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n isStreaming = false,\n markdown = true,\n duration,\n variant,\n className,\n}: AIReasoningBlockProps) {\n const contentId = React.useId();\n\n const [isOpen, setIsOpen] = useControllableState({\n value: controlledOpen,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n\n const handleToggle = () => {\n setIsOpen(!isOpen);\n };\n\n return (\n <div\n data-slot=\"ai-reasoning-block\"\n className={cn(\n reasoningBlockVariants({\n variant: isStreaming ? 'thinking' : variant,\n state: isStreaming ? 'streaming' : 'idle',\n }),\n className,\n )}\n >\n <AIReasoningTrigger\n title={title}\n isOpen={isOpen}\n onToggle={handleToggle}\n isStreaming={isStreaming}\n duration={duration}\n contentId={contentId}\n />\n\n <AnimatePresence>\n {isOpen && (\n <motion.section\n id={contentId}\n aria-label={title}\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: 'auto', opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={{ duration: 0.2 }}\n className=\"overflow-hidden\"\n >\n <AIReasoningContent markdown={markdown}>\n {children}\n </AIReasoningContent>\n </motion.section>\n )}\n </AnimatePresence>\n </div>\n );\n}\n\nAIReasoningBlock.displayName = 'AIReasoningBlock';\n\n// =============================================================================\n// Thinking Bar (Minimal variant)\n// =============================================================================\n\nexport interface AIThinkingBarProps {\n /** Text to display */\n text?: string;\n /** Whether thinking is active */\n isThinking?: boolean;\n /** Action button content */\n action?: React.ReactNode;\n /** Additional class name */\n className?: string;\n}\n\nfunction AIThinkingBar({\n text = 'Thinking...',\n isThinking = true,\n action,\n className,\n}: AIThinkingBarProps) {\n if (!isThinking) return null;\n\n return (\n <motion.div\n data-slot=\"ai-thinking-bar\"\n initial={{ opacity: 0, y: -10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -10 }}\n className={cn(\n 'flex items-center justify-between px-4 py-2 rounded-lg bg-primary/10 border border-primary motion-reduce:animate-none',\n className,\n )}\n >\n <div className=\"flex items-center gap-2\">\n <Lightbulb className=\"size-4 text-primary\" aria-hidden=\"true\" />\n <span className=\"text-sm text-primary\">{text}</span>\n <ThinkingIndicator />\n </div>\n {action}\n </motion.div>\n );\n}\n\nAIThinkingBar.displayName = 'AIThinkingBar';\n\nexport {\n AIReasoningBlock,\n AIReasoningContent,\n AIReasoningTrigger,\n AIThinkingBar,\n reasoningBlockVariants,\n ThinkingIndicator,\n};\n","/**\n * Web Component wrapper for AIReasoningBlock\n * Custom element: <hf-ai-reasoning-block>\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 { AIReasoningBlock } from '../components/organisms/ai/AIReasoningBlock';\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 AIReasoningBlockWrapper(props: React.ComponentProps<typeof AIReasoningBlock> & { _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(AIReasoningBlock, { ...restProps, ...eventHandlers });\n}\n\n/**\n * Prop type definitions for attribute parsing\n */\nconst propTypes: PropDefs = {\n variant: 'string',\n state: 'string',\n title: 'string',\n open: 'boolean',\n defaultOpen: 'boolean',\n isStreaming: 'boolean',\n markdown: 'boolean',\n duration: 'string',\n className: 'string'\n};\n\nclass AIReasoningBlockWC 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 AIReasoningBlockWrapper,\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(AIReasoningBlockWC.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-ai-reasoning-block')) {\n customElements.define('hf-ai-reasoning-block', AIReasoningBlockWC);\n}\n\nexport { AIReasoningBlockWC };\nexport default AIReasoningBlockWC;\n"],"x_google_ignoreList":[0],"mappings":"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"}
|
package/dist/wc/hf-ai-steps.js
CHANGED
|
@@ -11,22 +11,22 @@ import { n as O, r as P, t as R } from "./workflow-step-renderer.js";
|
|
|
11
11
|
import { t as u } from "./dist.js";
|
|
12
12
|
import { t as L } from "./react.js";
|
|
13
13
|
import { t as M } from "./AnimatePresence.js";
|
|
14
|
-
import { t as
|
|
15
|
-
var m = /* @__PURE__ */ N(E(), 1), s = A(),
|
|
14
|
+
import { t as D } from "./use-reduced-motion2.js";
|
|
15
|
+
var m = /* @__PURE__ */ N(E(), 1), s = A(), q = u("overflow-hidden rounded-xl border", {
|
|
16
16
|
variants: { variant: {
|
|
17
17
|
default: "border-border bg-background",
|
|
18
18
|
subtle: "border-border bg-muted"
|
|
19
19
|
} },
|
|
20
20
|
defaultVariants: { variant: "default" }
|
|
21
|
-
}),
|
|
21
|
+
}), oe = u("flex items-start gap-3 px-4 py-3 transition-colors", {
|
|
22
22
|
variants: { status: {
|
|
23
|
-
pending: "text-
|
|
23
|
+
pending: "text-secondary-foreground",
|
|
24
24
|
running: "text-primary",
|
|
25
25
|
completed: "text-success",
|
|
26
26
|
error: "text-destructive"
|
|
27
27
|
} },
|
|
28
28
|
defaultVariants: { status: "pending" }
|
|
29
|
-
}),
|
|
29
|
+
}), ae = u("size-5 shrink-0 flex items-center justify-center rounded-full", {
|
|
30
30
|
variants: { status: {
|
|
31
31
|
pending: "bg-accent text-muted-foreground",
|
|
32
32
|
running: "bg-primary/20 text-primary",
|
|
@@ -40,34 +40,34 @@ var m = /* @__PURE__ */ N(E(), 1), s = A(), D = u("overflow-hidden rounded-xl bo
|
|
|
40
40
|
completed: "completed",
|
|
41
41
|
error: "error"
|
|
42
42
|
};
|
|
43
|
-
function b(
|
|
44
|
-
return Z[
|
|
43
|
+
function b(e) {
|
|
44
|
+
return Z[e];
|
|
45
45
|
}
|
|
46
|
-
function v(
|
|
47
|
-
const
|
|
46
|
+
function v(e) {
|
|
47
|
+
const t = e.error?.trim() ? e.error : void 0;
|
|
48
48
|
return {
|
|
49
|
-
id:
|
|
50
|
-
title:
|
|
51
|
-
description:
|
|
52
|
-
status: b(
|
|
53
|
-
content:
|
|
54
|
-
durationMs:
|
|
55
|
-
error:
|
|
49
|
+
id: e.id,
|
|
50
|
+
title: e.title,
|
|
51
|
+
description: e.description,
|
|
52
|
+
status: b(e.status),
|
|
53
|
+
content: t === void 0 ? e.content : void 0,
|
|
54
|
+
durationMs: e.status === "completed" ? e.duration : void 0,
|
|
55
|
+
error: t
|
|
56
56
|
};
|
|
57
57
|
}
|
|
58
|
-
function $({ status:
|
|
58
|
+
function $({ status: e, index: t, className: r }) {
|
|
59
59
|
return /* @__PURE__ */ (0, s.jsx)(P, {
|
|
60
|
-
status: b(
|
|
61
|
-
index:
|
|
60
|
+
status: b(e),
|
|
61
|
+
index: t,
|
|
62
62
|
className: r
|
|
63
63
|
});
|
|
64
64
|
}
|
|
65
65
|
$.displayName = "StepIcon";
|
|
66
|
-
function U({ step:
|
|
66
|
+
function U({ step: e, index: t, isLast: r, expandable: i = !0, defaultExpanded: o = !1 }) {
|
|
67
67
|
const [c, l] = m.useState(o);
|
|
68
68
|
return /* @__PURE__ */ (0, s.jsx)(R, {
|
|
69
|
-
step: v(
|
|
70
|
-
index:
|
|
69
|
+
step: v(e),
|
|
70
|
+
index: t,
|
|
71
71
|
isLast: r,
|
|
72
72
|
appearance: "contained",
|
|
73
73
|
itemSlot: "ai-step-item",
|
|
@@ -77,13 +77,13 @@ function U({ step: t, index: e, isLast: r, expandable: i = !0, defaultExpanded:
|
|
|
77
77
|
});
|
|
78
78
|
}
|
|
79
79
|
U.displayName = "AIStepItem";
|
|
80
|
-
function y({ steps:
|
|
81
|
-
const [n, S] = m.useState(o), j =
|
|
80
|
+
function y({ steps: e, title: t, variant: r, collapsible: i = !0, defaultExpanded: o = !0, stepsExpandable: c = !0, className: l }) {
|
|
81
|
+
const [n, S] = m.useState(o), j = D(), f = e.filter((a) => a.status === "completed").length, h = e.length, x = e.some((a) => a.status === "error"), p = e.some((a) => a.status === "running");
|
|
82
82
|
return /* @__PURE__ */ (0, s.jsxs)("section", {
|
|
83
83
|
"data-slot": "ai-steps",
|
|
84
|
-
"aria-label":
|
|
85
|
-
className: g(
|
|
86
|
-
children: [(
|
|
84
|
+
"aria-label": t || "Steps",
|
|
85
|
+
className: g(q({ variant: r }), l),
|
|
86
|
+
children: [(t || i) && /* @__PURE__ */ (0, s.jsxs)("button", {
|
|
87
87
|
type: "button",
|
|
88
88
|
onClick: () => i && S(!n),
|
|
89
89
|
disabled: !i,
|
|
@@ -97,10 +97,10 @@ function y({ steps: t, title: e, variant: r, collapsible: i = !0, defaultExpande
|
|
|
97
97
|
!p && !x && f === h && /* @__PURE__ */ (0, s.jsx)(I, { className: "size-4 text-success" }),
|
|
98
98
|
/* @__PURE__ */ (0, s.jsx)("span", {
|
|
99
99
|
className: "text-sm font-medium text-foreground",
|
|
100
|
-
children:
|
|
100
|
+
children: t || "Steps"
|
|
101
101
|
}),
|
|
102
102
|
/* @__PURE__ */ (0, s.jsxs)("span", {
|
|
103
|
-
className: "text-xs text-
|
|
103
|
+
className: "text-xs text-secondary-foreground",
|
|
104
104
|
children: [
|
|
105
105
|
"(",
|
|
106
106
|
f,
|
|
@@ -133,7 +133,7 @@ function y({ steps: t, title: e, variant: r, collapsible: i = !0, defaultExpande
|
|
|
133
133
|
className: "overflow-hidden",
|
|
134
134
|
children: /* @__PURE__ */ (0, s.jsx)(O, {
|
|
135
135
|
appearance: "contained",
|
|
136
|
-
steps:
|
|
136
|
+
steps: e.map(v),
|
|
137
137
|
itemSlot: "ai-step-item",
|
|
138
138
|
expandable: c
|
|
139
139
|
})
|
|
@@ -161,49 +161,49 @@ var B = w(), d = {
|
|
|
161
161
|
_initialize() {
|
|
162
162
|
if (this._initialized) return;
|
|
163
163
|
this._initialized = !0;
|
|
164
|
-
const
|
|
164
|
+
const e = [];
|
|
165
165
|
for (const r of Array.from(this.childNodes))
|
|
166
|
-
r.nodeType === Node.TEXT_NODE && !r.textContent?.trim() ||
|
|
167
|
-
const
|
|
168
|
-
for (
|
|
169
|
-
this.appendChild(
|
|
166
|
+
r.nodeType === Node.TEXT_NODE && !r.textContent?.trim() || e.push(r);
|
|
167
|
+
const t = this.ownerDocument.createElement("div");
|
|
168
|
+
for (t.style.display = "contents", this._childrenContainer = this.ownerDocument.createElement("div"), this._childrenContainer.style.display = "contents", e.forEach((r) => this._childrenContainer.appendChild(r)); this.firstChild; ) this.removeChild(this.firstChild);
|
|
169
|
+
this.appendChild(t), this._root = (0, B.createRoot)(t), this._render();
|
|
170
170
|
}
|
|
171
171
|
disconnectedCallback() {
|
|
172
172
|
this._root?.unmount(), this._root = null;
|
|
173
173
|
}
|
|
174
|
-
attributeChangedCallback(
|
|
174
|
+
attributeChangedCallback(e, t, r) {
|
|
175
175
|
this._render();
|
|
176
176
|
}
|
|
177
177
|
static get observedAttributes() {
|
|
178
|
-
return Object.keys(d).map((
|
|
178
|
+
return Object.keys(d).map((e) => e.replace(/([A-Z])/g, "-$1").toLowerCase());
|
|
179
179
|
}
|
|
180
|
-
_setProp(
|
|
181
|
-
const r = d[
|
|
182
|
-
this._props[
|
|
180
|
+
_setProp(e, t) {
|
|
181
|
+
const r = d[e] || "string";
|
|
182
|
+
this._props[e] = k(t, r), this._render();
|
|
183
183
|
}
|
|
184
|
-
_getProp(
|
|
185
|
-
if (
|
|
186
|
-
const
|
|
187
|
-
return _(this.getAttribute(
|
|
184
|
+
_getProp(e) {
|
|
185
|
+
if (e in this._props) return this._props[e];
|
|
186
|
+
const t = e.replace(/([A-Z])/g, "-$1").toLowerCase(), r = d[e] || "string";
|
|
187
|
+
return _(this.getAttribute(t), r);
|
|
188
188
|
}
|
|
189
189
|
_render() {
|
|
190
190
|
if (!this._root) return;
|
|
191
|
-
const
|
|
192
|
-
for (const [r, i] of Object.entries(d)) if (r in this._props)
|
|
191
|
+
const e = {};
|
|
192
|
+
for (const [r, i] of Object.entries(d)) if (r in this._props) e[r] = this._props[r];
|
|
193
193
|
else {
|
|
194
194
|
const o = r.replace(/([A-Z])/g, "-$1").toLowerCase();
|
|
195
|
-
|
|
195
|
+
e[r] = _(this.getAttribute(o), i);
|
|
196
196
|
}
|
|
197
|
-
const
|
|
198
|
-
this._root.render(
|
|
197
|
+
const t = m.createElement(y, e);
|
|
198
|
+
this._root.render(t);
|
|
199
199
|
}
|
|
200
200
|
};
|
|
201
|
-
for (const
|
|
201
|
+
for (const e of Object.keys(d)) Object.defineProperty(C.prototype, e, {
|
|
202
202
|
get() {
|
|
203
|
-
return this._getProp(
|
|
203
|
+
return this._getProp(e);
|
|
204
204
|
},
|
|
205
|
-
set(
|
|
206
|
-
this._setProp(
|
|
205
|
+
set(t) {
|
|
206
|
+
this._setProp(e, t);
|
|
207
207
|
},
|
|
208
208
|
enumerable: !0,
|
|
209
209
|
configurable: !0
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hf-ai-steps.js","names":[],"sources":["../../src/components/organisms/ai/AISteps/AISteps.tsx","../../src/wc/hf-ai-steps.ts"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport {\n AlertCircle,\n Check,\n ChevronDown,\n ChevronRight,\n Clock,\n} from 'lucide-react';\nimport { AnimatePresence, motion, useReducedMotion } from 'motion/react';\nimport * as React from 'react';\nimport { cn } from '@/lib/utils';\nimport {\n WorkflowStepItem,\n WorkflowStepRenderer,\n type WorkflowStepStatus,\n WorkflowStepStatusIcon,\n type WorkflowStepViewModel,\n} from '../_shared/workflow-step-renderer';\n\n// =============================================================================\n// Variants\n// =============================================================================\n\nconst stepsContainerVariants = cva('overflow-hidden rounded-xl border', {\n variants: {\n variant: {\n default: 'border-border bg-background',\n subtle: 'border-border bg-muted',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n});\n\nconst stepItemVariants = cva(\n 'flex items-start gap-3 px-4 py-3 transition-colors',\n {\n variants: {\n status: {\n pending: 'text-muted-foreground',\n running: 'text-primary',\n completed: 'text-success',\n error: 'text-destructive',\n },\n },\n defaultVariants: {\n status: 'pending',\n },\n },\n);\n\nconst stepIconVariants = cva(\n 'size-5 shrink-0 flex items-center justify-center rounded-full',\n {\n variants: {\n status: {\n pending: 'bg-accent text-muted-foreground',\n running: 'bg-primary/20 text-primary',\n completed: 'bg-success/20 text-success',\n error: 'bg-destructive/20 text-destructive',\n },\n },\n defaultVariants: {\n status: 'pending',\n },\n },\n);\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type StepStatus = 'pending' | 'running' | 'completed' | 'error';\n\nexport interface StepData {\n /** Unique step ID */\n id: string;\n /** Step title */\n title: string;\n /** Step description */\n description?: string;\n /** Step status */\n status: StepStatus;\n /** Optional content to show when expanded */\n content?: React.ReactNode;\n /** Duration in ms (for completed steps) */\n duration?: number;\n /** Error message if status is error */\n error?: string;\n}\n\ntype AIStepsWorkflowStatus = Exclude<WorkflowStepStatus, 'suspended'>;\n\nconst WORKFLOW_STATUS_BY_STEP_STATUS = {\n pending: 'pending',\n running: 'running',\n completed: 'completed',\n error: 'error',\n} as const satisfies Record<StepStatus, AIStepsWorkflowStatus>;\n\nfunction toWorkflowStepStatus(status: StepStatus): AIStepsWorkflowStatus {\n return WORKFLOW_STATUS_BY_STEP_STATUS[status];\n}\n\nfunction toWorkflowStep(step: StepData): WorkflowStepViewModel {\n const error = step.error?.trim() ? step.error : undefined;\n\n return {\n id: step.id,\n title: step.title,\n description: step.description,\n status: toWorkflowStepStatus(step.status),\n content: error === undefined ? step.content : undefined,\n durationMs: step.status === 'completed' ? step.duration : undefined,\n error,\n };\n}\n\n// =============================================================================\n// Step Icon Component\n// =============================================================================\n\ninterface StepIconProps {\n status: StepStatus;\n index: number;\n className?: string;\n}\n\nfunction StepIcon({ status, index, className }: StepIconProps) {\n return (\n <WorkflowStepStatusIcon\n status={toWorkflowStepStatus(status)}\n index={index}\n className={className}\n />\n );\n}\n\nStepIcon.displayName = 'StepIcon';\n\n// =============================================================================\n// Single Step Item\n// =============================================================================\n\ninterface AIStepItemProps {\n step: StepData;\n index: number;\n isLast: boolean;\n expandable?: boolean;\n defaultExpanded?: boolean;\n}\n\nfunction AIStepItem({\n step,\n index,\n isLast,\n expandable = true,\n defaultExpanded = false,\n}: AIStepItemProps) {\n const [expanded, setExpanded] = React.useState(defaultExpanded);\n\n return (\n <WorkflowStepItem\n step={toWorkflowStep(step)}\n index={index}\n isLast={isLast}\n appearance=\"contained\"\n itemSlot=\"ai-step-item\"\n expandable={expandable}\n expanded={expanded}\n onExpandedChange={() => setExpanded((value) => !value)}\n />\n );\n}\n\nAIStepItem.displayName = 'AIStepItem';\n\n// =============================================================================\n// Main AISteps Component\n// =============================================================================\n\nexport interface AIStepsProps\n extends VariantProps<typeof stepsContainerVariants> {\n /** Array of steps */\n steps: StepData[];\n /** Title for the steps container */\n title?: string;\n /** Whether the container is collapsible */\n collapsible?: boolean;\n /** Whether the container is expanded by default */\n defaultExpanded?: boolean;\n /** Whether individual steps are expandable */\n stepsExpandable?: boolean;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * AISteps displays a multi-step progress indicator for AI workflows.\n * Shows step status (pending, running, complete, error) with expandable details and timing.\n *\n * @llms Multi-step AI progress with status icons, timing, expandable details\n * @example\n * ```tsx\n * <AISteps\n * title=\"Processing\"\n * steps={[\n * { label: 'Analyzing', status: 'complete', duration: '2s' },\n * { label: 'Generating', status: 'running' },\n * ]}\n * />\n * ```\n */\nexport function AISteps({\n steps,\n title,\n variant,\n collapsible = true,\n defaultExpanded = true,\n stepsExpandable = true,\n className,\n}: AIStepsProps) {\n const [isExpanded, setIsExpanded] = React.useState(defaultExpanded);\n const prefersReducedMotion = useReducedMotion();\n\n // Calculate summary stats\n const completedCount = steps.filter((s) => s.status === 'completed').length;\n const totalCount = steps.length;\n const hasError = steps.some((s) => s.status === 'error');\n const isRunning = steps.some((s) => s.status === 'running');\n\n return (\n <section\n data-slot=\"ai-steps\"\n aria-label={title || 'Steps'}\n className={cn(stepsContainerVariants({ variant }), className)}\n >\n {/* Header */}\n {(title || collapsible) && (\n <button\n type=\"button\"\n onClick={() => collapsible && setIsExpanded(!isExpanded)}\n disabled={!collapsible}\n aria-expanded={collapsible ? isExpanded : undefined}\n className={cn(\n 'flex items-center justify-between w-full px-4 py-3 border-b border-border',\n collapsible && 'hover:bg-muted cursor-pointer',\n 'focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-ring',\n )}\n >\n <div className=\"flex items-center gap-2\">\n {isRunning && (\n <Clock className=\"size-4 text-primary animate-pulse motion-reduce:animate-none\" />\n )}\n {hasError && !isRunning && (\n <AlertCircle className=\"size-4 text-destructive\" />\n )}\n {!isRunning && !hasError && completedCount === totalCount && (\n <Check className=\"size-4 text-success\" />\n )}\n <span className=\"text-sm font-medium text-foreground\">\n {title || 'Steps'}\n </span>\n <span className=\"text-xs text-text-quaternary\">\n ({completedCount}/{totalCount})\n </span>\n </div>\n\n {collapsible && (\n <div className=\"shrink-0\">\n {isExpanded ? (\n <ChevronDown className=\"size-4 text-muted-foreground\" />\n ) : (\n <ChevronRight className=\"size-4 text-muted-foreground rtl:rotate-180\" />\n )}\n </div>\n )}\n </button>\n )}\n\n {/* Steps List */}\n <AnimatePresence initial={false}>\n {isExpanded && (\n <motion.div\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: 'auto', opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={{ duration: prefersReducedMotion ? 0 : 0.2 }}\n className=\"overflow-hidden\"\n >\n <WorkflowStepRenderer\n appearance=\"contained\"\n steps={steps.map(toWorkflowStep)}\n itemSlot=\"ai-step-item\"\n expandable={stepsExpandable}\n />\n </motion.div>\n )}\n </AnimatePresence>\n </section>\n );\n}\n\nAISteps.displayName = 'AISteps';\n\nexport {\n AIStepItem,\n StepIcon,\n stepIconVariants,\n stepItemVariants,\n stepsContainerVariants,\n};\n","/**\n * Web Component wrapper for AISteps\n * Custom element: <hf-ai-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 { AISteps } from '../components/organisms/ai/AISteps';\nimport { parseAttr, parseValue, type PropDefs } from './_shared';\n\n/**\n * Prop type definitions for attribute parsing\n */\nconst propTypes: PropDefs = {\n variant: 'string',\n steps: 'json',\n title: 'string',\n collapsible: 'boolean',\n defaultExpanded: 'boolean',\n stepsExpandable: 'boolean',\n className: 'string'\n};\n\nclass AIStepsWC 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 AISteps,\n props,\n );\n\n this._root.render(element);\n }\n}\n\nfor (const propName of Object.keys(propTypes)) {\n Object.defineProperty(AIStepsWC.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-ai-steps')) {\n customElements.define('hf-ai-steps', AIStepsWC);\n}\n\nexport { AIStepsWC };\nexport default AIStepsWC;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hf-ai-steps.js","names":[],"sources":["../../src/components/organisms/ai/AISteps/AISteps.tsx","../../src/wc/hf-ai-steps.ts"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport {\n AlertCircle,\n Check,\n ChevronDown,\n ChevronRight,\n Clock,\n} from 'lucide-react';\nimport { AnimatePresence, motion, useReducedMotion } from 'motion/react';\nimport * as React from 'react';\nimport { cn } from '@/lib/utils';\nimport {\n WorkflowStepItem,\n WorkflowStepRenderer,\n type WorkflowStepStatus,\n WorkflowStepStatusIcon,\n type WorkflowStepViewModel,\n} from '../_shared/workflow-step-renderer';\n\n// =============================================================================\n// Variants\n// =============================================================================\n\nconst stepsContainerVariants = cva('overflow-hidden rounded-xl border', {\n variants: {\n variant: {\n default: 'border-border bg-background',\n subtle: 'border-border bg-muted',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n});\n\nconst stepItemVariants = cva(\n 'flex items-start gap-3 px-4 py-3 transition-colors',\n {\n variants: {\n status: {\n pending: 'text-secondary-foreground',\n running: 'text-primary',\n completed: 'text-success',\n error: 'text-destructive',\n },\n },\n defaultVariants: {\n status: 'pending',\n },\n },\n);\n\nconst stepIconVariants = cva(\n 'size-5 shrink-0 flex items-center justify-center rounded-full',\n {\n variants: {\n status: {\n pending: 'bg-accent text-muted-foreground',\n running: 'bg-primary/20 text-primary',\n completed: 'bg-success/20 text-success',\n error: 'bg-destructive/20 text-destructive',\n },\n },\n defaultVariants: {\n status: 'pending',\n },\n },\n);\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type StepStatus = 'pending' | 'running' | 'completed' | 'error';\n\nexport interface StepData {\n /** Unique step ID */\n id: string;\n /** Step title */\n title: string;\n /** Step description */\n description?: string;\n /** Step status */\n status: StepStatus;\n /** Optional content to show when expanded */\n content?: React.ReactNode;\n /** Duration in ms (for completed steps) */\n duration?: number;\n /** Error message if status is error */\n error?: string;\n}\n\ntype AIStepsWorkflowStatus = Exclude<WorkflowStepStatus, 'suspended'>;\n\nconst WORKFLOW_STATUS_BY_STEP_STATUS = {\n pending: 'pending',\n running: 'running',\n completed: 'completed',\n error: 'error',\n} as const satisfies Record<StepStatus, AIStepsWorkflowStatus>;\n\nfunction toWorkflowStepStatus(status: StepStatus): AIStepsWorkflowStatus {\n return WORKFLOW_STATUS_BY_STEP_STATUS[status];\n}\n\nfunction toWorkflowStep(step: StepData): WorkflowStepViewModel {\n const error = step.error?.trim() ? step.error : undefined;\n\n return {\n id: step.id,\n title: step.title,\n description: step.description,\n status: toWorkflowStepStatus(step.status),\n content: error === undefined ? step.content : undefined,\n durationMs: step.status === 'completed' ? step.duration : undefined,\n error,\n };\n}\n\n// =============================================================================\n// Step Icon Component\n// =============================================================================\n\ninterface StepIconProps {\n status: StepStatus;\n index: number;\n className?: string;\n}\n\nfunction StepIcon({ status, index, className }: StepIconProps) {\n return (\n <WorkflowStepStatusIcon\n status={toWorkflowStepStatus(status)}\n index={index}\n className={className}\n />\n );\n}\n\nStepIcon.displayName = 'StepIcon';\n\n// =============================================================================\n// Single Step Item\n// =============================================================================\n\ninterface AIStepItemProps {\n step: StepData;\n index: number;\n isLast: boolean;\n expandable?: boolean;\n defaultExpanded?: boolean;\n}\n\nfunction AIStepItem({\n step,\n index,\n isLast,\n expandable = true,\n defaultExpanded = false,\n}: AIStepItemProps) {\n const [expanded, setExpanded] = React.useState(defaultExpanded);\n\n return (\n <WorkflowStepItem\n step={toWorkflowStep(step)}\n index={index}\n isLast={isLast}\n appearance=\"contained\"\n itemSlot=\"ai-step-item\"\n expandable={expandable}\n expanded={expanded}\n onExpandedChange={() => setExpanded((value) => !value)}\n />\n );\n}\n\nAIStepItem.displayName = 'AIStepItem';\n\n// =============================================================================\n// Main AISteps Component\n// =============================================================================\n\nexport interface AIStepsProps\n extends VariantProps<typeof stepsContainerVariants> {\n /** Array of steps */\n steps: StepData[];\n /** Title for the steps container */\n title?: string;\n /** Whether the container is collapsible */\n collapsible?: boolean;\n /** Whether the container is expanded by default */\n defaultExpanded?: boolean;\n /** Whether individual steps are expandable */\n stepsExpandable?: boolean;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * AISteps displays a multi-step progress indicator for AI workflows.\n * Shows step status (pending, running, complete, error) with expandable details and timing.\n *\n * @llms Multi-step AI progress with status icons, timing, expandable details\n * @example\n * ```tsx\n * <AISteps\n * title=\"Processing\"\n * steps={[\n * { label: 'Analyzing', status: 'complete', duration: '2s' },\n * { label: 'Generating', status: 'running' },\n * ]}\n * />\n * ```\n */\nexport function AISteps({\n steps,\n title,\n variant,\n collapsible = true,\n defaultExpanded = true,\n stepsExpandable = true,\n className,\n}: AIStepsProps) {\n const [isExpanded, setIsExpanded] = React.useState(defaultExpanded);\n const prefersReducedMotion = useReducedMotion();\n\n // Calculate summary stats\n const completedCount = steps.filter((s) => s.status === 'completed').length;\n const totalCount = steps.length;\n const hasError = steps.some((s) => s.status === 'error');\n const isRunning = steps.some((s) => s.status === 'running');\n\n return (\n <section\n data-slot=\"ai-steps\"\n aria-label={title || 'Steps'}\n className={cn(stepsContainerVariants({ variant }), className)}\n >\n {/* Header */}\n {(title || collapsible) && (\n <button\n type=\"button\"\n onClick={() => collapsible && setIsExpanded(!isExpanded)}\n disabled={!collapsible}\n aria-expanded={collapsible ? isExpanded : undefined}\n className={cn(\n 'flex items-center justify-between w-full px-4 py-3 border-b border-border',\n collapsible && 'hover:bg-muted cursor-pointer',\n 'focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-ring',\n )}\n >\n <div className=\"flex items-center gap-2\">\n {isRunning && (\n <Clock className=\"size-4 text-primary animate-pulse motion-reduce:animate-none\" />\n )}\n {hasError && !isRunning && (\n <AlertCircle className=\"size-4 text-destructive\" />\n )}\n {!isRunning && !hasError && completedCount === totalCount && (\n <Check className=\"size-4 text-success\" />\n )}\n <span className=\"text-sm font-medium text-foreground\">\n {title || 'Steps'}\n </span>\n <span className=\"text-xs text-secondary-foreground\">\n ({completedCount}/{totalCount})\n </span>\n </div>\n\n {collapsible && (\n <div className=\"shrink-0\">\n {isExpanded ? (\n <ChevronDown className=\"size-4 text-muted-foreground\" />\n ) : (\n <ChevronRight className=\"size-4 text-muted-foreground rtl:rotate-180\" />\n )}\n </div>\n )}\n </button>\n )}\n\n {/* Steps List */}\n <AnimatePresence initial={false}>\n {isExpanded && (\n <motion.div\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: 'auto', opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={{ duration: prefersReducedMotion ? 0 : 0.2 }}\n className=\"overflow-hidden\"\n >\n <WorkflowStepRenderer\n appearance=\"contained\"\n steps={steps.map(toWorkflowStep)}\n itemSlot=\"ai-step-item\"\n expandable={stepsExpandable}\n />\n </motion.div>\n )}\n </AnimatePresence>\n </section>\n );\n}\n\nAISteps.displayName = 'AISteps';\n\nexport {\n AIStepItem,\n StepIcon,\n stepIconVariants,\n stepItemVariants,\n stepsContainerVariants,\n};\n","/**\n * Web Component wrapper for AISteps\n * Custom element: <hf-ai-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 { AISteps } from '../components/organisms/ai/AISteps';\nimport { parseAttr, parseValue, type PropDefs } from './_shared';\n\n/**\n * Prop type definitions for attribute parsing\n */\nconst propTypes: PropDefs = {\n variant: 'string',\n steps: 'json',\n title: 'string',\n collapsible: 'boolean',\n defaultExpanded: 'boolean',\n stepsExpandable: 'boolean',\n className: 'string'\n};\n\nclass AIStepsWC 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 AISteps,\n props,\n );\n\n this._root.render(element);\n }\n}\n\nfor (const propName of Object.keys(propTypes)) {\n Object.defineProperty(AIStepsWC.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-ai-steps')) {\n customElements.define('hf-ai-steps', AIStepsWC);\n}\n\nexport { AIStepsWC };\nexport default AIStepsWC;\n"],"mappings":"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"}
|