@axis-ds/agentic-ui 1.4.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/README.md +42 -1
  2. package/dist/agent-avatar/index.js +6 -16
  3. package/dist/agent-avatar/index.mjs +75 -4
  4. package/dist/approval-card/index.js +6 -16
  5. package/dist/approval-card/index.mjs +86 -4
  6. package/dist/attachment-card/index.js +5 -17
  7. package/dist/attachment-card/index.mjs +101 -4
  8. package/dist/code-block/index.js +2 -3
  9. package/dist/code-block/index.mjs +76 -3
  10. package/dist/constants/a11y-labels.d.mts +86 -0
  11. package/dist/constants/a11y-labels.d.ts +86 -0
  12. package/dist/constants/a11y-labels.js +105 -0
  13. package/dist/{chunk-SCZ4BQ2G.mjs → constants/a11y-labels.mjs} +21 -17
  14. package/dist/context-panel/index.js +2 -3
  15. package/dist/context-panel/index.mjs +99 -3
  16. package/dist/diff-viewer/index.js +8 -17
  17. package/dist/diff-viewer/index.mjs +155 -4
  18. package/dist/feedback-buttons/index.js +7 -16
  19. package/dist/feedback-buttons/index.mjs +65 -4
  20. package/dist/index.js +36 -1732
  21. package/dist/index.mjs +18 -55
  22. package/dist/message-bubble/index.js +5 -15
  23. package/dist/message-bubble/index.mjs +98 -4
  24. package/dist/plan-card/index.js +6 -28
  25. package/dist/plan-card/index.mjs +143 -4
  26. package/dist/recovery-banner/index.js +1 -3
  27. package/dist/recovery-banner/index.mjs +70 -3
  28. package/dist/run-progress/index.js +5 -19
  29. package/dist/run-progress/index.mjs +128 -4
  30. package/dist/source-panel/index.js +5 -15
  31. package/dist/source-panel/index.mjs +88 -4
  32. package/dist/step-timeline/index.js +3 -17
  33. package/dist/step-timeline/index.mjs +69 -4
  34. package/dist/streaming-text/index.js +2 -3
  35. package/dist/streaming-text/index.mjs +59 -3
  36. package/dist/surface-renderer/index.js +1 -3
  37. package/dist/surface-renderer/index.mjs +79 -3
  38. package/dist/thinking-indicator/index.js +3 -5
  39. package/dist/thinking-indicator/index.mjs +45 -3
  40. package/dist/token-usage-indicator/index.js +1 -3
  41. package/dist/token-usage-indicator/index.mjs +81 -3
  42. package/dist/tool-call-card/index.js +5 -18
  43. package/dist/tool-call-card/index.mjs +108 -4
  44. package/package.json +35 -5
  45. package/dist/chunk-42KEAZ2Y.mjs +0 -109
  46. package/dist/chunk-4CMUEGLK.mjs +0 -80
  47. package/dist/chunk-4V4BWBRC.mjs +0 -77
  48. package/dist/chunk-7HTVJ6MK.mjs +0 -94
  49. package/dist/chunk-DPLGRVNQ.mjs +0 -95
  50. package/dist/chunk-FYAMA32G.mjs +0 -50
  51. package/dist/chunk-GQYOOLDL.mjs +0 -63
  52. package/dist/chunk-IOF4OET6.mjs +0 -162
  53. package/dist/chunk-J4FIMXXG.mjs +0 -106
  54. package/dist/chunk-JY7MTMMB.mjs +0 -83
  55. package/dist/chunk-KJVPVBET.mjs +0 -103
  56. package/dist/chunk-OYQX3SL4.mjs +0 -152
  57. package/dist/chunk-QS6GQNSE.mjs +0 -86
  58. package/dist/chunk-R4CMHIRO.mjs +0 -72
  59. package/dist/chunk-SCXUEQLI.mjs +0 -136
  60. package/dist/chunk-UDL4M5RP.mjs +0 -75
  61. package/dist/chunk-WFYQINWD.mjs +0 -115
  62. package/dist/chunk-ZW4Z27AB.mjs +0 -84
package/dist/index.mjs CHANGED
@@ -1,58 +1,21 @@
1
- import {
2
- ThinkingIndicator
3
- } from "./chunk-FYAMA32G.mjs";
4
- import {
5
- TokenUsageIndicator
6
- } from "./chunk-QS6GQNSE.mjs";
7
- import {
8
- ToolCallCard
9
- } from "./chunk-WFYQINWD.mjs";
10
- import {
11
- MessageBubble
12
- } from "./chunk-J4FIMXXG.mjs";
13
- import {
14
- PlanCard
15
- } from "./chunk-OYQX3SL4.mjs";
16
- import {
17
- RecoveryBanner
18
- } from "./chunk-UDL4M5RP.mjs";
19
- import {
20
- RunProgress
21
- } from "./chunk-SCXUEQLI.mjs";
22
- import {
23
- SourcePanel
24
- } from "./chunk-DPLGRVNQ.mjs";
25
- import {
26
- StepTimeline
27
- } from "./chunk-4V4BWBRC.mjs";
28
- import {
29
- StreamingText
30
- } from "./chunk-GQYOOLDL.mjs";
31
- import {
32
- SurfaceRenderer
33
- } from "./chunk-ZW4Z27AB.mjs";
34
- import {
35
- AgentAvatar
36
- } from "./chunk-JY7MTMMB.mjs";
37
- import {
38
- ApprovalCard
39
- } from "./chunk-7HTVJ6MK.mjs";
40
- import {
41
- AttachmentCard
42
- } from "./chunk-42KEAZ2Y.mjs";
43
- import {
44
- CodeBlock
45
- } from "./chunk-4CMUEGLK.mjs";
46
- import {
47
- ContextPanel
48
- } from "./chunk-KJVPVBET.mjs";
49
- import {
50
- DiffViewer
51
- } from "./chunk-IOF4OET6.mjs";
52
- import {
53
- FeedbackButtons
54
- } from "./chunk-R4CMHIRO.mjs";
55
- import "./chunk-SCZ4BQ2G.mjs";
1
+ import { RunProgress } from "./run-progress/index.mjs";
2
+ import { StepTimeline } from "./step-timeline/index.mjs";
3
+ import { ThinkingIndicator } from "./thinking-indicator/index.mjs";
4
+ import { ApprovalCard } from "./approval-card/index.mjs";
5
+ import { SourcePanel } from "./source-panel/index.mjs";
6
+ import { StreamingText } from "./streaming-text/index.mjs";
7
+ import { ToolCallCard } from "./tool-call-card/index.mjs";
8
+ import { SurfaceRenderer } from "./surface-renderer/index.mjs";
9
+ import { RecoveryBanner } from "./recovery-banner/index.mjs";
10
+ import { AgentAvatar } from "./agent-avatar/index.mjs";
11
+ import { MessageBubble } from "./message-bubble/index.mjs";
12
+ import { FeedbackButtons } from "./feedback-buttons/index.mjs";
13
+ import { CodeBlock } from "./code-block/index.mjs";
14
+ import { DiffViewer } from "./diff-viewer/index.mjs";
15
+ import { PlanCard } from "./plan-card/index.mjs";
16
+ import { ContextPanel } from "./context-panel/index.mjs";
17
+ import { TokenUsageIndicator } from "./token-usage-indicator/index.mjs";
18
+ import { AttachmentCard } from "./attachment-card/index.mjs";
56
19
  export {
57
20
  AgentAvatar,
58
21
  ApprovalCard,
@@ -16,25 +16,15 @@ var __copyProps = (to, from, except, desc) => {
16
16
  return to;
17
17
  };
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
-
20
- // src/message-bubble/index.tsx
21
19
  var message_bubble_exports = {};
22
20
  __export(message_bubble_exports, {
23
21
  MessageBubble: () => MessageBubble
24
22
  });
25
23
  module.exports = __toCommonJS(message_bubble_exports);
26
- var import_ui_react = require("@axis-ds/ui-react");
27
-
28
- // src/constants/a11y-labels.ts
29
- var MESSAGE_ROLE_LABELS = {
30
- user: "\uC0AC\uC6A9\uC790",
31
- assistant: "\uC5B4\uC2DC\uC2A4\uD134\uD2B8",
32
- system: "\uC2DC\uC2A4\uD15C"
33
- };
34
-
35
- // src/message-bubble/index.tsx
36
24
  var import_jsx_runtime = require("react/jsx-runtime");
37
- var roleStyles = {
25
+ var import_ui_react = require("@axis-ds/ui-react");
26
+ var import_a11y_labels = require("../constants/a11y-labels.js");
27
+ const roleStyles = {
38
28
  user: {
39
29
  container: "flex-row-reverse",
40
30
  bubble: "bg-[var(--axis-agent-message-user-bg)] text-[var(--axis-agent-message-user-text)] rounded-br-sm"
@@ -48,7 +38,7 @@ var roleStyles = {
48
38
  bubble: "bg-[var(--axis-surface-tertiary)] text-[var(--axis-text-secondary)] text-xs italic"
49
39
  }
50
40
  };
51
- var statusIcons = {
41
+ const statusIcons = {
52
42
  sending: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("svg", { className: "w-3 h-3 animate-spin", viewBox: "0 0 24 24", fill: "none", children: [
53
43
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }),
54
44
  /* @__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" })
@@ -66,7 +56,7 @@ function MessageBubble({
66
56
  metadata,
67
57
  className
68
58
  }) {
69
- const roleLabel = MESSAGE_ROLE_LABELS[role];
59
+ const roleLabel = import_a11y_labels.MESSAGE_ROLE_LABELS[role];
70
60
  const renderAvatar = () => {
71
61
  if (!avatar) return null;
72
62
  if (typeof avatar === "string") {
@@ -1,7 +1,101 @@
1
- import {
2
- MessageBubble
3
- } from "../chunk-J4FIMXXG.mjs";
4
- import "../chunk-SCZ4BQ2G.mjs";
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { cn } from "@axis-ds/ui-react";
3
+ import { MESSAGE_ROLE_LABELS } from "../constants/a11y-labels.mjs";
4
+ const roleStyles = {
5
+ user: {
6
+ container: "flex-row-reverse",
7
+ bubble: "bg-[var(--axis-agent-message-user-bg)] text-[var(--axis-agent-message-user-text)] rounded-br-sm"
8
+ },
9
+ assistant: {
10
+ container: "flex-row",
11
+ bubble: "bg-[var(--axis-surface-secondary)] text-[var(--axis-text-primary)] rounded-bl-sm"
12
+ },
13
+ system: {
14
+ container: "justify-center",
15
+ bubble: "bg-[var(--axis-surface-tertiary)] text-[var(--axis-text-secondary)] text-xs italic"
16
+ }
17
+ };
18
+ const statusIcons = {
19
+ sending: /* @__PURE__ */ jsxs("svg", { className: "w-3 h-3 animate-spin", viewBox: "0 0 24 24", fill: "none", children: [
20
+ /* @__PURE__ */ jsx("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }),
21
+ /* @__PURE__ */ jsx("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z" })
22
+ ] }),
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" }) })
25
+ };
26
+ function MessageBubble({
27
+ role,
28
+ content,
29
+ timestamp,
30
+ avatar,
31
+ status,
32
+ actions,
33
+ metadata,
34
+ className
35
+ }) {
36
+ const roleLabel = MESSAGE_ROLE_LABELS[role];
37
+ const renderAvatar = () => {
38
+ if (!avatar) return null;
39
+ if (typeof avatar === "string") {
40
+ return /* @__PURE__ */ jsx(
41
+ "img",
42
+ {
43
+ src: avatar,
44
+ alt: "",
45
+ "aria-hidden": "true",
46
+ className: "w-8 h-8 rounded-full object-cover flex-shrink-0"
47
+ }
48
+ );
49
+ }
50
+ return /* @__PURE__ */ jsx("div", { className: "flex-shrink-0", children: avatar });
51
+ };
52
+ return /* @__PURE__ */ jsxs(
53
+ "div",
54
+ {
55
+ role: "article",
56
+ "aria-label": `${roleLabel} \uBA54\uC2DC\uC9C0`,
57
+ className: cn("flex items-start gap-2", roleStyles[role].container, className),
58
+ children: [
59
+ role !== "system" && renderAvatar(),
60
+ /* @__PURE__ */ jsxs("div", { className: cn("max-w-[80%]", role === "system" && "max-w-full"), children: [
61
+ /* @__PURE__ */ jsx(
62
+ "div",
63
+ {
64
+ className: cn(
65
+ "rounded-lg px-3 py-2",
66
+ roleStyles[role].bubble
67
+ ),
68
+ children: /* @__PURE__ */ jsx("div", { className: "text-sm whitespace-pre-wrap", children: content })
69
+ }
70
+ ),
71
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 mt-1 px-1", children: [
72
+ timestamp && /* @__PURE__ */ jsx(
73
+ "time",
74
+ {
75
+ dateTime: timestamp.toISOString(),
76
+ className: "text-xs text-[var(--axis-text-tertiary)]",
77
+ children: timestamp.toLocaleTimeString("ko-KR", { hour: "2-digit", minute: "2-digit" })
78
+ }
79
+ ),
80
+ metadata && /* @__PURE__ */ jsx("span", { className: "text-xs text-[var(--axis-text-tertiary)]", children: metadata }),
81
+ status && /* @__PURE__ */ jsx(
82
+ "span",
83
+ {
84
+ className: cn(
85
+ "text-[var(--axis-text-tertiary)]",
86
+ status === "error" && "text-[var(--axis-text-error)]"
87
+ ),
88
+ "aria-label": status === "sending" ? "\uC804\uC1A1 \uC911" : status === "sent" ? "\uC804\uC1A1\uB428" : "\uC804\uC1A1 \uC2E4\uD328",
89
+ children: statusIcons[status]
90
+ }
91
+ )
92
+ ] }),
93
+ actions && /* @__PURE__ */ jsx("div", { className: "mt-1", children: actions })
94
+ ] })
95
+ ]
96
+ }
97
+ );
98
+ }
5
99
  export {
6
100
  MessageBubble
7
101
  };
@@ -26,38 +26,16 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
26
  mod
27
27
  ));
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
-
30
- // src/plan-card/index.tsx
31
29
  var plan_card_exports = {};
32
30
  __export(plan_card_exports, {
33
31
  PlanCard: () => PlanCard
34
32
  });
35
33
  module.exports = __toCommonJS(plan_card_exports);
34
+ var import_jsx_runtime = require("react/jsx-runtime");
36
35
  var React = __toESM(require("react"));
37
36
  var import_ui_react = require("@axis-ds/ui-react");
38
-
39
- // src/constants/a11y-labels.ts
40
- var STATUS_LABELS = {
41
- pending: "\uB300\uAE30 \uC911",
42
- running: "\uC2E4\uD589 \uC911",
43
- complete: "\uC644\uB8CC",
44
- success: "\uC131\uACF5",
45
- error: "\uC624\uB958",
46
- skipped: "\uAC74\uB108\uB700",
47
- idle: "\uB300\uAE30 \uC911"
48
- };
49
- var PLAN_STATUS_LABELS = {
50
- draft: "\uCD08\uC548",
51
- pending: "\uC2B9\uC778 \uB300\uAE30",
52
- approved: "\uC2B9\uC778\uB428",
53
- rejected: "\uAC70\uC808\uB428",
54
- executing: "\uC2E4\uD589 \uC911",
55
- completed: "\uC644\uB8CC"
56
- };
57
-
58
- // src/plan-card/index.tsx
59
- var import_jsx_runtime = require("react/jsx-runtime");
60
- var planStatusStyles = {
37
+ var import_a11y_labels = require("../constants/a11y-labels.js");
38
+ const planStatusStyles = {
61
39
  draft: {
62
40
  border: "border-l-[var(--axis-status-neutral)]",
63
41
  badge: "bg-[var(--axis-status-neutral-bg)] text-[var(--axis-status-neutral-strong)]"
@@ -83,7 +61,7 @@ var planStatusStyles = {
83
61
  badge: "bg-[var(--axis-badge-success-bg)] text-[var(--axis-badge-success-text)]"
84
62
  }
85
63
  };
86
- var stepStatusIcons = {
64
+ const stepStatusIcons = {
87
65
  pending: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { className: "w-4 h-4 text-[var(--axis-status-neutral)]", 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 }) }),
88
66
  running: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("svg", { className: "w-4 h-4 text-[var(--axis-status-running)] animate-spin", viewBox: "0 0 24 24", fill: "none", children: [
89
67
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }),
@@ -104,7 +82,7 @@ function PlanCard({
104
82
  }) {
105
83
  const styles = planStatusStyles[status];
106
84
  const titleId = React.useId();
107
- const statusLabel = PLAN_STATUS_LABELS[status];
85
+ const statusLabel = import_a11y_labels.PLAN_STATUS_LABELS[status];
108
86
  const completedCount = steps.filter((s) => s.status === "complete").length;
109
87
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
110
88
  "div",
@@ -144,7 +122,7 @@ function PlanCard({
144
122
  ] })
145
123
  ] }),
146
124
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { role: "list", "aria-label": "\uC2E4\uD589 \uB2E8\uACC4", className: "border-t border-[var(--axis-border-default)] divide-y divide-[var(--axis-border-default)]", children: steps.map((step) => {
147
- const stepStatusLabel = STATUS_LABELS[step.status] || step.status;
125
+ const stepStatusLabel = import_a11y_labels.STATUS_LABELS[step.status] || step.status;
148
126
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
149
127
  "div",
150
128
  {
@@ -1,7 +1,146 @@
1
- import {
2
- PlanCard
3
- } from "../chunk-OYQX3SL4.mjs";
4
- import "../chunk-SCZ4BQ2G.mjs";
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { cn } from "@axis-ds/ui-react";
4
+ import { PLAN_STATUS_LABELS, STATUS_LABELS } from "../constants/a11y-labels.mjs";
5
+ const planStatusStyles = {
6
+ draft: {
7
+ border: "border-l-[var(--axis-status-neutral)]",
8
+ badge: "bg-[var(--axis-status-neutral-bg)] text-[var(--axis-status-neutral-strong)]"
9
+ },
10
+ pending: {
11
+ border: "border-l-[var(--axis-status-warning)]",
12
+ badge: "bg-[var(--axis-badge-warning-bg)] text-[var(--axis-badge-warning-text)]"
13
+ },
14
+ approved: {
15
+ border: "border-l-[var(--axis-status-success)]",
16
+ badge: "bg-[var(--axis-badge-success-bg)] text-[var(--axis-badge-success-text)]"
17
+ },
18
+ rejected: {
19
+ border: "border-l-[var(--axis-status-error)]",
20
+ badge: "bg-[var(--axis-badge-error-bg)] text-[var(--axis-badge-error-text)]"
21
+ },
22
+ executing: {
23
+ border: "border-l-[var(--axis-status-running)]",
24
+ badge: "bg-[var(--axis-badge-info-bg)] text-[var(--axis-badge-info-text)]"
25
+ },
26
+ completed: {
27
+ border: "border-l-[var(--axis-status-success)]",
28
+ badge: "bg-[var(--axis-badge-success-bg)] text-[var(--axis-badge-success-text)]"
29
+ }
30
+ };
31
+ const stepStatusIcons = {
32
+ pending: /* @__PURE__ */ jsx("svg", { className: "w-4 h-4 text-[var(--axis-status-neutral)]", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "10", strokeWidth: 2 }) }),
33
+ running: /* @__PURE__ */ jsxs("svg", { className: "w-4 h-4 text-[var(--axis-status-running)] animate-spin", viewBox: "0 0 24 24", fill: "none", children: [
34
+ /* @__PURE__ */ jsx("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }),
35
+ /* @__PURE__ */ jsx("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z" })
36
+ ] }),
37
+ complete: /* @__PURE__ */ jsx("svg", { className: "w-4 h-4 text-[var(--axis-status-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-status-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-status-neutral)]", 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
+ };
41
+ function PlanCard({
42
+ title,
43
+ steps,
44
+ status = "pending",
45
+ onApprove,
46
+ onEdit,
47
+ onReject,
48
+ className
49
+ }) {
50
+ const styles = planStatusStyles[status];
51
+ const titleId = React.useId();
52
+ const statusLabel = PLAN_STATUS_LABELS[status];
53
+ const completedCount = steps.filter((s) => s.status === "complete").length;
54
+ return /* @__PURE__ */ jsxs(
55
+ "div",
56
+ {
57
+ role: "region",
58
+ "aria-labelledby": titleId,
59
+ className: cn(
60
+ "rounded-lg border border-l-[length:var(--axis-plan-card-accent-width)] overflow-hidden",
61
+ "bg-[var(--axis-surface-default)] border-[var(--axis-border-default)]",
62
+ styles.border,
63
+ className
64
+ ),
65
+ children: [
66
+ /* @__PURE__ */ jsxs("div", { className: "p-4", children: [
67
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between mb-2", children: [
68
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
69
+ /* @__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: "M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2" }) }),
70
+ /* @__PURE__ */ jsx("h4", { id: titleId, className: "text-sm font-semibold text-[var(--axis-text-primary)]", children: title })
71
+ ] }),
72
+ /* @__PURE__ */ jsx("span", { className: cn("text-xs px-2 py-0.5 rounded-full font-medium", styles.badge), children: statusLabel })
73
+ ] }),
74
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-xs text-[var(--axis-text-tertiary)]", children: [
75
+ /* @__PURE__ */ jsxs("span", { children: [
76
+ completedCount,
77
+ "/",
78
+ steps.length,
79
+ " \uB2E8\uACC4"
80
+ ] }),
81
+ steps.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex-1 h-1 rounded-full bg-[var(--axis-surface-secondary)] overflow-hidden", children: /* @__PURE__ */ jsx(
82
+ "div",
83
+ {
84
+ className: "h-full rounded-full bg-[var(--axis-status-success)] transition-all",
85
+ style: { width: `${completedCount / steps.length * 100}%` },
86
+ "aria-hidden": "true"
87
+ }
88
+ ) })
89
+ ] })
90
+ ] }),
91
+ /* @__PURE__ */ jsx("div", { role: "list", "aria-label": "\uC2E4\uD589 \uB2E8\uACC4", className: "border-t border-[var(--axis-border-default)] divide-y divide-[var(--axis-border-default)]", children: steps.map((step) => {
92
+ const stepStatusLabel = STATUS_LABELS[step.status] || step.status;
93
+ return /* @__PURE__ */ jsxs(
94
+ "div",
95
+ {
96
+ role: "listitem",
97
+ "aria-current": step.status === "running" ? "step" : void 0,
98
+ className: "flex items-start gap-3 px-4 py-2.5",
99
+ children: [
100
+ /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "mt-0.5 flex-shrink-0", children: stepStatusIcons[step.status] }),
101
+ /* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0", children: [
102
+ /* @__PURE__ */ jsxs("span", { className: "sr-only", children: [
103
+ stepStatusLabel,
104
+ ":"
105
+ ] }),
106
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-[var(--axis-text-primary)]", children: step.label }),
107
+ step.description && /* @__PURE__ */ jsx("p", { className: "text-xs text-[var(--axis-text-secondary)] mt-0.5", children: step.description })
108
+ ] })
109
+ ]
110
+ },
111
+ step.id
112
+ );
113
+ }) }),
114
+ (status === "pending" || status === "draft") && (onApprove || onEdit || onReject) && /* @__PURE__ */ jsxs("div", { className: "flex gap-2 p-3 border-t border-[var(--axis-border-default)] bg-[var(--axis-surface-secondary)]", children: [
115
+ onApprove && /* @__PURE__ */ jsx(
116
+ "button",
117
+ {
118
+ onClick: onApprove,
119
+ className: "px-3 py-1.5 text-xs font-medium rounded-md bg-[var(--axis-status-success)] text-[var(--axis-status-success-contrast)] hover:bg-[var(--axis-status-success-strong)] transition-colors",
120
+ children: "\uC2B9\uC778"
121
+ }
122
+ ),
123
+ onEdit && /* @__PURE__ */ jsx(
124
+ "button",
125
+ {
126
+ onClick: onEdit,
127
+ className: "px-3 py-1.5 text-xs font-medium rounded-md bg-[var(--axis-button-secondary-bg-default)] text-[var(--axis-text-primary)] hover:bg-[var(--axis-button-secondary-bg-hover)] transition-colors",
128
+ children: "\uC218\uC815"
129
+ }
130
+ ),
131
+ onReject && /* @__PURE__ */ jsx(
132
+ "button",
133
+ {
134
+ onClick: onReject,
135
+ className: "px-3 py-1.5 text-xs font-medium rounded-md text-[var(--axis-status-error)] hover:text-[var(--axis-plan-card-reject-hover-text)] hover:bg-[color:color-mix(in_srgb,var(--axis-status-error)_10%,transparent)] transition-colors",
136
+ children: "\uAC70\uC808"
137
+ }
138
+ )
139
+ ] })
140
+ ]
141
+ }
142
+ );
143
+ }
5
144
  export {
6
145
  PlanCard
7
146
  };
@@ -26,16 +26,14 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
26
  mod
27
27
  ));
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
-
30
- // src/recovery-banner/index.tsx
31
29
  var recovery_banner_exports = {};
32
30
  __export(recovery_banner_exports, {
33
31
  RecoveryBanner: () => RecoveryBanner
34
32
  });
35
33
  module.exports = __toCommonJS(recovery_banner_exports);
34
+ var import_jsx_runtime = require("react/jsx-runtime");
36
35
  var React = __toESM(require("react"));
37
36
  var import_ui_react = require("@axis-ds/ui-react");
38
- var import_jsx_runtime = require("react/jsx-runtime");
39
37
  function RecoveryBanner({
40
38
  message,
41
39
  description,
@@ -1,6 +1,73 @@
1
- import {
2
- RecoveryBanner
3
- } from "../chunk-UDL4M5RP.mjs";
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { cn } from "@axis-ds/ui-react";
4
+ function RecoveryBanner({
5
+ message,
6
+ description,
7
+ onRetry,
8
+ onDismiss,
9
+ className
10
+ }) {
11
+ const titleId = React.useId();
12
+ const descId = React.useId();
13
+ return /* @__PURE__ */ jsxs(
14
+ "div",
15
+ {
16
+ className: cn(
17
+ "flex items-start gap-3 p-4 rounded-lg border",
18
+ "bg-[var(--axis-surface-error)] border-[var(--axis-status-error-border)]",
19
+ className
20
+ ),
21
+ role: "alert",
22
+ "aria-labelledby": titleId,
23
+ "aria-describedby": description ? descId : void 0,
24
+ children: [
25
+ /* @__PURE__ */ jsx(
26
+ "svg",
27
+ {
28
+ className: "w-5 h-5 text-[var(--axis-status-error)] flex-shrink-0 mt-0.5",
29
+ fill: "none",
30
+ stroke: "currentColor",
31
+ viewBox: "0 0 24 24",
32
+ "aria-hidden": "true",
33
+ children: /* @__PURE__ */ jsx(
34
+ "path",
35
+ {
36
+ strokeLinecap: "round",
37
+ strokeLinejoin: "round",
38
+ strokeWidth: 2,
39
+ d: "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"
40
+ }
41
+ )
42
+ }
43
+ ),
44
+ /* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0", children: [
45
+ /* @__PURE__ */ jsx("p", { id: titleId, className: "text-sm font-medium text-[var(--axis-text-error)]", children: message }),
46
+ description && /* @__PURE__ */ jsx("p", { id: descId, className: "mt-1 text-sm text-[var(--axis-text-secondary)]", children: description }),
47
+ /* @__PURE__ */ jsxs("div", { className: "flex gap-2 mt-3", children: [
48
+ onRetry && /* @__PURE__ */ jsx(
49
+ "button",
50
+ {
51
+ onClick: onRetry,
52
+ "aria-describedby": descId,
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
+ children: "\uC7AC\uC2DC\uB3C4"
55
+ }
56
+ ),
57
+ onDismiss && /* @__PURE__ */ jsx(
58
+ "button",
59
+ {
60
+ onClick: onDismiss,
61
+ className: "px-3 py-1.5 text-sm font-medium rounded-md bg-transparent text-[var(--axis-text-primary)] hover:bg-[var(--axis-surface-secondary)] transition-colors",
62
+ children: "\uBB34\uC2DC"
63
+ }
64
+ )
65
+ ] })
66
+ ] })
67
+ ]
68
+ }
69
+ );
70
+ }
4
71
  export {
5
72
  RecoveryBanner
6
73
  };
@@ -26,36 +26,22 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
26
  mod
27
27
  ));
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
-
30
- // src/run-progress/index.tsx
31
29
  var run_progress_exports = {};
32
30
  __export(run_progress_exports, {
33
31
  RunProgress: () => RunProgress
34
32
  });
35
33
  module.exports = __toCommonJS(run_progress_exports);
34
+ var import_jsx_runtime = require("react/jsx-runtime");
36
35
  var React = __toESM(require("react"));
37
36
  var import_ui_react = require("@axis-ds/ui-react");
38
-
39
- // src/constants/a11y-labels.ts
40
- var STATUS_LABELS = {
41
- pending: "\uB300\uAE30 \uC911",
42
- running: "\uC2E4\uD589 \uC911",
43
- complete: "\uC644\uB8CC",
44
- success: "\uC131\uACF5",
45
- error: "\uC624\uB958",
46
- skipped: "\uAC74\uB108\uB700",
47
- idle: "\uB300\uAE30 \uC911"
48
- };
49
-
50
- // src/run-progress/index.tsx
51
- var import_jsx_runtime = require("react/jsx-runtime");
52
- var statusColors = {
37
+ var import_a11y_labels = require("../constants/a11y-labels.js");
38
+ const statusColors = {
53
39
  pending: "bg-[var(--axis-status-neutral-muted)] text-[var(--axis-status-neutral-muted-contrast)]",
54
40
  running: "bg-[var(--axis-status-running)] text-[var(--axis-status-running-contrast)] animate-pulse",
55
41
  complete: "bg-[var(--axis-status-success)] text-[var(--axis-status-success-contrast)]",
56
42
  error: "bg-[var(--axis-status-error)] text-[var(--axis-status-error-contrast)]"
57
43
  };
58
- var statusIcons = {
44
+ const statusIcons = {
59
45
  pending: null,
60
46
  running: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("svg", { className: "w-3 h-3 animate-spin", viewBox: "0 0 24 24", fill: "none", children: [
61
47
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }),
@@ -141,7 +127,7 @@ function RunProgress({
141
127
  ),
142
128
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex-1 min-w-0", children: [
143
129
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "sr-only", children: [
144
- STATUS_LABELS[step.status],
130
+ import_a11y_labels.STATUS_LABELS[step.status],
145
131
  ":"
146
132
  ] }),
147
133
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm font-medium text-[var(--axis-text-primary)] truncate", children: step.label }),