@epicbagel/saas-kit 1.0.0 → 1.1.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 (120) hide show
  1. package/README.md +38 -1
  2. package/THIRD_PARTY_NOTICES.md +13 -7
  3. package/dist/chunk-2AU7ZRGX.cjs +96 -0
  4. package/dist/chunk-2BTDBZYN.cjs +154 -0
  5. package/dist/chunk-2HV2KKOE.cjs +38 -0
  6. package/dist/chunk-2KFZQJH5.cjs +29 -0
  7. package/dist/chunk-32Q4XOTU.cjs +204 -0
  8. package/dist/chunk-42RTTHND.js +29 -0
  9. package/dist/chunk-6FC65AZQ.js +38 -0
  10. package/dist/chunk-6V4XMQ6D.js +118 -0
  11. package/dist/chunk-B765DSRG.cjs +66 -0
  12. package/dist/chunk-ELPV44S6.cjs +44 -0
  13. package/dist/chunk-EOUO3ORO.cjs +244 -0
  14. package/dist/chunk-EZCKWTH7.js +204 -0
  15. package/dist/chunk-F366BHWH.js +116 -0
  16. package/dist/chunk-GFG2R5BZ.js +132 -0
  17. package/dist/chunk-HAC32ALJ.js +244 -0
  18. package/dist/chunk-I5UQSBBZ.cjs +118 -0
  19. package/dist/chunk-INNGGLMZ.js +44 -0
  20. package/dist/chunk-IW4ZIXXG.js +66 -0
  21. package/dist/chunk-JZOBIPFC.js +96 -0
  22. package/dist/chunk-KENBU3NV.cjs +27 -0
  23. package/dist/chunk-MHYAVXOE.js +159 -0
  24. package/dist/chunk-RIWLAMME.cjs +159 -0
  25. package/dist/chunk-SUB4BAYE.cjs +73 -0
  26. package/dist/chunk-THWIJG5C.js +73 -0
  27. package/dist/chunk-V4YWTRLD.cjs +116 -0
  28. package/dist/chunk-VY5U4VGV.js +27 -0
  29. package/dist/chunk-XABXUP6L.cjs +132 -0
  30. package/dist/chunk-Z45YKVAM.js +154 -0
  31. package/dist/primitives/action-dock.cjs +8 -0
  32. package/dist/primitives/action-dock.d.cts +10 -0
  33. package/dist/primitives/action-dock.d.ts +10 -0
  34. package/dist/primitives/action-dock.js +8 -0
  35. package/dist/primitives/alert.d.cts +1 -1
  36. package/dist/primitives/alert.d.ts +1 -1
  37. package/dist/primitives/attachment.cjs +25 -203
  38. package/dist/primitives/attachment.d.cts +1 -1
  39. package/dist/primitives/attachment.d.ts +1 -1
  40. package/dist/primitives/attachment.js +12 -190
  41. package/dist/primitives/badge.d.cts +1 -1
  42. package/dist/primitives/badge.d.ts +1 -1
  43. package/dist/primitives/board-view.cjs +3 -3
  44. package/dist/primitives/board-view.js +2 -2
  45. package/dist/primitives/bubble.cjs +14 -0
  46. package/dist/primitives/bubble.d.cts +21 -0
  47. package/dist/primitives/bubble.d.ts +21 -0
  48. package/dist/primitives/bubble.js +14 -0
  49. package/dist/primitives/button.d.cts +2 -2
  50. package/dist/primitives/button.d.ts +2 -2
  51. package/dist/primitives/chat.cjs +864 -0
  52. package/dist/primitives/chat.d.cts +326 -0
  53. package/dist/primitives/chat.d.ts +326 -0
  54. package/dist/primitives/chat.js +864 -0
  55. package/dist/primitives/connection.cjs +6 -6
  56. package/dist/primitives/connection.js +7 -7
  57. package/dist/primitives/file-dropzone.cjs +7 -113
  58. package/dist/primitives/file-dropzone.js +6 -112
  59. package/dist/primitives/input-group.cjs +21 -0
  60. package/dist/primitives/input-group.d.cts +20 -0
  61. package/dist/primitives/input-group.d.ts +20 -0
  62. package/dist/primitives/input-group.js +21 -0
  63. package/dist/primitives/item.cjs +197 -0
  64. package/dist/primitives/item.d.cts +28 -0
  65. package/dist/primitives/item.d.ts +28 -0
  66. package/dist/primitives/item.js +197 -0
  67. package/dist/primitives/lazy-markdown.cjs +10 -0
  68. package/dist/primitives/lazy-markdown.d.cts +20 -0
  69. package/dist/primitives/lazy-markdown.d.ts +20 -0
  70. package/dist/primitives/lazy-markdown.js +10 -0
  71. package/dist/primitives/markdown.cjs +17 -0
  72. package/dist/primitives/markdown.d.cts +32 -0
  73. package/dist/primitives/markdown.d.ts +32 -0
  74. package/dist/primitives/markdown.js +17 -0
  75. package/dist/primitives/marker.cjs +14 -0
  76. package/dist/primitives/marker.d.cts +15 -0
  77. package/dist/primitives/marker.d.ts +15 -0
  78. package/dist/primitives/marker.js +14 -0
  79. package/dist/primitives/message-scroller.cjs +26 -0
  80. package/dist/primitives/message-scroller.d.cts +16 -0
  81. package/dist/primitives/message-scroller.d.ts +16 -0
  82. package/dist/primitives/message-scroller.js +26 -0
  83. package/dist/primitives/message.cjs +7 -84
  84. package/dist/primitives/message.js +8 -85
  85. package/dist/primitives/resource-list.cjs +3 -3
  86. package/dist/primitives/resource-list.js +2 -2
  87. package/dist/primitives/rich-text.cjs +3 -38
  88. package/dist/primitives/rich-text.js +3 -38
  89. package/dist/primitives/section-header.d.cts +1 -1
  90. package/dist/primitives/section-header.d.ts +1 -1
  91. package/dist/primitives/spinner.cjs +23 -0
  92. package/dist/primitives/spinner.d.cts +6 -0
  93. package/dist/primitives/spinner.d.ts +6 -0
  94. package/dist/primitives/spinner.js +23 -0
  95. package/dist/primitives/suggestion.cjs +11 -0
  96. package/dist/primitives/suggestion.d.cts +19 -0
  97. package/dist/primitives/suggestion.d.ts +19 -0
  98. package/dist/primitives/suggestion.js +11 -0
  99. package/dist/primitives/switch-field.cjs +2 -2
  100. package/dist/primitives/switch-field.js +3 -3
  101. package/dist/primitives/textarea.cjs +4 -33
  102. package/dist/primitives/textarea.js +3 -32
  103. package/dist/primitives/toggle-group.d.cts +2 -2
  104. package/dist/primitives/toggle-group.d.ts +2 -2
  105. package/dist/primitives/toggle.d.cts +2 -2
  106. package/dist/primitives/toggle.d.ts +2 -2
  107. package/dist/primitives/trace.cjs +23 -0
  108. package/dist/primitives/trace.d.cts +22 -0
  109. package/dist/primitives/trace.d.ts +22 -0
  110. package/dist/primitives/trace.js +23 -0
  111. package/dist/primitives/voice-dictation-button.cjs +5 -239
  112. package/dist/primitives/voice-dictation-button.js +4 -238
  113. package/package.json +125 -2
  114. package/src/styles/components/bubble.css +81 -0
  115. package/src/styles/components/marker.css +27 -0
  116. package/src/styles/components/message-scroller.css +11 -0
  117. package/src/styles/components.css +3 -0
  118. package/src/styles/utilities.css +3 -2
  119. package/dist/{chunk-UGF2K6NR.js → chunk-HRLP4BHJ.js} +6 -6
  120. package/dist/{chunk-RWWOFWLP.cjs → chunk-IH3COANJ.cjs} +3 -3
package/README.md CHANGED
@@ -12,7 +12,7 @@ npm install @epicbagel/saas-kit
12
12
  ```
13
13
 
14
14
  Peer dependencies: `react` and `react-dom` (18 or 19), `lucide-react`
15
- (`>=0.400.0 <2`), `react-icons` (5) and `tailwindcss` v4.
15
+ (`>=0.400.0 <2`), `react-icons` (5) and `tailwindcss` (4.3 or later).
16
16
 
17
17
  ## Styles
18
18
 
@@ -66,6 +66,43 @@ Components ship as client modules (`"use client"`); the `lib/*` utilities are
66
66
  plain modules that are safe to call from React Server Components. Both ESM and
67
67
  CommonJS builds are included, each with type declarations.
68
68
 
69
+ `primitives/chat` and `primitives/message-scroller` need React 19. They are
70
+ built on `@shadcn/react`, which takes `ref` as a plain prop; on React 18 they
71
+ render, but a ref passed to them is dropped with a warning.
72
+
73
+ ## Chat
74
+
75
+ `primitives/chat` composes the kit's lifts of the shadcn/ui AI Elements parts
76
+ (Message, Bubble, MessageScroller, Trace, Suggestion, InputGroup) into a
77
+ conversation with plain props: no AI SDK, no streaming renderer. It became
78
+ public in 1.1.0, and these were the decisions about its props then:
79
+
80
+ - **Copy.** Every piece of built-in copy can be replaced: `pendingLabel`
81
+ ("Thinking…"), `scrollButtonLabel` ("Scroll to latest message"),
82
+ `uploadingLabel` ("Uploading…"), `voiceHeroLabel` ("Tap to speak"),
83
+ `voiceHeroSwitchLabel` ("or type instead"), `examplePromptsLabel` ("Try"),
84
+ `examplePromptsLoadingLabel` ("Loading suggestions…"), `addFilesLabel`,
85
+ `placeholder` and `activePlaceholder`. The defaults are plain English with
86
+ no product voice, and the empty state has no title unless you pass
87
+ `emptyTitle`. The icon buttons' accessible names ("Send", "Add to
88
+ conversation", "Remove" plus the file name) are fixed for now.
89
+ - **Composer height.** `ChatInput` takes a `size` token (`sm`, `md`, `lg`)
90
+ for the textarea's starting height; there is no class-name or `rows` prop.
91
+ The textarea grows with its text (`field-sizing: content`).
92
+ - **Example prompts.** `examplePromptsVariant` is `chips` (the default: chips
93
+ that wrap onto as many lines as they need), `row` (one line that scrolls
94
+ sideways) or `cards` (a two-column grid).
95
+ - **Failed sends.** When `onSend` rejects, Chat puts the text back in the
96
+ composer and calls `onSendError`; without one it reports the rejection
97
+ through `reportError`, so a failure is never silent.
98
+ - **Removed before 1.1.0,** having no callers: `hideExamples` (pass no
99
+ `examplePrompts`), `emptyFooterVisibility` (the footer always shows),
100
+ `voiceAlign` (the voice hero is centred) and `ChatInput`'s `rows` and
101
+ `minHeightClassName` (use `size`).
102
+ - **Kept** as they were: the `embedded`, `application` and
103
+ `workspace` layouts, the voice-first empty state, the file drop target,
104
+ `compactEmptyState`, `threadMaxHeight` and the rest.
105
+
69
106
  ## License
70
107
 
71
108
  MIT. Some components and styles are adapted from shadcn/ui; see
@@ -11,16 +11,22 @@ licenses in their own packages.
11
11
  Source: https://github.com/shadcn-ui/ui
12
12
 
13
13
  These modules are adapted from shadcn/ui components and styles. The compiled
14
- output under `dist/` includes code derived from them.
14
+ output under `dist/` includes code derived from them. The more recent lifts
15
+ name their registry item, style and sync date in a header comment.
15
16
 
16
17
  - `primitives/`: alert, alert-dialog, aspect-ratio, attachment, avatar, badge,
17
- button, calendar, card, checkbox, collapsible, dialog, drawer, dropdown-menu,
18
- field, input, label, message, popover, progress, radio-group, scroll-area,
19
- select, separator, sheet, skeleton, switch, tabs, textarea, toggle,
20
- toggle-group, tooltip
18
+ bubble, button, calendar, card, checkbox, collapsible, dialog, drawer,
19
+ dropdown-menu, field, input, input-group, item, label, marker, message,
20
+ message-scroller, popover, progress, radio-group, scroll-area, select,
21
+ separator, sheet, skeleton, spinner, switch, tabs, textarea, toggle,
22
+ toggle-group, tooltip, trace
23
+ - `primitives/suggestion`, adapted from the shadcn/ui AI Elements "Suggestion"
24
+ pattern (https://ui.shadcn.com/docs/ai-elements)
25
+ - `primitives/chat`, composed after the shadcn/ui AI Elements "Chat",
26
+ "Message", "Prompt Input" and "Suggestion" patterns from the parts above
21
27
  - `lib/utils` (`cn`)
22
- - `src/styles/shadcn.css`, `src/styles/components/attachment.css`,
23
- `src/styles/components/message.css`
28
+ - `src/styles/shadcn.css`, and in `src/styles/components/`: attachment.css,
29
+ bubble.css, marker.css, message.css and message-scroller.css
24
30
 
25
31
  ```
26
32
  MIT License
@@ -0,0 +1,96 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
2
+
3
+
4
+ var _chunkKWLSBTB2cjs = require('./chunk-KWLSBTB2.cjs');
5
+
6
+ // src/primitives/message.tsx
7
+ var _jsxruntime = require('react/jsx-runtime');
8
+ function MessageGroup({ className, ...props }) {
9
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
10
+ "div",
11
+ {
12
+ "data-slot": "message-group",
13
+ className: _chunkKWLSBTB2cjs.cn.call(void 0, "cn-message-group flex min-w-0 flex-col", className),
14
+ ...props
15
+ }
16
+ );
17
+ }
18
+ function Message({
19
+ className,
20
+ align = "start",
21
+ ...props
22
+ }) {
23
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
24
+ "div",
25
+ {
26
+ "data-slot": "message",
27
+ "data-align": align,
28
+ className: _chunkKWLSBTB2cjs.cn.call(void 0,
29
+ "cn-message group/message relative flex w-full min-w-0 data-[align=end]:flex-row-reverse",
30
+ className
31
+ ),
32
+ ...props
33
+ }
34
+ );
35
+ }
36
+ function MessageAvatar({ className, ...props }) {
37
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
38
+ "div",
39
+ {
40
+ "data-slot": "message-avatar",
41
+ className: _chunkKWLSBTB2cjs.cn.call(void 0,
42
+ "cn-message-avatar flex w-fit shrink-0 items-center justify-center self-end overflow-hidden rounded-full bg-muted",
43
+ className
44
+ ),
45
+ ...props
46
+ }
47
+ );
48
+ }
49
+ function MessageContent({ className, ...props }) {
50
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
51
+ "div",
52
+ {
53
+ "data-slot": "message-content",
54
+ className: _chunkKWLSBTB2cjs.cn.call(void 0,
55
+ "cn-message-content flex w-full min-w-0 flex-col wrap-break-word",
56
+ className
57
+ ),
58
+ ...props
59
+ }
60
+ );
61
+ }
62
+ function MessageHeader({ className, ...props }) {
63
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
64
+ "div",
65
+ {
66
+ "data-slot": "message-header",
67
+ className: _chunkKWLSBTB2cjs.cn.call(void 0,
68
+ "cn-message-header flex max-w-full min-w-0 items-center",
69
+ className
70
+ ),
71
+ ...props
72
+ }
73
+ );
74
+ }
75
+ function MessageFooter({ className, ...props }) {
76
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
77
+ "div",
78
+ {
79
+ "data-slot": "message-footer",
80
+ className: _chunkKWLSBTB2cjs.cn.call(void 0,
81
+ "cn-message-footer flex max-w-full min-w-0 items-center group-data-[align=end]/message:justify-end",
82
+ className
83
+ ),
84
+ ...props
85
+ }
86
+ );
87
+ }
88
+
89
+
90
+
91
+
92
+
93
+
94
+
95
+
96
+ exports.MessageGroup = MessageGroup; exports.Message = Message; exports.MessageAvatar = MessageAvatar; exports.MessageContent = MessageContent; exports.MessageHeader = MessageHeader; exports.MessageFooter = MessageFooter;
@@ -0,0 +1,154 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
2
+
3
+
4
+
5
+
6
+ var _chunkW5HPHEE7cjs = require('./chunk-W5HPHEE7.cjs');
7
+
8
+
9
+ var _chunkKWLSBTB2cjs = require('./chunk-KWLSBTB2.cjs');
10
+
11
+ // src/primitives/trace.tsx
12
+ var _lucidereact = require('lucide-react');
13
+ var _jsxruntime = require('react/jsx-runtime');
14
+ function Trace({ className, ...props }) {
15
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
16
+ "div",
17
+ {
18
+ "data-slot": "trace",
19
+ className: _chunkKWLSBTB2cjs.cn.call(void 0,
20
+ "flex w-full min-w-0 flex-col gap-2 *:has-[>[data-slot=trace-line]]:flex *:has-[>[data-slot=trace-line]]:w-fit *:has-[>[data-slot=trace-line]]:max-w-full *:has-[>[data-slot=trace-line]]:min-w-0 *:has-[>[data-slot=trace-line]]:rounded-md *:has-[>[data-slot=trace-line]]:text-left *:has-[>[data-slot=trace-line]]:outline-none *:has-[>[data-slot=trace-line]]:focus-visible:ring-3 *:has-[>[data-slot=trace-line]]:focus-visible:ring-ring/50",
21
+ className
22
+ ),
23
+ ...props
24
+ }
25
+ );
26
+ }
27
+ function TraceLine({
28
+ className,
29
+ status,
30
+ ...props
31
+ }) {
32
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
33
+ "span",
34
+ {
35
+ "data-slot": "trace-line",
36
+ "data-status": status,
37
+ className: _chunkKWLSBTB2cjs.cn.call(void 0,
38
+ "flex w-fit max-w-full min-w-0 items-center gap-2 text-sm text-muted-foreground transition-colors in-[a,button]:cursor-pointer in-[a:hover,button:hover]:text-foreground data-[status=error]:text-destructive data-[status=error]:in-[a:hover,button:hover]:text-destructive data-[status=pending]:opacity-60 data-[status=running]:*:data-[slot=trace-title]:shimmer",
39
+ className
40
+ ),
41
+ ...props
42
+ }
43
+ );
44
+ }
45
+ function TraceIcon({ className, ...props }) {
46
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
47
+ "span",
48
+ {
49
+ "data-slot": "trace-icon",
50
+ "aria-hidden": "true",
51
+ className: _chunkKWLSBTB2cjs.cn.call(void 0,
52
+ "flex size-4 shrink-0 items-center justify-center [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [[data-slot=trace-title]~&]:-ml-1",
53
+ className
54
+ ),
55
+ ...props
56
+ }
57
+ );
58
+ }
59
+ function TraceTitle({ className, ...props }) {
60
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
61
+ "span",
62
+ {
63
+ "data-slot": "trace-title",
64
+ className: _chunkKWLSBTB2cjs.cn.call(void 0, "min-w-0 truncate motion-reduce:shimmer-none", className),
65
+ ...props
66
+ }
67
+ );
68
+ }
69
+ function TraceDescription({
70
+ className,
71
+ ...props
72
+ }) {
73
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
74
+ "span",
75
+ {
76
+ "data-slot": "trace-description",
77
+ className: _chunkKWLSBTB2cjs.cn.call(void 0,
78
+ "shrink-0 text-muted-foreground/70 tabular-nums",
79
+ className
80
+ ),
81
+ ...props
82
+ }
83
+ );
84
+ }
85
+ function TraceCollapsible({
86
+ className,
87
+ ...props
88
+ }) {
89
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
90
+ _chunkW5HPHEE7cjs.Collapsible,
91
+ {
92
+ "data-slot": "trace-collapsible",
93
+ className: _chunkKWLSBTB2cjs.cn.call(void 0, "flex w-full min-w-0 flex-col", className),
94
+ ...props
95
+ }
96
+ );
97
+ }
98
+ function TraceCollapsibleTrigger({
99
+ className,
100
+ children,
101
+ ...props
102
+ }) {
103
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
104
+ _chunkW5HPHEE7cjs.CollapsibleTrigger,
105
+ {
106
+ "data-slot": "trace-collapsible-trigger",
107
+ className: _chunkKWLSBTB2cjs.cn.call(void 0,
108
+ "group/trace-collapsible-trigger flex w-fit max-w-full min-w-0 cursor-pointer items-center gap-1 rounded-md text-left text-muted-foreground transition-colors outline-none hover:text-foreground focus-visible:ring-3 focus-visible:ring-ring/50 has-[[data-status=error]]:text-destructive",
109
+ className
110
+ ),
111
+ ...props,
112
+ children: [
113
+ children,
114
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TraceIcon, { className: "transition-transform group-aria-expanded/trace-collapsible-trigger:rotate-90", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.ChevronRight, {}) })
115
+ ]
116
+ }
117
+ );
118
+ }
119
+ function TraceCollapsibleContent({
120
+ className,
121
+ children,
122
+ ...props
123
+ }) {
124
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
125
+ _chunkW5HPHEE7cjs.CollapsibleContent,
126
+ {
127
+ "data-slot": "trace-collapsible-content",
128
+ className: "min-w-0 overflow-hidden duration-200 [--radix-accordion-content-height:var(--radix-collapsible-content-height)] data-open:animate-accordion-down data-closed:animate-accordion-up",
129
+ ...props,
130
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
131
+ "div",
132
+ {
133
+ "data-slot": "trace-collapsible-content-inner",
134
+ className: _chunkKWLSBTB2cjs.cn.call(void 0,
135
+ "mt-2 mb-1 ml-[calc(--spacing(2)-1px)] min-w-0 border-l pr-1 pl-4 leading-relaxed wrap-break-word text-muted-foreground",
136
+ className
137
+ ),
138
+ children
139
+ }
140
+ )
141
+ }
142
+ );
143
+ }
144
+
145
+
146
+
147
+
148
+
149
+
150
+
151
+
152
+
153
+
154
+ exports.Trace = Trace; exports.TraceLine = TraceLine; exports.TraceIcon = TraceIcon; exports.TraceTitle = TraceTitle; exports.TraceDescription = TraceDescription; exports.TraceCollapsible = TraceCollapsible; exports.TraceCollapsibleTrigger = TraceCollapsibleTrigger; exports.TraceCollapsibleContent = TraceCollapsibleContent;
@@ -0,0 +1,38 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }"use client";
2
+
3
+
4
+ var _chunkKWLSBTB2cjs = require('./chunk-KWLSBTB2.cjs');
5
+
6
+ // src/primitives/textarea.tsx
7
+ var _react = require('react'); var React = _interopRequireWildcard(_react);
8
+ var _jsxruntime = require('react/jsx-runtime');
9
+ var Textarea = React.forwardRef(
10
+ ({ className, textSize = "sm", resize = "vertical", grow = false, font = "sans", height = "auto", ...props }, ref) => {
11
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
12
+ "textarea",
13
+ {
14
+ "data-slot": "textarea",
15
+ className: _chunkKWLSBTB2cjs.cn.call(void 0,
16
+ "flex min-h-[80px] w-full rounded-md border bg-background px-3 py-2 ring-offset-background placeholder:text-muted-foreground focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
17
+ // Entered text keeps the iOS-safe floor. The shared stylesheet sizes
18
+ // placeholder copy independently at the compact 14px base scale.
19
+ textSize === "sm" ? "text-[16px] md:text-sm" : "text-[16px] md:text-xs",
20
+ resize === "none" && "resize-none",
21
+ grow && "flex-1",
22
+ font === "mono" && "font-mono",
23
+ height === "panel" && "h-32",
24
+ height === "editor" && "h-72",
25
+ height === "editor-lg" && "h-80",
26
+ className
27
+ ),
28
+ ref,
29
+ ...props
30
+ }
31
+ );
32
+ }
33
+ );
34
+ Textarea.displayName = "Textarea";
35
+
36
+
37
+
38
+ exports.Textarea = Textarea;
@@ -0,0 +1,29 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
2
+
3
+
4
+ var _chunkKWLSBTB2cjs = require('./chunk-KWLSBTB2.cjs');
5
+
6
+ // src/primitives/action-dock.tsx
7
+ var _react = require('react');
8
+ var _jsxruntime = require('react/jsx-runtime');
9
+ var ActionDock = _react.forwardRef.call(void 0,
10
+ function ActionDock2({ shrink = true, className, ...props }, ref) {
11
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
12
+ "aside",
13
+ {
14
+ ref,
15
+ "data-slot": "action-dock",
16
+ className: _chunkKWLSBTB2cjs.cn.call(void 0,
17
+ "w-full border-t border-border bg-background/85 backdrop-blur-sm supports-backdrop-filter:bg-background/70 pb-[env(safe-area-inset-bottom)]",
18
+ !shrink && "shrink-0",
19
+ className
20
+ ),
21
+ ...props
22
+ }
23
+ );
24
+ }
25
+ );
26
+
27
+
28
+
29
+ exports.ActionDock = ActionDock;
@@ -0,0 +1,204 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }"use client";
2
+
3
+
4
+ var _chunkL4DH72UFcjs = require('./chunk-L4DH72UF.cjs');
5
+
6
+
7
+ var _chunkKWLSBTB2cjs = require('./chunk-KWLSBTB2.cjs');
8
+
9
+ // src/primitives/attachment.tsx
10
+ var _classvarianceauthority = require('class-variance-authority');
11
+ var _radixui = require('radix-ui');
12
+ var _jsxruntime = require('react/jsx-runtime');
13
+ var attachmentVariants = _classvarianceauthority.cva.call(void 0,
14
+ "cn-attachment group/attachment relative flex max-w-full min-w-0 shrink-0 flex-wrap border bg-card text-card-foreground transition-colors has-[>a,>button]:hover:bg-muted/50 data-[state=error]:border-destructive/30 data-[state=idle]:border-dashed",
15
+ {
16
+ variants: {
17
+ size: {
18
+ default: "cn-attachment-size-default",
19
+ sm: "cn-attachment-size-sm",
20
+ xs: "cn-attachment-size-xs"
21
+ },
22
+ orientation: {
23
+ horizontal: "cn-attachment-orientation-horizontal items-center",
24
+ vertical: "cn-attachment-orientation-vertical flex-col"
25
+ }
26
+ }
27
+ }
28
+ );
29
+ function Attachment({
30
+ className,
31
+ state = "done",
32
+ size = "default",
33
+ orientation = "horizontal",
34
+ ...props
35
+ }) {
36
+ const resolvedOrientation = _nullishCoalesce(orientation, () => ( "horizontal"));
37
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
38
+ "div",
39
+ {
40
+ "data-slot": "attachment",
41
+ "data-state": state,
42
+ "data-size": size,
43
+ "data-orientation": resolvedOrientation,
44
+ className: _chunkKWLSBTB2cjs.cn.call(void 0, attachmentVariants({ size, orientation }), className),
45
+ ...props
46
+ }
47
+ );
48
+ }
49
+ var attachmentMediaVariants = _classvarianceauthority.cva.call(void 0,
50
+ "cn-attachment-media relative flex aspect-square shrink-0 items-center justify-center overflow-hidden group-data-[state=error]/attachment:bg-destructive/10 group-data-[state=error]/attachment:text-destructive [&_svg]:pointer-events-none",
51
+ {
52
+ variants: {
53
+ variant: {
54
+ icon: "cn-attachment-media-variant-icon",
55
+ image: "cn-attachment-media-variant-image *:[img]:aspect-square *:[img]:w-full *:[img]:object-cover"
56
+ }
57
+ },
58
+ defaultVariants: {
59
+ variant: "icon"
60
+ }
61
+ }
62
+ );
63
+ function AttachmentMedia({
64
+ className,
65
+ variant = "icon",
66
+ ...props
67
+ }) {
68
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
69
+ "div",
70
+ {
71
+ "data-slot": "attachment-media",
72
+ "data-variant": variant,
73
+ className: _chunkKWLSBTB2cjs.cn.call(void 0, attachmentMediaVariants({ variant }), className),
74
+ ...props
75
+ }
76
+ );
77
+ }
78
+ function AttachmentContent({
79
+ className,
80
+ ...props
81
+ }) {
82
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
83
+ "div",
84
+ {
85
+ "data-slot": "attachment-content",
86
+ className: _chunkKWLSBTB2cjs.cn.call(void 0,
87
+ "cn-attachment-content max-w-full min-w-0 flex-1",
88
+ className
89
+ ),
90
+ ...props
91
+ }
92
+ );
93
+ }
94
+ function AttachmentTitle({
95
+ className,
96
+ ...props
97
+ }) {
98
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
99
+ "span",
100
+ {
101
+ "data-slot": "attachment-title",
102
+ className: _chunkKWLSBTB2cjs.cn.call(void 0,
103
+ "cn-attachment-title block max-w-full min-w-0 truncate group-data-[state=processing]/attachment:shimmer group-data-[state=uploading]/attachment:shimmer",
104
+ className
105
+ ),
106
+ ...props
107
+ }
108
+ );
109
+ }
110
+ function AttachmentDescription({
111
+ className,
112
+ ...props
113
+ }) {
114
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
115
+ "span",
116
+ {
117
+ "data-slot": "attachment-description",
118
+ className: _chunkKWLSBTB2cjs.cn.call(void 0,
119
+ "cn-attachment-description block min-w-0 truncate text-muted-foreground group-data-[state=error]/attachment:text-destructive/80",
120
+ "max-w-full",
121
+ className
122
+ ),
123
+ ...props
124
+ }
125
+ );
126
+ }
127
+ function AttachmentActions({
128
+ className,
129
+ ...props
130
+ }) {
131
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
132
+ "div",
133
+ {
134
+ "data-slot": "attachment-actions",
135
+ className: _chunkKWLSBTB2cjs.cn.call(void 0,
136
+ "cn-attachment-actions flex shrink-0 items-center",
137
+ className
138
+ ),
139
+ ...props
140
+ }
141
+ );
142
+ }
143
+ function AttachmentAction({
144
+ className,
145
+ variant,
146
+ size = "icon-xs",
147
+ ...props
148
+ }) {
149
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
150
+ _chunkL4DH72UFcjs.Button,
151
+ {
152
+ "data-slot": "attachment-action",
153
+ variant: _nullishCoalesce(variant, () => ( "ghost")),
154
+ size,
155
+ className: _chunkKWLSBTB2cjs.cn.call(void 0, "cn-attachment-action", className),
156
+ ...props
157
+ }
158
+ );
159
+ }
160
+ function AttachmentTrigger({
161
+ className,
162
+ asChild = false,
163
+ type,
164
+ ...props
165
+ }) {
166
+ const Comp = asChild ? _radixui.Slot.Root : "button";
167
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
168
+ Comp,
169
+ {
170
+ "data-slot": "attachment-trigger",
171
+ type: asChild ? void 0 : _nullishCoalesce(type, () => ( "button")),
172
+ className: _chunkKWLSBTB2cjs.cn.call(void 0,
173
+ "cn-attachment-trigger absolute inset-0 z-10 outline-none",
174
+ className
175
+ ),
176
+ ...props
177
+ }
178
+ );
179
+ }
180
+ function AttachmentGroup({ className, ...props }) {
181
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
182
+ "div",
183
+ {
184
+ "data-slot": "attachment-group",
185
+ className: _chunkKWLSBTB2cjs.cn.call(void 0,
186
+ "cn-attachment-group flex min-w-0 scroll-fade-x snap-x snap-mandatory scrollbar-none overflow-x-auto overscroll-x-contain *:data-[slot=attachment]:flex-none *:data-[slot=attachment]:snap-start",
187
+ className
188
+ ),
189
+ ...props
190
+ }
191
+ );
192
+ }
193
+
194
+
195
+
196
+
197
+
198
+
199
+
200
+
201
+
202
+
203
+
204
+ exports.Attachment = Attachment; exports.AttachmentMedia = AttachmentMedia; exports.AttachmentContent = AttachmentContent; exports.AttachmentTitle = AttachmentTitle; exports.AttachmentDescription = AttachmentDescription; exports.AttachmentActions = AttachmentActions; exports.AttachmentAction = AttachmentAction; exports.AttachmentTrigger = AttachmentTrigger; exports.AttachmentGroup = AttachmentGroup;
@@ -0,0 +1,29 @@
1
+ "use client";
2
+ import {
3
+ cn
4
+ } from "./chunk-G6SRSWXB.js";
5
+
6
+ // src/primitives/action-dock.tsx
7
+ import { forwardRef } from "react";
8
+ import { jsx } from "react/jsx-runtime";
9
+ var ActionDock = forwardRef(
10
+ function ActionDock2({ shrink = true, className, ...props }, ref) {
11
+ return /* @__PURE__ */ jsx(
12
+ "aside",
13
+ {
14
+ ref,
15
+ "data-slot": "action-dock",
16
+ className: cn(
17
+ "w-full border-t border-border bg-background/85 backdrop-blur-sm supports-backdrop-filter:bg-background/70 pb-[env(safe-area-inset-bottom)]",
18
+ !shrink && "shrink-0",
19
+ className
20
+ ),
21
+ ...props
22
+ }
23
+ );
24
+ }
25
+ );
26
+
27
+ export {
28
+ ActionDock
29
+ };
@@ -0,0 +1,38 @@
1
+ "use client";
2
+ import {
3
+ cn
4
+ } from "./chunk-G6SRSWXB.js";
5
+
6
+ // src/primitives/textarea.tsx
7
+ import * as React from "react";
8
+ import { jsx } from "react/jsx-runtime";
9
+ var Textarea = React.forwardRef(
10
+ ({ className, textSize = "sm", resize = "vertical", grow = false, font = "sans", height = "auto", ...props }, ref) => {
11
+ return /* @__PURE__ */ jsx(
12
+ "textarea",
13
+ {
14
+ "data-slot": "textarea",
15
+ className: cn(
16
+ "flex min-h-[80px] w-full rounded-md border bg-background px-3 py-2 ring-offset-background placeholder:text-muted-foreground focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
17
+ // Entered text keeps the iOS-safe floor. The shared stylesheet sizes
18
+ // placeholder copy independently at the compact 14px base scale.
19
+ textSize === "sm" ? "text-[16px] md:text-sm" : "text-[16px] md:text-xs",
20
+ resize === "none" && "resize-none",
21
+ grow && "flex-1",
22
+ font === "mono" && "font-mono",
23
+ height === "panel" && "h-32",
24
+ height === "editor" && "h-72",
25
+ height === "editor-lg" && "h-80",
26
+ className
27
+ ),
28
+ ref,
29
+ ...props
30
+ }
31
+ );
32
+ }
33
+ );
34
+ Textarea.displayName = "Textarea";
35
+
36
+ export {
37
+ Textarea
38
+ };