@invana/ui 0.0.26 → 0.0.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +101 -0
- package/dist/index.cjs +277 -31
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +224 -2
- package/dist/index.d.ts +224 -2
- package/dist/index.js +273 -32
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +2 -2
package/README.md
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# @invana/ui
|
|
2
|
+
|
|
3
|
+
Invana's React component library — shadcn-style primitives over Radix, plus the composed
|
|
4
|
+
components the Invana products share.
|
|
5
|
+
|
|
6
|
+
```bash
|
|
7
|
+
pnpm add @invana/ui
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
Peer dependencies: `react` and `react-dom` (18 or 19).
|
|
11
|
+
|
|
12
|
+
## Styles
|
|
13
|
+
|
|
14
|
+
Two ways in, and the difference matters.
|
|
15
|
+
|
|
16
|
+
**Recommended — compile the tokens yourself.** Your Tailwind v4 build sees `@invana/styling`'s
|
|
17
|
+
`@theme` block, so the design tokens (including the type ladder) are real tokens in your build:
|
|
18
|
+
|
|
19
|
+
```css
|
|
20
|
+
@import "tailwindcss";
|
|
21
|
+
|
|
22
|
+
/* your own source globs, plus this package's so its classes are generated */
|
|
23
|
+
@source "./src/**/*.{ts,tsx}";
|
|
24
|
+
@source "../../node_modules/@invana/ui/dist/**/*.js";
|
|
25
|
+
|
|
26
|
+
@import "@invana/styling/index.css";
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
**Or ship the precompiled sheet**, if you are not running Tailwind:
|
|
30
|
+
|
|
31
|
+
```ts
|
|
32
|
+
import '@invana/ui/styles.css';
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
The precompiled sheet gives you CSS custom properties but **not** the `@theme` tokens — your own
|
|
36
|
+
Tailwind will regenerate `text-sm` at its stock `0.875rem` rather than the kit's alias. Prefer the
|
|
37
|
+
first form when you have a Tailwind build.
|
|
38
|
+
|
|
39
|
+
## Usage
|
|
40
|
+
|
|
41
|
+
```tsx
|
|
42
|
+
import { Button, Card, NavHorizontal, cn } from '@invana/ui';
|
|
43
|
+
|
|
44
|
+
export function Toolbar({ active }: { active: boolean }) {
|
|
45
|
+
return (
|
|
46
|
+
<Card className={cn('p-4', active && 'ring-1 ring-ring')}>
|
|
47
|
+
<Button variant="outline">Run</Button>
|
|
48
|
+
</Card>
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
`cn` is the class merger used throughout the kit — `clsx` + `tailwind-merge`.
|
|
54
|
+
|
|
55
|
+
## What's in it
|
|
56
|
+
|
|
57
|
+
**Primitives** (`components/ui`) — accordion, alert, alert-dialog, avatar, badge, breadcrumb,
|
|
58
|
+
button, button-group, card, carousel, command, dialog, dropdown-menu, hover-card, item, kbd,
|
|
59
|
+
menubar, navigation-menu, pagination, popover, progress, resizable, scroll-area, separator, sheet,
|
|
60
|
+
sidebar, skeleton, sonner, spinner, status-dot, table, tabs, toggle, toggle-group, tooltip.
|
|
61
|
+
|
|
62
|
+
**Composed** (`components/ui-extended`) — layout and navigation (`NavHorizontal`, `NavVertical`,
|
|
63
|
+
`TabbedPanel`, `PanelStack`, `PanelBox`, `Toolbar`, `TreeView`, `ContextBar`, `FilterBar`,
|
|
64
|
+
`SectionHeader`, `RecordHeader`, `EmptyState`, `Tour`), charts and readouts (`BarChartH`,
|
|
65
|
+
`BarChartV`, `DivergingBar`, `Sparkline`, `HeatStrip`, `Legend`, `MetricTile`, `TaskGantt`,
|
|
66
|
+
`TimelineList`, `PropertyList`), and the Invana-domain composites (`ChatSession`, `EmissionCard`,
|
|
67
|
+
`CitationList`, `ProposalCard`, `DiagnosisCard`, `ClarifyCard`, `CannotAnswerCard`, `AgentChip`,
|
|
68
|
+
`BoundChip`, `TaskNode`, `Terminal`, `DiffList`, `ClampedText`, `RichSelect`).
|
|
69
|
+
|
|
70
|
+
**Typography** (`components/typography`) — exported both individually as `TypographyH1` …
|
|
71
|
+
`TypographyPre`, and as a `Typography` namespace object:
|
|
72
|
+
|
|
73
|
+
```tsx
|
|
74
|
+
import { Typography, TypographyH1 } from '@invana/ui';
|
|
75
|
+
|
|
76
|
+
<TypographyH1>Runs</TypographyH1>
|
|
77
|
+
<Typography.Lead>Everything that ran today.</Typography.Lead>
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
`H1`–`H6`, `P`, `Lead`, `Large`, `Small`, `Muted`, `Blockquote`, `Code`, `List`, `Pre`.
|
|
81
|
+
|
|
82
|
+
Also exported: `cn` and the `useOverflowItems` hook.
|
|
83
|
+
|
|
84
|
+
## Type scale
|
|
85
|
+
|
|
86
|
+
Components declare no font size. Default text inherits the root, and text that is deliberately
|
|
87
|
+
subordinate — a count, a timing, a row's subtitle — uses `text-meta`. Setting `html` to 13px gives
|
|
88
|
+
you an application; 16px gives you a site, and every component follows. Don't hard-code
|
|
89
|
+
`text-sm` / `text-xs` in consuming code: they are compatibility aliases, not options.
|
|
90
|
+
|
|
91
|
+
## Documentation
|
|
92
|
+
|
|
93
|
+
Every component has a Storybook story. From the monorepo root:
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
pnpm --filter @invana/stoybook dev
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## License
|
|
100
|
+
|
|
101
|
+
MIT © Ravi Raja Merugu
|
package/dist/index.cjs
CHANGED
|
@@ -2821,6 +2821,36 @@ var AgentChip = React23__namespace.forwardRef(
|
|
|
2821
2821
|
)
|
|
2822
2822
|
);
|
|
2823
2823
|
AgentChip.displayName = "AgentChip";
|
|
2824
|
+
var SWATCH = {
|
|
2825
|
+
none: "bg-muted-foreground",
|
|
2826
|
+
network: "bg-warning",
|
|
2827
|
+
graph_read: "bg-success",
|
|
2828
|
+
graph_write: "bg-data-2",
|
|
2829
|
+
schema_write: "bg-data-4",
|
|
2830
|
+
ingest: "bg-info",
|
|
2831
|
+
llm: "bg-data-7",
|
|
2832
|
+
plan_write: "bg-data-5",
|
|
2833
|
+
work_write: "bg-destructive"
|
|
2834
|
+
};
|
|
2835
|
+
var BoundChip = React23__namespace.forwardRef(
|
|
2836
|
+
({ bound, swatchOnly, className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2837
|
+
"span",
|
|
2838
|
+
{
|
|
2839
|
+
ref,
|
|
2840
|
+
className: cn(
|
|
2841
|
+
"inline-flex max-w-full shrink-0 items-center gap-1.5 font-mono text-meta text-muted-foreground",
|
|
2842
|
+
className
|
|
2843
|
+
),
|
|
2844
|
+
"aria-label": swatchOnly ? `bound: ${bound}` : void 0,
|
|
2845
|
+
...props,
|
|
2846
|
+
children: [
|
|
2847
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: cn("size-1.5 shrink-0", SWATCH[bound]) }),
|
|
2848
|
+
swatchOnly ? null : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: bound })
|
|
2849
|
+
]
|
|
2850
|
+
}
|
|
2851
|
+
)
|
|
2852
|
+
);
|
|
2853
|
+
BoundChip.displayName = "BoundChip";
|
|
2824
2854
|
var stateVariants = classVarianceAuthority.cva("inline-flex shrink-0 items-center gap-1.5 font-medium", {
|
|
2825
2855
|
variants: {
|
|
2826
2856
|
tone: {
|
|
@@ -4601,17 +4631,59 @@ var MenuItem = ({
|
|
|
4601
4631
|
)
|
|
4602
4632
|
] });
|
|
4603
4633
|
};
|
|
4634
|
+
var TONE = {
|
|
4635
|
+
running: "text-info",
|
|
4636
|
+
success: "text-success",
|
|
4637
|
+
warning: "text-warning",
|
|
4638
|
+
error: "text-destructive",
|
|
4639
|
+
info: "text-info"
|
|
4640
|
+
};
|
|
4604
4641
|
var MetricTile = React23__namespace.forwardRef(
|
|
4605
|
-
({ label, value, caption, className, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
4642
|
+
({ label, value, caption, tone, meter, className, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
4606
4643
|
"div",
|
|
4607
4644
|
{
|
|
4608
4645
|
ref,
|
|
4609
|
-
className: cn(
|
|
4646
|
+
className: cn(
|
|
4647
|
+
"flex flex-col gap-px border border-border bg-card px-3 py-2.5",
|
|
4648
|
+
className
|
|
4649
|
+
),
|
|
4610
4650
|
...props,
|
|
4611
4651
|
children: [
|
|
4612
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate text-meta text-muted-foreground", children: label }),
|
|
4613
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4652
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate text-meta font-semibold uppercase tracking-wide text-muted-foreground", children: label }),
|
|
4653
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4654
|
+
"span",
|
|
4655
|
+
{
|
|
4656
|
+
className: cn(
|
|
4657
|
+
// Mono, because a metric is a figure: proportional digits make
|
|
4658
|
+
// `1,880` and `2 / 5` in adjacent tiles sit at different widths, and
|
|
4659
|
+
// a strip of six stops reading as one row of numbers.
|
|
4660
|
+
"font-mono text-lg font-semibold leading-tight",
|
|
4661
|
+
tone ? TONE[tone] : void 0
|
|
4662
|
+
),
|
|
4663
|
+
children: value
|
|
4664
|
+
}
|
|
4665
|
+
),
|
|
4614
4666
|
caption != null ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-meta text-muted-foreground", children: caption }) : null,
|
|
4667
|
+
meter != null ? (
|
|
4668
|
+
// Not a <Progress>: that is a control-sized, rounded, animated bar for
|
|
4669
|
+
// work in flight. This is a 4px rule that says how much of a ceiling is
|
|
4670
|
+
// gone, and it must not read as a second value in the tile.
|
|
4671
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4672
|
+
"div",
|
|
4673
|
+
{
|
|
4674
|
+
className: "mt-1 h-1 w-full bg-muted",
|
|
4675
|
+
role: "img",
|
|
4676
|
+
"aria-label": `${Math.round(Math.min(Math.max(meter, 0), 1) * 100)}% of the ceiling`,
|
|
4677
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
4678
|
+
"div",
|
|
4679
|
+
{
|
|
4680
|
+
className: cn("h-full", tone ? TONE[tone] : "text-primary", "bg-current"),
|
|
4681
|
+
style: { width: `${Math.min(Math.max(meter, 0), 1) * 100}%` }
|
|
4682
|
+
}
|
|
4683
|
+
)
|
|
4684
|
+
}
|
|
4685
|
+
)
|
|
4686
|
+
) : null,
|
|
4615
4687
|
children
|
|
4616
4688
|
]
|
|
4617
4689
|
}
|
|
@@ -4619,12 +4691,13 @@ var MetricTile = React23__namespace.forwardRef(
|
|
|
4619
4691
|
);
|
|
4620
4692
|
MetricTile.displayName = "MetricTile";
|
|
4621
4693
|
var MetricGrid = React23__namespace.forwardRef(
|
|
4622
|
-
({ minTileWidth = 120, className, style, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
4694
|
+
({ minTileWidth = 120, gap = 6, className, style, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
4623
4695
|
"div",
|
|
4624
4696
|
{
|
|
4625
4697
|
ref,
|
|
4626
|
-
className: cn("grid
|
|
4698
|
+
className: cn("grid", className),
|
|
4627
4699
|
style: {
|
|
4700
|
+
gap,
|
|
4628
4701
|
gridTemplateColumns: `repeat(auto-fit, minmax(${minTileWidth}px, 1fr))`,
|
|
4629
4702
|
...style
|
|
4630
4703
|
},
|
|
@@ -4676,6 +4749,67 @@ var NestedMenu = (props) => {
|
|
|
4676
4749
|
}
|
|
4677
4750
|
);
|
|
4678
4751
|
};
|
|
4752
|
+
var Eyebrow = React23__namespace.forwardRef(
|
|
4753
|
+
({ aside, tone = "muted", className, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
4754
|
+
"div",
|
|
4755
|
+
{
|
|
4756
|
+
ref,
|
|
4757
|
+
className: cn(
|
|
4758
|
+
"flex items-baseline gap-2 text-meta font-semibold uppercase tracking-wide",
|
|
4759
|
+
tone === "muted" && "text-muted-foreground",
|
|
4760
|
+
tone === "foreground" && "text-foreground",
|
|
4761
|
+
tone === "accent" && "text-primary",
|
|
4762
|
+
className
|
|
4763
|
+
),
|
|
4764
|
+
...props,
|
|
4765
|
+
children: [
|
|
4766
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 truncate", children }),
|
|
4767
|
+
aside != null ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-auto shrink-0 font-normal normal-case tracking-normal text-muted-foreground", children: aside }) : null
|
|
4768
|
+
]
|
|
4769
|
+
}
|
|
4770
|
+
)
|
|
4771
|
+
);
|
|
4772
|
+
Eyebrow.displayName = "Eyebrow";
|
|
4773
|
+
var PanelBox = React23__namespace.forwardRef(
|
|
4774
|
+
({ title, aside, flush, className, headerClassName, bodyClassName, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
4775
|
+
Card,
|
|
4776
|
+
{
|
|
4777
|
+
ref,
|
|
4778
|
+
className: cn(
|
|
4779
|
+
// A band is square and flat: the radius and the lift belong to cards
|
|
4780
|
+
// that float, and twenty of these in a column would read as twenty
|
|
4781
|
+
// floating things rather than one page.
|
|
4782
|
+
"flex min-w-0 flex-col overflow-hidden rounded-control shadow-none",
|
|
4783
|
+
className
|
|
4784
|
+
),
|
|
4785
|
+
...props,
|
|
4786
|
+
children: [
|
|
4787
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4788
|
+
"div",
|
|
4789
|
+
{
|
|
4790
|
+
className: cn(
|
|
4791
|
+
"flex h-[31px] shrink-0 items-center border-b border-border px-2.5",
|
|
4792
|
+
headerClassName
|
|
4793
|
+
),
|
|
4794
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(Eyebrow, { aside, className: "w-full", children: title })
|
|
4795
|
+
}
|
|
4796
|
+
),
|
|
4797
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4798
|
+
"div",
|
|
4799
|
+
{
|
|
4800
|
+
className: cn(
|
|
4801
|
+
"flex min-w-0 flex-col",
|
|
4802
|
+
flush ? "p-0" : "px-2.5 py-2",
|
|
4803
|
+
bodyClassName
|
|
4804
|
+
),
|
|
4805
|
+
children
|
|
4806
|
+
}
|
|
4807
|
+
)
|
|
4808
|
+
]
|
|
4809
|
+
}
|
|
4810
|
+
)
|
|
4811
|
+
);
|
|
4812
|
+
PanelBox.displayName = "PanelBox";
|
|
4679
4813
|
function PanelContent({
|
|
4680
4814
|
title,
|
|
4681
4815
|
titleText,
|
|
@@ -4954,6 +5088,47 @@ var PropertyRow = React23__namespace.forwardRef(
|
|
|
4954
5088
|
)
|
|
4955
5089
|
);
|
|
4956
5090
|
PropertyRow.displayName = "PropertyRow";
|
|
5091
|
+
var RecordHeader = React23__namespace.forwardRef(
|
|
5092
|
+
({ tone, crumbs, chips, actions, className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
5093
|
+
"div",
|
|
5094
|
+
{
|
|
5095
|
+
ref,
|
|
5096
|
+
className: cn(
|
|
5097
|
+
"flex shrink-0 items-center gap-2.5 border-b border-border bg-card px-4 py-2.5",
|
|
5098
|
+
className
|
|
5099
|
+
),
|
|
5100
|
+
...props,
|
|
5101
|
+
children: [
|
|
5102
|
+
tone ? /* @__PURE__ */ jsxRuntime.jsx(StatusDot, { tone, size: "lg" }) : null,
|
|
5103
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-w-0 items-center gap-1.5", children: crumbs.map((crumb, i) => {
|
|
5104
|
+
const last = i === crumbs.length - 1;
|
|
5105
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(React23__namespace.Fragment, { children: [
|
|
5106
|
+
i > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
5107
|
+
lucideReact.ChevronRight,
|
|
5108
|
+
{
|
|
5109
|
+
"aria-hidden": true,
|
|
5110
|
+
className: "size-3.5 shrink-0 text-muted-foreground/60"
|
|
5111
|
+
}
|
|
5112
|
+
) : null,
|
|
5113
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
5114
|
+
"span",
|
|
5115
|
+
{
|
|
5116
|
+
className: cn(
|
|
5117
|
+
"min-w-0 truncate font-mono",
|
|
5118
|
+
last ? "text-base font-semibold text-foreground" : "text-muted-foreground"
|
|
5119
|
+
),
|
|
5120
|
+
children: crumb
|
|
5121
|
+
}
|
|
5122
|
+
)
|
|
5123
|
+
] }, i);
|
|
5124
|
+
}) }),
|
|
5125
|
+
chips ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex shrink-0 items-center gap-1.5", children: chips }) : null,
|
|
5126
|
+
actions ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-auto flex shrink-0 items-center gap-1.5", children: actions }) : null
|
|
5127
|
+
]
|
|
5128
|
+
}
|
|
5129
|
+
)
|
|
5130
|
+
);
|
|
5131
|
+
RecordHeader.displayName = "RecordHeader";
|
|
4957
5132
|
var ProposalCard = React23__namespace.forwardRef(
|
|
4958
5133
|
({
|
|
4959
5134
|
title,
|
|
@@ -5273,27 +5448,6 @@ var SearchInput = ({
|
|
|
5273
5448
|
}
|
|
5274
5449
|
);
|
|
5275
5450
|
};
|
|
5276
|
-
var Eyebrow = React23__namespace.forwardRef(
|
|
5277
|
-
({ aside, tone = "muted", className, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
5278
|
-
"div",
|
|
5279
|
-
{
|
|
5280
|
-
ref,
|
|
5281
|
-
className: cn(
|
|
5282
|
-
"flex items-baseline gap-2 text-meta font-semibold uppercase tracking-wide",
|
|
5283
|
-
tone === "muted" && "text-muted-foreground",
|
|
5284
|
-
tone === "foreground" && "text-foreground",
|
|
5285
|
-
tone === "accent" && "text-primary",
|
|
5286
|
-
className
|
|
5287
|
-
),
|
|
5288
|
-
...props,
|
|
5289
|
-
children: [
|
|
5290
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 truncate", children }),
|
|
5291
|
-
aside != null ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-auto shrink-0 font-normal normal-case tracking-normal text-muted-foreground", children: aside }) : null
|
|
5292
|
-
]
|
|
5293
|
-
}
|
|
5294
|
-
)
|
|
5295
|
-
);
|
|
5296
|
-
Eyebrow.displayName = "Eyebrow";
|
|
5297
5451
|
var SectionHeader = React23__namespace.forwardRef(({ icon, title, count, actions, bare, className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
5298
5452
|
"div",
|
|
5299
5453
|
{
|
|
@@ -5760,6 +5914,85 @@ var TaskGantt = React23__namespace.forwardRef(
|
|
|
5760
5914
|
}
|
|
5761
5915
|
);
|
|
5762
5916
|
TaskGantt.displayName = "TaskGantt";
|
|
5917
|
+
var TaskNode = React23__namespace.forwardRef(
|
|
5918
|
+
({ taskKey, bound, status, tags, meta, selected, gate, dim, ghost, className, ...props }, ref) => {
|
|
5919
|
+
if (ghost) {
|
|
5920
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
5921
|
+
"div",
|
|
5922
|
+
{
|
|
5923
|
+
ref,
|
|
5924
|
+
className: cn(
|
|
5925
|
+
"flex w-[146px] flex-col gap-1 border border-dashed border-border p-2",
|
|
5926
|
+
"text-meta text-muted-foreground",
|
|
5927
|
+
className
|
|
5928
|
+
),
|
|
5929
|
+
...props,
|
|
5930
|
+
children: [
|
|
5931
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate font-mono", children: taskKey }),
|
|
5932
|
+
meta != null ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: meta }) : null
|
|
5933
|
+
]
|
|
5934
|
+
}
|
|
5935
|
+
);
|
|
5936
|
+
}
|
|
5937
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
5938
|
+
"div",
|
|
5939
|
+
{
|
|
5940
|
+
ref,
|
|
5941
|
+
"data-selected": selected || void 0,
|
|
5942
|
+
className: cn(
|
|
5943
|
+
"relative flex w-[146px] flex-col gap-1 border bg-card p-2 shadow-xs",
|
|
5944
|
+
// The ring says one thing at a time, in this order: you picked it,
|
|
5945
|
+
// it is held for approval, it failed. A node cannot be two of those.
|
|
5946
|
+
selected ? "border-primary ring-2 ring-primary/25" : gate ? "border-warning" : status === "error" ? "border-destructive" : "border-border",
|
|
5947
|
+
dim && "opacity-45",
|
|
5948
|
+
className
|
|
5949
|
+
),
|
|
5950
|
+
...props,
|
|
5951
|
+
children: [
|
|
5952
|
+
selected ? ["-left-1 -top-1", "-right-1 -top-1", "-bottom-1 -left-1", "-bottom-1 -right-1"].map(
|
|
5953
|
+
(pos) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
5954
|
+
"span",
|
|
5955
|
+
{
|
|
5956
|
+
"aria-hidden": true,
|
|
5957
|
+
className: cn("absolute size-[7px] border-[1.5px] border-primary bg-card", pos)
|
|
5958
|
+
},
|
|
5959
|
+
pos
|
|
5960
|
+
)
|
|
5961
|
+
) : null,
|
|
5962
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5", children: [
|
|
5963
|
+
status ? /* @__PURE__ */ jsxRuntime.jsx(StatusDot, { tone: status, size: "sm" }) : null,
|
|
5964
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 truncate font-mono", children: taskKey })
|
|
5965
|
+
] }),
|
|
5966
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-1.5", children: [
|
|
5967
|
+
/* @__PURE__ */ jsxRuntime.jsx(BoundChip, { bound }),
|
|
5968
|
+
tags?.map((tag, i) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
5969
|
+
"span",
|
|
5970
|
+
{
|
|
5971
|
+
className: cn(
|
|
5972
|
+
"shrink-0 border px-1 text-meta",
|
|
5973
|
+
tag.tone === "warning" ? "border-warning/40 text-warning" : "border-border text-muted-foreground"
|
|
5974
|
+
),
|
|
5975
|
+
children: tag.label
|
|
5976
|
+
},
|
|
5977
|
+
i
|
|
5978
|
+
))
|
|
5979
|
+
] }),
|
|
5980
|
+
meta != null ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
5981
|
+
"div",
|
|
5982
|
+
{
|
|
5983
|
+
className: cn(
|
|
5984
|
+
"truncate text-meta",
|
|
5985
|
+
gate ? "text-warning" : "text-muted-foreground"
|
|
5986
|
+
),
|
|
5987
|
+
children: meta
|
|
5988
|
+
}
|
|
5989
|
+
) : null
|
|
5990
|
+
]
|
|
5991
|
+
}
|
|
5992
|
+
);
|
|
5993
|
+
}
|
|
5994
|
+
);
|
|
5995
|
+
TaskNode.displayName = "TaskNode";
|
|
5763
5996
|
var TemplatePicker = React23__namespace.forwardRef(({ heading, options, value, onSelect, footnote, className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
5764
5997
|
"div",
|
|
5765
5998
|
{
|
|
@@ -5800,6 +6033,12 @@ var TemplatePicker = React23__namespace.forwardRef(({ heading, options, value, o
|
|
|
5800
6033
|
}
|
|
5801
6034
|
));
|
|
5802
6035
|
TemplatePicker.displayName = "TemplatePicker";
|
|
6036
|
+
var LEVEL = {
|
|
6037
|
+
info: "text-success",
|
|
6038
|
+
warn: "text-warning",
|
|
6039
|
+
error: "text-destructive",
|
|
6040
|
+
debug: "text-muted-foreground"
|
|
6041
|
+
};
|
|
5803
6042
|
var MARKER = {
|
|
5804
6043
|
prompt: "$",
|
|
5805
6044
|
output: "\u2192",
|
|
@@ -5831,19 +6070,19 @@ var Terminal = React23__namespace.forwardRef(
|
|
|
5831
6070
|
);
|
|
5832
6071
|
Terminal.displayName = "Terminal";
|
|
5833
6072
|
var TerminalLine = React23__namespace.forwardRef(
|
|
5834
|
-
({ kind = "output", columns, className, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
6073
|
+
({ kind = "output", level, levelColumn = 1, columns, className, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
5835
6074
|
"div",
|
|
5836
6075
|
{
|
|
5837
6076
|
ref,
|
|
5838
6077
|
className: cn(
|
|
5839
6078
|
"items-baseline gap-2 whitespace-pre",
|
|
5840
|
-
columns ? "grid [grid-template-columns:auto_var(--terminal-cols)]" : "flex",
|
|
6079
|
+
columns ? level ? "grid [grid-template-columns:var(--terminal-cols)]" : "grid [grid-template-columns:auto_var(--terminal-cols)]" : "flex",
|
|
5841
6080
|
kind === "comment" && "text-muted-foreground",
|
|
5842
6081
|
className
|
|
5843
6082
|
),
|
|
5844
6083
|
...props,
|
|
5845
6084
|
children: [
|
|
5846
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
6085
|
+
level ? null : /* @__PURE__ */ jsxRuntime.jsx(
|
|
5847
6086
|
"span",
|
|
5848
6087
|
{
|
|
5849
6088
|
"aria-hidden": true,
|
|
@@ -5859,7 +6098,9 @@ var TerminalLine = React23__namespace.forwardRef(
|
|
|
5859
6098
|
{
|
|
5860
6099
|
className: cn(
|
|
5861
6100
|
"min-w-0 truncate",
|
|
5862
|
-
|
|
6101
|
+
// A log tints its level cell and greys everything that is not the
|
|
6102
|
+
// message; a transcript greys only its trailing cell.
|
|
6103
|
+
level ? i === levelColumn ? LEVEL[level] : i === columns.length - 1 ? void 0 : "text-muted-foreground" : i === columns.length - 1 && "text-muted-foreground"
|
|
5863
6104
|
),
|
|
5864
6105
|
children: c
|
|
5865
6106
|
},
|
|
@@ -6569,6 +6810,7 @@ exports.AvatarImage = AvatarImage;
|
|
|
6569
6810
|
exports.Badge = Badge;
|
|
6570
6811
|
exports.BarChartH = BarChartH;
|
|
6571
6812
|
exports.BarChartV = BarChartV;
|
|
6813
|
+
exports.BoundChip = BoundChip;
|
|
6572
6814
|
exports.Breadcrumb = Breadcrumb;
|
|
6573
6815
|
exports.BreadcrumbEllipsis = BreadcrumbEllipsis;
|
|
6574
6816
|
exports.BreadcrumbItem = BreadcrumbItem;
|
|
@@ -6719,6 +6961,7 @@ exports.PaginationItem = PaginationItem;
|
|
|
6719
6961
|
exports.PaginationLink = PaginationLink;
|
|
6720
6962
|
exports.PaginationNext = PaginationNext;
|
|
6721
6963
|
exports.PaginationPrevious = PaginationPrevious;
|
|
6964
|
+
exports.PanelBox = PanelBox;
|
|
6722
6965
|
exports.PanelContent = PanelContent;
|
|
6723
6966
|
exports.PanelStack = PanelStack;
|
|
6724
6967
|
exports.Popover = Popover;
|
|
@@ -6729,6 +6972,7 @@ exports.PropertyList = PropertyList;
|
|
|
6729
6972
|
exports.PropertyRow = PropertyRow;
|
|
6730
6973
|
exports.ProposalCard = ProposalCard;
|
|
6731
6974
|
exports.RatingControl = RatingControl;
|
|
6975
|
+
exports.RecordHeader = RecordHeader;
|
|
6732
6976
|
exports.RepairNote = RepairNote;
|
|
6733
6977
|
exports.ResizableHandle = ResizableHandle;
|
|
6734
6978
|
exports.ResizablePanel = ResizablePanel;
|
|
@@ -6792,6 +7036,7 @@ exports.TabsList = TabsList;
|
|
|
6792
7036
|
exports.TabsTrigger = TabsTrigger;
|
|
6793
7037
|
exports.TaskGantt = TaskGantt;
|
|
6794
7038
|
exports.TaskGanttDetailCard = TaskGanttDetailCard;
|
|
7039
|
+
exports.TaskNode = TaskNode;
|
|
6795
7040
|
exports.TemplatePicker = TemplatePicker;
|
|
6796
7041
|
exports.Terminal = Terminal;
|
|
6797
7042
|
exports.TerminalLine = TerminalLine;
|
|
@@ -6829,6 +7074,7 @@ exports.TypographySmall = TypographySmall;
|
|
|
6829
7074
|
exports.UnderDevelopment = UnderDevelopment;
|
|
6830
7075
|
exports.agentChipVariants = agentChipVariants;
|
|
6831
7076
|
exports.badgeVariants = badgeVariants;
|
|
7077
|
+
exports.boundSwatch = SWATCH;
|
|
6832
7078
|
exports.buttonGroupVariants = buttonGroupVariants;
|
|
6833
7079
|
exports.buttonVariants = buttonVariants;
|
|
6834
7080
|
exports.chatSessionGutterClass = chatSessionGutterClass;
|