@humain/ui 2.1.62 → 2.1.65

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/dist/components/organisms/ai/AIToolCall/AIToolCall.d.ts +9 -3
  2. package/dist/components/organisms/ai/AIToolRun/index.d.ts +1 -1
  3. package/dist/components/organisms/ai/AIToolRun/validation.d.ts +24 -3
  4. package/dist/components/organisms/ai/_shared/format-ai-duration.d.ts +1 -0
  5. package/dist/components/organisms/ai/_shared/workflow-step-renderer.d.ts +1 -0
  6. package/dist/index.js +52 -52
  7. package/dist/index151.js +1 -1
  8. package/dist/index174.js +10 -333
  9. package/dist/index174.js.map +1 -1
  10. package/dist/index175.js +310 -137
  11. package/dist/index175.js.map +1 -1
  12. package/dist/index176.js +148 -174
  13. package/dist/index176.js.map +1 -1
  14. package/dist/index177.js +186 -78
  15. package/dist/index177.js.map +1 -1
  16. package/dist/index178.js +74 -124
  17. package/dist/index178.js.map +1 -1
  18. package/dist/index179.js +133 -1
  19. package/dist/index179.js.map +1 -0
  20. package/dist/index180.js +2 -201
  21. package/dist/index181.js +201 -0
  22. package/dist/{index180.js.map → index181.js.map} +1 -1
  23. package/dist/index183.js +130 -166
  24. package/dist/index183.js.map +1 -1
  25. package/dist/index184.js +195 -983
  26. package/dist/index184.js.map +1 -1
  27. package/dist/index185.js +1069 -369
  28. package/dist/index185.js.map +1 -1
  29. package/dist/index186.js +395 -197
  30. package/dist/index186.js.map +1 -1
  31. package/dist/index187.js +198 -243
  32. package/dist/index187.js.map +1 -1
  33. package/dist/index188.js +263 -3
  34. package/dist/index188.js.map +1 -1
  35. package/dist/index189.js +3 -209
  36. package/dist/index189.js.map +1 -1
  37. package/dist/index190.js +190 -777
  38. package/dist/index190.js.map +1 -1
  39. package/dist/index191.js +771 -252
  40. package/dist/index191.js.map +1 -1
  41. package/dist/index192.js +250 -65
  42. package/dist/index192.js.map +1 -1
  43. package/dist/index193.js +72 -523
  44. package/dist/index193.js.map +1 -1
  45. package/dist/index194.js +537 -144
  46. package/dist/index194.js.map +1 -1
  47. package/dist/index195.js +139 -720
  48. package/dist/index195.js.map +1 -1
  49. package/dist/index196.js +707 -167
  50. package/dist/index196.js.map +1 -1
  51. package/dist/index197.js +175 -151
  52. package/dist/index197.js.map +1 -1
  53. package/dist/index198.js +152 -487
  54. package/dist/index198.js.map +1 -1
  55. package/dist/index199.js +472 -225
  56. package/dist/index199.js.map +1 -1
  57. package/dist/index200.js +236 -260
  58. package/dist/index200.js.map +1 -1
  59. package/dist/index201.js +265 -215
  60. package/dist/index201.js.map +1 -1
  61. package/dist/index202.js +207 -307
  62. package/dist/index202.js.map +1 -1
  63. package/dist/index203.js +302 -135
  64. package/dist/index203.js.map +1 -1
  65. package/dist/index204.js +140 -271
  66. package/dist/index204.js.map +1 -1
  67. package/dist/index205.js +263 -253
  68. package/dist/index205.js.map +1 -1
  69. package/dist/index206.js +244 -137
  70. package/dist/index206.js.map +1 -1
  71. package/dist/index207.js +100 -238
  72. package/dist/index207.js.map +1 -1
  73. package/dist/index208.js +278 -74
  74. package/dist/index208.js.map +1 -1
  75. package/dist/index209.js +56 -97
  76. package/dist/index209.js.map +1 -1
  77. package/dist/index210.js +142 -47
  78. package/dist/index210.js.map +1 -1
  79. package/dist/index211.js +38 -84
  80. package/dist/index211.js.map +1 -1
  81. package/dist/index212.js +72 -252
  82. package/dist/index212.js.map +1 -1
  83. package/dist/index213.js +274 -26
  84. package/dist/index213.js.map +1 -1
  85. package/dist/index214.js +29 -94
  86. package/dist/index214.js.map +1 -1
  87. package/dist/index215.js +98 -25
  88. package/dist/index215.js.map +1 -1
  89. package/dist/index216.js +20 -565
  90. package/dist/index216.js.map +1 -1
  91. package/dist/index217.js +564 -17
  92. package/dist/index217.js.map +1 -1
  93. package/dist/index218.js +20 -23
  94. package/dist/index218.js.map +1 -1
  95. package/dist/index219.js +20 -95
  96. package/dist/index219.js.map +1 -1
  97. package/dist/index220.js +92 -88
  98. package/dist/index220.js.map +1 -1
  99. package/dist/index221.js +97 -29
  100. package/dist/index221.js.map +1 -1
  101. package/dist/index222.js +24 -470
  102. package/dist/index222.js.map +1 -1
  103. package/dist/index223.js +446 -196
  104. package/dist/index223.js.map +1 -1
  105. package/dist/index224.js +199 -729
  106. package/dist/index224.js.map +1 -1
  107. package/dist/index225.js +750 -61
  108. package/dist/index225.js.map +1 -1
  109. package/dist/index226.js +58 -181
  110. package/dist/index226.js.map +1 -1
  111. package/dist/index227.js +175 -259
  112. package/dist/index227.js.map +1 -1
  113. package/dist/index228.js +246 -172
  114. package/dist/index228.js.map +1 -1
  115. package/dist/index229.js +195 -32
  116. package/dist/index229.js.map +1 -1
  117. package/dist/index230.js +12 -40
  118. package/dist/index230.js.map +1 -1
  119. package/dist/index231.js +23 -26
  120. package/dist/index231.js.map +1 -1
  121. package/dist/index232.js +45 -22
  122. package/dist/index232.js.map +1 -1
  123. package/dist/index233.js +27 -48
  124. package/dist/index233.js.map +1 -1
  125. package/dist/index234.js +52 -26
  126. package/dist/index234.js.map +1 -1
  127. package/dist/index235.js +40 -225
  128. package/dist/index235.js.map +1 -1
  129. package/dist/index236.js +217 -39
  130. package/dist/index236.js.map +1 -1
  131. package/dist/index237.js +50 -0
  132. package/dist/index237.js.map +1 -0
  133. package/dist/styles.css +1 -1
  134. package/dist/wc/AIToolCall.js +218 -0
  135. package/dist/wc/AIToolCall.js.map +1 -0
  136. package/dist/wc/hf-ai-tool-call.js +34 -219
  137. package/dist/wc/hf-ai-tool-call.js.map +1 -1
  138. package/dist/wc/hf-ai-tool-run.js +673 -576
  139. package/dist/wc/hf-ai-tool-run.js.map +1 -1
  140. package/dist/wc/workflow-step-renderer.js +94 -86
  141. package/dist/wc/workflow-step-renderer.js.map +1 -1
  142. package/dist/wc-react/AIToolCall.js +218 -0
  143. package/dist/wc-react/AIToolCall.js.map +1 -0
  144. package/dist/wc-react/hf-ai-tool-call.js +32 -217
  145. package/dist/wc-react/hf-ai-tool-call.js.map +1 -1
  146. package/dist/wc-react/hf-ai-tool-run.js +698 -601
  147. package/dist/wc-react/hf-ai-tool-run.js.map +1 -1
  148. package/dist/wc-react/workflow-step-renderer.js +76 -68
  149. package/dist/wc-react/workflow-step-renderer.js.map +1 -1
  150. package/package.json +1 -1
  151. package/skills/humain-ui/SKILL.md +1 -1
  152. package/skills/humain-ui-wc/SKILL.md +1 -1
  153. package/skills/humain-ui-wc.skill +0 -0
  154. package/skills/humain-ui.skill +0 -0
  155. package/dist/index182.js +0 -143
  156. package/dist/index182.js.map +0 -1
  157. package/dist/wc/wrench.js +0 -10
  158. package/dist/wc/wrench.js.map +0 -1
  159. package/dist/wc-react/wrench.js +0 -10
  160. package/dist/wc-react/wrench.js.map +0 -1
package/dist/index176.js CHANGED
@@ -1,192 +1,166 @@
1
1
  import { cn } from "./index2.js";
2
- import { Button } from "./index5.js";
2
+ import { WorkflowStepItem, WorkflowStepRenderer, WorkflowStepStatusIcon } from "./index175.js";
3
3
  import { cva } from "class-variance-authority";
4
- import { AlertCircle, AlertTriangle, CheckCircle, Info, X } from "lucide-react";
4
+ import { AlertCircle, Check, ChevronDown, ChevronRight, Clock } from "lucide-react";
5
5
  import * as React from "react";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
7
- import { AnimatePresence, motion } from "motion/react";
8
- //#region src/components/organisms/ai/AISystemMessage/AISystemMessage.tsx
9
- var systemMessageVariants = cva("flex items-start gap-3 px-4 py-3 rounded-xl border", {
10
- variants: {
11
- variant: {
12
- info: "bg-primary/10 border-primary text-primary",
13
- success: "bg-success/10 border-success/50 text-success",
14
- warning: "bg-warning/10 border-warning/50 text-warning",
15
- error: "bg-destructive/10 border-destructive/50 text-destructive",
16
- neutral: "bg-muted border-border text-secondary-foreground"
17
- },
18
- size: {
19
- sm: "px-3 py-2 text-xs",
20
- md: "px-4 py-3 text-sm",
21
- lg: "px-5 py-4 text-base"
22
- }
23
- },
24
- defaultVariants: {
25
- variant: "info",
26
- size: "md"
27
- }
7
+ import { AnimatePresence, motion, useReducedMotion } from "motion/react";
8
+ //#region src/components/organisms/ai/AISteps/AISteps.tsx
9
+ var stepsContainerVariants = cva("overflow-hidden rounded-xl border", {
10
+ variants: { variant: {
11
+ default: "border-border bg-background",
12
+ subtle: "border-border bg-muted"
13
+ } },
14
+ defaultVariants: { variant: "default" }
28
15
  });
29
- var systemMessageIconVariants = cva("shrink-0 mt-0.5", {
30
- variants: {
31
- variant: {
32
- info: "text-primary",
33
- success: "text-success",
34
- warning: "text-warning",
35
- error: "text-destructive",
36
- neutral: "text-text-quaternary"
37
- },
38
- size: {
39
- sm: "size-4",
40
- md: "size-5",
41
- lg: "size-6"
42
- }
43
- },
44
- defaultVariants: {
45
- variant: "info",
46
- size: "md"
47
- }
16
+ var stepItemVariants = cva("flex items-start gap-3 px-4 py-3 transition-colors", {
17
+ variants: { status: {
18
+ pending: "text-muted-foreground",
19
+ running: "text-primary",
20
+ completed: "text-success",
21
+ error: "text-destructive"
22
+ } },
23
+ defaultVariants: { status: "pending" }
48
24
  });
49
- var iconMap = {
50
- info: Info,
51
- success: CheckCircle,
52
- warning: AlertTriangle,
53
- error: AlertCircle,
54
- neutral: Info
25
+ var stepIconVariants = cva("size-5 shrink-0 flex items-center justify-center rounded-full", {
26
+ variants: { status: {
27
+ pending: "bg-accent text-muted-foreground",
28
+ running: "bg-primary/20 text-primary",
29
+ completed: "bg-success/20 text-success",
30
+ error: "bg-destructive/20 text-destructive"
31
+ } },
32
+ defaultVariants: { status: "pending" }
33
+ });
34
+ var WORKFLOW_STATUS_BY_STEP_STATUS = {
35
+ pending: "pending",
36
+ running: "running",
37
+ completed: "completed",
38
+ error: "error"
55
39
  };
56
- function AISystemMessage({ children, title, variant = "info", size = "md", dismissible = false, onDismiss, icon, hideIcon = false, actions, className }) {
57
- const [isVisible, setIsVisible] = React.useState(true);
58
- const handleDismiss = () => {
59
- setIsVisible(false);
60
- onDismiss?.();
40
+ function toWorkflowStepStatus(status) {
41
+ return WORKFLOW_STATUS_BY_STEP_STATUS[status];
42
+ }
43
+ function toWorkflowStep(step) {
44
+ const error = step.error?.trim() ? step.error : void 0;
45
+ return {
46
+ id: step.id,
47
+ title: step.title,
48
+ description: step.description,
49
+ status: toWorkflowStepStatus(step.status),
50
+ content: error === void 0 ? step.content : void 0,
51
+ durationMs: step.status === "completed" ? step.duration : void 0,
52
+ error
61
53
  };
62
- const IconComponent = iconMap[variant || "info"];
63
- return /* @__PURE__ */ jsx(AnimatePresence, { children: isVisible && /* @__PURE__ */ jsxs(motion.div, {
64
- "data-slot": "ai-system-message",
65
- role: "status",
66
- "aria-live": "polite",
67
- initial: {
68
- opacity: 0,
69
- y: -10
70
- },
71
- animate: {
72
- opacity: 1,
73
- y: 0
74
- },
75
- exit: {
76
- opacity: 0,
77
- y: -10,
78
- height: 0,
79
- marginBottom: 0
80
- },
81
- transition: {
82
- duration: .2,
83
- ease: [
84
- .4,
85
- 0,
86
- .2,
87
- 1
88
- ]
89
- },
90
- className: cn(systemMessageVariants({
91
- variant,
92
- size
93
- }), "motion-reduce:transition-none", className),
94
- children: [
95
- !hideIcon && /* @__PURE__ */ jsx("div", {
96
- className: systemMessageIconVariants({
97
- variant,
98
- size
99
- }),
100
- "aria-hidden": "true",
101
- children: icon || /* @__PURE__ */ jsx(IconComponent, { className: "size-full" })
102
- }),
103
- /* @__PURE__ */ jsxs("div", {
104
- className: "flex-1 min-w-0",
54
+ }
55
+ function StepIcon({ status, index, className }) {
56
+ return /* @__PURE__ */ jsx(WorkflowStepStatusIcon, {
57
+ status: toWorkflowStepStatus(status),
58
+ index,
59
+ className
60
+ });
61
+ }
62
+ StepIcon.displayName = "StepIcon";
63
+ function AIStepItem({ step, index, isLast, expandable = true, defaultExpanded = false }) {
64
+ const [expanded, setExpanded] = React.useState(defaultExpanded);
65
+ return /* @__PURE__ */ jsx(WorkflowStepItem, {
66
+ step: toWorkflowStep(step),
67
+ index,
68
+ isLast,
69
+ appearance: "contained",
70
+ itemSlot: "ai-step-item",
71
+ expandable,
72
+ expanded,
73
+ onExpandedChange: () => setExpanded((value) => !value)
74
+ });
75
+ }
76
+ AIStepItem.displayName = "AIStepItem";
77
+ /**
78
+ * AISteps displays a multi-step progress indicator for AI workflows.
79
+ * Shows step status (pending, running, complete, error) with expandable details and timing.
80
+ *
81
+ * @llms Multi-step AI progress with status icons, timing, expandable details
82
+ * @example
83
+ * ```tsx
84
+ * <AISteps
85
+ * title="Processing"
86
+ * steps={[
87
+ * { label: 'Analyzing', status: 'complete', duration: '2s' },
88
+ * { label: 'Generating', status: 'running' },
89
+ * ]}
90
+ * />
91
+ * ```
92
+ */
93
+ function AISteps({ steps, title, variant, collapsible = true, defaultExpanded = true, stepsExpandable = true, className }) {
94
+ const [isExpanded, setIsExpanded] = React.useState(defaultExpanded);
95
+ const prefersReducedMotion = useReducedMotion();
96
+ const completedCount = steps.filter((s) => s.status === "completed").length;
97
+ const totalCount = steps.length;
98
+ const hasError = steps.some((s) => s.status === "error");
99
+ const isRunning = steps.some((s) => s.status === "running");
100
+ return /* @__PURE__ */ jsxs("section", {
101
+ "data-slot": "ai-steps",
102
+ "aria-label": title || "Steps",
103
+ className: cn(stepsContainerVariants({ variant }), className),
104
+ children: [(title || collapsible) && /* @__PURE__ */ jsxs("button", {
105
+ type: "button",
106
+ onClick: () => collapsible && setIsExpanded(!isExpanded),
107
+ disabled: !collapsible,
108
+ "aria-expanded": collapsible ? isExpanded : void 0,
109
+ className: cn("flex items-center justify-between w-full px-4 py-3 border-b border-border", collapsible && "hover:bg-muted cursor-pointer", "focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-ring"),
110
+ children: [/* @__PURE__ */ jsxs("div", {
111
+ className: "flex items-center gap-2",
105
112
  children: [
106
- title && /* @__PURE__ */ jsx("p", {
107
- className: "font-medium mb-0.5",
108
- children: title
109
- }),
110
- /* @__PURE__ */ jsx("div", {
111
- className: cn(!title && "leading-snug"),
112
- children
113
+ isRunning && /* @__PURE__ */ jsx(Clock, { className: "size-4 text-primary animate-pulse motion-reduce:animate-none" }),
114
+ hasError && !isRunning && /* @__PURE__ */ jsx(AlertCircle, { className: "size-4 text-destructive" }),
115
+ !isRunning && !hasError && completedCount === totalCount && /* @__PURE__ */ jsx(Check, { className: "size-4 text-success" }),
116
+ /* @__PURE__ */ jsx("span", {
117
+ className: "text-sm font-medium text-foreground",
118
+ children: title || "Steps"
113
119
  }),
114
- actions && /* @__PURE__ */ jsx("div", {
115
- className: "flex items-center gap-2 mt-2",
116
- children: actions
120
+ /* @__PURE__ */ jsxs("span", {
121
+ className: "text-xs text-text-quaternary",
122
+ children: [
123
+ "(",
124
+ completedCount,
125
+ "/",
126
+ totalCount,
127
+ ")"
128
+ ]
117
129
  })
118
130
  ]
119
- }),
120
- dismissible && /* @__PURE__ */ jsx(Button, {
121
- appearance: "ghost",
122
- variant: "secondary",
123
- size: "sm",
124
- onClick: handleDismiss,
125
- "aria-label": "Dismiss message",
126
- className: "size-6 p-0 shrink-0 -mt-0.5 -me-1 hover:bg-foreground/5",
127
- children: /* @__PURE__ */ jsx(X, { className: "size-4" })
131
+ }), collapsible && /* @__PURE__ */ jsx("div", {
132
+ className: "shrink-0",
133
+ children: isExpanded ? /* @__PURE__ */ jsx(ChevronDown, { className: "size-4 text-muted-foreground" }) : /* @__PURE__ */ jsx(ChevronRight, { className: "size-4 text-muted-foreground rtl:rotate-180" })
134
+ })]
135
+ }), /* @__PURE__ */ jsx(AnimatePresence, {
136
+ initial: false,
137
+ children: isExpanded && /* @__PURE__ */ jsx(motion.div, {
138
+ initial: {
139
+ height: 0,
140
+ opacity: 0
141
+ },
142
+ animate: {
143
+ height: "auto",
144
+ opacity: 1
145
+ },
146
+ exit: {
147
+ height: 0,
148
+ opacity: 0
149
+ },
150
+ transition: { duration: prefersReducedMotion ? 0 : .2 },
151
+ className: "overflow-hidden",
152
+ children: /* @__PURE__ */ jsx(WorkflowStepRenderer, {
153
+ appearance: "contained",
154
+ steps: steps.map(toWorkflowStep),
155
+ itemSlot: "ai-step-item",
156
+ expandable: stepsExpandable
157
+ })
128
158
  })
129
- ]
130
- }) });
131
- }
132
- AISystemMessage.displayName = "AISystemMessage";
133
- function AISystemMessageBanner({ children, variant = "info", dismissible = false, onDismiss, icon, action, className }) {
134
- const [isVisible, setIsVisible] = React.useState(true);
135
- const handleDismiss = () => {
136
- setIsVisible(false);
137
- onDismiss?.();
138
- };
139
- const IconComponent = iconMap[variant || "info"];
140
- return /* @__PURE__ */ jsx(AnimatePresence, { children: isVisible && /* @__PURE__ */ jsxs(motion.div, {
141
- "data-slot": "ai-system-message-banner",
142
- role: "status",
143
- "aria-live": "polite",
144
- initial: {
145
- opacity: 0,
146
- height: 0
147
- },
148
- animate: {
149
- opacity: 1,
150
- height: "auto"
151
- },
152
- exit: {
153
- opacity: 0,
154
- height: 0
155
- },
156
- transition: {
157
- duration: .2,
158
- ease: [
159
- .4,
160
- 0,
161
- .2,
162
- 1
163
- ]
164
- },
165
- className: cn("w-full px-4 py-2 flex items-center justify-center gap-3 motion-reduce:transition-none", variant === "info" && "bg-primary/10 text-primary", variant === "success" && "bg-success/10 text-success", variant === "warning" && "bg-warning/10 text-warning", variant === "error" && "bg-destructive/10 text-destructive", variant === "neutral" && "bg-muted text-secondary-foreground", className),
166
- children: [/* @__PURE__ */ jsxs("div", {
167
- className: "flex items-center gap-2 flex-1 justify-center",
168
- children: [
169
- icon || /* @__PURE__ */ jsx(IconComponent, {
170
- "aria-hidden": "true",
171
- className: cn("size-4 shrink-0", variant === "info" && "text-primary", variant === "success" && "text-success", variant === "warning" && "text-warning", variant === "error" && "text-destructive", variant === "neutral" && "text-text-quaternary")
172
- }),
173
- /* @__PURE__ */ jsx("span", {
174
- className: "text-sm",
175
- children
176
- }),
177
- action
178
- ]
179
- }), dismissible && /* @__PURE__ */ jsx("button", {
180
- type: "button",
181
- onClick: handleDismiss,
182
- "aria-label": "Dismiss banner",
183
- className: "p-1 rounded hover:bg-foreground/5 transition-colors focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring",
184
- children: /* @__PURE__ */ jsx(X, { className: "size-4" })
185
159
  })]
186
- }) });
160
+ });
187
161
  }
188
- AISystemMessageBanner.displayName = "AISystemMessageBanner";
162
+ AISteps.displayName = "AISteps";
189
163
  //#endregion
190
- export { AISystemMessage, AISystemMessageBanner, systemMessageIconVariants, systemMessageVariants };
164
+ export { AIStepItem, AISteps, StepIcon, stepIconVariants, stepItemVariants, stepsContainerVariants };
191
165
 
192
166
  //# sourceMappingURL=index176.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index176.js","names":[],"sources":["../src/components/organisms/ai/AISystemMessage/AISystemMessage.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport { AlertCircle, AlertTriangle, CheckCircle, Info, X } from 'lucide-react';\nimport { AnimatePresence, motion } from 'motion/react';\nimport * as React from 'react';\nimport { Button } from '@/components/atoms/buttons/Button';\nimport { cn } from '@/lib/utils';\n\n// =============================================================================\n// Variants\n// =============================================================================\n\nconst systemMessageVariants = cva(\n 'flex items-start gap-3 px-4 py-3 rounded-xl border',\n {\n variants: {\n variant: {\n info: 'bg-primary/10 border-primary text-primary',\n success: 'bg-success/10 border-success/50 text-success',\n warning: 'bg-warning/10 border-warning/50 text-warning',\n error: 'bg-destructive/10 border-destructive/50 text-destructive',\n neutral: 'bg-muted border-border text-secondary-foreground',\n },\n size: {\n sm: 'px-3 py-2 text-xs',\n md: 'px-4 py-3 text-sm',\n lg: 'px-5 py-4 text-base',\n },\n },\n defaultVariants: {\n variant: 'info',\n size: 'md',\n },\n },\n);\n\nconst systemMessageIconVariants = cva('shrink-0 mt-0.5', {\n variants: {\n variant: {\n info: 'text-primary',\n success: 'text-success',\n warning: 'text-warning',\n error: 'text-destructive',\n neutral: 'text-text-quaternary',\n },\n size: {\n sm: 'size-4',\n md: 'size-5',\n lg: 'size-6',\n },\n },\n defaultVariants: {\n variant: 'info',\n size: 'md',\n },\n});\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type SystemMessageVariant =\n | 'info'\n | 'success'\n | 'warning'\n | 'error'\n | 'neutral';\n\n// =============================================================================\n// Icon Map\n// =============================================================================\n\nconst iconMap = {\n info: Info,\n success: CheckCircle,\n warning: AlertTriangle,\n error: AlertCircle,\n neutral: Info,\n};\n\n// =============================================================================\n// Main AISystemMessage Component\n// =============================================================================\n\nexport interface AISystemMessageProps\n extends VariantProps<typeof systemMessageVariants> {\n /** Message content */\n children: React.ReactNode;\n /** Title for the message */\n title?: string;\n /** Whether the message can be dismissed */\n dismissible?: boolean;\n /** Callback when dismissed */\n onDismiss?: () => void;\n /** Custom icon */\n icon?: React.ReactNode;\n /** Hide the icon */\n hideIcon?: boolean;\n /** Actions to display */\n actions?: React.ReactNode;\n /** Additional class name */\n className?: string;\n}\n\nfunction AISystemMessage({\n children,\n title,\n variant = 'info',\n size = 'md',\n dismissible = false,\n onDismiss,\n icon,\n hideIcon = false,\n actions,\n className,\n}: AISystemMessageProps) {\n const [isVisible, setIsVisible] = React.useState(true);\n\n const handleDismiss = () => {\n setIsVisible(false);\n onDismiss?.();\n };\n\n const IconComponent = iconMap[variant || 'info'];\n\n return (\n <AnimatePresence>\n {isVisible && (\n <motion.div\n data-slot=\"ai-system-message\"\n role=\"status\"\n aria-live=\"polite\"\n initial={{ opacity: 0, y: -10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -10, height: 0, marginBottom: 0 }}\n transition={{ duration: 0.2, ease: [0.4, 0, 0.2, 1] }}\n className={cn(\n systemMessageVariants({ variant, size }),\n 'motion-reduce:transition-none',\n className,\n )}\n >\n {/* Icon */}\n {!hideIcon && (\n <div\n className={systemMessageIconVariants({ variant, size })}\n aria-hidden=\"true\"\n >\n {icon || <IconComponent className=\"size-full\" />}\n </div>\n )}\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n {title && <p className=\"font-medium mb-0.5\">{title}</p>}\n <div className={cn(!title && 'leading-snug')}>{children}</div>\n\n {/* Actions */}\n {actions && (\n <div className=\"flex items-center gap-2 mt-2\">{actions}</div>\n )}\n </div>\n\n {/* Dismiss button */}\n {dismissible && (\n <Button\n appearance=\"ghost\"\n variant=\"secondary\"\n size=\"sm\"\n onClick={handleDismiss}\n aria-label=\"Dismiss message\"\n className=\"size-6 p-0 shrink-0 -mt-0.5 -me-1 hover:bg-foreground/5\"\n >\n <X className=\"size-4\" />\n </Button>\n )}\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n\nAISystemMessage.displayName = 'AISystemMessage';\n\n// =============================================================================\n// System Message Banner (Full-width variant)\n// =============================================================================\n\nexport interface AISystemMessageBannerProps\n extends VariantProps<typeof systemMessageVariants> {\n /** Message content */\n children: React.ReactNode;\n /** Whether the banner can be dismissed */\n dismissible?: boolean;\n /** Callback when dismissed */\n onDismiss?: () => void;\n /** Custom icon */\n icon?: React.ReactNode;\n /** Action button */\n action?: React.ReactNode;\n /** Additional class name */\n className?: string;\n}\n\nfunction AISystemMessageBanner({\n children,\n variant = 'info',\n dismissible = false,\n onDismiss,\n icon,\n action,\n className,\n}: AISystemMessageBannerProps) {\n const [isVisible, setIsVisible] = React.useState(true);\n\n const handleDismiss = () => {\n setIsVisible(false);\n onDismiss?.();\n };\n\n const IconComponent = iconMap[variant || 'info'];\n\n return (\n <AnimatePresence>\n {isVisible && (\n <motion.div\n data-slot=\"ai-system-message-banner\"\n role=\"status\"\n aria-live=\"polite\"\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: 'auto' }}\n exit={{ opacity: 0, height: 0 }}\n transition={{ duration: 0.2, ease: [0.4, 0, 0.2, 1] }}\n className={cn(\n 'w-full px-4 py-2 flex items-center justify-center gap-3 motion-reduce:transition-none',\n variant === 'info' && 'bg-primary/10 text-primary',\n variant === 'success' && 'bg-success/10 text-success',\n variant === 'warning' && 'bg-warning/10 text-warning',\n variant === 'error' && 'bg-destructive/10 text-destructive',\n variant === 'neutral' && 'bg-muted text-secondary-foreground',\n className,\n )}\n >\n <div className=\"flex items-center gap-2 flex-1 justify-center\">\n {icon || (\n <IconComponent\n aria-hidden=\"true\"\n className={cn(\n 'size-4 shrink-0',\n variant === 'info' && 'text-primary',\n variant === 'success' && 'text-success',\n variant === 'warning' && 'text-warning',\n variant === 'error' && 'text-destructive',\n variant === 'neutral' && 'text-text-quaternary',\n )}\n />\n )}\n <span className=\"text-sm\">{children}</span>\n {action}\n </div>\n\n {dismissible && (\n <button\n type=\"button\"\n onClick={handleDismiss}\n aria-label=\"Dismiss banner\"\n className=\"p-1 rounded hover:bg-foreground/5 transition-colors focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring\"\n >\n <X className=\"size-4\" />\n </button>\n )}\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n\nAISystemMessageBanner.displayName = 'AISystemMessageBanner';\n\nexport {\n AISystemMessage,\n AISystemMessageBanner,\n systemMessageIconVariants,\n systemMessageVariants,\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index176.js","names":[],"sources":["../src/components/organisms/ai/AISteps/AISteps.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport {\n AlertCircle,\n Check,\n ChevronDown,\n ChevronRight,\n Clock,\n} from 'lucide-react';\nimport { AnimatePresence, motion, useReducedMotion } from 'motion/react';\nimport * as React from 'react';\nimport { cn } from '@/lib/utils';\nimport {\n WorkflowStepItem,\n WorkflowStepRenderer,\n type WorkflowStepStatus,\n WorkflowStepStatusIcon,\n type WorkflowStepViewModel,\n} from '../_shared/workflow-step-renderer';\n\n// =============================================================================\n// Variants\n// =============================================================================\n\nconst stepsContainerVariants = cva('overflow-hidden rounded-xl border', {\n variants: {\n variant: {\n default: 'border-border bg-background',\n subtle: 'border-border bg-muted',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n});\n\nconst stepItemVariants = cva(\n 'flex items-start gap-3 px-4 py-3 transition-colors',\n {\n variants: {\n status: {\n pending: 'text-muted-foreground',\n running: 'text-primary',\n completed: 'text-success',\n error: 'text-destructive',\n },\n },\n defaultVariants: {\n status: 'pending',\n },\n },\n);\n\nconst stepIconVariants = cva(\n 'size-5 shrink-0 flex items-center justify-center rounded-full',\n {\n variants: {\n status: {\n pending: 'bg-accent text-muted-foreground',\n running: 'bg-primary/20 text-primary',\n completed: 'bg-success/20 text-success',\n error: 'bg-destructive/20 text-destructive',\n },\n },\n defaultVariants: {\n status: 'pending',\n },\n },\n);\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type StepStatus = 'pending' | 'running' | 'completed' | 'error';\n\nexport interface StepData {\n /** Unique step ID */\n id: string;\n /** Step title */\n title: string;\n /** Step description */\n description?: string;\n /** Step status */\n status: StepStatus;\n /** Optional content to show when expanded */\n content?: React.ReactNode;\n /** Duration in ms (for completed steps) */\n duration?: number;\n /** Error message if status is error */\n error?: string;\n}\n\ntype AIStepsWorkflowStatus = Exclude<WorkflowStepStatus, 'suspended'>;\n\nconst WORKFLOW_STATUS_BY_STEP_STATUS = {\n pending: 'pending',\n running: 'running',\n completed: 'completed',\n error: 'error',\n} as const satisfies Record<StepStatus, AIStepsWorkflowStatus>;\n\nfunction toWorkflowStepStatus(status: StepStatus): AIStepsWorkflowStatus {\n return WORKFLOW_STATUS_BY_STEP_STATUS[status];\n}\n\nfunction toWorkflowStep(step: StepData): WorkflowStepViewModel {\n const error = step.error?.trim() ? step.error : undefined;\n\n return {\n id: step.id,\n title: step.title,\n description: step.description,\n status: toWorkflowStepStatus(step.status),\n content: error === undefined ? step.content : undefined,\n durationMs: step.status === 'completed' ? step.duration : undefined,\n error,\n };\n}\n\n// =============================================================================\n// Step Icon Component\n// =============================================================================\n\ninterface StepIconProps {\n status: StepStatus;\n index: number;\n className?: string;\n}\n\nfunction StepIcon({ status, index, className }: StepIconProps) {\n return (\n <WorkflowStepStatusIcon\n status={toWorkflowStepStatus(status)}\n index={index}\n className={className}\n />\n );\n}\n\nStepIcon.displayName = 'StepIcon';\n\n// =============================================================================\n// Single Step Item\n// =============================================================================\n\ninterface AIStepItemProps {\n step: StepData;\n index: number;\n isLast: boolean;\n expandable?: boolean;\n defaultExpanded?: boolean;\n}\n\nfunction AIStepItem({\n step,\n index,\n isLast,\n expandable = true,\n defaultExpanded = false,\n}: AIStepItemProps) {\n const [expanded, setExpanded] = React.useState(defaultExpanded);\n\n return (\n <WorkflowStepItem\n step={toWorkflowStep(step)}\n index={index}\n isLast={isLast}\n appearance=\"contained\"\n itemSlot=\"ai-step-item\"\n expandable={expandable}\n expanded={expanded}\n onExpandedChange={() => setExpanded((value) => !value)}\n />\n );\n}\n\nAIStepItem.displayName = 'AIStepItem';\n\n// =============================================================================\n// Main AISteps Component\n// =============================================================================\n\nexport interface AIStepsProps\n extends VariantProps<typeof stepsContainerVariants> {\n /** Array of steps */\n steps: StepData[];\n /** Title for the steps container */\n title?: string;\n /** Whether the container is collapsible */\n collapsible?: boolean;\n /** Whether the container is expanded by default */\n defaultExpanded?: boolean;\n /** Whether individual steps are expandable */\n stepsExpandable?: boolean;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * AISteps displays a multi-step progress indicator for AI workflows.\n * Shows step status (pending, running, complete, error) with expandable details and timing.\n *\n * @llms Multi-step AI progress with status icons, timing, expandable details\n * @example\n * ```tsx\n * <AISteps\n * title=\"Processing\"\n * steps={[\n * { label: 'Analyzing', status: 'complete', duration: '2s' },\n * { label: 'Generating', status: 'running' },\n * ]}\n * />\n * ```\n */\nexport function AISteps({\n steps,\n title,\n variant,\n collapsible = true,\n defaultExpanded = true,\n stepsExpandable = true,\n className,\n}: AIStepsProps) {\n const [isExpanded, setIsExpanded] = React.useState(defaultExpanded);\n const prefersReducedMotion = useReducedMotion();\n\n // Calculate summary stats\n const completedCount = steps.filter((s) => s.status === 'completed').length;\n const totalCount = steps.length;\n const hasError = steps.some((s) => s.status === 'error');\n const isRunning = steps.some((s) => s.status === 'running');\n\n return (\n <section\n data-slot=\"ai-steps\"\n aria-label={title || 'Steps'}\n className={cn(stepsContainerVariants({ variant }), className)}\n >\n {/* Header */}\n {(title || collapsible) && (\n <button\n type=\"button\"\n onClick={() => collapsible && setIsExpanded(!isExpanded)}\n disabled={!collapsible}\n aria-expanded={collapsible ? isExpanded : undefined}\n className={cn(\n 'flex items-center justify-between w-full px-4 py-3 border-b border-border',\n collapsible && 'hover:bg-muted cursor-pointer',\n 'focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-ring',\n )}\n >\n <div className=\"flex items-center gap-2\">\n {isRunning && (\n <Clock className=\"size-4 text-primary animate-pulse motion-reduce:animate-none\" />\n )}\n {hasError && !isRunning && (\n <AlertCircle className=\"size-4 text-destructive\" />\n )}\n {!isRunning && !hasError && completedCount === totalCount && (\n <Check className=\"size-4 text-success\" />\n )}\n <span className=\"text-sm font-medium text-foreground\">\n {title || 'Steps'}\n </span>\n <span className=\"text-xs text-text-quaternary\">\n ({completedCount}/{totalCount})\n </span>\n </div>\n\n {collapsible && (\n <div className=\"shrink-0\">\n {isExpanded ? (\n <ChevronDown className=\"size-4 text-muted-foreground\" />\n ) : (\n <ChevronRight className=\"size-4 text-muted-foreground rtl:rotate-180\" />\n )}\n </div>\n )}\n </button>\n )}\n\n {/* Steps List */}\n <AnimatePresence initial={false}>\n {isExpanded && (\n <motion.div\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: 'auto', opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={{ duration: prefersReducedMotion ? 0 : 0.2 }}\n className=\"overflow-hidden\"\n >\n <WorkflowStepRenderer\n appearance=\"contained\"\n steps={steps.map(toWorkflowStep)}\n itemSlot=\"ai-step-item\"\n expandable={stepsExpandable}\n />\n </motion.div>\n )}\n </AnimatePresence>\n </section>\n );\n}\n\nAISteps.displayName = 'AISteps';\n\nexport {\n AIStepItem,\n StepIcon,\n stepIconVariants,\n stepItemVariants,\n stepsContainerVariants,\n};\n"],"mappings":"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"}