@humain/ui 2.1.62 → 2.1.63

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/index174.js CHANGED
@@ -53,7 +53,16 @@ function areWorkflowStepIdsEqual(left, right) {
53
53
  }
54
54
  function formatWorkflowStepDuration(durationMs) {
55
55
  if (durationMs < 1e3) return `${durationMs}ms`;
56
- return `${(durationMs / 1e3).toFixed(1)}s`;
56
+ if (durationMs < 6e4) return `${(durationMs / 1e3).toFixed(1)}s`;
57
+ const totalSeconds = Math.floor(durationMs / 1e3);
58
+ const hours = Math.floor(totalSeconds / 3600);
59
+ const minutes = Math.floor(totalSeconds % 3600 / 60);
60
+ const seconds = totalSeconds % 60;
61
+ return [
62
+ hours > 0 ? `${hours}h` : null,
63
+ minutes > 0 ? `${minutes}m` : null,
64
+ seconds > 0 ? `${seconds}s` : null
65
+ ].filter((part) => part !== null).join(" ");
57
66
  }
58
67
  function isIterableWorkflowStepContent(content) {
59
68
  return typeof content === "object" && content !== null && Symbol.iterator in content && typeof content[Symbol.iterator] === "function";
@@ -1 +1 @@
1
- {"version":3,"file":"index174.js","names":[],"sources":["../src/components/organisms/ai/_shared/workflow-step-renderer.tsx"],"sourcesContent":["import { cva } from 'class-variance-authority';\nimport {\n AlertCircle,\n Check,\n ChevronDown,\n ChevronRight,\n Loader,\n Pause,\n} from 'lucide-react';\nimport { AnimatePresence, motion, useReducedMotion } from 'motion/react';\nimport * as React from 'react';\nimport { assertNever, cn } from '@/lib/utils';\n\nexport type WorkflowStepStatus =\n | 'pending'\n | 'running'\n | 'suspended'\n | 'completed'\n | 'error';\n\nexport type WorkflowStepAppearance = 'contained' | 'embedded' | 'timeline';\n\nexport interface WorkflowStepViewModel {\n id: string;\n title: string;\n description?: string;\n status: WorkflowStepStatus;\n content?: React.ReactNode;\n durationMs?: number;\n error?: string;\n}\n\nexport interface WorkflowStepRendererProps {\n steps: readonly WorkflowStepViewModel[];\n appearance?: WorkflowStepAppearance;\n itemSlot?: string;\n expandable?: boolean;\n activeStepId?: string;\n expandedStepIds?: readonly string[];\n defaultExpandedStepIds?: readonly string[];\n onExpandedStepIdsChange?: (ids: readonly string[]) => void;\n className?: string;\n}\n\ninterface PrivateWorkflowStepRendererProps extends WorkflowStepRendererProps {\n renderItems?: boolean;\n}\n\nconst workflowStepItemStatusClasses = {\n pending: 'text-muted-foreground',\n running: 'text-primary',\n suspended: 'text-warning',\n completed: 'text-success',\n error: 'text-destructive',\n} as const satisfies Record<WorkflowStepStatus, string>;\n\nconst workflowStepIconStatusClasses = {\n pending: 'bg-accent text-muted-foreground',\n running: 'bg-primary/20 text-primary',\n suspended: 'bg-warning/20 text-warning',\n completed: 'bg-success/20 text-success',\n error: 'bg-destructive/20 text-destructive',\n} as const satisfies Record<WorkflowStepStatus, string>;\n\nexport const workflowStepItemVariants = cva(\n 'flex items-start gap-3 px-4 py-3 transition-colors motion-reduce:transition-none',\n {\n variants: {\n status: workflowStepItemStatusClasses,\n },\n defaultVariants: {\n status: 'pending',\n },\n },\n);\n\nexport const workflowStepIconVariants = cva(\n 'size-5 shrink-0 flex items-center justify-center rounded-full',\n {\n variants: {\n status: workflowStepIconStatusClasses,\n },\n defaultVariants: {\n status: 'pending',\n },\n },\n);\n\nconst workflowStepAppearanceConfig = {\n contained: {\n rootClassName: 'relative',\n hasDivider: true,\n hasConnector: false,\n },\n embedded: {\n rootClassName: 'relative',\n hasDivider: true,\n hasConnector: false,\n },\n timeline: {\n rootClassName: 'relative',\n hasDivider: false,\n hasConnector: true,\n },\n} as const satisfies Record<\n WorkflowStepAppearance,\n { rootClassName: string; hasDivider: boolean; hasConnector: boolean }\n>;\n\nexport function normalizeExpandedWorkflowStepIds(\n ids: readonly string[],\n steps: readonly WorkflowStepViewModel[],\n): string[] {\n const requested = new Set(ids);\n return steps.flatMap((step) => (requested.has(step.id) ? [step.id] : []));\n}\n\nfunction areWorkflowStepIdsEqual(\n left: readonly string[],\n right: readonly string[],\n): boolean {\n return (\n left.length === right.length &&\n left.every((id, index) => id === right[index])\n );\n}\n\nfunction formatWorkflowStepDuration(durationMs: number): string {\n if (durationMs < 1000) return `${durationMs}ms`;\n return `${(durationMs / 1000).toFixed(1)}s`;\n}\n\nfunction isIterableWorkflowStepContent(\n content: React.ReactNode,\n): content is Iterable<React.ReactNode> {\n return (\n typeof content === 'object' &&\n content !== null &&\n Symbol.iterator in content &&\n typeof (content as Iterable<React.ReactNode>)[Symbol.iterator] ===\n 'function'\n );\n}\n\nfunction isIteratorWorkflowStepContent(\n content: unknown,\n): content is Iterator<React.ReactNode> {\n return (\n typeof (content as Partial<Iterator<React.ReactNode>>).next === 'function'\n );\n}\n\ninterface NormalizedWorkflowStepContent {\n content: React.ReactNode;\n hasRenderableContent: boolean;\n changed: boolean;\n}\n\nconst normalizedOneShotWorkflowStepContent = new WeakMap<\n object,\n NormalizedWorkflowStepContent\n>();\n\nfunction normalizeIterableWorkflowStepContent(\n content: Iterable<React.ReactNode>,\n iterator: Iterator<React.ReactNode>,\n): NormalizedWorkflowStepContent {\n const normalizedChildren: React.ReactNode[] = [];\n let hasRenderableContent = false;\n let changed = !Array.isArray(content);\n\n for (let result = iterator.next(); !result.done; result = iterator.next()) {\n const normalizedChild = normalizeWorkflowStepContent(result.value);\n normalizedChildren.push(normalizedChild.content);\n hasRenderableContent ||= normalizedChild.hasRenderableContent;\n changed ||= normalizedChild.changed;\n }\n\n return {\n content: changed ? normalizedChildren : content,\n hasRenderableContent,\n changed,\n };\n}\n\nfunction normalizeWorkflowStepContent(\n content: React.ReactNode,\n): NormalizedWorkflowStepContent {\n if (\n content === null ||\n content === undefined ||\n typeof content === 'boolean' ||\n content === ''\n ) {\n return { content, hasRenderableContent: false, changed: false };\n }\n\n if (\n typeof content === 'string' ||\n typeof content === 'number' ||\n typeof content === 'bigint'\n ) {\n return { content, hasRenderableContent: true, changed: false };\n }\n\n if (React.isValidElement<{ children?: React.ReactNode }>(content)) {\n if (content.type !== React.Fragment) {\n return { content, hasRenderableContent: true, changed: false };\n }\n\n const normalizedChildren = normalizeWorkflowStepContent(\n content.props.children,\n );\n return {\n content: normalizedChildren.changed\n ? React.cloneElement(content, undefined, normalizedChildren.content)\n : content,\n hasRenderableContent: normalizedChildren.hasRenderableContent,\n changed: normalizedChildren.changed,\n };\n }\n\n if (isIterableWorkflowStepContent(content)) {\n const iterator = content[Symbol.iterator]();\n const oneShotCacheKey = isIteratorWorkflowStepContent(iterator)\n ? (iterator as object)\n : null;\n\n if (oneShotCacheKey !== null) {\n const cached = normalizedOneShotWorkflowStepContent.get(oneShotCacheKey);\n if (cached !== undefined) return cached;\n }\n\n const normalized = normalizeIterableWorkflowStepContent(content, iterator);\n if (oneShotCacheKey !== null) {\n normalizedOneShotWorkflowStepContent.set(oneShotCacheKey, normalized);\n }\n return normalized;\n }\n\n return { content, hasRenderableContent: true, changed: false };\n}\n\nfunction getNonBlankWorkflowStepError(\n error: string | undefined,\n): string | undefined {\n return error?.trim() ? error : undefined;\n}\n\nfunction getWorkflowStepStatusLabel(status: WorkflowStepStatus): string {\n switch (status) {\n case 'pending':\n return 'Pending';\n case 'running':\n return 'Running';\n case 'suspended':\n return 'Paused';\n case 'completed':\n return 'Completed';\n case 'error':\n return 'Error';\n default:\n return assertNever(status);\n }\n}\n\nexport interface WorkflowStepStatusIconProps {\n status: WorkflowStepStatus;\n index: number;\n className?: string;\n}\n\nexport function WorkflowStepStatusIcon({\n status,\n index,\n className,\n}: WorkflowStepStatusIconProps) {\n const iconClass = cn(workflowStepIconVariants({ status }), className);\n\n switch (status) {\n case 'pending':\n return (\n <div data-slot=\"workflow-step-icon\" className={iconClass}>\n <span className=\"text-xs font-medium\">{index + 1}</span>\n </div>\n );\n case 'running':\n return (\n <div\n data-slot=\"workflow-step-icon\"\n className={cn(\n iconClass,\n 'delight-status-pulse motion-reduce:!animate-none',\n )}\n >\n <Loader className=\"size-3 animate-spin motion-reduce:animate-none\" />\n </div>\n );\n case 'suspended':\n return (\n <div data-slot=\"workflow-step-icon\" className={iconClass}>\n <Pause className=\"size-3\" />\n </div>\n );\n case 'completed':\n return (\n <div\n data-slot=\"workflow-step-icon\"\n className={cn(\n iconClass,\n 'delight-check-bounce motion-reduce:!animate-none',\n )}\n >\n <Check className=\"size-3\" />\n </div>\n );\n case 'error':\n return (\n <div\n data-slot=\"workflow-step-icon\"\n className={cn(iconClass, 'delight-shake motion-reduce:!animate-none')}\n >\n <AlertCircle className=\"size-3\" />\n </div>\n );\n default:\n return assertNever(status);\n }\n}\n\nWorkflowStepStatusIcon.displayName = 'WorkflowStepStatusIcon';\n\nexport interface WorkflowStepItemProps {\n step: WorkflowStepViewModel;\n index: number;\n isLast: boolean;\n appearance?: WorkflowStepAppearance;\n itemSlot?: string;\n expandable?: boolean;\n expanded: boolean;\n active?: boolean;\n onExpandedChange: () => void;\n}\n\nexport function WorkflowStepItem({\n step,\n index,\n isLast,\n appearance = 'contained',\n itemSlot = 'workflow-step-item',\n expandable = true,\n expanded,\n active = false,\n onExpandedChange,\n}: WorkflowStepItemProps) {\n const contentId = React.useId();\n const errorDescriptionId = React.useId();\n const normalizedContent = normalizeWorkflowStepContent(step.content);\n const hasContent = normalizedContent.hasRenderableContent;\n const error = getNonBlankWorkflowStepError(step.error);\n const hasError = error !== undefined;\n const hasExpandableDetails = hasContent || hasError;\n const isDisclosureControl = hasExpandableDetails && expandable;\n const prefersReducedMotion = useReducedMotion();\n const appearanceConfig = workflowStepAppearanceConfig[appearance];\n const disclosureTransition = {\n duration: prefersReducedMotion ? 0 : 0.2,\n };\n const stepContent = (\n <>\n <WorkflowStepStatusIcon status={step.status} index={index} />\n\n <div className=\"min-w-0 flex-1 text-start\">\n <div className=\"flex items-center gap-2\">\n <span\n className={cn(\n 'text-sm font-medium',\n step.status === 'pending'\n ? 'text-text-quaternary'\n : 'text-foreground',\n )}\n >\n {step.title}\n </span>\n <span className=\"text-xs text-secondary-foreground\">\n {getWorkflowStepStatusLabel(step.status)}\n </span>\n {step.durationMs !== undefined && (\n <span className=\"text-xs text-muted-foreground\">\n {formatWorkflowStepDuration(step.durationMs)}\n </span>\n )}\n </div>\n {step.description && (\n <p className=\"mt-0.5 text-xs text-text-quaternary\">\n {step.description}\n </p>\n )}\n </div>\n\n {isDisclosureControl && (\n <div className=\"shrink-0\">\n {expanded ? (\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 </>\n );\n\n return (\n <div\n data-slot={itemSlot}\n data-step-status={step.status}\n data-appearance={appearance}\n className={cn(\n appearanceConfig.rootClassName,\n appearanceConfig.hasDivider && !isLast && 'border-b border-border',\n )}\n >\n {isDisclosureControl ? (\n <button\n type=\"button\"\n onClick={onExpandedChange}\n aria-current={active ? 'step' : undefined}\n aria-expanded={expanded}\n aria-controls={contentId}\n aria-describedby={hasError ? errorDescriptionId : undefined}\n className={cn(\n workflowStepItemVariants({ status: step.status }),\n 'w-full cursor-pointer hover:bg-muted focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-ring',\n )}\n >\n {stepContent}\n </button>\n ) : (\n <div\n aria-current={active ? 'step' : undefined}\n aria-describedby={hasError ? errorDescriptionId : undefined}\n className={cn(\n workflowStepItemVariants({ status: step.status }),\n 'w-full',\n )}\n >\n {stepContent}\n </div>\n )}\n\n <AnimatePresence initial={false}>\n {expanded && hasExpandableDetails && (\n <motion.div\n id={contentId}\n data-slot=\"workflow-step-panel\"\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: 'auto', opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={disclosureTransition}\n className=\"overflow-hidden motion-reduce:transition-none\"\n >\n <div className=\"px-4 pb-3 ps-12\">\n {hasError && (\n <div className=\"rounded-lg border border-destructive/50 bg-destructive/10 p-3\">\n <div className=\"flex items-start gap-2\">\n <AlertCircle className=\"mt-0.5 size-4 shrink-0 text-destructive\" />\n <p className=\"text-sm text-destructive\">{error}</p>\n </div>\n </div>\n )}\n {hasContent && (\n <div className={hasError ? 'mt-3' : undefined}>\n {normalizedContent.content}\n </div>\n )}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n\n {hasError && (\n <span id={errorDescriptionId} className=\"sr-only\">\n {error}\n </span>\n )}\n\n {appearanceConfig.hasConnector && !isLast && (\n <div\n data-slot=\"workflow-step-connector\"\n aria-hidden=\"true\"\n className=\"absolute top-8 -bottom-3 start-6 w-px bg-border\"\n />\n )}\n </div>\n );\n}\n\nWorkflowStepItem.displayName = 'WorkflowStepItem';\n\nexport function WorkflowStepRenderer({\n steps,\n appearance = 'contained',\n itemSlot = 'workflow-step-item',\n expandable = true,\n activeStepId,\n expandedStepIds: controlledExpandedStepIds,\n defaultExpandedStepIds = [],\n onExpandedStepIdsChange,\n className,\n renderItems = true,\n}: PrivateWorkflowStepRendererProps) {\n const isControlled = controlledExpandedStepIds !== undefined;\n const controlledSnapshot = isControlled\n ? [...controlledExpandedStepIds]\n : undefined;\n const [uncontrolledExpandedStepIds, setUncontrolledExpandedStepIds] =\n React.useState<readonly string[]>(() =>\n normalizeExpandedWorkflowStepIds(defaultExpandedStepIds, steps),\n );\n const lastControlledExpandedStepIdsRef = React.useRef<readonly string[]>(\n controlledSnapshot ?? [],\n );\n const wasControlledRef = React.useRef(isControlled);\n const rawExpandedStepIds = isControlled\n ? controlledExpandedStepIds\n : uncontrolledExpandedStepIds;\n const visibleExpandedStepIds = normalizeExpandedWorkflowStepIds(\n rawExpandedStepIds,\n steps,\n );\n const expandedSet = new Set(visibleExpandedStepIds);\n\n React.useLayoutEffect(() => {\n if (controlledSnapshot !== undefined) {\n lastControlledExpandedStepIdsRef.current = controlledSnapshot;\n }\n }, [controlledSnapshot]);\n\n React.useLayoutEffect(() => {\n const wasControlled = wasControlledRef.current;\n wasControlledRef.current = isControlled;\n if (isControlled) return;\n\n setUncontrolledExpandedStepIds((current) => {\n const source = wasControlled\n ? lastControlledExpandedStepIdsRef.current\n : current;\n const reconciled = normalizeExpandedWorkflowStepIds(source, steps);\n return areWorkflowStepIdsEqual(reconciled, current)\n ? current\n : reconciled;\n });\n }, [isControlled, steps]);\n\n const toggleStep = (id: string) => {\n const next = new Set(visibleExpandedStepIds);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n const normalizedNext = normalizeExpandedWorkflowStepIds([...next], steps);\n if (!isControlled) {\n setUncontrolledExpandedStepIds([...normalizedNext]);\n }\n onExpandedStepIdsChange?.([...normalizedNext]);\n };\n\n if (!renderItems) return null;\n\n return (\n <ol\n data-slot=\"workflow-step-list\"\n data-appearance={appearance}\n className={cn('m-0 list-none p-0', className)}\n >\n {steps.map((step, index) => (\n <li key={step.id}>\n <WorkflowStepItem\n step={step}\n index={index}\n isLast={index === steps.length - 1}\n appearance={appearance}\n itemSlot={itemSlot}\n expandable={expandable}\n expanded={expandedSet.has(step.id)}\n active={activeStepId === step.id}\n onExpandedChange={() => toggleStep(step.id)}\n />\n </li>\n ))}\n </ol>\n );\n}\n\nWorkflowStepRenderer.displayName = 'WorkflowStepRenderer';\n"],"mappings":"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"}
1
+ {"version":3,"file":"index174.js","names":[],"sources":["../src/components/organisms/ai/_shared/workflow-step-renderer.tsx"],"sourcesContent":["import { cva } from 'class-variance-authority';\nimport {\n AlertCircle,\n Check,\n ChevronDown,\n ChevronRight,\n Loader,\n Pause,\n} from 'lucide-react';\nimport { AnimatePresence, motion, useReducedMotion } from 'motion/react';\nimport * as React from 'react';\nimport { assertNever, cn } from '@/lib/utils';\n\nexport type WorkflowStepStatus =\n | 'pending'\n | 'running'\n | 'suspended'\n | 'completed'\n | 'error';\n\nexport type WorkflowStepAppearance = 'contained' | 'embedded' | 'timeline';\n\nexport interface WorkflowStepViewModel {\n id: string;\n title: string;\n description?: string;\n status: WorkflowStepStatus;\n content?: React.ReactNode;\n durationMs?: number;\n error?: string;\n}\n\nexport interface WorkflowStepRendererProps {\n steps: readonly WorkflowStepViewModel[];\n appearance?: WorkflowStepAppearance;\n itemSlot?: string;\n expandable?: boolean;\n activeStepId?: string;\n expandedStepIds?: readonly string[];\n defaultExpandedStepIds?: readonly string[];\n onExpandedStepIdsChange?: (ids: readonly string[]) => void;\n className?: string;\n}\n\ninterface PrivateWorkflowStepRendererProps extends WorkflowStepRendererProps {\n renderItems?: boolean;\n}\n\nconst workflowStepItemStatusClasses = {\n pending: 'text-muted-foreground',\n running: 'text-primary',\n suspended: 'text-warning',\n completed: 'text-success',\n error: 'text-destructive',\n} as const satisfies Record<WorkflowStepStatus, string>;\n\nconst workflowStepIconStatusClasses = {\n pending: 'bg-accent text-muted-foreground',\n running: 'bg-primary/20 text-primary',\n suspended: 'bg-warning/20 text-warning',\n completed: 'bg-success/20 text-success',\n error: 'bg-destructive/20 text-destructive',\n} as const satisfies Record<WorkflowStepStatus, string>;\n\nexport const workflowStepItemVariants = cva(\n 'flex items-start gap-3 px-4 py-3 transition-colors motion-reduce:transition-none',\n {\n variants: {\n status: workflowStepItemStatusClasses,\n },\n defaultVariants: {\n status: 'pending',\n },\n },\n);\n\nexport const workflowStepIconVariants = cva(\n 'size-5 shrink-0 flex items-center justify-center rounded-full',\n {\n variants: {\n status: workflowStepIconStatusClasses,\n },\n defaultVariants: {\n status: 'pending',\n },\n },\n);\n\nconst workflowStepAppearanceConfig = {\n contained: {\n rootClassName: 'relative',\n hasDivider: true,\n hasConnector: false,\n },\n embedded: {\n rootClassName: 'relative',\n hasDivider: true,\n hasConnector: false,\n },\n timeline: {\n rootClassName: 'relative',\n hasDivider: false,\n hasConnector: true,\n },\n} as const satisfies Record<\n WorkflowStepAppearance,\n { rootClassName: string; hasDivider: boolean; hasConnector: boolean }\n>;\n\nexport function normalizeExpandedWorkflowStepIds(\n ids: readonly string[],\n steps: readonly WorkflowStepViewModel[],\n): string[] {\n const requested = new Set(ids);\n return steps.flatMap((step) => (requested.has(step.id) ? [step.id] : []));\n}\n\nfunction areWorkflowStepIdsEqual(\n left: readonly string[],\n right: readonly string[],\n): boolean {\n return (\n left.length === right.length &&\n left.every((id, index) => id === right[index])\n );\n}\n\nfunction formatWorkflowStepDuration(durationMs: number): string {\n if (durationMs < 1000) return `${durationMs}ms`;\n if (durationMs < 60_000) return `${(durationMs / 1000).toFixed(1)}s`;\n\n const totalSeconds = Math.floor(durationMs / 1000);\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n\n return [\n hours > 0 ? `${hours}h` : null,\n minutes > 0 ? `${minutes}m` : null,\n seconds > 0 ? `${seconds}s` : null,\n ]\n .filter((part): part is string => part !== null)\n .join(' ');\n}\n\nfunction isIterableWorkflowStepContent(\n content: React.ReactNode,\n): content is Iterable<React.ReactNode> {\n return (\n typeof content === 'object' &&\n content !== null &&\n Symbol.iterator in content &&\n typeof (content as Iterable<React.ReactNode>)[Symbol.iterator] ===\n 'function'\n );\n}\n\nfunction isIteratorWorkflowStepContent(\n content: unknown,\n): content is Iterator<React.ReactNode> {\n return (\n typeof (content as Partial<Iterator<React.ReactNode>>).next === 'function'\n );\n}\n\ninterface NormalizedWorkflowStepContent {\n content: React.ReactNode;\n hasRenderableContent: boolean;\n changed: boolean;\n}\n\nconst normalizedOneShotWorkflowStepContent = new WeakMap<\n object,\n NormalizedWorkflowStepContent\n>();\n\nfunction normalizeIterableWorkflowStepContent(\n content: Iterable<React.ReactNode>,\n iterator: Iterator<React.ReactNode>,\n): NormalizedWorkflowStepContent {\n const normalizedChildren: React.ReactNode[] = [];\n let hasRenderableContent = false;\n let changed = !Array.isArray(content);\n\n for (let result = iterator.next(); !result.done; result = iterator.next()) {\n const normalizedChild = normalizeWorkflowStepContent(result.value);\n normalizedChildren.push(normalizedChild.content);\n hasRenderableContent ||= normalizedChild.hasRenderableContent;\n changed ||= normalizedChild.changed;\n }\n\n return {\n content: changed ? normalizedChildren : content,\n hasRenderableContent,\n changed,\n };\n}\n\nfunction normalizeWorkflowStepContent(\n content: React.ReactNode,\n): NormalizedWorkflowStepContent {\n if (\n content === null ||\n content === undefined ||\n typeof content === 'boolean' ||\n content === ''\n ) {\n return { content, hasRenderableContent: false, changed: false };\n }\n\n if (\n typeof content === 'string' ||\n typeof content === 'number' ||\n typeof content === 'bigint'\n ) {\n return { content, hasRenderableContent: true, changed: false };\n }\n\n if (React.isValidElement<{ children?: React.ReactNode }>(content)) {\n if (content.type !== React.Fragment) {\n return { content, hasRenderableContent: true, changed: false };\n }\n\n const normalizedChildren = normalizeWorkflowStepContent(\n content.props.children,\n );\n return {\n content: normalizedChildren.changed\n ? React.cloneElement(content, undefined, normalizedChildren.content)\n : content,\n hasRenderableContent: normalizedChildren.hasRenderableContent,\n changed: normalizedChildren.changed,\n };\n }\n\n if (isIterableWorkflowStepContent(content)) {\n const iterator = content[Symbol.iterator]();\n const oneShotCacheKey = isIteratorWorkflowStepContent(iterator)\n ? (iterator as object)\n : null;\n\n if (oneShotCacheKey !== null) {\n const cached = normalizedOneShotWorkflowStepContent.get(oneShotCacheKey);\n if (cached !== undefined) return cached;\n }\n\n const normalized = normalizeIterableWorkflowStepContent(content, iterator);\n if (oneShotCacheKey !== null) {\n normalizedOneShotWorkflowStepContent.set(oneShotCacheKey, normalized);\n }\n return normalized;\n }\n\n return { content, hasRenderableContent: true, changed: false };\n}\n\nfunction getNonBlankWorkflowStepError(\n error: string | undefined,\n): string | undefined {\n return error?.trim() ? error : undefined;\n}\n\nfunction getWorkflowStepStatusLabel(status: WorkflowStepStatus): string {\n switch (status) {\n case 'pending':\n return 'Pending';\n case 'running':\n return 'Running';\n case 'suspended':\n return 'Paused';\n case 'completed':\n return 'Completed';\n case 'error':\n return 'Error';\n default:\n return assertNever(status);\n }\n}\n\nexport interface WorkflowStepStatusIconProps {\n status: WorkflowStepStatus;\n index: number;\n className?: string;\n}\n\nexport function WorkflowStepStatusIcon({\n status,\n index,\n className,\n}: WorkflowStepStatusIconProps) {\n const iconClass = cn(workflowStepIconVariants({ status }), className);\n\n switch (status) {\n case 'pending':\n return (\n <div data-slot=\"workflow-step-icon\" className={iconClass}>\n <span className=\"text-xs font-medium\">{index + 1}</span>\n </div>\n );\n case 'running':\n return (\n <div\n data-slot=\"workflow-step-icon\"\n className={cn(\n iconClass,\n 'delight-status-pulse motion-reduce:!animate-none',\n )}\n >\n <Loader className=\"size-3 animate-spin motion-reduce:animate-none\" />\n </div>\n );\n case 'suspended':\n return (\n <div data-slot=\"workflow-step-icon\" className={iconClass}>\n <Pause className=\"size-3\" />\n </div>\n );\n case 'completed':\n return (\n <div\n data-slot=\"workflow-step-icon\"\n className={cn(\n iconClass,\n 'delight-check-bounce motion-reduce:!animate-none',\n )}\n >\n <Check className=\"size-3\" />\n </div>\n );\n case 'error':\n return (\n <div\n data-slot=\"workflow-step-icon\"\n className={cn(iconClass, 'delight-shake motion-reduce:!animate-none')}\n >\n <AlertCircle className=\"size-3\" />\n </div>\n );\n default:\n return assertNever(status);\n }\n}\n\nWorkflowStepStatusIcon.displayName = 'WorkflowStepStatusIcon';\n\nexport interface WorkflowStepItemProps {\n step: WorkflowStepViewModel;\n index: number;\n isLast: boolean;\n appearance?: WorkflowStepAppearance;\n itemSlot?: string;\n expandable?: boolean;\n expanded: boolean;\n active?: boolean;\n onExpandedChange: () => void;\n}\n\nexport function WorkflowStepItem({\n step,\n index,\n isLast,\n appearance = 'contained',\n itemSlot = 'workflow-step-item',\n expandable = true,\n expanded,\n active = false,\n onExpandedChange,\n}: WorkflowStepItemProps) {\n const contentId = React.useId();\n const errorDescriptionId = React.useId();\n const normalizedContent = normalizeWorkflowStepContent(step.content);\n const hasContent = normalizedContent.hasRenderableContent;\n const error = getNonBlankWorkflowStepError(step.error);\n const hasError = error !== undefined;\n const hasExpandableDetails = hasContent || hasError;\n const isDisclosureControl = hasExpandableDetails && expandable;\n const prefersReducedMotion = useReducedMotion();\n const appearanceConfig = workflowStepAppearanceConfig[appearance];\n const disclosureTransition = {\n duration: prefersReducedMotion ? 0 : 0.2,\n };\n const stepContent = (\n <>\n <WorkflowStepStatusIcon status={step.status} index={index} />\n\n <div className=\"min-w-0 flex-1 text-start\">\n <div className=\"flex items-center gap-2\">\n <span\n className={cn(\n 'text-sm font-medium',\n step.status === 'pending'\n ? 'text-text-quaternary'\n : 'text-foreground',\n )}\n >\n {step.title}\n </span>\n <span className=\"text-xs text-secondary-foreground\">\n {getWorkflowStepStatusLabel(step.status)}\n </span>\n {step.durationMs !== undefined && (\n <span className=\"text-xs text-muted-foreground\">\n {formatWorkflowStepDuration(step.durationMs)}\n </span>\n )}\n </div>\n {step.description && (\n <p className=\"mt-0.5 text-xs text-text-quaternary\">\n {step.description}\n </p>\n )}\n </div>\n\n {isDisclosureControl && (\n <div className=\"shrink-0\">\n {expanded ? (\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 </>\n );\n\n return (\n <div\n data-slot={itemSlot}\n data-step-status={step.status}\n data-appearance={appearance}\n className={cn(\n appearanceConfig.rootClassName,\n appearanceConfig.hasDivider && !isLast && 'border-b border-border',\n )}\n >\n {isDisclosureControl ? (\n <button\n type=\"button\"\n onClick={onExpandedChange}\n aria-current={active ? 'step' : undefined}\n aria-expanded={expanded}\n aria-controls={contentId}\n aria-describedby={hasError ? errorDescriptionId : undefined}\n className={cn(\n workflowStepItemVariants({ status: step.status }),\n 'w-full cursor-pointer hover:bg-muted focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-ring',\n )}\n >\n {stepContent}\n </button>\n ) : (\n <div\n aria-current={active ? 'step' : undefined}\n aria-describedby={hasError ? errorDescriptionId : undefined}\n className={cn(\n workflowStepItemVariants({ status: step.status }),\n 'w-full',\n )}\n >\n {stepContent}\n </div>\n )}\n\n <AnimatePresence initial={false}>\n {expanded && hasExpandableDetails && (\n <motion.div\n id={contentId}\n data-slot=\"workflow-step-panel\"\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: 'auto', opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={disclosureTransition}\n className=\"overflow-hidden motion-reduce:transition-none\"\n >\n <div className=\"px-4 pb-3 ps-12\">\n {hasError && (\n <div className=\"rounded-lg border border-destructive/50 bg-destructive/10 p-3\">\n <div className=\"flex items-start gap-2\">\n <AlertCircle className=\"mt-0.5 size-4 shrink-0 text-destructive\" />\n <p className=\"text-sm text-destructive\">{error}</p>\n </div>\n </div>\n )}\n {hasContent && (\n <div className={hasError ? 'mt-3' : undefined}>\n {normalizedContent.content}\n </div>\n )}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n\n {hasError && (\n <span id={errorDescriptionId} className=\"sr-only\">\n {error}\n </span>\n )}\n\n {appearanceConfig.hasConnector && !isLast && (\n <div\n data-slot=\"workflow-step-connector\"\n aria-hidden=\"true\"\n className=\"absolute top-8 -bottom-3 start-6 w-px bg-border\"\n />\n )}\n </div>\n );\n}\n\nWorkflowStepItem.displayName = 'WorkflowStepItem';\n\nexport function WorkflowStepRenderer({\n steps,\n appearance = 'contained',\n itemSlot = 'workflow-step-item',\n expandable = true,\n activeStepId,\n expandedStepIds: controlledExpandedStepIds,\n defaultExpandedStepIds = [],\n onExpandedStepIdsChange,\n className,\n renderItems = true,\n}: PrivateWorkflowStepRendererProps) {\n const isControlled = controlledExpandedStepIds !== undefined;\n const controlledSnapshot = isControlled\n ? [...controlledExpandedStepIds]\n : undefined;\n const [uncontrolledExpandedStepIds, setUncontrolledExpandedStepIds] =\n React.useState<readonly string[]>(() =>\n normalizeExpandedWorkflowStepIds(defaultExpandedStepIds, steps),\n );\n const lastControlledExpandedStepIdsRef = React.useRef<readonly string[]>(\n controlledSnapshot ?? [],\n );\n const wasControlledRef = React.useRef(isControlled);\n const rawExpandedStepIds = isControlled\n ? controlledExpandedStepIds\n : uncontrolledExpandedStepIds;\n const visibleExpandedStepIds = normalizeExpandedWorkflowStepIds(\n rawExpandedStepIds,\n steps,\n );\n const expandedSet = new Set(visibleExpandedStepIds);\n\n React.useLayoutEffect(() => {\n if (controlledSnapshot !== undefined) {\n lastControlledExpandedStepIdsRef.current = controlledSnapshot;\n }\n }, [controlledSnapshot]);\n\n React.useLayoutEffect(() => {\n const wasControlled = wasControlledRef.current;\n wasControlledRef.current = isControlled;\n if (isControlled) return;\n\n setUncontrolledExpandedStepIds((current) => {\n const source = wasControlled\n ? lastControlledExpandedStepIdsRef.current\n : current;\n const reconciled = normalizeExpandedWorkflowStepIds(source, steps);\n return areWorkflowStepIdsEqual(reconciled, current)\n ? current\n : reconciled;\n });\n }, [isControlled, steps]);\n\n const toggleStep = (id: string) => {\n const next = new Set(visibleExpandedStepIds);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n const normalizedNext = normalizeExpandedWorkflowStepIds([...next], steps);\n if (!isControlled) {\n setUncontrolledExpandedStepIds([...normalizedNext]);\n }\n onExpandedStepIdsChange?.([...normalizedNext]);\n };\n\n if (!renderItems) return null;\n\n return (\n <ol\n data-slot=\"workflow-step-list\"\n data-appearance={appearance}\n className={cn('m-0 list-none p-0', className)}\n >\n {steps.map((step, index) => (\n <li key={step.id}>\n <WorkflowStepItem\n step={step}\n index={index}\n isLast={index === steps.length - 1}\n appearance={appearance}\n itemSlot={itemSlot}\n expandable={expandable}\n expanded={expandedSet.has(step.id)}\n active={activeStepId === step.id}\n onExpandedChange={() => toggleStep(step.id)}\n />\n </li>\n ))}\n </ol>\n );\n}\n\nWorkflowStepRenderer.displayName = 'WorkflowStepRenderer';\n"],"mappings":";;;;;;;AAgDA,IAAM,gCAAgC;CACpC,SAAS;CACT,SAAS;CACT,WAAW;CACX,WAAW;CACX,OAAO;AACT;AAEA,IAAM,gCAAgC;CACpC,SAAS;CACT,SAAS;CACT,WAAW;CACX,WAAW;CACX,OAAO;AACT;AAEA,IAAa,2BAA2B,IACtC,oFACA;CACE,UAAU,EACR,QAAQ,8BACV;CACA,iBAAiB,EACf,QAAQ,UACV;AACF,CACF;AAEA,IAAa,2BAA2B,IACtC,iEACA;CACE,UAAU,EACR,QAAQ,8BACV;CACA,iBAAiB,EACf,QAAQ,UACV;AACF,CACF;AAEA,IAAM,+BAA+B;CACnC,WAAW;EACT,eAAe;EACf,YAAY;EACZ,cAAc;CAChB;CACA,UAAU;EACR,eAAe;EACf,YAAY;EACZ,cAAc;CAChB;CACA,UAAU;EACR,eAAe;EACf,YAAY;EACZ,cAAc;CAChB;AACF;AAKA,SAAgB,iCACd,KACA,OACU;CACV,MAAM,YAAY,IAAI,IAAI,GAAG;CAC7B,OAAO,MAAM,SAAS,SAAU,UAAU,IAAI,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAE;AAC1E;AAEA,SAAS,wBACP,MACA,OACS;CACT,OACE,KAAK,WAAW,MAAM,UACtB,KAAK,OAAO,IAAI,UAAU,OAAO,MAAM,MAAM;AAEjD;AAEA,SAAS,2BAA2B,YAA4B;CAC9D,IAAI,aAAa,KAAM,OAAO,GAAG,WAAW;CAC5C,IAAI,aAAa,KAAQ,OAAO,IAAI,aAAa,IAAA,CAAM,QAAQ,CAAC,EAAE;CAElE,MAAM,eAAe,KAAK,MAAM,aAAa,GAAI;CACjD,MAAM,QAAQ,KAAK,MAAM,eAAe,IAAI;CAC5C,MAAM,UAAU,KAAK,MAAO,eAAe,OAAQ,EAAE;CACrD,MAAM,UAAU,eAAe;CAE/B,OAAO;EACL,QAAQ,IAAI,GAAG,MAAM,KAAK;EAC1B,UAAU,IAAI,GAAG,QAAQ,KAAK;EAC9B,UAAU,IAAI,GAAG,QAAQ,KAAK;CAChC,CAAC,CACE,QAAQ,SAAyB,SAAS,IAAI,CAAC,CAC/C,KAAK,GAAG;AACb;AAEA,SAAS,8BACP,SACsC;CACtC,OACE,OAAO,YAAY,YACnB,YAAY,QACZ,OAAO,YAAY,WACnB,OAAQ,QAAsC,OAAO,cACnD;AAEN;AAEA,SAAS,8BACP,SACsC;CACtC,OACE,OAAQ,QAA+C,SAAS;AAEpE;AAQA,IAAM,uDAAuC,IAAI,QAG/C;AAEF,SAAS,qCACP,SACA,UAC+B;CAC/B,MAAM,qBAAwC,CAAC;CAC/C,IAAI,uBAAuB;CAC3B,IAAI,UAAU,CAAC,MAAM,QAAQ,OAAO;CAEpC,KAAK,IAAI,SAAS,SAAS,KAAK,GAAG,CAAC,OAAO,MAAM,SAAS,SAAS,KAAK,GAAG;EACzE,MAAM,kBAAkB,6BAA6B,OAAO,KAAK;EACjE,mBAAmB,KAAK,gBAAgB,OAAO;EAC/C,yBAAyB,gBAAgB;EACzC,YAAY,gBAAgB;CAC9B;CAEA,OAAO;EACL,SAAS,UAAU,qBAAqB;EACxC;EACA;CACF;AACF;AAEA,SAAS,6BACP,SAC+B;CAC/B,IACE,YAAY,QACZ,YAAY,KAAA,KACZ,OAAO,YAAY,aACnB,YAAY,IAEZ,OAAO;EAAE;EAAS,sBAAsB;EAAO,SAAS;CAAM;CAGhE,IACE,OAAO,YAAY,YACnB,OAAO,YAAY,YACnB,OAAO,YAAY,UAEnB,OAAO;EAAE;EAAS,sBAAsB;EAAM,SAAS;CAAM;CAG/D,IAAI,MAAM,eAA+C,OAAO,GAAG;EACjE,IAAI,QAAQ,SAAS,MAAM,UACzB,OAAO;GAAE;GAAS,sBAAsB;GAAM,SAAS;EAAM;EAG/D,MAAM,qBAAqB,6BACzB,QAAQ,MAAM,QAChB;EACA,OAAO;GACL,SAAS,mBAAmB,UACxB,MAAM,aAAa,SAAS,KAAA,GAAW,mBAAmB,OAAO,IACjE;GACJ,sBAAsB,mBAAmB;GACzC,SAAS,mBAAmB;EAC9B;CACF;CAEA,IAAI,8BAA8B,OAAO,GAAG;EAC1C,MAAM,WAAW,QAAQ,OAAO,SAAS,CAAC;EAC1C,MAAM,kBAAkB,8BAA8B,QAAQ,IACzD,WACD;EAEJ,IAAI,oBAAoB,MAAM;GAC5B,MAAM,SAAS,qCAAqC,IAAI,eAAe;GACvE,IAAI,WAAW,KAAA,GAAW,OAAO;EACnC;EAEA,MAAM,aAAa,qCAAqC,SAAS,QAAQ;EACzE,IAAI,oBAAoB,MACtB,qCAAqC,IAAI,iBAAiB,UAAU;EAEtE,OAAO;CACT;CAEA,OAAO;EAAE;EAAS,sBAAsB;EAAM,SAAS;CAAM;AAC/D;AAEA,SAAS,6BACP,OACoB;CACpB,OAAO,OAAO,KAAK,IAAI,QAAQ,KAAA;AACjC;AAEA,SAAS,2BAA2B,QAAoC;CACtE,QAAQ,QAAR;EACE,KAAK,WACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,aACH,OAAO;EACT,KAAK,aACH,OAAO;EACT,KAAK,SACH,OAAO;EACT,SACE,OAAO,YAAY,MAAM;CAC7B;AACF;AAQA,SAAgB,uBAAuB,EACrC,QACA,OACA,aAC8B;CAC9B,MAAM,YAAY,GAAG,yBAAyB,EAAE,OAAO,CAAC,GAAG,SAAS;CAEpE,QAAQ,QAAR;EACE,KAAK,WACH,OACE,oBAAC,OAAD;GAAK,aAAU;GAAqB,WAAW;aAC7C,oBAAC,QAAD;IAAM,WAAU;cAAuB,QAAQ;GAAQ,CAAA;EACpD,CAAA;EAET,KAAK,WACH,OACE,oBAAC,OAAD;GACE,aAAU;GACV,WAAW,GACT,WACA,kDACF;aAEA,oBAAC,QAAD,EAAQ,WAAU,iDAAkD,CAAA;EACjE,CAAA;EAET,KAAK,aACH,OACE,oBAAC,OAAD;GAAK,aAAU;GAAqB,WAAW;aAC7C,oBAAC,OAAD,EAAO,WAAU,SAAU,CAAA;EACxB,CAAA;EAET,KAAK,aACH,OACE,oBAAC,OAAD;GACE,aAAU;GACV,WAAW,GACT,WACA,kDACF;aAEA,oBAAC,OAAD,EAAO,WAAU,SAAU,CAAA;EACxB,CAAA;EAET,KAAK,SACH,OACE,oBAAC,OAAD;GACE,aAAU;GACV,WAAW,GAAG,WAAW,2CAA2C;aAEpE,oBAAC,aAAD,EAAa,WAAU,SAAU,CAAA;EAC9B,CAAA;EAET,SACE,OAAO,YAAY,MAAM;CAC7B;AACF;AAEA,uBAAuB,cAAc;AAcrC,SAAgB,iBAAiB,EAC/B,MACA,OACA,QACA,aAAa,aACb,WAAW,sBACX,aAAa,MACb,UACA,SAAS,OACT,oBACwB;CACxB,MAAM,YAAY,MAAM,MAAM;CAC9B,MAAM,qBAAqB,MAAM,MAAM;CACvC,MAAM,oBAAoB,6BAA6B,KAAK,OAAO;CACnE,MAAM,aAAa,kBAAkB;CACrC,MAAM,QAAQ,6BAA6B,KAAK,KAAK;CACrD,MAAM,WAAW,UAAU,KAAA;CAC3B,MAAM,uBAAuB,cAAc;CAC3C,MAAM,sBAAsB,wBAAwB;CACpD,MAAM,uBAAuB,iBAAiB;CAC9C,MAAM,mBAAmB,6BAA6B;CACtD,MAAM,uBAAuB,EAC3B,UAAU,uBAAuB,IAAI,GACvC;CACA,MAAM,cACJ,qBAAA,UAAA,EAAA,UAAA;EACE,oBAAC,wBAAD;GAAwB,QAAQ,KAAK;GAAe;EAAQ,CAAA;EAE5D,qBAAC,OAAD;GAAK,WAAU;aAAf,CACE,qBAAC,OAAD;IAAK,WAAU;cAAf;KACE,oBAAC,QAAD;MACE,WAAW,GACT,uBACA,KAAK,WAAW,YACZ,yBACA,iBACN;gBAEC,KAAK;KACF,CAAA;KACN,oBAAC,QAAD;MAAM,WAAU;gBACb,2BAA2B,KAAK,MAAM;KACnC,CAAA;KACL,KAAK,eAAe,KAAA,KACnB,oBAAC,QAAD;MAAM,WAAU;gBACb,2BAA2B,KAAK,UAAU;KACvC,CAAA;IAEL;OACJ,KAAK,eACJ,oBAAC,KAAD;IAAG,WAAU;cACV,KAAK;GACL,CAAA,CAEF;;EAEJ,uBACC,oBAAC,OAAD;GAAK,WAAU;aACZ,WACC,oBAAC,aAAD,EAAa,WAAU,+BAAgC,CAAA,IAEvD,oBAAC,cAAD,EAAc,WAAU,8CAA+C,CAAA;EAEtE,CAAA;CAEP,EAAA,CAAA;CAGJ,OACE,qBAAC,OAAD;EACE,aAAW;EACX,oBAAkB,KAAK;EACvB,mBAAiB;EACjB,WAAW,GACT,iBAAiB,eACjB,iBAAiB,cAAc,CAAC,UAAU,wBAC5C;YAPF;GASG,sBACC,oBAAC,UAAD;IACE,MAAK;IACL,SAAS;IACT,gBAAc,SAAS,SAAS,KAAA;IAChC,iBAAe;IACf,iBAAe;IACf,oBAAkB,WAAW,qBAAqB,KAAA;IAClD,WAAW,GACT,yBAAyB,EAAE,QAAQ,KAAK,OAAO,CAAC,GAChD,6HACF;cAEC;GACK,CAAA,IAER,oBAAC,OAAD;IACE,gBAAc,SAAS,SAAS,KAAA;IAChC,oBAAkB,WAAW,qBAAqB,KAAA;IAClD,WAAW,GACT,yBAAyB,EAAE,QAAQ,KAAK,OAAO,CAAC,GAChD,QACF;cAEC;GACE,CAAA;GAGP,oBAAC,iBAAD;IAAiB,SAAS;cACvB,YAAY,wBACX,oBAAC,OAAO,KAAR;KACE,IAAI;KACJ,aAAU;KACV,SAAS;MAAE,QAAQ;MAAG,SAAS;KAAE;KACjC,SAAS;MAAE,QAAQ;MAAQ,SAAS;KAAE;KACtC,MAAM;MAAE,QAAQ;MAAG,SAAS;KAAE;KAC9B,YAAY;KACZ,WAAU;eAEV,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACG,YACC,oBAAC,OAAD;OAAK,WAAU;iBACb,qBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,oBAAC,aAAD,EAAa,WAAU,0CAA2C,CAAA,GAClE,oBAAC,KAAD;SAAG,WAAU;mBAA4B;QAAS,CAAA,CAC/C;;MACF,CAAA,GAEN,cACC,oBAAC,OAAD;OAAK,WAAW,WAAW,SAAS,KAAA;iBACjC,kBAAkB;MAChB,CAAA,CAEJ;;IACK,CAAA;GAEC,CAAA;GAEhB,YACC,oBAAC,QAAD;IAAM,IAAI;IAAoB,WAAU;cACrC;GACG,CAAA;GAGP,iBAAiB,gBAAgB,CAAC,UACjC,oBAAC,OAAD;IACE,aAAU;IACV,eAAY;IACZ,WAAU;GACX,CAAA;EAEA;;AAET;AAEA,iBAAiB,cAAc;AAE/B,SAAgB,qBAAqB,EACnC,OACA,aAAa,aACb,WAAW,sBACX,aAAa,MACb,cACA,iBAAiB,2BACjB,yBAAyB,CAAC,GAC1B,yBACA,WACA,cAAc,QACqB;CACnC,MAAM,eAAe,8BAA8B,KAAA;CACnD,MAAM,qBAAqB,eACvB,CAAC,GAAG,yBAAyB,IAC7B,KAAA;CACJ,MAAM,CAAC,6BAA6B,kCAClC,MAAM,eACJ,iCAAiC,wBAAwB,KAAK,CAChE;CACF,MAAM,mCAAmC,MAAM,OAC7C,sBAAsB,CAAC,CACzB;CACA,MAAM,mBAAmB,MAAM,OAAO,YAAY;CAIlD,MAAM,yBAAyB,iCAHJ,eACvB,4BACA,6BAGF,KACF;CACA,MAAM,cAAc,IAAI,IAAI,sBAAsB;CAElD,MAAM,sBAAsB;EAC1B,IAAI,uBAAuB,KAAA,GACzB,iCAAiC,UAAU;CAE/C,GAAG,CAAC,kBAAkB,CAAC;CAEvB,MAAM,sBAAsB;EAC1B,MAAM,gBAAgB,iBAAiB;EACvC,iBAAiB,UAAU;EAC3B,IAAI,cAAc;EAElB,gCAAgC,YAAY;GAI1C,MAAM,aAAa,iCAHJ,gBACX,iCAAiC,UACjC,SACwD,KAAK;GACjE,OAAO,wBAAwB,YAAY,OAAO,IAC9C,UACA;EACN,CAAC;CACH,GAAG,CAAC,cAAc,KAAK,CAAC;CAExB,MAAM,cAAc,OAAe;EACjC,MAAM,OAAO,IAAI,IAAI,sBAAsB;EAC3C,IAAI,KAAK,IAAI,EAAE,GAAG,KAAK,OAAO,EAAE;OAC3B,KAAK,IAAI,EAAE;EAChB,MAAM,iBAAiB,iCAAiC,CAAC,GAAG,IAAI,GAAG,KAAK;EACxE,IAAI,CAAC,cACH,+BAA+B,CAAC,GAAG,cAAc,CAAC;EAEpD,0BAA0B,CAAC,GAAG,cAAc,CAAC;CAC/C;CAEA,IAAI,CAAC,aAAa,OAAO;CAEzB,OACE,oBAAC,MAAD;EACE,aAAU;EACV,mBAAiB;EACjB,WAAW,GAAG,qBAAqB,SAAS;YAE3C,MAAM,KAAK,MAAM,UAChB,oBAAC,MAAD,EAAA,UACE,oBAAC,kBAAD;GACQ;GACC;GACP,QAAQ,UAAU,MAAM,SAAS;GACrB;GACF;GACE;GACZ,UAAU,YAAY,IAAI,KAAK,EAAE;GACjC,QAAQ,iBAAiB,KAAK;GAC9B,wBAAwB,WAAW,KAAK,EAAE;EAC3C,CAAA,EACC,GAZK,KAAK,EAYV,CACL;CACC,CAAA;AAER;AAEA,qBAAqB,cAAc"}
@@ -1,12 +1,12 @@
1
1
  import { a as q } from "./rolldown-runtime.js";
2
- import { i as A, t as L } from "./vendor/react.js";
2
+ import { i as $, t as A } from "./vendor/react.js";
3
3
  import { n as f, t as R } from "./utils.js";
4
4
  import { t as W } from "./createLucideIcon.js";
5
- import { t as V } from "./check.js";
6
- import { t as P } from "./chevron-down.js";
7
- import { t as F } from "./chevron-right.js";
5
+ import { t as L } from "./check.js";
6
+ import { t as V } from "./chevron-down.js";
7
+ import { t as P } from "./chevron-right.js";
8
8
  import { t as E } from "./circle-alert.js";
9
- import { t as $ } from "./react.js";
9
+ import { t as F } from "./react.js";
10
10
  import { t as B } from "./AnimatePresence.js";
11
11
  import { t as K } from "./use-reduced-motion.js";
12
12
  import { t as _ } from "./dist.js";
@@ -57,7 +57,7 @@ var O = [
57
57
  height: "18",
58
58
  rx: "1",
59
59
  key: "1wsw3u"
60
- }]], G = W("pause", U), l = /* @__PURE__ */ q(A(), 1), t = L(), H = {
60
+ }]], G = W("pause", U), c = /* @__PURE__ */ q($(), 1), t = A(), H = {
61
61
  pending: "text-muted-foreground",
62
62
  running: "text-primary",
63
63
  suspended: "text-warning",
@@ -100,7 +100,14 @@ function Y(e, r) {
100
100
  return e.length === r.length && e.every((s, n) => s === r[n]);
101
101
  }
102
102
  function Z(e) {
103
- return e < 1e3 ? `${e}ms` : `${(e / 1e3).toFixed(1)}s`;
103
+ if (e < 1e3) return `${e}ms`;
104
+ if (e < 6e4) return `${(e / 1e3).toFixed(1)}s`;
105
+ const r = Math.floor(e / 1e3), s = Math.floor(r / 3600), n = Math.floor(r % 3600 / 60), o = r % 60;
106
+ return [
107
+ s > 0 ? `${s}h` : null,
108
+ n > 0 ? `${n}m` : null,
109
+ o > 0 ? `${o}s` : null
110
+ ].filter((l) => l !== null).join(" ");
104
111
  }
105
112
  function ee(e) {
106
113
  return typeof e == "object" && e !== null && Symbol.iterator in e && typeof e[Symbol.iterator] == "function";
@@ -111,15 +118,15 @@ function te(e) {
111
118
  var z = /* @__PURE__ */ new WeakMap();
112
119
  function re(e, r) {
113
120
  const s = [];
114
- let n = !1, d = !Array.isArray(e);
115
- for (let c = r.next(); !c.done; c = r.next()) {
116
- const u = S(c.value);
117
- s.push(u.content), n ||= u.hasRenderableContent, d ||= u.changed;
121
+ let n = !1, o = !Array.isArray(e);
122
+ for (let l = r.next(); !l.done; l = r.next()) {
123
+ const u = S(l.value);
124
+ s.push(u.content), n ||= u.hasRenderableContent, o ||= u.changed;
118
125
  }
119
126
  return {
120
- content: d ? s : e,
127
+ content: o ? s : e,
121
128
  hasRenderableContent: n,
122
- changed: d
129
+ changed: o
123
130
  };
124
131
  }
125
132
  function S(e) {
@@ -133,15 +140,15 @@ function S(e) {
133
140
  hasRenderableContent: !0,
134
141
  changed: !1
135
142
  };
136
- if (l.isValidElement(e)) {
137
- if (e.type !== l.Fragment) return {
143
+ if (c.isValidElement(e)) {
144
+ if (e.type !== c.Fragment) return {
138
145
  content: e,
139
146
  hasRenderableContent: !0,
140
147
  changed: !1
141
148
  };
142
149
  const r = S(e.props.children);
143
150
  return {
144
- content: r.changed ? l.cloneElement(e, void 0, r.content) : e,
151
+ content: r.changed ? c.cloneElement(e, void 0, r.content) : e,
145
152
  hasRenderableContent: r.hasRenderableContent,
146
153
  changed: r.changed
147
154
  };
@@ -149,8 +156,8 @@ function S(e) {
149
156
  if (ee(e)) {
150
157
  const r = e[Symbol.iterator](), s = te(r) ? r : null;
151
158
  if (s !== null) {
152
- const d = z.get(s);
153
- if (d !== void 0) return d;
159
+ const o = z.get(s);
160
+ if (o !== void 0) return o;
154
161
  }
155
162
  const n = re(e, r);
156
163
  return s !== null && z.set(s, n), n;
@@ -180,7 +187,7 @@ function se(e) {
180
187
  return R(e);
181
188
  }
182
189
  }
183
- function D({ status: e, index: r, className: s }) {
190
+ function M({ status: e, index: r, className: s }) {
184
191
  const n = f(Q({ status: e }), s);
185
192
  switch (e) {
186
193
  case "pending":
@@ -208,7 +215,7 @@ function D({ status: e, index: r, className: s }) {
208
215
  return /* @__PURE__ */ (0, t.jsx)("div", {
209
216
  "data-slot": "workflow-step-icon",
210
217
  className: f(n, "delight-check-bounce motion-reduce:!animate-none"),
211
- children: /* @__PURE__ */ (0, t.jsx)(V, { className: "size-3" })
218
+ children: /* @__PURE__ */ (0, t.jsx)(L, { className: "size-3" })
212
219
  });
213
220
  case "error":
214
221
  return /* @__PURE__ */ (0, t.jsx)("div", {
@@ -220,10 +227,10 @@ function D({ status: e, index: r, className: s }) {
220
227
  return R(e);
221
228
  }
222
229
  }
223
- D.displayName = "WorkflowStepStatusIcon";
224
- function M({ step: e, index: r, isLast: s, appearance: n = "contained", itemSlot: d = "workflow-step-item", expandable: c = !0, expanded: u, active: b = !1, onExpandedChange: j }) {
225
- const k = l.useId(), i = l.useId(), p = S(e.content), y = p.hasRenderableContent, h = ne(e.error), m = h !== void 0, x = y || m, v = x && c, N = K(), g = X[n], o = { duration: N ? 0 : 0.2 }, a = /* @__PURE__ */ (0, t.jsxs)(t.Fragment, { children: [
226
- /* @__PURE__ */ (0, t.jsx)(D, {
230
+ M.displayName = "WorkflowStepStatusIcon";
231
+ function D({ step: e, index: r, isLast: s, appearance: n = "contained", itemSlot: o = "workflow-step-item", expandable: l = !0, expanded: u, active: b = !1, onExpandedChange: j }) {
232
+ const k = c.useId(), d = c.useId(), p = S(e.content), y = p.hasRenderableContent, h = ne(e.error), m = h !== void 0, x = y || m, v = x && l, N = K(), g = X[n], i = { duration: N ? 0 : 0.2 }, a = /* @__PURE__ */ (0, t.jsxs)(t.Fragment, { children: [
233
+ /* @__PURE__ */ (0, t.jsx)(M, {
227
234
  status: e.status,
228
235
  index: r
229
236
  }),
@@ -252,11 +259,11 @@ function M({ step: e, index: r, isLast: s, appearance: n = "contained", itemSlot
252
259
  }),
253
260
  v && /* @__PURE__ */ (0, t.jsx)("div", {
254
261
  className: "shrink-0",
255
- children: u ? /* @__PURE__ */ (0, t.jsx)(P, { className: "size-4 text-muted-foreground" }) : /* @__PURE__ */ (0, t.jsx)(F, { className: "size-4 text-muted-foreground rtl:rotate-180" })
262
+ children: u ? /* @__PURE__ */ (0, t.jsx)(V, { className: "size-4 text-muted-foreground" }) : /* @__PURE__ */ (0, t.jsx)(P, { className: "size-4 text-muted-foreground rtl:rotate-180" })
256
263
  })
257
264
  ] });
258
265
  return /* @__PURE__ */ (0, t.jsxs)("div", {
259
- "data-slot": d,
266
+ "data-slot": o,
260
267
  "data-step-status": e.status,
261
268
  "data-appearance": n,
262
269
  className: f(g.rootClassName, g.hasDivider && !s && "border-b border-border"),
@@ -267,18 +274,18 @@ function M({ step: e, index: r, isLast: s, appearance: n = "contained", itemSlot
267
274
  "aria-current": b ? "step" : void 0,
268
275
  "aria-expanded": u,
269
276
  "aria-controls": k,
270
- "aria-describedby": m ? i : void 0,
277
+ "aria-describedby": m ? d : void 0,
271
278
  className: f(I({ status: e.status }), "w-full cursor-pointer hover:bg-muted focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-ring"),
272
279
  children: a
273
280
  }) : /* @__PURE__ */ (0, t.jsx)("div", {
274
281
  "aria-current": b ? "step" : void 0,
275
- "aria-describedby": m ? i : void 0,
282
+ "aria-describedby": m ? d : void 0,
276
283
  className: f(I({ status: e.status }), "w-full"),
277
284
  children: a
278
285
  }),
279
286
  /* @__PURE__ */ (0, t.jsx)(B, {
280
287
  initial: !1,
281
- children: u && x && /* @__PURE__ */ (0, t.jsx)($.div, {
288
+ children: u && x && /* @__PURE__ */ (0, t.jsx)(F.div, {
282
289
  id: k,
283
290
  "data-slot": "workflow-step-panel",
284
291
  initial: {
@@ -293,7 +300,7 @@ function M({ step: e, index: r, isLast: s, appearance: n = "contained", itemSlot
293
300
  height: 0,
294
301
  opacity: 0
295
302
  },
296
- transition: o,
303
+ transition: i,
297
304
  className: "overflow-hidden motion-reduce:transition-none",
298
305
  children: /* @__PURE__ */ (0, t.jsxs)("div", {
299
306
  className: "px-4 pb-3 ps-12",
@@ -314,7 +321,7 @@ function M({ step: e, index: r, isLast: s, appearance: n = "contained", itemSlot
314
321
  })
315
322
  }),
316
323
  m && /* @__PURE__ */ (0, t.jsx)("span", {
317
- id: i,
324
+ id: d,
318
325
  className: "sr-only",
319
326
  children: h
320
327
  }),
@@ -326,46 +333,46 @@ function M({ step: e, index: r, isLast: s, appearance: n = "contained", itemSlot
326
333
  ]
327
334
  });
328
335
  }
329
- M.displayName = "WorkflowStepItem";
330
- function ae({ steps: e, appearance: r = "contained", itemSlot: s = "workflow-step-item", expandable: n = !0, activeStepId: d, expandedStepIds: c, defaultExpandedStepIds: u = [], onExpandedStepIdsChange: b, className: j, renderItems: k = !0 }) {
331
- const i = c !== void 0, p = i ? [...c] : void 0, [y, h] = l.useState(() => C(u, e)), m = l.useRef(p ?? []), x = l.useRef(i), v = C(i ? c : y, e), N = new Set(v);
332
- l.useLayoutEffect(() => {
336
+ D.displayName = "WorkflowStepItem";
337
+ function ae({ steps: e, appearance: r = "contained", itemSlot: s = "workflow-step-item", expandable: n = !0, activeStepId: o, expandedStepIds: l, defaultExpandedStepIds: u = [], onExpandedStepIdsChange: b, className: j, renderItems: k = !0 }) {
338
+ const d = l !== void 0, p = d ? [...l] : void 0, [y, h] = c.useState(() => C(u, e)), m = c.useRef(p ?? []), x = c.useRef(d), v = C(d ? l : y, e), N = new Set(v);
339
+ c.useLayoutEffect(() => {
333
340
  p !== void 0 && (m.current = p);
334
- }, [p]), l.useLayoutEffect(() => {
335
- const o = x.current;
336
- x.current = i, !i && h((a) => {
337
- const w = C(o ? m.current : a, e);
341
+ }, [p]), c.useLayoutEffect(() => {
342
+ const i = x.current;
343
+ x.current = d, !d && h((a) => {
344
+ const w = C(i ? m.current : a, e);
338
345
  return Y(w, a) ? a : w;
339
346
  });
340
- }, [i, e]);
341
- const g = (o) => {
347
+ }, [d, e]);
348
+ const g = (i) => {
342
349
  const a = new Set(v);
343
- a.has(o) ? a.delete(o) : a.add(o);
350
+ a.has(i) ? a.delete(i) : a.add(i);
344
351
  const w = C([...a], e);
345
- i || h([...w]), b?.([...w]);
352
+ d || h([...w]), b?.([...w]);
346
353
  };
347
354
  return k ? /* @__PURE__ */ (0, t.jsx)("ol", {
348
355
  "data-slot": "workflow-step-list",
349
356
  "data-appearance": r,
350
357
  className: f("m-0 list-none p-0", j),
351
- children: e.map((o, a) => /* @__PURE__ */ (0, t.jsx)("li", { children: /* @__PURE__ */ (0, t.jsx)(M, {
352
- step: o,
358
+ children: e.map((i, a) => /* @__PURE__ */ (0, t.jsx)("li", { children: /* @__PURE__ */ (0, t.jsx)(D, {
359
+ step: i,
353
360
  index: a,
354
361
  isLast: a === e.length - 1,
355
362
  appearance: r,
356
363
  itemSlot: s,
357
364
  expandable: n,
358
- expanded: N.has(o.id),
359
- active: d === o.id,
360
- onExpandedChange: () => g(o.id)
361
- }) }, o.id))
365
+ expanded: N.has(i.id),
366
+ active: o === i.id,
367
+ onExpandedChange: () => g(i.id)
368
+ }) }, i.id))
362
369
  }) : null;
363
370
  }
364
371
  ae.displayName = "WorkflowStepRenderer";
365
372
  export {
366
373
  ae as n,
367
- D as r,
368
- M as t
374
+ M as r,
375
+ D as t
369
376
  };
370
377
 
371
378
  //# sourceMappingURL=workflow-step-renderer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-step-renderer.js","names":["__iconNode"],"sources":["../../../../../../../../../../../Users/akarim/Documents/test/humain_foundation_ui/node_modules/.bun/lucide-react@1.25.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/loader.mjs","../../../../../../../../../../../Users/akarim/Documents/test/humain_foundation_ui/node_modules/.bun/lucide-react@1.25.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/pause.mjs","../../src/components/organisms/ai/_shared/workflow-step-renderer.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.25.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 2v4\", key: \"3427ic\" }],\n [\"path\", { d: \"m16.2 7.8 2.9-2.9\", key: \"r700ao\" }],\n [\"path\", { d: \"M18 12h4\", key: \"wj9ykh\" }],\n [\"path\", { d: \"m16.2 16.2 2.9 2.9\", key: \"1bxg5t\" }],\n [\"path\", { d: \"M12 18v4\", key: \"jadmvz\" }],\n [\"path\", { d: \"m4.9 19.1 2.9-2.9\", key: \"bwix9q\" }],\n [\"path\", { d: \"M2 12h4\", key: \"j09sii\" }],\n [\"path\", { d: \"m4.9 4.9 2.9 2.9\", key: \"giyufr\" }]\n];\nconst Loader = createLucideIcon(\"loader\", __iconNode);\n\nexport { __iconNode, Loader as default };\n//# sourceMappingURL=loader.mjs.map\n","/**\n * @license lucide-react v1.25.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 [\"rect\", { x: \"14\", y: \"3\", width: \"5\", height: \"18\", rx: \"1\", key: \"kaeet6\" }],\n [\"rect\", { x: \"5\", y: \"3\", width: \"5\", height: \"18\", rx: \"1\", key: \"1wsw3u\" }]\n];\nconst Pause = createLucideIcon(\"pause\", __iconNode);\n\nexport { __iconNode, Pause as default };\n//# sourceMappingURL=pause.mjs.map\n","import { cva } from 'class-variance-authority';\nimport {\n AlertCircle,\n Check,\n ChevronDown,\n ChevronRight,\n Loader,\n Pause,\n} from 'lucide-react';\nimport { AnimatePresence, motion, useReducedMotion } from 'motion/react';\nimport * as React from 'react';\nimport { assertNever, cn } from '@/lib/utils';\n\nexport type WorkflowStepStatus =\n | 'pending'\n | 'running'\n | 'suspended'\n | 'completed'\n | 'error';\n\nexport type WorkflowStepAppearance = 'contained' | 'embedded' | 'timeline';\n\nexport interface WorkflowStepViewModel {\n id: string;\n title: string;\n description?: string;\n status: WorkflowStepStatus;\n content?: React.ReactNode;\n durationMs?: number;\n error?: string;\n}\n\nexport interface WorkflowStepRendererProps {\n steps: readonly WorkflowStepViewModel[];\n appearance?: WorkflowStepAppearance;\n itemSlot?: string;\n expandable?: boolean;\n activeStepId?: string;\n expandedStepIds?: readonly string[];\n defaultExpandedStepIds?: readonly string[];\n onExpandedStepIdsChange?: (ids: readonly string[]) => void;\n className?: string;\n}\n\ninterface PrivateWorkflowStepRendererProps extends WorkflowStepRendererProps {\n renderItems?: boolean;\n}\n\nconst workflowStepItemStatusClasses = {\n pending: 'text-muted-foreground',\n running: 'text-primary',\n suspended: 'text-warning',\n completed: 'text-success',\n error: 'text-destructive',\n} as const satisfies Record<WorkflowStepStatus, string>;\n\nconst workflowStepIconStatusClasses = {\n pending: 'bg-accent text-muted-foreground',\n running: 'bg-primary/20 text-primary',\n suspended: 'bg-warning/20 text-warning',\n completed: 'bg-success/20 text-success',\n error: 'bg-destructive/20 text-destructive',\n} as const satisfies Record<WorkflowStepStatus, string>;\n\nexport const workflowStepItemVariants = cva(\n 'flex items-start gap-3 px-4 py-3 transition-colors motion-reduce:transition-none',\n {\n variants: {\n status: workflowStepItemStatusClasses,\n },\n defaultVariants: {\n status: 'pending',\n },\n },\n);\n\nexport const workflowStepIconVariants = cva(\n 'size-5 shrink-0 flex items-center justify-center rounded-full',\n {\n variants: {\n status: workflowStepIconStatusClasses,\n },\n defaultVariants: {\n status: 'pending',\n },\n },\n);\n\nconst workflowStepAppearanceConfig = {\n contained: {\n rootClassName: 'relative',\n hasDivider: true,\n hasConnector: false,\n },\n embedded: {\n rootClassName: 'relative',\n hasDivider: true,\n hasConnector: false,\n },\n timeline: {\n rootClassName: 'relative',\n hasDivider: false,\n hasConnector: true,\n },\n} as const satisfies Record<\n WorkflowStepAppearance,\n { rootClassName: string; hasDivider: boolean; hasConnector: boolean }\n>;\n\nexport function normalizeExpandedWorkflowStepIds(\n ids: readonly string[],\n steps: readonly WorkflowStepViewModel[],\n): string[] {\n const requested = new Set(ids);\n return steps.flatMap((step) => (requested.has(step.id) ? [step.id] : []));\n}\n\nfunction areWorkflowStepIdsEqual(\n left: readonly string[],\n right: readonly string[],\n): boolean {\n return (\n left.length === right.length &&\n left.every((id, index) => id === right[index])\n );\n}\n\nfunction formatWorkflowStepDuration(durationMs: number): string {\n if (durationMs < 1000) return `${durationMs}ms`;\n return `${(durationMs / 1000).toFixed(1)}s`;\n}\n\nfunction isIterableWorkflowStepContent(\n content: React.ReactNode,\n): content is Iterable<React.ReactNode> {\n return (\n typeof content === 'object' &&\n content !== null &&\n Symbol.iterator in content &&\n typeof (content as Iterable<React.ReactNode>)[Symbol.iterator] ===\n 'function'\n );\n}\n\nfunction isIteratorWorkflowStepContent(\n content: unknown,\n): content is Iterator<React.ReactNode> {\n return (\n typeof (content as Partial<Iterator<React.ReactNode>>).next === 'function'\n );\n}\n\ninterface NormalizedWorkflowStepContent {\n content: React.ReactNode;\n hasRenderableContent: boolean;\n changed: boolean;\n}\n\nconst normalizedOneShotWorkflowStepContent = new WeakMap<\n object,\n NormalizedWorkflowStepContent\n>();\n\nfunction normalizeIterableWorkflowStepContent(\n content: Iterable<React.ReactNode>,\n iterator: Iterator<React.ReactNode>,\n): NormalizedWorkflowStepContent {\n const normalizedChildren: React.ReactNode[] = [];\n let hasRenderableContent = false;\n let changed = !Array.isArray(content);\n\n for (let result = iterator.next(); !result.done; result = iterator.next()) {\n const normalizedChild = normalizeWorkflowStepContent(result.value);\n normalizedChildren.push(normalizedChild.content);\n hasRenderableContent ||= normalizedChild.hasRenderableContent;\n changed ||= normalizedChild.changed;\n }\n\n return {\n content: changed ? normalizedChildren : content,\n hasRenderableContent,\n changed,\n };\n}\n\nfunction normalizeWorkflowStepContent(\n content: React.ReactNode,\n): NormalizedWorkflowStepContent {\n if (\n content === null ||\n content === undefined ||\n typeof content === 'boolean' ||\n content === ''\n ) {\n return { content, hasRenderableContent: false, changed: false };\n }\n\n if (\n typeof content === 'string' ||\n typeof content === 'number' ||\n typeof content === 'bigint'\n ) {\n return { content, hasRenderableContent: true, changed: false };\n }\n\n if (React.isValidElement<{ children?: React.ReactNode }>(content)) {\n if (content.type !== React.Fragment) {\n return { content, hasRenderableContent: true, changed: false };\n }\n\n const normalizedChildren = normalizeWorkflowStepContent(\n content.props.children,\n );\n return {\n content: normalizedChildren.changed\n ? React.cloneElement(content, undefined, normalizedChildren.content)\n : content,\n hasRenderableContent: normalizedChildren.hasRenderableContent,\n changed: normalizedChildren.changed,\n };\n }\n\n if (isIterableWorkflowStepContent(content)) {\n const iterator = content[Symbol.iterator]();\n const oneShotCacheKey = isIteratorWorkflowStepContent(iterator)\n ? (iterator as object)\n : null;\n\n if (oneShotCacheKey !== null) {\n const cached = normalizedOneShotWorkflowStepContent.get(oneShotCacheKey);\n if (cached !== undefined) return cached;\n }\n\n const normalized = normalizeIterableWorkflowStepContent(content, iterator);\n if (oneShotCacheKey !== null) {\n normalizedOneShotWorkflowStepContent.set(oneShotCacheKey, normalized);\n }\n return normalized;\n }\n\n return { content, hasRenderableContent: true, changed: false };\n}\n\nfunction getNonBlankWorkflowStepError(\n error: string | undefined,\n): string | undefined {\n return error?.trim() ? error : undefined;\n}\n\nfunction getWorkflowStepStatusLabel(status: WorkflowStepStatus): string {\n switch (status) {\n case 'pending':\n return 'Pending';\n case 'running':\n return 'Running';\n case 'suspended':\n return 'Paused';\n case 'completed':\n return 'Completed';\n case 'error':\n return 'Error';\n default:\n return assertNever(status);\n }\n}\n\nexport interface WorkflowStepStatusIconProps {\n status: WorkflowStepStatus;\n index: number;\n className?: string;\n}\n\nexport function WorkflowStepStatusIcon({\n status,\n index,\n className,\n}: WorkflowStepStatusIconProps) {\n const iconClass = cn(workflowStepIconVariants({ status }), className);\n\n switch (status) {\n case 'pending':\n return (\n <div data-slot=\"workflow-step-icon\" className={iconClass}>\n <span className=\"text-xs font-medium\">{index + 1}</span>\n </div>\n );\n case 'running':\n return (\n <div\n data-slot=\"workflow-step-icon\"\n className={cn(\n iconClass,\n 'delight-status-pulse motion-reduce:!animate-none',\n )}\n >\n <Loader className=\"size-3 animate-spin motion-reduce:animate-none\" />\n </div>\n );\n case 'suspended':\n return (\n <div data-slot=\"workflow-step-icon\" className={iconClass}>\n <Pause className=\"size-3\" />\n </div>\n );\n case 'completed':\n return (\n <div\n data-slot=\"workflow-step-icon\"\n className={cn(\n iconClass,\n 'delight-check-bounce motion-reduce:!animate-none',\n )}\n >\n <Check className=\"size-3\" />\n </div>\n );\n case 'error':\n return (\n <div\n data-slot=\"workflow-step-icon\"\n className={cn(iconClass, 'delight-shake motion-reduce:!animate-none')}\n >\n <AlertCircle className=\"size-3\" />\n </div>\n );\n default:\n return assertNever(status);\n }\n}\n\nWorkflowStepStatusIcon.displayName = 'WorkflowStepStatusIcon';\n\nexport interface WorkflowStepItemProps {\n step: WorkflowStepViewModel;\n index: number;\n isLast: boolean;\n appearance?: WorkflowStepAppearance;\n itemSlot?: string;\n expandable?: boolean;\n expanded: boolean;\n active?: boolean;\n onExpandedChange: () => void;\n}\n\nexport function WorkflowStepItem({\n step,\n index,\n isLast,\n appearance = 'contained',\n itemSlot = 'workflow-step-item',\n expandable = true,\n expanded,\n active = false,\n onExpandedChange,\n}: WorkflowStepItemProps) {\n const contentId = React.useId();\n const errorDescriptionId = React.useId();\n const normalizedContent = normalizeWorkflowStepContent(step.content);\n const hasContent = normalizedContent.hasRenderableContent;\n const error = getNonBlankWorkflowStepError(step.error);\n const hasError = error !== undefined;\n const hasExpandableDetails = hasContent || hasError;\n const isDisclosureControl = hasExpandableDetails && expandable;\n const prefersReducedMotion = useReducedMotion();\n const appearanceConfig = workflowStepAppearanceConfig[appearance];\n const disclosureTransition = {\n duration: prefersReducedMotion ? 0 : 0.2,\n };\n const stepContent = (\n <>\n <WorkflowStepStatusIcon status={step.status} index={index} />\n\n <div className=\"min-w-0 flex-1 text-start\">\n <div className=\"flex items-center gap-2\">\n <span\n className={cn(\n 'text-sm font-medium',\n step.status === 'pending'\n ? 'text-text-quaternary'\n : 'text-foreground',\n )}\n >\n {step.title}\n </span>\n <span className=\"text-xs text-secondary-foreground\">\n {getWorkflowStepStatusLabel(step.status)}\n </span>\n {step.durationMs !== undefined && (\n <span className=\"text-xs text-muted-foreground\">\n {formatWorkflowStepDuration(step.durationMs)}\n </span>\n )}\n </div>\n {step.description && (\n <p className=\"mt-0.5 text-xs text-text-quaternary\">\n {step.description}\n </p>\n )}\n </div>\n\n {isDisclosureControl && (\n <div className=\"shrink-0\">\n {expanded ? (\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 </>\n );\n\n return (\n <div\n data-slot={itemSlot}\n data-step-status={step.status}\n data-appearance={appearance}\n className={cn(\n appearanceConfig.rootClassName,\n appearanceConfig.hasDivider && !isLast && 'border-b border-border',\n )}\n >\n {isDisclosureControl ? (\n <button\n type=\"button\"\n onClick={onExpandedChange}\n aria-current={active ? 'step' : undefined}\n aria-expanded={expanded}\n aria-controls={contentId}\n aria-describedby={hasError ? errorDescriptionId : undefined}\n className={cn(\n workflowStepItemVariants({ status: step.status }),\n 'w-full cursor-pointer hover:bg-muted focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-ring',\n )}\n >\n {stepContent}\n </button>\n ) : (\n <div\n aria-current={active ? 'step' : undefined}\n aria-describedby={hasError ? errorDescriptionId : undefined}\n className={cn(\n workflowStepItemVariants({ status: step.status }),\n 'w-full',\n )}\n >\n {stepContent}\n </div>\n )}\n\n <AnimatePresence initial={false}>\n {expanded && hasExpandableDetails && (\n <motion.div\n id={contentId}\n data-slot=\"workflow-step-panel\"\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: 'auto', opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={disclosureTransition}\n className=\"overflow-hidden motion-reduce:transition-none\"\n >\n <div className=\"px-4 pb-3 ps-12\">\n {hasError && (\n <div className=\"rounded-lg border border-destructive/50 bg-destructive/10 p-3\">\n <div className=\"flex items-start gap-2\">\n <AlertCircle className=\"mt-0.5 size-4 shrink-0 text-destructive\" />\n <p className=\"text-sm text-destructive\">{error}</p>\n </div>\n </div>\n )}\n {hasContent && (\n <div className={hasError ? 'mt-3' : undefined}>\n {normalizedContent.content}\n </div>\n )}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n\n {hasError && (\n <span id={errorDescriptionId} className=\"sr-only\">\n {error}\n </span>\n )}\n\n {appearanceConfig.hasConnector && !isLast && (\n <div\n data-slot=\"workflow-step-connector\"\n aria-hidden=\"true\"\n className=\"absolute top-8 -bottom-3 start-6 w-px bg-border\"\n />\n )}\n </div>\n );\n}\n\nWorkflowStepItem.displayName = 'WorkflowStepItem';\n\nexport function WorkflowStepRenderer({\n steps,\n appearance = 'contained',\n itemSlot = 'workflow-step-item',\n expandable = true,\n activeStepId,\n expandedStepIds: controlledExpandedStepIds,\n defaultExpandedStepIds = [],\n onExpandedStepIdsChange,\n className,\n renderItems = true,\n}: PrivateWorkflowStepRendererProps) {\n const isControlled = controlledExpandedStepIds !== undefined;\n const controlledSnapshot = isControlled\n ? [...controlledExpandedStepIds]\n : undefined;\n const [uncontrolledExpandedStepIds, setUncontrolledExpandedStepIds] =\n React.useState<readonly string[]>(() =>\n normalizeExpandedWorkflowStepIds(defaultExpandedStepIds, steps),\n );\n const lastControlledExpandedStepIdsRef = React.useRef<readonly string[]>(\n controlledSnapshot ?? [],\n );\n const wasControlledRef = React.useRef(isControlled);\n const rawExpandedStepIds = isControlled\n ? controlledExpandedStepIds\n : uncontrolledExpandedStepIds;\n const visibleExpandedStepIds = normalizeExpandedWorkflowStepIds(\n rawExpandedStepIds,\n steps,\n );\n const expandedSet = new Set(visibleExpandedStepIds);\n\n React.useLayoutEffect(() => {\n if (controlledSnapshot !== undefined) {\n lastControlledExpandedStepIdsRef.current = controlledSnapshot;\n }\n }, [controlledSnapshot]);\n\n React.useLayoutEffect(() => {\n const wasControlled = wasControlledRef.current;\n wasControlledRef.current = isControlled;\n if (isControlled) return;\n\n setUncontrolledExpandedStepIds((current) => {\n const source = wasControlled\n ? lastControlledExpandedStepIdsRef.current\n : current;\n const reconciled = normalizeExpandedWorkflowStepIds(source, steps);\n return areWorkflowStepIdsEqual(reconciled, current)\n ? current\n : reconciled;\n });\n }, [isControlled, steps]);\n\n const toggleStep = (id: string) => {\n const next = new Set(visibleExpandedStepIds);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n const normalizedNext = normalizeExpandedWorkflowStepIds([...next], steps);\n if (!isControlled) {\n setUncontrolledExpandedStepIds([...normalizedNext]);\n }\n onExpandedStepIdsChange?.([...normalizedNext]);\n };\n\n if (!renderItems) return null;\n\n return (\n <ol\n data-slot=\"workflow-step-list\"\n data-appearance={appearance}\n className={cn('m-0 list-none p-0', className)}\n >\n {steps.map((step, index) => (\n <li key={step.id}>\n <WorkflowStepItem\n step={step}\n index={index}\n isLast={index === steps.length - 1}\n appearance={appearance}\n itemSlot={itemSlot}\n expandable={expandable}\n expanded={expandedSet.has(step.id)}\n active={activeStepId === step.id}\n onExpandedChange={() => toggleStep(step.id)}\n />\n </li>\n ))}\n </ol>\n );\n}\n\nWorkflowStepRenderer.displayName = 'WorkflowStepRenderer';\n"],"x_google_ignoreList":[0,1],"mappings":"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"}
1
+ {"version":3,"file":"workflow-step-renderer.js","names":["__iconNode"],"sources":["../../../../../../../../../../../Users/akarim/Documents/test/humain_foundation_ui/node_modules/.bun/lucide-react@1.25.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/loader.mjs","../../../../../../../../../../../Users/akarim/Documents/test/humain_foundation_ui/node_modules/.bun/lucide-react@1.25.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/pause.mjs","../../src/components/organisms/ai/_shared/workflow-step-renderer.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.25.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 2v4\", key: \"3427ic\" }],\n [\"path\", { d: \"m16.2 7.8 2.9-2.9\", key: \"r700ao\" }],\n [\"path\", { d: \"M18 12h4\", key: \"wj9ykh\" }],\n [\"path\", { d: \"m16.2 16.2 2.9 2.9\", key: \"1bxg5t\" }],\n [\"path\", { d: \"M12 18v4\", key: \"jadmvz\" }],\n [\"path\", { d: \"m4.9 19.1 2.9-2.9\", key: \"bwix9q\" }],\n [\"path\", { d: \"M2 12h4\", key: \"j09sii\" }],\n [\"path\", { d: \"m4.9 4.9 2.9 2.9\", key: \"giyufr\" }]\n];\nconst Loader = createLucideIcon(\"loader\", __iconNode);\n\nexport { __iconNode, Loader as default };\n//# sourceMappingURL=loader.mjs.map\n","/**\n * @license lucide-react v1.25.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 [\"rect\", { x: \"14\", y: \"3\", width: \"5\", height: \"18\", rx: \"1\", key: \"kaeet6\" }],\n [\"rect\", { x: \"5\", y: \"3\", width: \"5\", height: \"18\", rx: \"1\", key: \"1wsw3u\" }]\n];\nconst Pause = createLucideIcon(\"pause\", __iconNode);\n\nexport { __iconNode, Pause as default };\n//# sourceMappingURL=pause.mjs.map\n","import { cva } from 'class-variance-authority';\nimport {\n AlertCircle,\n Check,\n ChevronDown,\n ChevronRight,\n Loader,\n Pause,\n} from 'lucide-react';\nimport { AnimatePresence, motion, useReducedMotion } from 'motion/react';\nimport * as React from 'react';\nimport { assertNever, cn } from '@/lib/utils';\n\nexport type WorkflowStepStatus =\n | 'pending'\n | 'running'\n | 'suspended'\n | 'completed'\n | 'error';\n\nexport type WorkflowStepAppearance = 'contained' | 'embedded' | 'timeline';\n\nexport interface WorkflowStepViewModel {\n id: string;\n title: string;\n description?: string;\n status: WorkflowStepStatus;\n content?: React.ReactNode;\n durationMs?: number;\n error?: string;\n}\n\nexport interface WorkflowStepRendererProps {\n steps: readonly WorkflowStepViewModel[];\n appearance?: WorkflowStepAppearance;\n itemSlot?: string;\n expandable?: boolean;\n activeStepId?: string;\n expandedStepIds?: readonly string[];\n defaultExpandedStepIds?: readonly string[];\n onExpandedStepIdsChange?: (ids: readonly string[]) => void;\n className?: string;\n}\n\ninterface PrivateWorkflowStepRendererProps extends WorkflowStepRendererProps {\n renderItems?: boolean;\n}\n\nconst workflowStepItemStatusClasses = {\n pending: 'text-muted-foreground',\n running: 'text-primary',\n suspended: 'text-warning',\n completed: 'text-success',\n error: 'text-destructive',\n} as const satisfies Record<WorkflowStepStatus, string>;\n\nconst workflowStepIconStatusClasses = {\n pending: 'bg-accent text-muted-foreground',\n running: 'bg-primary/20 text-primary',\n suspended: 'bg-warning/20 text-warning',\n completed: 'bg-success/20 text-success',\n error: 'bg-destructive/20 text-destructive',\n} as const satisfies Record<WorkflowStepStatus, string>;\n\nexport const workflowStepItemVariants = cva(\n 'flex items-start gap-3 px-4 py-3 transition-colors motion-reduce:transition-none',\n {\n variants: {\n status: workflowStepItemStatusClasses,\n },\n defaultVariants: {\n status: 'pending',\n },\n },\n);\n\nexport const workflowStepIconVariants = cva(\n 'size-5 shrink-0 flex items-center justify-center rounded-full',\n {\n variants: {\n status: workflowStepIconStatusClasses,\n },\n defaultVariants: {\n status: 'pending',\n },\n },\n);\n\nconst workflowStepAppearanceConfig = {\n contained: {\n rootClassName: 'relative',\n hasDivider: true,\n hasConnector: false,\n },\n embedded: {\n rootClassName: 'relative',\n hasDivider: true,\n hasConnector: false,\n },\n timeline: {\n rootClassName: 'relative',\n hasDivider: false,\n hasConnector: true,\n },\n} as const satisfies Record<\n WorkflowStepAppearance,\n { rootClassName: string; hasDivider: boolean; hasConnector: boolean }\n>;\n\nexport function normalizeExpandedWorkflowStepIds(\n ids: readonly string[],\n steps: readonly WorkflowStepViewModel[],\n): string[] {\n const requested = new Set(ids);\n return steps.flatMap((step) => (requested.has(step.id) ? [step.id] : []));\n}\n\nfunction areWorkflowStepIdsEqual(\n left: readonly string[],\n right: readonly string[],\n): boolean {\n return (\n left.length === right.length &&\n left.every((id, index) => id === right[index])\n );\n}\n\nfunction formatWorkflowStepDuration(durationMs: number): string {\n if (durationMs < 1000) return `${durationMs}ms`;\n if (durationMs < 60_000) return `${(durationMs / 1000).toFixed(1)}s`;\n\n const totalSeconds = Math.floor(durationMs / 1000);\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n\n return [\n hours > 0 ? `${hours}h` : null,\n minutes > 0 ? `${minutes}m` : null,\n seconds > 0 ? `${seconds}s` : null,\n ]\n .filter((part): part is string => part !== null)\n .join(' ');\n}\n\nfunction isIterableWorkflowStepContent(\n content: React.ReactNode,\n): content is Iterable<React.ReactNode> {\n return (\n typeof content === 'object' &&\n content !== null &&\n Symbol.iterator in content &&\n typeof (content as Iterable<React.ReactNode>)[Symbol.iterator] ===\n 'function'\n );\n}\n\nfunction isIteratorWorkflowStepContent(\n content: unknown,\n): content is Iterator<React.ReactNode> {\n return (\n typeof (content as Partial<Iterator<React.ReactNode>>).next === 'function'\n );\n}\n\ninterface NormalizedWorkflowStepContent {\n content: React.ReactNode;\n hasRenderableContent: boolean;\n changed: boolean;\n}\n\nconst normalizedOneShotWorkflowStepContent = new WeakMap<\n object,\n NormalizedWorkflowStepContent\n>();\n\nfunction normalizeIterableWorkflowStepContent(\n content: Iterable<React.ReactNode>,\n iterator: Iterator<React.ReactNode>,\n): NormalizedWorkflowStepContent {\n const normalizedChildren: React.ReactNode[] = [];\n let hasRenderableContent = false;\n let changed = !Array.isArray(content);\n\n for (let result = iterator.next(); !result.done; result = iterator.next()) {\n const normalizedChild = normalizeWorkflowStepContent(result.value);\n normalizedChildren.push(normalizedChild.content);\n hasRenderableContent ||= normalizedChild.hasRenderableContent;\n changed ||= normalizedChild.changed;\n }\n\n return {\n content: changed ? normalizedChildren : content,\n hasRenderableContent,\n changed,\n };\n}\n\nfunction normalizeWorkflowStepContent(\n content: React.ReactNode,\n): NormalizedWorkflowStepContent {\n if (\n content === null ||\n content === undefined ||\n typeof content === 'boolean' ||\n content === ''\n ) {\n return { content, hasRenderableContent: false, changed: false };\n }\n\n if (\n typeof content === 'string' ||\n typeof content === 'number' ||\n typeof content === 'bigint'\n ) {\n return { content, hasRenderableContent: true, changed: false };\n }\n\n if (React.isValidElement<{ children?: React.ReactNode }>(content)) {\n if (content.type !== React.Fragment) {\n return { content, hasRenderableContent: true, changed: false };\n }\n\n const normalizedChildren = normalizeWorkflowStepContent(\n content.props.children,\n );\n return {\n content: normalizedChildren.changed\n ? React.cloneElement(content, undefined, normalizedChildren.content)\n : content,\n hasRenderableContent: normalizedChildren.hasRenderableContent,\n changed: normalizedChildren.changed,\n };\n }\n\n if (isIterableWorkflowStepContent(content)) {\n const iterator = content[Symbol.iterator]();\n const oneShotCacheKey = isIteratorWorkflowStepContent(iterator)\n ? (iterator as object)\n : null;\n\n if (oneShotCacheKey !== null) {\n const cached = normalizedOneShotWorkflowStepContent.get(oneShotCacheKey);\n if (cached !== undefined) return cached;\n }\n\n const normalized = normalizeIterableWorkflowStepContent(content, iterator);\n if (oneShotCacheKey !== null) {\n normalizedOneShotWorkflowStepContent.set(oneShotCacheKey, normalized);\n }\n return normalized;\n }\n\n return { content, hasRenderableContent: true, changed: false };\n}\n\nfunction getNonBlankWorkflowStepError(\n error: string | undefined,\n): string | undefined {\n return error?.trim() ? error : undefined;\n}\n\nfunction getWorkflowStepStatusLabel(status: WorkflowStepStatus): string {\n switch (status) {\n case 'pending':\n return 'Pending';\n case 'running':\n return 'Running';\n case 'suspended':\n return 'Paused';\n case 'completed':\n return 'Completed';\n case 'error':\n return 'Error';\n default:\n return assertNever(status);\n }\n}\n\nexport interface WorkflowStepStatusIconProps {\n status: WorkflowStepStatus;\n index: number;\n className?: string;\n}\n\nexport function WorkflowStepStatusIcon({\n status,\n index,\n className,\n}: WorkflowStepStatusIconProps) {\n const iconClass = cn(workflowStepIconVariants({ status }), className);\n\n switch (status) {\n case 'pending':\n return (\n <div data-slot=\"workflow-step-icon\" className={iconClass}>\n <span className=\"text-xs font-medium\">{index + 1}</span>\n </div>\n );\n case 'running':\n return (\n <div\n data-slot=\"workflow-step-icon\"\n className={cn(\n iconClass,\n 'delight-status-pulse motion-reduce:!animate-none',\n )}\n >\n <Loader className=\"size-3 animate-spin motion-reduce:animate-none\" />\n </div>\n );\n case 'suspended':\n return (\n <div data-slot=\"workflow-step-icon\" className={iconClass}>\n <Pause className=\"size-3\" />\n </div>\n );\n case 'completed':\n return (\n <div\n data-slot=\"workflow-step-icon\"\n className={cn(\n iconClass,\n 'delight-check-bounce motion-reduce:!animate-none',\n )}\n >\n <Check className=\"size-3\" />\n </div>\n );\n case 'error':\n return (\n <div\n data-slot=\"workflow-step-icon\"\n className={cn(iconClass, 'delight-shake motion-reduce:!animate-none')}\n >\n <AlertCircle className=\"size-3\" />\n </div>\n );\n default:\n return assertNever(status);\n }\n}\n\nWorkflowStepStatusIcon.displayName = 'WorkflowStepStatusIcon';\n\nexport interface WorkflowStepItemProps {\n step: WorkflowStepViewModel;\n index: number;\n isLast: boolean;\n appearance?: WorkflowStepAppearance;\n itemSlot?: string;\n expandable?: boolean;\n expanded: boolean;\n active?: boolean;\n onExpandedChange: () => void;\n}\n\nexport function WorkflowStepItem({\n step,\n index,\n isLast,\n appearance = 'contained',\n itemSlot = 'workflow-step-item',\n expandable = true,\n expanded,\n active = false,\n onExpandedChange,\n}: WorkflowStepItemProps) {\n const contentId = React.useId();\n const errorDescriptionId = React.useId();\n const normalizedContent = normalizeWorkflowStepContent(step.content);\n const hasContent = normalizedContent.hasRenderableContent;\n const error = getNonBlankWorkflowStepError(step.error);\n const hasError = error !== undefined;\n const hasExpandableDetails = hasContent || hasError;\n const isDisclosureControl = hasExpandableDetails && expandable;\n const prefersReducedMotion = useReducedMotion();\n const appearanceConfig = workflowStepAppearanceConfig[appearance];\n const disclosureTransition = {\n duration: prefersReducedMotion ? 0 : 0.2,\n };\n const stepContent = (\n <>\n <WorkflowStepStatusIcon status={step.status} index={index} />\n\n <div className=\"min-w-0 flex-1 text-start\">\n <div className=\"flex items-center gap-2\">\n <span\n className={cn(\n 'text-sm font-medium',\n step.status === 'pending'\n ? 'text-text-quaternary'\n : 'text-foreground',\n )}\n >\n {step.title}\n </span>\n <span className=\"text-xs text-secondary-foreground\">\n {getWorkflowStepStatusLabel(step.status)}\n </span>\n {step.durationMs !== undefined && (\n <span className=\"text-xs text-muted-foreground\">\n {formatWorkflowStepDuration(step.durationMs)}\n </span>\n )}\n </div>\n {step.description && (\n <p className=\"mt-0.5 text-xs text-text-quaternary\">\n {step.description}\n </p>\n )}\n </div>\n\n {isDisclosureControl && (\n <div className=\"shrink-0\">\n {expanded ? (\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 </>\n );\n\n return (\n <div\n data-slot={itemSlot}\n data-step-status={step.status}\n data-appearance={appearance}\n className={cn(\n appearanceConfig.rootClassName,\n appearanceConfig.hasDivider && !isLast && 'border-b border-border',\n )}\n >\n {isDisclosureControl ? (\n <button\n type=\"button\"\n onClick={onExpandedChange}\n aria-current={active ? 'step' : undefined}\n aria-expanded={expanded}\n aria-controls={contentId}\n aria-describedby={hasError ? errorDescriptionId : undefined}\n className={cn(\n workflowStepItemVariants({ status: step.status }),\n 'w-full cursor-pointer hover:bg-muted focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-ring',\n )}\n >\n {stepContent}\n </button>\n ) : (\n <div\n aria-current={active ? 'step' : undefined}\n aria-describedby={hasError ? errorDescriptionId : undefined}\n className={cn(\n workflowStepItemVariants({ status: step.status }),\n 'w-full',\n )}\n >\n {stepContent}\n </div>\n )}\n\n <AnimatePresence initial={false}>\n {expanded && hasExpandableDetails && (\n <motion.div\n id={contentId}\n data-slot=\"workflow-step-panel\"\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: 'auto', opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={disclosureTransition}\n className=\"overflow-hidden motion-reduce:transition-none\"\n >\n <div className=\"px-4 pb-3 ps-12\">\n {hasError && (\n <div className=\"rounded-lg border border-destructive/50 bg-destructive/10 p-3\">\n <div className=\"flex items-start gap-2\">\n <AlertCircle className=\"mt-0.5 size-4 shrink-0 text-destructive\" />\n <p className=\"text-sm text-destructive\">{error}</p>\n </div>\n </div>\n )}\n {hasContent && (\n <div className={hasError ? 'mt-3' : undefined}>\n {normalizedContent.content}\n </div>\n )}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n\n {hasError && (\n <span id={errorDescriptionId} className=\"sr-only\">\n {error}\n </span>\n )}\n\n {appearanceConfig.hasConnector && !isLast && (\n <div\n data-slot=\"workflow-step-connector\"\n aria-hidden=\"true\"\n className=\"absolute top-8 -bottom-3 start-6 w-px bg-border\"\n />\n )}\n </div>\n );\n}\n\nWorkflowStepItem.displayName = 'WorkflowStepItem';\n\nexport function WorkflowStepRenderer({\n steps,\n appearance = 'contained',\n itemSlot = 'workflow-step-item',\n expandable = true,\n activeStepId,\n expandedStepIds: controlledExpandedStepIds,\n defaultExpandedStepIds = [],\n onExpandedStepIdsChange,\n className,\n renderItems = true,\n}: PrivateWorkflowStepRendererProps) {\n const isControlled = controlledExpandedStepIds !== undefined;\n const controlledSnapshot = isControlled\n ? [...controlledExpandedStepIds]\n : undefined;\n const [uncontrolledExpandedStepIds, setUncontrolledExpandedStepIds] =\n React.useState<readonly string[]>(() =>\n normalizeExpandedWorkflowStepIds(defaultExpandedStepIds, steps),\n );\n const lastControlledExpandedStepIdsRef = React.useRef<readonly string[]>(\n controlledSnapshot ?? [],\n );\n const wasControlledRef = React.useRef(isControlled);\n const rawExpandedStepIds = isControlled\n ? controlledExpandedStepIds\n : uncontrolledExpandedStepIds;\n const visibleExpandedStepIds = normalizeExpandedWorkflowStepIds(\n rawExpandedStepIds,\n steps,\n );\n const expandedSet = new Set(visibleExpandedStepIds);\n\n React.useLayoutEffect(() => {\n if (controlledSnapshot !== undefined) {\n lastControlledExpandedStepIdsRef.current = controlledSnapshot;\n }\n }, [controlledSnapshot]);\n\n React.useLayoutEffect(() => {\n const wasControlled = wasControlledRef.current;\n wasControlledRef.current = isControlled;\n if (isControlled) return;\n\n setUncontrolledExpandedStepIds((current) => {\n const source = wasControlled\n ? lastControlledExpandedStepIdsRef.current\n : current;\n const reconciled = normalizeExpandedWorkflowStepIds(source, steps);\n return areWorkflowStepIdsEqual(reconciled, current)\n ? current\n : reconciled;\n });\n }, [isControlled, steps]);\n\n const toggleStep = (id: string) => {\n const next = new Set(visibleExpandedStepIds);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n const normalizedNext = normalizeExpandedWorkflowStepIds([...next], steps);\n if (!isControlled) {\n setUncontrolledExpandedStepIds([...normalizedNext]);\n }\n onExpandedStepIdsChange?.([...normalizedNext]);\n };\n\n if (!renderItems) return null;\n\n return (\n <ol\n data-slot=\"workflow-step-list\"\n data-appearance={appearance}\n className={cn('m-0 list-none p-0', className)}\n >\n {steps.map((step, index) => (\n <li key={step.id}>\n <WorkflowStepItem\n step={step}\n index={index}\n isLast={index === steps.length - 1}\n appearance={appearance}\n itemSlot={itemSlot}\n expandable={expandable}\n expanded={expandedSet.has(step.id)}\n active={activeStepId === step.id}\n onExpandedChange={() => toggleStep(step.id)}\n />\n </li>\n ))}\n </ol>\n );\n}\n\nWorkflowStepRenderer.displayName = 'WorkflowStepRenderer';\n"],"x_google_ignoreList":[0,1],"mappings":";;;;;;;;;;;;AASA,IAAMA,IAAa;AAAA,EACjB,CAAC,QAAQ;AAAA,IAAE,GAAG;AAAA,IAAW,KAAK;AAAA,EAAS,CAAC;AAAA,EACxC,CAAC,QAAQ;AAAA,IAAE,GAAG;AAAA,IAAqB,KAAK;AAAA,EAAS,CAAC;AAAA,EAClD,CAAC,QAAQ;AAAA,IAAE,GAAG;AAAA,IAAY,KAAK;AAAA,EAAS,CAAC;AAAA,EACzC,CAAC,QAAQ;AAAA,IAAE,GAAG;AAAA,IAAsB,KAAK;AAAA,EAAS,CAAC;AAAA,EACnD,CAAC,QAAQ;AAAA,IAAE,GAAG;AAAA,IAAY,KAAK;AAAA,EAAS,CAAC;AAAA,EACzC,CAAC,QAAQ;AAAA,IAAE,GAAG;AAAA,IAAqB,KAAK;AAAA,EAAS,CAAC;AAAA,EAClD,CAAC,QAAQ;AAAA,IAAE,GAAG;AAAA,IAAW,KAAK;AAAA,EAAS,CAAC;AAAA,EACxC,CAAC,QAAQ;AAAA,IAAE,GAAG;AAAA,IAAoB,KAAK;AAAA,EAAS,CAAC;AACnD,GACM,IAAS,EAAiB,UAAUA,CAAU,GCV9C,IAAa,CACjB,CAAC,QAAQ;AAAA,EAAE,GAAG;AAAA,EAAM,GAAG;AAAA,EAAK,OAAO;AAAA,EAAK,QAAQ;AAAA,EAAM,IAAI;AAAA,EAAK,KAAK;AAAS,CAAC,GAC9E,CAAC,QAAQ;AAAA,EAAE,GAAG;AAAA,EAAK,GAAG;AAAA,EAAK,OAAO;AAAA,EAAK,QAAQ;AAAA,EAAM,IAAI;AAAA,EAAK,KAAK;AAAS,CAAC,CAC/E,GACM,IAAQ,EAAiB,SAAS,CAAU,2CCmC5C,IAAgC;AAAA,EACpC,SAAS;AAAA,EACT,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EACX,OAAO;AACT,GAEM,IAAgC;AAAA,EACpC,SAAS;AAAA,EACT,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EACX,OAAO;AACT,GAEa,IAA2B,EACtC,oFACA;AAAA,EACE,UAAU,EACR,QAAQ,EACV;AAAA,EACA,iBAAiB,EACf,QAAQ,UACV;AACF,CACF,GAEa,IAA2B,EACtC,iEACA;AAAA,EACE,UAAU,EACR,QAAQ,EACV;AAAA,EACA,iBAAiB,EACf,QAAQ,UACV;AACF,CACF,GAEM,IAA+B;AAAA,EACnC,WAAW;AAAA,IACT,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB;AAAA,EACA,UAAU;AAAA,IACR,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB;AAAA,EACA,UAAU;AAAA,IACR,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB;AACF;AAKA,SAAgB,EACd,GACA,GACU;AACV,QAAM,IAAY,IAAI,IAAI,CAAG;AAC7B,SAAO,EAAM,QAAA,CAAS,MAAU,EAAU,IAAI,EAAK,EAAE,IAAI,CAAC,EAAK,EAAE,IAAI,CAAC,CAAE;AAC1E;AAEA,SAAS,EACP,GACA,GACS;AACT,SACE,EAAK,WAAW,EAAM,UACtB,EAAK,MAAA,CAAO,GAAI,MAAU,MAAO,EAAM,CAAA,CAAM;AAEjD;AAEA,SAAS,EAA2B,GAA4B;AAC9D,MAAI,IAAa,IAAM,QAAO,GAAG,CAAA;AACjC,MAAI,IAAa,IAAQ,QAAO,IAAI,IAAa,KAAM,QAAQ,CAAC,CAAA;AAEhE,QAAM,IAAe,KAAK,MAAM,IAAa,GAAI,GAC3C,IAAQ,KAAK,MAAM,IAAe,IAAI,GACtC,IAAU,KAAK,MAAO,IAAe,OAAQ,EAAE,GAC/C,IAAU,IAAe;AAE/B,SAAO;AAAA,IACL,IAAQ,IAAI,GAAG,CAAA,MAAW;AAAA,IAC1B,IAAU,IAAI,GAAG,CAAA,MAAa;AAAA,IAC9B,IAAU,IAAI,GAAG,CAAA,MAAa;AAAA,EAChC,EACG,OAAA,CAAQ,MAAyB,MAAS,IAAI,EAC9C,KAAK,GAAG;AACb;AAEA,SAAS,GACP,GACsC;AACtC,SACE,OAAO,KAAY,YACnB,MAAY,QACZ,OAAO,YAAY,KACnB,OAAQ,EAAsC,OAAO,QAAA,KACnD;AAEN;AAEA,SAAS,GACP,GACsC;AACtC,SACE,OAAQ,EAA+C,QAAS;AAEpE;AAQA,IAAM,IAAuC,oBAAI,QAG/C;AAEF,SAAS,GACP,GACA,GAC+B;AAC/B,QAAM,IAAwC,CAAC;AAC/C,MAAI,IAAuB,IACvB,IAAU,CAAC,MAAM,QAAQ,CAAO;AAEpC,WAAS,IAAS,EAAS,KAAK,GAAG,CAAC,EAAO,MAAM,IAAS,EAAS,KAAK,GAAG;AACzE,UAAM,IAAkB,EAA6B,EAAO,KAAK;AACjE,IAAA,EAAmB,KAAK,EAAgB,OAAO,GAC/C,MAAyB,EAAgB,sBACzC,MAAY,EAAgB;AAAA,EAC9B;AAEA,SAAO;AAAA,IACL,SAAS,IAAU,IAAqB;AAAA,IACxC,sBAAA;AAAA,IACA,SAAA;AAAA,EACF;AACF;AAEA,SAAS,EACP,GAC+B;AAC/B,MACE,KAAY,QAEZ,OAAO,KAAY,aACnB,MAAY,GAEZ,QAAO;AAAA,IAAE,SAAA;AAAA,IAAS,sBAAsB;AAAA,IAAO,SAAS;AAAA,EAAM;AAGhE,MACE,OAAO,KAAY,YACnB,OAAO,KAAY,YACnB,OAAO,KAAY,SAEnB,QAAO;AAAA,IAAE,SAAA;AAAA,IAAS,sBAAsB;AAAA,IAAM,SAAS;AAAA,EAAM;AAG/D,MAAA,EAAU,eAA+C,CAAO,GAAG;AACjE,QAAI,EAAQ,SAAA,EAAe,SACzB,QAAO;AAAA,MAAE,SAAA;AAAA,MAAS,sBAAsB;AAAA,MAAM,SAAS;AAAA,IAAM;AAG/D,UAAM,IAAqB,EACzB,EAAQ,MAAM,QAChB;AACA,WAAO;AAAA,MACL,SAAS,EAAmB,UAAA,EAClB,aAAa,GAAS,QAAW,EAAmB,OAAO,IACjE;AAAA,MACJ,sBAAsB,EAAmB;AAAA,MACzC,SAAS,EAAmB;AAAA,IAC9B;AAAA,EACF;AAEA,MAAI,GAA8B,CAAO,GAAG;AAC1C,UAAM,IAAW,EAAQ,OAAO,QAAA,EAAU,GACpC,IAAkB,GAA8B,CAAQ,IACzD,IACD;AAEJ,QAAI,MAAoB,MAAM;AAC5B,YAAM,IAAS,EAAqC,IAAI,CAAe;AACvE,UAAI,MAAW,OAAW,QAAO;AAAA,IACnC;AAEA,UAAM,IAAa,GAAqC,GAAS,CAAQ;AACzE,WAAI,MAAoB,QACtB,EAAqC,IAAI,GAAiB,CAAU,GAE/D;AAAA,EACT;AAEA,SAAO;AAAA,IAAE,SAAA;AAAA,IAAS,sBAAsB;AAAA,IAAM,SAAS;AAAA,EAAM;AAC/D;AAEA,SAAS,GACP,GACoB;AACpB,SAAO,GAAO,KAAK,IAAI,IAAQ;AACjC;AAEA,SAAS,GAA2B,GAAoC;AACtE,UAAQ,GAAR;AAAA,IACE,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO,EAAY,CAAM;AAAA,EAC7B;AACF;AAQA,SAAgB,EAAuB,EACrC,QAAA,GACA,OAAA,GACA,WAAA,EAAA,GAC8B;AAC9B,QAAM,IAAY,EAAG,EAAyB,EAAE,QAAA,EAAO,CAAC,GAAG,CAAS;AAEpE,UAAQ,GAAR;AAAA,IACE,KAAK;AACH,aACE,oBAAA,EAAA,KAAC,OAAD;AAAA,QAAK,aAAU;AAAA,QAAqB,WAAW;AAAA,kBAC7C,oBAAA,EAAA,KAAC,QAAD;AAAA,UAAM,WAAU;AAAA,oBAAuB,IAAQ;AAAA,QAAQ,CAAA;AAAA,MACpD,CAAA;AAAA,IAET,KAAK;AACH,aACE,oBAAA,EAAA,KAAC,OAAD;AAAA,QACE,aAAU;AAAA,QACV,WAAW,EACT,GACA,kDACF;AAAA,kBAEA,oBAAA,EAAA,KAAC,GAAD,EAAQ,WAAU,iDAAkD,CAAA;AAAA,MACjE,CAAA;AAAA,IAET,KAAK;AACH,aACE,oBAAA,EAAA,KAAC,OAAD;AAAA,QAAK,aAAU;AAAA,QAAqB,WAAW;AAAA,kBAC7C,oBAAA,EAAA,KAAC,GAAD,EAAO,WAAU,SAAU,CAAA;AAAA,MACxB,CAAA;AAAA,IAET,KAAK;AACH,aACE,oBAAA,EAAA,KAAC,OAAD;AAAA,QACE,aAAU;AAAA,QACV,WAAW,EACT,GACA,kDACF;AAAA,kBAEA,oBAAA,EAAA,KAAC,GAAD,EAAO,WAAU,SAAU,CAAA;AAAA,MACxB,CAAA;AAAA,IAET,KAAK;AACH,aACE,oBAAA,EAAA,KAAC,OAAD;AAAA,QACE,aAAU;AAAA,QACV,WAAW,EAAG,GAAW,2CAA2C;AAAA,kBAEpE,oBAAA,EAAA,KAAC,GAAD,EAAa,WAAU,SAAU,CAAA;AAAA,MAC9B,CAAA;AAAA,IAET;AACE,aAAO,EAAY,CAAM;AAAA,EAC7B;AACF;AAEA,EAAuB,cAAc;AAcrC,SAAgB,EAAiB,EAC/B,MAAA,GACA,OAAA,GACA,QAAA,GACA,YAAA,IAAa,aACb,UAAA,IAAW,sBACX,YAAA,IAAa,IACb,UAAA,GACA,QAAA,IAAS,IACT,kBAAA,EAAA,GACwB;AACxB,QAAM,IAAA,EAAkB,MAAM,GACxB,IAAA,EAA2B,MAAM,GACjC,IAAoB,EAA6B,EAAK,OAAO,GAC7D,IAAa,EAAkB,sBAC/B,IAAQ,GAA6B,EAAK,KAAK,GAC/C,IAAW,MAAU,QACrB,IAAuB,KAAc,GACrC,IAAsB,KAAwB,GAC9C,IAAuB,EAAiB,GACxC,IAAmB,EAA6B,CAAA,GAChD,IAAuB,EAC3B,UAAU,IAAuB,IAAI,IACvC,GACM,IACJ,oBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,UAAA;AAAA,IACE,oBAAA,EAAA,KAAC,GAAD;AAAA,MAAwB,QAAQ,EAAK;AAAA,MAAe,OAAA;AAAA,IAAQ,CAAA;AAAA,IAE5D,oBAAA,EAAA,MAAC,OAAD;AAAA,MAAK,WAAU;AAAA,gBAAf,CACE,oBAAA,EAAA,MAAC,OAAD;AAAA,QAAK,WAAU;AAAA,kBAAf;AAAA,UACE,oBAAA,EAAA,KAAC,QAAD;AAAA,YACE,WAAW,EACT,uBACA,EAAK,WAAW,YACZ,yBACA,iBACN;AAAA,sBAEC,EAAK;AAAA,UACF,CAAA;AAAA,UACN,oBAAA,EAAA,KAAC,QAAD;AAAA,YAAM,WAAU;AAAA,sBACb,GAA2B,EAAK,MAAM;AAAA,UACnC,CAAA;AAAA,UACL,EAAK,eAAe,UACnB,oBAAA,EAAA,KAAC,QAAD;AAAA,YAAM,WAAU;AAAA,sBACb,EAA2B,EAAK,UAAU;AAAA,UACvC,CAAA;AAAA,QAEL;AAAA,UACJ,EAAK,eACJ,oBAAA,EAAA,KAAC,KAAD;AAAA,QAAG,WAAU;AAAA,kBACV,EAAK;AAAA,MACL,CAAA,CAEF;AAAA;IAEJ,KACC,oBAAA,EAAA,KAAC,OAAD;AAAA,MAAK,WAAU;AAAA,gBACZ,IACC,oBAAA,EAAA,KAAC,GAAD,EAAa,WAAU,+BAAgC,CAAA,IAEvD,oBAAA,EAAA,KAAC,GAAD,EAAc,WAAU,8CAA+C,CAAA;AAAA,IAEtE,CAAA;AAAA,EAEP,EAAA,CAAA;AAGJ,SACE,oBAAA,EAAA,MAAC,OAAD;AAAA,IACE,aAAW;AAAA,IACX,oBAAkB,EAAK;AAAA,IACvB,mBAAiB;AAAA,IACjB,WAAW,EACT,EAAiB,eACjB,EAAiB,cAAc,CAAC,KAAU,wBAC5C;AAAA,cAPF;AAAA,MASG,IACC,oBAAA,EAAA,KAAC,UAAD;AAAA,QACE,MAAK;AAAA,QACL,SAAS;AAAA,QACT,gBAAc,IAAS,SAAS;AAAA,QAChC,iBAAe;AAAA,QACf,iBAAe;AAAA,QACf,oBAAkB,IAAW,IAAqB;AAAA,QAClD,WAAW,EACT,EAAyB,EAAE,QAAQ,EAAK,OAAO,CAAC,GAChD,6HACF;AAAA,kBAEC;AAAA,MACK,CAAA,IAER,oBAAA,EAAA,KAAC,OAAD;AAAA,QACE,gBAAc,IAAS,SAAS;AAAA,QAChC,oBAAkB,IAAW,IAAqB;AAAA,QAClD,WAAW,EACT,EAAyB,EAAE,QAAQ,EAAK,OAAO,CAAC,GAChD,QACF;AAAA,kBAEC;AAAA,MACE,CAAA;AAAA,MAGP,oBAAA,EAAA,KAAC,GAAD;AAAA,QAAiB,SAAS;AAAA,kBACvB,KAAY,KACX,oBAAA,EAAA,KAAC,EAAO,KAAR;AAAA,UACE,IAAI;AAAA,UACJ,aAAU;AAAA,UACV,SAAS;AAAA,YAAE,QAAQ;AAAA,YAAG,SAAS;AAAA,UAAE;AAAA,UACjC,SAAS;AAAA,YAAE,QAAQ;AAAA,YAAQ,SAAS;AAAA,UAAE;AAAA,UACtC,MAAM;AAAA,YAAE,QAAQ;AAAA,YAAG,SAAS;AAAA,UAAE;AAAA,UAC9B,YAAY;AAAA,UACZ,WAAU;AAAA,oBAEV,oBAAA,EAAA,MAAC,OAAD;AAAA,YAAK,WAAU;AAAA,sBAAf,CACG,KACC,oBAAA,EAAA,KAAC,OAAD;AAAA,cAAK,WAAU;AAAA,wBACb,oBAAA,EAAA,MAAC,OAAD;AAAA,gBAAK,WAAU;AAAA,0BAAf,CACE,oBAAA,EAAA,KAAC,GAAD,EAAa,WAAU,0CAA2C,CAAA,GAClE,oBAAA,EAAA,KAAC,KAAD;AAAA,kBAAG,WAAU;AAAA,4BAA4B;AAAA,gBAAS,CAAA,CAC/C;AAAA;YACF,CAAA,GAEN,KACC,oBAAA,EAAA,KAAC,OAAD;AAAA,cAAK,WAAW,IAAW,SAAS;AAAA,wBACjC,EAAkB;AAAA,YAChB,CAAA,CAEJ;AAAA;QACK,CAAA;AAAA,MAEC,CAAA;AAAA,MAEhB,KACC,oBAAA,EAAA,KAAC,QAAD;AAAA,QAAM,IAAI;AAAA,QAAoB,WAAU;AAAA,kBACrC;AAAA,MACG,CAAA;AAAA,MAGP,EAAiB,gBAAgB,CAAC,KACjC,oBAAA,EAAA,KAAC,OAAD;AAAA,QACE,aAAU;AAAA,QACV,eAAY;AAAA,QACZ,WAAU;AAAA,MACX,CAAA;AAAA,IAEA;AAAA;AAET;AAEA,EAAiB,cAAc;AAE/B,SAAgB,GAAqB,EACnC,OAAA,GACA,YAAA,IAAa,aACb,UAAA,IAAW,sBACX,YAAA,IAAa,IACb,cAAA,GACA,iBAAiB,GACjB,wBAAA,IAAyB,CAAC,GAC1B,yBAAA,GACA,WAAA,GACA,aAAA,IAAc,GAAA,GACqB;AACnC,QAAM,IAAe,MAA8B,QAC7C,IAAqB,IACvB,CAAC,GAAG,CAAyB,IAC7B,QACE,CAAC,GAA6B,CAAA,IAAA,EAC5B,SAAA,MACJ,EAAiC,GAAwB,CAAK,CAChE,GACI,IAAA,EAAyC,OAC7C,KAAsB,CAAC,CACzB,GACM,IAAA,EAAyB,OAAO,CAAY,GAI5C,IAAyB,EAHJ,IACvB,IACA,GAGF,CACF,GACM,IAAc,IAAI,IAAI,CAAsB;AAElD,EAAA,EAAM,gBAAA,MAAsB;AAC1B,IAAI,MAAuB,WACzB,EAAiC,UAAU;AAAA,EAE/C,GAAG,CAAC,CAAkB,CAAC,GAEvB,EAAM,gBAAA,MAAsB;AAC1B,UAAM,IAAgB,EAAiB;AAEvC,IADA,EAAiB,UAAU,GACvB,CAAA,KAEJ,EAAA,CAAgC,MAAY;AAI1C,YAAM,IAAa,EAHJ,IACX,EAAiC,UACjC,GACwD,CAAK;AACjE,aAAO,EAAwB,GAAY,CAAO,IAC9C,IACA;AAAA,IACN,CAAC;AAAA,EACH,GAAG,CAAC,GAAc,CAAK,CAAC;AAExB,QAAM,IAAA,CAAc,MAAe;AACjC,UAAM,IAAO,IAAI,IAAI,CAAsB;AAC3C,IAAI,EAAK,IAAI,CAAE,IAAG,EAAK,OAAO,CAAE,IAC3B,EAAK,IAAI,CAAE;AAChB,UAAM,IAAiB,EAAiC,CAAC,GAAG,CAAI,GAAG,CAAK;AACxE,IAAK,KACH,EAA+B,CAAC,GAAG,CAAc,CAAC,GAEpD,IAA0B,CAAC,GAAG,CAAc,CAAC;AAAA,EAC/C;AAEA,SAAK,IAGH,oBAAA,EAAA,KAAC,MAAD;AAAA,IACE,aAAU;AAAA,IACV,mBAAiB;AAAA,IACjB,WAAW,EAAG,qBAAqB,CAAS;AAAA,cAE3C,EAAM,IAAA,CAAK,GAAM,MAChB,oBAAA,EAAA,KAAC,MAAD,EAAA,UACE,oBAAA,EAAA,KAAC,GAAD;AAAA,MACQ,MAAA;AAAA,MACC,OAAA;AAAA,MACP,QAAQ,MAAU,EAAM,SAAS;AAAA,MACrB,YAAA;AAAA,MACF,UAAA;AAAA,MACE,YAAA;AAAA,MACZ,UAAU,EAAY,IAAI,EAAK,EAAE;AAAA,MACjC,QAAQ,MAAiB,EAAK;AAAA,MAC9B,kBAAA,MAAwB,EAAW,EAAK,EAAE;AAAA,IAC3C,CAAA,EACC,GAZK,EAAK,EAYV,CACL;AAAA,EACC,CAAA,IAvBmB;AAyB3B;AAEA,GAAqB,cAAc"}
@@ -1,14 +1,14 @@
1
1
  import { d as E, f } from "./_shared.js";
2
2
  import { t as D } from "./createLucideIcon.js";
3
- import { t as L } from "./check.js";
4
- import { t as V } from "./chevron-down.js";
5
- import { t as $ } from "./chevron-right.js";
3
+ import { t as A } from "./check.js";
4
+ import { t as L } from "./chevron-down.js";
5
+ import { t as V } from "./chevron-right.js";
6
6
  import { t as M } from "./circle-alert.js";
7
7
  import { t as F } from "./react.js";
8
8
  import { t as P } from "./AnimatePresence.js";
9
9
  import { t as _ } from "./use-reduced-motion.js";
10
10
  import { t as j } from "./dist.js";
11
- import * as l from "react";
11
+ import * as c from "react";
12
12
  import { Fragment as B, jsx as t, jsxs as g } from "react/jsx-runtime";
13
13
  var K = [
14
14
  ["path", {
@@ -100,7 +100,14 @@ function X(e, r) {
100
100
  return e.length === r.length && e.every((a, n) => a === r[n]);
101
101
  }
102
102
  function Y(e) {
103
- return e < 1e3 ? `${e}ms` : `${(e / 1e3).toFixed(1)}s`;
103
+ if (e < 1e3) return `${e}ms`;
104
+ if (e < 6e4) return `${(e / 1e3).toFixed(1)}s`;
105
+ const r = Math.floor(e / 1e3), a = Math.floor(r / 3600), n = Math.floor(r % 3600 / 60), s = r % 60;
106
+ return [
107
+ a > 0 ? `${a}h` : null,
108
+ n > 0 ? `${n}m` : null,
109
+ s > 0 ? `${s}s` : null
110
+ ].filter((l) => l !== null).join(" ");
104
111
  }
105
112
  function Z(e) {
106
113
  return typeof e == "object" && e !== null && Symbol.iterator in e && typeof e[Symbol.iterator] == "function";
@@ -111,15 +118,15 @@ function ee(e) {
111
118
  var W = /* @__PURE__ */ new WeakMap();
112
119
  function te(e, r) {
113
120
  const a = [];
114
- let n = !1, d = !Array.isArray(e);
115
- for (let c = r.next(); !c.done; c = r.next()) {
116
- const u = R(c.value);
117
- a.push(u.content), n ||= u.hasRenderableContent, d ||= u.changed;
121
+ let n = !1, s = !Array.isArray(e);
122
+ for (let l = r.next(); !l.done; l = r.next()) {
123
+ const u = R(l.value);
124
+ a.push(u.content), n ||= u.hasRenderableContent, s ||= u.changed;
118
125
  }
119
126
  return {
120
- content: d ? a : e,
127
+ content: s ? a : e,
121
128
  hasRenderableContent: n,
122
- changed: d
129
+ changed: s
123
130
  };
124
131
  }
125
132
  function R(e) {
@@ -133,15 +140,15 @@ function R(e) {
133
140
  hasRenderableContent: !0,
134
141
  changed: !1
135
142
  };
136
- if (l.isValidElement(e)) {
137
- if (e.type !== l.Fragment) return {
143
+ if (c.isValidElement(e)) {
144
+ if (e.type !== c.Fragment) return {
138
145
  content: e,
139
146
  hasRenderableContent: !0,
140
147
  changed: !1
141
148
  };
142
149
  const r = R(e.props.children);
143
150
  return {
144
- content: r.changed ? l.cloneElement(e, void 0, r.content) : e,
151
+ content: r.changed ? c.cloneElement(e, void 0, r.content) : e,
145
152
  hasRenderableContent: r.hasRenderableContent,
146
153
  changed: r.changed
147
154
  };
@@ -149,8 +156,8 @@ function R(e) {
149
156
  if (Z(e)) {
150
157
  const r = e[Symbol.iterator](), a = ee(r) ? r : null;
151
158
  if (a !== null) {
152
- const d = W.get(a);
153
- if (d !== void 0) return d;
159
+ const s = W.get(a);
160
+ if (s !== void 0) return s;
154
161
  }
155
162
  const n = te(e, r);
156
163
  return a !== null && W.set(a, n), n;
@@ -180,7 +187,7 @@ function ne(e) {
180
187
  return E(e);
181
188
  }
182
189
  }
183
- function q({ status: e, index: r, className: a }) {
190
+ function $({ status: e, index: r, className: a }) {
184
191
  const n = f(J({ status: e }), a);
185
192
  switch (e) {
186
193
  case "pending":
@@ -208,7 +215,7 @@ function q({ status: e, index: r, className: a }) {
208
215
  return /* @__PURE__ */ t("div", {
209
216
  "data-slot": "workflow-step-icon",
210
217
  className: f(n, "delight-check-bounce motion-reduce:!animate-none"),
211
- children: /* @__PURE__ */ t(L, { className: "size-3" })
218
+ children: /* @__PURE__ */ t(A, { className: "size-3" })
212
219
  });
213
220
  case "error":
214
221
  return /* @__PURE__ */ t("div", {
@@ -220,10 +227,10 @@ function q({ status: e, index: r, className: a }) {
220
227
  return E(e);
221
228
  }
222
229
  }
223
- q.displayName = "WorkflowStepStatusIcon";
224
- function A({ step: e, index: r, isLast: a, appearance: n = "contained", itemSlot: d = "workflow-step-item", expandable: c = !0, expanded: u, active: k = !1, onExpandedChange: S }) {
225
- const y = l.useId(), i = l.useId(), p = R(e.content), C = p.hasRenderableContent, h = re(e.error), m = h !== void 0, v = C || m, w = v && c, I = _(), x = Q[n], s = { duration: I ? 0 : 0.2 }, o = /* @__PURE__ */ g(B, { children: [
226
- /* @__PURE__ */ t(q, {
230
+ $.displayName = "WorkflowStepStatusIcon";
231
+ function q({ step: e, index: r, isLast: a, appearance: n = "contained", itemSlot: s = "workflow-step-item", expandable: l = !0, expanded: u, active: k = !1, onExpandedChange: S }) {
232
+ const y = c.useId(), d = c.useId(), p = R(e.content), C = p.hasRenderableContent, h = re(e.error), m = h !== void 0, v = C || m, w = v && l, I = _(), x = Q[n], i = { duration: I ? 0 : 0.2 }, o = /* @__PURE__ */ g(B, { children: [
233
+ /* @__PURE__ */ t($, {
227
234
  status: e.status,
228
235
  index: r
229
236
  }),
@@ -252,11 +259,11 @@ function A({ step: e, index: r, isLast: a, appearance: n = "contained", itemSlot
252
259
  }),
253
260
  w && /* @__PURE__ */ t("div", {
254
261
  className: "shrink-0",
255
- children: u ? /* @__PURE__ */ t(V, { className: "size-4 text-muted-foreground" }) : /* @__PURE__ */ t($, { className: "size-4 text-muted-foreground rtl:rotate-180" })
262
+ children: u ? /* @__PURE__ */ t(L, { className: "size-4 text-muted-foreground" }) : /* @__PURE__ */ t(V, { className: "size-4 text-muted-foreground rtl:rotate-180" })
256
263
  })
257
264
  ] });
258
265
  return /* @__PURE__ */ g("div", {
259
- "data-slot": d,
266
+ "data-slot": s,
260
267
  "data-step-status": e.status,
261
268
  "data-appearance": n,
262
269
  className: f(x.rootClassName, x.hasDivider && !a && "border-b border-border"),
@@ -267,12 +274,12 @@ function A({ step: e, index: r, isLast: a, appearance: n = "contained", itemSlot
267
274
  "aria-current": k ? "step" : void 0,
268
275
  "aria-expanded": u,
269
276
  "aria-controls": y,
270
- "aria-describedby": m ? i : void 0,
277
+ "aria-describedby": m ? d : void 0,
271
278
  className: f(z({ status: e.status }), "w-full cursor-pointer hover:bg-muted focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-ring"),
272
279
  children: o
273
280
  }) : /* @__PURE__ */ t("div", {
274
281
  "aria-current": k ? "step" : void 0,
275
- "aria-describedby": m ? i : void 0,
282
+ "aria-describedby": m ? d : void 0,
276
283
  className: f(z({ status: e.status }), "w-full"),
277
284
  children: o
278
285
  }),
@@ -293,7 +300,7 @@ function A({ step: e, index: r, isLast: a, appearance: n = "contained", itemSlot
293
300
  height: 0,
294
301
  opacity: 0
295
302
  },
296
- transition: s,
303
+ transition: i,
297
304
  className: "overflow-hidden motion-reduce:transition-none",
298
305
  children: /* @__PURE__ */ g("div", {
299
306
  className: "px-4 pb-3 ps-12",
@@ -314,7 +321,7 @@ function A({ step: e, index: r, isLast: a, appearance: n = "contained", itemSlot
314
321
  })
315
322
  }),
316
323
  m && /* @__PURE__ */ t("span", {
317
- id: i,
324
+ id: d,
318
325
  className: "sr-only",
319
326
  children: h
320
327
  }),
@@ -326,46 +333,46 @@ function A({ step: e, index: r, isLast: a, appearance: n = "contained", itemSlot
326
333
  ]
327
334
  });
328
335
  }
329
- A.displayName = "WorkflowStepItem";
330
- function ae({ steps: e, appearance: r = "contained", itemSlot: a = "workflow-step-item", expandable: n = !0, activeStepId: d, expandedStepIds: c, defaultExpandedStepIds: u = [], onExpandedStepIdsChange: k, className: S, renderItems: y = !0 }) {
331
- const i = c !== void 0, p = i ? [...c] : void 0, [C, h] = l.useState(() => N(u, e)), m = l.useRef(p ?? []), v = l.useRef(i), w = N(i ? c : C, e), I = new Set(w);
332
- l.useLayoutEffect(() => {
336
+ q.displayName = "WorkflowStepItem";
337
+ function ae({ steps: e, appearance: r = "contained", itemSlot: a = "workflow-step-item", expandable: n = !0, activeStepId: s, expandedStepIds: l, defaultExpandedStepIds: u = [], onExpandedStepIdsChange: k, className: S, renderItems: y = !0 }) {
338
+ const d = l !== void 0, p = d ? [...l] : void 0, [C, h] = c.useState(() => N(u, e)), m = c.useRef(p ?? []), v = c.useRef(d), w = N(d ? l : C, e), I = new Set(w);
339
+ c.useLayoutEffect(() => {
333
340
  p !== void 0 && (m.current = p);
334
- }, [p]), l.useLayoutEffect(() => {
335
- const s = v.current;
336
- v.current = i, !i && h((o) => {
337
- const b = N(s ? m.current : o, e);
341
+ }, [p]), c.useLayoutEffect(() => {
342
+ const i = v.current;
343
+ v.current = d, !d && h((o) => {
344
+ const b = N(i ? m.current : o, e);
338
345
  return X(b, o) ? o : b;
339
346
  });
340
- }, [i, e]);
341
- const x = (s) => {
347
+ }, [d, e]);
348
+ const x = (i) => {
342
349
  const o = new Set(w);
343
- o.has(s) ? o.delete(s) : o.add(s);
350
+ o.has(i) ? o.delete(i) : o.add(i);
344
351
  const b = N([...o], e);
345
- i || h([...b]), k?.([...b]);
352
+ d || h([...b]), k?.([...b]);
346
353
  };
347
354
  return y ? /* @__PURE__ */ t("ol", {
348
355
  "data-slot": "workflow-step-list",
349
356
  "data-appearance": r,
350
357
  className: f("m-0 list-none p-0", S),
351
- children: e.map((s, o) => /* @__PURE__ */ t("li", { children: /* @__PURE__ */ t(A, {
352
- step: s,
358
+ children: e.map((i, o) => /* @__PURE__ */ t("li", { children: /* @__PURE__ */ t(q, {
359
+ step: i,
353
360
  index: o,
354
361
  isLast: o === e.length - 1,
355
362
  appearance: r,
356
363
  itemSlot: a,
357
364
  expandable: n,
358
- expanded: I.has(s.id),
359
- active: d === s.id,
360
- onExpandedChange: () => x(s.id)
361
- }) }, s.id))
365
+ expanded: I.has(i.id),
366
+ active: s === i.id,
367
+ onExpandedChange: () => x(i.id)
368
+ }) }, i.id))
362
369
  }) : null;
363
370
  }
364
371
  ae.displayName = "WorkflowStepRenderer";
365
372
  export {
366
373
  ae as n,
367
- q as r,
368
- A as t
374
+ $ as r,
375
+ q as t
369
376
  };
370
377
 
371
378
  //# sourceMappingURL=workflow-step-renderer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-step-renderer.js","names":["__iconNode"],"sources":["../../../../../../../../../../../Users/akarim/Documents/test/humain_foundation_ui/node_modules/.bun/lucide-react@1.25.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/loader.mjs","../../../../../../../../../../../Users/akarim/Documents/test/humain_foundation_ui/node_modules/.bun/lucide-react@1.25.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/pause.mjs","../../src/components/organisms/ai/_shared/workflow-step-renderer.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.25.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 2v4\", key: \"3427ic\" }],\n [\"path\", { d: \"m16.2 7.8 2.9-2.9\", key: \"r700ao\" }],\n [\"path\", { d: \"M18 12h4\", key: \"wj9ykh\" }],\n [\"path\", { d: \"m16.2 16.2 2.9 2.9\", key: \"1bxg5t\" }],\n [\"path\", { d: \"M12 18v4\", key: \"jadmvz\" }],\n [\"path\", { d: \"m4.9 19.1 2.9-2.9\", key: \"bwix9q\" }],\n [\"path\", { d: \"M2 12h4\", key: \"j09sii\" }],\n [\"path\", { d: \"m4.9 4.9 2.9 2.9\", key: \"giyufr\" }]\n];\nconst Loader = createLucideIcon(\"loader\", __iconNode);\n\nexport { __iconNode, Loader as default };\n//# sourceMappingURL=loader.mjs.map\n","/**\n * @license lucide-react v1.25.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 [\"rect\", { x: \"14\", y: \"3\", width: \"5\", height: \"18\", rx: \"1\", key: \"kaeet6\" }],\n [\"rect\", { x: \"5\", y: \"3\", width: \"5\", height: \"18\", rx: \"1\", key: \"1wsw3u\" }]\n];\nconst Pause = createLucideIcon(\"pause\", __iconNode);\n\nexport { __iconNode, Pause as default };\n//# sourceMappingURL=pause.mjs.map\n","import { cva } from 'class-variance-authority';\nimport {\n AlertCircle,\n Check,\n ChevronDown,\n ChevronRight,\n Loader,\n Pause,\n} from 'lucide-react';\nimport { AnimatePresence, motion, useReducedMotion } from 'motion/react';\nimport * as React from 'react';\nimport { assertNever, cn } from '@/lib/utils';\n\nexport type WorkflowStepStatus =\n | 'pending'\n | 'running'\n | 'suspended'\n | 'completed'\n | 'error';\n\nexport type WorkflowStepAppearance = 'contained' | 'embedded' | 'timeline';\n\nexport interface WorkflowStepViewModel {\n id: string;\n title: string;\n description?: string;\n status: WorkflowStepStatus;\n content?: React.ReactNode;\n durationMs?: number;\n error?: string;\n}\n\nexport interface WorkflowStepRendererProps {\n steps: readonly WorkflowStepViewModel[];\n appearance?: WorkflowStepAppearance;\n itemSlot?: string;\n expandable?: boolean;\n activeStepId?: string;\n expandedStepIds?: readonly string[];\n defaultExpandedStepIds?: readonly string[];\n onExpandedStepIdsChange?: (ids: readonly string[]) => void;\n className?: string;\n}\n\ninterface PrivateWorkflowStepRendererProps extends WorkflowStepRendererProps {\n renderItems?: boolean;\n}\n\nconst workflowStepItemStatusClasses = {\n pending: 'text-muted-foreground',\n running: 'text-primary',\n suspended: 'text-warning',\n completed: 'text-success',\n error: 'text-destructive',\n} as const satisfies Record<WorkflowStepStatus, string>;\n\nconst workflowStepIconStatusClasses = {\n pending: 'bg-accent text-muted-foreground',\n running: 'bg-primary/20 text-primary',\n suspended: 'bg-warning/20 text-warning',\n completed: 'bg-success/20 text-success',\n error: 'bg-destructive/20 text-destructive',\n} as const satisfies Record<WorkflowStepStatus, string>;\n\nexport const workflowStepItemVariants = cva(\n 'flex items-start gap-3 px-4 py-3 transition-colors motion-reduce:transition-none',\n {\n variants: {\n status: workflowStepItemStatusClasses,\n },\n defaultVariants: {\n status: 'pending',\n },\n },\n);\n\nexport const workflowStepIconVariants = cva(\n 'size-5 shrink-0 flex items-center justify-center rounded-full',\n {\n variants: {\n status: workflowStepIconStatusClasses,\n },\n defaultVariants: {\n status: 'pending',\n },\n },\n);\n\nconst workflowStepAppearanceConfig = {\n contained: {\n rootClassName: 'relative',\n hasDivider: true,\n hasConnector: false,\n },\n embedded: {\n rootClassName: 'relative',\n hasDivider: true,\n hasConnector: false,\n },\n timeline: {\n rootClassName: 'relative',\n hasDivider: false,\n hasConnector: true,\n },\n} as const satisfies Record<\n WorkflowStepAppearance,\n { rootClassName: string; hasDivider: boolean; hasConnector: boolean }\n>;\n\nexport function normalizeExpandedWorkflowStepIds(\n ids: readonly string[],\n steps: readonly WorkflowStepViewModel[],\n): string[] {\n const requested = new Set(ids);\n return steps.flatMap((step) => (requested.has(step.id) ? [step.id] : []));\n}\n\nfunction areWorkflowStepIdsEqual(\n left: readonly string[],\n right: readonly string[],\n): boolean {\n return (\n left.length === right.length &&\n left.every((id, index) => id === right[index])\n );\n}\n\nfunction formatWorkflowStepDuration(durationMs: number): string {\n if (durationMs < 1000) return `${durationMs}ms`;\n return `${(durationMs / 1000).toFixed(1)}s`;\n}\n\nfunction isIterableWorkflowStepContent(\n content: React.ReactNode,\n): content is Iterable<React.ReactNode> {\n return (\n typeof content === 'object' &&\n content !== null &&\n Symbol.iterator in content &&\n typeof (content as Iterable<React.ReactNode>)[Symbol.iterator] ===\n 'function'\n );\n}\n\nfunction isIteratorWorkflowStepContent(\n content: unknown,\n): content is Iterator<React.ReactNode> {\n return (\n typeof (content as Partial<Iterator<React.ReactNode>>).next === 'function'\n );\n}\n\ninterface NormalizedWorkflowStepContent {\n content: React.ReactNode;\n hasRenderableContent: boolean;\n changed: boolean;\n}\n\nconst normalizedOneShotWorkflowStepContent = new WeakMap<\n object,\n NormalizedWorkflowStepContent\n>();\n\nfunction normalizeIterableWorkflowStepContent(\n content: Iterable<React.ReactNode>,\n iterator: Iterator<React.ReactNode>,\n): NormalizedWorkflowStepContent {\n const normalizedChildren: React.ReactNode[] = [];\n let hasRenderableContent = false;\n let changed = !Array.isArray(content);\n\n for (let result = iterator.next(); !result.done; result = iterator.next()) {\n const normalizedChild = normalizeWorkflowStepContent(result.value);\n normalizedChildren.push(normalizedChild.content);\n hasRenderableContent ||= normalizedChild.hasRenderableContent;\n changed ||= normalizedChild.changed;\n }\n\n return {\n content: changed ? normalizedChildren : content,\n hasRenderableContent,\n changed,\n };\n}\n\nfunction normalizeWorkflowStepContent(\n content: React.ReactNode,\n): NormalizedWorkflowStepContent {\n if (\n content === null ||\n content === undefined ||\n typeof content === 'boolean' ||\n content === ''\n ) {\n return { content, hasRenderableContent: false, changed: false };\n }\n\n if (\n typeof content === 'string' ||\n typeof content === 'number' ||\n typeof content === 'bigint'\n ) {\n return { content, hasRenderableContent: true, changed: false };\n }\n\n if (React.isValidElement<{ children?: React.ReactNode }>(content)) {\n if (content.type !== React.Fragment) {\n return { content, hasRenderableContent: true, changed: false };\n }\n\n const normalizedChildren = normalizeWorkflowStepContent(\n content.props.children,\n );\n return {\n content: normalizedChildren.changed\n ? React.cloneElement(content, undefined, normalizedChildren.content)\n : content,\n hasRenderableContent: normalizedChildren.hasRenderableContent,\n changed: normalizedChildren.changed,\n };\n }\n\n if (isIterableWorkflowStepContent(content)) {\n const iterator = content[Symbol.iterator]();\n const oneShotCacheKey = isIteratorWorkflowStepContent(iterator)\n ? (iterator as object)\n : null;\n\n if (oneShotCacheKey !== null) {\n const cached = normalizedOneShotWorkflowStepContent.get(oneShotCacheKey);\n if (cached !== undefined) return cached;\n }\n\n const normalized = normalizeIterableWorkflowStepContent(content, iterator);\n if (oneShotCacheKey !== null) {\n normalizedOneShotWorkflowStepContent.set(oneShotCacheKey, normalized);\n }\n return normalized;\n }\n\n return { content, hasRenderableContent: true, changed: false };\n}\n\nfunction getNonBlankWorkflowStepError(\n error: string | undefined,\n): string | undefined {\n return error?.trim() ? error : undefined;\n}\n\nfunction getWorkflowStepStatusLabel(status: WorkflowStepStatus): string {\n switch (status) {\n case 'pending':\n return 'Pending';\n case 'running':\n return 'Running';\n case 'suspended':\n return 'Paused';\n case 'completed':\n return 'Completed';\n case 'error':\n return 'Error';\n default:\n return assertNever(status);\n }\n}\n\nexport interface WorkflowStepStatusIconProps {\n status: WorkflowStepStatus;\n index: number;\n className?: string;\n}\n\nexport function WorkflowStepStatusIcon({\n status,\n index,\n className,\n}: WorkflowStepStatusIconProps) {\n const iconClass = cn(workflowStepIconVariants({ status }), className);\n\n switch (status) {\n case 'pending':\n return (\n <div data-slot=\"workflow-step-icon\" className={iconClass}>\n <span className=\"text-xs font-medium\">{index + 1}</span>\n </div>\n );\n case 'running':\n return (\n <div\n data-slot=\"workflow-step-icon\"\n className={cn(\n iconClass,\n 'delight-status-pulse motion-reduce:!animate-none',\n )}\n >\n <Loader className=\"size-3 animate-spin motion-reduce:animate-none\" />\n </div>\n );\n case 'suspended':\n return (\n <div data-slot=\"workflow-step-icon\" className={iconClass}>\n <Pause className=\"size-3\" />\n </div>\n );\n case 'completed':\n return (\n <div\n data-slot=\"workflow-step-icon\"\n className={cn(\n iconClass,\n 'delight-check-bounce motion-reduce:!animate-none',\n )}\n >\n <Check className=\"size-3\" />\n </div>\n );\n case 'error':\n return (\n <div\n data-slot=\"workflow-step-icon\"\n className={cn(iconClass, 'delight-shake motion-reduce:!animate-none')}\n >\n <AlertCircle className=\"size-3\" />\n </div>\n );\n default:\n return assertNever(status);\n }\n}\n\nWorkflowStepStatusIcon.displayName = 'WorkflowStepStatusIcon';\n\nexport interface WorkflowStepItemProps {\n step: WorkflowStepViewModel;\n index: number;\n isLast: boolean;\n appearance?: WorkflowStepAppearance;\n itemSlot?: string;\n expandable?: boolean;\n expanded: boolean;\n active?: boolean;\n onExpandedChange: () => void;\n}\n\nexport function WorkflowStepItem({\n step,\n index,\n isLast,\n appearance = 'contained',\n itemSlot = 'workflow-step-item',\n expandable = true,\n expanded,\n active = false,\n onExpandedChange,\n}: WorkflowStepItemProps) {\n const contentId = React.useId();\n const errorDescriptionId = React.useId();\n const normalizedContent = normalizeWorkflowStepContent(step.content);\n const hasContent = normalizedContent.hasRenderableContent;\n const error = getNonBlankWorkflowStepError(step.error);\n const hasError = error !== undefined;\n const hasExpandableDetails = hasContent || hasError;\n const isDisclosureControl = hasExpandableDetails && expandable;\n const prefersReducedMotion = useReducedMotion();\n const appearanceConfig = workflowStepAppearanceConfig[appearance];\n const disclosureTransition = {\n duration: prefersReducedMotion ? 0 : 0.2,\n };\n const stepContent = (\n <>\n <WorkflowStepStatusIcon status={step.status} index={index} />\n\n <div className=\"min-w-0 flex-1 text-start\">\n <div className=\"flex items-center gap-2\">\n <span\n className={cn(\n 'text-sm font-medium',\n step.status === 'pending'\n ? 'text-text-quaternary'\n : 'text-foreground',\n )}\n >\n {step.title}\n </span>\n <span className=\"text-xs text-secondary-foreground\">\n {getWorkflowStepStatusLabel(step.status)}\n </span>\n {step.durationMs !== undefined && (\n <span className=\"text-xs text-muted-foreground\">\n {formatWorkflowStepDuration(step.durationMs)}\n </span>\n )}\n </div>\n {step.description && (\n <p className=\"mt-0.5 text-xs text-text-quaternary\">\n {step.description}\n </p>\n )}\n </div>\n\n {isDisclosureControl && (\n <div className=\"shrink-0\">\n {expanded ? (\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 </>\n );\n\n return (\n <div\n data-slot={itemSlot}\n data-step-status={step.status}\n data-appearance={appearance}\n className={cn(\n appearanceConfig.rootClassName,\n appearanceConfig.hasDivider && !isLast && 'border-b border-border',\n )}\n >\n {isDisclosureControl ? (\n <button\n type=\"button\"\n onClick={onExpandedChange}\n aria-current={active ? 'step' : undefined}\n aria-expanded={expanded}\n aria-controls={contentId}\n aria-describedby={hasError ? errorDescriptionId : undefined}\n className={cn(\n workflowStepItemVariants({ status: step.status }),\n 'w-full cursor-pointer hover:bg-muted focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-ring',\n )}\n >\n {stepContent}\n </button>\n ) : (\n <div\n aria-current={active ? 'step' : undefined}\n aria-describedby={hasError ? errorDescriptionId : undefined}\n className={cn(\n workflowStepItemVariants({ status: step.status }),\n 'w-full',\n )}\n >\n {stepContent}\n </div>\n )}\n\n <AnimatePresence initial={false}>\n {expanded && hasExpandableDetails && (\n <motion.div\n id={contentId}\n data-slot=\"workflow-step-panel\"\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: 'auto', opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={disclosureTransition}\n className=\"overflow-hidden motion-reduce:transition-none\"\n >\n <div className=\"px-4 pb-3 ps-12\">\n {hasError && (\n <div className=\"rounded-lg border border-destructive/50 bg-destructive/10 p-3\">\n <div className=\"flex items-start gap-2\">\n <AlertCircle className=\"mt-0.5 size-4 shrink-0 text-destructive\" />\n <p className=\"text-sm text-destructive\">{error}</p>\n </div>\n </div>\n )}\n {hasContent && (\n <div className={hasError ? 'mt-3' : undefined}>\n {normalizedContent.content}\n </div>\n )}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n\n {hasError && (\n <span id={errorDescriptionId} className=\"sr-only\">\n {error}\n </span>\n )}\n\n {appearanceConfig.hasConnector && !isLast && (\n <div\n data-slot=\"workflow-step-connector\"\n aria-hidden=\"true\"\n className=\"absolute top-8 -bottom-3 start-6 w-px bg-border\"\n />\n )}\n </div>\n );\n}\n\nWorkflowStepItem.displayName = 'WorkflowStepItem';\n\nexport function WorkflowStepRenderer({\n steps,\n appearance = 'contained',\n itemSlot = 'workflow-step-item',\n expandable = true,\n activeStepId,\n expandedStepIds: controlledExpandedStepIds,\n defaultExpandedStepIds = [],\n onExpandedStepIdsChange,\n className,\n renderItems = true,\n}: PrivateWorkflowStepRendererProps) {\n const isControlled = controlledExpandedStepIds !== undefined;\n const controlledSnapshot = isControlled\n ? [...controlledExpandedStepIds]\n : undefined;\n const [uncontrolledExpandedStepIds, setUncontrolledExpandedStepIds] =\n React.useState<readonly string[]>(() =>\n normalizeExpandedWorkflowStepIds(defaultExpandedStepIds, steps),\n );\n const lastControlledExpandedStepIdsRef = React.useRef<readonly string[]>(\n controlledSnapshot ?? [],\n );\n const wasControlledRef = React.useRef(isControlled);\n const rawExpandedStepIds = isControlled\n ? controlledExpandedStepIds\n : uncontrolledExpandedStepIds;\n const visibleExpandedStepIds = normalizeExpandedWorkflowStepIds(\n rawExpandedStepIds,\n steps,\n );\n const expandedSet = new Set(visibleExpandedStepIds);\n\n React.useLayoutEffect(() => {\n if (controlledSnapshot !== undefined) {\n lastControlledExpandedStepIdsRef.current = controlledSnapshot;\n }\n }, [controlledSnapshot]);\n\n React.useLayoutEffect(() => {\n const wasControlled = wasControlledRef.current;\n wasControlledRef.current = isControlled;\n if (isControlled) return;\n\n setUncontrolledExpandedStepIds((current) => {\n const source = wasControlled\n ? lastControlledExpandedStepIdsRef.current\n : current;\n const reconciled = normalizeExpandedWorkflowStepIds(source, steps);\n return areWorkflowStepIdsEqual(reconciled, current)\n ? current\n : reconciled;\n });\n }, [isControlled, steps]);\n\n const toggleStep = (id: string) => {\n const next = new Set(visibleExpandedStepIds);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n const normalizedNext = normalizeExpandedWorkflowStepIds([...next], steps);\n if (!isControlled) {\n setUncontrolledExpandedStepIds([...normalizedNext]);\n }\n onExpandedStepIdsChange?.([...normalizedNext]);\n };\n\n if (!renderItems) return null;\n\n return (\n <ol\n data-slot=\"workflow-step-list\"\n data-appearance={appearance}\n className={cn('m-0 list-none p-0', className)}\n >\n {steps.map((step, index) => (\n <li key={step.id}>\n <WorkflowStepItem\n step={step}\n index={index}\n isLast={index === steps.length - 1}\n appearance={appearance}\n itemSlot={itemSlot}\n expandable={expandable}\n expanded={expandedSet.has(step.id)}\n active={activeStepId === step.id}\n onExpandedChange={() => toggleStep(step.id)}\n />\n </li>\n ))}\n </ol>\n );\n}\n\nWorkflowStepRenderer.displayName = 'WorkflowStepRenderer';\n"],"x_google_ignoreList":[0,1],"mappings":";;;;;;;;;;;;AASA,IAAMA,IAAa;AAAA,EACjB,CAAC,QAAQ;AAAA,IAAE,GAAG;AAAA,IAAW,KAAK;AAAA,EAAS,CAAC;AAAA,EACxC,CAAC,QAAQ;AAAA,IAAE,GAAG;AAAA,IAAqB,KAAK;AAAA,EAAS,CAAC;AAAA,EAClD,CAAC,QAAQ;AAAA,IAAE,GAAG;AAAA,IAAY,KAAK;AAAA,EAAS,CAAC;AAAA,EACzC,CAAC,QAAQ;AAAA,IAAE,GAAG;AAAA,IAAsB,KAAK;AAAA,EAAS,CAAC;AAAA,EACnD,CAAC,QAAQ;AAAA,IAAE,GAAG;AAAA,IAAY,KAAK;AAAA,EAAS,CAAC;AAAA,EACzC,CAAC,QAAQ;AAAA,IAAE,GAAG;AAAA,IAAqB,KAAK;AAAA,EAAS,CAAC;AAAA,EAClD,CAAC,QAAQ;AAAA,IAAE,GAAG;AAAA,IAAW,KAAK;AAAA,EAAS,CAAC;AAAA,EACxC,CAAC,QAAQ;AAAA,IAAE,GAAG;AAAA,IAAoB,KAAK;AAAA,EAAS,CAAC;AACnD,GACM,IAAS,EAAiB,UAAUA,CAAU,GCV9C,IAAa,CACjB,CAAC,QAAQ;AAAA,EAAE,GAAG;AAAA,EAAM,GAAG;AAAA,EAAK,OAAO;AAAA,EAAK,QAAQ;AAAA,EAAM,IAAI;AAAA,EAAK,KAAK;AAAS,CAAC,GAC9E,CAAC,QAAQ;AAAA,EAAE,GAAG;AAAA,EAAK,GAAG;AAAA,EAAK,OAAO;AAAA,EAAK,QAAQ;AAAA,EAAM,IAAI;AAAA,EAAK,KAAK;AAAS,CAAC,CAC/E,GACM,IAAQ,EAAiB,SAAS,CAAU,GCmC5C,IAAgC;AAAA,EACpC,SAAS;AAAA,EACT,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EACX,OAAO;AACT,GAEM,IAAgC;AAAA,EACpC,SAAS;AAAA,EACT,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EACX,OAAO;AACT,GAEa,IAA2B,EACtC,oFACA;AAAA,EACE,UAAU,EACR,QAAQ,EACV;AAAA,EACA,iBAAiB,EACf,QAAQ,UACV;AACF,CACF,GAEa,IAA2B,EACtC,iEACA;AAAA,EACE,UAAU,EACR,QAAQ,EACV;AAAA,EACA,iBAAiB,EACf,QAAQ,UACV;AACF,CACF,GAEM,IAA+B;AAAA,EACnC,WAAW;AAAA,IACT,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB;AAAA,EACA,UAAU;AAAA,IACR,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB;AAAA,EACA,UAAU;AAAA,IACR,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB;AACF;AAKA,SAAgB,EACd,GACA,GACU;AACV,QAAM,IAAY,IAAI,IAAI,CAAG;AAC7B,SAAO,EAAM,QAAA,CAAS,MAAU,EAAU,IAAI,EAAK,EAAE,IAAI,CAAC,EAAK,EAAE,IAAI,CAAC,CAAE;AAC1E;AAEA,SAAS,EACP,GACA,GACS;AACT,SACE,EAAK,WAAW,EAAM,UACtB,EAAK,MAAA,CAAO,GAAI,MAAU,MAAO,EAAM,CAAA,CAAM;AAEjD;AAEA,SAAS,EAA2B,GAA4B;AAC9D,SAAI,IAAa,MAAa,GAAG,CAAA,OAC1B,IAAI,IAAa,KAAM,QAAQ,CAAC,CAAA;AACzC;AAEA,SAAS,EACP,GACsC;AACtC,SACE,OAAO,KAAY,YACnB,MAAY,QACZ,OAAO,YAAY,KACnB,OAAQ,EAAsC,OAAO,QAAA,KACnD;AAEN;AAEA,SAAS,GACP,GACsC;AACtC,SACE,OAAQ,EAA+C,QAAS;AAEpE;AAQA,IAAM,IAAuC,oBAAI,QAG/C;AAEF,SAAS,GACP,GACA,GAC+B;AAC/B,QAAM,IAAwC,CAAC;AAC/C,MAAI,IAAuB,IACvB,IAAU,CAAC,MAAM,QAAQ,CAAO;AAEpC,WAAS,IAAS,EAAS,KAAK,GAAG,CAAC,EAAO,MAAM,IAAS,EAAS,KAAK,GAAG;AACzE,UAAM,IAAkB,EAA6B,EAAO,KAAK;AACjE,IAAA,EAAmB,KAAK,EAAgB,OAAO,GAC/C,MAAyB,EAAgB,sBACzC,MAAY,EAAgB;AAAA,EAC9B;AAEA,SAAO;AAAA,IACL,SAAS,IAAU,IAAqB;AAAA,IACxC,sBAAA;AAAA,IACA,SAAA;AAAA,EACF;AACF;AAEA,SAAS,EACP,GAC+B;AAC/B,MACE,KAAY,QAEZ,OAAO,KAAY,aACnB,MAAY,GAEZ,QAAO;AAAA,IAAE,SAAA;AAAA,IAAS,sBAAsB;AAAA,IAAO,SAAS;AAAA,EAAM;AAGhE,MACE,OAAO,KAAY,YACnB,OAAO,KAAY,YACnB,OAAO,KAAY,SAEnB,QAAO;AAAA,IAAE,SAAA;AAAA,IAAS,sBAAsB;AAAA,IAAM,SAAS;AAAA,EAAM;AAG/D,MAAI,EAAM,eAA+C,CAAO,GAAG;AACjE,QAAI,EAAQ,SAAS,EAAM,SACzB,QAAO;AAAA,MAAE,SAAA;AAAA,MAAS,sBAAsB;AAAA,MAAM,SAAS;AAAA,IAAM;AAG/D,UAAM,IAAqB,EACzB,EAAQ,MAAM,QAChB;AACA,WAAO;AAAA,MACL,SAAS,EAAmB,UACxB,EAAM,aAAa,GAAS,QAAW,EAAmB,OAAO,IACjE;AAAA,MACJ,sBAAsB,EAAmB;AAAA,MACzC,SAAS,EAAmB;AAAA,IAC9B;AAAA,EACF;AAEA,MAAI,EAA8B,CAAO,GAAG;AAC1C,UAAM,IAAW,EAAQ,OAAO,QAAA,EAAU,GACpC,IAAkB,GAA8B,CAAQ,IACzD,IACD;AAEJ,QAAI,MAAoB,MAAM;AAC5B,YAAM,IAAS,EAAqC,IAAI,CAAe;AACvE,UAAI,MAAW,OAAW,QAAO;AAAA,IACnC;AAEA,UAAM,IAAa,GAAqC,GAAS,CAAQ;AACzE,WAAI,MAAoB,QACtB,EAAqC,IAAI,GAAiB,CAAU,GAE/D;AAAA,EACT;AAEA,SAAO;AAAA,IAAE,SAAA;AAAA,IAAS,sBAAsB;AAAA,IAAM,SAAS;AAAA,EAAM;AAC/D;AAEA,SAAS,GACP,GACoB;AACpB,SAAO,GAAO,KAAK,IAAI,IAAQ;AACjC;AAEA,SAAS,GAA2B,GAAoC;AACtE,UAAQ,GAAR;AAAA,IACE,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO,EAAY,CAAM;AAAA,EAC7B;AACF;AAQA,SAAgB,EAAuB,EACrC,QAAA,GACA,OAAA,GACA,WAAA,EAAA,GAC8B;AAC9B,QAAM,IAAY,EAAG,EAAyB,EAAE,QAAA,EAAO,CAAC,GAAG,CAAS;AAEpE,UAAQ,GAAR;AAAA,IACE,KAAK;AACH,aACE,gBAAA,EAAC,OAAD;AAAA,QAAK,aAAU;AAAA,QAAqB,WAAW;AAAA,kBAC7C,gBAAA,EAAC,QAAD;AAAA,UAAM,WAAU;AAAA,oBAAuB,IAAQ;AAAA,QAAQ,CAAA;AAAA,MACpD,CAAA;AAAA,IAET,KAAK;AACH,aACE,gBAAA,EAAC,OAAD;AAAA,QACE,aAAU;AAAA,QACV,WAAW,EACT,GACA,kDACF;AAAA,kBAEA,gBAAA,EAAC,GAAD,EAAQ,WAAU,iDAAkD,CAAA;AAAA,MACjE,CAAA;AAAA,IAET,KAAK;AACH,aACE,gBAAA,EAAC,OAAD;AAAA,QAAK,aAAU;AAAA,QAAqB,WAAW;AAAA,kBAC7C,gBAAA,EAAC,GAAD,EAAO,WAAU,SAAU,CAAA;AAAA,MACxB,CAAA;AAAA,IAET,KAAK;AACH,aACE,gBAAA,EAAC,OAAD;AAAA,QACE,aAAU;AAAA,QACV,WAAW,EACT,GACA,kDACF;AAAA,kBAEA,gBAAA,EAAC,GAAD,EAAO,WAAU,SAAU,CAAA;AAAA,MACxB,CAAA;AAAA,IAET,KAAK;AACH,aACE,gBAAA,EAAC,OAAD;AAAA,QACE,aAAU;AAAA,QACV,WAAW,EAAG,GAAW,2CAA2C;AAAA,kBAEpE,gBAAA,EAAC,GAAD,EAAa,WAAU,SAAU,CAAA;AAAA,MAC9B,CAAA;AAAA,IAET;AACE,aAAO,EAAY,CAAM;AAAA,EAC7B;AACF;AAEA,EAAuB,cAAc;AAcrC,SAAgB,EAAiB,EAC/B,MAAA,GACA,OAAA,GACA,QAAA,GACA,YAAA,IAAa,aACb,UAAA,IAAW,sBACX,YAAA,IAAa,IACb,UAAA,GACA,QAAA,IAAS,IACT,kBAAA,EAAA,GACwB;AACxB,QAAM,IAAY,EAAM,MAAM,GACxB,IAAqB,EAAM,MAAM,GACjC,IAAoB,EAA6B,EAAK,OAAO,GAC7D,IAAa,EAAkB,sBAC/B,IAAQ,GAA6B,EAAK,KAAK,GAC/C,IAAW,MAAU,QACrB,IAAuB,KAAc,GACrC,IAAsB,KAAwB,GAC9C,IAAuB,EAAiB,GACxC,IAAmB,EAA6B,CAAA,GAChD,IAAuB,EAC3B,UAAU,IAAuB,IAAI,IACvC,GACM,IACJ,gBAAA,EAAA,GAAA,EAAA,UAAA;AAAA,IACE,gBAAA,EAAC,GAAD;AAAA,MAAwB,QAAQ,EAAK;AAAA,MAAe,OAAA;AAAA,IAAQ,CAAA;AAAA,IAE5D,gBAAA,EAAC,OAAD;AAAA,MAAK,WAAU;AAAA,gBAAf,CACE,gBAAA,EAAC,OAAD;AAAA,QAAK,WAAU;AAAA,kBAAf;AAAA,UACE,gBAAA,EAAC,QAAD;AAAA,YACE,WAAW,EACT,uBACA,EAAK,WAAW,YACZ,yBACA,iBACN;AAAA,sBAEC,EAAK;AAAA,UACF,CAAA;AAAA,UACN,gBAAA,EAAC,QAAD;AAAA,YAAM,WAAU;AAAA,sBACb,GAA2B,EAAK,MAAM;AAAA,UACnC,CAAA;AAAA,UACL,EAAK,eAAe,UACnB,gBAAA,EAAC,QAAD;AAAA,YAAM,WAAU;AAAA,sBACb,EAA2B,EAAK,UAAU;AAAA,UACvC,CAAA;AAAA,QAEL;AAAA,UACJ,EAAK,eACJ,gBAAA,EAAC,KAAD;AAAA,QAAG,WAAU;AAAA,kBACV,EAAK;AAAA,MACL,CAAA,CAEF;AAAA;IAEJ,KACC,gBAAA,EAAC,OAAD;AAAA,MAAK,WAAU;AAAA,gBACZ,IACC,gBAAA,EAAC,GAAD,EAAa,WAAU,+BAAgC,CAAA,IAEvD,gBAAA,EAAC,GAAD,EAAc,WAAU,8CAA+C,CAAA;AAAA,IAEtE,CAAA;AAAA,EAEP,EAAA,CAAA;AAGJ,SACE,gBAAA,EAAC,OAAD;AAAA,IACE,aAAW;AAAA,IACX,oBAAkB,EAAK;AAAA,IACvB,mBAAiB;AAAA,IACjB,WAAW,EACT,EAAiB,eACjB,EAAiB,cAAc,CAAC,KAAU,wBAC5C;AAAA,cAPF;AAAA,MASG,IACC,gBAAA,EAAC,UAAD;AAAA,QACE,MAAK;AAAA,QACL,SAAS;AAAA,QACT,gBAAc,IAAS,SAAS;AAAA,QAChC,iBAAe;AAAA,QACf,iBAAe;AAAA,QACf,oBAAkB,IAAW,IAAqB;AAAA,QAClD,WAAW,EACT,EAAyB,EAAE,QAAQ,EAAK,OAAO,CAAC,GAChD,6HACF;AAAA,kBAEC;AAAA,MACK,CAAA,IAER,gBAAA,EAAC,OAAD;AAAA,QACE,gBAAc,IAAS,SAAS;AAAA,QAChC,oBAAkB,IAAW,IAAqB;AAAA,QAClD,WAAW,EACT,EAAyB,EAAE,QAAQ,EAAK,OAAO,CAAC,GAChD,QACF;AAAA,kBAEC;AAAA,MACE,CAAA;AAAA,MAGP,gBAAA,EAAC,GAAD;AAAA,QAAiB,SAAS;AAAA,kBACvB,KAAY,KACX,gBAAA,EAAC,EAAO,KAAR;AAAA,UACE,IAAI;AAAA,UACJ,aAAU;AAAA,UACV,SAAS;AAAA,YAAE,QAAQ;AAAA,YAAG,SAAS;AAAA,UAAE;AAAA,UACjC,SAAS;AAAA,YAAE,QAAQ;AAAA,YAAQ,SAAS;AAAA,UAAE;AAAA,UACtC,MAAM;AAAA,YAAE,QAAQ;AAAA,YAAG,SAAS;AAAA,UAAE;AAAA,UAC9B,YAAY;AAAA,UACZ,WAAU;AAAA,oBAEV,gBAAA,EAAC,OAAD;AAAA,YAAK,WAAU;AAAA,sBAAf,CACG,KACC,gBAAA,EAAC,OAAD;AAAA,cAAK,WAAU;AAAA,wBACb,gBAAA,EAAC,OAAD;AAAA,gBAAK,WAAU;AAAA,0BAAf,CACE,gBAAA,EAAC,GAAD,EAAa,WAAU,0CAA2C,CAAA,GAClE,gBAAA,EAAC,KAAD;AAAA,kBAAG,WAAU;AAAA,4BAA4B;AAAA,gBAAS,CAAA,CAC/C;AAAA;YACF,CAAA,GAEN,KACC,gBAAA,EAAC,OAAD;AAAA,cAAK,WAAW,IAAW,SAAS;AAAA,wBACjC,EAAkB;AAAA,YAChB,CAAA,CAEJ;AAAA;QACK,CAAA;AAAA,MAEC,CAAA;AAAA,MAEhB,KACC,gBAAA,EAAC,QAAD;AAAA,QAAM,IAAI;AAAA,QAAoB,WAAU;AAAA,kBACrC;AAAA,MACG,CAAA;AAAA,MAGP,EAAiB,gBAAgB,CAAC,KACjC,gBAAA,EAAC,OAAD;AAAA,QACE,aAAU;AAAA,QACV,eAAY;AAAA,QACZ,WAAU;AAAA,MACX,CAAA;AAAA,IAEA;AAAA;AAET;AAEA,EAAiB,cAAc;AAE/B,SAAgB,GAAqB,EACnC,OAAA,GACA,YAAA,IAAa,aACb,UAAA,IAAW,sBACX,YAAA,IAAa,IACb,cAAA,GACA,iBAAiB,GACjB,wBAAA,IAAyB,CAAC,GAC1B,yBAAA,GACA,WAAA,GACA,aAAA,IAAc,GAAA,GACqB;AACnC,QAAM,IAAe,MAA8B,QAC7C,IAAqB,IACvB,CAAC,GAAG,CAAyB,IAC7B,QACE,CAAC,GAA6B,CAAA,IAClC,EAAM,SAAA,MACJ,EAAiC,GAAwB,CAAK,CAChE,GACI,IAAmC,EAAM,OAC7C,KAAsB,CAAC,CACzB,GACM,IAAmB,EAAM,OAAO,CAAY,GAI5C,IAAyB,EAHJ,IACvB,IACA,GAGF,CACF,GACM,IAAc,IAAI,IAAI,CAAsB;AAElD,EAAA,EAAM,gBAAA,MAAsB;AAC1B,IAAI,MAAuB,WACzB,EAAiC,UAAU;AAAA,EAE/C,GAAG,CAAC,CAAkB,CAAC,GAEvB,EAAM,gBAAA,MAAsB;AAC1B,UAAM,IAAgB,EAAiB;AAEvC,IADA,EAAiB,UAAU,GACvB,CAAA,KAEJ,EAAA,CAAgC,MAAY;AAI1C,YAAM,IAAa,EAHJ,IACX,EAAiC,UACjC,GACwD,CAAK;AACjE,aAAO,EAAwB,GAAY,CAAO,IAC9C,IACA;AAAA,IACN,CAAC;AAAA,EACH,GAAG,CAAC,GAAc,CAAK,CAAC;AAExB,QAAM,IAAA,CAAc,MAAe;AACjC,UAAM,IAAO,IAAI,IAAI,CAAsB;AAC3C,IAAI,EAAK,IAAI,CAAE,IAAG,EAAK,OAAO,CAAE,IAC3B,EAAK,IAAI,CAAE;AAChB,UAAM,IAAiB,EAAiC,CAAC,GAAG,CAAI,GAAG,CAAK;AACxE,IAAK,KACH,EAA+B,CAAC,GAAG,CAAc,CAAC,GAEpD,IAA0B,CAAC,GAAG,CAAc,CAAC;AAAA,EAC/C;AAEA,SAAK,IAGH,gBAAA,EAAC,MAAD;AAAA,IACE,aAAU;AAAA,IACV,mBAAiB;AAAA,IACjB,WAAW,EAAG,qBAAqB,CAAS;AAAA,cAE3C,EAAM,IAAA,CAAK,GAAM,MAChB,gBAAA,EAAC,MAAD,EAAA,UACE,gBAAA,EAAC,GAAD;AAAA,MACQ,MAAA;AAAA,MACC,OAAA;AAAA,MACP,QAAQ,MAAU,EAAM,SAAS;AAAA,MACrB,YAAA;AAAA,MACF,UAAA;AAAA,MACE,YAAA;AAAA,MACZ,UAAU,EAAY,IAAI,EAAK,EAAE;AAAA,MACjC,QAAQ,MAAiB,EAAK;AAAA,MAC9B,kBAAA,MAAwB,EAAW,EAAK,EAAE;AAAA,IAC3C,CAAA,EACC,GAZK,EAAK,EAYV,CACL;AAAA,EACC,CAAA,IAvBmB;AAyB3B;AAEA,GAAqB,cAAc"}
1
+ {"version":3,"file":"workflow-step-renderer.js","names":["__iconNode"],"sources":["../../../../../../../../../../../Users/akarim/Documents/test/humain_foundation_ui/node_modules/.bun/lucide-react@1.25.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/loader.mjs","../../../../../../../../../../../Users/akarim/Documents/test/humain_foundation_ui/node_modules/.bun/lucide-react@1.25.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/pause.mjs","../../src/components/organisms/ai/_shared/workflow-step-renderer.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.25.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 2v4\", key: \"3427ic\" }],\n [\"path\", { d: \"m16.2 7.8 2.9-2.9\", key: \"r700ao\" }],\n [\"path\", { d: \"M18 12h4\", key: \"wj9ykh\" }],\n [\"path\", { d: \"m16.2 16.2 2.9 2.9\", key: \"1bxg5t\" }],\n [\"path\", { d: \"M12 18v4\", key: \"jadmvz\" }],\n [\"path\", { d: \"m4.9 19.1 2.9-2.9\", key: \"bwix9q\" }],\n [\"path\", { d: \"M2 12h4\", key: \"j09sii\" }],\n [\"path\", { d: \"m4.9 4.9 2.9 2.9\", key: \"giyufr\" }]\n];\nconst Loader = createLucideIcon(\"loader\", __iconNode);\n\nexport { __iconNode, Loader as default };\n//# sourceMappingURL=loader.mjs.map\n","/**\n * @license lucide-react v1.25.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 [\"rect\", { x: \"14\", y: \"3\", width: \"5\", height: \"18\", rx: \"1\", key: \"kaeet6\" }],\n [\"rect\", { x: \"5\", y: \"3\", width: \"5\", height: \"18\", rx: \"1\", key: \"1wsw3u\" }]\n];\nconst Pause = createLucideIcon(\"pause\", __iconNode);\n\nexport { __iconNode, Pause as default };\n//# sourceMappingURL=pause.mjs.map\n","import { cva } from 'class-variance-authority';\nimport {\n AlertCircle,\n Check,\n ChevronDown,\n ChevronRight,\n Loader,\n Pause,\n} from 'lucide-react';\nimport { AnimatePresence, motion, useReducedMotion } from 'motion/react';\nimport * as React from 'react';\nimport { assertNever, cn } from '@/lib/utils';\n\nexport type WorkflowStepStatus =\n | 'pending'\n | 'running'\n | 'suspended'\n | 'completed'\n | 'error';\n\nexport type WorkflowStepAppearance = 'contained' | 'embedded' | 'timeline';\n\nexport interface WorkflowStepViewModel {\n id: string;\n title: string;\n description?: string;\n status: WorkflowStepStatus;\n content?: React.ReactNode;\n durationMs?: number;\n error?: string;\n}\n\nexport interface WorkflowStepRendererProps {\n steps: readonly WorkflowStepViewModel[];\n appearance?: WorkflowStepAppearance;\n itemSlot?: string;\n expandable?: boolean;\n activeStepId?: string;\n expandedStepIds?: readonly string[];\n defaultExpandedStepIds?: readonly string[];\n onExpandedStepIdsChange?: (ids: readonly string[]) => void;\n className?: string;\n}\n\ninterface PrivateWorkflowStepRendererProps extends WorkflowStepRendererProps {\n renderItems?: boolean;\n}\n\nconst workflowStepItemStatusClasses = {\n pending: 'text-muted-foreground',\n running: 'text-primary',\n suspended: 'text-warning',\n completed: 'text-success',\n error: 'text-destructive',\n} as const satisfies Record<WorkflowStepStatus, string>;\n\nconst workflowStepIconStatusClasses = {\n pending: 'bg-accent text-muted-foreground',\n running: 'bg-primary/20 text-primary',\n suspended: 'bg-warning/20 text-warning',\n completed: 'bg-success/20 text-success',\n error: 'bg-destructive/20 text-destructive',\n} as const satisfies Record<WorkflowStepStatus, string>;\n\nexport const workflowStepItemVariants = cva(\n 'flex items-start gap-3 px-4 py-3 transition-colors motion-reduce:transition-none',\n {\n variants: {\n status: workflowStepItemStatusClasses,\n },\n defaultVariants: {\n status: 'pending',\n },\n },\n);\n\nexport const workflowStepIconVariants = cva(\n 'size-5 shrink-0 flex items-center justify-center rounded-full',\n {\n variants: {\n status: workflowStepIconStatusClasses,\n },\n defaultVariants: {\n status: 'pending',\n },\n },\n);\n\nconst workflowStepAppearanceConfig = {\n contained: {\n rootClassName: 'relative',\n hasDivider: true,\n hasConnector: false,\n },\n embedded: {\n rootClassName: 'relative',\n hasDivider: true,\n hasConnector: false,\n },\n timeline: {\n rootClassName: 'relative',\n hasDivider: false,\n hasConnector: true,\n },\n} as const satisfies Record<\n WorkflowStepAppearance,\n { rootClassName: string; hasDivider: boolean; hasConnector: boolean }\n>;\n\nexport function normalizeExpandedWorkflowStepIds(\n ids: readonly string[],\n steps: readonly WorkflowStepViewModel[],\n): string[] {\n const requested = new Set(ids);\n return steps.flatMap((step) => (requested.has(step.id) ? [step.id] : []));\n}\n\nfunction areWorkflowStepIdsEqual(\n left: readonly string[],\n right: readonly string[],\n): boolean {\n return (\n left.length === right.length &&\n left.every((id, index) => id === right[index])\n );\n}\n\nfunction formatWorkflowStepDuration(durationMs: number): string {\n if (durationMs < 1000) return `${durationMs}ms`;\n if (durationMs < 60_000) return `${(durationMs / 1000).toFixed(1)}s`;\n\n const totalSeconds = Math.floor(durationMs / 1000);\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n\n return [\n hours > 0 ? `${hours}h` : null,\n minutes > 0 ? `${minutes}m` : null,\n seconds > 0 ? `${seconds}s` : null,\n ]\n .filter((part): part is string => part !== null)\n .join(' ');\n}\n\nfunction isIterableWorkflowStepContent(\n content: React.ReactNode,\n): content is Iterable<React.ReactNode> {\n return (\n typeof content === 'object' &&\n content !== null &&\n Symbol.iterator in content &&\n typeof (content as Iterable<React.ReactNode>)[Symbol.iterator] ===\n 'function'\n );\n}\n\nfunction isIteratorWorkflowStepContent(\n content: unknown,\n): content is Iterator<React.ReactNode> {\n return (\n typeof (content as Partial<Iterator<React.ReactNode>>).next === 'function'\n );\n}\n\ninterface NormalizedWorkflowStepContent {\n content: React.ReactNode;\n hasRenderableContent: boolean;\n changed: boolean;\n}\n\nconst normalizedOneShotWorkflowStepContent = new WeakMap<\n object,\n NormalizedWorkflowStepContent\n>();\n\nfunction normalizeIterableWorkflowStepContent(\n content: Iterable<React.ReactNode>,\n iterator: Iterator<React.ReactNode>,\n): NormalizedWorkflowStepContent {\n const normalizedChildren: React.ReactNode[] = [];\n let hasRenderableContent = false;\n let changed = !Array.isArray(content);\n\n for (let result = iterator.next(); !result.done; result = iterator.next()) {\n const normalizedChild = normalizeWorkflowStepContent(result.value);\n normalizedChildren.push(normalizedChild.content);\n hasRenderableContent ||= normalizedChild.hasRenderableContent;\n changed ||= normalizedChild.changed;\n }\n\n return {\n content: changed ? normalizedChildren : content,\n hasRenderableContent,\n changed,\n };\n}\n\nfunction normalizeWorkflowStepContent(\n content: React.ReactNode,\n): NormalizedWorkflowStepContent {\n if (\n content === null ||\n content === undefined ||\n typeof content === 'boolean' ||\n content === ''\n ) {\n return { content, hasRenderableContent: false, changed: false };\n }\n\n if (\n typeof content === 'string' ||\n typeof content === 'number' ||\n typeof content === 'bigint'\n ) {\n return { content, hasRenderableContent: true, changed: false };\n }\n\n if (React.isValidElement<{ children?: React.ReactNode }>(content)) {\n if (content.type !== React.Fragment) {\n return { content, hasRenderableContent: true, changed: false };\n }\n\n const normalizedChildren = normalizeWorkflowStepContent(\n content.props.children,\n );\n return {\n content: normalizedChildren.changed\n ? React.cloneElement(content, undefined, normalizedChildren.content)\n : content,\n hasRenderableContent: normalizedChildren.hasRenderableContent,\n changed: normalizedChildren.changed,\n };\n }\n\n if (isIterableWorkflowStepContent(content)) {\n const iterator = content[Symbol.iterator]();\n const oneShotCacheKey = isIteratorWorkflowStepContent(iterator)\n ? (iterator as object)\n : null;\n\n if (oneShotCacheKey !== null) {\n const cached = normalizedOneShotWorkflowStepContent.get(oneShotCacheKey);\n if (cached !== undefined) return cached;\n }\n\n const normalized = normalizeIterableWorkflowStepContent(content, iterator);\n if (oneShotCacheKey !== null) {\n normalizedOneShotWorkflowStepContent.set(oneShotCacheKey, normalized);\n }\n return normalized;\n }\n\n return { content, hasRenderableContent: true, changed: false };\n}\n\nfunction getNonBlankWorkflowStepError(\n error: string | undefined,\n): string | undefined {\n return error?.trim() ? error : undefined;\n}\n\nfunction getWorkflowStepStatusLabel(status: WorkflowStepStatus): string {\n switch (status) {\n case 'pending':\n return 'Pending';\n case 'running':\n return 'Running';\n case 'suspended':\n return 'Paused';\n case 'completed':\n return 'Completed';\n case 'error':\n return 'Error';\n default:\n return assertNever(status);\n }\n}\n\nexport interface WorkflowStepStatusIconProps {\n status: WorkflowStepStatus;\n index: number;\n className?: string;\n}\n\nexport function WorkflowStepStatusIcon({\n status,\n index,\n className,\n}: WorkflowStepStatusIconProps) {\n const iconClass = cn(workflowStepIconVariants({ status }), className);\n\n switch (status) {\n case 'pending':\n return (\n <div data-slot=\"workflow-step-icon\" className={iconClass}>\n <span className=\"text-xs font-medium\">{index + 1}</span>\n </div>\n );\n case 'running':\n return (\n <div\n data-slot=\"workflow-step-icon\"\n className={cn(\n iconClass,\n 'delight-status-pulse motion-reduce:!animate-none',\n )}\n >\n <Loader className=\"size-3 animate-spin motion-reduce:animate-none\" />\n </div>\n );\n case 'suspended':\n return (\n <div data-slot=\"workflow-step-icon\" className={iconClass}>\n <Pause className=\"size-3\" />\n </div>\n );\n case 'completed':\n return (\n <div\n data-slot=\"workflow-step-icon\"\n className={cn(\n iconClass,\n 'delight-check-bounce motion-reduce:!animate-none',\n )}\n >\n <Check className=\"size-3\" />\n </div>\n );\n case 'error':\n return (\n <div\n data-slot=\"workflow-step-icon\"\n className={cn(iconClass, 'delight-shake motion-reduce:!animate-none')}\n >\n <AlertCircle className=\"size-3\" />\n </div>\n );\n default:\n return assertNever(status);\n }\n}\n\nWorkflowStepStatusIcon.displayName = 'WorkflowStepStatusIcon';\n\nexport interface WorkflowStepItemProps {\n step: WorkflowStepViewModel;\n index: number;\n isLast: boolean;\n appearance?: WorkflowStepAppearance;\n itemSlot?: string;\n expandable?: boolean;\n expanded: boolean;\n active?: boolean;\n onExpandedChange: () => void;\n}\n\nexport function WorkflowStepItem({\n step,\n index,\n isLast,\n appearance = 'contained',\n itemSlot = 'workflow-step-item',\n expandable = true,\n expanded,\n active = false,\n onExpandedChange,\n}: WorkflowStepItemProps) {\n const contentId = React.useId();\n const errorDescriptionId = React.useId();\n const normalizedContent = normalizeWorkflowStepContent(step.content);\n const hasContent = normalizedContent.hasRenderableContent;\n const error = getNonBlankWorkflowStepError(step.error);\n const hasError = error !== undefined;\n const hasExpandableDetails = hasContent || hasError;\n const isDisclosureControl = hasExpandableDetails && expandable;\n const prefersReducedMotion = useReducedMotion();\n const appearanceConfig = workflowStepAppearanceConfig[appearance];\n const disclosureTransition = {\n duration: prefersReducedMotion ? 0 : 0.2,\n };\n const stepContent = (\n <>\n <WorkflowStepStatusIcon status={step.status} index={index} />\n\n <div className=\"min-w-0 flex-1 text-start\">\n <div className=\"flex items-center gap-2\">\n <span\n className={cn(\n 'text-sm font-medium',\n step.status === 'pending'\n ? 'text-text-quaternary'\n : 'text-foreground',\n )}\n >\n {step.title}\n </span>\n <span className=\"text-xs text-secondary-foreground\">\n {getWorkflowStepStatusLabel(step.status)}\n </span>\n {step.durationMs !== undefined && (\n <span className=\"text-xs text-muted-foreground\">\n {formatWorkflowStepDuration(step.durationMs)}\n </span>\n )}\n </div>\n {step.description && (\n <p className=\"mt-0.5 text-xs text-text-quaternary\">\n {step.description}\n </p>\n )}\n </div>\n\n {isDisclosureControl && (\n <div className=\"shrink-0\">\n {expanded ? (\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 </>\n );\n\n return (\n <div\n data-slot={itemSlot}\n data-step-status={step.status}\n data-appearance={appearance}\n className={cn(\n appearanceConfig.rootClassName,\n appearanceConfig.hasDivider && !isLast && 'border-b border-border',\n )}\n >\n {isDisclosureControl ? (\n <button\n type=\"button\"\n onClick={onExpandedChange}\n aria-current={active ? 'step' : undefined}\n aria-expanded={expanded}\n aria-controls={contentId}\n aria-describedby={hasError ? errorDescriptionId : undefined}\n className={cn(\n workflowStepItemVariants({ status: step.status }),\n 'w-full cursor-pointer hover:bg-muted focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-ring',\n )}\n >\n {stepContent}\n </button>\n ) : (\n <div\n aria-current={active ? 'step' : undefined}\n aria-describedby={hasError ? errorDescriptionId : undefined}\n className={cn(\n workflowStepItemVariants({ status: step.status }),\n 'w-full',\n )}\n >\n {stepContent}\n </div>\n )}\n\n <AnimatePresence initial={false}>\n {expanded && hasExpandableDetails && (\n <motion.div\n id={contentId}\n data-slot=\"workflow-step-panel\"\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: 'auto', opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={disclosureTransition}\n className=\"overflow-hidden motion-reduce:transition-none\"\n >\n <div className=\"px-4 pb-3 ps-12\">\n {hasError && (\n <div className=\"rounded-lg border border-destructive/50 bg-destructive/10 p-3\">\n <div className=\"flex items-start gap-2\">\n <AlertCircle className=\"mt-0.5 size-4 shrink-0 text-destructive\" />\n <p className=\"text-sm text-destructive\">{error}</p>\n </div>\n </div>\n )}\n {hasContent && (\n <div className={hasError ? 'mt-3' : undefined}>\n {normalizedContent.content}\n </div>\n )}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n\n {hasError && (\n <span id={errorDescriptionId} className=\"sr-only\">\n {error}\n </span>\n )}\n\n {appearanceConfig.hasConnector && !isLast && (\n <div\n data-slot=\"workflow-step-connector\"\n aria-hidden=\"true\"\n className=\"absolute top-8 -bottom-3 start-6 w-px bg-border\"\n />\n )}\n </div>\n );\n}\n\nWorkflowStepItem.displayName = 'WorkflowStepItem';\n\nexport function WorkflowStepRenderer({\n steps,\n appearance = 'contained',\n itemSlot = 'workflow-step-item',\n expandable = true,\n activeStepId,\n expandedStepIds: controlledExpandedStepIds,\n defaultExpandedStepIds = [],\n onExpandedStepIdsChange,\n className,\n renderItems = true,\n}: PrivateWorkflowStepRendererProps) {\n const isControlled = controlledExpandedStepIds !== undefined;\n const controlledSnapshot = isControlled\n ? [...controlledExpandedStepIds]\n : undefined;\n const [uncontrolledExpandedStepIds, setUncontrolledExpandedStepIds] =\n React.useState<readonly string[]>(() =>\n normalizeExpandedWorkflowStepIds(defaultExpandedStepIds, steps),\n );\n const lastControlledExpandedStepIdsRef = React.useRef<readonly string[]>(\n controlledSnapshot ?? [],\n );\n const wasControlledRef = React.useRef(isControlled);\n const rawExpandedStepIds = isControlled\n ? controlledExpandedStepIds\n : uncontrolledExpandedStepIds;\n const visibleExpandedStepIds = normalizeExpandedWorkflowStepIds(\n rawExpandedStepIds,\n steps,\n );\n const expandedSet = new Set(visibleExpandedStepIds);\n\n React.useLayoutEffect(() => {\n if (controlledSnapshot !== undefined) {\n lastControlledExpandedStepIdsRef.current = controlledSnapshot;\n }\n }, [controlledSnapshot]);\n\n React.useLayoutEffect(() => {\n const wasControlled = wasControlledRef.current;\n wasControlledRef.current = isControlled;\n if (isControlled) return;\n\n setUncontrolledExpandedStepIds((current) => {\n const source = wasControlled\n ? lastControlledExpandedStepIdsRef.current\n : current;\n const reconciled = normalizeExpandedWorkflowStepIds(source, steps);\n return areWorkflowStepIdsEqual(reconciled, current)\n ? current\n : reconciled;\n });\n }, [isControlled, steps]);\n\n const toggleStep = (id: string) => {\n const next = new Set(visibleExpandedStepIds);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n const normalizedNext = normalizeExpandedWorkflowStepIds([...next], steps);\n if (!isControlled) {\n setUncontrolledExpandedStepIds([...normalizedNext]);\n }\n onExpandedStepIdsChange?.([...normalizedNext]);\n };\n\n if (!renderItems) return null;\n\n return (\n <ol\n data-slot=\"workflow-step-list\"\n data-appearance={appearance}\n className={cn('m-0 list-none p-0', className)}\n >\n {steps.map((step, index) => (\n <li key={step.id}>\n <WorkflowStepItem\n step={step}\n index={index}\n isLast={index === steps.length - 1}\n appearance={appearance}\n itemSlot={itemSlot}\n expandable={expandable}\n expanded={expandedSet.has(step.id)}\n active={activeStepId === step.id}\n onExpandedChange={() => toggleStep(step.id)}\n />\n </li>\n ))}\n </ol>\n );\n}\n\nWorkflowStepRenderer.displayName = 'WorkflowStepRenderer';\n"],"x_google_ignoreList":[0,1],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@humain/ui",
3
- "version": "2.1.62",
3
+ "version": "2.1.63",
4
4
  "description": "HUMAIN UI React components, design tokens, Web Components, and agent skills.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -3,7 +3,7 @@ name: humain-ui
3
3
  description: Use when building, migrating, auditing, or bootstrapping React UI with @humain/ui, including pages, dashboards, app shells, forms, dialogs, data tables, charts, AI chat workspaces, or Figma-to-Humain mapping.
4
4
  ---
5
5
 
6
- # Humain Foundation UI (v2.1.62)
6
+ # Humain Foundation UI (v2.1.63)
7
7
 
8
8
  Build product UI with `@humain/ui`, a React 18/19 component library with Tailwind v4, dark mode, design tokens, Web Component projections, and AI-facing references.
9
9
 
@@ -3,7 +3,7 @@ name: humain-ui-wc
3
3
  description: Use when building browser-native prototypes, iframe artifacts, static HTML, custom-element demos, framework-neutral integrations, or any HUMAIN UI that must use hf-* Web Components instead of React JSX.
4
4
  ---
5
5
 
6
- # Humain Foundation UI Web Components (v2.1.62)
6
+ # Humain Foundation UI Web Components (v2.1.63)
7
7
 
8
8
  **Identity** - You build HUMAIN interfaces with `hf-*` custom elements. You keep the same product taste, spacing discipline, and component intent as the React `humain-ui` skill, but you only use Web Component APIs that actually exist in the manifest.
9
9
 
Binary file
Binary file