prompt-area 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +11 -3
  3. package/dist/action-bar/index.js +1 -4
  4. package/dist/chat-prompt-layout/index.js +1 -4
  5. package/dist/chunk-23Y7B365.js +2 -0
  6. package/dist/chunk-2DBBB352.js +3 -0
  7. package/dist/chunk-6VISE4VA.js +2 -0
  8. package/dist/chunk-AUCRB7HL.js +2 -0
  9. package/dist/chunk-CRC4ST6U.js +3 -0
  10. package/dist/chunk-VULUMPYE.js +2 -0
  11. package/dist/chunk-WBAKQRYT.js +20 -0
  12. package/dist/compact-prompt-area/index.js +1 -5
  13. package/dist/helpers/index.js +7 -291
  14. package/dist/index.js +1 -9
  15. package/dist/prompt-area/index.js +1 -5
  16. package/dist/status-bar/index.js +1 -4
  17. package/package.json +24 -12
  18. package/LICENSE +0 -21
  19. package/dist/action-bar/index.js.map +0 -1
  20. package/dist/chat-prompt-layout/index.js.map +0 -1
  21. package/dist/chunk-ANZZEZP2.js +0 -38
  22. package/dist/chunk-ANZZEZP2.js.map +0 -1
  23. package/dist/chunk-BPJO4DGM.js +0 -198
  24. package/dist/chunk-BPJO4DGM.js.map +0 -1
  25. package/dist/chunk-BWVBDP7C.js +0 -38
  26. package/dist/chunk-BWVBDP7C.js.map +0 -1
  27. package/dist/chunk-E7HUXORB.js +0 -2692
  28. package/dist/chunk-E7HUXORB.js.map +0 -1
  29. package/dist/chunk-NF2LHZIE.js +0 -12
  30. package/dist/chunk-NF2LHZIE.js.map +0 -1
  31. package/dist/chunk-UBBCAMJA.js +0 -116
  32. package/dist/chunk-UBBCAMJA.js.map +0 -1
  33. package/dist/chunk-XDKRP7UE.js +0 -125
  34. package/dist/chunk-XDKRP7UE.js.map +0 -1
  35. package/dist/compact-prompt-area/index.js.map +0 -1
  36. package/dist/helpers/index.js.map +0 -1
  37. package/dist/index.js.map +0 -1
  38. package/dist/prompt-area/index.js.map +0 -1
  39. package/dist/status-bar/index.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prompt-area",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
4
  "description": "An opinionated, dependency-light React rich-text prompt input with trigger-based chips (@mentions, /commands, #tags), inline markdown, undo/redo, file & image attachments, and a complete chat-input layout. Ships as an npm package or a shadcn registry.",
5
5
  "keywords": [
6
6
  "react",
@@ -29,7 +29,8 @@
29
29
  "**/*.css"
30
30
  ],
31
31
  "files": [
32
- "dist"
32
+ "dist",
33
+ "CHANGELOG.md"
33
34
  ],
34
35
  "exports": {
35
36
  ".": {
@@ -64,12 +65,31 @@
64
65
  "./tailwind.css": "./dist/tailwind.css",
65
66
  "./package.json": "./package.json"
66
67
  },
68
+ "scripts": {
69
+ "build": "pnpm run clean && pnpm run build:js && pnpm run build:css",
70
+ "build:js": "tsup && node ./scripts/preserve-directives.mjs",
71
+ "build:css": "tailwindcss --input ./src/styles.css --output ./dist/styles.css --minify && node ./scripts/build-preset.mjs",
72
+ "clean": "rm -rf dist",
73
+ "typecheck": "tsc --noEmit",
74
+ "lint:exports": "publint && attw --pack . --profile esm-only --exclude-entrypoints styles.css tailwind.css",
75
+ "prepublishOnly": "pnpm run build"
76
+ },
67
77
  "engines": {
68
78
  "node": ">=18"
69
79
  },
70
80
  "peerDependencies": {
71
81
  "react": ">=18",
72
- "react-dom": ">=18"
82
+ "react-dom": ">=18",
83
+ "tailwindcss": ">=4",
84
+ "tw-animate-css": ">=1"
85
+ },
86
+ "peerDependenciesMeta": {
87
+ "tailwindcss": {
88
+ "optional": true
89
+ },
90
+ "tw-animate-css": {
91
+ "optional": true
92
+ }
73
93
  },
74
94
  "dependencies": {
75
95
  "clsx": "^2.1.1",
@@ -90,13 +110,5 @@
90
110
  },
91
111
  "publishConfig": {
92
112
  "access": "public"
93
- },
94
- "scripts": {
95
- "build": "pnpm run clean && pnpm run build:js && pnpm run build:css",
96
- "build:js": "tsup && node ./scripts/preserve-directives.mjs",
97
- "build:css": "tailwindcss --input ./src/styles.css --output ./dist/styles.css --minify && node ./scripts/build-preset.mjs",
98
- "clean": "rm -rf dist",
99
- "typecheck": "tsc --noEmit",
100
- "lint:exports": "publint && attw --pack . --profile esm-only --exclude-entrypoints styles.css tailwind.css"
101
113
  }
102
- }
114
+ }
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2025 Ilko Kacharov
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
@@ -1,38 +0,0 @@
1
- 'use client';
2
- import { cn } from './chunk-NF2LHZIE.js';
3
- import { jsxs, jsx } from 'react/jsx-runtime';
4
-
5
- function StatusBar({
6
- left,
7
- right,
8
- className,
9
- disabled = false,
10
- "aria-label": ariaLabel,
11
- "data-test-id": dataTestId,
12
- ref
13
- }) {
14
- return /* @__PURE__ */ jsxs(
15
- "div",
16
- {
17
- ref,
18
- role: "group",
19
- "aria-label": ariaLabel ?? "Status bar",
20
- "aria-disabled": disabled || void 0,
21
- "data-test-id": dataTestId,
22
- className: cn(
23
- "status-bar",
24
- "flex items-center justify-between gap-2 px-3 py-1.5 text-xs",
25
- disabled && "pointer-events-none opacity-50",
26
- className
27
- ),
28
- children: [
29
- left && /* @__PURE__ */ jsx("div", { className: "flex items-center gap-1.5", children: left }),
30
- right && /* @__PURE__ */ jsx("div", { className: "ml-auto flex items-center gap-1.5", children: right })
31
- ]
32
- }
33
- );
34
- }
35
-
36
- export { StatusBar };
37
- //# sourceMappingURL=chunk-ANZZEZP2.js.map
38
- //# sourceMappingURL=chunk-ANZZEZP2.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/status-bar/status-bar.tsx"],"names":[],"mappings":";;;AAuBO,SAAS,SAAA,CAAU;AAAA,EACxB,IAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,YAAA,EAAc,SAAA;AAAA,EACd,cAAA,EAAgB,UAAA;AAAA,EAChB;AACF,CAAA,EAAyD;AACvD,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,IAAA,EAAK,OAAA;AAAA,MACL,cAAY,SAAA,IAAa,YAAA;AAAA,MACzB,iBAAe,QAAA,IAAY,MAAA;AAAA,MAC3B,cAAA,EAAc,UAAA;AAAA,MACd,SAAA,EAAW,EAAA;AAAA,QACT,YAAA;AAAA,QACA,6DAAA;AAAA,QACA,QAAA,IAAY,gCAAA;AAAA,QACZ;AAAA,OACF;AAAA,MACC,QAAA,EAAA;AAAA,QAAA,IAAA,oBAAQ,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAA6B,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,QACzD,KAAA,oBAAS,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAqC,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAAA,GACtE;AAEJ","file":"chunk-ANZZEZP2.js","sourcesContent":["'use client'\n\nimport { cn } from '@/lib/utils'\nimport type { StatusBarProps } from './types'\n\n/**\n * StatusBar - A horizontal bar with left and right slots.\n *\n * Designed to sit above or below a text input (e.g., PromptArea) to\n * display contextual information. Place it as a sibling before or\n * after the input inside a shared wrapper.\n *\n * @example\n * ```tsx\n * <div className=\"rounded-lg border\">\n * <StatusBar\n * left={<span>prompt-area</span>}\n * right={<span>Default</span>}\n * />\n * <PromptArea value={segments} onChange={setSegments} ... />\n * </div>\n * ```\n */\nexport function StatusBar({\n left,\n right,\n className,\n disabled = false,\n 'aria-label': ariaLabel,\n 'data-test-id': dataTestId,\n ref,\n}: StatusBarProps & { ref?: React.Ref<HTMLDivElement> }) {\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-label={ariaLabel ?? 'Status bar'}\n aria-disabled={disabled || undefined}\n data-test-id={dataTestId}\n className={cn(\n 'status-bar',\n 'flex items-center justify-between gap-2 px-3 py-1.5 text-xs',\n disabled && 'pointer-events-none opacity-50',\n className,\n )}>\n {left && <div className=\"flex items-center gap-1.5\">{left}</div>}\n {right && <div className=\"ml-auto flex items-center gap-1.5\">{right}</div>}\n </div>\n )\n}\n"]}
@@ -1,198 +0,0 @@
1
- 'use client';
2
- import { BLUR_DELAY_MS, PromptArea } from './chunk-E7HUXORB.js';
3
- import { cn } from './chunk-NF2LHZIE.js';
4
- import { useRef, useState, useImperativeHandle, useCallback } from 'react';
5
- import { jsx, jsxs } from 'react/jsx-runtime';
6
-
7
- function Svg({ className, children }) {
8
- return /* @__PURE__ */ jsx(
9
- "svg",
10
- {
11
- xmlns: "http://www.w3.org/2000/svg",
12
- width: "24",
13
- height: "24",
14
- viewBox: "0 0 24 24",
15
- fill: "none",
16
- stroke: "currentColor",
17
- strokeWidth: "2",
18
- strokeLinecap: "round",
19
- strokeLinejoin: "round",
20
- "aria-hidden": "true",
21
- className,
22
- children
23
- }
24
- );
25
- }
26
- var Plus = ({ className }) => /* @__PURE__ */ jsxs(Svg, { className, children: [
27
- /* @__PURE__ */ jsx("path", { d: "M5 12h14" }),
28
- /* @__PURE__ */ jsx("path", { d: "M12 5v14" })
29
- ] });
30
- var ArrowUp = ({ className }) => /* @__PURE__ */ jsxs(Svg, { className, children: [
31
- /* @__PURE__ */ jsx("path", { d: "m5 12 7-7 7 7" }),
32
- /* @__PURE__ */ jsx("path", { d: "M12 19V5" })
33
- ] });
34
- function CompactPromptArea({
35
- value,
36
- onChange,
37
- triggers,
38
- placeholder,
39
- disabled = false,
40
- markdown,
41
- onSubmit,
42
- onEscape,
43
- onChipClick,
44
- onChipAdd,
45
- onChipDelete,
46
- onPaste,
47
- images,
48
- onImagePaste,
49
- onImageRemove,
50
- files,
51
- onFileRemove,
52
- plusButtonIcon,
53
- onPlusClick,
54
- submitButtonIcon,
55
- beforeSubmitSlot,
56
- maxHeight = 320,
57
- className,
58
- "aria-label": ariaLabel,
59
- "data-test-id": dataTestId,
60
- ref
61
- }) {
62
- const promptRef = useRef(null);
63
- const containerRef = useRef(null);
64
- const [isFocused, setIsFocused] = useState(false);
65
- useImperativeHandle(ref, () => promptRef.current, []);
66
- const isEmpty = value.length === 0 || value.length === 1 && value[0].type === "text" && value[0].text === "";
67
- const isExpanded = isFocused || !isEmpty;
68
- const handleContainerFocus = useCallback(() => {
69
- setIsFocused(true);
70
- }, []);
71
- const handleContainerBlur = useCallback(() => {
72
- setTimeout(() => {
73
- if (!containerRef.current?.contains(document.activeElement)) {
74
- setIsFocused(false);
75
- }
76
- }, BLUR_DELAY_MS);
77
- }, []);
78
- const handleSubmit = useCallback(() => {
79
- onSubmit?.(value);
80
- }, [onSubmit, value]);
81
- return /* @__PURE__ */ jsx(
82
- "div",
83
- {
84
- ref: containerRef,
85
- onFocus: handleContainerFocus,
86
- onBlur: handleContainerBlur,
87
- "aria-label": ariaLabel,
88
- "data-test-id": dataTestId,
89
- className: cn(
90
- "compact-prompt-area",
91
- "bg-background border transition-all duration-200 ease-out",
92
- isExpanded ? "rounded-2xl" : "rounded-full",
93
- className
94
- ),
95
- children: /* @__PURE__ */ jsxs("div", { className: cn("flex", isExpanded ? "flex-col" : "items-center p-1.5"), children: [
96
- !isExpanded && /* @__PURE__ */ jsx(
97
- "button",
98
- {
99
- type: "button",
100
- onClick: onPlusClick,
101
- disabled,
102
- className: cn(
103
- "flex shrink-0 items-center justify-center rounded-xl transition-colors",
104
- "bg-muted text-muted-foreground size-9",
105
- "hover:bg-accent hover:text-foreground",
106
- "disabled:pointer-events-none disabled:opacity-50"
107
- ),
108
- "aria-label": "Add attachment",
109
- children: plusButtonIcon ?? /* @__PURE__ */ jsx(Plus, { className: "size-4" })
110
- }
111
- ),
112
- /* @__PURE__ */ jsx(
113
- "div",
114
- {
115
- className: cn("min-w-0 flex-1", isExpanded ? "px-5 pt-4 pb-2" : "overflow-hidden px-3"),
116
- onClick: () => promptRef.current?.focus(),
117
- children: /* @__PURE__ */ jsx(
118
- PromptArea,
119
- {
120
- ref: promptRef,
121
- value,
122
- onChange,
123
- triggers,
124
- placeholder,
125
- disabled,
126
- markdown,
127
- onSubmit: handleSubmit,
128
- onEscape,
129
- onChipClick,
130
- onChipAdd,
131
- onChipDelete,
132
- onPaste,
133
- images,
134
- onImagePaste,
135
- onImageRemove,
136
- files,
137
- onFileRemove,
138
- autoGrow: true,
139
- minHeight: isExpanded ? 48 : 24,
140
- maxHeight
141
- }
142
- )
143
- }
144
- ),
145
- /* @__PURE__ */ jsxs(
146
- "div",
147
- {
148
- className: cn(
149
- "flex shrink-0 items-center",
150
- isExpanded ? "justify-between px-3 pt-1 pb-3" : "gap-1.5"
151
- ),
152
- children: [
153
- isExpanded && /* @__PURE__ */ jsx(
154
- "button",
155
- {
156
- type: "button",
157
- onClick: onPlusClick,
158
- disabled,
159
- className: cn(
160
- "flex shrink-0 items-center justify-center rounded-xl transition-colors",
161
- "bg-muted text-muted-foreground size-9",
162
- "hover:bg-accent hover:text-foreground",
163
- "disabled:pointer-events-none disabled:opacity-50"
164
- ),
165
- "aria-label": "Add attachment",
166
- children: plusButtonIcon ?? /* @__PURE__ */ jsx(Plus, { className: "size-4" })
167
- }
168
- ),
169
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5", children: [
170
- beforeSubmitSlot,
171
- /* @__PURE__ */ jsx(
172
- "button",
173
- {
174
- type: "button",
175
- onClick: handleSubmit,
176
- disabled: disabled || isEmpty,
177
- className: cn(
178
- "flex shrink-0 items-center justify-center rounded-xl transition-colors",
179
- "bg-primary text-primary-foreground size-9",
180
- "hover:bg-primary/90",
181
- "disabled:pointer-events-none disabled:opacity-50"
182
- ),
183
- "aria-label": "Send message",
184
- children: submitButtonIcon ?? /* @__PURE__ */ jsx(ArrowUp, { className: "size-4" })
185
- }
186
- )
187
- ] })
188
- ]
189
- }
190
- )
191
- ] })
192
- }
193
- );
194
- }
195
-
196
- export { CompactPromptArea };
197
- //# sourceMappingURL=chunk-BPJO4DGM.js.map
198
- //# sourceMappingURL=chunk-BPJO4DGM.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/compact-prompt-area/compact-prompt-area.tsx"],"names":[],"mappings":"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","file":"chunk-BPJO4DGM.js","sourcesContent":["'use client'\n\nimport { useCallback, useImperativeHandle, useRef, useState } from 'react'\nimport { cn } from '@/lib/utils'\nimport { PromptArea } from '@/registry/new-york/blocks/prompt-area/prompt-area'\nimport { BLUR_DELAY_MS } from '@/registry/new-york/blocks/prompt-area/use-prompt-area-events'\nimport type { PromptAreaHandle } from '@/registry/new-york/blocks/prompt-area/types'\nimport type { CompactPromptAreaProps } from './types'\n\ntype IconProps = { className?: string }\n\n/** Shared SVG wrapper matching the lucide icon defaults (no dependency). */\nfunction Svg({ className, children }: IconProps & { children: React.ReactNode }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n className={className}>\n {children}\n </svg>\n )\n}\n\nconst Plus = ({ className }: IconProps) => (\n <Svg className={className}>\n <path d=\"M5 12h14\" />\n <path d=\"M12 5v14\" />\n </Svg>\n)\nconst ArrowUp = ({ className }: IconProps) => (\n <Svg className={className}>\n <path d=\"m5 12 7-7 7 7\" />\n <path d=\"M12 19V5\" />\n </Svg>\n)\n\n/**\n * CompactPromptArea – A pill-shaped prompt input that sits on a single row\n * and expands downward on focus.\n *\n * - Left: circular plus button\n * - Middle: PromptArea text input (expands down when focused)\n * - Right: optional slot + circular submit button\n *\n * Reuses PromptArea internally with autoGrow enabled.\n *\n * @example\n * ```tsx\n * <CompactPromptArea\n * value={segments}\n * onChange={setSegments}\n * placeholder=\"Ask anything...\"\n * onSubmit={handleSubmit}\n * onPlusClick={() => setMenuOpen(true)}\n * beforeSubmitSlot={<button aria-label=\"Voice\"><Mic className=\"size-4\" /></button>}\n * />\n * ```\n */\nexport function CompactPromptArea({\n value,\n onChange,\n triggers,\n placeholder,\n disabled = false,\n markdown,\n onSubmit,\n onEscape,\n onChipClick,\n onChipAdd,\n onChipDelete,\n onPaste,\n images,\n onImagePaste,\n onImageRemove,\n files,\n onFileRemove,\n plusButtonIcon,\n onPlusClick,\n submitButtonIcon,\n beforeSubmitSlot,\n maxHeight = 320,\n className,\n 'aria-label': ariaLabel,\n 'data-test-id': dataTestId,\n ref,\n}: CompactPromptAreaProps & { ref?: React.Ref<PromptAreaHandle> }) {\n const promptRef = useRef<PromptAreaHandle>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n const [isFocused, setIsFocused] = useState(false)\n\n useImperativeHandle(ref, () => promptRef.current!, [])\n\n const isEmpty =\n value.length === 0 || (value.length === 1 && value[0].type === 'text' && value[0].text === '')\n\n const isExpanded = isFocused || !isEmpty\n\n const handleContainerFocus = useCallback(() => {\n setIsFocused(true)\n }, [])\n\n const handleContainerBlur = useCallback(() => {\n setTimeout(() => {\n if (!containerRef.current?.contains(document.activeElement)) {\n setIsFocused(false)\n }\n }, BLUR_DELAY_MS)\n }, [])\n\n const handleSubmit = useCallback(() => {\n onSubmit?.(value)\n }, [onSubmit, value])\n\n return (\n <div\n ref={containerRef}\n onFocus={handleContainerFocus}\n onBlur={handleContainerBlur}\n aria-label={ariaLabel}\n data-test-id={dataTestId}\n className={cn(\n 'compact-prompt-area',\n 'bg-background border transition-all duration-200 ease-out',\n isExpanded ? 'rounded-2xl' : 'rounded-full',\n className,\n )}>\n <div className={cn('flex', isExpanded ? 'flex-col' : 'items-center p-1.5')}>\n {/* Plus button – left side in collapsed mode */}\n {!isExpanded && (\n <button\n type=\"button\"\n onClick={onPlusClick}\n disabled={disabled}\n className={cn(\n 'flex shrink-0 items-center justify-center rounded-xl transition-colors',\n 'bg-muted text-muted-foreground size-9',\n 'hover:bg-accent hover:text-foreground',\n 'disabled:pointer-events-none disabled:opacity-50',\n )}\n aria-label=\"Add attachment\">\n {plusButtonIcon ?? <Plus className=\"size-4\" />}\n </button>\n )}\n\n {/* Prompt area region */}\n <div\n className={cn('min-w-0 flex-1', isExpanded ? 'px-5 pt-4 pb-2' : 'overflow-hidden px-3')}\n onClick={() => promptRef.current?.focus()}>\n <PromptArea\n ref={promptRef}\n value={value}\n onChange={onChange}\n triggers={triggers}\n placeholder={placeholder}\n disabled={disabled}\n markdown={markdown}\n onSubmit={handleSubmit}\n onEscape={onEscape}\n onChipClick={onChipClick}\n onChipAdd={onChipAdd}\n onChipDelete={onChipDelete}\n onPaste={onPaste}\n images={images}\n onImagePaste={onImagePaste}\n onImageRemove={onImageRemove}\n files={files}\n onFileRemove={onFileRemove}\n autoGrow\n minHeight={isExpanded ? 48 : 24}\n maxHeight={maxHeight}\n />\n </div>\n\n {/* Button bar */}\n <div\n className={cn(\n 'flex shrink-0 items-center',\n isExpanded ? 'justify-between px-3 pt-1 pb-3' : 'gap-1.5',\n )}>\n {/* Plus button – bottom-left in expanded mode */}\n {isExpanded && (\n <button\n type=\"button\"\n onClick={onPlusClick}\n disabled={disabled}\n className={cn(\n 'flex shrink-0 items-center justify-center rounded-xl transition-colors',\n 'bg-muted text-muted-foreground size-9',\n 'hover:bg-accent hover:text-foreground',\n 'disabled:pointer-events-none disabled:opacity-50',\n )}\n aria-label=\"Add attachment\">\n {plusButtonIcon ?? <Plus className=\"size-4\" />}\n </button>\n )}\n\n {/* Right side: slot + submit */}\n <div className=\"flex items-center gap-1.5\">\n {beforeSubmitSlot}\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={disabled || isEmpty}\n className={cn(\n 'flex shrink-0 items-center justify-center rounded-xl transition-colors',\n 'bg-primary text-primary-foreground size-9',\n 'hover:bg-primary/90',\n 'disabled:pointer-events-none disabled:opacity-50',\n )}\n aria-label=\"Send message\">\n {submitButtonIcon ?? <ArrowUp className=\"size-4\" />}\n </button>\n </div>\n </div>\n </div>\n </div>\n )\n}\n"]}
@@ -1,38 +0,0 @@
1
- 'use client';
2
- import { cn } from './chunk-NF2LHZIE.js';
3
- import { jsxs, jsx } from 'react/jsx-runtime';
4
-
5
- function ActionBar({
6
- left,
7
- right,
8
- className,
9
- disabled = false,
10
- "aria-label": ariaLabel,
11
- "data-test-id": dataTestId,
12
- ref
13
- }) {
14
- return /* @__PURE__ */ jsxs(
15
- "div",
16
- {
17
- ref,
18
- role: "toolbar",
19
- "aria-label": ariaLabel ?? "Action bar",
20
- "aria-disabled": disabled || void 0,
21
- "data-test-id": dataTestId,
22
- className: cn(
23
- "action-bar",
24
- "flex items-center justify-between gap-2 pt-2",
25
- disabled && "pointer-events-none opacity-50",
26
- className
27
- ),
28
- children: [
29
- left && /* @__PURE__ */ jsx("div", { className: "flex items-center gap-1", children: left }),
30
- right && /* @__PURE__ */ jsx("div", { className: "ml-auto flex items-center gap-1", children: right })
31
- ]
32
- }
33
- );
34
- }
35
-
36
- export { ActionBar };
37
- //# sourceMappingURL=chunk-BWVBDP7C.js.map
38
- //# sourceMappingURL=chunk-BWVBDP7C.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/action-bar/action-bar.tsx"],"names":[],"mappings":";;;AAiCO,SAAS,SAAA,CAAU;AAAA,EACxB,IAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,YAAA,EAAc,SAAA;AAAA,EACd,cAAA,EAAgB,UAAA;AAAA,EAChB;AACF,CAAA,EAAyD;AACvD,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,IAAA,EAAK,SAAA;AAAA,MACL,cAAY,SAAA,IAAa,YAAA;AAAA,MACzB,iBAAe,QAAA,IAAY,MAAA;AAAA,MAC3B,cAAA,EAAc,UAAA;AAAA,MACd,SAAA,EAAW,EAAA;AAAA,QACT,YAAA;AAAA,QACA,8CAAA;AAAA,QACA,QAAA,IAAY,gCAAA;AAAA,QACZ;AAAA,OACF;AAAA,MACC,QAAA,EAAA;AAAA,QAAA,IAAA,oBAAQ,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EAA2B,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,QACvD,KAAA,oBAAS,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAmC,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAAA,GACpE;AAEJ","file":"chunk-BWVBDP7C.js","sourcesContent":["'use client'\n\nimport { cn } from '@/lib/utils'\nimport type { ActionBarProps } from './types'\n\n/**\n * ActionBar - A horizontal toolbar with left and right slots.\n *\n * Designed to sit below a text input (e.g., PromptArea) and stay\n * anchored via normal document flow. Place it as a sibling after\n * the input inside a shared wrapper.\n *\n * @example\n * ```tsx\n * <div className=\"rounded-lg border p-4\">\n * <PromptArea value={segments} onChange={setSegments} ... />\n * <ActionBar\n * left={\n * <>\n * <button><PlusCircle /></button>\n * <button><AtSign /></button>\n * </>\n * }\n * right={\n * <>\n * <button><Mic /></button>\n * <button onClick={handleSubmit}><ArrowUp /></button>\n * </>\n * }\n * />\n * </div>\n * ```\n */\nexport function ActionBar({\n left,\n right,\n className,\n disabled = false,\n 'aria-label': ariaLabel,\n 'data-test-id': dataTestId,\n ref,\n}: ActionBarProps & { ref?: React.Ref<HTMLDivElement> }) {\n return (\n <div\n ref={ref}\n role=\"toolbar\"\n aria-label={ariaLabel ?? 'Action bar'}\n aria-disabled={disabled || undefined}\n data-test-id={dataTestId}\n className={cn(\n 'action-bar',\n 'flex items-center justify-between gap-2 pt-2',\n disabled && 'pointer-events-none opacity-50',\n className,\n )}>\n {left && <div className=\"flex items-center gap-1\">{left}</div>}\n {right && <div className=\"ml-auto flex items-center gap-1\">{right}</div>}\n </div>\n )\n}\n"]}