@actioneer/ads 0.2.3 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/ai-elements/chain-of-thought.d.ts +88 -19
- package/components/ai-elements/chain-of-thought.js +358 -149
- package/components/ai-elements/chart.d.ts +30 -0
- package/components/ai-elements/chart.js +303 -0
- package/components/ai-elements/index.d.ts +2 -1
- package/components/ai-elements/message.d.ts +19 -4
- package/components/ai-elements/message.js +177 -130
- package/components/ai-elements/research-activity.d.ts +45 -0
- package/components/ai-elements/research-activity.js +260 -0
- package/components/ai-elements/task-progress.js +69 -66
- package/components/ai-elements/tool.js +42 -38
- package/components/answer.d.ts +19 -0
- package/components/answer.js +363 -300
- package/components/assistant-ui/attachment.js +5 -1
- package/components/assistant-ui/composer-deep-research.js +44 -29
- package/components/assistant-ui/composer-harness.js +55 -38
- package/components/assistant-ui/composer.js +16 -16
- package/components/assistant-ui/index.d.ts +0 -1
- package/components/assistant-ui/message.d.ts +7 -0
- package/components/assistant-ui/message.js +64 -51
- package/components/assistant-ui/primitives.d.ts +1 -1
- package/components/assistant-ui/thread-context.d.ts +2 -0
- package/components/assistant-ui/thread.js +34 -32
- package/components/brand-texture.d.ts +37 -0
- package/components/brand-texture.js +54 -0
- package/components/chart.d.ts +64 -2
- package/components/chart.js +717 -456
- package/components/code-block.d.ts +36 -0
- package/components/code-block.js +136 -0
- package/components/command-palette.d.ts +43 -0
- package/components/command-palette.js +146 -0
- package/components/drawer.d.ts +1 -1
- package/components/file-dropzone.d.ts +32 -0
- package/components/file-dropzone.js +134 -0
- package/components/index.d.ts +11 -0
- package/components/index.js +480 -430
- package/components/infinite-canvas.d.ts +50 -0
- package/components/infinite-canvas.js +215 -0
- package/components/page-header.d.ts +22 -0
- package/components/page-header.js +52 -0
- package/components/resizable-panel.d.ts +29 -0
- package/components/resizable-panel.js +102 -0
- package/components/reveal.d.ts +36 -0
- package/components/reveal.js +35 -0
- package/components/scroll-area.d.ts +19 -0
- package/components/scroll-area.js +57 -0
- package/components/setting-row.d.ts +35 -0
- package/components/setting-row.js +86 -0
- package/components/sidebar.d.ts +4 -1
- package/components/sidebar.js +134 -132
- package/components/stepper.d.ts +32 -0
- package/components/stepper.js +113 -0
- package/components/table.js +16 -15
- package/components/tabs.js +1 -1
- package/hooks/agents-ui/voice-visualizer-types.js +1 -0
- package/lib/icons.d.ts +24 -0
- package/lib/icons.js +100 -110
- package/lib/motion.d.ts +5 -3
- package/lib/motion.js +46 -20
- package/lib/router.js +19 -0
- package/lib/utils.js +5 -0
- package/llms.txt +143 -39
- package/manifest.json +1232 -100
- package/package.json +2 -2
- package/styles.css +71 -28
- package/theme.css +19 -15
- package/components/ai-elements/reasoning.d.ts +0 -26
- package/components/ai-elements/reasoning.js +0 -131
- package/components/assistant-ui/smart-message-text.d.ts +0 -15
- package/components/assistant-ui/smart-message-text.js +0 -29
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs as c, jsx as s } from "react/jsx-runtime";
|
|
3
|
+
import * as f from "react";
|
|
4
|
+
import { cva as g } from "class-variance-authority";
|
|
5
|
+
import { cn as o } from "../lib/cn.js";
|
|
6
|
+
const x = g(
|
|
7
|
+
"flex w-full items-center gap-3 rounded-lg bg-card px-4 py-3 text-left",
|
|
8
|
+
{
|
|
9
|
+
variants: {
|
|
10
|
+
isPressable: {
|
|
11
|
+
true: o(
|
|
12
|
+
"cursor-pointer outline-none",
|
|
13
|
+
"transition-[background-color,transform] duration-(--duration-fast) ease-out",
|
|
14
|
+
"hover:bg-muted focus-visible:ring-3 focus-visible:ring-ring",
|
|
15
|
+
"active:scale-(--scale-press) motion-reduce:transition-none"
|
|
16
|
+
),
|
|
17
|
+
false: ""
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
defaultVariants: { isPressable: !1 }
|
|
21
|
+
}
|
|
22
|
+
), p = f.forwardRef(
|
|
23
|
+
({ className: r, icon: i, label: n, description: l, action: d, onSelect: e, ...m }, u) => {
|
|
24
|
+
const a = !!e;
|
|
25
|
+
return /* @__PURE__ */ c(
|
|
26
|
+
"div",
|
|
27
|
+
{
|
|
28
|
+
ref: u,
|
|
29
|
+
"data-slot": "setting-row",
|
|
30
|
+
role: a ? "button" : void 0,
|
|
31
|
+
tabIndex: a ? 0 : void 0,
|
|
32
|
+
onClick: e,
|
|
33
|
+
onKeyDown: a ? (t) => {
|
|
34
|
+
(t.key === "Enter" || t.key === " ") && (t.preventDefault(), e == null || e());
|
|
35
|
+
} : void 0,
|
|
36
|
+
className: o(x({ isPressable: a }), r),
|
|
37
|
+
...m,
|
|
38
|
+
children: [
|
|
39
|
+
i && /* @__PURE__ */ s(
|
|
40
|
+
"span",
|
|
41
|
+
{
|
|
42
|
+
"aria-hidden": !0,
|
|
43
|
+
className: "flex size-5 shrink-0 items-center justify-center text-tertiary [&>svg]:size-4.5",
|
|
44
|
+
children: i
|
|
45
|
+
}
|
|
46
|
+
),
|
|
47
|
+
/* @__PURE__ */ c("div", { className: "flex min-w-0 flex-1 flex-col gap-0.5", children: [
|
|
48
|
+
/* @__PURE__ */ s("div", { className: "min-w-0 truncate text-base text-foreground", children: n }),
|
|
49
|
+
l && /* @__PURE__ */ s("div", { className: "min-w-0 text-xs text-tertiary", children: l })
|
|
50
|
+
] }),
|
|
51
|
+
d && // The trailing control owns its own click — a pressable row must not
|
|
52
|
+
// also fire when the reader aims at the button inside it.
|
|
53
|
+
/* @__PURE__ */ s(
|
|
54
|
+
"span",
|
|
55
|
+
{
|
|
56
|
+
className: "shrink-0",
|
|
57
|
+
onClick: (t) => t.stopPropagation(),
|
|
58
|
+
children: d
|
|
59
|
+
}
|
|
60
|
+
)
|
|
61
|
+
]
|
|
62
|
+
}
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
);
|
|
66
|
+
p.displayName = "SettingRow";
|
|
67
|
+
const v = f.forwardRef(
|
|
68
|
+
({ className: r, ...i }, n) => /* @__PURE__ */ s(
|
|
69
|
+
"div",
|
|
70
|
+
{
|
|
71
|
+
ref: n,
|
|
72
|
+
"data-slot": "setting-list",
|
|
73
|
+
className: o(
|
|
74
|
+
"flex w-full flex-col gap-0.5 rounded-xl bg-surface p-1",
|
|
75
|
+
r
|
|
76
|
+
),
|
|
77
|
+
...i
|
|
78
|
+
}
|
|
79
|
+
)
|
|
80
|
+
);
|
|
81
|
+
v.displayName = "SettingList";
|
|
82
|
+
export {
|
|
83
|
+
v as SettingList,
|
|
84
|
+
p as SettingRow,
|
|
85
|
+
x as settingRowVariants
|
|
86
|
+
};
|
package/components/sidebar.d.ts
CHANGED
|
@@ -46,6 +46,9 @@ export interface SidebarBrandProps extends React.HTMLAttributes<HTMLDivElement>
|
|
|
46
46
|
label?: string;
|
|
47
47
|
/** Reveal the collapse trigger in place of the logo on hover. Default true. */
|
|
48
48
|
showTrigger?: boolean;
|
|
49
|
+
/** Persistent header actions (e.g. a global-search button), right-aligned
|
|
50
|
+
* next to the hover-revealed collapse trigger. Hidden while collapsed. */
|
|
51
|
+
children?: React.ReactNode;
|
|
49
52
|
}
|
|
50
53
|
/**
|
|
51
54
|
* Brand header — the logo sits in the top slot and, when `showTrigger`, swaps to
|
|
@@ -53,7 +56,7 @@ export interface SidebarBrandProps extends React.HTMLAttributes<HTMLDivElement>
|
|
|
53
56
|
* place). Self-contained: use it as the first child of `Sidebar` instead of a
|
|
54
57
|
* `SidebarHeader`.
|
|
55
58
|
*/
|
|
56
|
-
export declare function SidebarBrand({ logo, href, label, showTrigger, className, ...props }: SidebarBrandProps): React.JSX.Element;
|
|
59
|
+
export declare function SidebarBrand({ logo, href, label, showTrigger, children, className, ...props }: SidebarBrandProps): React.JSX.Element;
|
|
57
60
|
export declare const SidebarHeader: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
|
|
58
61
|
export declare const SidebarNav: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLElement> & React.RefAttributes<HTMLElement>>;
|
|
59
62
|
export interface SidebarSectionProps extends React.HTMLAttributes<HTMLDivElement> {
|
package/components/sidebar.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { jsx as
|
|
3
|
-
import * as
|
|
4
|
-
import { PanelLeft as
|
|
5
|
-
import { cn as
|
|
6
|
-
import { Tooltip as
|
|
2
|
+
import { jsx as t, jsxs as c } from "react/jsx-runtime";
|
|
3
|
+
import * as n from "react";
|
|
4
|
+
import { PanelLeft as k } from "../lib/icons.js";
|
|
5
|
+
import { cn as o } from "../lib/cn.js";
|
|
6
|
+
import { Tooltip as R } from "./tooltip.js";
|
|
7
7
|
import { Avatar as _ } from "./avatar.js";
|
|
8
|
-
const
|
|
8
|
+
const z = n.createContext({
|
|
9
9
|
collapsed: !1,
|
|
10
10
|
toggle: () => {
|
|
11
11
|
},
|
|
@@ -13,43 +13,43 @@ const k = i.createContext({
|
|
|
13
13
|
}
|
|
14
14
|
});
|
|
15
15
|
function j() {
|
|
16
|
-
return
|
|
16
|
+
return n.useContext(z);
|
|
17
17
|
}
|
|
18
|
-
const H =
|
|
18
|
+
const H = n.forwardRef(
|
|
19
19
|
({
|
|
20
20
|
className: a,
|
|
21
21
|
collapsed: e,
|
|
22
|
-
defaultCollapsed:
|
|
23
|
-
onCollapsedChange:
|
|
24
|
-
keyboardToggle:
|
|
22
|
+
defaultCollapsed: i = !1,
|
|
23
|
+
onCollapsedChange: r,
|
|
24
|
+
keyboardToggle: s = !0,
|
|
25
25
|
...d
|
|
26
|
-
},
|
|
27
|
-
const [
|
|
26
|
+
}, f) => {
|
|
27
|
+
const [p, v] = n.useState(i), b = e !== void 0, l = b ? e : p, h = n.useCallback(
|
|
28
28
|
(u) => {
|
|
29
|
-
b ||
|
|
29
|
+
b || v(u), r == null || r(u);
|
|
30
30
|
},
|
|
31
|
-
[b,
|
|
32
|
-
),
|
|
33
|
-
() =>
|
|
34
|
-
[l,
|
|
31
|
+
[b, r]
|
|
32
|
+
), g = n.useCallback(
|
|
33
|
+
() => h(!l),
|
|
34
|
+
[l, h]
|
|
35
35
|
);
|
|
36
|
-
|
|
37
|
-
if (!
|
|
38
|
-
const u = (
|
|
39
|
-
(
|
|
36
|
+
n.useEffect(() => {
|
|
37
|
+
if (!s) return;
|
|
38
|
+
const u = (m) => {
|
|
39
|
+
(m.metaKey || m.ctrlKey) && m.key.toLowerCase() === "b" && (m.preventDefault(), g());
|
|
40
40
|
};
|
|
41
41
|
return document.addEventListener("keydown", u), () => document.removeEventListener("keydown", u);
|
|
42
|
-
}, [
|
|
43
|
-
const
|
|
44
|
-
() => ({ collapsed: l, toggle:
|
|
45
|
-
[l,
|
|
42
|
+
}, [s, g]);
|
|
43
|
+
const x = n.useMemo(
|
|
44
|
+
() => ({ collapsed: l, toggle: g, setCollapsed: h }),
|
|
45
|
+
[l, g, h]
|
|
46
46
|
);
|
|
47
|
-
return /* @__PURE__ */
|
|
47
|
+
return /* @__PURE__ */ t(z.Provider, { value: x, children: /* @__PURE__ */ t(
|
|
48
48
|
"aside",
|
|
49
49
|
{
|
|
50
|
-
ref:
|
|
50
|
+
ref: f,
|
|
51
51
|
"data-collapsed": l ? "true" : "false",
|
|
52
|
-
className:
|
|
52
|
+
className: o(
|
|
53
53
|
"group/sidebar flex h-full shrink-0 flex-col bg-transparent",
|
|
54
54
|
l ? "w-(--sidebar-width-sm)" : "w-(--sidebar-width)",
|
|
55
55
|
a
|
|
@@ -61,43 +61,43 @@ const H = i.forwardRef(
|
|
|
61
61
|
);
|
|
62
62
|
H.displayName = "Sidebar";
|
|
63
63
|
function S({ children: a }) {
|
|
64
|
-
return /* @__PURE__ */
|
|
64
|
+
return /* @__PURE__ */ t("kbd", { className: "inline-flex h-4 min-w-4 items-center justify-center rounded bg-background/20 px-1 text-xs leading-none", children: a });
|
|
65
65
|
}
|
|
66
66
|
function E({
|
|
67
67
|
className: a,
|
|
68
68
|
onClick: e,
|
|
69
|
-
...
|
|
69
|
+
...i
|
|
70
70
|
}) {
|
|
71
|
-
const { collapsed:
|
|
72
|
-
return /* @__PURE__ */
|
|
73
|
-
|
|
71
|
+
const { collapsed: r, toggle: s } = j();
|
|
72
|
+
return /* @__PURE__ */ t(
|
|
73
|
+
R,
|
|
74
74
|
{
|
|
75
75
|
side: "right",
|
|
76
76
|
content: /* @__PURE__ */ c("span", { className: "flex items-center gap-1.5", children: [
|
|
77
|
-
|
|
77
|
+
r ? "Expand" : "Collapse",
|
|
78
78
|
/* @__PURE__ */ c("span", { className: "flex items-center gap-0.5", children: [
|
|
79
|
-
/* @__PURE__ */
|
|
80
|
-
/* @__PURE__ */
|
|
79
|
+
/* @__PURE__ */ t(S, { children: "⌘" }),
|
|
80
|
+
/* @__PURE__ */ t(S, { children: "B" })
|
|
81
81
|
] })
|
|
82
82
|
] }),
|
|
83
|
-
children: /* @__PURE__ */
|
|
83
|
+
children: /* @__PURE__ */ t(
|
|
84
84
|
"button",
|
|
85
85
|
{
|
|
86
86
|
type: "button",
|
|
87
|
-
"aria-label":
|
|
88
|
-
"aria-pressed":
|
|
87
|
+
"aria-label": r ? "Expand sidebar" : "Collapse sidebar",
|
|
88
|
+
"aria-pressed": r,
|
|
89
89
|
onClick: (d) => {
|
|
90
|
-
e == null || e(d),
|
|
90
|
+
e == null || e(d), s();
|
|
91
91
|
},
|
|
92
|
-
className:
|
|
92
|
+
className: o(
|
|
93
93
|
"inline-flex size-(--sidebar-item) shrink-0 items-center justify-center rounded-md border border-transparent text-muted-foreground",
|
|
94
94
|
"transition-colors hover:border-border hover:bg-elevated hover:text-foreground",
|
|
95
95
|
"outline-none focus-visible:ring-3 focus-visible:ring-ring",
|
|
96
96
|
"[&_svg]:size-4.5",
|
|
97
97
|
a
|
|
98
98
|
),
|
|
99
|
-
...
|
|
100
|
-
children: /* @__PURE__ */
|
|
99
|
+
...i,
|
|
100
|
+
children: /* @__PURE__ */ t(k, {})
|
|
101
101
|
}
|
|
102
102
|
)
|
|
103
103
|
}
|
|
@@ -106,40 +106,42 @@ function E({
|
|
|
106
106
|
function X({
|
|
107
107
|
logo: a,
|
|
108
108
|
href: e,
|
|
109
|
-
label:
|
|
110
|
-
showTrigger:
|
|
111
|
-
|
|
112
|
-
|
|
109
|
+
label: i = "Home",
|
|
110
|
+
showTrigger: r = !0,
|
|
111
|
+
children: s,
|
|
112
|
+
className: d,
|
|
113
|
+
...f
|
|
113
114
|
}) {
|
|
114
|
-
const p =
|
|
115
|
+
const p = o(
|
|
115
116
|
// 20px mark centered in a 32px square — the same box as every other rail icon.
|
|
116
117
|
// group/brand lets a BrandMark logo play its blip loop on hover.
|
|
117
118
|
"group/brand flex size-(--sidebar-item) items-center justify-center",
|
|
118
119
|
"[&_img]:size-(--sidebar-logo) [&_svg]:size-(--sidebar-logo)",
|
|
119
|
-
|
|
120
|
+
r && "group-hover/sidebar:hidden"
|
|
120
121
|
);
|
|
121
122
|
return /* @__PURE__ */ c(
|
|
122
123
|
"div",
|
|
123
124
|
{
|
|
124
|
-
className:
|
|
125
|
+
className: o(
|
|
125
126
|
"flex h-(--sidebar-header) shrink-0 items-center justify-between gap-2 px-3",
|
|
126
127
|
"group-data-[collapsed=true]/sidebar:justify-center group-data-[collapsed=true]/sidebar:px-2",
|
|
127
|
-
|
|
128
|
+
d
|
|
128
129
|
),
|
|
129
|
-
...
|
|
130
|
+
...f,
|
|
130
131
|
children: [
|
|
131
|
-
e ? /* @__PURE__ */
|
|
132
|
-
|
|
132
|
+
e ? /* @__PURE__ */ t("a", { href: e, "aria-label": i, className: p, children: a }) : /* @__PURE__ */ t("span", { className: p, children: a }),
|
|
133
|
+
r && /* @__PURE__ */ t("div", { className: "hidden group-hover/sidebar:flex", children: /* @__PURE__ */ t(E, {}) }),
|
|
134
|
+
s && /* @__PURE__ */ t("div", { className: "flex items-center gap-1 group-data-[collapsed=true]/sidebar:hidden", children: s })
|
|
133
135
|
]
|
|
134
136
|
}
|
|
135
137
|
);
|
|
136
138
|
}
|
|
137
|
-
const I =
|
|
138
|
-
({ className: a, ...e },
|
|
139
|
+
const I = n.forwardRef(
|
|
140
|
+
({ className: a, ...e }, i) => /* @__PURE__ */ t(
|
|
139
141
|
"div",
|
|
140
142
|
{
|
|
141
|
-
ref:
|
|
142
|
-
className:
|
|
143
|
+
ref: i,
|
|
144
|
+
className: o(
|
|
143
145
|
"flex h-(--sidebar-header) shrink-0 items-center justify-between gap-2 px-3",
|
|
144
146
|
"group-data-[collapsed=true]/sidebar:justify-center group-data-[collapsed=true]/sidebar:px-2",
|
|
145
147
|
a
|
|
@@ -149,63 +151,63 @@ const I = i.forwardRef(
|
|
|
149
151
|
)
|
|
150
152
|
);
|
|
151
153
|
I.displayName = "SidebarHeader";
|
|
152
|
-
const L =
|
|
153
|
-
({ className: a, ...e },
|
|
154
|
+
const L = n.forwardRef(
|
|
155
|
+
({ className: a, ...e }, i) => /* @__PURE__ */ t("nav", { ref: i, className: o("min-h-0 flex-1 space-y-5 overflow-y-auto p-3", a), ...e })
|
|
154
156
|
);
|
|
155
157
|
L.displayName = "SidebarNav";
|
|
156
|
-
const A =
|
|
157
|
-
({ className: a, label: e, children:
|
|
158
|
-
e && /* @__PURE__ */
|
|
159
|
-
/* @__PURE__ */
|
|
158
|
+
const A = n.forwardRef(
|
|
159
|
+
({ className: a, label: e, children: i, ...r }, s) => /* @__PURE__ */ c("div", { ref: s, className: a, ...r, children: [
|
|
160
|
+
e && /* @__PURE__ */ t("div", { className: "mb-1.5 px-3 text-[length:var(--sidebar-section-label-size)] leading-[var(--text-xs--line-height)] font-normal uppercase tracking-wider text-muted-foreground group-data-[collapsed=true]/sidebar:hidden", children: e }),
|
|
161
|
+
/* @__PURE__ */ t("div", { className: "flex flex-col gap-0.5", children: i })
|
|
160
162
|
] })
|
|
161
163
|
);
|
|
162
164
|
A.displayName = "SidebarSection";
|
|
163
|
-
const K =
|
|
164
|
-
({ className: a, icon: e, isActive:
|
|
165
|
+
const K = n.forwardRef(
|
|
166
|
+
({ className: a, icon: e, isActive: i, endContent: r, children: s, title: d, ...f }, p) => /* @__PURE__ */ c(
|
|
165
167
|
"a",
|
|
166
168
|
{
|
|
167
|
-
ref:
|
|
168
|
-
"aria-current":
|
|
169
|
-
title: d ?? (typeof
|
|
170
|
-
className:
|
|
171
|
-
"flex items-center gap-2.5 rounded-md px-3 py-1.5 text-xs transition-colors",
|
|
169
|
+
ref: p,
|
|
170
|
+
"aria-current": i ? "page" : void 0,
|
|
171
|
+
title: d ?? (typeof s == "string" ? s : void 0),
|
|
172
|
+
className: o(
|
|
173
|
+
"flex items-center gap-2.5 rounded-md px-3 py-1.5 text-[length:var(--sidebar-navigation-text-size)] leading-[var(--text-xs--line-height)] transition-colors",
|
|
172
174
|
"outline-none focus-visible:ring-3 focus-visible:ring-ring",
|
|
173
175
|
"[&_svg]:size-4 [&_svg]:shrink-0",
|
|
174
176
|
// Collapsed: a centered square (--sidebar-item) so every rail item lines up.
|
|
175
177
|
"group-data-[collapsed=true]/sidebar:mx-auto group-data-[collapsed=true]/sidebar:size-(--sidebar-item) group-data-[collapsed=true]/sidebar:justify-center group-data-[collapsed=true]/sidebar:p-0",
|
|
176
|
-
|
|
178
|
+
i ? "bg-fill font-medium text-foreground" : "text-muted-foreground hover:bg-fill/60 hover:text-foreground",
|
|
177
179
|
a
|
|
178
180
|
),
|
|
179
|
-
...
|
|
181
|
+
...f,
|
|
180
182
|
children: [
|
|
181
183
|
e,
|
|
182
|
-
/* @__PURE__ */
|
|
183
|
-
|
|
184
|
+
/* @__PURE__ */ t("span", { className: "min-w-0 flex-1 truncate group-data-[collapsed=true]/sidebar:hidden", children: s }),
|
|
185
|
+
r && /* @__PURE__ */ t("span", { className: "shrink-0 group-data-[collapsed=true]/sidebar:hidden", children: r })
|
|
184
186
|
]
|
|
185
187
|
}
|
|
186
188
|
)
|
|
187
189
|
);
|
|
188
190
|
K.displayName = "SidebarItem";
|
|
189
|
-
const M =
|
|
190
|
-
({ className: a, ...e },
|
|
191
|
+
const M = n.forwardRef(
|
|
192
|
+
({ className: a, ...e }, i) => /* @__PURE__ */ t(
|
|
191
193
|
"div",
|
|
192
194
|
{
|
|
193
|
-
ref:
|
|
194
|
-
className:
|
|
195
|
+
ref: i,
|
|
196
|
+
className: o("shrink-0 p-3 group-data-[collapsed=true]/sidebar:px-2", a),
|
|
195
197
|
...e
|
|
196
198
|
}
|
|
197
199
|
)
|
|
198
200
|
);
|
|
199
201
|
M.displayName = "SidebarFooter";
|
|
200
|
-
const q =
|
|
201
|
-
({ className: a, icon: e, children:
|
|
202
|
+
const q = n.forwardRef(
|
|
203
|
+
({ className: a, icon: e, children: i, ...r }, s) => /* @__PURE__ */ t("div", { className: "px-3 pb-1 group-data-[collapsed=true]/sidebar:px-2", children: /* @__PURE__ */ c(
|
|
202
204
|
"button",
|
|
203
205
|
{
|
|
204
|
-
ref:
|
|
206
|
+
ref: s,
|
|
205
207
|
type: "button",
|
|
206
|
-
className:
|
|
208
|
+
className: o(
|
|
207
209
|
"flex h-10 w-full items-center justify-start gap-2 rounded-md bg-elevated px-3",
|
|
208
|
-
"text-xs font-medium text-foreground",
|
|
210
|
+
"text-[length:var(--sidebar-navigation-text-size)] leading-[var(--text-xs--line-height)] font-medium text-foreground",
|
|
209
211
|
// Same hover feedback as ConnectorCard: raised at rest, lifts on
|
|
210
212
|
// hover, settles back on press.
|
|
211
213
|
"shadow-elevation",
|
|
@@ -216,53 +218,53 @@ const q = i.forwardRef(
|
|
|
216
218
|
"group-data-[collapsed=true]/sidebar:mx-auto group-data-[collapsed=true]/sidebar:size-(--sidebar-item) group-data-[collapsed=true]/sidebar:justify-center group-data-[collapsed=true]/sidebar:px-0",
|
|
217
219
|
a
|
|
218
220
|
),
|
|
219
|
-
...
|
|
221
|
+
...r,
|
|
220
222
|
children: [
|
|
221
223
|
e,
|
|
222
|
-
/* @__PURE__ */
|
|
224
|
+
/* @__PURE__ */ t("span", { className: "truncate group-data-[collapsed=true]/sidebar:hidden", children: i })
|
|
223
225
|
]
|
|
224
226
|
}
|
|
225
227
|
) })
|
|
226
228
|
);
|
|
227
229
|
q.displayName = "SidebarAction";
|
|
228
|
-
const B =
|
|
229
|
-
({ className: a, label: e, children:
|
|
230
|
+
const B = n.forwardRef(
|
|
231
|
+
({ className: a, label: e, children: i, ...r }, s) => /* @__PURE__ */ c(
|
|
230
232
|
"div",
|
|
231
233
|
{
|
|
232
|
-
ref:
|
|
233
|
-
className:
|
|
234
|
-
...
|
|
234
|
+
ref: s,
|
|
235
|
+
className: o("group-data-[collapsed=true]/sidebar:hidden", a),
|
|
236
|
+
...r,
|
|
235
237
|
children: [
|
|
236
|
-
e && /* @__PURE__ */
|
|
237
|
-
/* @__PURE__ */
|
|
238
|
+
e && /* @__PURE__ */ t("div", { className: "mb-1.5 px-3 text-[length:var(--sidebar-section-label-size)] leading-[var(--text-xs--line-height)] font-semibold uppercase tracking-wider text-muted-foreground", children: e }),
|
|
239
|
+
/* @__PURE__ */ t("div", { className: "flex flex-col gap-0.5", children: i })
|
|
238
240
|
]
|
|
239
241
|
}
|
|
240
242
|
)
|
|
241
243
|
);
|
|
242
244
|
B.displayName = "SidebarHistory";
|
|
243
|
-
const D =
|
|
244
|
-
const
|
|
245
|
-
|
|
246
|
-
const u =
|
|
247
|
-
if (!u || !
|
|
245
|
+
const D = n.forwardRef(({ className: a, children: e, title: i, action: r, isActive: s, icon: d, ...f }, p) => {
|
|
246
|
+
const v = n.useRef(null), b = n.useRef(null), [l, h] = n.useState(0);
|
|
247
|
+
n.useLayoutEffect(() => {
|
|
248
|
+
const u = v.current, m = b.current;
|
|
249
|
+
if (!u || !m) return;
|
|
248
250
|
const N = () => {
|
|
249
|
-
const w =
|
|
250
|
-
|
|
251
|
+
const w = m.scrollWidth - u.clientWidth;
|
|
252
|
+
h(w > 0 ? w + (r ? 32 : 0) : 0);
|
|
251
253
|
};
|
|
252
254
|
N();
|
|
253
255
|
const y = new ResizeObserver(N);
|
|
254
|
-
return y.observe(u), y.observe(
|
|
255
|
-
}, [e,
|
|
256
|
-
const
|
|
256
|
+
return y.observe(u), y.observe(m), () => y.disconnect();
|
|
257
|
+
}, [e, r]);
|
|
258
|
+
const g = l > 0, x = Math.max(500, Math.round(l * 18));
|
|
257
259
|
return /* @__PURE__ */ c(
|
|
258
260
|
"div",
|
|
259
261
|
{
|
|
260
|
-
className:
|
|
262
|
+
className: o(
|
|
261
263
|
"group/hist relative flex items-center rounded-md transition-colors",
|
|
262
|
-
|
|
264
|
+
s ? "bg-fill/60 text-foreground" : "text-muted-foreground hover:bg-fill/60 hover:text-foreground"
|
|
263
265
|
),
|
|
264
266
|
children: [
|
|
265
|
-
d && /* @__PURE__ */
|
|
267
|
+
d && /* @__PURE__ */ t(
|
|
266
268
|
"span",
|
|
267
269
|
{
|
|
268
270
|
"aria-hidden": !0,
|
|
@@ -270,43 +272,43 @@ const D = i.forwardRef(({ className: a, children: e, title: s, action: t, isActi
|
|
|
270
272
|
children: d
|
|
271
273
|
}
|
|
272
274
|
),
|
|
273
|
-
/* @__PURE__ */
|
|
275
|
+
/* @__PURE__ */ t(
|
|
274
276
|
"a",
|
|
275
277
|
{
|
|
276
|
-
ref:
|
|
277
|
-
title:
|
|
278
|
-
className:
|
|
278
|
+
ref: p,
|
|
279
|
+
title: i ?? (typeof e == "string" ? e : void 0),
|
|
280
|
+
className: o(
|
|
279
281
|
// Left pad matches a SidebarItem's text column (px-3 + icon size-4 +
|
|
280
282
|
// gap-2.5 = 2.375rem) so history titles line up under the nav labels.
|
|
281
|
-
"block min-w-0 flex-1 rounded-md py-1.5 pr-3 ps-(--sidebar-text-indent) text-xs",
|
|
283
|
+
"block min-w-0 flex-1 rounded-md py-1.5 pr-3 ps-(--sidebar-text-indent) text-[length:var(--sidebar-navigation-text-size)] leading-[var(--text-xs--line-height)]",
|
|
282
284
|
"outline-none focus-visible:ring-3 focus-visible:ring-ring",
|
|
283
285
|
a
|
|
284
286
|
),
|
|
285
|
-
...
|
|
286
|
-
children: /* @__PURE__ */
|
|
287
|
+
...f,
|
|
288
|
+
children: /* @__PURE__ */ t(
|
|
287
289
|
"span",
|
|
288
290
|
{
|
|
289
|
-
ref:
|
|
290
|
-
className:
|
|
291
|
+
ref: v,
|
|
292
|
+
className: o(
|
|
291
293
|
"block overflow-hidden",
|
|
292
294
|
// Rest: fade the right edge (no ellipsis). Hover: the title scrolls,
|
|
293
295
|
// so fade the LEFT edge where it exits; the action backdrop (or the
|
|
294
296
|
// string's own end) handles the right.
|
|
295
|
-
|
|
296
|
-
|
|
297
|
+
g && "[mask-image:linear-gradient(to_right,#000_calc(100%-1.5rem),transparent)]",
|
|
298
|
+
g && "group-hover/hist:[mask-image:linear-gradient(to_right,transparent,#000_1.25rem,#000_100%)]"
|
|
297
299
|
),
|
|
298
|
-
children: /* @__PURE__ */
|
|
300
|
+
children: /* @__PURE__ */ t(
|
|
299
301
|
"span",
|
|
300
302
|
{
|
|
301
303
|
ref: b,
|
|
302
|
-
className:
|
|
304
|
+
className: o(
|
|
303
305
|
"block w-max whitespace-nowrap transition-transform ease-linear",
|
|
304
|
-
|
|
306
|
+
g && "group-hover/hist:[transform:translateX(var(--mq-x))]",
|
|
305
307
|
"motion-reduce:transition-none motion-reduce:group-hover/hist:[transform:none]"
|
|
306
308
|
),
|
|
307
309
|
style: {
|
|
308
310
|
"--mq-x": `-${l}px`,
|
|
309
|
-
transitionDuration: `${
|
|
311
|
+
transitionDuration: `${x}ms`
|
|
310
312
|
},
|
|
311
313
|
children: e
|
|
312
314
|
}
|
|
@@ -315,10 +317,10 @@ const D = i.forwardRef(({ className: a, children: e, title: s, action: t, isActi
|
|
|
315
317
|
)
|
|
316
318
|
}
|
|
317
319
|
),
|
|
318
|
-
|
|
320
|
+
r && /* @__PURE__ */ t(
|
|
319
321
|
"span",
|
|
320
322
|
{
|
|
321
|
-
className:
|
|
323
|
+
className: o(
|
|
322
324
|
// Rounded end matches the row's radius so the backdrop doesn't
|
|
323
325
|
// square off the highlight's right corners.
|
|
324
326
|
"absolute inset-y-0 right-0 flex items-center rounded-e-md pl-8 pr-1",
|
|
@@ -327,7 +329,7 @@ const D = i.forwardRef(({ className: a, children: e, title: s, action: t, isActi
|
|
|
327
329
|
"pointer-events-none group-hover/hist:pointer-events-auto",
|
|
328
330
|
"focus-within:pointer-events-auto focus-within:opacity-100"
|
|
329
331
|
),
|
|
330
|
-
children:
|
|
332
|
+
children: r
|
|
331
333
|
}
|
|
332
334
|
)
|
|
333
335
|
]
|
|
@@ -335,23 +337,23 @@ const D = i.forwardRef(({ className: a, children: e, title: s, action: t, isActi
|
|
|
335
337
|
);
|
|
336
338
|
});
|
|
337
339
|
D.displayName = "SidebarHistoryItem";
|
|
338
|
-
const F =
|
|
339
|
-
({ className: a, name: e, role:
|
|
340
|
+
const F = n.forwardRef(
|
|
341
|
+
({ className: a, name: e, role: i, src: r, ...s }, d) => /* @__PURE__ */ c(
|
|
340
342
|
"a",
|
|
341
343
|
{
|
|
342
344
|
ref: d,
|
|
343
|
-
className:
|
|
345
|
+
className: o(
|
|
344
346
|
"flex items-center gap-2.5 rounded-md p-2 transition-colors hover:bg-fill/60",
|
|
345
347
|
"outline-none focus-visible:ring-3 focus-visible:ring-ring",
|
|
346
348
|
"group-data-[collapsed=true]/sidebar:mx-auto group-data-[collapsed=true]/sidebar:size-(--sidebar-item) group-data-[collapsed=true]/sidebar:justify-center group-data-[collapsed=true]/sidebar:p-0",
|
|
347
349
|
a
|
|
348
350
|
),
|
|
349
|
-
...
|
|
351
|
+
...s,
|
|
350
352
|
children: [
|
|
351
|
-
/* @__PURE__ */
|
|
353
|
+
/* @__PURE__ */ t(_, { size: "sm", name: e, src: r }),
|
|
352
354
|
/* @__PURE__ */ c("div", { className: "min-w-0 leading-tight group-data-[collapsed=true]/sidebar:hidden", children: [
|
|
353
|
-
/* @__PURE__ */
|
|
354
|
-
|
|
355
|
+
/* @__PURE__ */ t("div", { className: "truncate text-[length:var(--sidebar-navigation-text-size)] leading-[var(--text-xs--line-height)] font-medium text-foreground", children: e }),
|
|
356
|
+
i && /* @__PURE__ */ t("div", { className: "truncate text-[length:var(--sidebar-navigation-text-size)] leading-[var(--text-xs--line-height)] text-tertiary", children: i })
|
|
355
357
|
] })
|
|
356
358
|
]
|
|
357
359
|
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { VariantProps } from 'class-variance-authority';
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
/**
|
|
4
|
+
* Stepper — discrete, indexed progress through a known set of steps.
|
|
5
|
+
*
|
|
6
|
+
* `Progress` is a continuous bar and `Timeline` is a chronological list of
|
|
7
|
+
* content; neither says "step 2 of 5, and here is what 3 through 5 will be".
|
|
8
|
+
* Completed steps collapse to a check so the eye counts what is left, not what
|
|
9
|
+
* is done. The connector is a functional rail, like `Tree`'s — an allowed
|
|
10
|
+
* stroke.
|
|
11
|
+
*/
|
|
12
|
+
export type StepperStatus = "complete" | "current" | "upcoming";
|
|
13
|
+
export interface StepperStep {
|
|
14
|
+
/** Stable key, also used for the accessible label. */
|
|
15
|
+
id: string;
|
|
16
|
+
label: React.ReactNode;
|
|
17
|
+
/** Optional qualifier under the label. */
|
|
18
|
+
description?: React.ReactNode;
|
|
19
|
+
}
|
|
20
|
+
declare const markerVariants: (props?: ({
|
|
21
|
+
status?: "current" | "complete" | "upcoming" | null | undefined;
|
|
22
|
+
} & import('class-variance-authority/types').ClassProp) | undefined) => string;
|
|
23
|
+
export interface StepperProps extends Omit<React.HTMLAttributes<HTMLOListElement>, "onSelect">, VariantProps<typeof markerVariants> {
|
|
24
|
+
steps: StepperStep[];
|
|
25
|
+
/** Zero-based index of the current step. */
|
|
26
|
+
activeIndex: number;
|
|
27
|
+
orientation?: "horizontal" | "vertical";
|
|
28
|
+
/** Makes completed steps navigable. */
|
|
29
|
+
onSelect?: (index: number) => void;
|
|
30
|
+
}
|
|
31
|
+
export declare const Stepper: React.ForwardRefExoticComponent<StepperProps & React.RefAttributes<HTMLOListElement>>;
|
|
32
|
+
export { markerVariants as stepperMarkerVariants };
|