@epicbagel/saas-kit 1.4.0 → 1.6.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 (130) hide show
  1. package/README.md +57 -0
  2. package/dist/{chunk-GFG2R5BZ.js → chunk-2V7AVB2U.js} +1 -1
  3. package/dist/{chunk-LI5EOSQG.js → chunk-43UMPZWD.js} +1 -1
  4. package/dist/{chunk-XABXUP6L.cjs → chunk-5VMKDVB6.cjs} +2 -2
  5. package/dist/{chunk-QNZYQLNP.js → chunk-6S6GD43V.js} +1 -1
  6. package/dist/{chunk-WQJKUKBL.cjs → chunk-6YXKFVZU.cjs} +4 -4
  7. package/dist/{chunk-RIWLAMME.cjs → chunk-7LDJAXRX.cjs} +2 -2
  8. package/dist/{chunk-FNDBM67K.cjs → chunk-7YCKII7G.cjs} +2 -2
  9. package/dist/{chunk-2TKLS73N.js → chunk-C3VZMTVB.js} +1 -1
  10. package/dist/{chunk-G54TQV2R.cjs → chunk-CLYAASFN.cjs} +2 -2
  11. package/dist/{chunk-SGW4FWBX.cjs → chunk-CRTH5GJ5.cjs} +13 -13
  12. package/dist/{chunk-EZCKWTH7.js → chunk-CYDICVH2.js} +1 -1
  13. package/dist/{chunk-J3GQXM37.js → chunk-EEHIMPD7.js} +1 -1
  14. package/dist/{chunk-4NN7EA3W.js → chunk-ET4THLFX.js} +1 -1
  15. package/dist/{chunk-PNWNU6JW.cjs → chunk-EUFV25KL.cjs} +4 -4
  16. package/dist/{chunk-HHV4G77I.js → chunk-F3B4M6DU.js} +1 -1
  17. package/dist/{chunk-32Q4XOTU.cjs → chunk-FYRQFEU4.cjs} +2 -2
  18. package/dist/{chunk-VLXPLKFR.cjs → chunk-GTVSRRE3.cjs} +2 -2
  19. package/dist/{chunk-RRRD5EUI.js → chunk-H2CCBRVG.js} +1 -1
  20. package/dist/{chunk-JZOBIPFC.js → chunk-H4XH2PPU.js} +61 -2
  21. package/dist/{chunk-M7FYGAGO.js → chunk-HBRVOGLA.js} +1 -1
  22. package/dist/{chunk-NW3OWKBN.js → chunk-HREEZUKL.js} +1 -1
  23. package/dist/{chunk-THWIJG5C.js → chunk-IJG2B3Y2.js} +1 -1
  24. package/dist/{chunk-L4DH72UF.cjs → chunk-JDEXZGIY.cjs} +2 -1
  25. package/dist/{chunk-HRLP4BHJ.js → chunk-JN6JOSZG.js} +4 -4
  26. package/dist/{chunk-NE3ZVJ6G.cjs → chunk-KM5FHCXU.cjs} +8 -8
  27. package/dist/{chunk-MLHNYRFX.js → chunk-KNKV25WS.js} +2 -2
  28. package/dist/{chunk-23UMHZ4S.cjs → chunk-LIUYHYFN.cjs} +3 -3
  29. package/dist/{chunk-EOUO3ORO.cjs → chunk-LKPM6DQP.cjs} +3 -3
  30. package/dist/{chunk-SUB4BAYE.cjs → chunk-M4V7OJNF.cjs} +2 -2
  31. package/dist/{chunk-VKIGJNJR.cjs → chunk-MU4F3DSW.cjs} +2 -2
  32. package/dist/{chunk-2AU7ZRGX.cjs → chunk-NWDPH2Z7.cjs} +61 -2
  33. package/dist/{chunk-MHYAVXOE.js → chunk-QTPPNK6F.js} +1 -1
  34. package/dist/{chunk-IH3COANJ.cjs → chunk-QTWJQQDH.cjs} +12 -12
  35. package/dist/chunk-QZBPZLAB.js +24 -0
  36. package/dist/{chunk-HAC32ALJ.js → chunk-TI57GAQP.js} +1 -1
  37. package/dist/{chunk-GRY77463.cjs → chunk-TP74SBRH.cjs} +3 -3
  38. package/dist/chunk-VMXKT67E.cjs +24 -0
  39. package/dist/{chunk-R5L4CM6V.cjs → chunk-VOTCYG3F.cjs} +4 -4
  40. package/dist/{chunk-HQRWRRZJ.js → chunk-W326GKML.js} +2 -1
  41. package/dist/{chunk-HYSWE75T.js → chunk-WL73DFE3.js} +1 -1
  42. package/dist/{chunk-KADJ56AH.cjs → chunk-Z3JJSNR5.cjs} +2 -2
  43. package/dist/{chunk-FLPYZNWZ.js → chunk-ZLU32SRP.js} +1 -1
  44. package/dist/primitives/activity-feed.cjs +3 -3
  45. package/dist/primitives/activity-feed.js +2 -2
  46. package/dist/primitives/activity-log.cjs +3 -3
  47. package/dist/primitives/activity-log.js +2 -2
  48. package/dist/primitives/alert-dialog.cjs +3 -3
  49. package/dist/primitives/alert-dialog.js +2 -2
  50. package/dist/primitives/alert.d.cts +1 -1
  51. package/dist/primitives/alert.d.ts +1 -1
  52. package/dist/primitives/archive-confirmation-dialog.cjs +4 -4
  53. package/dist/primitives/archive-confirmation-dialog.js +3 -3
  54. package/dist/primitives/attachment.cjs +3 -3
  55. package/dist/primitives/attachment.js +2 -2
  56. package/dist/primitives/badge.d.cts +1 -1
  57. package/dist/primitives/badge.d.ts +1 -1
  58. package/dist/primitives/board-view.cjs +7 -7
  59. package/dist/primitives/board-view.js +6 -6
  60. package/dist/primitives/bubble.d.cts +1 -1
  61. package/dist/primitives/bubble.d.ts +1 -1
  62. package/dist/primitives/button.cjs +2 -2
  63. package/dist/primitives/button.d.cts +3 -3
  64. package/dist/primitives/button.d.ts +3 -3
  65. package/dist/primitives/button.js +1 -1
  66. package/dist/primitives/calendar.cjs +3 -3
  67. package/dist/primitives/calendar.js +2 -2
  68. package/dist/primitives/chat.cjs +144 -64
  69. package/dist/primitives/chat.d.cts +59 -3
  70. package/dist/primitives/chat.d.ts +59 -3
  71. package/dist/primitives/chat.js +104 -24
  72. package/dist/primitives/code-block.cjs +4 -4
  73. package/dist/primitives/code-block.js +3 -3
  74. package/dist/primitives/confirm-bar.cjs +3 -3
  75. package/dist/primitives/confirm-bar.js +1 -1
  76. package/dist/primitives/connection-status-bar.cjs +4 -4
  77. package/dist/primitives/connection-status-bar.js +1 -1
  78. package/dist/primitives/connection.cjs +13 -13
  79. package/dist/primitives/connection.js +3 -3
  80. package/dist/primitives/copy-button.cjs +3 -3
  81. package/dist/primitives/copy-button.js +2 -2
  82. package/dist/primitives/decision-actions.cjs +2 -2
  83. package/dist/primitives/decision-actions.js +1 -1
  84. package/dist/primitives/delete-confirmation-dialog.cjs +4 -4
  85. package/dist/primitives/delete-confirmation-dialog.js +3 -3
  86. package/dist/primitives/document-preview.cjs +4 -4
  87. package/dist/primitives/document-preview.js +2 -2
  88. package/dist/primitives/editable-list.cjs +6 -6
  89. package/dist/primitives/editable-list.js +1 -1
  90. package/dist/primitives/empty-state.cjs +3 -3
  91. package/dist/primitives/empty-state.js +2 -2
  92. package/dist/primitives/file-dropzone.cjs +3 -3
  93. package/dist/primitives/file-dropzone.js +2 -2
  94. package/dist/primitives/file-preview-internals.cjs +3 -3
  95. package/dist/primitives/file-preview-internals.js +2 -2
  96. package/dist/primitives/file-preview.cjs +15 -15
  97. package/dist/primitives/file-preview.js +4 -4
  98. package/dist/primitives/filter-bar.cjs +4 -4
  99. package/dist/primitives/filter-bar.js +3 -3
  100. package/dist/primitives/input-group.cjs +3 -3
  101. package/dist/primitives/input-group.js +2 -2
  102. package/dist/primitives/load-more-button.cjs +3 -3
  103. package/dist/primitives/load-more-button.js +2 -2
  104. package/dist/primitives/message-scroller.cjs +3 -3
  105. package/dist/primitives/message-scroller.js +2 -2
  106. package/dist/primitives/message.cjs +8 -2
  107. package/dist/primitives/message.d.cts +35 -1
  108. package/dist/primitives/message.d.ts +35 -1
  109. package/dist/primitives/message.js +7 -1
  110. package/dist/primitives/page-header-actions.cjs +3 -3
  111. package/dist/primitives/page-header-actions.js +2 -2
  112. package/dist/primitives/quick-filters.cjs +3 -3
  113. package/dist/primitives/quick-filters.js +2 -2
  114. package/dist/primitives/resource-list.cjs +7 -7
  115. package/dist/primitives/resource-list.js +6 -6
  116. package/dist/primitives/search-input.cjs +101 -0
  117. package/dist/primitives/search-input.d.cts +23 -0
  118. package/dist/primitives/search-input.d.ts +23 -0
  119. package/dist/primitives/search-input.js +101 -0
  120. package/dist/primitives/spinner.cjs +3 -18
  121. package/dist/primitives/spinner.js +3 -18
  122. package/dist/primitives/split-action-button.cjs +3 -3
  123. package/dist/primitives/split-action-button.js +1 -1
  124. package/dist/primitives/suggestion.cjs +3 -3
  125. package/dist/primitives/suggestion.js +2 -2
  126. package/dist/primitives/tag-input.cjs +3 -3
  127. package/dist/primitives/tag-input.js +1 -1
  128. package/dist/primitives/voice-dictation-button.cjs +3 -3
  129. package/dist/primitives/voice-dictation-button.js +2 -2
  130. package/package.json +11 -1
package/README.md CHANGED
@@ -70,6 +70,19 @@ CommonJS builds are included, each with type declarations.
70
70
  built on `@shadcn/react`, which takes `ref` as a plain prop; on React 18 they
71
71
  render, but a ref passed to them is dropped with a warning.
72
72
 
73
+ ## Search input
74
+
75
+ `SearchInput` (`@epicbagel/saas-kit/primitives/search-input`) is a full-width,
76
+ rounded search field on a muted surface, composed from `InputGroup`. Supply
77
+ its controlled `value`, `onValueChange` and accessible `label`; the label is
78
+ also its default placeholder. `loading` replaces the search icon with a
79
+ spinner (`loadingLabel`). The inline clear button (`clearLabel`) and Escape
80
+ clear the query while keeping focus in the input. Disabled and read-only
81
+ fields cannot be cleared. `controlSize="default"` is 44px high and `"lg"`
82
+ is 48px, independent of root font size. Search timing and result fetching
83
+ belong to the caller. Pair it with `Button`'s `shape="pill"` for a matching
84
+ rounded action.
85
+
73
86
  ## Chat
74
87
 
75
88
  `primitives/chat` composes the kit's lifts of the shadcn/ui AI Elements parts
@@ -89,6 +102,15 @@ public in 1.1.0, and these were the decisions about its props then:
89
102
  - **Composer height.** `ChatInput` takes a `size` token (`sm`, `md`, `lg`)
90
103
  for the textarea's starting height; there is no class-name or `rows` prop.
91
104
  The textarea grows with its text (`field-sizing: content`).
105
+ - **Compact mobile replies.** Opt into `Chat.mobileCompactComposer` to fold
106
+ an active conversation's empty composer into one row below 768px. Focusing
107
+ its textarea expands it; leaving the composer folds it again only when
108
+ there is no draft or staged file. The same textarea stays mounted, and
109
+ its file menu and voice dialog keep an editing session open. New
110
+ conversations and desktop keep their normal size. `ChatInput` exposes
111
+ the underlying `compactOnBlur` behavior for other compositions. The
112
+ compact row keeps 44px controls and hides only its helper copy; any
113
+ privacy note remains visible.
92
114
  - **Example prompts.** `examplePromptsVariant` is `chips` (the default: chips
93
115
  that wrap onto as many lines as they need), `row` (one line that scrolls
94
116
  sideways) or `cards` (a two-column grid).
@@ -160,6 +182,41 @@ public in 1.1.0, and these were the decisions about its props then:
160
182
  scroller neither anchors it nor tracks it. It has no time marker, files or
161
183
  rich `content`, and the turns either side of it keep their time grouping.
162
184
 
185
+ ### A turn's actions (1.5.0)
186
+
187
+ - **Under a reply, a row of actions.** `messageActions(message)` returns the
188
+ actions under a turn, after prompt-kit's "Message with Actions": small
189
+ icon-only ghost buttons with tooltips, drawn in a `MessageActions` row at
190
+ the message's side. `ChatCopyAction` is the ready one: it copies the turn's
191
+ `text`, its Markdown source, and shows a check and "Copied" for a moment.
192
+ Add your own after it with `MessageAction` (an icon child, a `tooltip`, and
193
+ `label` when the tooltip isn't text).
194
+
195
+ ```tsx
196
+ <Chat
197
+ messages={messages}
198
+ onSend={send}
199
+ messageActions={(message) => (
200
+ <>
201
+ <ChatCopyAction message={message} onCopy={(ok) => ok && track("copy")} />
202
+ <MessageAction tooltip="Good reply" onClick={() => rate(message.id, "up")}>
203
+ <ThumbsUp />
204
+ </MessageAction>
205
+ </>
206
+ )}
207
+ />
208
+ ```
209
+
210
+ - **Which turns.** Assistant turns, by default. `ChatMessage.actions: false`
211
+ drops them from a turn that isn't a reply (a progress line), `true` gives
212
+ them to a user turn. The running line, a running turn, a turn with
213
+ `status: "sending"` (the user's own turn shown optimistically, until its
214
+ stored copy replaces it) and the footer never have them.
215
+ - **Always there.** The row shows on every screen, a phone included, rather
216
+ than on hover, so nothing moves when a pointer reaches it, and the copied
217
+ state swaps one icon for another of the same size. A button is 2rem
218
+ square, 2.75rem on a touch screen, where the tooltip can't show.
219
+
163
220
  ## File preview (1.3.0)
164
221
 
165
222
  `primitives/file-preview` shows a file in a dialog without leaving the page:
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  Button
4
- } from "./chunk-HQRWRRZJ.js";
4
+ } from "./chunk-W326GKML.js";
5
5
  import {
6
6
  cn
7
7
  } from "./chunk-G6SRSWXB.js";
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  Button
4
- } from "./chunk-HQRWRRZJ.js";
4
+ } from "./chunk-W326GKML.js";
5
5
  import {
6
6
  cn
7
7
  } from "./chunk-G6SRSWXB.js";
@@ -1,7 +1,7 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }"use client";
2
2
 
3
3
 
4
- var _chunkL4DH72UFcjs = require('./chunk-L4DH72UF.cjs');
4
+ var _chunkJDEXZGIYcjs = require('./chunk-JDEXZGIY.cjs');
5
5
 
6
6
 
7
7
  var _chunkKWLSBTB2cjs = require('./chunk-KWLSBTB2.cjs');
@@ -109,7 +109,7 @@ function MessageScrollerButton({
109
109
  "cn-message-scroller-button absolute inset-s-1/2 -translate-x-1/2 border-border bg-background text-foreground transition-[translate,scale,opacity] duration-200 hover:bg-muted hover:text-foreground data-[active=false]:pointer-events-none data-[active=false]:scale-95 data-[active=false]:opacity-0 data-[active=false]:duration-400 data-[active=false]:ease-[cubic-bezier(0.7,0,0.84,0)] data-[active=true]:translate-y-0 data-[active=true]:scale-100 data-[active=true]:opacity-100 data-[active=true]:ease-[cubic-bezier(0.23,1,0.32,1)] data-[direction=end]:bottom-4 data-[direction=end]:data-[active=false]:translate-y-full data-[direction=start]:top-4 data-[direction=start]:data-[active=false]:-translate-y-full rtl:translate-x-1/2 data-[direction=start]:[&_svg]:rotate-180",
110
110
  className
111
111
  ),
112
- render: _nullishCoalesce(render, () => ( /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkL4DH72UFcjs.Button, { variant, size }))),
112
+ render: _nullishCoalesce(render, () => ( /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkJDEXZGIYcjs.Button, { variant, size }))),
113
113
  ...props,
114
114
  children: _nullishCoalesce(children, () => ( /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
115
115
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.ArrowDown, { className: "h-4 w-4" }),
@@ -11,7 +11,7 @@ import {
11
11
  } from "./chunk-V4LE2HWP.js";
12
12
  import {
13
13
  Button
14
- } from "./chunk-HQRWRRZJ.js";
14
+ } from "./chunk-W326GKML.js";
15
15
  import {
16
16
  cn
17
17
  } from "./chunk-G6SRSWXB.js";
@@ -11,7 +11,7 @@
11
11
  var _chunkZAITUDYDcjs = require('./chunk-ZAITUDYD.cjs');
12
12
 
13
13
 
14
- var _chunkL4DH72UFcjs = require('./chunk-L4DH72UF.cjs');
14
+ var _chunkJDEXZGIYcjs = require('./chunk-JDEXZGIY.cjs');
15
15
 
16
16
 
17
17
  var _chunkKWLSBTB2cjs = require('./chunk-KWLSBTB2.cjs');
@@ -76,7 +76,7 @@ function PageHeaderActions({
76
76
  children: desktopActions.map(
77
77
  (action) => _optionalChain([action, 'access', _3 => _3.items, 'optionalAccess', _4 => _4.length]) ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkZAITUDYDcjs.DropdownMenu, { children: [
78
78
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkZAITUDYDcjs.DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
79
- _chunkL4DH72UFcjs.Button,
79
+ _chunkJDEXZGIYcjs.Button,
80
80
  {
81
81
  type: "button",
82
82
  size: "sm",
@@ -92,7 +92,7 @@ function PageHeaderActions({
92
92
  ) }),
93
93
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkZAITUDYDcjs.DropdownMenuContent, { align: "end", width: "compact", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, MenuActions, { actions: action.items }) })
94
94
  ] }, action.id) : /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
95
- _chunkL4DH72UFcjs.Button,
95
+ _chunkJDEXZGIYcjs.Button,
96
96
  {
97
97
  type: "button",
98
98
  size: "sm",
@@ -111,7 +111,7 @@ function PageHeaderActions({
111
111
  }
112
112
  ),
113
113
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "sm:hidden", "data-slot": "page-header-actions-mobile", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkZAITUDYDcjs.DropdownMenu, { children: [
114
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkZAITUDYDcjs.DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkL4DH72UFcjs.Button, { type: "button", size: "sm", variant: "outline", "aria-label": mobileAriaLabel, children: [
114
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkZAITUDYDcjs.DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkJDEXZGIYcjs.Button, { type: "button", size: "sm", variant: "outline", "aria-label": mobileAriaLabel, children: [
115
115
  mobileLabel,
116
116
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.ChevronDown, { "aria-hidden": "true" })
117
117
  ] }) }),
@@ -7,7 +7,7 @@ var _chunk2HV2KKOEcjs = require('./chunk-2HV2KKOE.cjs');
7
7
  var _chunkPQUSJEXLcjs = require('./chunk-PQUSJEXL.cjs');
8
8
 
9
9
 
10
- var _chunkL4DH72UFcjs = require('./chunk-L4DH72UF.cjs');
10
+ var _chunkJDEXZGIYcjs = require('./chunk-JDEXZGIY.cjs');
11
11
 
12
12
 
13
13
  var _chunkKWLSBTB2cjs = require('./chunk-KWLSBTB2.cjs');
@@ -91,7 +91,7 @@ function InputGroupButton({
91
91
  ...props
92
92
  }) {
93
93
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
94
- _chunkL4DH72UFcjs.Button,
94
+ _chunkJDEXZGIYcjs.Button,
95
95
  {
96
96
  type,
97
97
  size: "bare",
@@ -1,7 +1,7 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
2
2
 
3
3
 
4
- var _chunkL4DH72UFcjs = require('./chunk-L4DH72UF.cjs');
4
+ var _chunkJDEXZGIYcjs = require('./chunk-JDEXZGIY.cjs');
5
5
 
6
6
 
7
7
  var _chunkKWLSBTB2cjs = require('./chunk-KWLSBTB2.cjs');
@@ -43,7 +43,7 @@ function LoadMoreButton({
43
43
  );
44
44
  }
45
45
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: _chunkKWLSBTB2cjs.cn.call(void 0, "mt-4 flex justify-center", className), children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
46
- _chunkL4DH72UFcjs.Button,
46
+ _chunkJDEXZGIYcjs.Button,
47
47
  {
48
48
  type: "button",
49
49
  variant: "outline",
@@ -12,7 +12,7 @@ import {
12
12
  } from "./chunk-KN4RPX35.js";
13
13
  import {
14
14
  Button
15
- } from "./chunk-HQRWRRZJ.js";
15
+ } from "./chunk-W326GKML.js";
16
16
  import {
17
17
  cn
18
18
  } from "./chunk-G6SRSWXB.js";
@@ -1,7 +1,7 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }"use client";
2
2
 
3
3
 
4
- var _chunkL4DH72UFcjs = require('./chunk-L4DH72UF.cjs');
4
+ var _chunkJDEXZGIYcjs = require('./chunk-JDEXZGIY.cjs');
5
5
 
6
6
 
7
7
  var _chunkKWLSBTB2cjs = require('./chunk-KWLSBTB2.cjs');
@@ -189,7 +189,7 @@ function EmptyState({
189
189
  }
190
190
  ),
191
191
  action && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "mt-2", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
192
- _chunkL4DH72UFcjs.Button,
192
+ _chunkJDEXZGIYcjs.Button,
193
193
  {
194
194
  type: "button",
195
195
  variant: action.variant || "outline",
@@ -15,7 +15,7 @@ var _chunkWNXVGUBFcjs = require('./chunk-WNXVGUBF.cjs');
15
15
  var _chunkIQZLUT2Ycjs = require('./chunk-IQZLUT2Y.cjs');
16
16
 
17
17
 
18
- var _chunkR5L4CM6Vcjs = require('./chunk-R5L4CM6V.cjs');
18
+ var _chunkVOTCYG3Fcjs = require('./chunk-VOTCYG3F.cjs');
19
19
 
20
20
 
21
21
  var _chunkJH4GAGOQcjs = require('./chunk-JH4GAGOQ.cjs');
@@ -37,7 +37,7 @@ var _chunkVGTINL5Qcjs = require('./chunk-VGTINL5Q.cjs');
37
37
  var _chunkI6GUOEBOcjs = require('./chunk-I6GUOEBO.cjs');
38
38
 
39
39
 
40
- var _chunkL4DH72UFcjs = require('./chunk-L4DH72UF.cjs');
40
+ var _chunkJDEXZGIYcjs = require('./chunk-JDEXZGIY.cjs');
41
41
 
42
42
 
43
43
  var _chunkR35FT53Gcjs = require('./chunk-R35FT53G.cjs');
@@ -141,7 +141,7 @@ function FilterBar({
141
141
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkI6GUOEBOcjs.Badge, { variant: "secondary", className: "text-xs", children: [
142
142
  _optionalChain([option, 'optionalAccess', _12 => _12.label]),
143
143
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
144
- _chunkL4DH72UFcjs.Button,
144
+ _chunkJDEXZGIYcjs.Button,
145
145
  {
146
146
  variant: "ghost",
147
147
  size: "sm",
@@ -164,7 +164,7 @@ function FilterBar({
164
164
  const calendarSelected = rangeFrom ? { from: toDate(rangeFrom), to: toDate(rangeTo) } : void 0;
165
165
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkWNXVGUBFcjs.Popover, { children: [
166
166
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkWNXVGUBFcjs.PopoverTrigger, { asChild: true, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
167
- _chunkL4DH72UFcjs.Button,
167
+ _chunkJDEXZGIYcjs.Button,
168
168
  {
169
169
  variant: "outline",
170
170
  className: "justify-start text-left font-normal w-full",
@@ -175,7 +175,7 @@ function FilterBar({
175
175
  }
176
176
  ) }),
177
177
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkWNXVGUBFcjs.PopoverContent, { className: "w-auto p-0", align: "start", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
178
- _chunkR5L4CM6Vcjs.Calendar,
178
+ _chunkVOTCYG3Fcjs.Calendar,
179
179
  {
180
180
  mode: "range",
181
181
  selected: calendarSelected,
@@ -190,7 +190,7 @@ function FilterBar({
190
190
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "grid grid-cols-2 gap-2", children: [
191
191
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkWNXVGUBFcjs.Popover, { children: [
192
192
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkWNXVGUBFcjs.PopoverTrigger, { asChild: true, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
193
- _chunkL4DH72UFcjs.Button,
193
+ _chunkJDEXZGIYcjs.Button,
194
194
  {
195
195
  variant: "outline",
196
196
  className: "justify-start text-left font-normal",
@@ -201,7 +201,7 @@ function FilterBar({
201
201
  }
202
202
  ) }),
203
203
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkWNXVGUBFcjs.PopoverContent, { className: "w-auto p-0", align: "start", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
204
- _chunkR5L4CM6Vcjs.Calendar,
204
+ _chunkVOTCYG3Fcjs.Calendar,
205
205
  {
206
206
  mode: "single",
207
207
  selected: _optionalChain([value, 'optionalAccess', _18 => _18.from]),
@@ -212,7 +212,7 @@ function FilterBar({
212
212
  ] }),
213
213
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkWNXVGUBFcjs.Popover, { children: [
214
214
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkWNXVGUBFcjs.PopoverTrigger, { asChild: true, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
215
- _chunkL4DH72UFcjs.Button,
215
+ _chunkJDEXZGIYcjs.Button,
216
216
  {
217
217
  variant: "outline",
218
218
  className: "justify-start text-left font-normal",
@@ -223,7 +223,7 @@ function FilterBar({
223
223
  }
224
224
  ) }),
225
225
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkWNXVGUBFcjs.PopoverContent, { className: "w-auto p-0", align: "start", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
226
- _chunkR5L4CM6Vcjs.Calendar,
226
+ _chunkVOTCYG3Fcjs.Calendar,
227
227
  {
228
228
  mode: "single",
229
229
  selected: _optionalChain([value, 'optionalAccess', _20 => _20.to]),
@@ -287,7 +287,7 @@ function FilterBar({
287
287
  };
288
288
  const activeFilterCount = getActiveFilterCount();
289
289
  const trigger = /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
290
- _chunkL4DH72UFcjs.Button,
290
+ _chunkJDEXZGIYcjs.Button,
291
291
  {
292
292
  variant: "outline",
293
293
  size: triggerSize === "lg" ? includeLabel || activeFilterCount > 0 ? "toolbar" : "icon-lg" : includeLabel || activeFilterCount > 0 ? "default" : "icon",
@@ -309,7 +309,7 @@ function FilterBar({
309
309
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "shrink-0 border-b p-4", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center justify-between", children: [
310
310
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "h4", { className: "font-medium", children: "Filters" }),
311
311
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
312
- _chunkL4DH72UFcjs.Button,
312
+ _chunkJDEXZGIYcjs.Button,
313
313
  {
314
314
  variant: "ghost",
315
315
  size: "sm",
@@ -364,8 +364,8 @@ function FilterBar({
364
364
  "data-slot": "filter-bar-actions",
365
365
  className: "z-10 shrink-0 border-t bg-popover p-4 pb-[max(1rem,env(safe-area-inset-bottom))]",
366
366
  children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex justify-end space-x-2", children: [
367
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkL4DH72UFcjs.Button, { variant: "outline", onClick: () => setIsOpen(false), children: "Cancel" }),
368
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkL4DH72UFcjs.Button, { onClick: applyFilters, children: "Apply Filters" })
367
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkJDEXZGIYcjs.Button, { variant: "outline", onClick: () => setIsOpen(false), children: "Cancel" }),
368
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkJDEXZGIYcjs.Button, { onClick: applyFilters, children: "Apply Filters" })
369
369
  ] })
370
370
  }
371
371
  )
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  Button
4
- } from "./chunk-HQRWRRZJ.js";
4
+ } from "./chunk-W326GKML.js";
5
5
  import {
6
6
  cn
7
7
  } from "./chunk-G6SRSWXB.js";
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  Button
4
- } from "./chunk-HQRWRRZJ.js";
4
+ } from "./chunk-W326GKML.js";
5
5
  import {
6
6
  cn
7
7
  } from "./chunk-G6SRSWXB.js";
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  Button
4
- } from "./chunk-HQRWRRZJ.js";
4
+ } from "./chunk-W326GKML.js";
5
5
  import {
6
6
  cn
7
7
  } from "./chunk-G6SRSWXB.js";
@@ -1,7 +1,7 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }"use client";
2
2
 
3
3
 
4
- var _chunkL4DH72UFcjs = require('./chunk-L4DH72UF.cjs');
4
+ var _chunkJDEXZGIYcjs = require('./chunk-JDEXZGIY.cjs');
5
5
 
6
6
 
7
7
  var _chunkKWLSBTB2cjs = require('./chunk-KWLSBTB2.cjs');
@@ -70,7 +70,7 @@ function QuickFilters({
70
70
  const isActive2 = (qf) => areFiltersEqual(activeFilters, qf.filters);
71
71
  const handleClick2 = (qf) => isActive2(qf) ? onFilterClick({}) : onFilterClick(qf.filters);
72
72
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Shell, { showLabel, appearance, className, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: _chunkKWLSBTB2cjs.cn.call(void 0, "flex items-center flex-wrap", appearance === "underline" ? "gap-6" : "gap-2"), children: quickFilters.map((filter) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
73
- _chunkL4DH72UFcjs.Button,
73
+ _chunkJDEXZGIYcjs.Button,
74
74
  {
75
75
  variant: appearance === "underline" ? "ghost" : isActive2(filter) ? "default" : "outline",
76
76
  size: "sm",
@@ -121,7 +121,7 @@ function QuickFilters({
121
121
  if (fs.length === 1) {
122
122
  const filter = fs[0];
123
123
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
124
- _chunkL4DH72UFcjs.Button,
124
+ _chunkJDEXZGIYcjs.Button,
125
125
  {
126
126
  variant: appearance === "underline" ? "ghost" : isActive(filter) ? "default" : "outline",
127
127
  size: "sm",
@@ -145,7 +145,7 @@ function QuickFilters({
145
145
  appearance === "underline" ? "gap-6" : "gap-1 rounded-md border p-0.5"
146
146
  ),
147
147
  children: fs.map((filter) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
148
- _chunkL4DH72UFcjs.Button,
148
+ _chunkJDEXZGIYcjs.Button,
149
149
  {
150
150
  variant: appearance === "underline" ? "ghost" : isActive(filter) ? "default" : "ghost",
151
151
  size: "sm",
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  CopyButton
4
- } from "./chunk-NW3OWKBN.js";
4
+ } from "./chunk-HREEZUKL.js";
5
5
  import {
6
6
  cn
7
7
  } from "./chunk-G6SRSWXB.js";
@@ -1,7 +1,7 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }"use client";
2
2
 
3
3
 
4
- var _chunkL4DH72UFcjs = require('./chunk-L4DH72UF.cjs');
4
+ var _chunkJDEXZGIYcjs = require('./chunk-JDEXZGIY.cjs');
5
5
 
6
6
 
7
7
  var _chunkKWLSBTB2cjs = require('./chunk-KWLSBTB2.cjs');
@@ -147,7 +147,7 @@ function AttachmentAction({
147
147
  ...props
148
148
  }) {
149
149
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
150
- _chunkL4DH72UFcjs.Button,
150
+ _chunkJDEXZGIYcjs.Button,
151
151
  {
152
152
  "data-slot": "attachment-action",
153
153
  variant: _nullishCoalesce(variant, () => ( "ghost")),
@@ -1,7 +1,7 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
2
2
 
3
3
 
4
- var _chunkVKIGJNJRcjs = require('./chunk-VKIGJNJR.cjs');
4
+ var _chunkMU4F3DSWcjs = require('./chunk-MU4F3DSW.cjs');
5
5
 
6
6
 
7
7
  var _chunkKWLSBTB2cjs = require('./chunk-KWLSBTB2.cjs');
@@ -38,7 +38,7 @@ function CodeBlock({
38
38
  }
39
39
  ),
40
40
  copy ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
41
- _chunkVKIGJNJRcjs.CopyButton,
41
+ _chunkMU4F3DSWcjs.CopyButton,
42
42
  {
43
43
  text: copyText,
44
44
  label: copyLabel,
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  Button,
4
4
  buttonVariants
5
- } from "./chunk-HQRWRRZJ.js";
5
+ } from "./chunk-W326GKML.js";
6
6
  import {
7
7
  cn
8
8
  } from "./chunk-G6SRSWXB.js";
@@ -1,10 +1,20 @@
1
1
  "use client";
2
+ import {
3
+ Tooltip,
4
+ TooltipContent,
5
+ TooltipProvider,
6
+ TooltipTrigger
7
+ } from "./chunk-ZRLUUZHK.js";
8
+ import {
9
+ Button
10
+ } from "./chunk-W326GKML.js";
2
11
  import {
3
12
  cn
4
13
  } from "./chunk-G6SRSWXB.js";
5
14
 
6
15
  // src/primitives/message.tsx
7
- import { jsx } from "react/jsx-runtime";
16
+ import * as React from "react";
17
+ import { jsx, jsxs } from "react/jsx-runtime";
8
18
  function MessageGroup({ className, ...props }) {
9
19
  return /* @__PURE__ */ jsx(
10
20
  "div",
@@ -85,6 +95,53 @@ function MessageFooter({ className, ...props }) {
85
95
  }
86
96
  );
87
97
  }
98
+ function MessageActions({ className, ...props }) {
99
+ return /* @__PURE__ */ jsx(
100
+ "div",
101
+ {
102
+ "data-slot": "message-actions",
103
+ className: cn(
104
+ "cn-message-actions flex max-w-full min-w-0 items-center gap-0.5 text-muted-foreground empty:hidden group-data-[align=end]/message:justify-end",
105
+ className
106
+ ),
107
+ ...props
108
+ }
109
+ );
110
+ }
111
+ var MessageAction = React.forwardRef(
112
+ function MessageAction2({
113
+ tooltip,
114
+ label,
115
+ side = "bottom",
116
+ variant = "quiet",
117
+ type = "button",
118
+ className,
119
+ children,
120
+ ...props
121
+ }, ref) {
122
+ const name = label ?? (typeof tooltip === "string" ? tooltip : void 0);
123
+ return /* @__PURE__ */ jsx(TooltipProvider, { children: /* @__PURE__ */ jsxs(Tooltip, { children: [
124
+ /* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx(
125
+ Button,
126
+ {
127
+ ref,
128
+ type,
129
+ variant,
130
+ size: "icon-compact",
131
+ "aria-label": name,
132
+ "data-slot": "message-action",
133
+ className: cn(
134
+ "cn-message-action size-8 shrink-0 rounded-full pointer-coarse:size-11",
135
+ className
136
+ ),
137
+ ...props,
138
+ children
139
+ }
140
+ ) }),
141
+ /* @__PURE__ */ jsx(TooltipContent, { side, children: tooltip })
142
+ ] }) });
143
+ }
144
+ );
88
145
 
89
146
  export {
90
147
  MessageGroup,
@@ -92,5 +149,7 @@ export {
92
149
  MessageAvatar,
93
150
  MessageContent,
94
151
  MessageHeader,
95
- MessageFooter
152
+ MessageFooter,
153
+ MessageActions,
154
+ MessageAction
96
155
  };
@@ -9,7 +9,7 @@ import {
9
9
  } from "./chunk-ZRLUUZHK.js";
10
10
  import {
11
11
  Button
12
- } from "./chunk-HQRWRRZJ.js";
12
+ } from "./chunk-W326GKML.js";
13
13
  import {
14
14
  cn
15
15
  } from "./chunk-G6SRSWXB.js";
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  Button
4
- } from "./chunk-HQRWRRZJ.js";
4
+ } from "./chunk-W326GKML.js";
5
5
  import {
6
6
  useCopyToClipboard
7
7
  } from "./chunk-ZWZAAGQF.js";
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  Button
4
- } from "./chunk-HQRWRRZJ.js";
4
+ } from "./chunk-W326GKML.js";
5
5
  import {
6
6
  cn
7
7
  } from "./chunk-G6SRSWXB.js";
@@ -71,7 +71,8 @@ var buttonVariants = _classvarianceauthority.cva.call(void 0,
71
71
  },
72
72
  shape: {
73
73
  default: "",
74
- circle: "rounded-full"
74
+ circle: "rounded-full",
75
+ pill: "rounded-full"
75
76
  },
76
77
  ring: {
77
78
  none: "",
@@ -1,13 +1,13 @@
1
1
  "use client";
2
2
  import {
3
3
  QuickFilters
4
- } from "./chunk-LI5EOSQG.js";
4
+ } from "./chunk-43UMPZWD.js";
5
5
  import {
6
6
  LoadMoreButton
7
- } from "./chunk-J3GQXM37.js";
7
+ } from "./chunk-EEHIMPD7.js";
8
8
  import {
9
9
  FilterBar
10
- } from "./chunk-MLHNYRFX.js";
10
+ } from "./chunk-KNKV25WS.js";
11
11
  import {
12
12
  Heading
13
13
  } from "./chunk-H2O6NMLZ.js";
@@ -29,7 +29,7 @@ import {
29
29
  } from "./chunk-QMA3WVB7.js";
30
30
  import {
31
31
  Button
32
- } from "./chunk-HQRWRRZJ.js";
32
+ } from "./chunk-W326GKML.js";
33
33
  import {
34
34
  useIsMobile
35
35
  } from "./chunk-PIU5SSUV.js";