@actioneer/ads 0.2.4 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/components/ai-elements/chain-of-thought.d.ts +88 -6
  2. package/components/ai-elements/chain-of-thought.js +370 -107
  3. package/components/ai-elements/chart.d.ts +30 -0
  4. package/components/ai-elements/chart.js +303 -0
  5. package/components/ai-elements/index.d.ts +2 -0
  6. package/components/ai-elements/message.d.ts +12 -2
  7. package/components/ai-elements/message.js +133 -100
  8. package/components/ai-elements/research-activity.d.ts +62 -0
  9. package/components/ai-elements/research-activity.js +278 -0
  10. package/components/ai-elements/task.d.ts +7 -3
  11. package/components/ai-elements/task.js +84 -52
  12. package/components/ai-elements/tool.js +39 -35
  13. package/components/ai-elements/voice.d.ts +7 -1
  14. package/components/ai-elements/voice.js +234 -180
  15. package/components/alert.js +28 -16
  16. package/components/answer.d.ts +16 -0
  17. package/components/answer.js +273 -249
  18. package/components/assistant-ui/attachment.js +5 -1
  19. package/components/assistant-ui/composer-deep-research.js +44 -29
  20. package/components/assistant-ui/composer-harness.js +45 -27
  21. package/components/assistant-ui/composer.js +16 -16
  22. package/components/assistant-ui/index.d.ts +0 -1
  23. package/components/assistant-ui/message.d.ts +7 -0
  24. package/components/assistant-ui/message.js +36 -36
  25. package/components/assistant-ui/thread.js +1 -1
  26. package/components/brand-texture.d.ts +37 -0
  27. package/components/brand-texture.js +54 -0
  28. package/components/code-block.d.ts +42 -0
  29. package/components/code-block.js +235 -0
  30. package/components/drawer.d.ts +1 -1
  31. package/components/file-dropzone.d.ts +32 -0
  32. package/components/file-dropzone.js +134 -0
  33. package/components/index.d.ts +10 -0
  34. package/components/index.js +482 -433
  35. package/components/infinite-canvas.d.ts +50 -0
  36. package/components/infinite-canvas.js +215 -0
  37. package/components/page-header.d.ts +22 -0
  38. package/components/page-header.js +52 -0
  39. package/components/resizable-panel.d.ts +29 -0
  40. package/components/resizable-panel.js +102 -0
  41. package/components/reveal.d.ts +36 -0
  42. package/components/reveal.js +35 -0
  43. package/components/scroll-area.d.ts +19 -0
  44. package/components/scroll-area.js +57 -0
  45. package/components/setting-row.d.ts +35 -0
  46. package/components/setting-row.js +86 -0
  47. package/components/sidebar.js +131 -131
  48. package/components/stepper.d.ts +40 -0
  49. package/components/stepper.js +102 -0
  50. package/components/table.js +16 -15
  51. package/components/tabs.js +1 -1
  52. package/lib/icons.d.ts +12 -0
  53. package/lib/icons.js +98 -95
  54. package/lib/motion.d.ts +7 -3
  55. package/lib/motion.js +29 -27
  56. package/llms.txt +123 -28
  57. package/manifest.json +883 -68
  58. package/package.json +2 -2
  59. package/styles.css +179 -30
  60. package/theme.css +29 -17
  61. package/components/assistant-ui/smart-message-text.d.ts +0 -15
  62. package/components/assistant-ui/smart-message-text.js +0 -29
@@ -0,0 +1,54 @@
1
+ "use client";
2
+ import { jsx as e } from "react/jsx-runtime";
3
+ import { cn as i } from "../lib/cn.js";
4
+ import { PixelBlastSVG as s } from "./pixel-blast-svg.js";
5
+ function l({
6
+ paused: t = !1,
7
+ speed: a = 1.5,
8
+ className: r
9
+ }) {
10
+ return /* @__PURE__ */ e("div", { className: i("size-full bg-background", r), children: /* @__PURE__ */ e(
11
+ s,
12
+ {
13
+ variant: "custom",
14
+ color: "var(--color-ink-950)",
15
+ pixelSize: 4,
16
+ speed: a,
17
+ patternScale: 3,
18
+ patternDensity: 1.8,
19
+ pixelSizeJitter: 0.5,
20
+ enableRipples: !1,
21
+ liquid: !1,
22
+ toneAmount: 0,
23
+ edgeFade: 0.25,
24
+ transparent: !0,
25
+ paused: t
26
+ }
27
+ ) });
28
+ }
29
+ const o = ({
30
+ paused: t,
31
+ lifted: a,
32
+ speed: r = 1.5,
33
+ className: n,
34
+ ...d
35
+ }) => /* @__PURE__ */ e(
36
+ "div",
37
+ {
38
+ "aria-hidden": !0,
39
+ "data-slot": "brand-texture",
40
+ className: i(
41
+ "ads-texture-reveal ads-texture-lift pointer-events-none absolute inset-0 overflow-hidden",
42
+ a ? "ads-texture-lifted opacity-0" : "opacity-(--chat-texture-opacity)",
43
+ n
44
+ ),
45
+ ...d,
46
+ children: /* @__PURE__ */ e("div", { className: "h-full w-full", children: /* @__PURE__ */ e(l, { paused: t, speed: r }) })
47
+ }
48
+ );
49
+ o.displayName = "BrandTexture";
50
+ l.displayName = "BrandTextureField";
51
+ export {
52
+ o as BrandTexture,
53
+ l as BrandTextureField
54
+ };
@@ -0,0 +1,42 @@
1
+ import { VariantProps } from 'class-variance-authority';
2
+ import * as React from "react";
3
+ /**
4
+ * CodeBlock — block-level source display: a query, a config, a tool payload.
5
+ * The inline sibling is `Code`; reach for this whenever the snippet owns its
6
+ * own line(s).
7
+ *
8
+ * A recessed, static surface — filled, never elevated (elevation means
9
+ * actionable) and never bordered. Long snippets scroll inside the block, so
10
+ * cap the height from the outside (`className="max-h-96"`) rather than letting
11
+ * the page grow.
12
+ *
13
+ * Highlighting is deliberately minimal and dependency-free: `language` selects
14
+ * one of a few small built-in grammars (sql, json, yaml, bash, ts/js) and only
15
+ * the parts a reader scans for are coloured — comments recede, strings and
16
+ * numbers take one accent each, keywords take weight. An unrecognised language
17
+ * renders plain rather than guessing. No highlighter library, and no rainbow
18
+ * competing with the brand's monochrome.
19
+ */
20
+ declare const codeBlockVariants: (props?: ({
21
+ variant?: "soft" | "plain" | null | undefined;
22
+ } & import('class-variance-authority/types').ClassProp) | undefined) => string;
23
+ export interface CodeBlockProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "children">, VariantProps<typeof codeBlockVariants> {
24
+ /** The source to display, verbatim. */
25
+ code: string;
26
+ /**
27
+ * Language label for the header, e.g. `sql`. Also selects the highlighting
28
+ * grammar: sql · json · yaml · yml · bash/sh/shell/zsh · ts/tsx/js/jsx.
29
+ * Anything else is shown as a label and rendered plain.
30
+ */
31
+ language?: string;
32
+ /** Leading header label, e.g. `schema.yaml`. Takes the header's start slot. */
33
+ filename?: string;
34
+ /** Show the copy control. */
35
+ isCopyable?: boolean;
36
+ /** Number the lines in a non-selectable gutter. */
37
+ showLineNumbers?: boolean;
38
+ /** Accessible label for the copy control. */
39
+ copyLabel?: string;
40
+ }
41
+ export declare const CodeBlock: React.ForwardRefExoticComponent<CodeBlockProps & React.RefAttributes<HTMLDivElement>>;
42
+ export { codeBlockVariants };
@@ -0,0 +1,235 @@
1
+ "use client";
2
+ import { jsxs as m, jsx as r } from "react/jsx-runtime";
3
+ import * as c from "react";
4
+ import { cva as C } from "class-variance-authority";
5
+ import { Button as R } from "./button.js";
6
+ import { Check as E, Copy as S } from "../lib/icons.js";
7
+ import { cn as k } from "../lib/cn.js";
8
+ const j = C(
9
+ // `flex flex-col` so a height cap from the consumer squeezes the <pre>
10
+ // rather than clipping it — the pre is the scroll container, not this.
11
+ "group/code-block relative flex w-full flex-col overflow-hidden rounded-lg text-xs",
12
+ {
13
+ variants: {
14
+ variant: {
15
+ /** Recessed fill — the default, for code sitting on a card or panel. */
16
+ soft: "bg-muted",
17
+ /** No fill, for code already inside a filled or tinted surface. */
18
+ plain: "bg-transparent"
19
+ }
20
+ },
21
+ defaultVariants: { variant: "soft" }
22
+ }
23
+ ), f = '"(?:[^"\\\\\\n]|\\\\.)*"', h = "'(?:[^'\\\\\\n]|\\\\.)*'", T = {
24
+ sql: [
25
+ { kind: "comment", re: /--[^\n]*/y },
26
+ { kind: "string", re: new RegExp(h, "y") },
27
+ {
28
+ kind: "keyword",
29
+ re: /\b(select|from|where|create|table|index|concurrently|on|and|or|not|null|group|by|order|limit|offset|insert|into|values|update|set|delete|join|left|right|inner|outer|full|as|distinct|case|when|then|else|end|with|union|all|desc|asc|true|false|count|sum|avg|min|max|having)\b/iy
30
+ },
31
+ { kind: "number", re: /\b\d+(?:\.\d+)?\b/y },
32
+ { kind: "punct", re: /[(),;]/y }
33
+ ],
34
+ json: [
35
+ { kind: "string", re: new RegExp(f, "y") },
36
+ { kind: "keyword", re: /\b(?:true|false|null)\b/y },
37
+ { kind: "number", re: /-?\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b/y },
38
+ { kind: "punct", re: /[{}[\],:]/y }
39
+ ],
40
+ yaml: [
41
+ { kind: "comment", re: /#[^\n]*/y },
42
+ { kind: "string", re: new RegExp(`${f}|${h}`, "y") },
43
+ { kind: "keyword", re: /\b(?:true|false|null|yes|no)\b/y },
44
+ { kind: "number", re: /\b\d+(?:\.\d+)?\b/y },
45
+ { kind: "punct", re: /[-:]/y }
46
+ ],
47
+ bash: [
48
+ { kind: "comment", re: /#[^\n]*/y },
49
+ { kind: "string", re: new RegExp(`${f}|${h}`, "y") },
50
+ { kind: "keyword", re: /--?[A-Za-z][\w-]*/y },
51
+ { kind: "number", re: /\b\d+\b/y }
52
+ ],
53
+ ts: [
54
+ { kind: "comment", re: /\/\/[^\n]*|\/\*[\s\S]*?\*\//y },
55
+ { kind: "string", re: new RegExp(`${f}|${h}|\`(?:[^\`\\\\]|\\\\.)*\``, "y") },
56
+ {
57
+ kind: "keyword",
58
+ re: /\b(?:const|let|var|function|return|if|else|for|while|import|from|export|default|new|class|extends|implements|async|await|type|interface|enum|public|private|readonly|true|false|null|undefined|this)\b/y
59
+ },
60
+ { kind: "number", re: /\b\d+(?:\.\d+)?\b/y },
61
+ { kind: "punct", re: /[{}[\]();,:]/y }
62
+ ]
63
+ }, A = {
64
+ sql: "sql",
65
+ json: "json",
66
+ yaml: "yaml",
67
+ yml: "yaml",
68
+ bash: "bash",
69
+ sh: "bash",
70
+ shell: "bash",
71
+ zsh: "bash",
72
+ ts: "ts",
73
+ tsx: "ts",
74
+ js: "ts",
75
+ jsx: "ts",
76
+ javascript: "ts",
77
+ typescript: "ts"
78
+ }, $ = {
79
+ comment: "text-tertiary",
80
+ string: "text-success-700",
81
+ number: "text-info-700",
82
+ keyword: "font-bold text-foreground",
83
+ punct: "text-tertiary"
84
+ };
85
+ function B(s, t) {
86
+ const e = [];
87
+ let n = "", o = 0;
88
+ for (; o < s.length; ) {
89
+ let i = null;
90
+ for (const { kind: y, re: u } of t) {
91
+ u.lastIndex = o;
92
+ const l = u.exec(s);
93
+ if (l && l.index === o && l[0].length > 0) {
94
+ i = { text: l[0], kind: y };
95
+ break;
96
+ }
97
+ }
98
+ i ? (n && (e.push({ text: n }), n = ""), e.push(i), o += i.text.length) : (n += s[o], o += 1);
99
+ }
100
+ return n && e.push({ text: n }), e;
101
+ }
102
+ function z(s) {
103
+ const t = [[]];
104
+ for (const e of s)
105
+ e.text.split(`
106
+ `).forEach((o, i) => {
107
+ i > 0 && t.push([]), o && t[t.length - 1].push({ ...e, text: o });
108
+ });
109
+ return t;
110
+ }
111
+ function g(s) {
112
+ return s.map(
113
+ (t, e) => t.kind ? /* @__PURE__ */ r("span", { className: $[t.kind], children: t.text }, e) : /* @__PURE__ */ r(c.Fragment, { children: t.text }, e)
114
+ );
115
+ }
116
+ function M(s = 2e3) {
117
+ const [t, e] = c.useState(!1), n = c.useRef(null);
118
+ c.useEffect(
119
+ () => () => {
120
+ n.current !== null && window.clearTimeout(n.current);
121
+ },
122
+ []
123
+ );
124
+ const o = c.useCallback(
125
+ (i) => {
126
+ !i || typeof navigator > "u" || !navigator.clipboard || navigator.clipboard.writeText(i).then(
127
+ () => {
128
+ e(!0), n.current !== null && window.clearTimeout(n.current), n.current = window.setTimeout(
129
+ () => e(!1),
130
+ s
131
+ );
132
+ },
133
+ () => {
134
+ }
135
+ );
136
+ },
137
+ [s]
138
+ );
139
+ return { isCopied: t, copy: o };
140
+ }
141
+ const _ = c.forwardRef(
142
+ ({
143
+ className: s,
144
+ code: t,
145
+ language: e,
146
+ filename: n,
147
+ variant: o,
148
+ isCopyable: i = !0,
149
+ showLineNumbers: y = !1,
150
+ copyLabel: u = "Copy code",
151
+ ...l
152
+ }, v) => {
153
+ const { isCopied: x, copy: N } = M(), b = !!(n || e), w = c.useMemo(() => {
154
+ const d = e ? T[A[e.toLowerCase()]] : void 0, a = t.replace(/\n$/, "");
155
+ return z(d ? B(a, d) : [{ text: a }]);
156
+ }, [t, e]), p = i ? /* @__PURE__ */ r(
157
+ R,
158
+ {
159
+ type: "button",
160
+ variant: "ghost",
161
+ size: "icon-xs",
162
+ "aria-label": u,
163
+ onClick: () => N(t),
164
+ children: x ? /* @__PURE__ */ r(E, { "aria-hidden": !0, className: "text-success" }) : /* @__PURE__ */ r(S, { "aria-hidden": !0 })
165
+ }
166
+ ) : null;
167
+ return /* @__PURE__ */ m(
168
+ "div",
169
+ {
170
+ ref: v,
171
+ "data-slot": "code-block",
172
+ className: k(j({ variant: o }), s),
173
+ ...l,
174
+ children: [
175
+ /* @__PURE__ */ r("span", { "aria-live": "polite", className: "sr-only", children: x ? "Copied to clipboard" : "" }),
176
+ b && /* @__PURE__ */ m(
177
+ "div",
178
+ {
179
+ "data-slot": "code-block-header",
180
+ className: "flex items-center gap-2 px-3 py-1.5 text-tertiary",
181
+ children: [
182
+ n && /* @__PURE__ */ r("span", { className: "min-w-0 truncate font-medium text-secondary", children: n }),
183
+ e && /* @__PURE__ */ r("span", { className: "shrink-0 font-mono text-[11px] uppercase", children: e }),
184
+ p && /* @__PURE__ */ r("span", { className: "ml-auto shrink-0", children: p })
185
+ ]
186
+ }
187
+ ),
188
+ !b && p && /* @__PURE__ */ r(
189
+ "span",
190
+ {
191
+ className: k(
192
+ "absolute top-1.5 right-1.5 z-10 opacity-0 transition-opacity duration-(--duration-fast) ease-out",
193
+ "group-hover/code-block:opacity-100 focus-within:opacity-100",
194
+ "motion-reduce:transition-none"
195
+ ),
196
+ children: p
197
+ }
198
+ ),
199
+ /* @__PURE__ */ r(
200
+ "pre",
201
+ {
202
+ "data-slot": "code-block-content",
203
+ className: k(
204
+ // min-h-0 lets this shrink inside the flex column; without it a
205
+ // capped block clips its overflow instead of scrolling to it.
206
+ "min-h-0 overflow-auto px-3 leading-relaxed text-foreground tabular-nums",
207
+ b ? "pb-3" : "py-3"
208
+ ),
209
+ children: /* @__PURE__ */ r("code", { className: "font-mono", children: y ? w.map((d, a) => /* @__PURE__ */ m("span", { className: "grid grid-cols-[2ch_1fr] gap-3", children: [
210
+ /* @__PURE__ */ r(
211
+ "span",
212
+ {
213
+ "aria-hidden": !0,
214
+ className: "select-none text-right text-tertiary",
215
+ children: a + 1
216
+ }
217
+ ),
218
+ /* @__PURE__ */ r("span", { children: g(d) })
219
+ ] }, a)) : w.map((d, a) => /* @__PURE__ */ m(c.Fragment, { children: [
220
+ a > 0 && `
221
+ `,
222
+ g(d)
223
+ ] }, a)) })
224
+ }
225
+ )
226
+ ]
227
+ }
228
+ );
229
+ }
230
+ );
231
+ _.displayName = "CodeBlock";
232
+ export {
233
+ _ as CodeBlock,
234
+ j as codeBlockVariants
235
+ };
@@ -14,7 +14,7 @@ export interface DrawerProps extends VariantProps<typeof panelVariants> {
14
14
  }
15
15
  /**
16
16
  * ModalDrawer — legacy portaled drawer. Kept for the demo product's
17
- * answer-sources / citation-preview / voice-campaigns screens where a blocking
17
+ * answer-sources / voice-campaigns screens where a blocking
18
18
  * side panel over the whole viewport is the intended pattern. New code should
19
19
  * prefer `Drawer` (the inline variant) — it doesn't leave the page while it's
20
20
  * open, so users can keep referencing content beside it.
@@ -0,0 +1,32 @@
1
+ import * as React from "react";
2
+ /**
3
+ * FileDropzone — the drop-or-browse target for file input. ADS previously had
4
+ * no file primitive at all, so every upload surface hand-rolled a hidden
5
+ * `<input type="file">`.
6
+ *
7
+ * A dashed edge is the one sanctioned stroke here: it is the affordance
8
+ * ("something goes in this hole"), not decoration. The zone is actionable, so
9
+ * it takes hover, focus and press feedback; while a file is dragged over it
10
+ * the fill deepens rather than the stroke thickening, so nothing jumps.
11
+ */
12
+ declare const fileDropzoneVariants: (props?: ({
13
+ isDragging?: boolean | null | undefined;
14
+ isDisabled?: boolean | null | undefined;
15
+ } & import('class-variance-authority/types').ClassProp) | undefined) => string;
16
+ export interface FileDropzoneProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onDrop" | "onChange"> {
17
+ /** Native accept string, e.g. `"image/*,.csv"`. */
18
+ accept?: string;
19
+ multiple?: boolean;
20
+ disabled?: boolean;
21
+ /** Fires with the chosen files, whether dropped or browsed. */
22
+ onFiles?: (files: File[]) => void;
23
+ /** The current selection — render the chosen state and a clear control. */
24
+ files?: File[];
25
+ onClear?: () => void;
26
+ /** Headline copy; defaults to a browse prompt. */
27
+ label?: React.ReactNode;
28
+ /** Sub-line, e.g. "CSV up to 10 MB". */
29
+ hint?: React.ReactNode;
30
+ }
31
+ export declare const FileDropzone: React.ForwardRefExoticComponent<FileDropzoneProps & React.RefAttributes<HTMLDivElement>>;
32
+ export { fileDropzoneVariants };
@@ -0,0 +1,134 @@
1
+ "use client";
2
+ import { jsxs as t, jsx as r, Fragment as f } from "react/jsx-runtime";
3
+ import * as i from "react";
4
+ import { cva as C } from "class-variance-authority";
5
+ import { cn as v } from "../lib/cn.js";
6
+ import { Button as D } from "./button.js";
7
+ import { FileText as R, Close as B, Upload as w } from "../lib/icons.js";
8
+ const T = C(
9
+ v(
10
+ "flex w-full cursor-pointer flex-col items-center justify-center gap-2 rounded-xl px-6 py-8 text-center",
11
+ "border-2 border-dashed border-border-strong bg-surface outline-none",
12
+ "transition-[background-color,border-color,transform] duration-(--duration-fast) ease-out",
13
+ "hover:bg-muted focus-visible:ring-3 focus-visible:ring-ring",
14
+ "active:scale-(--scale-press) motion-reduce:transition-none"
15
+ ),
16
+ {
17
+ variants: {
18
+ isDragging: {
19
+ true: "border-ring bg-accent",
20
+ false: ""
21
+ },
22
+ isDisabled: {
23
+ true: "pointer-events-none opacity-50",
24
+ false: ""
25
+ }
26
+ },
27
+ defaultVariants: { isDragging: !1, isDisabled: !1 }
28
+ }
29
+ ), j = (a) => a < 1024 ? `${a} B` : a < 1024 * 1024 ? `${Math.round(a / 1024)} KB` : `${(a / (1024 * 1024)).toFixed(1)} MB`, $ = i.forwardRef(
30
+ ({
31
+ className: a,
32
+ accept: b,
33
+ multiple: c = !1,
34
+ disabled: n = !1,
35
+ onFiles: l,
36
+ files: s,
37
+ onClear: g,
38
+ label: N,
39
+ hint: p,
40
+ ...y
41
+ }, z) => {
42
+ const m = i.useRef(null), [h, d] = i.useState(!1), o = i.useRef(0), x = (e) => {
43
+ e != null && e.length && (l == null || l(c ? Array.from(e) : [e[0]]));
44
+ }, u = () => {
45
+ var e;
46
+ return (e = m.current) == null ? void 0 : e.click();
47
+ }, k = !!(s != null && s.length);
48
+ return /* @__PURE__ */ t(
49
+ "div",
50
+ {
51
+ ref: z,
52
+ "data-slot": "file-dropzone",
53
+ "data-dragging": h || void 0,
54
+ role: "button",
55
+ tabIndex: n ? -1 : 0,
56
+ "aria-disabled": n || void 0,
57
+ onClick: u,
58
+ onKeyDown: (e) => {
59
+ (e.key === "Enter" || e.key === " ") && (e.preventDefault(), u());
60
+ },
61
+ onDragEnter: (e) => {
62
+ e.preventDefault(), o.current += 1, d(!0);
63
+ },
64
+ onDragOver: (e) => e.preventDefault(),
65
+ onDragLeave: () => {
66
+ o.current -= 1, o.current <= 0 && (o.current = 0, d(!1));
67
+ },
68
+ onDrop: (e) => {
69
+ e.preventDefault(), o.current = 0, d(!1), n || x(e.dataTransfer.files);
70
+ },
71
+ className: v(
72
+ T({ isDragging: h, isDisabled: n }),
73
+ a
74
+ ),
75
+ ...y,
76
+ children: [
77
+ /* @__PURE__ */ r(
78
+ "input",
79
+ {
80
+ ref: m,
81
+ hidden: !0,
82
+ type: "file",
83
+ accept: b,
84
+ multiple: c,
85
+ disabled: n,
86
+ onChange: (e) => {
87
+ x(e.currentTarget.files), e.currentTarget.value = "";
88
+ }
89
+ }
90
+ ),
91
+ k ? /* @__PURE__ */ t(f, { children: [
92
+ /* @__PURE__ */ r("span", { "aria-hidden": !0, className: "text-tertiary [&>svg]:size-6", children: /* @__PURE__ */ r(R, {}) }),
93
+ /* @__PURE__ */ r("div", { className: "flex flex-col gap-0.5", children: s.map((e) => /* @__PURE__ */ t("span", { className: "text-base text-foreground", children: [
94
+ e.name,
95
+ /* @__PURE__ */ r("span", { className: "ml-2 text-xs text-tertiary tabular-nums", children: j(e.size) })
96
+ ] }, e.name)) }),
97
+ /* @__PURE__ */ t("div", { className: "mt-1 flex items-center gap-2", children: [
98
+ /* @__PURE__ */ r(D, { size: "sm", variant: "secondary", onClick: (e) => {
99
+ e.stopPropagation(), u();
100
+ }, children: "Replace" }),
101
+ g && /* @__PURE__ */ r(
102
+ D,
103
+ {
104
+ size: "sm",
105
+ variant: "ghost",
106
+ startContent: /* @__PURE__ */ r(B, {}),
107
+ onClick: (e) => {
108
+ e.stopPropagation(), g();
109
+ },
110
+ children: "Clear"
111
+ }
112
+ )
113
+ ] })
114
+ ] }) : /* @__PURE__ */ t(f, { children: [
115
+ /* @__PURE__ */ r("span", { "aria-hidden": !0, className: "text-tertiary [&>svg]:size-6", children: /* @__PURE__ */ r(w, {}) }),
116
+ /* @__PURE__ */ r("span", { className: "text-base text-foreground", children: N ?? /* @__PURE__ */ t(f, { children: [
117
+ "Drop ",
118
+ c ? "files" : "a file",
119
+ " here, or",
120
+ " ",
121
+ /* @__PURE__ */ r("span", { className: "underline underline-offset-4", children: "browse" })
122
+ ] }) }),
123
+ p && /* @__PURE__ */ r("span", { className: "text-xs text-tertiary", children: p })
124
+ ] })
125
+ ]
126
+ }
127
+ );
128
+ }
129
+ );
130
+ $.displayName = "FileDropzone";
131
+ export {
132
+ $ as FileDropzone,
133
+ T as fileDropzoneVariants
134
+ };
@@ -3,11 +3,18 @@ export { interactive, type InteractiveProps } from '../lib/interactive';
3
3
  export { TooltipProvider } from './ui/tooltip';
4
4
  export * from './button';
5
5
  export * from './spinner';
6
+ export * from './reveal';
6
7
  export * from './field';
7
8
  export * from './typography';
8
9
  export * from './link';
9
10
  export * from './divider';
10
11
  export * from './kbd';
12
+ export * from './code-block';
13
+ export * from './setting-row';
14
+ export * from './file-dropzone';
15
+ export * from './scroll-area';
16
+ export * from './stepper';
17
+ export * from './resizable-panel';
11
18
  export * from './input';
12
19
  export * from './input-field';
13
20
  export * from './textarea';
@@ -31,6 +38,7 @@ export * from './card';
31
38
  export * from './carousel';
32
39
  export * from './chart';
33
40
  export * from './connector-card';
41
+ export * from './infinite-canvas';
34
42
  export * from './table';
35
43
  export * from './tabs';
36
44
  export * from './tree';
@@ -42,10 +50,12 @@ export * from './timeline';
42
50
  export * from './alert';
43
51
  export * from './brand-loader';
44
52
  export * from './pixel-blast-svg';
53
+ export * from './brand-texture';
45
54
  export * from './progress';
46
55
  export * from './progress-circle';
47
56
  export * from './skeleton';
48
57
  export * from './empty-state';
58
+ export * from './page-header';
49
59
  export * from './navbar';
50
60
  export * from './breadcrumbs';
51
61
  export * from './pagination';