@axis-ds/agentic-ui 1.7.0 → 1.8.1
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/README.md +5 -3
- package/dist/agent-avatar/index.js +3 -3
- package/dist/agent-avatar/index.mjs +3 -3
- package/dist/approval-card/index.js +2 -2
- package/dist/approval-card/index.mjs +2 -2
- package/dist/attachment-card/index.js +1 -1
- package/dist/attachment-card/index.mjs +1 -1
- package/dist/code-block/index.js +6 -3
- package/dist/code-block/index.mjs +6 -3
- package/dist/context-panel/index.js +2 -2
- package/dist/context-panel/index.mjs +2 -2
- package/dist/diff-viewer/index.js +18 -12
- package/dist/diff-viewer/index.mjs +18 -12
- package/dist/feedback-buttons/index.js +2 -2
- package/dist/feedback-buttons/index.mjs +2 -2
- package/dist/message-bubble/index.d.mts +18 -1
- package/dist/message-bubble/index.d.ts +18 -1
- package/dist/message-bubble/index.js +33 -5
- package/dist/message-bubble/index.mjs +23 -5
- package/dist/plan-card/index.js +6 -6
- package/dist/plan-card/index.mjs +6 -6
- package/dist/recovery-banner/index.js +3 -3
- package/dist/recovery-banner/index.mjs +3 -3
- package/dist/run-progress/index.js +1 -1
- package/dist/run-progress/index.mjs +1 -1
- package/dist/step-timeline/index.d.mts +16 -1
- package/dist/step-timeline/index.d.ts +16 -1
- package/dist/step-timeline/index.js +34 -3
- package/dist/step-timeline/index.mjs +24 -3
- package/dist/token-usage-indicator/index.js +2 -2
- package/dist/token-usage-indicator/index.mjs +2 -2
- package/dist/tool-call-card/index.js +5 -5
- package/dist/tool-call-card/index.mjs +5 -5
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -68,11 +68,13 @@ export default function Page() {
|
|
|
68
68
|
}
|
|
69
69
|
```
|
|
70
70
|
|
|
71
|
-
**클라이언트 경계가 있는 컴포넌트**: 아래
|
|
71
|
+
**클라이언트 경계가 있는 컴포넌트**: 아래 9개는 패키지 `dist` 파일에 `"use client"` 가 있어, 서버 컴포넌트가 렌더하면 그 컴포넌트만 브라우저에서 hydrate 됩니다(복사 · 펼침 · 보기 모드 전환 · 피드백 선택 · 타이핑 애니메이션 · 하이드레이션 뒤 시각 표시).
|
|
72
72
|
|
|
73
|
-
`CodeBlock` · `ContextPanel` · `DiffViewer` · `FeedbackButtons` · `SourcePanel` · `StreamingText` · `ToolCallCard`
|
|
73
|
+
`CodeBlock` · `ContextPanel` · `DiffViewer` · `FeedbackButtons` · `MessageBubble` · `SourcePanel` · `StepTimeline` · `StreamingText` · `ToolCallCard`
|
|
74
74
|
|
|
75
|
-
|
|
75
|
+
`MessageBubble` · `StepTimeline` 은 1.8.0 부터 클라이언트 경계가 있습니다(WI-0069). 서버와 브라우저의 시간대가 달라 생기는 하이드레이션 오류를 막으려고, `timeZone`(StepTimeline 은 `locale` 도) 을 주지 않으면 시각을 하이드레이션 뒤에 브라우저 시간대로 채웁니다. 서버 렌더부터 시각을 보이려면 `timeZone="Asia/Seoul"` 처럼 시간대를 지정하세요. `formatTime` 은 함수라 서버 컴포넌트에서는 넘길 수 없습니다.
|
|
76
|
+
|
|
77
|
+
나머지 9개(`AgentAvatar` · `ApprovalCard` · `AttachmentCard` · `PlanCard` · `RecoveryBanner` · `RunProgress` · `SurfaceRenderer` · `ThinkingIndicator` · `TokenUsageIndicator`)와 루트 배럴에는 지시문이 없어 서버에서 렌더됩니다. 판단 기준은 `useState` · `useEffect` · `useRef` 같은 클라이언트 전용 API 와 컴포넌트 안에서 이벤트 핸들러를 직접 만드는지이며, 목록은 패키지 소스 `scripts/client-modules.mjs` 한 곳에서 관리합니다.
|
|
76
78
|
|
|
77
79
|
**서버 컴포넌트에서 함수 prop 은 넘길 수 없습니다**: `onCopy` · `onFeedback` · `onComplete` · `onRetry` · `onApprove` 같은 함수는 서버에서 클라이언트로 직렬화할 수 없어 React 가 오류를 냅니다(React Server Components 규칙). 함수 prop 없이 쓰면 서버에서 렌더되고, 핸들러가 필요하면 그 부분을 `"use client"` 파일로 만들어 그 안에서 씁니다.
|
|
78
80
|
|
|
@@ -31,9 +31,9 @@ const sizeStyles = {
|
|
|
31
31
|
xl: "w-12 h-12 text-lg"
|
|
32
32
|
};
|
|
33
33
|
const statusStyles = {
|
|
34
|
-
online: "bg-[var(--axis-
|
|
35
|
-
busy: "bg-[var(--axis-
|
|
36
|
-
offline: "bg-[var(--axis-
|
|
34
|
+
online: "bg-[var(--axis-text-success)]",
|
|
35
|
+
busy: "bg-[var(--axis-text-warning)]",
|
|
36
|
+
offline: "bg-[var(--axis-text-tertiary)]"
|
|
37
37
|
};
|
|
38
38
|
const typeColors = {
|
|
39
39
|
assistant: "bg-[var(--axis-agent-avatar-assistant)]",
|
|
@@ -8,9 +8,9 @@ const sizeStyles = {
|
|
|
8
8
|
xl: "w-12 h-12 text-lg"
|
|
9
9
|
};
|
|
10
10
|
const statusStyles = {
|
|
11
|
-
online: "bg-[var(--axis-
|
|
12
|
-
busy: "bg-[var(--axis-
|
|
13
|
-
offline: "bg-[var(--axis-
|
|
11
|
+
online: "bg-[var(--axis-text-success)]",
|
|
12
|
+
busy: "bg-[var(--axis-text-warning)]",
|
|
13
|
+
offline: "bg-[var(--axis-text-tertiary)]"
|
|
14
14
|
};
|
|
15
15
|
const typeColors = {
|
|
16
16
|
assistant: "bg-[var(--axis-agent-avatar-assistant)]",
|
|
@@ -43,12 +43,12 @@ const severityStyles = {
|
|
|
43
43
|
},
|
|
44
44
|
warning: {
|
|
45
45
|
border: "border-l-[var(--axis-status-warning)]",
|
|
46
|
-
icon: "text-[var(--axis-
|
|
46
|
+
icon: "text-[var(--axis-text-warning)]",
|
|
47
47
|
bg: "bg-[var(--axis-surface-warning)]"
|
|
48
48
|
},
|
|
49
49
|
error: {
|
|
50
50
|
border: "border-l-[var(--axis-status-error)]",
|
|
51
|
-
icon: "text-[var(--axis-
|
|
51
|
+
icon: "text-[var(--axis-text-error)]",
|
|
52
52
|
bg: "bg-[var(--axis-surface-error)]"
|
|
53
53
|
}
|
|
54
54
|
};
|
|
@@ -10,12 +10,12 @@ const severityStyles = {
|
|
|
10
10
|
},
|
|
11
11
|
warning: {
|
|
12
12
|
border: "border-l-[var(--axis-status-warning)]",
|
|
13
|
-
icon: "text-[var(--axis-
|
|
13
|
+
icon: "text-[var(--axis-text-warning)]",
|
|
14
14
|
bg: "bg-[var(--axis-surface-warning)]"
|
|
15
15
|
},
|
|
16
16
|
error: {
|
|
17
17
|
border: "border-l-[var(--axis-status-error)]",
|
|
18
|
-
icon: "text-[var(--axis-
|
|
18
|
+
icon: "text-[var(--axis-text-error)]",
|
|
19
19
|
bg: "bg-[var(--axis-surface-error)]"
|
|
20
20
|
}
|
|
21
21
|
};
|
|
@@ -56,7 +56,7 @@ function AttachmentCard({
|
|
|
56
56
|
className: (0, import_ui_react.cn)(
|
|
57
57
|
"flex items-center gap-3 rounded-lg border p-3",
|
|
58
58
|
"bg-[var(--axis-surface-default)] border-[var(--axis-border-default)]",
|
|
59
|
-
status === "error" && "border-[var(--axis-
|
|
59
|
+
status === "error" && "border-[var(--axis-border-error)]",
|
|
60
60
|
className
|
|
61
61
|
),
|
|
62
62
|
children: [
|
|
@@ -33,7 +33,7 @@ function AttachmentCard({
|
|
|
33
33
|
className: cn(
|
|
34
34
|
"flex items-center gap-3 rounded-lg border p-3",
|
|
35
35
|
"bg-[var(--axis-surface-default)] border-[var(--axis-border-default)]",
|
|
36
|
-
status === "error" && "border-[var(--axis-
|
|
36
|
+
status === "error" && "border-[var(--axis-border-error)]",
|
|
37
37
|
className
|
|
38
38
|
),
|
|
39
39
|
children: [
|
package/dist/code-block/index.js
CHANGED
|
@@ -67,7 +67,7 @@ function CodeBlock({
|
|
|
67
67
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center justify-between px-3 py-2 border-b border-[var(--axis-border-default)] bg-[var(--axis-surface-secondary)]", children: [
|
|
68
68
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2 min-w-0", children: [
|
|
69
69
|
filename && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("code", { className: "text-xs font-mono text-[var(--axis-text-primary)] truncate", children: filename }),
|
|
70
|
-
language && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-xs px-1.5 py-0.5 rounded bg-[var(--axis-surface-tertiary)] text-[var(--axis-text-
|
|
70
|
+
language && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-xs px-1.5 py-0.5 rounded bg-[var(--axis-surface-tertiary)] text-[var(--axis-text-secondary)]", children: language })
|
|
71
71
|
] }),
|
|
72
72
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
73
73
|
"button",
|
|
@@ -76,7 +76,7 @@ function CodeBlock({
|
|
|
76
76
|
"aria-label": copied ? "\uBCF5\uC0AC\uB428" : "\uCF54\uB4DC \uBCF5\uC0AC",
|
|
77
77
|
className: "flex items-center gap-1 px-2 py-1 text-xs rounded-md text-[var(--axis-text-secondary)] hover:bg-[var(--axis-surface-tertiary)] transition-colors",
|
|
78
78
|
children: copied ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
79
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { className: "w-3.5 h-3.5 text-[var(--axis-
|
|
79
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { className: "w-3.5 h-3.5 text-[var(--axis-text-success)]", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }),
|
|
80
80
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: "\uBCF5\uC0AC\uB428" })
|
|
81
81
|
] }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
82
82
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { className: "w-3.5 h-3.5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z" }) }),
|
|
@@ -88,7 +88,10 @@ function CodeBlock({
|
|
|
88
88
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
89
89
|
"div",
|
|
90
90
|
{
|
|
91
|
-
|
|
91
|
+
role: "region",
|
|
92
|
+
tabIndex: 0,
|
|
93
|
+
"aria-label": filename ? `${filename} \uCF54\uB4DC` : language ? `${language} \uCF54\uB4DC` : "\uCF54\uB4DC",
|
|
94
|
+
className: "overflow-auto rounded-b-lg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-[var(--axis-border-focus)]",
|
|
92
95
|
style: maxHeight ? { maxHeight } : void 0,
|
|
93
96
|
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("pre", { className: "p-3 text-sm leading-relaxed", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("code", { className: "text-[var(--axis-text-primary)] font-mono", children: showLineNumbers ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("table", { className: "border-collapse w-full", role: "presentation", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("tbody", { children: lines.map((line, i) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("tr", { children: [
|
|
94
97
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
@@ -34,7 +34,7 @@ function CodeBlock({
|
|
|
34
34
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-3 py-2 border-b border-[var(--axis-border-default)] bg-[var(--axis-surface-secondary)]", children: [
|
|
35
35
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 min-w-0", children: [
|
|
36
36
|
filename && /* @__PURE__ */ jsx("code", { className: "text-xs font-mono text-[var(--axis-text-primary)] truncate", children: filename }),
|
|
37
|
-
language && /* @__PURE__ */ jsx("span", { className: "text-xs px-1.5 py-0.5 rounded bg-[var(--axis-surface-tertiary)] text-[var(--axis-text-
|
|
37
|
+
language && /* @__PURE__ */ jsx("span", { className: "text-xs px-1.5 py-0.5 rounded bg-[var(--axis-surface-tertiary)] text-[var(--axis-text-secondary)]", children: language })
|
|
38
38
|
] }),
|
|
39
39
|
/* @__PURE__ */ jsx(
|
|
40
40
|
"button",
|
|
@@ -43,7 +43,7 @@ function CodeBlock({
|
|
|
43
43
|
"aria-label": copied ? "\uBCF5\uC0AC\uB428" : "\uCF54\uB4DC \uBCF5\uC0AC",
|
|
44
44
|
className: "flex items-center gap-1 px-2 py-1 text-xs rounded-md text-[var(--axis-text-secondary)] hover:bg-[var(--axis-surface-tertiary)] transition-colors",
|
|
45
45
|
children: copied ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
46
|
-
/* @__PURE__ */ jsx("svg", { className: "w-3.5 h-3.5 text-[var(--axis-
|
|
46
|
+
/* @__PURE__ */ jsx("svg", { className: "w-3.5 h-3.5 text-[var(--axis-text-success)]", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }),
|
|
47
47
|
/* @__PURE__ */ jsx("span", { children: "\uBCF5\uC0AC\uB428" })
|
|
48
48
|
] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
49
49
|
/* @__PURE__ */ jsx("svg", { className: "w-3.5 h-3.5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z" }) }),
|
|
@@ -55,7 +55,10 @@ function CodeBlock({
|
|
|
55
55
|
/* @__PURE__ */ jsx(
|
|
56
56
|
"div",
|
|
57
57
|
{
|
|
58
|
-
|
|
58
|
+
role: "region",
|
|
59
|
+
tabIndex: 0,
|
|
60
|
+
"aria-label": filename ? `${filename} \uCF54\uB4DC` : language ? `${language} \uCF54\uB4DC` : "\uCF54\uB4DC",
|
|
61
|
+
className: "overflow-auto rounded-b-lg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-[var(--axis-border-focus)]",
|
|
59
62
|
style: maxHeight ? { maxHeight } : void 0,
|
|
60
63
|
children: /* @__PURE__ */ jsx("pre", { className: "p-3 text-sm leading-relaxed", children: /* @__PURE__ */ jsx("code", { className: "text-[var(--axis-text-primary)] font-mono", children: showLineNumbers ? /* @__PURE__ */ jsx("table", { className: "border-collapse w-full", role: "presentation", children: /* @__PURE__ */ jsx("tbody", { children: lines.map((line, i) => /* @__PURE__ */ jsxs("tr", { children: [
|
|
61
64
|
/* @__PURE__ */ jsx(
|
|
@@ -60,8 +60,8 @@ function ContextPanel({
|
|
|
60
60
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("h5", { className: "text-xs font-medium text-[var(--axis-text-secondary)] mb-1", children: "\uBAA8\uB378" }),
|
|
61
61
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
62
62
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("code", { className: "text-sm font-mono text-[var(--axis-text-primary)]", children: modelInfo.name }),
|
|
63
|
-
modelInfo.provider && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-xs text-[var(--axis-text-
|
|
64
|
-
modelInfo.version && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-xs px-1.5 py-0.5 rounded bg-[var(--axis-surface-tertiary)] text-[var(--axis-text-
|
|
63
|
+
modelInfo.provider && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-xs text-[var(--axis-text-secondary)]", children: modelInfo.provider }),
|
|
64
|
+
modelInfo.version && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-xs px-1.5 py-0.5 rounded bg-[var(--axis-surface-tertiary)] text-[var(--axis-text-secondary)]", children: modelInfo.version })
|
|
65
65
|
] })
|
|
66
66
|
] }),
|
|
67
67
|
systemPrompt && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
|
|
@@ -27,8 +27,8 @@ function ContextPanel({
|
|
|
27
27
|
/* @__PURE__ */ jsx("h5", { className: "text-xs font-medium text-[var(--axis-text-secondary)] mb-1", children: "\uBAA8\uB378" }),
|
|
28
28
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
29
29
|
/* @__PURE__ */ jsx("code", { className: "text-sm font-mono text-[var(--axis-text-primary)]", children: modelInfo.name }),
|
|
30
|
-
modelInfo.provider && /* @__PURE__ */ jsx("span", { className: "text-xs text-[var(--axis-text-
|
|
31
|
-
modelInfo.version && /* @__PURE__ */ jsx("span", { className: "text-xs px-1.5 py-0.5 rounded bg-[var(--axis-surface-tertiary)] text-[var(--axis-text-
|
|
30
|
+
modelInfo.provider && /* @__PURE__ */ jsx("span", { className: "text-xs text-[var(--axis-text-secondary)]", children: modelInfo.provider }),
|
|
31
|
+
modelInfo.version && /* @__PURE__ */ jsx("span", { className: "text-xs px-1.5 py-0.5 rounded bg-[var(--axis-surface-tertiary)] text-[var(--axis-text-secondary)]", children: modelInfo.version })
|
|
32
32
|
] })
|
|
33
33
|
] }),
|
|
34
34
|
systemPrompt && /* @__PURE__ */ jsxs("div", { children: [
|
|
@@ -110,13 +110,19 @@ function DiffViewer({
|
|
|
110
110
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2 min-w-0", children: [
|
|
111
111
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-[var(--axis-icon-secondary)]", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M4 6h16M4 12h16M4 18h7" }) }),
|
|
112
112
|
filename && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("code", { className: "text-xs font-mono text-[var(--axis-text-primary)] truncate", children: filename }),
|
|
113
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "text-xs text-[var(--axis-
|
|
114
|
-
"
|
|
115
|
-
|
|
113
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "text-xs text-[var(--axis-text-secondary)]", children: [
|
|
114
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { "aria-hidden": "true", children: [
|
|
115
|
+
"+",
|
|
116
|
+
addedCount
|
|
117
|
+
] }),
|
|
118
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "sr-only", children: `${addedCount}\uC904 ${import_a11y_labels.DIFF_LABELS.added}` })
|
|
116
119
|
] }),
|
|
117
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "text-xs text-[var(--axis-
|
|
118
|
-
"-",
|
|
119
|
-
|
|
120
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "text-xs text-[var(--axis-text-error)]", children: [
|
|
121
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { "aria-hidden": "true", children: [
|
|
122
|
+
"-",
|
|
123
|
+
removedCount
|
|
124
|
+
] }),
|
|
125
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "sr-only", children: `${removedCount}\uC904 ${import_a11y_labels.DIFF_LABELS.removed}` })
|
|
120
126
|
] })
|
|
121
127
|
] }),
|
|
122
128
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-1 bg-[var(--axis-surface-tertiary)] rounded-md p-0.5", children: [
|
|
@@ -127,7 +133,7 @@ function DiffViewer({
|
|
|
127
133
|
"aria-pressed": mode === "unified",
|
|
128
134
|
className: (0, import_ui_react.cn)(
|
|
129
135
|
"px-2 py-0.5 text-xs rounded transition-colors",
|
|
130
|
-
mode === "unified" ? "bg-[var(--axis-surface-default)] text-[var(--axis-text-primary)] shadow-sm" : "text-[var(--axis-text-
|
|
136
|
+
mode === "unified" ? "bg-[var(--axis-surface-default)] text-[var(--axis-text-primary)] shadow-sm" : "text-[var(--axis-text-secondary)] hover:text-[var(--axis-text-primary)]"
|
|
131
137
|
),
|
|
132
138
|
children: "\uD1B5\uD569"
|
|
133
139
|
}
|
|
@@ -139,7 +145,7 @@ function DiffViewer({
|
|
|
139
145
|
"aria-pressed": mode === "split",
|
|
140
146
|
className: (0, import_ui_react.cn)(
|
|
141
147
|
"px-2 py-0.5 text-xs rounded transition-colors",
|
|
142
|
-
mode === "split" ? "bg-[var(--axis-surface-default)] text-[var(--axis-text-primary)] shadow-sm" : "text-[var(--axis-text-
|
|
148
|
+
mode === "split" ? "bg-[var(--axis-surface-default)] text-[var(--axis-text-primary)] shadow-sm" : "text-[var(--axis-text-secondary)] hover:text-[var(--axis-text-primary)]"
|
|
143
149
|
),
|
|
144
150
|
children: "\uBD84\uD560"
|
|
145
151
|
}
|
|
@@ -153,8 +159,8 @@ function DiffViewer({
|
|
|
153
159
|
}
|
|
154
160
|
function UnifiedView({ lines }) {
|
|
155
161
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("table", { className: "w-full text-xs font-mono border-collapse", role: "presentation", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("tbody", { children: lines.map((line, i) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("tr", { className: lineTypeStyles[line.type], children: [
|
|
156
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("td", { className: "select-none text-right px-2 py-0.5 text-[var(--axis-text-
|
|
157
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("td", { className: "select-none text-right px-2 py-0.5 text-[var(--axis-text-
|
|
162
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("td", { className: "select-none text-right px-2 py-0.5 text-[var(--axis-text-secondary)] w-10 border-r border-[var(--axis-border-default)]", children: line.oldLineNumber ?? "" }),
|
|
163
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("td", { className: "select-none text-right px-2 py-0.5 text-[var(--axis-text-secondary)] w-10 border-r border-[var(--axis-border-default)]", children: line.newLineNumber ?? "" }),
|
|
158
164
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("td", { className: (0, import_ui_react.cn)("select-none w-4 text-center py-0.5", lineTypeTextStyles[line.type]), children: lineTypeSymbols[line.type] }),
|
|
159
165
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("td", { className: (0, import_ui_react.cn)("px-2 py-0.5 whitespace-pre", lineTypeTextStyles[line.type]), children: line.content })
|
|
160
166
|
] }, i)) }) });
|
|
@@ -177,10 +183,10 @@ function SplitView({ lines }) {
|
|
|
177
183
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("table", { className: "w-full text-xs font-mono border-collapse", role: "presentation", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("tbody", { children: leftLines.map((leftLine, i) => {
|
|
178
184
|
const rightLine = rightLines[i];
|
|
179
185
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("tr", { children: [
|
|
180
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("td", { className: (0, import_ui_react.cn)("select-none text-right px-2 py-0.5 text-[var(--axis-text-
|
|
186
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("td", { className: (0, import_ui_react.cn)("select-none text-right px-2 py-0.5 text-[var(--axis-text-secondary)] w-10 border-r border-[var(--axis-border-default)]", leftLine ? lineTypeStyles[leftLine.type] : ""), children: leftLine?.oldLineNumber ?? "" }),
|
|
181
187
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("td", { className: (0, import_ui_react.cn)("select-none w-4 text-center py-0.5", leftLine ? lineTypeTextStyles[leftLine.type] : ""), children: leftLine ? lineTypeSymbols[leftLine.type] : "" }),
|
|
182
188
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("td", { className: (0, import_ui_react.cn)("px-2 py-0.5 whitespace-pre w-1/2 border-r border-[var(--axis-border-default)]", leftLine ? (0, import_ui_react.cn)(lineTypeStyles[leftLine.type], lineTypeTextStyles[leftLine.type]) : ""), children: leftLine?.content ?? "" }),
|
|
183
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("td", { className: (0, import_ui_react.cn)("select-none text-right px-2 py-0.5 text-[var(--axis-text-
|
|
189
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("td", { className: (0, import_ui_react.cn)("select-none text-right px-2 py-0.5 text-[var(--axis-text-secondary)] w-10 border-r border-[var(--axis-border-default)]", rightLine ? lineTypeStyles[rightLine.type] : ""), children: rightLine?.newLineNumber ?? "" }),
|
|
184
190
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("td", { className: (0, import_ui_react.cn)("select-none w-4 text-center py-0.5", rightLine ? lineTypeTextStyles[rightLine.type] : ""), children: rightLine ? lineTypeSymbols[rightLine.type] : "" }),
|
|
185
191
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("td", { className: (0, import_ui_react.cn)("px-2 py-0.5 whitespace-pre w-1/2", rightLine ? (0, import_ui_react.cn)(lineTypeStyles[rightLine.type], lineTypeTextStyles[rightLine.type]) : ""), children: rightLine?.content ?? "" })
|
|
186
192
|
] }, i);
|
|
@@ -77,13 +77,19 @@ function DiffViewer({
|
|
|
77
77
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 min-w-0", children: [
|
|
78
78
|
/* @__PURE__ */ jsx("svg", { className: "w-4 h-4 text-[var(--axis-icon-secondary)]", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", "aria-hidden": "true", children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M4 6h16M4 12h16M4 18h7" }) }),
|
|
79
79
|
filename && /* @__PURE__ */ jsx("code", { className: "text-xs font-mono text-[var(--axis-text-primary)] truncate", children: filename }),
|
|
80
|
-
/* @__PURE__ */ jsxs("span", { className: "text-xs text-[var(--axis-
|
|
81
|
-
"
|
|
82
|
-
|
|
80
|
+
/* @__PURE__ */ jsxs("span", { className: "text-xs text-[var(--axis-text-secondary)]", children: [
|
|
81
|
+
/* @__PURE__ */ jsxs("span", { "aria-hidden": "true", children: [
|
|
82
|
+
"+",
|
|
83
|
+
addedCount
|
|
84
|
+
] }),
|
|
85
|
+
/* @__PURE__ */ jsx("span", { className: "sr-only", children: `${addedCount}\uC904 ${DIFF_LABELS.added}` })
|
|
83
86
|
] }),
|
|
84
|
-
/* @__PURE__ */ jsxs("span", { className: "text-xs text-[var(--axis-
|
|
85
|
-
"-",
|
|
86
|
-
|
|
87
|
+
/* @__PURE__ */ jsxs("span", { className: "text-xs text-[var(--axis-text-error)]", children: [
|
|
88
|
+
/* @__PURE__ */ jsxs("span", { "aria-hidden": "true", children: [
|
|
89
|
+
"-",
|
|
90
|
+
removedCount
|
|
91
|
+
] }),
|
|
92
|
+
/* @__PURE__ */ jsx("span", { className: "sr-only", children: `${removedCount}\uC904 ${DIFF_LABELS.removed}` })
|
|
87
93
|
] })
|
|
88
94
|
] }),
|
|
89
95
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 bg-[var(--axis-surface-tertiary)] rounded-md p-0.5", children: [
|
|
@@ -94,7 +100,7 @@ function DiffViewer({
|
|
|
94
100
|
"aria-pressed": mode === "unified",
|
|
95
101
|
className: cn(
|
|
96
102
|
"px-2 py-0.5 text-xs rounded transition-colors",
|
|
97
|
-
mode === "unified" ? "bg-[var(--axis-surface-default)] text-[var(--axis-text-primary)] shadow-sm" : "text-[var(--axis-text-
|
|
103
|
+
mode === "unified" ? "bg-[var(--axis-surface-default)] text-[var(--axis-text-primary)] shadow-sm" : "text-[var(--axis-text-secondary)] hover:text-[var(--axis-text-primary)]"
|
|
98
104
|
),
|
|
99
105
|
children: "\uD1B5\uD569"
|
|
100
106
|
}
|
|
@@ -106,7 +112,7 @@ function DiffViewer({
|
|
|
106
112
|
"aria-pressed": mode === "split",
|
|
107
113
|
className: cn(
|
|
108
114
|
"px-2 py-0.5 text-xs rounded transition-colors",
|
|
109
|
-
mode === "split" ? "bg-[var(--axis-surface-default)] text-[var(--axis-text-primary)] shadow-sm" : "text-[var(--axis-text-
|
|
115
|
+
mode === "split" ? "bg-[var(--axis-surface-default)] text-[var(--axis-text-primary)] shadow-sm" : "text-[var(--axis-text-secondary)] hover:text-[var(--axis-text-primary)]"
|
|
110
116
|
),
|
|
111
117
|
children: "\uBD84\uD560"
|
|
112
118
|
}
|
|
@@ -120,8 +126,8 @@ function DiffViewer({
|
|
|
120
126
|
}
|
|
121
127
|
function UnifiedView({ lines }) {
|
|
122
128
|
return /* @__PURE__ */ jsx("table", { className: "w-full text-xs font-mono border-collapse", role: "presentation", children: /* @__PURE__ */ jsx("tbody", { children: lines.map((line, i) => /* @__PURE__ */ jsxs("tr", { className: lineTypeStyles[line.type], children: [
|
|
123
|
-
/* @__PURE__ */ jsx("td", { className: "select-none text-right px-2 py-0.5 text-[var(--axis-text-
|
|
124
|
-
/* @__PURE__ */ jsx("td", { className: "select-none text-right px-2 py-0.5 text-[var(--axis-text-
|
|
129
|
+
/* @__PURE__ */ jsx("td", { className: "select-none text-right px-2 py-0.5 text-[var(--axis-text-secondary)] w-10 border-r border-[var(--axis-border-default)]", children: line.oldLineNumber ?? "" }),
|
|
130
|
+
/* @__PURE__ */ jsx("td", { className: "select-none text-right px-2 py-0.5 text-[var(--axis-text-secondary)] w-10 border-r border-[var(--axis-border-default)]", children: line.newLineNumber ?? "" }),
|
|
125
131
|
/* @__PURE__ */ jsx("td", { className: cn("select-none w-4 text-center py-0.5", lineTypeTextStyles[line.type]), children: lineTypeSymbols[line.type] }),
|
|
126
132
|
/* @__PURE__ */ jsx("td", { className: cn("px-2 py-0.5 whitespace-pre", lineTypeTextStyles[line.type]), children: line.content })
|
|
127
133
|
] }, i)) }) });
|
|
@@ -144,10 +150,10 @@ function SplitView({ lines }) {
|
|
|
144
150
|
return /* @__PURE__ */ jsx("table", { className: "w-full text-xs font-mono border-collapse", role: "presentation", children: /* @__PURE__ */ jsx("tbody", { children: leftLines.map((leftLine, i) => {
|
|
145
151
|
const rightLine = rightLines[i];
|
|
146
152
|
return /* @__PURE__ */ jsxs("tr", { children: [
|
|
147
|
-
/* @__PURE__ */ jsx("td", { className: cn("select-none text-right px-2 py-0.5 text-[var(--axis-text-
|
|
153
|
+
/* @__PURE__ */ jsx("td", { className: cn("select-none text-right px-2 py-0.5 text-[var(--axis-text-secondary)] w-10 border-r border-[var(--axis-border-default)]", leftLine ? lineTypeStyles[leftLine.type] : ""), children: leftLine?.oldLineNumber ?? "" }),
|
|
148
154
|
/* @__PURE__ */ jsx("td", { className: cn("select-none w-4 text-center py-0.5", leftLine ? lineTypeTextStyles[leftLine.type] : ""), children: leftLine ? lineTypeSymbols[leftLine.type] : "" }),
|
|
149
155
|
/* @__PURE__ */ jsx("td", { className: cn("px-2 py-0.5 whitespace-pre w-1/2 border-r border-[var(--axis-border-default)]", leftLine ? cn(lineTypeStyles[leftLine.type], lineTypeTextStyles[leftLine.type]) : ""), children: leftLine?.content ?? "" }),
|
|
150
|
-
/* @__PURE__ */ jsx("td", { className: cn("select-none text-right px-2 py-0.5 text-[var(--axis-text-
|
|
156
|
+
/* @__PURE__ */ jsx("td", { className: cn("select-none text-right px-2 py-0.5 text-[var(--axis-text-secondary)] w-10 border-r border-[var(--axis-border-default)]", rightLine ? lineTypeStyles[rightLine.type] : ""), children: rightLine?.newLineNumber ?? "" }),
|
|
151
157
|
/* @__PURE__ */ jsx("td", { className: cn("select-none w-4 text-center py-0.5", rightLine ? lineTypeTextStyles[rightLine.type] : ""), children: rightLine ? lineTypeSymbols[rightLine.type] : "" }),
|
|
152
158
|
/* @__PURE__ */ jsx("td", { className: cn("px-2 py-0.5 whitespace-pre w-1/2", rightLine ? cn(lineTypeStyles[rightLine.type], lineTypeTextStyles[rightLine.type]) : ""), children: rightLine?.content ?? "" })
|
|
153
159
|
] }, i);
|
|
@@ -73,7 +73,7 @@ function FeedbackButtons({
|
|
|
73
73
|
className: (0, import_ui_react.cn)(
|
|
74
74
|
"rounded-md transition-colors",
|
|
75
75
|
sizeStyles[size],
|
|
76
|
-
feedback === "like" ? "text-[var(--axis-
|
|
76
|
+
feedback === "like" ? "text-[var(--axis-text-success)] bg-[color:color-mix(in_srgb,var(--axis-status-success)_10%,transparent)]" : "text-[var(--axis-text-tertiary)] hover:text-[var(--axis-text-secondary)] hover:bg-[var(--axis-surface-secondary)]"
|
|
77
77
|
),
|
|
78
78
|
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { className: iconSizes[size], fill: feedback === "like" ? "currentColor" : "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M14 9V5a3 3 0 00-3-3l-4 9v11h11.28a2 2 0 002-1.7l1.38-9a2 2 0 00-2-2.3H14zm-9 11H3a2 2 0 01-2-2v-7a2 2 0 012-2h2" }) })
|
|
79
79
|
}
|
|
@@ -87,7 +87,7 @@ function FeedbackButtons({
|
|
|
87
87
|
className: (0, import_ui_react.cn)(
|
|
88
88
|
"rounded-md transition-colors",
|
|
89
89
|
sizeStyles[size],
|
|
90
|
-
feedback === "dislike" ? "text-[var(--axis-
|
|
90
|
+
feedback === "dislike" ? "text-[var(--axis-text-error)] bg-[color:color-mix(in_srgb,var(--axis-status-error)_10%,transparent)]" : "text-[var(--axis-text-tertiary)] hover:text-[var(--axis-text-secondary)] hover:bg-[var(--axis-surface-secondary)]"
|
|
91
91
|
),
|
|
92
92
|
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { className: iconSizes[size], fill: feedback === "dislike" ? "currentColor" : "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M10 15V19a3 3 0 003 3l4-9V2H5.72a2 2 0 00-2 1.7l-1.38 9a2 2 0 002 2.3H10zm9-13h2a2 2 0 012 2v7a2 2 0 01-2 2h-2" }) })
|
|
93
93
|
}
|
|
@@ -40,7 +40,7 @@ function FeedbackButtons({
|
|
|
40
40
|
className: cn(
|
|
41
41
|
"rounded-md transition-colors",
|
|
42
42
|
sizeStyles[size],
|
|
43
|
-
feedback === "like" ? "text-[var(--axis-
|
|
43
|
+
feedback === "like" ? "text-[var(--axis-text-success)] bg-[color:color-mix(in_srgb,var(--axis-status-success)_10%,transparent)]" : "text-[var(--axis-text-tertiary)] hover:text-[var(--axis-text-secondary)] hover:bg-[var(--axis-surface-secondary)]"
|
|
44
44
|
),
|
|
45
45
|
children: /* @__PURE__ */ jsx("svg", { className: iconSizes[size], fill: feedback === "like" ? "currentColor" : "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M14 9V5a3 3 0 00-3-3l-4 9v11h11.28a2 2 0 002-1.7l1.38-9a2 2 0 00-2-2.3H14zm-9 11H3a2 2 0 01-2-2v-7a2 2 0 012-2h2" }) })
|
|
46
46
|
}
|
|
@@ -54,7 +54,7 @@ function FeedbackButtons({
|
|
|
54
54
|
className: cn(
|
|
55
55
|
"rounded-md transition-colors",
|
|
56
56
|
sizeStyles[size],
|
|
57
|
-
feedback === "dislike" ? "text-[var(--axis-
|
|
57
|
+
feedback === "dislike" ? "text-[var(--axis-text-error)] bg-[color:color-mix(in_srgb,var(--axis-status-error)_10%,transparent)]" : "text-[var(--axis-text-tertiary)] hover:text-[var(--axis-text-secondary)] hover:bg-[var(--axis-surface-secondary)]"
|
|
58
58
|
),
|
|
59
59
|
children: /* @__PURE__ */ jsx("svg", { className: iconSizes[size], fill: feedback === "dislike" ? "currentColor" : "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M10 15V19a3 3 0 003 3l4-9V2H5.72a2 2 0 00-2 1.7l-1.38 9a2 2 0 002 2.3H10zm9-13h2a2 2 0 012 2v7a2 2 0 01-2 2h-2" }) })
|
|
60
60
|
}
|
|
@@ -20,10 +20,27 @@ interface MessageBubbleProps {
|
|
|
20
20
|
metadata?: string;
|
|
21
21
|
/** 추가 클래스 */
|
|
22
22
|
className?: string;
|
|
23
|
+
/**
|
|
24
|
+
* 시각 표시 로케일(기본 "ko-KR"). formatTime 이 있으면 쓰지 않습니다.
|
|
25
|
+
*/
|
|
26
|
+
locale?: string;
|
|
27
|
+
/**
|
|
28
|
+
* 시각 표시 시간대(IANA 이름, 예: "Asia/Seoul"). 지정하면 서버 렌더와 브라우저 결과가 같아
|
|
29
|
+
* 첫 렌더부터 시각을 표시합니다. 없으면 브라우저 시간대로 표시하고, 서버 렌더 · 하이드레이션
|
|
30
|
+
* 첫 렌더에서는 비워 두었다가 하이드레이션 뒤에 채웁니다(서버와 브라우저 시간대가 달라 생기는
|
|
31
|
+
* 하이드레이션 불일치 방지, WI-0069).
|
|
32
|
+
*/
|
|
33
|
+
timeZone?: string;
|
|
34
|
+
/**
|
|
35
|
+
* 시각 문자열을 직접 만드는 함수. 지정하면 locale · timeZone 대신 이 결과를 첫 렌더부터 씁니다.
|
|
36
|
+
* 서버 렌더와 브라우저에서 같은 값을 돌려줘야 합니다(Date 의 지역 시간 메서드를 쓰면 시간대에 따라 달라짐).
|
|
37
|
+
* 함수라서 서버 컴포넌트에서는 넘길 수 없습니다(그때는 locale · timeZone 을 쓰세요).
|
|
38
|
+
*/
|
|
39
|
+
formatTime?: (date: Date) => string;
|
|
23
40
|
}
|
|
24
41
|
/**
|
|
25
42
|
* 대화 메시지 버블 컴포넌트
|
|
26
43
|
*/
|
|
27
|
-
declare function MessageBubble({ role, content, timestamp, avatar, status, actions, metadata, className, }: MessageBubbleProps): react_jsx_runtime.JSX.Element;
|
|
44
|
+
declare function MessageBubble({ role, content, timestamp, avatar, status, actions, metadata, className, locale, timeZone, formatTime, }: MessageBubbleProps): react_jsx_runtime.JSX.Element;
|
|
28
45
|
|
|
29
46
|
export { MessageBubble, type MessageBubbleProps, type MessageRole, type MessageStatus };
|
|
@@ -20,10 +20,27 @@ interface MessageBubbleProps {
|
|
|
20
20
|
metadata?: string;
|
|
21
21
|
/** 추가 클래스 */
|
|
22
22
|
className?: string;
|
|
23
|
+
/**
|
|
24
|
+
* 시각 표시 로케일(기본 "ko-KR"). formatTime 이 있으면 쓰지 않습니다.
|
|
25
|
+
*/
|
|
26
|
+
locale?: string;
|
|
27
|
+
/**
|
|
28
|
+
* 시각 표시 시간대(IANA 이름, 예: "Asia/Seoul"). 지정하면 서버 렌더와 브라우저 결과가 같아
|
|
29
|
+
* 첫 렌더부터 시각을 표시합니다. 없으면 브라우저 시간대로 표시하고, 서버 렌더 · 하이드레이션
|
|
30
|
+
* 첫 렌더에서는 비워 두었다가 하이드레이션 뒤에 채웁니다(서버와 브라우저 시간대가 달라 생기는
|
|
31
|
+
* 하이드레이션 불일치 방지, WI-0069).
|
|
32
|
+
*/
|
|
33
|
+
timeZone?: string;
|
|
34
|
+
/**
|
|
35
|
+
* 시각 문자열을 직접 만드는 함수. 지정하면 locale · timeZone 대신 이 결과를 첫 렌더부터 씁니다.
|
|
36
|
+
* 서버 렌더와 브라우저에서 같은 값을 돌려줘야 합니다(Date 의 지역 시간 메서드를 쓰면 시간대에 따라 달라짐).
|
|
37
|
+
* 함수라서 서버 컴포넌트에서는 넘길 수 없습니다(그때는 locale · timeZone 을 쓰세요).
|
|
38
|
+
*/
|
|
39
|
+
formatTime?: (date: Date) => string;
|
|
23
40
|
}
|
|
24
41
|
/**
|
|
25
42
|
* 대화 메시지 버블 컴포넌트
|
|
26
43
|
*/
|
|
27
|
-
declare function MessageBubble({ role, content, timestamp, avatar, status, actions, metadata, className, }: MessageBubbleProps): react_jsx_runtime.JSX.Element;
|
|
44
|
+
declare function MessageBubble({ role, content, timestamp, avatar, status, actions, metadata, className, locale, timeZone, formatTime, }: MessageBubbleProps): react_jsx_runtime.JSX.Element;
|
|
28
45
|
|
|
29
46
|
export { MessageBubble, type MessageBubbleProps, type MessageRole, type MessageStatus };
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
"use client";
|
|
1
2
|
"use strict";
|
|
3
|
+
var __create = Object.create;
|
|
2
4
|
var __defProp = Object.defineProperty;
|
|
3
5
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
6
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
5
8
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
9
|
var __export = (target, all) => {
|
|
7
10
|
for (var name in all)
|
|
@@ -15,6 +18,14 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
15
18
|
}
|
|
16
19
|
return to;
|
|
17
20
|
};
|
|
21
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
22
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
23
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
24
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
25
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
26
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
27
|
+
mod
|
|
28
|
+
));
|
|
18
29
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
30
|
var message_bubble_exports = {};
|
|
20
31
|
__export(message_bubble_exports, {
|
|
@@ -22,8 +33,18 @@ __export(message_bubble_exports, {
|
|
|
22
33
|
});
|
|
23
34
|
module.exports = __toCommonJS(message_bubble_exports);
|
|
24
35
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
36
|
+
var React = __toESM(require("react"));
|
|
25
37
|
var import_ui_react = require("@axis-ds/ui-react");
|
|
26
38
|
var import_a11y_labels = require("../constants/a11y-labels.js");
|
|
39
|
+
const noopSubscribe = () => () => {
|
|
40
|
+
};
|
|
41
|
+
function useHydrated() {
|
|
42
|
+
return React.useSyncExternalStore(
|
|
43
|
+
noopSubscribe,
|
|
44
|
+
() => true,
|
|
45
|
+
() => false
|
|
46
|
+
);
|
|
47
|
+
}
|
|
27
48
|
const roleStyles = {
|
|
28
49
|
user: {
|
|
29
50
|
container: "flex-row-reverse",
|
|
@@ -39,12 +60,12 @@ const roleStyles = {
|
|
|
39
60
|
}
|
|
40
61
|
};
|
|
41
62
|
const statusIcons = {
|
|
42
|
-
sending: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("svg", { className: "w-3 h-3 animate-spin motion-reduce:![animation-duration:3s]", viewBox: "0 0 24 24", fill: "none", children: [
|
|
63
|
+
sending: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("svg", { "aria-hidden": "true", className: "w-3 h-3 animate-spin motion-reduce:![animation-duration:3s]", viewBox: "0 0 24 24", fill: "none", children: [
|
|
43
64
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }),
|
|
44
65
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z" })
|
|
45
66
|
] }),
|
|
46
|
-
sent: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { className: "w-3 h-3", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }),
|
|
47
|
-
error: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { className: "w-3 h-3", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 8v4m0 4h.01" }) })
|
|
67
|
+
sent: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { "aria-hidden": "true", className: "w-3 h-3", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }),
|
|
68
|
+
error: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { "aria-hidden": "true", className: "w-3 h-3", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 8v4m0 4h.01" }) })
|
|
48
69
|
};
|
|
49
70
|
function MessageBubble({
|
|
50
71
|
role,
|
|
@@ -54,9 +75,15 @@ function MessageBubble({
|
|
|
54
75
|
status,
|
|
55
76
|
actions,
|
|
56
77
|
metadata,
|
|
57
|
-
className
|
|
78
|
+
className,
|
|
79
|
+
locale = "ko-KR",
|
|
80
|
+
timeZone,
|
|
81
|
+
formatTime
|
|
58
82
|
}) {
|
|
59
83
|
const roleLabel = import_a11y_labels.MESSAGE_ROLE_LABELS[role];
|
|
84
|
+
const hydrated = useHydrated();
|
|
85
|
+
const deterministic = formatTime !== void 0 || timeZone !== void 0;
|
|
86
|
+
const timeText = timestamp && (deterministic || hydrated) ? formatTime ? formatTime(timestamp) : timestamp.toLocaleTimeString(locale, { hour: "2-digit", minute: "2-digit", timeZone }) : "";
|
|
60
87
|
const renderAvatar = () => {
|
|
61
88
|
if (!avatar) return null;
|
|
62
89
|
if (typeof avatar === "string") {
|
|
@@ -97,13 +124,14 @@ function MessageBubble({
|
|
|
97
124
|
{
|
|
98
125
|
dateTime: timestamp.toISOString(),
|
|
99
126
|
className: "text-xs text-[var(--axis-text-tertiary)]",
|
|
100
|
-
children:
|
|
127
|
+
children: timeText
|
|
101
128
|
}
|
|
102
129
|
),
|
|
103
130
|
metadata && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-xs text-[var(--axis-text-tertiary)]", children: metadata }),
|
|
104
131
|
status && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
105
132
|
"span",
|
|
106
133
|
{
|
|
134
|
+
role: "img",
|
|
107
135
|
className: (0, import_ui_react.cn)(
|
|
108
136
|
"text-[var(--axis-text-tertiary)]",
|
|
109
137
|
status === "error" && "text-[var(--axis-text-error)]"
|
|
@@ -1,6 +1,17 @@
|
|
|
1
|
+
"use client";
|
|
1
2
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
2
4
|
import { cn } from "@axis-ds/ui-react";
|
|
3
5
|
import { MESSAGE_ROLE_LABELS } from "../constants/a11y-labels.mjs";
|
|
6
|
+
const noopSubscribe = () => () => {
|
|
7
|
+
};
|
|
8
|
+
function useHydrated() {
|
|
9
|
+
return React.useSyncExternalStore(
|
|
10
|
+
noopSubscribe,
|
|
11
|
+
() => true,
|
|
12
|
+
() => false
|
|
13
|
+
);
|
|
14
|
+
}
|
|
4
15
|
const roleStyles = {
|
|
5
16
|
user: {
|
|
6
17
|
container: "flex-row-reverse",
|
|
@@ -16,12 +27,12 @@ const roleStyles = {
|
|
|
16
27
|
}
|
|
17
28
|
};
|
|
18
29
|
const statusIcons = {
|
|
19
|
-
sending: /* @__PURE__ */ jsxs("svg", { className: "w-3 h-3 animate-spin motion-reduce:![animation-duration:3s]", viewBox: "0 0 24 24", fill: "none", children: [
|
|
30
|
+
sending: /* @__PURE__ */ jsxs("svg", { "aria-hidden": "true", className: "w-3 h-3 animate-spin motion-reduce:![animation-duration:3s]", viewBox: "0 0 24 24", fill: "none", children: [
|
|
20
31
|
/* @__PURE__ */ jsx("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }),
|
|
21
32
|
/* @__PURE__ */ jsx("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z" })
|
|
22
33
|
] }),
|
|
23
|
-
sent: /* @__PURE__ */ jsx("svg", { className: "w-3 h-3", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }),
|
|
24
|
-
error: /* @__PURE__ */ jsx("svg", { className: "w-3 h-3", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 8v4m0 4h.01" }) })
|
|
34
|
+
sent: /* @__PURE__ */ jsx("svg", { "aria-hidden": "true", className: "w-3 h-3", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }),
|
|
35
|
+
error: /* @__PURE__ */ jsx("svg", { "aria-hidden": "true", className: "w-3 h-3", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 8v4m0 4h.01" }) })
|
|
25
36
|
};
|
|
26
37
|
function MessageBubble({
|
|
27
38
|
role,
|
|
@@ -31,9 +42,15 @@ function MessageBubble({
|
|
|
31
42
|
status,
|
|
32
43
|
actions,
|
|
33
44
|
metadata,
|
|
34
|
-
className
|
|
45
|
+
className,
|
|
46
|
+
locale = "ko-KR",
|
|
47
|
+
timeZone,
|
|
48
|
+
formatTime
|
|
35
49
|
}) {
|
|
36
50
|
const roleLabel = MESSAGE_ROLE_LABELS[role];
|
|
51
|
+
const hydrated = useHydrated();
|
|
52
|
+
const deterministic = formatTime !== void 0 || timeZone !== void 0;
|
|
53
|
+
const timeText = timestamp && (deterministic || hydrated) ? formatTime ? formatTime(timestamp) : timestamp.toLocaleTimeString(locale, { hour: "2-digit", minute: "2-digit", timeZone }) : "";
|
|
37
54
|
const renderAvatar = () => {
|
|
38
55
|
if (!avatar) return null;
|
|
39
56
|
if (typeof avatar === "string") {
|
|
@@ -74,13 +91,14 @@ function MessageBubble({
|
|
|
74
91
|
{
|
|
75
92
|
dateTime: timestamp.toISOString(),
|
|
76
93
|
className: "text-xs text-[var(--axis-text-tertiary)]",
|
|
77
|
-
children:
|
|
94
|
+
children: timeText
|
|
78
95
|
}
|
|
79
96
|
),
|
|
80
97
|
metadata && /* @__PURE__ */ jsx("span", { className: "text-xs text-[var(--axis-text-tertiary)]", children: metadata }),
|
|
81
98
|
status && /* @__PURE__ */ jsx(
|
|
82
99
|
"span",
|
|
83
100
|
{
|
|
101
|
+
role: "img",
|
|
84
102
|
className: cn(
|
|
85
103
|
"text-[var(--axis-text-tertiary)]",
|
|
86
104
|
status === "error" && "text-[var(--axis-text-error)]"
|
package/dist/plan-card/index.js
CHANGED
|
@@ -62,14 +62,14 @@ const planStatusStyles = {
|
|
|
62
62
|
}
|
|
63
63
|
};
|
|
64
64
|
const stepStatusIcons = {
|
|
65
|
-
pending: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-[var(--axis-
|
|
65
|
+
pending: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-[var(--axis-text-tertiary)]", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "12", cy: "12", r: "10", strokeWidth: 2 }) }),
|
|
66
66
|
running: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("svg", { className: "w-4 h-4 text-[var(--axis-status-running)] animate-spin motion-reduce:![animation-duration:3s]", viewBox: "0 0 24 24", fill: "none", children: [
|
|
67
67
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }),
|
|
68
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", {
|
|
68
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z" })
|
|
69
69
|
] }),
|
|
70
|
-
complete: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-[var(--axis-
|
|
71
|
-
error: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-[var(--axis-
|
|
72
|
-
skipped: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-[var(--axis-
|
|
70
|
+
complete: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-[var(--axis-text-success)]", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }),
|
|
71
|
+
error: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-[var(--axis-text-error)]", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) }),
|
|
72
|
+
skipped: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-[var(--axis-text-tertiary)]", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M13 5l7 7-7 7M5 5l7 7-7 7" }) })
|
|
73
73
|
};
|
|
74
74
|
function PlanCard({
|
|
75
75
|
title,
|
|
@@ -149,7 +149,7 @@ function PlanCard({
|
|
|
149
149
|
"button",
|
|
150
150
|
{
|
|
151
151
|
onClick: onApprove,
|
|
152
|
-
className: "px-3 py-1.5 text-xs font-medium rounded-md bg-[var(--axis-plan-card-approve-bg)] text-[var(--axis-
|
|
152
|
+
className: "px-3 py-1.5 text-xs font-medium rounded-md bg-[var(--axis-plan-card-approve-bg)] text-[var(--axis-button-text-default)] hover:bg-[var(--axis-plan-card-approve-hover-bg)] transition-colors",
|
|
153
153
|
children: "\uC2B9\uC778"
|
|
154
154
|
}
|
|
155
155
|
),
|
package/dist/plan-card/index.mjs
CHANGED
|
@@ -29,14 +29,14 @@ const planStatusStyles = {
|
|
|
29
29
|
}
|
|
30
30
|
};
|
|
31
31
|
const stepStatusIcons = {
|
|
32
|
-
pending: /* @__PURE__ */ jsx("svg", { className: "w-4 h-4 text-[var(--axis-
|
|
32
|
+
pending: /* @__PURE__ */ jsx("svg", { className: "w-4 h-4 text-[var(--axis-text-tertiary)]", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "10", strokeWidth: 2 }) }),
|
|
33
33
|
running: /* @__PURE__ */ jsxs("svg", { className: "w-4 h-4 text-[var(--axis-status-running)] animate-spin motion-reduce:![animation-duration:3s]", viewBox: "0 0 24 24", fill: "none", children: [
|
|
34
34
|
/* @__PURE__ */ jsx("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }),
|
|
35
|
-
/* @__PURE__ */ jsx("path", {
|
|
35
|
+
/* @__PURE__ */ jsx("path", { fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z" })
|
|
36
36
|
] }),
|
|
37
|
-
complete: /* @__PURE__ */ jsx("svg", { className: "w-4 h-4 text-[var(--axis-
|
|
38
|
-
error: /* @__PURE__ */ jsx("svg", { className: "w-4 h-4 text-[var(--axis-
|
|
39
|
-
skipped: /* @__PURE__ */ jsx("svg", { className: "w-4 h-4 text-[var(--axis-
|
|
37
|
+
complete: /* @__PURE__ */ jsx("svg", { className: "w-4 h-4 text-[var(--axis-text-success)]", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }),
|
|
38
|
+
error: /* @__PURE__ */ jsx("svg", { className: "w-4 h-4 text-[var(--axis-text-error)]", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) }),
|
|
39
|
+
skipped: /* @__PURE__ */ jsx("svg", { className: "w-4 h-4 text-[var(--axis-text-tertiary)]", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M13 5l7 7-7 7M5 5l7 7-7 7" }) })
|
|
40
40
|
};
|
|
41
41
|
function PlanCard({
|
|
42
42
|
title,
|
|
@@ -116,7 +116,7 @@ function PlanCard({
|
|
|
116
116
|
"button",
|
|
117
117
|
{
|
|
118
118
|
onClick: onApprove,
|
|
119
|
-
className: "px-3 py-1.5 text-xs font-medium rounded-md bg-[var(--axis-plan-card-approve-bg)] text-[var(--axis-
|
|
119
|
+
className: "px-3 py-1.5 text-xs font-medium rounded-md bg-[var(--axis-plan-card-approve-bg)] text-[var(--axis-button-text-default)] hover:bg-[var(--axis-plan-card-approve-hover-bg)] transition-colors",
|
|
120
120
|
children: "\uC2B9\uC778"
|
|
121
121
|
}
|
|
122
122
|
),
|
|
@@ -48,7 +48,7 @@ function RecoveryBanner({
|
|
|
48
48
|
{
|
|
49
49
|
className: (0, import_ui_react.cn)(
|
|
50
50
|
"flex items-start gap-3 p-4 rounded-lg border",
|
|
51
|
-
"bg-[var(--axis-surface-error)] border-[var(--axis-
|
|
51
|
+
"bg-[var(--axis-surface-error)] border-[var(--axis-border-error)]",
|
|
52
52
|
className
|
|
53
53
|
),
|
|
54
54
|
role: "alert",
|
|
@@ -58,7 +58,7 @@ function RecoveryBanner({
|
|
|
58
58
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
59
59
|
"svg",
|
|
60
60
|
{
|
|
61
|
-
className: "w-5 h-5 text-[var(--axis-
|
|
61
|
+
className: "w-5 h-5 text-[var(--axis-text-error)] flex-shrink-0 mt-0.5",
|
|
62
62
|
fill: "none",
|
|
63
63
|
stroke: "currentColor",
|
|
64
64
|
viewBox: "0 0 24 24",
|
|
@@ -82,7 +82,7 @@ function RecoveryBanner({
|
|
|
82
82
|
"button",
|
|
83
83
|
{
|
|
84
84
|
onClick: onRetry,
|
|
85
|
-
"aria-describedby": descId,
|
|
85
|
+
"aria-describedby": description ? descId : void 0,
|
|
86
86
|
className: "px-3 py-1.5 text-sm font-medium rounded-md bg-[var(--axis-button-destructive-bg-default)] text-[var(--axis-button-destructive-text-default)] hover:bg-[var(--axis-button-destructive-bg-hover)] transition-colors",
|
|
87
87
|
children: "\uC7AC\uC2DC\uB3C4"
|
|
88
88
|
}
|
|
@@ -15,7 +15,7 @@ function RecoveryBanner({
|
|
|
15
15
|
{
|
|
16
16
|
className: cn(
|
|
17
17
|
"flex items-start gap-3 p-4 rounded-lg border",
|
|
18
|
-
"bg-[var(--axis-surface-error)] border-[var(--axis-
|
|
18
|
+
"bg-[var(--axis-surface-error)] border-[var(--axis-border-error)]",
|
|
19
19
|
className
|
|
20
20
|
),
|
|
21
21
|
role: "alert",
|
|
@@ -25,7 +25,7 @@ function RecoveryBanner({
|
|
|
25
25
|
/* @__PURE__ */ jsx(
|
|
26
26
|
"svg",
|
|
27
27
|
{
|
|
28
|
-
className: "w-5 h-5 text-[var(--axis-
|
|
28
|
+
className: "w-5 h-5 text-[var(--axis-text-error)] flex-shrink-0 mt-0.5",
|
|
29
29
|
fill: "none",
|
|
30
30
|
stroke: "currentColor",
|
|
31
31
|
viewBox: "0 0 24 24",
|
|
@@ -49,7 +49,7 @@ function RecoveryBanner({
|
|
|
49
49
|
"button",
|
|
50
50
|
{
|
|
51
51
|
onClick: onRetry,
|
|
52
|
-
"aria-describedby": descId,
|
|
52
|
+
"aria-describedby": description ? descId : void 0,
|
|
53
53
|
className: "px-3 py-1.5 text-sm font-medium rounded-md bg-[var(--axis-button-destructive-bg-default)] text-[var(--axis-button-destructive-text-default)] hover:bg-[var(--axis-button-destructive-bg-hover)] transition-colors",
|
|
54
54
|
children: "\uC7AC\uC2DC\uB3C4"
|
|
55
55
|
}
|
|
@@ -38,7 +38,7 @@ var import_a11y_labels = require("../constants/a11y-labels.js");
|
|
|
38
38
|
const statusColors = {
|
|
39
39
|
pending: "bg-[var(--axis-status-neutral-muted)] text-[var(--axis-status-neutral-muted-contrast)]",
|
|
40
40
|
running: "bg-[var(--axis-status-running)] text-[var(--axis-status-running-contrast)] animate-pulse motion-reduce:![animation-duration:5s]",
|
|
41
|
-
complete: "bg-[var(--axis-
|
|
41
|
+
complete: "bg-[var(--axis-text-success)] text-[var(--axis-status-success-contrast)]",
|
|
42
42
|
error: "bg-[var(--axis-status-error)] text-[var(--axis-status-error-contrast)]"
|
|
43
43
|
};
|
|
44
44
|
const statusIcons = {
|
|
@@ -5,7 +5,7 @@ import { STATUS_LABELS } from "../constants/a11y-labels.mjs";
|
|
|
5
5
|
const statusColors = {
|
|
6
6
|
pending: "bg-[var(--axis-status-neutral-muted)] text-[var(--axis-status-neutral-muted-contrast)]",
|
|
7
7
|
running: "bg-[var(--axis-status-running)] text-[var(--axis-status-running-contrast)] animate-pulse motion-reduce:![animation-duration:5s]",
|
|
8
|
-
complete: "bg-[var(--axis-
|
|
8
|
+
complete: "bg-[var(--axis-text-success)] text-[var(--axis-status-success-contrast)]",
|
|
9
9
|
error: "bg-[var(--axis-status-error)] text-[var(--axis-status-error-contrast)]"
|
|
10
10
|
};
|
|
11
11
|
const statusIcons = {
|
|
@@ -12,10 +12,25 @@ interface StepTimelineProps {
|
|
|
12
12
|
steps: TimelineStep[];
|
|
13
13
|
orientation?: "vertical" | "horizontal";
|
|
14
14
|
className?: string;
|
|
15
|
+
/**
|
|
16
|
+
* 시각 표시 로케일. 없으면 실행 환경의 기본 로케일입니다(이전과 같음). formatTime 이 있으면 쓰지 않습니다.
|
|
17
|
+
*/
|
|
18
|
+
locale?: string;
|
|
19
|
+
/**
|
|
20
|
+
* 시각 표시 시간대(IANA 이름, 예: "Asia/Seoul"). locale 과 함께 지정하면 서버 렌더와 브라우저 결과가 같아
|
|
21
|
+
* 첫 렌더부터 시각을 표시합니다. 둘 중 하나라도 없으면 실행 환경 값에 따라 달라지므로, 서버 렌더 ·
|
|
22
|
+
* 하이드레이션 첫 렌더에서는 비워 두었다가 하이드레이션 뒤에 채웁니다(하이드레이션 불일치 방지, WI-0069).
|
|
23
|
+
*/
|
|
24
|
+
timeZone?: string;
|
|
25
|
+
/**
|
|
26
|
+
* 시각 문자열을 직접 만드는 함수. 지정하면 locale · timeZone 대신 이 결과를 첫 렌더부터 씁니다.
|
|
27
|
+
* 서버 렌더와 브라우저에서 같은 값을 돌려줘야 합니다. 함수라서 서버 컴포넌트에서는 넘길 수 없습니다.
|
|
28
|
+
*/
|
|
29
|
+
formatTime?: (date: Date) => string;
|
|
15
30
|
}
|
|
16
31
|
/**
|
|
17
32
|
* 단계별 타임라인 컴포넌트
|
|
18
33
|
*/
|
|
19
|
-
declare function StepTimeline({ steps, orientation, className, }: StepTimelineProps): react_jsx_runtime.JSX.Element;
|
|
34
|
+
declare function StepTimeline({ steps, orientation, className, locale, timeZone, formatTime, }: StepTimelineProps): react_jsx_runtime.JSX.Element;
|
|
20
35
|
|
|
21
36
|
export { StepTimeline, type StepTimelineProps, type TimelineStep, type TimelineStepStatus };
|
|
@@ -12,10 +12,25 @@ interface StepTimelineProps {
|
|
|
12
12
|
steps: TimelineStep[];
|
|
13
13
|
orientation?: "vertical" | "horizontal";
|
|
14
14
|
className?: string;
|
|
15
|
+
/**
|
|
16
|
+
* 시각 표시 로케일. 없으면 실행 환경의 기본 로케일입니다(이전과 같음). formatTime 이 있으면 쓰지 않습니다.
|
|
17
|
+
*/
|
|
18
|
+
locale?: string;
|
|
19
|
+
/**
|
|
20
|
+
* 시각 표시 시간대(IANA 이름, 예: "Asia/Seoul"). locale 과 함께 지정하면 서버 렌더와 브라우저 결과가 같아
|
|
21
|
+
* 첫 렌더부터 시각을 표시합니다. 둘 중 하나라도 없으면 실행 환경 값에 따라 달라지므로, 서버 렌더 ·
|
|
22
|
+
* 하이드레이션 첫 렌더에서는 비워 두었다가 하이드레이션 뒤에 채웁니다(하이드레이션 불일치 방지, WI-0069).
|
|
23
|
+
*/
|
|
24
|
+
timeZone?: string;
|
|
25
|
+
/**
|
|
26
|
+
* 시각 문자열을 직접 만드는 함수. 지정하면 locale · timeZone 대신 이 결과를 첫 렌더부터 씁니다.
|
|
27
|
+
* 서버 렌더와 브라우저에서 같은 값을 돌려줘야 합니다. 함수라서 서버 컴포넌트에서는 넘길 수 없습니다.
|
|
28
|
+
*/
|
|
29
|
+
formatTime?: (date: Date) => string;
|
|
15
30
|
}
|
|
16
31
|
/**
|
|
17
32
|
* 단계별 타임라인 컴포넌트
|
|
18
33
|
*/
|
|
19
|
-
declare function StepTimeline({ steps, orientation, className, }: StepTimelineProps): react_jsx_runtime.JSX.Element;
|
|
34
|
+
declare function StepTimeline({ steps, orientation, className, locale, timeZone, formatTime, }: StepTimelineProps): react_jsx_runtime.JSX.Element;
|
|
20
35
|
|
|
21
36
|
export { StepTimeline, type StepTimelineProps, type TimelineStep, type TimelineStepStatus };
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
"use client";
|
|
1
2
|
"use strict";
|
|
3
|
+
var __create = Object.create;
|
|
2
4
|
var __defProp = Object.defineProperty;
|
|
3
5
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
6
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
5
8
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
9
|
var __export = (target, all) => {
|
|
7
10
|
for (var name in all)
|
|
@@ -15,6 +18,14 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
15
18
|
}
|
|
16
19
|
return to;
|
|
17
20
|
};
|
|
21
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
22
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
23
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
24
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
25
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
26
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
27
|
+
mod
|
|
28
|
+
));
|
|
18
29
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
30
|
var step_timeline_exports = {};
|
|
20
31
|
__export(step_timeline_exports, {
|
|
@@ -22,14 +33,34 @@ __export(step_timeline_exports, {
|
|
|
22
33
|
});
|
|
23
34
|
module.exports = __toCommonJS(step_timeline_exports);
|
|
24
35
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
36
|
+
var React = __toESM(require("react"));
|
|
25
37
|
var import_ui_react = require("@axis-ds/ui-react");
|
|
26
38
|
var import_a11y_labels = require("../constants/a11y-labels.js");
|
|
39
|
+
const noopSubscribe = () => () => {
|
|
40
|
+
};
|
|
41
|
+
function useHydrated() {
|
|
42
|
+
return React.useSyncExternalStore(
|
|
43
|
+
noopSubscribe,
|
|
44
|
+
() => true,
|
|
45
|
+
() => false
|
|
46
|
+
);
|
|
47
|
+
}
|
|
27
48
|
function StepTimeline({
|
|
28
49
|
steps,
|
|
29
50
|
orientation = "vertical",
|
|
30
|
-
className
|
|
51
|
+
className,
|
|
52
|
+
locale,
|
|
53
|
+
timeZone,
|
|
54
|
+
formatTime
|
|
31
55
|
}) {
|
|
32
56
|
const isVertical = orientation === "vertical";
|
|
57
|
+
const hydrated = useHydrated();
|
|
58
|
+
const deterministic = formatTime !== void 0 || locale !== void 0 && timeZone !== void 0;
|
|
59
|
+
const formatStepTime = (date) => {
|
|
60
|
+
if (!deterministic && !hydrated) return "";
|
|
61
|
+
if (formatTime) return formatTime(date);
|
|
62
|
+
return timeZone !== void 0 ? date.toLocaleTimeString(locale, { timeZone }) : date.toLocaleTimeString(locale);
|
|
63
|
+
};
|
|
33
64
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
34
65
|
"div",
|
|
35
66
|
{
|
|
@@ -65,7 +96,7 @@ function StepTimeline({
|
|
|
65
96
|
"aria-hidden": "true",
|
|
66
97
|
className: (0, import_ui_react.cn)(
|
|
67
98
|
"relative z-10 w-5 h-5 rounded-full flex items-center justify-center",
|
|
68
|
-
step.status === "complete" && "bg-[var(--axis-
|
|
99
|
+
step.status === "complete" && "bg-[var(--axis-text-success)]",
|
|
69
100
|
step.status === "running" && "bg-[var(--axis-status-running)] animate-pulse motion-reduce:![animation-duration:5s]",
|
|
70
101
|
step.status === "error" && "bg-[var(--axis-status-error)]",
|
|
71
102
|
step.status === "skipped" && "bg-[var(--axis-status-neutral-muted)]",
|
|
@@ -81,7 +112,7 @@ function StepTimeline({
|
|
|
81
112
|
] }),
|
|
82
113
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm font-medium text-[var(--axis-text-primary)]", children: step.label }),
|
|
83
114
|
step.description && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-xs text-[var(--axis-text-secondary)]", children: step.description }),
|
|
84
|
-
step.timestamp && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-xs text-[var(--axis-text-tertiary)]", children: step.timestamp.
|
|
115
|
+
step.timestamp && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-xs text-[var(--axis-text-tertiary)]", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("time", { dateTime: step.timestamp.toISOString(), children: formatStepTime(step.timestamp) }) })
|
|
85
116
|
] })
|
|
86
117
|
]
|
|
87
118
|
},
|
|
@@ -1,12 +1,33 @@
|
|
|
1
|
+
"use client";
|
|
1
2
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
2
4
|
import { cn } from "@axis-ds/ui-react";
|
|
3
5
|
import { STATUS_LABELS } from "../constants/a11y-labels.mjs";
|
|
6
|
+
const noopSubscribe = () => () => {
|
|
7
|
+
};
|
|
8
|
+
function useHydrated() {
|
|
9
|
+
return React.useSyncExternalStore(
|
|
10
|
+
noopSubscribe,
|
|
11
|
+
() => true,
|
|
12
|
+
() => false
|
|
13
|
+
);
|
|
14
|
+
}
|
|
4
15
|
function StepTimeline({
|
|
5
16
|
steps,
|
|
6
17
|
orientation = "vertical",
|
|
7
|
-
className
|
|
18
|
+
className,
|
|
19
|
+
locale,
|
|
20
|
+
timeZone,
|
|
21
|
+
formatTime
|
|
8
22
|
}) {
|
|
9
23
|
const isVertical = orientation === "vertical";
|
|
24
|
+
const hydrated = useHydrated();
|
|
25
|
+
const deterministic = formatTime !== void 0 || locale !== void 0 && timeZone !== void 0;
|
|
26
|
+
const formatStepTime = (date) => {
|
|
27
|
+
if (!deterministic && !hydrated) return "";
|
|
28
|
+
if (formatTime) return formatTime(date);
|
|
29
|
+
return timeZone !== void 0 ? date.toLocaleTimeString(locale, { timeZone }) : date.toLocaleTimeString(locale);
|
|
30
|
+
};
|
|
10
31
|
return /* @__PURE__ */ jsx(
|
|
11
32
|
"div",
|
|
12
33
|
{
|
|
@@ -42,7 +63,7 @@ function StepTimeline({
|
|
|
42
63
|
"aria-hidden": "true",
|
|
43
64
|
className: cn(
|
|
44
65
|
"relative z-10 w-5 h-5 rounded-full flex items-center justify-center",
|
|
45
|
-
step.status === "complete" && "bg-[var(--axis-
|
|
66
|
+
step.status === "complete" && "bg-[var(--axis-text-success)]",
|
|
46
67
|
step.status === "running" && "bg-[var(--axis-status-running)] animate-pulse motion-reduce:![animation-duration:5s]",
|
|
47
68
|
step.status === "error" && "bg-[var(--axis-status-error)]",
|
|
48
69
|
step.status === "skipped" && "bg-[var(--axis-status-neutral-muted)]",
|
|
@@ -58,7 +79,7 @@ function StepTimeline({
|
|
|
58
79
|
] }),
|
|
59
80
|
/* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-[var(--axis-text-primary)]", children: step.label }),
|
|
60
81
|
step.description && /* @__PURE__ */ jsx("p", { className: "text-xs text-[var(--axis-text-secondary)]", children: step.description }),
|
|
61
|
-
step.timestamp && /* @__PURE__ */ jsx("p", { className: "text-xs text-[var(--axis-text-tertiary)]", children: step.timestamp.
|
|
82
|
+
step.timestamp && /* @__PURE__ */ jsx("p", { className: "text-xs text-[var(--axis-text-tertiary)]", children: /* @__PURE__ */ jsx("time", { dateTime: step.timestamp.toISOString(), children: formatStepTime(step.timestamp) }) })
|
|
62
83
|
] })
|
|
63
84
|
]
|
|
64
85
|
},
|
|
@@ -39,8 +39,8 @@ function TokenUsageIndicator({
|
|
|
39
39
|
return "bg-[var(--axis-status-success)]";
|
|
40
40
|
};
|
|
41
41
|
const getTextColor = () => {
|
|
42
|
-
if (ratio >= 1) return "text-[var(--axis-
|
|
43
|
-
if (ratio >= warningThreshold) return "text-[var(--axis-
|
|
42
|
+
if (ratio >= 1) return "text-[var(--axis-text-error)]";
|
|
43
|
+
if (ratio >= warningThreshold) return "text-[var(--axis-text-warning)]";
|
|
44
44
|
return "text-[var(--axis-text-secondary)]";
|
|
45
45
|
};
|
|
46
46
|
const formatNumber = (n) => n >= 1e3 ? `${(n / 1e3).toFixed(1)}k` : String(n);
|
|
@@ -16,8 +16,8 @@ function TokenUsageIndicator({
|
|
|
16
16
|
return "bg-[var(--axis-status-success)]";
|
|
17
17
|
};
|
|
18
18
|
const getTextColor = () => {
|
|
19
|
-
if (ratio >= 1) return "text-[var(--axis-
|
|
20
|
-
if (ratio >= warningThreshold) return "text-[var(--axis-
|
|
19
|
+
if (ratio >= 1) return "text-[var(--axis-text-error)]";
|
|
20
|
+
if (ratio >= warningThreshold) return "text-[var(--axis-text-warning)]";
|
|
21
21
|
return "text-[var(--axis-text-secondary)]";
|
|
22
22
|
};
|
|
23
23
|
const formatNumber = (n) => n >= 1e3 ? `${(n / 1e3).toFixed(1)}k` : String(n);
|
|
@@ -38,22 +38,22 @@ var import_ui_react = require("@axis-ds/ui-react");
|
|
|
38
38
|
var import_a11y_labels = require("../constants/a11y-labels.js");
|
|
39
39
|
const statusConfig = {
|
|
40
40
|
pending: {
|
|
41
|
-
color: "text-[var(--axis-
|
|
41
|
+
color: "text-[var(--axis-text-tertiary)]",
|
|
42
42
|
icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "12", cy: "12", r: "10", strokeWidth: 2 }) })
|
|
43
43
|
},
|
|
44
44
|
running: {
|
|
45
45
|
color: "text-[var(--axis-status-running)]",
|
|
46
46
|
icon: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("svg", { className: "w-4 h-4 animate-spin motion-reduce:![animation-duration:3s]", viewBox: "0 0 24 24", fill: "none", children: [
|
|
47
47
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }),
|
|
48
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", {
|
|
48
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z" })
|
|
49
49
|
] })
|
|
50
50
|
},
|
|
51
51
|
success: {
|
|
52
|
-
color: "text-[var(--axis-
|
|
52
|
+
color: "text-[var(--axis-text-success)]",
|
|
53
53
|
icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) })
|
|
54
54
|
},
|
|
55
55
|
error: {
|
|
56
|
-
color: "text-[var(--axis-
|
|
56
|
+
color: "text-[var(--axis-text-error)]",
|
|
57
57
|
icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) })
|
|
58
58
|
}
|
|
59
59
|
};
|
|
@@ -100,7 +100,7 @@ function ToolCallCard({
|
|
|
100
100
|
] })
|
|
101
101
|
] }),
|
|
102
102
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
103
|
-
duration !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "text-xs text-[var(--axis-text-
|
|
103
|
+
duration !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "text-xs text-[var(--axis-text-secondary)]", children: [
|
|
104
104
|
duration,
|
|
105
105
|
"ms"
|
|
106
106
|
] }),
|
|
@@ -5,22 +5,22 @@ import { cn } from "@axis-ds/ui-react";
|
|
|
5
5
|
import { STATUS_LABELS } from "../constants/a11y-labels.mjs";
|
|
6
6
|
const statusConfig = {
|
|
7
7
|
pending: {
|
|
8
|
-
color: "text-[var(--axis-
|
|
8
|
+
color: "text-[var(--axis-text-tertiary)]",
|
|
9
9
|
icon: /* @__PURE__ */ jsx("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "10", strokeWidth: 2 }) })
|
|
10
10
|
},
|
|
11
11
|
running: {
|
|
12
12
|
color: "text-[var(--axis-status-running)]",
|
|
13
13
|
icon: /* @__PURE__ */ jsxs("svg", { className: "w-4 h-4 animate-spin motion-reduce:![animation-duration:3s]", viewBox: "0 0 24 24", fill: "none", children: [
|
|
14
14
|
/* @__PURE__ */ jsx("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }),
|
|
15
|
-
/* @__PURE__ */ jsx("path", {
|
|
15
|
+
/* @__PURE__ */ jsx("path", { fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z" })
|
|
16
16
|
] })
|
|
17
17
|
},
|
|
18
18
|
success: {
|
|
19
|
-
color: "text-[var(--axis-
|
|
19
|
+
color: "text-[var(--axis-text-success)]",
|
|
20
20
|
icon: /* @__PURE__ */ jsx("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) })
|
|
21
21
|
},
|
|
22
22
|
error: {
|
|
23
|
-
color: "text-[var(--axis-
|
|
23
|
+
color: "text-[var(--axis-text-error)]",
|
|
24
24
|
icon: /* @__PURE__ */ jsx("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) })
|
|
25
25
|
}
|
|
26
26
|
};
|
|
@@ -67,7 +67,7 @@ function ToolCallCard({
|
|
|
67
67
|
] })
|
|
68
68
|
] }),
|
|
69
69
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
70
|
-
duration !== void 0 && /* @__PURE__ */ jsxs("span", { className: "text-xs text-[var(--axis-text-
|
|
70
|
+
duration !== void 0 && /* @__PURE__ */ jsxs("span", { className: "text-xs text-[var(--axis-text-secondary)]", children: [
|
|
71
71
|
duration,
|
|
72
72
|
"ms"
|
|
73
73
|
] }),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@axis-ds/agentic-ui",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.8.1",
|
|
4
4
|
"description": "AXIS Design System - Agentic UI Components for AI/LLM Applications",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -178,8 +178,8 @@
|
|
|
178
178
|
"clsx": "^2.1.0",
|
|
179
179
|
"framer-motion": "^11.0.0",
|
|
180
180
|
"tailwind-merge": "^2.5.0",
|
|
181
|
-
"@axis-ds/tokens": "1.
|
|
182
|
-
"@axis-ds/ui-react": "1.
|
|
181
|
+
"@axis-ds/tokens": "1.8.1",
|
|
182
|
+
"@axis-ds/ui-react": "1.8.1"
|
|
183
183
|
},
|
|
184
184
|
"devDependencies": {
|
|
185
185
|
"@testing-library/jest-dom": "^6.9.1",
|