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

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 +58 -0
  2. package/dist/TokenBudget.css +51 -0
  3. package/dist/components/Steps.cjs.js +39 -38
  4. package/dist/components/Steps.cjs.js.map +1 -1
  5. package/dist/components/Steps.es.js +39 -38
  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 +37 -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,63 @@
1
1
  # @mastra/playground-ui
2
2
 
3
+ ## 49.0.0-alpha.2
4
+
5
+ ### Minor Changes
6
+
7
+ - 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))
8
+
9
+ ```tsx
10
+ import { TokenBudget, TokenBudgetDetail } from '@mastra/playground-ui/components/TokenBudget';
11
+
12
+ <div className="flex items-center gap-1.5">
13
+ <TokenBudget label="Message window" tokens={14_900} threshold={30_000} working={isObserving} />
14
+ <TokenBudget label="Observations" tokens={5_200} threshold={8_000} tone="memory" />
15
+ </div>;
16
+
17
+ <TokenBudgetDetail
18
+ description="Read into memory once full"
19
+ icon={<MessageSquare />}
20
+ label="Messages"
21
+ projected={6_000}
22
+ tokens={14_900}
23
+ threshold={30_000}
24
+ />;
25
+ ```
26
+
27
+ 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.
28
+
29
+ `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.
30
+
31
+ Fixed those same memory panel bars drawing a budget as completely full when its threshold was zero.
32
+
33
+ - Improved process step indicators with theme-aware status colors and a plain embedded style. ([#21382](https://github.com/mastra-ai/mastra/pull/21382))
34
+
35
+ **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:
36
+
37
+ ```tsx
38
+ const step = { id: 'clone-repo', title: 'Cloning repository', status: 'running', description: '', isActive: true };
39
+
40
+ <ProcessStepListItem step={step} isActive position={1} />;
41
+ // before: "Clone repo"
42
+ // after: "Cloning repository"
43
+ ```
44
+
45
+ The `stepId` prop is now optional and ignored; drop it from your call sites.
46
+
47
+ **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:
48
+
49
+ ```tsx
50
+ <ProcessStepListItem step={step} isActive={step.status === 'running'} position={1} variant="plain" />
51
+ ```
52
+
53
+ ### Patch Changes
54
+
55
+ - 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)]:
56
+ - @mastra/core@1.59.0-alpha.2
57
+ - @mastra/client-js@1.40.0-alpha.2
58
+ - @mastra/memory@1.26.2-alpha.1
59
+ - @mastra/react@1.4.3-alpha.2
60
+
3
61
  ## 48.1.0-alpha.1
4
62
 
5
63
  ### 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,30 @@ 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 ProcessStepListItem({ step, isActive, position, variant = "default" }) {
28
25
  return /* @__PURE__ */ jsxRuntime.jsxs(
29
26
  "div",
30
27
  {
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
- }),
28
+ className: utils_cn.cn(
29
+ "grid grid-cols-[1fr_auto] gap-6 rounded-lg px-4 py-3 motion-reduce:transition-none",
30
+ primitives_transitions.transitions.colors,
31
+ {
32
+ "border border-transparent": variant === "default",
33
+ "border-dashed border-neutral2 bg-surface3": isActive && variant === "default"
34
+ }
35
+ ),
34
36
  children: [
35
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-[auto_1fr] gap-2", children: [
37
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid min-w-0 grid-cols-[auto_1fr] gap-2", children: [
36
38
  /* @__PURE__ */ jsxRuntime.jsxs(
37
39
  "span",
38
40
  {
@@ -46,7 +48,7 @@ function ProcessStepListItem({ stepId, step, isActive, position }) {
46
48
  ]
47
49
  }
48
50
  ),
49
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
51
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0", children: [
50
52
  /* @__PURE__ */ jsxRuntime.jsx(
51
53
  "h4",
52
54
  {
@@ -54,23 +56,30 @@ function ProcessStepListItem({ stepId, step, isActive, position }) {
54
56
  "text-neutral5": isActive || step.status === "success",
55
57
  "text-neutral3": !isActive && step.status !== "success"
56
58
  }),
57
- children: formatStepTitle(stepId)
59
+ children: step.title
58
60
  }
59
61
  ),
60
- step.description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-ui-md text-neutral2 -mt-0.5", children: step.description })
62
+ 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
63
  ] })
62
64
  ] }),
63
65
  /* @__PURE__ */ jsxRuntime.jsx(
64
66
  "div",
65
67
  {
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
- }),
68
+ className: utils_cn.cn(
69
+ "flex size-7 items-center justify-center self-center rounded-full motion-reduce:transition-none",
70
+ primitives_transitions.transitions.colors,
71
+ primitives_transitions.transitions.transform,
72
+ primitives_transitions.transitions.shadow,
73
+ {
74
+ "border border-dashed border-neutral2": step.status === "pending",
75
+ "[&>svg]:size-4": step.status !== "running",
76
+ "[&>svg]:text-notice-success-fg": step.status === "success",
77
+ "[&>svg]:text-notice-destructive-fg": step.status === "failed",
78
+ "bg-accent1Dark shadow-glow-accent1": step.status === "success",
79
+ "bg-accent2Dark shadow-glow-accent2": step.status === "failed",
80
+ "scale-110": step.status === "success" || step.status === "failed"
81
+ }
82
+ ),
74
83
  children: getStatusIcon(step.status)
75
84
  }
76
85
  )
@@ -80,16 +89,7 @@ function ProcessStepListItem({ stepId, step, isActive, position }) {
80
89
  }
81
90
 
82
91
  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
- )) });
92
+ 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
93
  }
94
94
 
95
95
  function ProcessStepProgressBar({ steps }) {
@@ -107,13 +107,14 @@ function ProcessStepProgressBar({ steps }) {
107
107
  "div",
108
108
  {
109
109
  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,
110
+ "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",
111
+ primitives_transitions.transitions.colors,
112
+ primitives_transitions.transitions.transform,
113
+ primitives_transitions.transitions.shadow,
112
114
  {
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"
115
+ "border border-dashed border-neutral2": step.status === "pending",
116
+ "bg-accent1Dark text-notice-success-fg shadow-glow-accent1 scale-110": step.status === "success",
117
+ "bg-accent2Dark text-notice-destructive-fg shadow-glow-accent2 scale-110": step.status === "failed"
117
118
  }
118
119
  ),
119
120
  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\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 <div\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 'border border-dashed border-neutral2': step.status === 'pending',\n '[&>svg]:size-4': step.status !== 'running',\n '[&>svg]:text-notice-success-fg': step.status === 'success',\n '[&>svg]:text-notice-destructive-fg': step.status === 'failed',\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 >\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 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","jsxs","cn","transitions"],"mappings":"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"}
@@ -7,28 +7,30 @@ 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 ProcessStepListItem({ step, isActive, position, variant = "default" }) {
24
21
  return /* @__PURE__ */ jsxs(
25
22
  "div",
26
23
  {
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
- }),
24
+ className: cn(
25
+ "grid grid-cols-[1fr_auto] gap-6 rounded-lg px-4 py-3 motion-reduce:transition-none",
26
+ transitions.colors,
27
+ {
28
+ "border border-transparent": variant === "default",
29
+ "border-dashed border-neutral2 bg-surface3": isActive && variant === "default"
30
+ }
31
+ ),
30
32
  children: [
31
- /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-[auto_1fr] gap-2", children: [
33
+ /* @__PURE__ */ jsxs("div", { className: "grid min-w-0 grid-cols-[auto_1fr] gap-2", children: [
32
34
  /* @__PURE__ */ jsxs(
33
35
  "span",
34
36
  {
@@ -42,7 +44,7 @@ function ProcessStepListItem({ stepId, step, isActive, position }) {
42
44
  ]
43
45
  }
44
46
  ),
45
- /* @__PURE__ */ jsxs("div", { children: [
47
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
46
48
  /* @__PURE__ */ jsx(
47
49
  "h4",
48
50
  {
@@ -50,23 +52,30 @@ function ProcessStepListItem({ stepId, step, isActive, position }) {
50
52
  "text-neutral5": isActive || step.status === "success",
51
53
  "text-neutral3": !isActive && step.status !== "success"
52
54
  }),
53
- children: formatStepTitle(stepId)
55
+ children: step.title
54
56
  }
55
57
  ),
56
- step.description && /* @__PURE__ */ jsx("p", { className: "text-ui-md text-neutral2 -mt-0.5", children: step.description })
58
+ step.description && /* @__PURE__ */ jsx("p", { className: cn("-mt-0.5 text-ui-md text-neutral2", { truncate: variant === "plain" }), children: step.description })
57
59
  ] })
58
60
  ] }),
59
61
  /* @__PURE__ */ jsx(
60
62
  "div",
61
63
  {
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
- }),
64
+ className: cn(
65
+ "flex size-7 items-center justify-center self-center rounded-full motion-reduce:transition-none",
66
+ transitions.colors,
67
+ transitions.transform,
68
+ transitions.shadow,
69
+ {
70
+ "border border-dashed border-neutral2": step.status === "pending",
71
+ "[&>svg]:size-4": step.status !== "running",
72
+ "[&>svg]:text-notice-success-fg": step.status === "success",
73
+ "[&>svg]:text-notice-destructive-fg": step.status === "failed",
74
+ "bg-accent1Dark shadow-glow-accent1": step.status === "success",
75
+ "bg-accent2Dark shadow-glow-accent2": step.status === "failed",
76
+ "scale-110": step.status === "success" || step.status === "failed"
77
+ }
78
+ ),
70
79
  children: getStatusIcon(step.status)
71
80
  }
72
81
  )
@@ -76,16 +85,7 @@ function ProcessStepListItem({ stepId, step, isActive, position }) {
76
85
  }
77
86
 
78
87
  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
- )) });
88
+ 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
89
  }
90
90
 
91
91
  function ProcessStepProgressBar({ steps }) {
@@ -103,13 +103,14 @@ function ProcessStepProgressBar({ steps }) {
103
103
  "div",
104
104
  {
105
105
  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,
106
+ "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",
107
+ transitions.colors,
108
+ transitions.transform,
109
+ transitions.shadow,
108
110
  {
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"
111
+ "border border-dashed border-neutral2": step.status === "pending",
112
+ "bg-accent1Dark text-notice-success-fg shadow-glow-accent1 scale-110": step.status === "success",
113
+ "bg-accent2Dark text-notice-destructive-fg shadow-glow-accent2 scale-110": step.status === "failed"
113
114
  }
114
115
  ),
115
116
  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\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 <div\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 'border border-dashed border-neutral2': step.status === 'pending',\n '[&>svg]:size-4': step.status !== 'running',\n '[&>svg]:text-notice-success-fg': step.status === 'success',\n '[&>svg]:text-notice-destructive-fg': step.status === 'failed',\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 >\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 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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"}
@@ -0,0 +1,126 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
+
5
+ require('../TokenBudget.css');const tones = require('../tones-BGChDydJ.cjs');
6
+ const jsxRuntime = require('react/jsx-runtime');
7
+ const React = require('react');
8
+ const utils_cn = require('../cn-vA5sWo9W.cjs');
9
+
10
+ const RADIUS = 7;
11
+ const CIRCUMFERENCE = 2 * Math.PI * RADIUS;
12
+ function TokenBudget({
13
+ tokens,
14
+ threshold,
15
+ label,
16
+ tone = "messages",
17
+ working = false,
18
+ className
19
+ }) {
20
+ const id = React.useId();
21
+ const fill = threshold > 0 ? Math.min(100, Math.round(tokens / threshold * 100)) : 0;
22
+ const wedge = `${(CIRCUMFERENCE * fill / 100).toFixed(2)} ${CIRCUMFERENCE.toFixed(2)}`;
23
+ return /* @__PURE__ */ jsxRuntime.jsxs(
24
+ "span",
25
+ {
26
+ "aria-label": label,
27
+ "aria-valuemax": threshold,
28
+ "aria-valuemin": 0,
29
+ "aria-valuenow": Math.min(tokens, threshold),
30
+ "aria-valuetext": `${tones.formatCompactTokens(tokens)}/${tones.formatCompactTokens(threshold)}k`,
31
+ className: utils_cn.cn("inline-flex items-center gap-1.5 tabular-nums", tones.toneClass[tone], className),
32
+ role: "meter",
33
+ children: [
34
+ /* @__PURE__ */ jsxRuntime.jsxs("svg", { "aria-hidden": true, className: "token-budget-dial", "data-working": working || void 0, viewBox: "0 0 20 20", children: [
35
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { className: "token-budget-track", cx: "10", cy: "10", r: RADIUS, strokeWidth: "3" }),
36
+ working ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
37
+ /* @__PURE__ */ jsxRuntime.jsxs("defs", { children: [
38
+ /* @__PURE__ */ jsxRuntime.jsxs("linearGradient", { id: `${id}-sheen`, children: [
39
+ /* @__PURE__ */ jsxRuntime.jsx("stop", { offset: "0%", stopColor: "currentColor", stopOpacity: "0.25" }),
40
+ /* @__PURE__ */ jsxRuntime.jsx("stop", { offset: "50%", stopColor: "currentColor", stopOpacity: "1" }),
41
+ /* @__PURE__ */ jsxRuntime.jsx("stop", { offset: "100%", stopColor: "currentColor", stopOpacity: "0.25" })
42
+ ] }),
43
+ /* @__PURE__ */ jsxRuntime.jsx("mask", { id: `${id}-wedge`, children: /* @__PURE__ */ jsxRuntime.jsx(
44
+ "circle",
45
+ {
46
+ className: "token-budget-arc",
47
+ cx: "10",
48
+ cy: "10",
49
+ r: RADIUS,
50
+ stroke: "white",
51
+ strokeDasharray: wedge,
52
+ strokeWidth: "3"
53
+ }
54
+ ) })
55
+ ] }),
56
+ /* @__PURE__ */ jsxRuntime.jsx("g", { mask: `url(#${id}-wedge)`, children: /* @__PURE__ */ jsxRuntime.jsx("rect", { className: "token-budget-sheen", fill: `url(#${id}-sheen)`, height: "20", width: "20", x: "0", y: "0" }) })
57
+ ] }) : /* @__PURE__ */ jsxRuntime.jsx(
58
+ "circle",
59
+ {
60
+ className: "token-budget-arc",
61
+ cx: "10",
62
+ cy: "10",
63
+ r: RADIUS,
64
+ stroke: "currentColor",
65
+ strokeDasharray: wedge,
66
+ strokeWidth: "3"
67
+ }
68
+ )
69
+ ] }),
70
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-icon4", children: [
71
+ tones.formatCompactTokens(tokens),
72
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-icon2", children: [
73
+ "/",
74
+ tones.formatCompactTokens(threshold),
75
+ "k"
76
+ ] })
77
+ ] })
78
+ ]
79
+ }
80
+ );
81
+ }
82
+
83
+ function TokenBudgetDetail({
84
+ label,
85
+ tokens,
86
+ threshold,
87
+ projected = 0,
88
+ description,
89
+ tone = "messages",
90
+ icon
91
+ }) {
92
+ const used = threshold > 0 ? Math.min(100, tokens / threshold * 100) : 0;
93
+ const freed = Math.min(used, threshold > 0 ? projected / threshold * 100 : 0);
94
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: utils_cn.cn("flex flex-col gap-1.5", tones.toneClass[tone]), children: [
95
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-ui-xs flex items-center justify-between gap-3", children: [
96
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-center gap-1.5", children: [
97
+ icon && /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: "[&_svg]:size-3.5", children: icon }),
98
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-icon5", children: label })
99
+ ] }),
100
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-icon4 tabular-nums", children: [
101
+ tones.formatCompactTokens(tokens),
102
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-icon2", children: [
103
+ "/",
104
+ tones.formatCompactTokens(threshold),
105
+ "k"
106
+ ] }),
107
+ projected > 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-icon2", children: [
108
+ " −",
109
+ tones.formatCompactTokens(projected),
110
+ "k"
111
+ ] })
112
+ ] })
113
+ ] }),
114
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-1.5 overflow-hidden rounded-full bg-current/15", children: [
115
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "bg-current", style: { width: `${used - freed}%` } }),
116
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "token-budget-hatch", style: { width: `${freed}%` } })
117
+ ] }),
118
+ description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-ui-xs text-icon2", children: description })
119
+ ] });
120
+ }
121
+
122
+ exports.formatCompactTokens = tones.formatCompactTokens;
123
+ exports.toneClass = tones.toneClass;
124
+ exports.TokenBudget = TokenBudget;
125
+ exports.TokenBudgetDetail = TokenBudgetDetail;
126
+ //# sourceMappingURL=TokenBudget.cjs.js.map