@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.
- package/dist/components/organisms/ai/AIToolCall/AIToolCall.d.ts +9 -3
- package/dist/components/organisms/ai/AIToolRun/index.d.ts +1 -1
- package/dist/components/organisms/ai/AIToolRun/validation.d.ts +24 -3
- package/dist/components/organisms/ai/_shared/format-ai-duration.d.ts +1 -0
- package/dist/components/organisms/ai/_shared/workflow-step-renderer.d.ts +1 -0
- package/dist/index.js +52 -52
- package/dist/index151.js +1 -1
- package/dist/index174.js +10 -333
- package/dist/index174.js.map +1 -1
- package/dist/index175.js +310 -137
- package/dist/index175.js.map +1 -1
- package/dist/index176.js +148 -174
- package/dist/index176.js.map +1 -1
- package/dist/index177.js +186 -78
- package/dist/index177.js.map +1 -1
- package/dist/index178.js +74 -124
- package/dist/index178.js.map +1 -1
- package/dist/index179.js +133 -1
- package/dist/index179.js.map +1 -0
- package/dist/index180.js +2 -201
- package/dist/index181.js +201 -0
- package/dist/{index180.js.map → index181.js.map} +1 -1
- package/dist/index183.js +130 -166
- package/dist/index183.js.map +1 -1
- package/dist/index184.js +195 -983
- package/dist/index184.js.map +1 -1
- package/dist/index185.js +1069 -369
- package/dist/index185.js.map +1 -1
- package/dist/index186.js +395 -197
- package/dist/index186.js.map +1 -1
- package/dist/index187.js +198 -243
- package/dist/index187.js.map +1 -1
- package/dist/index188.js +263 -3
- package/dist/index188.js.map +1 -1
- package/dist/index189.js +3 -209
- package/dist/index189.js.map +1 -1
- package/dist/index190.js +190 -777
- package/dist/index190.js.map +1 -1
- package/dist/index191.js +771 -252
- package/dist/index191.js.map +1 -1
- package/dist/index192.js +250 -65
- package/dist/index192.js.map +1 -1
- package/dist/index193.js +72 -523
- package/dist/index193.js.map +1 -1
- package/dist/index194.js +537 -144
- package/dist/index194.js.map +1 -1
- package/dist/index195.js +139 -720
- package/dist/index195.js.map +1 -1
- package/dist/index196.js +707 -167
- package/dist/index196.js.map +1 -1
- package/dist/index197.js +175 -151
- package/dist/index197.js.map +1 -1
- package/dist/index198.js +152 -487
- package/dist/index198.js.map +1 -1
- package/dist/index199.js +472 -225
- package/dist/index199.js.map +1 -1
- package/dist/index200.js +236 -260
- package/dist/index200.js.map +1 -1
- package/dist/index201.js +265 -215
- package/dist/index201.js.map +1 -1
- package/dist/index202.js +207 -307
- package/dist/index202.js.map +1 -1
- package/dist/index203.js +302 -135
- package/dist/index203.js.map +1 -1
- package/dist/index204.js +140 -271
- package/dist/index204.js.map +1 -1
- package/dist/index205.js +263 -253
- package/dist/index205.js.map +1 -1
- package/dist/index206.js +244 -137
- package/dist/index206.js.map +1 -1
- package/dist/index207.js +100 -238
- package/dist/index207.js.map +1 -1
- package/dist/index208.js +278 -74
- package/dist/index208.js.map +1 -1
- package/dist/index209.js +56 -97
- package/dist/index209.js.map +1 -1
- package/dist/index210.js +142 -47
- package/dist/index210.js.map +1 -1
- package/dist/index211.js +38 -84
- package/dist/index211.js.map +1 -1
- package/dist/index212.js +72 -252
- package/dist/index212.js.map +1 -1
- package/dist/index213.js +274 -26
- package/dist/index213.js.map +1 -1
- package/dist/index214.js +29 -94
- package/dist/index214.js.map +1 -1
- package/dist/index215.js +98 -25
- package/dist/index215.js.map +1 -1
- package/dist/index216.js +20 -565
- package/dist/index216.js.map +1 -1
- package/dist/index217.js +564 -17
- package/dist/index217.js.map +1 -1
- package/dist/index218.js +20 -23
- package/dist/index218.js.map +1 -1
- package/dist/index219.js +20 -95
- package/dist/index219.js.map +1 -1
- package/dist/index220.js +92 -88
- package/dist/index220.js.map +1 -1
- package/dist/index221.js +97 -29
- package/dist/index221.js.map +1 -1
- package/dist/index222.js +24 -470
- package/dist/index222.js.map +1 -1
- package/dist/index223.js +446 -196
- package/dist/index223.js.map +1 -1
- package/dist/index224.js +199 -729
- package/dist/index224.js.map +1 -1
- package/dist/index225.js +750 -61
- package/dist/index225.js.map +1 -1
- package/dist/index226.js +58 -181
- package/dist/index226.js.map +1 -1
- package/dist/index227.js +175 -259
- package/dist/index227.js.map +1 -1
- package/dist/index228.js +246 -172
- package/dist/index228.js.map +1 -1
- package/dist/index229.js +195 -32
- package/dist/index229.js.map +1 -1
- package/dist/index230.js +12 -40
- package/dist/index230.js.map +1 -1
- package/dist/index231.js +23 -26
- package/dist/index231.js.map +1 -1
- package/dist/index232.js +45 -22
- package/dist/index232.js.map +1 -1
- package/dist/index233.js +27 -48
- package/dist/index233.js.map +1 -1
- package/dist/index234.js +52 -26
- package/dist/index234.js.map +1 -1
- package/dist/index235.js +40 -225
- package/dist/index235.js.map +1 -1
- package/dist/index236.js +217 -39
- package/dist/index236.js.map +1 -1
- package/dist/index237.js +50 -0
- package/dist/index237.js.map +1 -0
- package/dist/styles.css +1 -1
- package/dist/wc/AIToolCall.js +218 -0
- package/dist/wc/AIToolCall.js.map +1 -0
- package/dist/wc/hf-ai-tool-call.js +34 -219
- package/dist/wc/hf-ai-tool-call.js.map +1 -1
- package/dist/wc/hf-ai-tool-run.js +673 -576
- package/dist/wc/hf-ai-tool-run.js.map +1 -1
- package/dist/wc/workflow-step-renderer.js +94 -86
- package/dist/wc/workflow-step-renderer.js.map +1 -1
- package/dist/wc-react/AIToolCall.js +218 -0
- package/dist/wc-react/AIToolCall.js.map +1 -0
- package/dist/wc-react/hf-ai-tool-call.js +32 -217
- package/dist/wc-react/hf-ai-tool-call.js.map +1 -1
- package/dist/wc-react/hf-ai-tool-run.js +698 -601
- package/dist/wc-react/hf-ai-tool-run.js.map +1 -1
- package/dist/wc-react/workflow-step-renderer.js +76 -68
- package/dist/wc-react/workflow-step-renderer.js.map +1 -1
- package/package.json +1 -1
- package/skills/humain-ui/SKILL.md +1 -1
- package/skills/humain-ui-wc/SKILL.md +1 -1
- package/skills/humain-ui-wc.skill +0 -0
- package/skills/humain-ui.skill +0 -0
- package/dist/index182.js +0 -143
- package/dist/index182.js.map +0 -1
- package/dist/wc/wrench.js +0 -10
- package/dist/wc/wrench.js.map +0 -1
- package/dist/wc-react/wrench.js +0 -10
- 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 {
|
|
2
|
+
import { WorkflowStepItem, WorkflowStepRenderer, WorkflowStepStatusIcon } from "./index175.js";
|
|
3
3
|
import { cva } from "class-variance-authority";
|
|
4
|
-
import { AlertCircle,
|
|
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/
|
|
9
|
-
var
|
|
10
|
-
variants: {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
|
30
|
-
variants: {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
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
|
-
|
|
115
|
-
className: "
|
|
116
|
-
children:
|
|
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
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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
|
-
|
|
162
|
+
AISteps.displayName = "AISteps";
|
|
189
163
|
//#endregion
|
|
190
|
-
export {
|
|
164
|
+
export { AIStepItem, AISteps, StepIcon, stepIconVariants, stepItemVariants, stepsContainerVariants };
|
|
191
165
|
|
|
192
166
|
//# sourceMappingURL=index176.js.map
|
package/dist/index176.js.map
CHANGED
|
@@ -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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"}
|