@mastra/playground-ui 48.1.0-alpha.1 → 49.0.0-alpha.3

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 (31) hide show
  1. package/CHANGELOG.md +69 -0
  2. package/dist/TokenBudget.css +51 -0
  3. package/dist/components/Steps.cjs.js +76 -44
  4. package/dist/components/Steps.cjs.js.map +1 -1
  5. package/dist/components/Steps.es.js +76 -44
  6. package/dist/components/Steps.es.js.map +1 -1
  7. package/dist/components/TokenBudget.cjs.js +126 -0
  8. package/dist/components/TokenBudget.cjs.js.map +1 -0
  9. package/dist/components/TokenBudget.d.ts +2 -0
  10. package/dist/components/TokenBudget.es.js +119 -0
  11. package/dist/components/TokenBudget.es.js.map +1 -0
  12. package/dist/domains/memory/components/thread-context-progress.cjs.js +9 -9
  13. package/dist/domains/memory/components/thread-context-progress.cjs.js.map +1 -1
  14. package/dist/domains/memory/components/thread-context-progress.es.js +7 -7
  15. package/dist/domains/memory/components/thread-context-progress.es.js.map +1 -1
  16. package/dist/src/ds/components/Steps/process-step-list-item.d.ts +6 -2
  17. package/dist/src/ds/components/Steps/steps.stories.d.ts +1 -0
  18. package/dist/src/ds/components/TokenBudget/index.d.ts +4 -0
  19. package/dist/src/ds/components/TokenBudget/token-budget-detail.d.ts +17 -0
  20. package/dist/src/ds/components/TokenBudget/token-budget.d.ts +13 -0
  21. package/dist/src/ds/components/TokenBudget/tones.d.ts +6 -0
  22. package/dist/style.css +45 -60
  23. package/dist/{domains/memory/components/thread-context-progress-utils.cjs.js → tones-BGChDydJ.cjs} +8 -3
  24. package/dist/tones-BGChDydJ.cjs.map +1 -0
  25. package/dist/{domains/memory/components/thread-context-progress-utils.es.js → tones-CzIKDKD-.js} +8 -2
  26. package/dist/tones-CzIKDKD-.js.map +1 -0
  27. package/package.json +7 -7
  28. package/dist/domains/memory/components/thread-context-progress-utils.cjs.js.map +0 -1
  29. package/dist/domains/memory/components/thread-context-progress-utils.d.ts +0 -2
  30. package/dist/domains/memory/components/thread-context-progress-utils.es.js.map +0 -1
  31. /package/dist/src/{domains/memory/components/thread-context-progress-utils.d.ts → ds/components/TokenBudget/format-tokens.d.ts} +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,74 @@
1
1
  # @mastra/playground-ui
2
2
 
3
+ ## 49.0.0-alpha.3
4
+
5
+ ### Patch Changes
6
+
7
+ - Flattened the step markers in the `plain` variant of `ProcessStepListItem`. A completed step now shows a green check on its own instead of a filled green disc with a glow behind it, and the pending, running and completed markers finally share the same diameter — the dashed pending circle used to be 28px next to an 11px spinner. ([#21414](https://github.com/mastra-ai/mastra/pull/21414))
8
+
9
+ - Updated dependencies [[`d118873`](https://github.com/mastra-ai/mastra/commit/d118873cfd5074b1f814a1c169a97ca7a3a29174), [`161258b`](https://github.com/mastra-ai/mastra/commit/161258b3473a6d0fce00a43cab59d119a49a232f), [`8ea8038`](https://github.com/mastra-ai/mastra/commit/8ea80386fde53d26e2c0b2060c53bc9bd9be10f3)]:
10
+ - @mastra/core@1.59.0-alpha.3
11
+ - @mastra/client-js@1.40.0-alpha.3
12
+ - @mastra/react@1.4.3-alpha.3
13
+
14
+ ## 49.0.0-alpha.2
15
+
16
+ ### Minor Changes
17
+
18
+ - Added two status-strip pieces so any app showing a chat runtime — Studio, Factory — reads the same way. `TokenBudget` draws a token budget as a ring with its reading beside it, and `TokenBudgetDetail` is that budget in full for a popover or panel: ([#21366](https://github.com/mastra-ai/mastra/pull/21366))
19
+
20
+ ```tsx
21
+ import { TokenBudget, TokenBudgetDetail } from '@mastra/playground-ui/components/TokenBudget';
22
+
23
+ <div className="flex items-center gap-1.5">
24
+ <TokenBudget label="Message window" tokens={14_900} threshold={30_000} working={isObserving} />
25
+ <TokenBudget label="Observations" tokens={5_200} threshold={8_000} tone="memory" />
26
+ </div>;
27
+
28
+ <TokenBudgetDetail
29
+ description="Read into memory once full"
30
+ icon={<MessageSquare />}
31
+ label="Messages"
32
+ projected={6_000}
33
+ tokens={14_900}
34
+ threshold={30_000}
35
+ />;
36
+ ```
37
+
38
+ The two are separate so the app decides how a budget opens — one trigger per budget, or one control for a whole group. `TokenBudgetDetail` hatches the slice a pending pass will free (`projected`) at the end of its bar, so the number and where it goes read together, and takes an `icon` it tints with the budget's own color so a detail row is recognizable as the ring it came from.
39
+
40
+ `working` runs a highlight around the ring, so a pass happening in the background is visible without a word for it. `tone` picks the budget's identity color (`messages`, `memory`, `warning`), which the memory panel's own progress bars now share instead of repeating the palette classes.
41
+
42
+ Fixed those same memory panel bars drawing a budget as completely full when its threshold was zero.
43
+
44
+ - Improved process step indicators with theme-aware status colors and a plain embedded style. ([#21382](https://github.com/mastra-ai/mastra/pull/21382))
45
+
46
+ **Step labels now come from `title`.** `ProcessStepListItem` used to build its heading from the step id and ignore the `title` you passed, so display copy had to live in kebab-case ids. Give the step the label you want on screen:
47
+
48
+ ```tsx
49
+ const step = { id: 'clone-repo', title: 'Cloning repository', status: 'running', description: '', isActive: true };
50
+
51
+ <ProcessStepListItem step={step} isActive position={1} />;
52
+ // before: "Clone repo"
53
+ // after: "Cloning repository"
54
+ ```
55
+
56
+ The `stepId` prop is now optional and ignored; drop it from your call sites.
57
+
58
+ **Added a `plain` variant to `ProcessStepListItem`** — for step lists that already sit inside a panel, where the boxed active card is one frame too many:
59
+
60
+ ```tsx
61
+ <ProcessStepListItem step={step} isActive={step.status === 'running'} position={1} variant="plain" />
62
+ ```
63
+
64
+ ### Patch Changes
65
+
66
+ - Updated dependencies [[`898bba4`](https://github.com/mastra-ai/mastra/commit/898bba46d4806dd255a44e5dc3a3d5827eaefdfe), [`4539d73`](https://github.com/mastra-ai/mastra/commit/4539d737bea0e885dfc1e376def99bb7c35a9fbc), [`f9aab1c`](https://github.com/mastra-ai/mastra/commit/f9aab1cfc3fda03238a7fd7bd8b794e07497878c), [`e31421b`](https://github.com/mastra-ai/mastra/commit/e31421bc9c11c03c6e74f447ecb5820000e2b9d7), [`f9aab1c`](https://github.com/mastra-ai/mastra/commit/f9aab1cfc3fda03238a7fd7bd8b794e07497878c), [`aece0e7`](https://github.com/mastra-ai/mastra/commit/aece0e7cb124ae1eb1230689b887f5554b9a0bf0), [`f82f22f`](https://github.com/mastra-ai/mastra/commit/f82f22f56c58ab90e8a7501aaa5039a4e13cfe8b)]:
67
+ - @mastra/core@1.59.0-alpha.2
68
+ - @mastra/client-js@1.40.0-alpha.2
69
+ - @mastra/memory@1.26.2-alpha.1
70
+ - @mastra/react@1.4.3-alpha.2
71
+
3
72
  ## 48.1.0-alpha.1
4
73
 
5
74
  ### Minor Changes
@@ -0,0 +1,51 @@
1
+ /* Hatching reads as provisional: the slice of the fill a pending pass will free. */
2
+ .token-budget-hatch {
3
+ background-image: repeating-linear-gradient(
4
+ -45deg,
5
+ currentcolor 0 1.5px,
6
+ color-mix(in oklab, currentcolor 25%, transparent) 1.5px 4px
7
+ );
8
+ }
9
+
10
+ .token-budget-dial {
11
+ display: block;
12
+ flex: none;
13
+ inline-size: 0.875rem;
14
+ block-size: 0.875rem;
15
+ }
16
+
17
+ .token-budget-dial circle {
18
+ fill: none;
19
+ stroke-linecap: round;
20
+ }
21
+
22
+ .token-budget-track {
23
+ stroke: color-mix(in oklab, currentcolor 22%, transparent);
24
+ }
25
+
26
+ /* The wedge starts at noon rather than at three o'clock. */
27
+ .token-budget-arc {
28
+ transform: rotate(-90deg);
29
+ transform-origin: 10px 10px;
30
+ }
31
+
32
+ /* While work runs, the wedge is painted by a light travelling along the stroke —
33
+ * `shimmer-text` transposed to an arc, so nothing moves beside the dial. */
34
+ .token-budget-sheen {
35
+ transform-origin: 10px 10px;
36
+ animation: token-budget-sweep 1.6s linear infinite;
37
+ }
38
+
39
+ @keyframes token-budget-sweep {
40
+ to {
41
+ transform: rotate(360deg);
42
+ }
43
+ }
44
+
45
+ /* Without motion the light still has to separate work from rest, so it parks on the wedge. */
46
+ @media (prefers-reduced-motion: reduce) {
47
+ .token-budget-sheen {
48
+ animation: none;
49
+ transform: rotate(120deg);
50
+ }
51
+ }
@@ -11,28 +11,81 @@ const utils_cn = require('../cn-vA5sWo9W.cjs');
11
11
  function getStatusIcon(status) {
12
12
  switch (status) {
13
13
  case "running":
14
- return /* @__PURE__ */ jsxRuntime.jsx(spinner.Spinner, {});
14
+ return /* @__PURE__ */ jsxRuntime.jsx(spinner.Spinner, { size: "sm", "aria-hidden": true });
15
15
  case "success":
16
- return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CheckIcon, {});
16
+ return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CheckIcon, { "aria-hidden": true });
17
17
  case "failed":
18
- return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.XIcon, {});
18
+ return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.XIcon, { "aria-hidden": true });
19
19
  default:
20
20
  return null;
21
21
  }
22
22
  }
23
23
 
24
- function ProcessStepListItem({ stepId, step, isActive, position }) {
25
- const formatStepTitle = (stepId2) => {
26
- return stepId2.charAt(0).toUpperCase() + stepId2.slice(1).replace(/-/g, " ");
27
- };
24
+ function PendingRing() {
25
+ return /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", className: "text-neutral2", "aria-hidden": true, children: /* @__PURE__ */ jsxRuntime.jsx(
26
+ "circle",
27
+ {
28
+ cx: "12",
29
+ cy: "12",
30
+ r: "8.5",
31
+ pathLength: "48",
32
+ fill: "none",
33
+ stroke: "currentcolor",
34
+ strokeWidth: "2.8",
35
+ strokeLinecap: "round",
36
+ strokeDasharray: "3 3"
37
+ }
38
+ ) });
39
+ }
40
+ function StepStatusMarker({ status, variant }) {
41
+ if (variant === "plain") {
42
+ return /* @__PURE__ */ jsxRuntime.jsx(
43
+ "span",
44
+ {
45
+ className: utils_cn.cn("flex size-4 items-center justify-center self-center [&>svg]:size-4", primitives_transitions.transitions.colors, {
46
+ "[&>svg]:text-positive1": status === "success",
47
+ "[&>svg]:text-negative1": status === "failed"
48
+ }),
49
+ children: status === "pending" ? /* @__PURE__ */ jsxRuntime.jsx(PendingRing, {}) : getStatusIcon(status)
50
+ }
51
+ );
52
+ }
53
+ return /* @__PURE__ */ jsxRuntime.jsx(
54
+ "span",
55
+ {
56
+ className: utils_cn.cn(
57
+ "flex size-7 items-center justify-center self-center rounded-full motion-reduce:transition-none",
58
+ primitives_transitions.transitions.colors,
59
+ primitives_transitions.transitions.transform,
60
+ primitives_transitions.transitions.shadow,
61
+ {
62
+ "[&>svg]:text-notice-success-fg": status === "success",
63
+ "[&>svg]:text-notice-destructive-fg": status === "failed",
64
+ "border border-dashed border-neutral2": status === "pending",
65
+ "[&>svg]:size-4": status !== "running",
66
+ "bg-accent1Dark shadow-glow-accent1": status === "success",
67
+ "bg-accent2Dark shadow-glow-accent2": status === "failed",
68
+ "scale-110": status === "success" || status === "failed"
69
+ }
70
+ ),
71
+ children: getStatusIcon(status)
72
+ }
73
+ );
74
+ }
75
+ function ProcessStepListItem({ step, isActive, position, variant = "default" }) {
28
76
  return /* @__PURE__ */ jsxRuntime.jsxs(
29
77
  "div",
30
78
  {
31
- className: utils_cn.cn("grid grid-cols-[1fr_auto] gap-6 rounded-lg px-4 py-3", primitives_transitions.transitions.all, {
32
- "border border-dashed border-neutral2 bg-surface3": isActive
33
- }),
79
+ className: utils_cn.cn(
80
+ "grid grid-cols-[1fr_auto] gap-6 rounded-lg px-4 py-3 motion-reduce:transition-none",
81
+ primitives_transitions.transitions.colors,
82
+ {
83
+ "border border-transparent": variant === "default",
84
+ "border-dashed border-neutral2 bg-surface3": isActive && variant === "default"
85
+ }
86
+ ),
34
87
  children: [
35
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-[auto_1fr] gap-2", children: [
88
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid min-w-0 grid-cols-[auto_1fr] gap-2", children: [
36
89
  /* @__PURE__ */ jsxRuntime.jsxs(
37
90
  "span",
38
91
  {
@@ -46,7 +99,7 @@ function ProcessStepListItem({ stepId, step, isActive, position }) {
46
99
  ]
47
100
  }
48
101
  ),
49
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
102
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0", children: [
50
103
  /* @__PURE__ */ jsxRuntime.jsx(
51
104
  "h4",
52
105
  {
@@ -54,42 +107,20 @@ function ProcessStepListItem({ stepId, step, isActive, position }) {
54
107
  "text-neutral5": isActive || step.status === "success",
55
108
  "text-neutral3": !isActive && step.status !== "success"
56
109
  }),
57
- children: formatStepTitle(stepId)
110
+ children: step.title
58
111
  }
59
112
  ),
60
- step.description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-ui-md text-neutral2 -mt-0.5", children: step.description })
113
+ step.description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: utils_cn.cn("-mt-0.5 text-ui-md text-neutral2", { truncate: variant === "plain" }), children: step.description })
61
114
  ] })
62
115
  ] }),
63
- /* @__PURE__ */ jsxRuntime.jsx(
64
- "div",
65
- {
66
- className: utils_cn.cn("flex size-[1.75rem] items-center justify-center self-center rounded-full", primitives_transitions.transitions.all, {
67
- "border border-neutral2 border-dashed": step.status === "pending",
68
- "[&>svg]:text-white [&>svg]:w-4 [&>svg]:h-4": step.status !== "running",
69
- "w-[1.75rem] h-[1.75rem]": step.status === "running",
70
- "bg-accent1Dark shadow-glow-accent1": step.status === "success",
71
- "bg-accent2Dark shadow-glow-accent2": step.status === "failed",
72
- "scale-110": step.status === "success" || step.status === "failed"
73
- }),
74
- children: getStatusIcon(step.status)
75
- }
76
- )
116
+ /* @__PURE__ */ jsxRuntime.jsx(StepStatusMarker, { status: step.status, variant })
77
117
  ]
78
118
  }
79
119
  );
80
120
  }
81
121
 
82
122
  function ProcessStepList({ currentStep, steps = [], className }) {
83
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: utils_cn.cn(className), children: steps.map((step, idx) => /* @__PURE__ */ jsxRuntime.jsx(
84
- ProcessStepListItem,
85
- {
86
- stepId: step.id,
87
- step,
88
- isActive: currentStep?.id === step.id,
89
- position: idx + 1
90
- },
91
- step.id
92
- )) });
123
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: utils_cn.cn(className), children: steps.map((step, idx) => /* @__PURE__ */ jsxRuntime.jsx(ProcessStepListItem, { step, isActive: currentStep?.id === step.id, position: idx + 1 }, step.id)) });
93
124
  }
94
125
 
95
126
  function ProcessStepProgressBar({ steps }) {
@@ -107,13 +138,14 @@ function ProcessStepProgressBar({ steps }) {
107
138
  "div",
108
139
  {
109
140
  className: utils_cn.cn(
110
- "absolute right-0 z-10 flex size-[2rem] translate-x-[50%] items-center justify-center self-center rounded-full bg-surface3 text-ui-sm font-bold text-neutral3",
111
- primitives_transitions.transitions.all,
141
+ "absolute right-0 z-10 flex size-8 translate-x-1/2 items-center justify-center self-center rounded-full bg-surface3 text-ui-sm font-bold text-neutral3 motion-reduce:transition-none",
142
+ primitives_transitions.transitions.colors,
143
+ primitives_transitions.transitions.transform,
144
+ primitives_transitions.transitions.shadow,
112
145
  {
113
- "border border-neutral2 border-dashed": step.status === "pending",
114
- "[&>svg]:text-surface1 [&>svg]:w-[1.1rem] [&>svg]:h-[1.1rem]": step.status !== "running",
115
- "bg-accent1Dark text-white shadow-glow-accent1 scale-110": step.status === "success",
116
- "bg-accent2Dark text-white shadow-glow-accent2 scale-110": step.status === "failed"
146
+ "border border-dashed border-neutral2": step.status === "pending",
147
+ "bg-accent1Dark text-notice-success-fg shadow-glow-accent1 scale-110": step.status === "success",
148
+ "bg-accent2Dark text-notice-destructive-fg shadow-glow-accent2 scale-110": step.status === "failed"
117
149
  }
118
150
  ),
119
151
  children: step.status === "running" ? /* @__PURE__ */ jsxRuntime.jsx(spinner.Spinner, {}) : idx + 1
@@ -1 +1 @@
1
- {"version":3,"file":"Steps.cjs.js","sources":["../../src/ds/components/Steps/shared.tsx","../../src/ds/components/Steps/process-step-list-item.tsx","../../src/ds/components/Steps/process-step-list.tsx","../../src/ds/components/Steps/process-step-progress-bar.tsx"],"sourcesContent":["import { CheckIcon, XIcon } from 'lucide-react';\nimport { Spinner } from '@/ds/components/Spinner';\n\nexport function getStatusIcon(status: string) {\n switch (status) {\n case 'running':\n return <Spinner />;\n case 'success':\n return <CheckIcon />;\n case 'failed':\n return <XIcon />;\n default:\n return null;\n }\n}\n\nexport type ProcessStep = {\n id: string;\n status: string;\n description: string;\n title: string;\n isActive: boolean;\n};\n","import { getStatusIcon } from './shared';\nimport type { ProcessStep } from './shared';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport type ProcessStepListItemProps = {\n stepId: string;\n step: ProcessStep;\n isActive: boolean;\n position: number;\n};\n\nexport function ProcessStepListItem({ stepId, step, isActive, position }: ProcessStepListItemProps) {\n // Always format the step ID as the title\n const formatStepTitle = (stepId: string) => {\n return stepId.charAt(0).toUpperCase() + stepId.slice(1).replace(/-/g, ' ');\n };\n\n return (\n <div\n className={cn('grid grid-cols-[1fr_auto] gap-6 rounded-lg px-4 py-3', transitions.all, {\n 'border border-dashed border-neutral2 bg-surface3': isActive,\n })}\n >\n <div className=\"grid grid-cols-[auto_1fr] gap-2\">\n <span\n className={cn('flex min-w-6 justify-end text-ui-md', transitions.colors, {\n 'text-neutral5': isActive || step.status === 'success',\n 'text-neutral3': !isActive && step.status !== 'success',\n })}\n >\n {position}.\n </span>\n <div>\n <h4\n className={cn('text-ui-md', transitions.colors, {\n 'text-neutral5': isActive || step.status === 'success',\n 'text-neutral3': !isActive && step.status !== 'success',\n })}\n >\n {formatStepTitle(stepId)}\n </h4>\n {step.description && <p className=\"text-ui-md text-neutral2 -mt-0.5\">{step.description}</p>}\n </div>\n </div>\n <div\n className={cn('flex size-[1.75rem] items-center justify-center self-center rounded-full', transitions.all, {\n 'border border-neutral2 border-dashed': step.status === 'pending',\n '[&>svg]:text-white [&>svg]:w-4 [&>svg]:h-4': step.status !== 'running',\n 'w-[1.75rem] h-[1.75rem]': step.status === 'running',\n 'bg-accent1Dark shadow-glow-accent1': step.status === 'success',\n 'bg-accent2Dark shadow-glow-accent2': step.status === 'failed',\n 'scale-110': step.status === 'success' || step.status === 'failed',\n })}\n >\n {getStatusIcon(step.status)}\n </div>\n </div>\n );\n}\n","import { ProcessStepListItem } from './process-step-list-item';\nimport type { ProcessStep } from './shared';\nimport { cn } from '@/lib/utils';\n\nexport type ProcessStepListProps = {\n currentStep: ProcessStep | null;\n steps: ProcessStep[];\n className?: string;\n};\n\nexport function ProcessStepList({ currentStep, steps = [], className }: ProcessStepListProps) {\n return (\n <div className={cn(className)}>\n {steps.map((step: ProcessStep, idx: number) => (\n <ProcessStepListItem\n key={step.id}\n stepId={step.id}\n step={step}\n isActive={currentStep?.id === step.id}\n position={idx + 1}\n />\n ))}\n </div>\n );\n}\n","import type { ProcessStep } from './shared';\nimport { Spinner } from '@/ds/components/Spinner';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport type ProcessStepProgressBarProps = {\n steps: ProcessStep[];\n};\n\nexport function ProcessStepProgressBar({ steps }: ProcessStepProgressBarProps) {\n const totalSteps = steps.length;\n const completedSteps = steps.filter(step => step.status === 'success').length;\n\n return (\n <div className=\"flex w-full flex-col content-center justify-center gap-4\">\n <div className=\"grid w-full grid-cols-[0_repeat(9,1fr)]\">\n {steps.map((step: ProcessStep, idx: number) => {\n return (\n <div\n key={step.id}\n className={cn('relative flex h-8 items-center justify-end', transitions.colors, {\n 'bg-accent1Dark': step.status === 'success' && steps?.[idx - 1]?.status === 'success',\n })}\n >\n <div\n className={cn(\n 'absolute right-0 z-10 flex size-[2rem] translate-x-[50%] items-center justify-center self-center rounded-full bg-surface3 text-ui-sm font-bold text-neutral3',\n transitions.all,\n {\n 'border border-neutral2 border-dashed': step.status === 'pending',\n '[&>svg]:text-surface1 [&>svg]:w-[1.1rem] [&>svg]:h-[1.1rem]': step.status !== 'running',\n 'bg-accent1Dark text-white shadow-glow-accent1 scale-110': step.status === 'success',\n 'bg-accent2Dark text-white shadow-glow-accent2 scale-110': step.status === 'failed',\n },\n )}\n >\n {step.status === 'running' ? <Spinner /> : idx + 1}\n </div>\n </div>\n );\n })}\n </div>\n <div className={cn('text-center text-xs text-neutral3', transitions.colors)}>\n {completedSteps} of {totalSteps} steps completed\n </div>\n </div>\n );\n}\n"],"names":["Spinner","CheckIcon","XIcon","stepId","jsxs","cn","transitions","jsx"],"mappings":"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"}
1
+ {"version":3,"file":"Steps.cjs.js","sources":["../../src/ds/components/Steps/shared.tsx","../../src/ds/components/Steps/process-step-list-item.tsx","../../src/ds/components/Steps/process-step-list.tsx","../../src/ds/components/Steps/process-step-progress-bar.tsx"],"sourcesContent":["import { CheckIcon, XIcon } from 'lucide-react';\nimport { Spinner } from '@/ds/components/Spinner';\n\nexport function getStatusIcon(status: string) {\n switch (status) {\n case 'running':\n return <Spinner size=\"sm\" aria-hidden />;\n case 'success':\n return <CheckIcon aria-hidden />;\n case 'failed':\n return <XIcon aria-hidden />;\n default:\n return null;\n }\n}\n\nexport type ProcessStep = {\n id: string;\n status: string;\n description: string;\n title: string;\n isActive: boolean;\n};\n","import { getStatusIcon } from './shared';\nimport type { ProcessStep } from './shared';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\ntype ProcessStepListItemVariant = 'default' | 'plain';\n\n/** Same ring geometry and stroke as `<Spinner size=\"sm\" />`, so pending and running read as one shape. */\nfunction PendingRing() {\n return (\n <svg viewBox=\"0 0 24 24\" className=\"text-neutral2\" aria-hidden>\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"8.5\"\n pathLength=\"48\"\n fill=\"none\"\n stroke=\"currentcolor\"\n strokeWidth=\"2.8\"\n strokeLinecap=\"round\"\n strokeDasharray=\"3 3\"\n />\n </svg>\n );\n}\n\nfunction StepStatusMarker({ status, variant }: { status: string; variant: ProcessStepListItemVariant }) {\n if (variant === 'plain') {\n return (\n <span\n className={cn('flex size-4 items-center justify-center self-center [&>svg]:size-4', transitions.colors, {\n '[&>svg]:text-positive1': status === 'success',\n '[&>svg]:text-negative1': status === 'failed',\n })}\n >\n {status === 'pending' ? <PendingRing /> : getStatusIcon(status)}\n </span>\n );\n }\n\n return (\n <span\n className={cn(\n 'flex size-7 items-center justify-center self-center rounded-full motion-reduce:transition-none',\n transitions.colors,\n transitions.transform,\n transitions.shadow,\n {\n '[&>svg]:text-notice-success-fg': status === 'success',\n '[&>svg]:text-notice-destructive-fg': status === 'failed',\n 'border border-dashed border-neutral2': status === 'pending',\n '[&>svg]:size-4': status !== 'running',\n 'bg-accent1Dark shadow-glow-accent1': status === 'success',\n 'bg-accent2Dark shadow-glow-accent2': status === 'failed',\n 'scale-110': status === 'success' || status === 'failed',\n },\n )}\n >\n {getStatusIcon(status)}\n </span>\n );\n}\n\nexport type ProcessStepListItemProps = {\n /** @deprecated Ignored — the heading comes from `step.title`. */\n stepId?: string;\n step: ProcessStep;\n isActive: boolean;\n position: number;\n variant?: ProcessStepListItemVariant;\n};\n\nexport function ProcessStepListItem({ step, isActive, position, variant = 'default' }: ProcessStepListItemProps) {\n return (\n <div\n className={cn(\n 'grid grid-cols-[1fr_auto] gap-6 rounded-lg px-4 py-3 motion-reduce:transition-none',\n transitions.colors,\n {\n 'border border-transparent': variant === 'default',\n 'border-dashed border-neutral2 bg-surface3': isActive && variant === 'default',\n },\n )}\n >\n <div className=\"grid min-w-0 grid-cols-[auto_1fr] gap-2\">\n <span\n className={cn('flex min-w-6 justify-end text-ui-md', transitions.colors, {\n 'text-neutral5': isActive || step.status === 'success',\n 'text-neutral3': !isActive && step.status !== 'success',\n })}\n >\n {position}.\n </span>\n <div className=\"min-w-0\">\n <h4\n className={cn('text-ui-md', transitions.colors, {\n 'text-neutral5': isActive || step.status === 'success',\n 'text-neutral3': !isActive && step.status !== 'success',\n })}\n >\n {step.title}\n </h4>\n {step.description && (\n <p className={cn('-mt-0.5 text-ui-md text-neutral2', { truncate: variant === 'plain' })}>\n {step.description}\n </p>\n )}\n </div>\n </div>\n <StepStatusMarker status={step.status} variant={variant} />\n </div>\n );\n}\n","import { ProcessStepListItem } from './process-step-list-item';\nimport type { ProcessStep } from './shared';\nimport { cn } from '@/lib/utils';\n\nexport type ProcessStepListProps = {\n currentStep: ProcessStep | null;\n steps: ProcessStep[];\n className?: string;\n};\n\nexport function ProcessStepList({ currentStep, steps = [], className }: ProcessStepListProps) {\n return (\n <div className={cn(className)}>\n {steps.map((step: ProcessStep, idx: number) => (\n <ProcessStepListItem key={step.id} step={step} isActive={currentStep?.id === step.id} position={idx + 1} />\n ))}\n </div>\n );\n}\n","import type { ProcessStep } from './shared';\nimport { Spinner } from '@/ds/components/Spinner';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport type ProcessStepProgressBarProps = {\n steps: ProcessStep[];\n};\n\nexport function ProcessStepProgressBar({ steps }: ProcessStepProgressBarProps) {\n const totalSteps = steps.length;\n const completedSteps = steps.filter(step => step.status === 'success').length;\n\n return (\n <div className=\"flex w-full flex-col content-center justify-center gap-4\">\n <div className=\"grid w-full grid-cols-[0_repeat(9,1fr)]\">\n {steps.map((step: ProcessStep, idx: number) => {\n return (\n <div\n key={step.id}\n className={cn('relative flex h-8 items-center justify-end', transitions.colors, {\n 'bg-accent1Dark': step.status === 'success' && steps?.[idx - 1]?.status === 'success',\n })}\n >\n <div\n className={cn(\n 'absolute right-0 z-10 flex size-8 translate-x-1/2 items-center justify-center self-center rounded-full bg-surface3 text-ui-sm font-bold text-neutral3 motion-reduce:transition-none',\n transitions.colors,\n transitions.transform,\n transitions.shadow,\n {\n 'border border-dashed border-neutral2': step.status === 'pending',\n 'bg-accent1Dark text-notice-success-fg shadow-glow-accent1 scale-110': step.status === 'success',\n 'bg-accent2Dark text-notice-destructive-fg shadow-glow-accent2 scale-110': step.status === 'failed',\n },\n )}\n >\n {step.status === 'running' ? <Spinner /> : idx + 1}\n </div>\n </div>\n );\n })}\n </div>\n <div className={cn('text-center text-xs text-neutral3', transitions.colors)}>\n {completedSteps} of {totalSteps} steps completed\n </div>\n </div>\n );\n}\n"],"names":["jsx","Spinner","CheckIcon","XIcon","cn","transitions","jsxs"],"mappings":"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"}
@@ -7,28 +7,81 @@ import { c as cn } from '../cn-BakJzhuv.js';
7
7
  function getStatusIcon(status) {
8
8
  switch (status) {
9
9
  case "running":
10
- return /* @__PURE__ */ jsx(Spinner, {});
10
+ return /* @__PURE__ */ jsx(Spinner, { size: "sm", "aria-hidden": true });
11
11
  case "success":
12
- return /* @__PURE__ */ jsx(CheckIcon, {});
12
+ return /* @__PURE__ */ jsx(CheckIcon, { "aria-hidden": true });
13
13
  case "failed":
14
- return /* @__PURE__ */ jsx(XIcon, {});
14
+ return /* @__PURE__ */ jsx(XIcon, { "aria-hidden": true });
15
15
  default:
16
16
  return null;
17
17
  }
18
18
  }
19
19
 
20
- function ProcessStepListItem({ stepId, step, isActive, position }) {
21
- const formatStepTitle = (stepId2) => {
22
- return stepId2.charAt(0).toUpperCase() + stepId2.slice(1).replace(/-/g, " ");
23
- };
20
+ function PendingRing() {
21
+ return /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", className: "text-neutral2", "aria-hidden": true, children: /* @__PURE__ */ jsx(
22
+ "circle",
23
+ {
24
+ cx: "12",
25
+ cy: "12",
26
+ r: "8.5",
27
+ pathLength: "48",
28
+ fill: "none",
29
+ stroke: "currentcolor",
30
+ strokeWidth: "2.8",
31
+ strokeLinecap: "round",
32
+ strokeDasharray: "3 3"
33
+ }
34
+ ) });
35
+ }
36
+ function StepStatusMarker({ status, variant }) {
37
+ if (variant === "plain") {
38
+ return /* @__PURE__ */ jsx(
39
+ "span",
40
+ {
41
+ className: cn("flex size-4 items-center justify-center self-center [&>svg]:size-4", transitions.colors, {
42
+ "[&>svg]:text-positive1": status === "success",
43
+ "[&>svg]:text-negative1": status === "failed"
44
+ }),
45
+ children: status === "pending" ? /* @__PURE__ */ jsx(PendingRing, {}) : getStatusIcon(status)
46
+ }
47
+ );
48
+ }
49
+ return /* @__PURE__ */ jsx(
50
+ "span",
51
+ {
52
+ className: cn(
53
+ "flex size-7 items-center justify-center self-center rounded-full motion-reduce:transition-none",
54
+ transitions.colors,
55
+ transitions.transform,
56
+ transitions.shadow,
57
+ {
58
+ "[&>svg]:text-notice-success-fg": status === "success",
59
+ "[&>svg]:text-notice-destructive-fg": status === "failed",
60
+ "border border-dashed border-neutral2": status === "pending",
61
+ "[&>svg]:size-4": status !== "running",
62
+ "bg-accent1Dark shadow-glow-accent1": status === "success",
63
+ "bg-accent2Dark shadow-glow-accent2": status === "failed",
64
+ "scale-110": status === "success" || status === "failed"
65
+ }
66
+ ),
67
+ children: getStatusIcon(status)
68
+ }
69
+ );
70
+ }
71
+ function ProcessStepListItem({ step, isActive, position, variant = "default" }) {
24
72
  return /* @__PURE__ */ jsxs(
25
73
  "div",
26
74
  {
27
- className: cn("grid grid-cols-[1fr_auto] gap-6 rounded-lg px-4 py-3", transitions.all, {
28
- "border border-dashed border-neutral2 bg-surface3": isActive
29
- }),
75
+ className: cn(
76
+ "grid grid-cols-[1fr_auto] gap-6 rounded-lg px-4 py-3 motion-reduce:transition-none",
77
+ transitions.colors,
78
+ {
79
+ "border border-transparent": variant === "default",
80
+ "border-dashed border-neutral2 bg-surface3": isActive && variant === "default"
81
+ }
82
+ ),
30
83
  children: [
31
- /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-[auto_1fr] gap-2", children: [
84
+ /* @__PURE__ */ jsxs("div", { className: "grid min-w-0 grid-cols-[auto_1fr] gap-2", children: [
32
85
  /* @__PURE__ */ jsxs(
33
86
  "span",
34
87
  {
@@ -42,7 +95,7 @@ function ProcessStepListItem({ stepId, step, isActive, position }) {
42
95
  ]
43
96
  }
44
97
  ),
45
- /* @__PURE__ */ jsxs("div", { children: [
98
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
46
99
  /* @__PURE__ */ jsx(
47
100
  "h4",
48
101
  {
@@ -50,42 +103,20 @@ function ProcessStepListItem({ stepId, step, isActive, position }) {
50
103
  "text-neutral5": isActive || step.status === "success",
51
104
  "text-neutral3": !isActive && step.status !== "success"
52
105
  }),
53
- children: formatStepTitle(stepId)
106
+ children: step.title
54
107
  }
55
108
  ),
56
- step.description && /* @__PURE__ */ jsx("p", { className: "text-ui-md text-neutral2 -mt-0.5", children: step.description })
109
+ step.description && /* @__PURE__ */ jsx("p", { className: cn("-mt-0.5 text-ui-md text-neutral2", { truncate: variant === "plain" }), children: step.description })
57
110
  ] })
58
111
  ] }),
59
- /* @__PURE__ */ jsx(
60
- "div",
61
- {
62
- className: cn("flex size-[1.75rem] items-center justify-center self-center rounded-full", transitions.all, {
63
- "border border-neutral2 border-dashed": step.status === "pending",
64
- "[&>svg]:text-white [&>svg]:w-4 [&>svg]:h-4": step.status !== "running",
65
- "w-[1.75rem] h-[1.75rem]": step.status === "running",
66
- "bg-accent1Dark shadow-glow-accent1": step.status === "success",
67
- "bg-accent2Dark shadow-glow-accent2": step.status === "failed",
68
- "scale-110": step.status === "success" || step.status === "failed"
69
- }),
70
- children: getStatusIcon(step.status)
71
- }
72
- )
112
+ /* @__PURE__ */ jsx(StepStatusMarker, { status: step.status, variant })
73
113
  ]
74
114
  }
75
115
  );
76
116
  }
77
117
 
78
118
  function ProcessStepList({ currentStep, steps = [], className }) {
79
- return /* @__PURE__ */ jsx("div", { className: cn(className), children: steps.map((step, idx) => /* @__PURE__ */ jsx(
80
- ProcessStepListItem,
81
- {
82
- stepId: step.id,
83
- step,
84
- isActive: currentStep?.id === step.id,
85
- position: idx + 1
86
- },
87
- step.id
88
- )) });
119
+ return /* @__PURE__ */ jsx("div", { className: cn(className), children: steps.map((step, idx) => /* @__PURE__ */ jsx(ProcessStepListItem, { step, isActive: currentStep?.id === step.id, position: idx + 1 }, step.id)) });
89
120
  }
90
121
 
91
122
  function ProcessStepProgressBar({ steps }) {
@@ -103,13 +134,14 @@ function ProcessStepProgressBar({ steps }) {
103
134
  "div",
104
135
  {
105
136
  className: cn(
106
- "absolute right-0 z-10 flex size-[2rem] translate-x-[50%] items-center justify-center self-center rounded-full bg-surface3 text-ui-sm font-bold text-neutral3",
107
- transitions.all,
137
+ "absolute right-0 z-10 flex size-8 translate-x-1/2 items-center justify-center self-center rounded-full bg-surface3 text-ui-sm font-bold text-neutral3 motion-reduce:transition-none",
138
+ transitions.colors,
139
+ transitions.transform,
140
+ transitions.shadow,
108
141
  {
109
- "border border-neutral2 border-dashed": step.status === "pending",
110
- "[&>svg]:text-surface1 [&>svg]:w-[1.1rem] [&>svg]:h-[1.1rem]": step.status !== "running",
111
- "bg-accent1Dark text-white shadow-glow-accent1 scale-110": step.status === "success",
112
- "bg-accent2Dark text-white shadow-glow-accent2 scale-110": step.status === "failed"
142
+ "border border-dashed border-neutral2": step.status === "pending",
143
+ "bg-accent1Dark text-notice-success-fg shadow-glow-accent1 scale-110": step.status === "success",
144
+ "bg-accent2Dark text-notice-destructive-fg shadow-glow-accent2 scale-110": step.status === "failed"
113
145
  }
114
146
  ),
115
147
  children: step.status === "running" ? /* @__PURE__ */ jsx(Spinner, {}) : idx + 1
@@ -1 +1 @@
1
- {"version":3,"file":"Steps.es.js","sources":["../../src/ds/components/Steps/shared.tsx","../../src/ds/components/Steps/process-step-list-item.tsx","../../src/ds/components/Steps/process-step-list.tsx","../../src/ds/components/Steps/process-step-progress-bar.tsx"],"sourcesContent":["import { CheckIcon, XIcon } from 'lucide-react';\nimport { Spinner } from '@/ds/components/Spinner';\n\nexport function getStatusIcon(status: string) {\n switch (status) {\n case 'running':\n return <Spinner />;\n case 'success':\n return <CheckIcon />;\n case 'failed':\n return <XIcon />;\n default:\n return null;\n }\n}\n\nexport type ProcessStep = {\n id: string;\n status: string;\n description: string;\n title: string;\n isActive: boolean;\n};\n","import { getStatusIcon } from './shared';\nimport type { ProcessStep } from './shared';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport type ProcessStepListItemProps = {\n stepId: string;\n step: ProcessStep;\n isActive: boolean;\n position: number;\n};\n\nexport function ProcessStepListItem({ stepId, step, isActive, position }: ProcessStepListItemProps) {\n // Always format the step ID as the title\n const formatStepTitle = (stepId: string) => {\n return stepId.charAt(0).toUpperCase() + stepId.slice(1).replace(/-/g, ' ');\n };\n\n return (\n <div\n className={cn('grid grid-cols-[1fr_auto] gap-6 rounded-lg px-4 py-3', transitions.all, {\n 'border border-dashed border-neutral2 bg-surface3': isActive,\n })}\n >\n <div className=\"grid grid-cols-[auto_1fr] gap-2\">\n <span\n className={cn('flex min-w-6 justify-end text-ui-md', transitions.colors, {\n 'text-neutral5': isActive || step.status === 'success',\n 'text-neutral3': !isActive && step.status !== 'success',\n })}\n >\n {position}.\n </span>\n <div>\n <h4\n className={cn('text-ui-md', transitions.colors, {\n 'text-neutral5': isActive || step.status === 'success',\n 'text-neutral3': !isActive && step.status !== 'success',\n })}\n >\n {formatStepTitle(stepId)}\n </h4>\n {step.description && <p className=\"text-ui-md text-neutral2 -mt-0.5\">{step.description}</p>}\n </div>\n </div>\n <div\n className={cn('flex size-[1.75rem] items-center justify-center self-center rounded-full', transitions.all, {\n 'border border-neutral2 border-dashed': step.status === 'pending',\n '[&>svg]:text-white [&>svg]:w-4 [&>svg]:h-4': step.status !== 'running',\n 'w-[1.75rem] h-[1.75rem]': step.status === 'running',\n 'bg-accent1Dark shadow-glow-accent1': step.status === 'success',\n 'bg-accent2Dark shadow-glow-accent2': step.status === 'failed',\n 'scale-110': step.status === 'success' || step.status === 'failed',\n })}\n >\n {getStatusIcon(step.status)}\n </div>\n </div>\n );\n}\n","import { ProcessStepListItem } from './process-step-list-item';\nimport type { ProcessStep } from './shared';\nimport { cn } from '@/lib/utils';\n\nexport type ProcessStepListProps = {\n currentStep: ProcessStep | null;\n steps: ProcessStep[];\n className?: string;\n};\n\nexport function ProcessStepList({ currentStep, steps = [], className }: ProcessStepListProps) {\n return (\n <div className={cn(className)}>\n {steps.map((step: ProcessStep, idx: number) => (\n <ProcessStepListItem\n key={step.id}\n stepId={step.id}\n step={step}\n isActive={currentStep?.id === step.id}\n position={idx + 1}\n />\n ))}\n </div>\n );\n}\n","import type { ProcessStep } from './shared';\nimport { Spinner } from '@/ds/components/Spinner';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport type ProcessStepProgressBarProps = {\n steps: ProcessStep[];\n};\n\nexport function ProcessStepProgressBar({ steps }: ProcessStepProgressBarProps) {\n const totalSteps = steps.length;\n const completedSteps = steps.filter(step => step.status === 'success').length;\n\n return (\n <div className=\"flex w-full flex-col content-center justify-center gap-4\">\n <div className=\"grid w-full grid-cols-[0_repeat(9,1fr)]\">\n {steps.map((step: ProcessStep, idx: number) => {\n return (\n <div\n key={step.id}\n className={cn('relative flex h-8 items-center justify-end', transitions.colors, {\n 'bg-accent1Dark': step.status === 'success' && steps?.[idx - 1]?.status === 'success',\n })}\n >\n <div\n className={cn(\n 'absolute right-0 z-10 flex size-[2rem] translate-x-[50%] items-center justify-center self-center rounded-full bg-surface3 text-ui-sm font-bold text-neutral3',\n transitions.all,\n {\n 'border border-neutral2 border-dashed': step.status === 'pending',\n '[&>svg]:text-surface1 [&>svg]:w-[1.1rem] [&>svg]:h-[1.1rem]': step.status !== 'running',\n 'bg-accent1Dark text-white shadow-glow-accent1 scale-110': step.status === 'success',\n 'bg-accent2Dark text-white shadow-glow-accent2 scale-110': step.status === 'failed',\n },\n )}\n >\n {step.status === 'running' ? <Spinner /> : idx + 1}\n </div>\n </div>\n );\n })}\n </div>\n <div className={cn('text-center text-xs text-neutral3', transitions.colors)}>\n {completedSteps} of {totalSteps} steps completed\n </div>\n </div>\n );\n}\n"],"names":["stepId"],"mappings":"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"}
1
+ {"version":3,"file":"Steps.es.js","sources":["../../src/ds/components/Steps/shared.tsx","../../src/ds/components/Steps/process-step-list-item.tsx","../../src/ds/components/Steps/process-step-list.tsx","../../src/ds/components/Steps/process-step-progress-bar.tsx"],"sourcesContent":["import { CheckIcon, XIcon } from 'lucide-react';\nimport { Spinner } from '@/ds/components/Spinner';\n\nexport function getStatusIcon(status: string) {\n switch (status) {\n case 'running':\n return <Spinner size=\"sm\" aria-hidden />;\n case 'success':\n return <CheckIcon aria-hidden />;\n case 'failed':\n return <XIcon aria-hidden />;\n default:\n return null;\n }\n}\n\nexport type ProcessStep = {\n id: string;\n status: string;\n description: string;\n title: string;\n isActive: boolean;\n};\n","import { getStatusIcon } from './shared';\nimport type { ProcessStep } from './shared';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\ntype ProcessStepListItemVariant = 'default' | 'plain';\n\n/** Same ring geometry and stroke as `<Spinner size=\"sm\" />`, so pending and running read as one shape. */\nfunction PendingRing() {\n return (\n <svg viewBox=\"0 0 24 24\" className=\"text-neutral2\" aria-hidden>\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"8.5\"\n pathLength=\"48\"\n fill=\"none\"\n stroke=\"currentcolor\"\n strokeWidth=\"2.8\"\n strokeLinecap=\"round\"\n strokeDasharray=\"3 3\"\n />\n </svg>\n );\n}\n\nfunction StepStatusMarker({ status, variant }: { status: string; variant: ProcessStepListItemVariant }) {\n if (variant === 'plain') {\n return (\n <span\n className={cn('flex size-4 items-center justify-center self-center [&>svg]:size-4', transitions.colors, {\n '[&>svg]:text-positive1': status === 'success',\n '[&>svg]:text-negative1': status === 'failed',\n })}\n >\n {status === 'pending' ? <PendingRing /> : getStatusIcon(status)}\n </span>\n );\n }\n\n return (\n <span\n className={cn(\n 'flex size-7 items-center justify-center self-center rounded-full motion-reduce:transition-none',\n transitions.colors,\n transitions.transform,\n transitions.shadow,\n {\n '[&>svg]:text-notice-success-fg': status === 'success',\n '[&>svg]:text-notice-destructive-fg': status === 'failed',\n 'border border-dashed border-neutral2': status === 'pending',\n '[&>svg]:size-4': status !== 'running',\n 'bg-accent1Dark shadow-glow-accent1': status === 'success',\n 'bg-accent2Dark shadow-glow-accent2': status === 'failed',\n 'scale-110': status === 'success' || status === 'failed',\n },\n )}\n >\n {getStatusIcon(status)}\n </span>\n );\n}\n\nexport type ProcessStepListItemProps = {\n /** @deprecated Ignored — the heading comes from `step.title`. */\n stepId?: string;\n step: ProcessStep;\n isActive: boolean;\n position: number;\n variant?: ProcessStepListItemVariant;\n};\n\nexport function ProcessStepListItem({ step, isActive, position, variant = 'default' }: ProcessStepListItemProps) {\n return (\n <div\n className={cn(\n 'grid grid-cols-[1fr_auto] gap-6 rounded-lg px-4 py-3 motion-reduce:transition-none',\n transitions.colors,\n {\n 'border border-transparent': variant === 'default',\n 'border-dashed border-neutral2 bg-surface3': isActive && variant === 'default',\n },\n )}\n >\n <div className=\"grid min-w-0 grid-cols-[auto_1fr] gap-2\">\n <span\n className={cn('flex min-w-6 justify-end text-ui-md', transitions.colors, {\n 'text-neutral5': isActive || step.status === 'success',\n 'text-neutral3': !isActive && step.status !== 'success',\n })}\n >\n {position}.\n </span>\n <div className=\"min-w-0\">\n <h4\n className={cn('text-ui-md', transitions.colors, {\n 'text-neutral5': isActive || step.status === 'success',\n 'text-neutral3': !isActive && step.status !== 'success',\n })}\n >\n {step.title}\n </h4>\n {step.description && (\n <p className={cn('-mt-0.5 text-ui-md text-neutral2', { truncate: variant === 'plain' })}>\n {step.description}\n </p>\n )}\n </div>\n </div>\n <StepStatusMarker status={step.status} variant={variant} />\n </div>\n );\n}\n","import { ProcessStepListItem } from './process-step-list-item';\nimport type { ProcessStep } from './shared';\nimport { cn } from '@/lib/utils';\n\nexport type ProcessStepListProps = {\n currentStep: ProcessStep | null;\n steps: ProcessStep[];\n className?: string;\n};\n\nexport function ProcessStepList({ currentStep, steps = [], className }: ProcessStepListProps) {\n return (\n <div className={cn(className)}>\n {steps.map((step: ProcessStep, idx: number) => (\n <ProcessStepListItem key={step.id} step={step} isActive={currentStep?.id === step.id} position={idx + 1} />\n ))}\n </div>\n );\n}\n","import type { ProcessStep } from './shared';\nimport { Spinner } from '@/ds/components/Spinner';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport type ProcessStepProgressBarProps = {\n steps: ProcessStep[];\n};\n\nexport function ProcessStepProgressBar({ steps }: ProcessStepProgressBarProps) {\n const totalSteps = steps.length;\n const completedSteps = steps.filter(step => step.status === 'success').length;\n\n return (\n <div className=\"flex w-full flex-col content-center justify-center gap-4\">\n <div className=\"grid w-full grid-cols-[0_repeat(9,1fr)]\">\n {steps.map((step: ProcessStep, idx: number) => {\n return (\n <div\n key={step.id}\n className={cn('relative flex h-8 items-center justify-end', transitions.colors, {\n 'bg-accent1Dark': step.status === 'success' && steps?.[idx - 1]?.status === 'success',\n })}\n >\n <div\n className={cn(\n 'absolute right-0 z-10 flex size-8 translate-x-1/2 items-center justify-center self-center rounded-full bg-surface3 text-ui-sm font-bold text-neutral3 motion-reduce:transition-none',\n transitions.colors,\n transitions.transform,\n transitions.shadow,\n {\n 'border border-dashed border-neutral2': step.status === 'pending',\n 'bg-accent1Dark text-notice-success-fg shadow-glow-accent1 scale-110': step.status === 'success',\n 'bg-accent2Dark text-notice-destructive-fg shadow-glow-accent2 scale-110': step.status === 'failed',\n },\n )}\n >\n {step.status === 'running' ? <Spinner /> : idx + 1}\n </div>\n </div>\n );\n })}\n </div>\n <div className={cn('text-center text-xs text-neutral3', transitions.colors)}>\n {completedSteps} of {totalSteps} steps completed\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":"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"}