@epicbagel/saas-kit 1.22.0 → 1.24.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.
Files changed (39) hide show
  1. package/dist/chunk-HETZNLKT.cjs +148 -0
  2. package/dist/{chunk-WE3F6EUM.cjs → chunk-KLBMHQ6U.cjs} +5 -1
  3. package/dist/{chunk-YFXZWDA5.js → chunk-M5BYOPDK.js} +5 -1
  4. package/dist/chunk-PL2462GA.js +148 -0
  5. package/dist/primitives/agent-audio-visualizer-bar.d.cts +2 -2
  6. package/dist/primitives/agent-audio-visualizer-bar.d.ts +2 -2
  7. package/dist/primitives/alert.d.cts +1 -1
  8. package/dist/primitives/alert.d.ts +1 -1
  9. package/dist/primitives/attachment.d.cts +1 -1
  10. package/dist/primitives/attachment.d.ts +1 -1
  11. package/dist/primitives/badge.d.cts +1 -1
  12. package/dist/primitives/badge.d.ts +1 -1
  13. package/dist/primitives/bubble.d.cts +1 -1
  14. package/dist/primitives/bubble.d.ts +1 -1
  15. package/dist/primitives/button.d.cts +2 -2
  16. package/dist/primitives/button.d.ts +2 -2
  17. package/dist/primitives/chat.cjs +7 -5
  18. package/dist/primitives/chat.js +4 -2
  19. package/dist/primitives/editable-list.cjs +27 -24
  20. package/dist/primitives/editable-list.js +27 -24
  21. package/dist/primitives/item.d.cts +2 -2
  22. package/dist/primitives/item.d.ts +2 -2
  23. package/dist/primitives/list.cjs +2 -2
  24. package/dist/primitives/list.js +1 -1
  25. package/dist/primitives/section-header.d.cts +1 -1
  26. package/dist/primitives/section-header.d.ts +1 -1
  27. package/dist/primitives/toggle-group.d.cts +2 -2
  28. package/dist/primitives/toggle-group.d.ts +2 -2
  29. package/dist/primitives/toggle.d.cts +2 -2
  30. package/dist/primitives/toggle.d.ts +2 -2
  31. package/dist/primitives/voice-session-controls.cjs +2 -2
  32. package/dist/primitives/voice-session-controls.d.cts +9 -1
  33. package/dist/primitives/voice-session-controls.d.ts +9 -1
  34. package/dist/primitives/voice-session-controls.js +1 -1
  35. package/dist/primitives/workflow-assistant.cjs +2 -2
  36. package/dist/primitives/workflow-assistant.js +1 -1
  37. package/package.json +1 -1
  38. package/dist/chunk-KF4X37DP.js +0 -140
  39. package/dist/chunk-YMI3X2YL.cjs +0 -140
@@ -0,0 +1,148 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }"use client";
2
+
3
+
4
+ var _chunkNKWHDI4Ccjs = require('./chunk-NKWHDI4C.cjs');
5
+
6
+
7
+ var _chunkJDEXZGIYcjs = require('./chunk-JDEXZGIY.cjs');
8
+
9
+
10
+ var _chunkKWLSBTB2cjs = require('./chunk-KWLSBTB2.cjs');
11
+
12
+ // src/primitives/voice-session-controls.tsx
13
+ var _react = require('react');
14
+ var _lucidereact = require('lucide-react');
15
+ var _jsxruntime = require('react/jsx-runtime');
16
+ var SILENCE = [];
17
+ var silence = () => SILENCE;
18
+ var noSubscription = () => () => {
19
+ };
20
+ var DEFAULT_LABELS = {
21
+ disconnected: "Voice chat",
22
+ connecting: "Connecting\u2026",
23
+ listening: "Listening\u2026",
24
+ thinking: "Thinking\u2026",
25
+ speaking: "Speaking",
26
+ reconnecting: "Reconnecting\u2026",
27
+ error: "Voice chat unavailable",
28
+ start: "Start voice chat",
29
+ end: "End voice chat",
30
+ mute: "Mute microphone",
31
+ unmute: "Unmute microphone",
32
+ muted: "Microphone muted",
33
+ retry: "Retry voice chat",
34
+ endShort: "End voice",
35
+ muteShort: "Mute",
36
+ unmuteShort: "Unmute"
37
+ };
38
+ function VoiceSessionControls({
39
+ state,
40
+ onStart,
41
+ onEnd,
42
+ muted = false,
43
+ onMutedChange,
44
+ disabled = false,
45
+ error,
46
+ volumeBands,
47
+ audioLevels,
48
+ labels,
49
+ onWarm,
50
+ size = "icon",
51
+ className
52
+ }) {
53
+ const liveBands = _react.useSyncExternalStore.call(void 0, _nullishCoalesce(_optionalChain([audioLevels, 'optionalAccess', _ => _.subscribe]), () => ( noSubscription)), _nullishCoalesce(_optionalChain([audioLevels, 'optionalAccess', _2 => _2.getSnapshot]), () => ( silence)), silence);
54
+ const copy = { ...DEFAULT_LABELS, ...labels };
55
+ const active = state !== "disconnected" && state !== "error";
56
+ const waiting = state === "connecting" || state === "reconnecting";
57
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
58
+ "div",
59
+ {
60
+ "data-slot": "voice-session-controls",
61
+ "data-state": state,
62
+ className: _chunkKWLSBTB2cjs.cn.call(void 0, "min-w-0", active ? "@container/voice w-full" : "flex flex-wrap items-center gap-2", className),
63
+ children: [
64
+ active ? (
65
+ // One row at every width: on a narrow strip the actions show only their
66
+ // icons (each keeps its full name), rather than wrapping onto a second row.
67
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { "data-slot": "voice-session-strip", className: "flex w-full flex-nowrap items-center gap-3 bg-primary/5 p-3 @sm/voice:gap-4 @sm/voice:p-4 @2xl/voice:px-5", children: [
68
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex min-w-0 flex-1 items-center gap-3 @2xl/voice:gap-4", children: [
69
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { "aria-hidden": "true", className: _chunkKWLSBTB2cjs.cn.call(void 0,
70
+ "flex size-10 shrink-0 items-center justify-center rounded-full ring-8 ring-primary/5 @sm/voice:size-12 @md/voice:size-14",
71
+ muted ? "bg-muted text-muted-foreground" : "bg-primary text-primary-foreground"
72
+ ), children: muted ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.MicOff, { className: "size-5" }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.Mic, { className: "size-5" }) }),
73
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
74
+ _chunkNKWHDI4Ccjs.AgentAudioVisualizerBar,
75
+ {
76
+ "aria-hidden": "true",
77
+ size: "sm",
78
+ barCount: 5,
79
+ className: "shrink-0 text-primary [&>div]:w-1",
80
+ state: muted && state === "listening" ? "disconnected" : state === "reconnecting" ? "connecting" : state,
81
+ volumeBands: muted && state === "listening" ? SILENCE : _nullishCoalesce(volumeBands, () => ( liveBands))
82
+ }
83
+ ),
84
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { role: "status", className: "min-w-0 flex-1 truncate text-sm font-medium text-primary", children: muted && state === "listening" ? copy.muted : copy[state] })
85
+ ] }),
86
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "ml-auto flex shrink-0 items-center gap-2", children: [
87
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
88
+ _chunkJDEXZGIYcjs.Button,
89
+ {
90
+ type: "button",
91
+ variant: "outline",
92
+ size: "sm",
93
+ className: "min-h-[44px] min-w-[44px] shrink-0 rounded-xl bg-background px-0 text-foreground @md/voice:px-3",
94
+ "aria-label": muted ? copy.unmute : copy.mute,
95
+ title: muted ? copy.unmute : copy.mute,
96
+ "aria-pressed": muted,
97
+ disabled: waiting,
98
+ onClick: () => onMutedChange(!muted),
99
+ children: [
100
+ muted ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.Mic, { "aria-hidden": "true" }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.MicOff, { "aria-hidden": "true" }),
101
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { "data-slot": "voice-session-action-label", className: "hidden @md/voice:inline", children: muted ? copy.unmuteShort : copy.muteShort })
102
+ ]
103
+ }
104
+ ),
105
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
106
+ _chunkJDEXZGIYcjs.Button,
107
+ {
108
+ type: "button",
109
+ variant: "outline",
110
+ size: "sm",
111
+ className: "min-h-[44px] min-w-[44px] shrink-0 rounded-xl bg-background px-0 text-foreground @md/voice:px-3",
112
+ "aria-label": copy.end,
113
+ title: copy.end,
114
+ onClick: onEnd,
115
+ children: [
116
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.Square, { "aria-hidden": "true", className: "fill-current" }),
117
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { "data-slot": "voice-session-action-label", className: "hidden @md/voice:inline", children: copy.endShort })
118
+ ]
119
+ }
120
+ )
121
+ ] })
122
+ ] })
123
+ ) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
124
+ _chunkJDEXZGIYcjs.Button,
125
+ {
126
+ type: "button",
127
+ size: "icon",
128
+ shape: "circle",
129
+ disabled,
130
+ onClick: onStart,
131
+ onPointerEnter: onWarm,
132
+ onPointerDown: onWarm,
133
+ onFocus: onWarm,
134
+ "aria-label": state === "error" ? copy.retry : copy.start,
135
+ title: state === "error" ? copy.retry : copy.start,
136
+ className: _chunkKWLSBTB2cjs.cn.call(void 0, "min-h-[44px] min-w-[44px] shrink-0 rounded-full", size === "hero" && "size-24 [&_svg]:size-7"),
137
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.AudioLines, { "aria-hidden": "true" })
138
+ }
139
+ ),
140
+ state === "error" && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { role: "alert", className: "basis-full text-xs text-destructive", children: error || copy.error })
141
+ ]
142
+ }
143
+ );
144
+ }
145
+
146
+
147
+
148
+ exports.VoiceSessionControls = VoiceSessionControls;
@@ -66,7 +66,11 @@ var ListItem = _react.forwardRef.call(void 0, function ListItem2({ className, la
66
66
  radius === "md" && "rounded-md",
67
67
  accent === "success" && "border-l-2 border-emerald-500 bg-emerald-500/5",
68
68
  accent === "destructive" && "border-l-2 border-red-500 bg-red-500/5",
69
- layout === "bullet" && "group flex min-h-8 items-start gap-3 pointer-coarse:min-h-[max(44px,2.75rem)]",
69
+ layout === "bullet" && "group flex items-start gap-3",
70
+ // A row with controls is as tall as they are, and a touch target on a
71
+ // touchscreen; a read-only row is just its text, so a brief's lists don't
72
+ // stand 44px apart on a phone.
73
+ layout === "bullet" && actions && "min-h-8 pointer-coarse:min-h-[max(44px,2.75rem)]",
70
74
  className
71
75
  ), ...props, children: layout === "bullet" ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
72
76
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkW5I4FN7Gcjs.SentimentDot, { sentiment, className: "mt-[5px] shrink-0" }),
@@ -66,7 +66,11 @@ var ListItem = forwardRef(function ListItem2({ className, layout = "plain", sent
66
66
  radius === "md" && "rounded-md",
67
67
  accent === "success" && "border-l-2 border-emerald-500 bg-emerald-500/5",
68
68
  accent === "destructive" && "border-l-2 border-red-500 bg-red-500/5",
69
- layout === "bullet" && "group flex min-h-8 items-start gap-3 pointer-coarse:min-h-[max(44px,2.75rem)]",
69
+ layout === "bullet" && "group flex items-start gap-3",
70
+ // A row with controls is as tall as they are, and a touch target on a
71
+ // touchscreen; a read-only row is just its text, so a brief's lists don't
72
+ // stand 44px apart on a phone.
73
+ layout === "bullet" && actions && "min-h-8 pointer-coarse:min-h-[max(44px,2.75rem)]",
70
74
  className
71
75
  ), ...props, children: layout === "bullet" ? /* @__PURE__ */ jsxs(Fragment, { children: [
72
76
  /* @__PURE__ */ jsx(SentimentDot, { sentiment, className: "mt-[5px] shrink-0" }),
@@ -0,0 +1,148 @@
1
+ "use client";
2
+ import {
3
+ AgentAudioVisualizerBar
4
+ } from "./chunk-5OF6D3GH.js";
5
+ import {
6
+ Button
7
+ } from "./chunk-W326GKML.js";
8
+ import {
9
+ cn
10
+ } from "./chunk-G6SRSWXB.js";
11
+
12
+ // src/primitives/voice-session-controls.tsx
13
+ import { useSyncExternalStore } from "react";
14
+ import { Mic, MicOff, Square, AudioLines } from "lucide-react";
15
+ import { jsx, jsxs } from "react/jsx-runtime";
16
+ var SILENCE = [];
17
+ var silence = () => SILENCE;
18
+ var noSubscription = () => () => {
19
+ };
20
+ var DEFAULT_LABELS = {
21
+ disconnected: "Voice chat",
22
+ connecting: "Connecting\u2026",
23
+ listening: "Listening\u2026",
24
+ thinking: "Thinking\u2026",
25
+ speaking: "Speaking",
26
+ reconnecting: "Reconnecting\u2026",
27
+ error: "Voice chat unavailable",
28
+ start: "Start voice chat",
29
+ end: "End voice chat",
30
+ mute: "Mute microphone",
31
+ unmute: "Unmute microphone",
32
+ muted: "Microphone muted",
33
+ retry: "Retry voice chat",
34
+ endShort: "End voice",
35
+ muteShort: "Mute",
36
+ unmuteShort: "Unmute"
37
+ };
38
+ function VoiceSessionControls({
39
+ state,
40
+ onStart,
41
+ onEnd,
42
+ muted = false,
43
+ onMutedChange,
44
+ disabled = false,
45
+ error,
46
+ volumeBands,
47
+ audioLevels,
48
+ labels,
49
+ onWarm,
50
+ size = "icon",
51
+ className
52
+ }) {
53
+ const liveBands = useSyncExternalStore(audioLevels?.subscribe ?? noSubscription, audioLevels?.getSnapshot ?? silence, silence);
54
+ const copy = { ...DEFAULT_LABELS, ...labels };
55
+ const active = state !== "disconnected" && state !== "error";
56
+ const waiting = state === "connecting" || state === "reconnecting";
57
+ return /* @__PURE__ */ jsxs(
58
+ "div",
59
+ {
60
+ "data-slot": "voice-session-controls",
61
+ "data-state": state,
62
+ className: cn("min-w-0", active ? "@container/voice w-full" : "flex flex-wrap items-center gap-2", className),
63
+ children: [
64
+ active ? (
65
+ // One row at every width: on a narrow strip the actions show only their
66
+ // icons (each keeps its full name), rather than wrapping onto a second row.
67
+ /* @__PURE__ */ jsxs("div", { "data-slot": "voice-session-strip", className: "flex w-full flex-nowrap items-center gap-3 bg-primary/5 p-3 @sm/voice:gap-4 @sm/voice:p-4 @2xl/voice:px-5", children: [
68
+ /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 items-center gap-3 @2xl/voice:gap-4", children: [
69
+ /* @__PURE__ */ jsx("div", { "aria-hidden": "true", className: cn(
70
+ "flex size-10 shrink-0 items-center justify-center rounded-full ring-8 ring-primary/5 @sm/voice:size-12 @md/voice:size-14",
71
+ muted ? "bg-muted text-muted-foreground" : "bg-primary text-primary-foreground"
72
+ ), children: muted ? /* @__PURE__ */ jsx(MicOff, { className: "size-5" }) : /* @__PURE__ */ jsx(Mic, { className: "size-5" }) }),
73
+ /* @__PURE__ */ jsx(
74
+ AgentAudioVisualizerBar,
75
+ {
76
+ "aria-hidden": "true",
77
+ size: "sm",
78
+ barCount: 5,
79
+ className: "shrink-0 text-primary [&>div]:w-1",
80
+ state: muted && state === "listening" ? "disconnected" : state === "reconnecting" ? "connecting" : state,
81
+ volumeBands: muted && state === "listening" ? SILENCE : volumeBands ?? liveBands
82
+ }
83
+ ),
84
+ /* @__PURE__ */ jsx("span", { role: "status", className: "min-w-0 flex-1 truncate text-sm font-medium text-primary", children: muted && state === "listening" ? copy.muted : copy[state] })
85
+ ] }),
86
+ /* @__PURE__ */ jsxs("div", { className: "ml-auto flex shrink-0 items-center gap-2", children: [
87
+ /* @__PURE__ */ jsxs(
88
+ Button,
89
+ {
90
+ type: "button",
91
+ variant: "outline",
92
+ size: "sm",
93
+ className: "min-h-[44px] min-w-[44px] shrink-0 rounded-xl bg-background px-0 text-foreground @md/voice:px-3",
94
+ "aria-label": muted ? copy.unmute : copy.mute,
95
+ title: muted ? copy.unmute : copy.mute,
96
+ "aria-pressed": muted,
97
+ disabled: waiting,
98
+ onClick: () => onMutedChange(!muted),
99
+ children: [
100
+ muted ? /* @__PURE__ */ jsx(Mic, { "aria-hidden": "true" }) : /* @__PURE__ */ jsx(MicOff, { "aria-hidden": "true" }),
101
+ /* @__PURE__ */ jsx("span", { "data-slot": "voice-session-action-label", className: "hidden @md/voice:inline", children: muted ? copy.unmuteShort : copy.muteShort })
102
+ ]
103
+ }
104
+ ),
105
+ /* @__PURE__ */ jsxs(
106
+ Button,
107
+ {
108
+ type: "button",
109
+ variant: "outline",
110
+ size: "sm",
111
+ className: "min-h-[44px] min-w-[44px] shrink-0 rounded-xl bg-background px-0 text-foreground @md/voice:px-3",
112
+ "aria-label": copy.end,
113
+ title: copy.end,
114
+ onClick: onEnd,
115
+ children: [
116
+ /* @__PURE__ */ jsx(Square, { "aria-hidden": "true", className: "fill-current" }),
117
+ /* @__PURE__ */ jsx("span", { "data-slot": "voice-session-action-label", className: "hidden @md/voice:inline", children: copy.endShort })
118
+ ]
119
+ }
120
+ )
121
+ ] })
122
+ ] })
123
+ ) : /* @__PURE__ */ jsx(
124
+ Button,
125
+ {
126
+ type: "button",
127
+ size: "icon",
128
+ shape: "circle",
129
+ disabled,
130
+ onClick: onStart,
131
+ onPointerEnter: onWarm,
132
+ onPointerDown: onWarm,
133
+ onFocus: onWarm,
134
+ "aria-label": state === "error" ? copy.retry : copy.start,
135
+ title: state === "error" ? copy.retry : copy.start,
136
+ className: cn("min-h-[44px] min-w-[44px] shrink-0 rounded-full", size === "hero" && "size-24 [&_svg]:size-7"),
137
+ children: /* @__PURE__ */ jsx(AudioLines, { "aria-hidden": "true" })
138
+ }
139
+ ),
140
+ state === "error" && /* @__PURE__ */ jsx("span", { role: "alert", className: "basis-full text-xs text-destructive", children: error || copy.error })
141
+ ]
142
+ }
143
+ );
144
+ }
145
+
146
+ export {
147
+ VoiceSessionControls
148
+ };
@@ -11,10 +11,10 @@ import { AgentVisualizerState } from '../hooks/use-agent-audio-visualizer-bar.cj
11
11
  */
12
12
  declare function normalizeVolumeBands(bands: number[], count: number): number[];
13
13
  declare const AgentAudioVisualizerBarElementVariants: (props?: ({
14
- size?: "icon" | "md" | "sm" | "lg" | "xl" | null | undefined;
14
+ size?: "sm" | "md" | "lg" | "xl" | "icon" | null | undefined;
15
15
  } & class_variance_authority_types.ClassProp) | undefined) => string;
16
16
  declare const AgentAudioVisualizerBarVariants: (props?: ({
17
- size?: "icon" | "md" | "sm" | "lg" | "xl" | null | undefined;
17
+ size?: "sm" | "md" | "lg" | "xl" | "icon" | null | undefined;
18
18
  } & class_variance_authority_types.ClassProp) | undefined) => string;
19
19
  /**
20
20
  * Props for the AgentAudioVisualizerBar component.
@@ -11,10 +11,10 @@ import { AgentVisualizerState } from '../hooks/use-agent-audio-visualizer-bar.js
11
11
  */
12
12
  declare function normalizeVolumeBands(bands: number[], count: number): number[];
13
13
  declare const AgentAudioVisualizerBarElementVariants: (props?: ({
14
- size?: "icon" | "md" | "sm" | "lg" | "xl" | null | undefined;
14
+ size?: "sm" | "md" | "lg" | "xl" | "icon" | null | undefined;
15
15
  } & class_variance_authority_types.ClassProp) | undefined) => string;
16
16
  declare const AgentAudioVisualizerBarVariants: (props?: ({
17
- size?: "icon" | "md" | "sm" | "lg" | "xl" | null | undefined;
17
+ size?: "sm" | "md" | "lg" | "xl" | "icon" | null | undefined;
18
18
  } & class_variance_authority_types.ClassProp) | undefined) => string;
19
19
  /**
20
20
  * Props for the AgentAudioVisualizerBar component.
@@ -4,7 +4,7 @@ import * as class_variance_authority_types from 'class-variance-authority/types'
4
4
  import { VariantProps } from 'class-variance-authority';
5
5
 
6
6
  declare const alertVariants: (props?: ({
7
- variant?: "success" | "default" | "destructive" | "warning" | null | undefined;
7
+ variant?: "default" | "destructive" | "success" | "warning" | null | undefined;
8
8
  } & class_variance_authority_types.ClassProp) | undefined) => string;
9
9
  interface AlertProps extends HTMLAttributes<HTMLDivElement>, VariantProps<typeof alertVariants> {
10
10
  marginBottom?: "none" | "md";
@@ -4,7 +4,7 @@ import * as class_variance_authority_types from 'class-variance-authority/types'
4
4
  import { VariantProps } from 'class-variance-authority';
5
5
 
6
6
  declare const alertVariants: (props?: ({
7
- variant?: "success" | "default" | "destructive" | "warning" | null | undefined;
7
+ variant?: "default" | "destructive" | "success" | "warning" | null | undefined;
8
8
  } & class_variance_authority_types.ClassProp) | undefined) => string;
9
9
  interface AlertProps extends HTMLAttributes<HTMLDivElement>, VariantProps<typeof alertVariants> {
10
10
  marginBottom?: "none" | "md";
@@ -12,7 +12,7 @@ declare function Attachment({ className, state, size, orientation, ...props }: R
12
12
  state?: "idle" | "uploading" | "processing" | "error" | "done";
13
13
  }): react_jsx_runtime.JSX.Element;
14
14
  declare const attachmentMediaVariants: (props?: ({
15
- variant?: "icon" | "image" | null | undefined;
15
+ variant?: "image" | "icon" | null | undefined;
16
16
  } & class_variance_authority_types.ClassProp) | undefined) => string;
17
17
  declare function AttachmentMedia({ className, variant, ...props }: React.ComponentProps<"div"> & VariantProps<typeof attachmentMediaVariants>): react_jsx_runtime.JSX.Element;
18
18
  declare function AttachmentContent({ className, ...props }: React.ComponentProps<"div">): react_jsx_runtime.JSX.Element;
@@ -12,7 +12,7 @@ declare function Attachment({ className, state, size, orientation, ...props }: R
12
12
  state?: "idle" | "uploading" | "processing" | "error" | "done";
13
13
  }): react_jsx_runtime.JSX.Element;
14
14
  declare const attachmentMediaVariants: (props?: ({
15
- variant?: "icon" | "image" | null | undefined;
15
+ variant?: "image" | "icon" | null | undefined;
16
16
  } & class_variance_authority_types.ClassProp) | undefined) => string;
17
17
  declare function AttachmentMedia({ className, variant, ...props }: React.ComponentProps<"div"> & VariantProps<typeof attachmentMediaVariants>): react_jsx_runtime.JSX.Element;
18
18
  declare function AttachmentContent({ className, ...props }: React.ComponentProps<"div">): react_jsx_runtime.JSX.Element;
@@ -4,7 +4,7 @@ import { VariantProps } from 'class-variance-authority';
4
4
  import { ElementType } from 'react';
5
5
 
6
6
  declare const badgeVariants: (props?: ({
7
- variant?: "error" | "success" | "default" | "secondary" | "destructive" | "outline" | "warning" | "info" | "neutral" | null | undefined;
7
+ variant?: "default" | "secondary" | "destructive" | "outline" | "success" | "warning" | "error" | "info" | "neutral" | null | undefined;
8
8
  } & class_variance_authority_types.ClassProp) | undefined) => string;
9
9
  interface BadgeProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof badgeVariants> {
10
10
  weight?: "normal" | "semibold" | "bold";
@@ -4,7 +4,7 @@ import { VariantProps } from 'class-variance-authority';
4
4
  import { ElementType } from 'react';
5
5
 
6
6
  declare const badgeVariants: (props?: ({
7
- variant?: "error" | "success" | "default" | "secondary" | "destructive" | "outline" | "warning" | "info" | "neutral" | null | undefined;
7
+ variant?: "default" | "secondary" | "destructive" | "outline" | "success" | "warning" | "error" | "info" | "neutral" | null | undefined;
8
8
  } & class_variance_authority_types.ClassProp) | undefined) => string;
9
9
  interface BadgeProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof badgeVariants> {
10
10
  weight?: "normal" | "semibold" | "bold";
@@ -5,7 +5,7 @@ import { VariantProps } from 'class-variance-authority';
5
5
 
6
6
  declare function BubbleGroup({ className, ...props }: React.ComponentProps<"div">): react_jsx_runtime.JSX.Element;
7
7
  declare const bubbleVariants: (props?: ({
8
- variant?: "muted" | "default" | "secondary" | "destructive" | "outline" | "ghost" | "tinted" | null | undefined;
8
+ variant?: "default" | "muted" | "secondary" | "destructive" | "outline" | "ghost" | "tinted" | null | undefined;
9
9
  } & class_variance_authority_types.ClassProp) | undefined) => string;
10
10
  declare function Bubble({ variant, align, className, ...props }: React.ComponentProps<"div"> & VariantProps<typeof bubbleVariants> & {
11
11
  align?: "start" | "end";
@@ -5,7 +5,7 @@ import { VariantProps } from 'class-variance-authority';
5
5
 
6
6
  declare function BubbleGroup({ className, ...props }: React.ComponentProps<"div">): react_jsx_runtime.JSX.Element;
7
7
  declare const bubbleVariants: (props?: ({
8
- variant?: "muted" | "default" | "secondary" | "destructive" | "outline" | "ghost" | "tinted" | null | undefined;
8
+ variant?: "default" | "muted" | "secondary" | "destructive" | "outline" | "ghost" | "tinted" | null | undefined;
9
9
  } & class_variance_authority_types.ClassProp) | undefined) => string;
10
10
  declare function Bubble({ variant, align, className, ...props }: React.ComponentProps<"div"> & VariantProps<typeof bubbleVariants> & {
11
11
  align?: "start" | "end";
@@ -5,12 +5,12 @@ import { VariantProps } from 'class-variance-authority';
5
5
 
6
6
  declare const buttonVariants: (props?: ({
7
7
  variant?: "link" | "default" | "secondary" | "destructive" | "outline" | "outline-muted" | "ghost" | "quiet" | "ghost-destructive" | "link-muted" | "inverted" | "status-error" | "status-warning" | "status-muted" | null | undefined;
8
- size?: "filter" | "status" | "icon" | "toolbar" | "sm" | "lg" | "default" | "micro" | "compact" | "hero" | "icon-lg" | "icon-sm" | "icon-md" | "icon-xs" | "icon-compact" | "icon-micro" | "bare" | "voice-sm" | "voice" | "suggestion" | "tone" | null | undefined;
8
+ size?: "filter" | "status" | "toolbar" | "sm" | "lg" | "default" | "micro" | "compact" | "hero" | "icon" | "icon-lg" | "icon-sm" | "icon-md" | "icon-xs" | "icon-compact" | "icon-micro" | "bare" | "voice-sm" | "voice" | "suggestion" | "tone" | null | undefined;
9
9
  width?: "auto" | "full" | "responsive" | null | undefined;
10
10
  align?: "center" | "start" | null | undefined;
11
11
  shrink?: boolean | null | undefined;
12
12
  shape?: "circle" | "default" | "pill" | null | undefined;
13
- ring?: "surface" | "none" | null | undefined;
13
+ ring?: "none" | "surface" | null | undefined;
14
14
  grow?: boolean | null | undefined;
15
15
  minWidth?: "auto" | "zero" | null | undefined;
16
16
  textAlign?: "center" | "start" | null | undefined;
@@ -5,12 +5,12 @@ import { VariantProps } from 'class-variance-authority';
5
5
 
6
6
  declare const buttonVariants: (props?: ({
7
7
  variant?: "link" | "default" | "secondary" | "destructive" | "outline" | "outline-muted" | "ghost" | "quiet" | "ghost-destructive" | "link-muted" | "inverted" | "status-error" | "status-warning" | "status-muted" | null | undefined;
8
- size?: "filter" | "status" | "icon" | "toolbar" | "sm" | "lg" | "default" | "micro" | "compact" | "hero" | "icon-lg" | "icon-sm" | "icon-md" | "icon-xs" | "icon-compact" | "icon-micro" | "bare" | "voice-sm" | "voice" | "suggestion" | "tone" | null | undefined;
8
+ size?: "filter" | "status" | "toolbar" | "sm" | "lg" | "default" | "micro" | "compact" | "hero" | "icon" | "icon-lg" | "icon-sm" | "icon-md" | "icon-xs" | "icon-compact" | "icon-micro" | "bare" | "voice-sm" | "voice" | "suggestion" | "tone" | null | undefined;
9
9
  width?: "auto" | "full" | "responsive" | null | undefined;
10
10
  align?: "center" | "start" | null | undefined;
11
11
  shrink?: boolean | null | undefined;
12
12
  shape?: "circle" | "default" | "pill" | null | undefined;
13
- ring?: "surface" | "none" | null | undefined;
13
+ ring?: "none" | "surface" | null | undefined;
14
14
  grow?: boolean | null | undefined;
15
15
  minWidth?: "auto" | "zero" | null | undefined;
16
16
  textAlign?: "center" | "start" | null | undefined;
@@ -10,7 +10,7 @@ var _chunk2BTDBZYNcjs = require('../chunk-2BTDBZYN.cjs');
10
10
  var _chunkPH2TV7XIcjs = require('../chunk-PH2TV7XI.cjs');
11
11
 
12
12
 
13
- var _chunkYMI3X2YLcjs = require('../chunk-YMI3X2YL.cjs');
13
+ var _chunkHETZNLKTcjs = require('../chunk-HETZNLKT.cjs');
14
14
 
15
15
 
16
16
 
@@ -489,7 +489,7 @@ function ChatInput({
489
489
  children: header
490
490
  }
491
491
  ),
492
- liveVoiceActive && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk7LDJAXRXcjs.InputGroupAddon, { align: "block-start", className: "w-full cursor-default border-b border-border p-0 [.border-b]:pb-0", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkYMI3X2YLcjs.VoiceSessionControls, { ...voiceSession }) }),
492
+ liveVoiceActive && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk7LDJAXRXcjs.InputGroupAddon, { align: "block-start", className: "w-full cursor-default border-b border-border p-0 [.border-b]:pb-0", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkHETZNLKTcjs.VoiceSessionControls, { ...voiceSession }) }),
493
493
  attachments.length > 0 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
494
494
  ChatAttachmentList,
495
495
  {
@@ -520,7 +520,9 @@ function ChatInput({
520
520
  // Grows with the text, then scrolls rather than pushing the thread away.
521
521
  "leading-relaxed disabled:opacity-70 placeholder:text-sm",
522
522
  !compact && "max-h-48",
523
- compact ? "px-4 py-2" : spacious ? "px-6 pb-2 pt-6" : "px-4 py-3.5"
523
+ // Compact: in from the rounded corner, the text starting where the + icon below it does
524
+ // (22px in at any root size: the bar's 0.5rem padding plus half of 44px less the 1rem icon).
525
+ compact ? "pb-1 pl-[22px] pr-4 pt-3.5" : spacious ? "px-6 pb-2 pt-6" : "px-4 py-3.5"
524
526
  )
525
527
  }
526
528
  ),
@@ -579,7 +581,7 @@ function ChatInput({
579
581
  )
580
582
  }
581
583
  ),
582
- voiceSession && !liveVoiceActive && !hasText && attachments.length === 0 ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkYMI3X2YLcjs.VoiceSessionControls, { ...voiceSession, disabled: voiceSession.disabled || isDisabled }) : submitLabel ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
584
+ voiceSession && !liveVoiceActive && !hasText && attachments.length === 0 ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkHETZNLKTcjs.VoiceSessionControls, { ...voiceSession, disabled: voiceSession.disabled || isDisabled }) : submitLabel ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
583
585
  _chunkJDEXZGIYcjs.Button,
584
586
  {
585
587
  type: "submit",
@@ -641,7 +643,7 @@ function VoiceHero({
641
643
  }) {
642
644
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col items-center gap-5 py-6", children: [
643
645
  voiceSession ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
644
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkYMI3X2YLcjs.VoiceSessionControls, { ...voiceSession, size: "hero" }),
646
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkHETZNLKTcjs.VoiceSessionControls, { ...voiceSession, size: "hero" }),
645
647
  voice && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
646
648
  _chunkPH2TV7XIcjs.VoiceDictationButton,
647
649
  {
@@ -10,7 +10,7 @@ import {
10
10
  } from "../chunk-ZGTPNSR7.js";
11
11
  import {
12
12
  VoiceSessionControls
13
- } from "../chunk-KF4X37DP.js";
13
+ } from "../chunk-PL2462GA.js";
14
14
  import {
15
15
  Suggestion,
16
16
  Suggestions
@@ -520,7 +520,9 @@ function ChatInput({
520
520
  // Grows with the text, then scrolls rather than pushing the thread away.
521
521
  "leading-relaxed disabled:opacity-70 placeholder:text-sm",
522
522
  !compact && "max-h-48",
523
- compact ? "px-4 py-2" : spacious ? "px-6 pb-2 pt-6" : "px-4 py-3.5"
523
+ // Compact: in from the rounded corner, the text starting where the + icon below it does
524
+ // (22px in at any root size: the bar's 0.5rem padding plus half of 44px less the 1rem icon).
525
+ compact ? "pb-1 pl-[22px] pr-4 pt-3.5" : spacious ? "px-6 pb-2 pt-6" : "px-4 py-3.5"
524
526
  )
525
527
  }
526
528
  ),
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- var _chunkWE3F6EUMcjs = require('../chunk-WE3F6EUM.cjs');
5
+ var _chunkKLBMHQ6Ucjs = require('../chunk-KLBMHQ6U.cjs');
6
6
  require('../chunk-W5I4FN7G.cjs');
7
7
 
8
8
 
@@ -51,29 +51,32 @@ function EditableList({
51
51
  };
52
52
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "section", { className: _chunkKWLSBTB2cjs.cn.call(void 0, "border-t border-border pt-4", className), children: [
53
53
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk373W6VADcjs.Text, { as: "span", variant: "caption", className: "text-xs font-medium uppercase tracking-wider", children: label }),
54
- items.length === 0 ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk373W6VADcjs.Text, { variant: "caption", className: "mt-3 italic", children: emptyText }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkWE3F6EUMcjs.List, { spacing: "normal", className: "mt-3", children: items.map((item, index) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkWE3F6EUMcjs.ListItem, { layout: "bullet", sentiment, actions: !readOnly && (_optionalChain([editing, 'optionalAccess', _5 => _5.index]) === index ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
55
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkJDEXZGIYcjs.Button, { type: "button", variant: "ghost", size: "icon-sm", shrink: true, className: "text-emerald-600", "aria-label": `Save ${itemName}`, onClick: commitEdit, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.Check, { className: "h-4 w-4" }) }),
56
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkJDEXZGIYcjs.Button, { type: "button", variant: "quiet", size: "icon-sm", shrink: true, marginEnd: "negative-xs", "aria-label": `Cancel editing ${itemName}`, onClick: () => setEditing(null), children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.X, { className: "h-4 w-4" }) })
57
- ] }) : /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
58
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkJDEXZGIYcjs.Button, { type: "button", variant: "ghost", size: "icon", className: "h-8 w-8 shrink-0 text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100 focus:opacity-100", "aria-label": `Edit ${itemName}`, onClick: () => setEditing({ index, value: item }), children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.Pencil, { className: "h-4 w-4" }) }),
59
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkJDEXZGIYcjs.Button, { type: "button", variant: "ghost", size: "icon", className: "-mr-1 h-8 w-8 shrink-0 text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100 focus:opacity-100", "aria-label": `Remove ${itemName}`, onClick: () => onChange(items.filter((_, itemIndex) => itemIndex !== index)), children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.X, { className: "h-4 w-4" }) })
60
- ] })), children: !readOnly && _optionalChain([editing, 'optionalAccess', _6 => _6.index]) === index ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
61
- _chunkPQUSJEXLcjs.Input,
62
- {
63
- autoFocus: true,
64
- value: editing.value,
65
- "aria-label": `Edit ${itemName}`,
66
- onChange: (event) => setEditing({ index, value: event.target.value }),
67
- onKeyDown: (event) => {
68
- if (event.key === "Enter") {
69
- event.preventDefault();
70
- commitEdit();
71
- }
72
- if (event.key === "Escape") setEditing(null);
73
- },
74
- grow: true
75
- }
76
- ) : item }, `${item}-${index}`)) }),
54
+ items.length === 0 ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk373W6VADcjs.Text, { variant: "caption", className: "mt-3 italic", children: emptyText }) : (
55
+ // Read-only rows are just text, about 1.8em apart; editable rows keep room for their controls.
56
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkKLBMHQ6Ucjs.List, { spacing: readOnly ? "tight" : "normal", className: "mt-3", children: items.map((item, index) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkKLBMHQ6Ucjs.ListItem, { layout: "bullet", sentiment, actions: !readOnly && (_optionalChain([editing, 'optionalAccess', _5 => _5.index]) === index ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
57
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkJDEXZGIYcjs.Button, { type: "button", variant: "ghost", size: "icon-sm", shrink: true, className: "text-emerald-600", "aria-label": `Save ${itemName}`, onClick: commitEdit, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.Check, { className: "h-4 w-4" }) }),
58
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkJDEXZGIYcjs.Button, { type: "button", variant: "quiet", size: "icon-sm", shrink: true, marginEnd: "negative-xs", "aria-label": `Cancel editing ${itemName}`, onClick: () => setEditing(null), children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.X, { className: "h-4 w-4" }) })
59
+ ] }) : /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
60
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkJDEXZGIYcjs.Button, { type: "button", variant: "ghost", size: "icon", className: "h-8 w-8 shrink-0 text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100 focus:opacity-100", "aria-label": `Edit ${itemName}`, onClick: () => setEditing({ index, value: item }), children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.Pencil, { className: "h-4 w-4" }) }),
61
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkJDEXZGIYcjs.Button, { type: "button", variant: "ghost", size: "icon", className: "-mr-1 h-8 w-8 shrink-0 text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100 focus:opacity-100", "aria-label": `Remove ${itemName}`, onClick: () => onChange(items.filter((_, itemIndex) => itemIndex !== index)), children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.X, { className: "h-4 w-4" }) })
62
+ ] })), children: !readOnly && _optionalChain([editing, 'optionalAccess', _6 => _6.index]) === index ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
63
+ _chunkPQUSJEXLcjs.Input,
64
+ {
65
+ autoFocus: true,
66
+ value: editing.value,
67
+ "aria-label": `Edit ${itemName}`,
68
+ onChange: (event) => setEditing({ index, value: event.target.value }),
69
+ onKeyDown: (event) => {
70
+ if (event.key === "Enter") {
71
+ event.preventDefault();
72
+ commitEdit();
73
+ }
74
+ if (event.key === "Escape") setEditing(null);
75
+ },
76
+ grow: true
77
+ }
78
+ ) : item }, `${item}-${index}`)) })
79
+ ),
77
80
  !readOnly && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "mt-3 flex items-center gap-2", children: [
78
81
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
79
82
  _chunkPQUSJEXLcjs.Input,