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/CHANGELOG.md ADDED
@@ -0,0 +1,30 @@
1
+ # Changelog
2
+
3
+ All notable changes to the `prompt-area` package are documented here. This
4
+ project adheres to [Semantic Versioning](https://semver.org/).
5
+
6
+ ## 0.1.1
7
+
8
+ ### Changed
9
+
10
+ - **Much smaller package** — the published tarball dropped from ~109 kB to
11
+ ~37 kB (unpacked 513 kB → 135 kB). The build is now minified and no longer
12
+ ships source maps.
13
+ - `tailwindcss` (>= 4) is now declared as an **optional** peer dependency, for
14
+ consumers who use the `prompt-area/tailwind.css` preset. The prebuilt
15
+ `prompt-area/styles.css` still works with zero Tailwind setup.
16
+
17
+ ## 0.1.0
18
+
19
+ Initial release.
20
+
21
+ - `PromptArea` contentEditable rich-text input with trigger-based chips
22
+ (`@mentions`, `/commands`, `#tags`), inline markdown, undo/redo, URL
23
+ detection, list auto-formatting, IME support, and file & image attachments.
24
+ - Companion components: `ActionBar`, `StatusBar`, `CompactPromptArea`,
25
+ `ChatPromptLayout`.
26
+ - `usePromptAreaState` hook, trigger presets, and segment helpers.
27
+ - Server-safe helpers re-exported from `prompt-area/helpers`.
28
+ - Prebuilt `styles.css` (zero-config) and an optional Tailwind v4 preset.
29
+ - ESM, per-entry types, and tree-shakeable subpath exports.
30
+ - Zero runtime dependencies beyond `clsx` + `tailwind-merge`.
package/README.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # prompt-area
2
2
 
3
+ [![npm version](https://img.shields.io/npm/v/prompt-area.svg)](https://www.npmjs.com/package/prompt-area)
4
+ [![npm downloads](https://img.shields.io/npm/dm/prompt-area.svg)](https://www.npmjs.com/package/prompt-area)
5
+ [![license](https://img.shields.io/npm/l/prompt-area.svg)](https://github.com/just-marketing/prompt-area/blob/main/LICENSE)
6
+
3
7
  An opinionated, dependency-light React rich-text **prompt input** — trigger-based chips (`@mentions`, `/commands`, `#tags`), inline markdown, undo/redo, file & image attachments, and a complete chat-input layout.
4
8
 
5
9
  Ships **two ways** from the same source:
@@ -10,11 +14,12 @@ Ships **two ways** from the same source:
10
14
  ## Install
11
15
 
12
16
  ```bash
13
- npm install prompt-area
14
- # peer deps (most React apps already have these)
15
- npm install react react-dom
17
+ pnpm add prompt-area
18
+ # or: npm install prompt-area · yarn add prompt-area
16
19
  ```
17
20
 
21
+ `react` and `react-dom` are peer dependencies (most React apps already have them).
22
+
18
23
  ## Quick start
19
24
 
20
25
  ```tsx
@@ -106,6 +111,9 @@ The components are client components and carry a `'use client'` boundary, so you
106
111
  ## Dependencies
107
112
 
108
113
  - **Peer:** `react`, `react-dom` (>= 18)
114
+ - **Optional peer:** `tailwindcss` (>= 4) and `tw-animate-css` — only needed if
115
+ you use the `prompt-area/tailwind.css` preset. The prebuilt
116
+ `prompt-area/styles.css` needs neither.
109
117
  - **Runtime:** `clsx`, `tailwind-merge` — the two `cn` helpers, both already
110
118
  present in any shadcn/Tailwind project.
111
119
 
@@ -1,5 +1,2 @@
1
1
  'use client';
2
- export { ActionBar } from '../chunk-BWVBDP7C.js';
3
- import '../chunk-NF2LHZIE.js';
4
- //# sourceMappingURL=index.js.map
5
- //# sourceMappingURL=index.js.map
2
+ export{a as ActionBar}from'../chunk-VULUMPYE.js';import'../chunk-23Y7B365.js';
@@ -1,5 +1,2 @@
1
1
  'use client';
2
- export { ChatPromptLayout } from '../chunk-XDKRP7UE.js';
3
- import '../chunk-NF2LHZIE.js';
4
- //# sourceMappingURL=index.js.map
5
- //# sourceMappingURL=index.js.map
2
+ export{a as ChatPromptLayout}from'../chunk-CRC4ST6U.js';import'../chunk-23Y7B365.js';
@@ -0,0 +1,2 @@
1
+ 'use client';
2
+ import {clsx}from'clsx';import {twMerge}from'tailwind-merge';function s(...r){return twMerge(clsx(r))}export{s as a};
@@ -0,0 +1,3 @@
1
+ 'use client';
2
+ import {j,l}from'./chunk-WBAKQRYT.js';import {a}from'./chunk-23Y7B365.js';import {useRef,useState,useImperativeHandle,useCallback}from'react';import {jsx,jsxs}from'react/jsx-runtime';function y({className:t,children:s}){return jsx("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",className:t,children:s})}var v=({className:t})=>jsxs(y,{className:t,children:[jsx("path",{d:"M5 12h14"}),jsx("path",{d:"M12 5v14"})]}),q=({className:t})=>jsxs(y,{className:t,children:[jsx("path",{d:"m5 12 7-7 7 7"}),jsx("path",{d:"M12 19V5"})]});function J({value:t,onChange:s,triggers:P,placeholder:k,disabled:a$1=false,markdown:C,onSubmit:d,onEscape:N,onChipClick:A,onChipAdd:w,onChipDelete:R,onPaste:H,images:I,onImagePaste:S,onImageRemove:z,files:E,onFileRemove:F,plusButtonIcon:l$1,onPlusClick:p,submitButtonIcon:L,beforeSubmitSlot:M,maxHeight:j$1=320,className:B,"aria-label":D,"data-test-id":T,ref:U}){let i=useRef(null),m=useRef(null),[_,u]=useState(false);useImperativeHandle(U,()=>i.current,[]);let f=t.length===0||t.length===1&&t[0].type==="text"&&t[0].text==="",r=_||!f,G=useCallback(()=>{u(true);},[]),V=useCallback(()=>{setTimeout(()=>{m.current?.contains(document.activeElement)||u(false);},j);},[]),b=useCallback(()=>{d?.(t);},[d,t]);return jsx("div",{ref:m,onFocus:G,onBlur:V,"aria-label":D,"data-test-id":T,className:a("compact-prompt-area","bg-background border transition-all duration-200 ease-out",r?"rounded-2xl":"rounded-full",B),children:jsxs("div",{className:a("flex",r?"flex-col":"items-center p-1.5"),children:[!r&&jsx("button",{type:"button",onClick:p,disabled:a$1,className:a("flex shrink-0 items-center justify-center rounded-xl transition-colors","bg-muted text-muted-foreground size-9","hover:bg-accent hover:text-foreground","disabled:pointer-events-none disabled:opacity-50"),"aria-label":"Add attachment",children:l$1??jsx(v,{className:"size-4"})}),jsx("div",{className:a("min-w-0 flex-1",r?"px-5 pt-4 pb-2":"overflow-hidden px-3"),onClick:()=>i.current?.focus(),children:jsx(l,{ref:i,value:t,onChange:s,triggers:P,placeholder:k,disabled:a$1,markdown:C,onSubmit:b,onEscape:N,onChipClick:A,onChipAdd:w,onChipDelete:R,onPaste:H,images:I,onImagePaste:S,onImageRemove:z,files:E,onFileRemove:F,autoGrow:true,minHeight:r?48:24,maxHeight:j$1})}),jsxs("div",{className:a("flex shrink-0 items-center",r?"justify-between px-3 pt-1 pb-3":"gap-1.5"),children:[r&&jsx("button",{type:"button",onClick:p,disabled:a$1,className:a("flex shrink-0 items-center justify-center rounded-xl transition-colors","bg-muted text-muted-foreground size-9","hover:bg-accent hover:text-foreground","disabled:pointer-events-none disabled:opacity-50"),"aria-label":"Add attachment",children:l$1??jsx(v,{className:"size-4"})}),jsxs("div",{className:"flex items-center gap-1.5",children:[M,jsx("button",{type:"button",onClick:b,disabled:a$1||f,className:a("flex shrink-0 items-center justify-center rounded-xl transition-colors","bg-primary text-primary-foreground size-9","hover:bg-primary/90","disabled:pointer-events-none disabled:opacity-50"),"aria-label":"Send message",children:L??jsx(q,{className:"size-4"})})]})]})]})})}
3
+ export{J as a};
@@ -0,0 +1,2 @@
1
+ 'use client';
2
+ import {a}from'./chunk-23Y7B365.js';import {jsxs,jsx}from'react/jsx-runtime';function l({left:e,right:t,className:i,disabled:a$1=false,"aria-label":p,"data-test-id":o,ref:n}){return jsxs("div",{ref:n,role:"group","aria-label":p??"Status bar","aria-disabled":a$1||void 0,"data-test-id":o,className:a("status-bar","flex items-center justify-between gap-2 px-3 py-1.5 text-xs",a$1&&"pointer-events-none opacity-50",i),children:[e&&jsx("div",{className:"flex items-center gap-1.5",children:e}),t&&jsx("div",{className:"ml-auto flex items-center gap-1.5",children:t})]})}export{l as a};
@@ -0,0 +1,2 @@
1
+ 'use client';
2
+ import {a}from'./chunk-WBAKQRYT.js';import {useState,useRef,useMemo,useCallback}from'react';function C(e={}){let{initialValue:r=[]}=e,[t,s]=useState(r),n=useRef(null),a$1=useMemo(()=>a(t),[t]),m=useMemo(()=>t.length===0?true:t.every(i=>i.type==="text"&&i.text.trim()===""),[t]),c=useMemo(()=>t.some(i=>i.type==="chip"),[t]),l=useMemo(()=>t.filter(i=>i.type==="chip"),[t]),h=useMemo(()=>({ref:n,value:t,onChange:s}),[t]),T=useCallback(()=>{n.current?n.current.clear():s([]);},[]),u=useCallback(()=>n.current?.focus(),[]),x=useCallback(()=>n.current?.blur(),[]),f=useCallback(i=>n.current?.insertChip(i),[]);return {bind:h,plainText:a$1,isEmpty:m,hasChips:c,chips:l,clear:T,focus:u,blur:x,insertChip:f}}function d(e){return {type:"text",text:e}}function P(e){return {type:"chip",...e}}function O(e){return e.length===0?true:e.every(r=>r.type==="text"&&r.text.trim()==="")}function A(e){return e.some(r=>r.type==="chip")}function b(e){return e.filter(r=>r.type==="chip")}function v(e,r){return e.filter(t=>t.type==="chip"&&t.trigger===r)}function k(e={}){let{char:r="@",...t}=e;return {char:r,position:"any",mode:"dropdown",chipStyle:"pill",accessibilityLabel:"mention",...t}}function H(e={}){let{char:r="/",...t}=e;return {char:r,position:"start",mode:"dropdown",chipStyle:"inline",accessibilityLabel:"command",...t}}function M(e={}){let{char:r="#",...t}=e;return {char:r,position:"any",mode:"dropdown",chipStyle:"pill",resolveOnSpace:true,accessibilityLabel:"tag",...t}}function B(e){let{char:r,...t}=e;return {char:r,position:"start",mode:"callback",...t}}export{C as a,d as b,P as c,O as d,A as e,b as f,v as g,k as h,H as i,M as j,B as k};
@@ -0,0 +1,3 @@
1
+ 'use client';
2
+ import {a}from'./chunk-23Y7B365.js';import {useRef,useState,useCallback,useEffect}from'react';import {jsxs,jsx}from'react/jsx-runtime';var g=300,w=100;function y(){let t=useRef(null),[s,c]=useState(false),[i,u]=useState(false),n=useRef(0),r=useCallback(()=>{cancelAnimationFrame(n.current),n.current=requestAnimationFrame(()=>{let o=t.current;if(!o)return;let a=o.scrollTop,h=o.scrollHeight-a-o.clientHeight;c(d=>d?a>w:a>g),u(d=>d?h>w:h>g);});},[]);useEffect(()=>{let o=t.current;if(o)return o.addEventListener("scroll",r,{passive:true}),r(),()=>{o.removeEventListener("scroll",r),cancelAnimationFrame(n.current);}},[r]);let m=useCallback(()=>{t.current?.scrollTo({top:0,behavior:"smooth"});},[]),p=useCallback(()=>{let o=t.current;o&&o.scrollTo({top:o.scrollHeight,behavior:"smooth"});},[]);return {scrollRef:t,showGoToTop:s,showGoToBottom:i,scrollToTop:m,scrollToBottom:p}}var N="pointer-events-auto rounded-full border bg-background p-2 shadow-sm text-muted-foreground hover:bg-accent hover:text-foreground transition-colors animate-in fade-in-0 zoom-in-95 duration-150";function S({className:t,children:s}){return jsx("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",className:t,children:s})}var x=({className:t})=>jsxs(S,{className:t,children:[jsx("path",{d:"m5 12 7-7 7 7"}),jsx("path",{d:"M12 19V5"})]}),P=({className:t})=>jsxs(S,{className:t,children:[jsx("path",{d:"M12 5v14"}),jsx("path",{d:"m19 12-7 7-7-7"})]});function C({children:t,prompt:s,className:c,"aria-label":i,"data-test-id":u,ref:n}){let{scrollRef:r,showGoToTop:m,showGoToBottom:p,scrollToTop:o,scrollToBottom:a$1}=y();return jsxs("div",{ref:n,role:"region","aria-label":i??"Chat layout","data-test-id":u,className:a("chat-prompt-layout","flex h-full flex-col",c),children:[jsxs("div",{ref:r,className:"relative flex-1 overflow-y-auto",children:[t,jsxs("div",{className:"pointer-events-none sticky bottom-4 flex justify-end gap-2 px-4 pb-2",children:[m&&jsx("button",{type:"button",onClick:o,className:N,"aria-label":"Scroll to top",children:jsx(x,{className:"size-4"})}),p&&jsx("button",{type:"button",onClick:a$1,className:N,"aria-label":"Scroll to bottom",children:jsx(P,{className:"size-4"})})]})]}),jsx("div",{className:"shrink-0",children:s})]})}
3
+ export{C as a};
@@ -0,0 +1,2 @@
1
+ 'use client';
2
+ import {a}from'./chunk-23Y7B365.js';import {jsxs,jsx}from'react/jsx-runtime';function c({left:e,right:t,className:o,disabled:a$1=false,"aria-label":n,"data-test-id":s,ref:p}){return jsxs("div",{ref:p,role:"toolbar","aria-label":n??"Action bar","aria-disabled":a$1||void 0,"data-test-id":s,className:a("action-bar","flex items-center justify-between gap-2 pt-2",a$1&&"pointer-events-none opacity-50",o),children:[e&&jsx("div",{className:"flex items-center gap-1",children:e}),t&&jsx("div",{className:"ml-auto flex items-center gap-1",children:t})]})}export{c as a};
@@ -0,0 +1,20 @@
1
+ 'use client';
2
+ import {a}from'./chunk-23Y7B365.js';import {useRef,useState,useCallback,useEffect,useMemo,useImperativeHandle}from'react';import {jsxs,Fragment,jsx}from'react/jsx-runtime';function Y(e){return e.map(n=>n.type==="text"?n.text:`${n.trigger}${n.displayText}`).join("")}function vn(e){return e?[{type:"text",text:e}]:[]}function qe(e,n,o){if(n===0)return true;let t=e[n-1];return o==="start"?t===`
3
+ `:t===" "||t===`
4
+ `||t===" "}function st(e,n,o){if(!e||n===0||o.length===0)return null;for(let t=n-1;t>=0;t--){let r=e[t];if(r===" "||r===`
5
+ `||r===" "){if(t+1<n){let a=e[t+1],u=o.find(g=>g.char===a);if(u&&qe(e,t+1,u.position))return {config:u,startOffset:t+1,query:e.slice(t+2,n)}}return null}let s=o.find(a=>a.char===r);if(s&&qe(e,t,s.position))return {config:s,startOffset:t,query:e.slice(t+1,n)}}return null}function Be(e,n,o){let t=n.startOffset,r=t+1+n.query.length,s=[],a=0;for(let m of e)if(m.type==="chip"){let S=`${m.trigger}${m.displayText}`,v=a,f=a+S.length;(f<=t||v>=r)&&s.push(m),a=f;}else {let S=a,v=a+m.text.length;if(v<=t)s.push(m);else if(S>=r)s.push(m);else {let f=m.text.slice(0,Math.max(0,t-S)),b=m.text.slice(Math.min(m.text.length,r-S));f&&s.push({type:"text",text:f});let P={type:"chip",trigger:n.config.char,value:o.value,displayText:o.displayText,...o.data!==void 0?{data:o.data}:{},...o.autoResolved?{autoResolved:true}:{}};s.push(P),b?s.push({type:"text",text:" "+b.replace(/^\s/,"")}):s.push({type:"text",text:" "});}a=v;}let u=fe(s),g=-1,p=0;for(let m of u)m.type==="text"?p+=m.text.length:(p+=m.trigger.length+m.displayText.length,m.value===o.value&&m.displayText===o.displayText&&m.trigger===n.config.char&&(g=p));let T=g===-1?p:g+1;return {segments:u,cursorOffset:T}}function it(e,n){if(n<0||n>=e.length||e[n].type!=="chip")return e;let o=[...e.slice(0,n),...e.slice(n+1)];return fe(o)}function lt(e,n){if(n<0||n>=e.length)return null;let o=e[n];if(o.type!=="chip"||!o.autoResolved)return null;let t=`${o.trigger}${o.displayText}`,r=[...e.slice(0,n),{type:"text",text:t},...e.slice(n+1)];return {segments:fe(r),revertedText:t}}function at(e,n){let o=n.filter(s=>s.resolveOnSpace);if(o.length===0)return e;let t=new Set(o.map(s=>s.char)),r=[];for(let s of e){if(s.type==="chip"){r.push(s);continue}let a=Xt(s.text,o,t);r.push(...a);}return fe(r)}function Xt(e,n,o){if(!e)return [];let t=[],r=0;for(;r<e.length;){let s=e[r];if(o.has(s)&&(r===0||e[r-1]===" "||e[r-1]===`
6
+ `||e[r-1]===" ")){let g=n.find(p=>p.char===s);if(g&&qe(e,r,g.position)){let p=r+1;for(;p<e.length&&e[p]!==" "&&e[p]!==`
7
+ `&&e[p]!==" ";)p++;let T=e.slice(r+1,p);if(T.length>0){let m=g.onSelect?.({value:T,label:T})||T;t.push({type:"chip",trigger:s,value:T,displayText:m,autoResolved:true}),r=p;continue}}}let a=r;for(r++;r<e.length&&!(o.has(e[r])&&(e[r-1]===" "||e[r-1]===`
8
+ `||e[r-1]===" "));)r++;t.push({type:"text",text:e.slice(a,r)});}return t}function W(e,n,o,t){let r=[],s=0,a=false;for(let u of e)if(u.type==="chip"){let g=`${u.trigger}${u.displayText}`,p=s,T=s+g.length;!a&&n===o&&p===n&&(r.push({type:"text",text:t}),a=true),(T<=n||p>=o)&&r.push(u),s=T;}else {let g=s,p=s+u.text.length,T=n===o?p<n:p<=n,m=n===o?g>o:g>=o;if(T)r.push(u);else if(m)r.push(u);else {let S=u.text.slice(0,Math.max(0,n-g)),v=u.text.slice(Math.min(u.text.length,o-g));S&&r.push({type:"text",text:S}),!a&&g<=n&&(r.push({type:"text",text:t}),a=true),v&&r.push({type:"text",text:v});}s=p;}return !a&&t&&r.push({type:"text",text:t}),fe(r)}function ct(e,n,o,t){if(n===o)return null;let r=Y(e),s=t.length,a=n>=s&&r.slice(n-s,n)===t,u=o+s<=r.length&&r.slice(o,o+s)===t,g=a&&u;if(g&&s===1){let m=n>s?r[n-s-1]:"",S=o+s<r.length?r[o+s]:"";(m===t||S===t)&&(g=false);}if(g){let m=W(e,o,o+s,"");return {segments:W(m,n-s,n,""),selectionStart:n-s,selectionEnd:o-s}}let p=W(e,o,o,t);return {segments:W(p,n,n,t),selectionStart:n+s,selectionEnd:o+s}}function yn(e){if(!e)return [];let n=[],o=/(\*{3}(.+?)\*{3})|(\*{2}(.+?)\*{2})|(\*(.+?)\*)|(https?:\/\/[^\s),]+)/g,t=0,r;for(;(r=o.exec(e))!==null;)r.index>t&&n.push({type:"plain",text:e.slice(t,r.index)}),r[1]&&r[2]?n.push({type:"bold-italic",text:r[2]}):r[3]&&r[4]?n.push({type:"bold",text:r[4]}):r[5]&&r[6]?n.push({type:"italic",text:r[6]}):r[7]&&n.push({type:"url",text:r[7]}),t=r.index+r[0].length;return t<e.length&&n.push({type:"plain",text:e.slice(t)}),n}function ut(e,n){if(e===n)return true;if(e.length!==n.length)return false;for(let o=0;o<e.length;o++){let t=e[o],r=n[o];if(t.type!==r.type)return false;if(t.type==="text"){if(r.type!=="text"||t.text!==r.text)return false}else if(r.type!=="chip"||t.trigger!==r.trigger||t.value!==r.value||t.displayText!==r.displayText||t.autoResolved!==r.autoResolved)return false}return true}function fe(e){let n=[];for(let o of e){if(o.type==="text"&&o.text==="")continue;let t=n[n.length-1];o.type==="text"&&t?.type==="text"?n[n.length-1]={type:"text",text:t.text+o.text}:n.push(o);}return n}function ge(e,n){let o=e.lastIndexOf(`
9
+ `,n-1)+1,t=e.indexOf(`
10
+ `,n),r=e.slice(o,t===-1?e.length:t),s=r.match(/^(\s*)([•\-*]) /);if(s){let u=s[1];return {lineStart:o,prefix:s[0],indent:Math.floor(u.length/2),listType:"bullet",contentStart:o+s[0].length}}let a=r.match(/^(\s*)(\d+)\. /);if(a){let u=a[1];return {lineStart:o,prefix:a[0],indent:Math.floor(u.length/2),listType:"numbered",number:parseInt(a[2],10),contentStart:o+a[0].length}}return null}function dt(e,n){let o=Y(e),t=o.lastIndexOf(`
11
+ `,n-1)+1,r=o.slice(t,n),s=r.match(/^(\s*)[-*] $/);if(!s)return null;let u=`${s[1]}\u2022 `,g=t,p=t+r.length;return {segments:W(e,g,p,u),cursorOffset:t+u.length}}function ft(e,n){let o=Y(e),t=ge(o,n);if(!t)return null;let r=o.indexOf(`
12
+ `,n);if(o.slice(t.contentStart,r===-1?o.length:r).trim()==="")return {segments:W(e,t.lineStart,t.lineStart+t.prefix.length,""),cursorOffset:t.lineStart};let a=" ".repeat(t.indent),u;if(t.listType==="bullet")u=`${a}\u2022 `;else {let T=(t.number??1)+1;u=`${a}${T}. `;}let g=`
13
+ ${u}`;return {segments:W(e,n,n,g),cursorOffset:n+g.length}}function gt(e,n){let o=Y(e),t=ge(o,n);return t?{segments:W(e,t.lineStart,t.lineStart," "),cursorOffset:n+2}:null}function pt(e,n){let o=Y(e),t=ge(o,n);return !t||t.indent===0?null:{segments:W(e,t.lineStart,t.lineStart+2,""),cursorOffset:Math.max(t.lineStart,n-2)}}function mt(e,n){let o=Y(e),t=ge(o,n);return !t||n>t.contentStart?null:{segments:W(e,t.lineStart,t.contentStart," ".repeat(t.indent)),cursorOffset:t.lineStart+t.indent*2}}function je(e,n){let o=false,t=e.map(r=>{if(r.type!=="text")return r;let s=n?r.text.replace(/(^|\n)(\s*)- /g,"$1$2\u2022 "):r.text.replace(/(^|\n)(\s*)• /g,"$1$2- ");return s===r.text?r:(o=true,{...r,text:s})});return o?t:e}function te(e){return e instanceof HTMLElement}function B(e){return e instanceof HTMLElement&&e.dataset.chipTrigger!==void 0}function pe(e){return e instanceof HTMLBRElement}function vt(e){return e instanceof Text}function me(e){return B(e)&&e.dataset.chipAutoResolved==="true"}function yt(e){return e instanceof HTMLAnchorElement&&e.dataset.url==="true"}function Vt(e){try{return JSON.parse(e)}catch{return}}function $e(e){try{return JSON.stringify(e)}catch{return}}function Se(e){if(B(e))return e.dataset.chipTrigger}function Re(e){if(B(e))return e.dataset.chipValue}function Ce(e){if(B(e))return e.dataset.chipDisplay??e.textContent??void 0}function De(e){if(!B(e))return;let n=e.dataset.chipData;if(n)return Vt(n)}function Me(e,n){let o=e.childNodes;for(let t=0;t<o.length;t++)if(o[t]===n)return t;return -1}function we(e,n){let o=n;for(;o!==null;){if(o.parentNode===e)return o;o=o.parentNode;}return null}function qt(e,n){let o=document.createDocumentFragment();for(;n.firstChild;)o.appendChild(n.firstChild);o.appendChild(document.createElement("br")),e.replaceChild(o,n);}function Oe(e){let n=false,o=new Set(["DIV","P","SECTION","ARTICLE","BLOCKQUOTE"]);for(let t=e.childNodes.length-1;t>=0;t--){let r=e.childNodes[t];if(!(r instanceof HTMLElement)||r.dataset.chipTrigger!==void 0||r instanceof HTMLBRElement)continue;let s=r.tagName;if(o.has(s))qt(e,r),n=true;else if(s==="FONT"||s==="B"||s==="I"||s==="U"||s==="STRONG"||s==="EM"||s==="A"||s==="SPAN"){let a=r.textContent??"";a?e.replaceChild(document.createTextNode(a),r):e.removeChild(r),n=true;}}return e.normalize(),n}var ht=/https?:\/\/[^\s),]+/g;function Je(e){let n=false,o=[];for(let t=0;t<e.childNodes.length;t++){let r=e.childNodes[t];vt(r)&&r.textContent&&o.push(r);}for(let t of o){let r=t.textContent??"";ht.lastIndex=0;let s=[],a;for(;(a=ht.exec(r))!==null;){let m=a[0];for(;m.length>0&&/[.;:!?]$/.test(m);)m=m.slice(0,-1);m.length>0&&s.push({url:m,index:a.index});}if(s.length===0)continue;let u=t.parentNode;if(!u)continue;let g=[];for(let{url:m,index:S}of s)try{let v=new URL(m);(v.protocol==="http:"||v.protocol==="https:")&&g.push({url:m,href:v.href,index:S});}catch{}if(g.length===0)continue;n=true;let p=document.createDocumentFragment(),T=0;for(let{url:m,href:S,index:v}of g){v>T&&p.appendChild(document.createTextNode(r.slice(T,v)));let f=document.createElement("a");f.href=S,f.target="_blank",f.rel="noopener noreferrer",f.dataset.url="true",f.className="text-primary hover:text-primary/80 underline cursor-pointer",f.textContent=m,p.appendChild(f),T=v+m.length;}T<r.length&&p.appendChild(document.createTextNode(r.slice(T))),u.replaceChild(p,t);}return n}var xt=/(\*{3})(.+?)\*{3}|(\*{2})(.+?)\*{2}|(\*)(.+?)\*/g;function Ye(e){let n=false,o=[];for(let t=0;t<e.childNodes.length;t++){let r=e.childNodes[t];vt(r)&&r.textContent&&o.push(r);}for(let t of o){let r=t.textContent??"";xt.lastIndex=0;let s=[],a;for(;(a=xt.exec(r))!==null;)a[1]&&a[2]?s.push({fullMatch:a[0],marker:a[1],content:a[2],index:a.index,className:"font-bold italic"}):a[3]&&a[4]?s.push({fullMatch:a[0],marker:a[3],content:a[4],index:a.index,className:"font-bold"}):a[5]&&a[6]&&s.push({fullMatch:a[0],marker:a[5],content:a[6],index:a.index,className:"italic"});if(s.length===0)continue;n=true;let u=t.parentNode;if(!u)continue;let g=document.createDocumentFragment(),p=0;for(let{fullMatch:T,marker:m,content:S,index:v,className:f}of s){v>p&&g.appendChild(document.createTextNode(r.slice(p,v)));let b=document.createElement("span");b.dataset.md="true";let P=document.createElement("span");P.className="prompt-area-md-marker",P.textContent=m;let K=document.createElement("span");K.className=f,K.textContent=S;let $=document.createElement("span");$.className="prompt-area-md-marker",$.textContent=m,b.appendChild(P),b.appendChild(K),b.appendChild($),g.appendChild(b),p=v+T.length;}p<r.length&&g.appendChild(document.createTextNode(r.slice(p))),u.replaceChild(g,t);}return n}function X(){let e=window.getSelection();return !e||e.rangeCount===0?null:e.getRangeAt(0)}function Tt(e){let n=X();if(!n||!e.contains(n.startContainer))return null;let o=n.startContainer;if(o===e)return {nodeIndex:n.startOffset,offset:0};let t=we(e,o);return t?{nodeIndex:Me(e,t),offset:n.startOffset}:null}function St(e,n){let o=window.getSelection();if(!o)return;let t=e.childNodes;if(t.length===0)return;let r=document.createRange();if(n.nodeIndex>=t.length){let s=t[t.length-1];s.nodeType===Node.TEXT_NODE?r.setStart(s,(s.textContent??"").length):r.setStartAfter(s);}else {let s=t[n.nodeIndex];if(s.nodeType===Node.TEXT_NODE){let a=(s.textContent??"").length;r.setStart(s,Math.min(n.offset,a));}else r.setStartAfter(s);}r.collapse(true),o.removeAllRanges(),o.addRange(r);}function be(e){let n=X();if(!n||!e.contains(n.startContainer))return null;let o=document.createRange();return o.selectNodeContents(e),o.setEnd(n.startContainer,n.startOffset),Le(o)}function Ct(e,n){let o=ke(e,n);if(!o)return null;let t=document.createRange();return t.setStart(o.node,o.offset),t.collapse(true),t}function ne(e,n){let o=window.getSelection();if(!o)return;let t=ke(e,n);if(t){let s=document.createRange();s.setStart(t.node,t.offset),s.collapse(true),o.removeAllRanges(),o.addRange(s);return}let r=document.createRange();r.selectNodeContents(e),r.collapse(false),o.removeAllRanges(),o.addRange(r);}function Le(e){let n=e.cloneContents(),o=0,t=r=>{if(r.nodeType===Node.TEXT_NODE)o+=(r.textContent??"").length;else if(B(r)){let s=r.dataset.chipTrigger??"",a=r.dataset.chipDisplay??r.textContent??"";o+=s.length+a.length;}else if(te(r)&&r.tagName==="BR"){if(r.dataset.sentinel)return;o+=1;}else te(r)&&r.childNodes.forEach(t);};return n.childNodes.forEach(t),o}function Ue(e){let n=X();if(!n||!e.contains(n.startContainer))return null;let o=document.createRange();o.selectNodeContents(e),o.setEnd(n.startContainer,n.startOffset);let t=Le(o);if(n.collapsed)return {start:t,end:t};let r=document.createRange();r.selectNodeContents(e),r.setEnd(n.endContainer,n.endOffset);let s=Le(r);return {start:t,end:s}}function bt(e,n,o){let t=window.getSelection();if(!t)return;if(n===o){ne(e,n);return}let r=ke(e,n),s=ke(e,o);if(!r||!s)return;let a=document.createRange();a.setStart(r.node,r.offset),a.setEnd(s.node,s.offset),t.removeAllRanges(),t.addRange(a);}function ke(e,n){let o=n;for(let t=0;t<e.childNodes.length;t++){let r=e.childNodes[t];if(r.nodeType===Node.TEXT_NODE){let s=(r.textContent??"").length;if(o<=s)return {node:r,offset:o};o-=s;}else if(B(r)){let s=r.dataset.chipTrigger??"",a=r.dataset.chipDisplay??r.textContent??"",u=s.length+a.length;if(o<=u)return {node:e,offset:t+1};o-=u;}else if(pe(r)){if(r.dataset.sentinel)continue;if(o<=1)return {node:e,offset:t+1};o-=1;}else if(te(r)){let s=(r.textContent??"").length;if(o<=s){let a=ke(r,o);if(a)return a}o-=s;}}return {node:e,offset:e.childNodes.length}}function jt(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Et(e){let n="",o=t=>{if(t.nodeType===Node.TEXT_NODE)n+=t.textContent??"";else if(B(t)){let r=Se(t)??"",s=Ce(t)??"";n+=r+s;}else te(t)&&t.tagName==="BR"?n+=`
14
+ `:t.childNodes.forEach(o);};return e.childNodes.forEach(o),n}function Nt(e){let n=[],o=t=>{if(t.nodeType===Node.TEXT_NODE){let r=t.textContent??"";r&&n.push({type:"text",text:r});}else if(B(t)){let r=Se(t),s=Re(t),a=Ce(t),u=De(t),g=me(t);if(r&&s!==void 0&&a){let p={type:"chip",trigger:r,value:s,displayText:a,...u!==void 0?{data:u}:{},...g?{autoResolved:true}:{}};n.push(p);}}else te(t)&&t.tagName==="BR"?n.push({type:"text",text:`
15
+ `}):t.childNodes.forEach(o);};return e.childNodes.forEach(o),n}function Rt(e){try{let n=JSON.parse(e);if(!Array.isArray(n))return null;let o=[];for(let t of n){if(!jt(t))return null;if(t.type==="text"&&typeof t.text=="string")o.push({type:"text",text:t.text});else if(t.type==="chip"&&typeof t.trigger=="string"&&typeof t.value=="string"&&typeof t.displayText=="string"){let r={type:"chip",trigger:t.trigger,value:t.value,displayText:t.displayText,...t.data!==void 0?{data:t.data}:{},...t.autoResolved?{autoResolved:!0}:{}};o.push(r);}else return null}return o}catch{return null}}function Dt(e,n,o){let t=X();if(!t)return [...e,...n];let r=document.createRange();r.selectNodeContents(o),r.setEnd(t.startContainer,t.startOffset);let s=Le(r),a=[],u=0,g=false,p=()=>{g||(a.push(...n),g=true);};for(let T of e){if(T.type==="chip"){let S=T.trigger.length+T.displayText.length;u>=s&&p(),a.push(T),u+=S;continue}let m=u+T.text.length;if(m<=s)a.push(T);else if(u>=s)p(),a.push(T);else {let S=s-u,v=T.text.slice(0,S),f=T.text.slice(S);v&&a.push({type:"text",text:v}),p(),f&&a.push({type:"text",text:f});}u=m;}return p(),fe(a)}var Jt=100,Qe=150;function wt(e){let{editorRef:n,readSegmentsFromDOM:o,onChange:t,renderSegmentsToDOM:r,runTriggerDetection:s,dismissTrigger:a,triggers:u,onPaste:g,onUndo:p,onRedo:T,onChipAdd:m,onImagePaste:S}=e,v=useRef(false),f=useRef({undoStack:[],redoStack:[]}),b=useCallback(N=>{let w=f.current;w.undoStack.push(N),w.undoStack.length>Jt&&w.undoStack.shift(),w.redoStack=[];},[]),P=useCallback(()=>{f.current={undoStack:[],redoStack:[]};},[]),K=useCallback(N=>{N.preventDefault();let w=n.current;if(!w)return;let D=Array.from(N.clipboardData.files).find(O=>O.type.startsWith("image/"))??Array.from(N.clipboardData.items).find(_=>_.type.startsWith("image/"))?.getAsFile()??null;if(D){S?.(D);return}let L=o();b(L);let E=N.clipboardData.getData("text/prompt-area-segments");if(E){let O=Rt(E);if(O&&O.length>0){let _=X();if(!_)return;_.deleteContents();let ye=o(),ie=Dt(ye,O,w);t(ie),r(ie),g?.({segments:ie,source:"internal"});for(let ue of O)ue.type==="chip"&&m?.(ue);s();return}}let k=N.clipboardData.getData("text/plain");if(!k)return;let M=X();if(!M)return;M.deleteContents();let U=k.split(`
16
+ `),R=document.createDocumentFragment();for(let O=0;O<U.length;O++)U[O]&&R.appendChild(document.createTextNode(U[O])),O<U.length-1&&R.appendChild(document.createElement("br"));M.insertNode(R),M.collapse(false);let ce=window.getSelection();ce?.removeAllRanges(),ce?.addRange(M),Oe(w);let se=o(),ee=at(se,u);if(ee!==se){t(ee),r(ee);for(let O of ee)O.type==="chip"&&!se.some(_=>_.type==="chip"&&_.trigger===O.trigger&&_.value===O.value&&_.displayText===O.displayText)&&m?.(O);}else t(se);g?.({segments:ee,source:"external"}),s();},[n,o,t,b,s,r,u,g,m,S]),$=useCallback(N=>{N.preventDefault();let w=X();if(!w)return;let D=w.cloneContents(),L=Et(D);N.clipboardData.setData("text/plain",L);let E=Nt(D);if(E.some(M=>M.type==="chip")){let M=$e(E);M&&N.clipboardData.setData("text/prompt-area-segments",M);}},[]),I=useCallback(N=>{$(N);let w=X();if(!w)return;let D=o();b(D),w.deleteContents();let L=n.current;L&&Oe(L);let E=o();t(E),s();},[$,n,o,t,b,s]),V=useCallback(N=>{N.preventDefault();},[]),G=useCallback(N=>{N.preventDefault();},[]),xe=useCallback(()=>{v.current=true;},[]),ae=useCallback(()=>{v.current=false,s();},[s]),ve=useCallback(()=>{setTimeout(()=>{let N=n.current;if(!N)return;let w=document.activeElement;w&&N.parentElement?.contains(w)||a();},Qe);},[n,a]),oe=useCallback(N=>{if(!(N.metaKey||N.ctrlKey)||N.key!=="z")return false;N.preventDefault();let D=f.current;if(N.shiftKey){if(D.redoStack.length===0)return true;let L=D.redoStack.pop();if(!L)return true;let E=o();D.undoStack.push(E),t(L),r(L),T?.(L);}else {if(D.undoStack.length===0)return true;let L=D.undoStack.pop();if(!L)return true;let E=o();D.redoStack.push(E),t(L),r(L),p?.(L);}return true},[o,t,r,p,T]);return {handlePaste:K,handleCopy:$,handleCut:I,handleDrop:V,handleDragOver:G,handleCompositionStart:xe,handleCompositionEnd:ae,handleBlur:ve,handleKeyDownForUndoRedo:oe,pushUndo:b,resetUndoHistory:P,isComposing:v}}function Lt(){let[e,n]=useState([]),[o,t]=useState(false),[r,s]=useState(null),a=useRef(0),u=useRef(null),g=useRef(null),p=useCallback(()=>{u.current?.abort(),g.current&&clearTimeout(g.current),n([]),t(false),s(null);},[]),T=useCallback((m,S)=>{if(!S.onSearch)return;u.current?.abort(),g.current&&clearTimeout(g.current),t(true),s(null),a.current++;let v=a.current,f=new AbortController;u.current=f;let{onSearch:b,onSearchError:P,searchDebounceMs:K}=S,$=()=>{let I=b(m,{signal:f.signal});I instanceof Promise?I.then(V=>{f.signal.aborted||a.current!==v||(n(V),t(false));},V=>{f.signal.aborted||a.current!==v||V instanceof DOMException&&V.name==="AbortError"||(s(V instanceof Error?V.message:"Search failed"),t(false),P?.(V));}):(n(I),t(false));};K&&K>0&&m.length>0?g.current=setTimeout($,K):$();},[]);return useEffect(()=>()=>{u.current?.abort(),g.current&&clearTimeout(g.current);},[]),{suggestions:e,suggestionsLoading:o,suggestionsError:r,search:T,reset:p}}var Qt=300;function At({value:e,onChange:n,triggers:o=[],onSubmit:t,onEscape:r,onChipClick:s,onChipAdd:a$1,onChipDelete:u,onLinkClick:g,onPaste:p,onUndo:T,onRedo:m,onImagePaste:S,markdown:v=true}){let f=useRef(null),[b,P]=useState(null),[K,$]=useState(0),[I,V]=useState(null),{suggestions:G,suggestionsLoading:xe,suggestionsError:ae,search:ve,reset:oe}=Lt(),N=useRef(false),w=useRef([]),D=useRef(null),L=useRef(null),E=useCallback(()=>{let i=f.current;if(!i)return [];let h=[];for(let y=0;y<i.childNodes.length;y++){let l=i.childNodes[y];if(l.nodeType===Node.TEXT_NODE){let c=l.textContent??"";c&&h.push({type:"text",text:c});}else if(B(l)){let c=Se(l),d=Re(l),x=Ce(l),C=De(l);if(c&&d!==void 0&&x){let H=me(l);h.push({type:"chip",trigger:c,value:d,displayText:x,...C!==void 0?{data:C}:{},...H?{autoResolved:true}:{}});}}else if(pe(l)){if(l.dataset.sentinel)continue;h.push({type:"text",text:`
17
+ `});}else if(te(l)){let c=l.textContent??"";c&&h.push({type:"text",text:c});}}return h},[]),k=useCallback(i=>{let h=f.current;if(!h)return;N.current=true;let y=Tt(h);for(;h.firstChild;)h.removeChild(h.firstChild);for(let l of i)if(l.type==="text"){let c=l.text.split(`
18
+ `);for(let d=0;d<c.length;d++)c[d]&&h.appendChild(document.createTextNode(c[d])),d<c.length-1&&h.appendChild(document.createElement("br"));}else {let c=document.createElement("span");if(c.contentEditable="false",c.dataset.chipTrigger=l.trigger,c.dataset.chipValue=l.value,c.dataset.chipDisplay=l.displayText,l.data!==void 0){let C=$e(l.data);C&&(c.dataset.chipData=C);}l.autoResolved&&(c.dataset.chipAutoResolved="true");let d=o.find(C=>C.char===l.trigger),x=d?.chipStyle??"pill";c.dataset.chipStyle=x,c.className=a("prompt-area-chip",x==="inline"&&"prompt-area-chip--inline",d?.chipClassName),c.textContent=`${l.trigger}${l.displayText}`,c.setAttribute("role","button"),c.setAttribute("tabindex","-1"),h.appendChild(c);}if(h.lastChild&&pe(h.lastChild)){let l=document.createElement("br");l.dataset.sentinel="true",h.appendChild(l);}Je(h),v&&Ye(h),y&&St(h,y),w.current=i,N.current=false;},[o,v]),M=useCallback(()=>{let i=f.current;if(!i)return;let h=E(),y=Y(h),l=be(i);if(l===null)return;let c=st(y,l,o);if(c){P(c),$(0);let d=Ct(i,c.startOffset);if(d){let x=d.getBoundingClientRect();(x.height>0||x.left>0||x.top>0)&&V(x);}c.config.mode==="dropdown"&&c.config.onSearch&&ve(c.query,c.config),c.config.mode==="callback"&&c.config.onActivate&&c.config.onActivate({text:y,cursorPosition:l,insertChip:x=>{let C=Be(h,c,{value:x.value,displayText:x.displayText,data:x.data});n(C.segments),k(C.segments),a$1?.({type:"chip",trigger:c.config.char,value:x.value,displayText:x.displayText,...x.data!==void 0?{data:x.data}:{}});let H=f.current;H&&ne(H,C.cursorOffset);}});}else P(null),oe();},[o,E,n,k,a$1,oe,ve]),U=useCallback(()=>{P(null),$(0),oe();},[oe]),R=wt({editorRef:f,readSegmentsFromDOM:E,onChange:n,renderSegmentsToDOM:k,runTriggerDetection:M,dismissTrigger:U,triggers:o,onPaste:p,onUndo:T,onRedo:m,onChipAdd:a$1,onImagePaste:S});useEffect(()=>{if(!N.current&&!ut(e,w.current)){if(v){let i=je(e,true);if(i!==e){n(i);return}}k(e);}},[e,k,v,n]);let ce=useRef(v);useEffect(()=>{if(ce.current===v)return;ce.current=v;let i=je(e,v);i!==e?n(i):k(e);},[v,k,e,n]),useEffect(()=>()=>{D.current&&clearTimeout(D.current);},[]);let se=useCallback(()=>{if(N.current)return;if(R.isComposing.current){let l=E();w.current=l,n(l);return}let i=f.current,h=i?be(i):null;i&&Oe(i);let y=E();if(v&&i&&h!==null){let l=dt(y,h);if(l){w.current=l.segments,n(l.segments),k(l.segments),ne(i,l.cursorOffset),M();return}}L.current||(L.current=w.current),w.current=y,n(y),D.current&&clearTimeout(D.current),D.current=setTimeout(()=>{L.current&&(R.pushUndo(L.current),L.current=null),D.current=null;},Qt),i&&(Je(i),v&&Ye(i),h!==null&&ne(i,h)),M();},[n,E,M,k,v,R]),ee=useCallback(i=>{let h=i.target;if(!(h instanceof Node))return;let y=f.current;if(!y)return;let l=h;for(;l&&l!==y;){if(yt(l)){if(i.metaKey||i.ctrlKey){i.preventDefault(),g?.(l.href),window.open(l.href,"_blank","noopener,noreferrer");return}break}if(B(l)){let c=l,d=c.getBoundingClientRect(),x=document.createElement("span");x.className="prompt-area-chip-ripple";let C=Math.max(d.width,d.height);if(x.style.width=`${C}px`,x.style.height=`${C}px`,x.style.left=`${i.clientX-d.left-C/2}px`,x.style.top=`${i.clientY-d.top-C/2}px`,c.appendChild(x),x.addEventListener("animationend",()=>x.remove()),!s)return;let H=Se(l),z=Re(l),Ie=Ce(l),Ne=De(l);if(H&&z!==void 0&&Ie){let Fe=me(l),Q={type:"chip",trigger:H,value:z,displayText:Ie,...Ne!==void 0?{data:Ne}:{},...Fe?{autoResolved:true}:{}};s(Q);}return}l=l.parentNode;}},[s,g]),O=useCallback((i,h)=>{let y=E(),l=Me(i,h);if(l===-1)return false;let c=0;for(let C=0;C<l;C++){let H=i.childNodes[C];(H.nodeType===Node.TEXT_NODE&&(H.textContent??"")!==""||B(H)||pe(H))&&c++;}let d=y[c],x=it(y,c);return n(x),k(x),d?.type==="chip"&&u?.(d),true},[E,n,k,u]),_=useCallback((i,h)=>{let y=E(),l=Me(i,h);if(l===-1)return false;let c=0;for(let H=0;H<l;H++){let z=i.childNodes[H];(z.nodeType===Node.TEXT_NODE&&(z.textContent??"")!==""||B(z)||pe(z))&&c++;}let d=y[c],x=lt(y,c);if(!x)return false;let C=0;for(let H=0;H<c;H++){let z=y[H];z.type==="text"?C+=z.text.length:C+=z.trigger.length+z.displayText.length;}return C+=x.revertedText.length,n(x.segments),k(x.segments),ne(i,C),d?.type==="chip"&&u?.(d),true},[E,n,k,u]),ye=useCallback(()=>{let i=f.current;if(!i)return false;let h=X();if(!h||!h.collapsed)return false;let y=h.startContainer,l=h.startOffset;if(y===i&&l>0){let c=i.childNodes[l-1];if(c&&B(c))return me(c)?_(i,c):O(i,c)}if(y.nodeType===Node.TEXT_NODE&&l===0){let c=we(i,y);if(!c)return false;let d=c.previousSibling;for(;d&&d.nodeType===Node.TEXT_NODE&&d.textContent==="";)d=d.previousSibling;if(d&&B(d))return me(d)?_(i,d):O(i,d)}return false},[O,_]),ie=useCallback(()=>{let i=f.current;if(!i)return false;let h=X();if(!h||!h.collapsed)return false;let y=h.startContainer,l=h.startOffset;if(y===i&&l<i.childNodes.length){let c=i.childNodes[l];if(c&&B(c))return O(i,c)}if(y.nodeType===Node.TEXT_NODE&&l===(y.textContent??"").length){let c=we(i,y);if(!c)return false;let d=c.nextSibling;for(;d&&d.nodeType===Node.TEXT_NODE&&d.textContent==="";)d=d.nextSibling;if(d&&B(d))return O(i,d)}return false},[O]),ue=useCallback(i=>{let h=E(),y=i.query,l={value:y,label:y},c=i.config.onSelect?.(l)??y,d={value:y,displayText:c||y,autoResolved:true},x=Be(h,i,d);n(x.segments),k(x.segments),a$1?.({type:"chip",trigger:i.config.char,...d});let C=f.current;C&&ne(C,x.cursorOffset),U();},[E,n,k,U,a$1]),Te=useCallback(i=>{if(!b)return;let h=E(),y=b.config.onSelect?.(i)??i.label,l={value:i.value,displayText:y||i.label,data:i.data},c=Be(h,b,l);n(c.segments),k(c.segments),a$1?.({type:"chip",trigger:b.config.char,...l});let d=f.current;d&&ne(d,c.cursorOffset),U(),setTimeout(()=>{f.current?.focus();},0);},[b,E,n,k,U,a$1]),Xe=Te,J=useCallback(i=>{let h=(l,c)=>{w.current=c.segments,n(c.segments),k(c.segments),ne(l,c.cursorOffset);},y=l=>{if(!v)return false;let c=E(),d=be(l);if(d===null)return false;let x=Y(c);if(!ge(x,d))return false;let C=ft(c,d);return C&&h(l,C),true};if((i.metaKey||i.ctrlKey)&&i.key==="z"&&L.current&&(D.current&&(clearTimeout(D.current),D.current=null),R.pushUndo(L.current),L.current=null),!R.handleKeyDownForUndoRedo(i)){if(v&&(i.metaKey||i.ctrlKey)&&!i.shiftKey&&(i.key==="b"||i.key==="i")){i.preventDefault();let l=f.current;if(!l)return;let c=Ue(l);if(!c||c.start===c.end)return;let d=i.key==="b"?"**":"*",x=E();R.pushUndo(x);let C=ct(x,c.start,c.end,d);if(!C)return;w.current=C.segments,n(C.segments),k(C.segments),bt(l,C.selectionStart,C.selectionEnd);return}if(b&&b.config.mode==="dropdown"&&G.length>0){if(i.key==="ArrowDown"){i.preventDefault(),$(l=>Math.min(l+1,G.length-1));return}if(i.key==="ArrowUp"){i.preventDefault(),$(l=>Math.max(l-1,0));return}if(i.key==="Enter"||i.key==="Tab"){i.preventDefault();let l=G[K];l&&Te(l);return}if(i.key==="Escape"){i.preventDefault(),U();return}}if(i.key===" "&&b&&b.config.resolveOnSpace&&b.query.trim().length>0){i.preventDefault(),ue(b);return}if(v&&i.key==="Tab"&&!b){let l=f.current;if(l){let c=E(),d=Y(c),x=be(l);if(x!==null&&ge(d,x)){i.preventDefault();let H=i.shiftKey?pt(c,x):gt(c,x);H&&h(l,H);return}}}if(i.key==="Enter"&&i.shiftKey&&!i.nativeEvent.isComposing){i.preventDefault();let l=f.current;if(l){if(y(l))return;let c=Ue(l);if(c){let d=E();R.pushUndo(d);let x=W(d,c.start,c.end,`
19
+ `);h(l,{segments:x,cursorOffset:c.start+1});}}return}if(i.key==="Enter"&&!i.shiftKey&&!i.nativeEvent.isComposing){let l=f.current;if(l&&y(l)){i.preventDefault();return}if(t){i.preventDefault(),t(E());return}}if(i.key==="Escape"&&r){r();return}if((i.key==="Backspace"||i.key==="Delete")&&!i.nativeEvent.isComposing){let l=f.current;if(l){let c=Ue(l);if(c&&c.start!==c.end){i.preventDefault();let d=E();R.pushUndo(d);let x=W(d,c.start,c.end,"");h(l,{segments:x,cursorOffset:c.start}),M();return}}}if(i.key==="Backspace"){let l=f.current;if(l){let c=E(),d=be(l);if(v&&d!==null){let x=mt(c,d);if(x){i.preventDefault(),h(l,x),M();return}}}if(ye()){i.preventDefault(),M();return}}if(i.key==="Delete"&&ie()){i.preventDefault(),M();return}}},[b,G,K,t,r,E,n,k,v,U,ye,ie,ue,M,Te,R]),q=useMemo(()=>({focus:()=>f.current?.focus(),blur:()=>f.current?.blur(),insertChip:i=>{let h=E(),y={type:"chip",...i},l=[...h,y,{type:"text",text:" "}];n(l),k(l),a$1?.(y);},getPlainText:()=>Y(E()),clear:()=>{n([]);let i=f.current;if(i)for(;i.firstChild;)i.removeChild(i.firstChild);R.resetUndoHistory(),D.current&&(clearTimeout(D.current),D.current=null),L.current=null;}}),[E,n,k,a$1,R]),Pe=useMemo(()=>({onPaste:R.handlePaste,onCopy:R.handleCopy,onCut:R.handleCut,onDrop:R.handleDrop,onDragOver:R.handleDragOver,onCompositionStart:R.handleCompositionStart,onCompositionEnd:R.handleCompositionEnd,onBlur:R.handleBlur}),[R.handlePaste,R.handleCopy,R.handleCut,R.handleDrop,R.handleDragOver,R.handleCompositionStart,R.handleCompositionEnd,R.handleBlur]);return {editorRef:f,activeTrigger:b,suggestions:G,suggestionsLoading:xe,suggestionsError:ae,selectedSuggestionIndex:K,handleInput:se,handleKeyDown:J,handleClick:ee,selectSuggestion:Xe,dismissTrigger:U,handle:q,triggerRect:I,eventHandlers:Pe}}function Ft({suggestions:e,loading:n,error:o,emptyMessage:t,selectedIndex:r,onSelect:s,onDismiss:a$1,triggerRect:u,triggerChar:g}){let p=useRef(null),T=useRef(null);if(useEffect(()=>{T.current?.scrollIntoView({block:"nearest"});},[r]),useEffect(()=>{let f=b=>{let P=b.target;p.current&&P instanceof Node&&!p.current.contains(P)&&a$1();};return document.addEventListener("mousedown",f),()=>document.removeEventListener("mousedown",f)},[a$1]),!u||e.length===0&&!n&&!o&&!t)return null;let m=Math.min(320,window.innerWidth-16),S=Math.min(u.left,window.innerWidth-m-8),v={position:"fixed",left:`${Math.max(8,S)}px`,top:`${u.bottom+4}px`,zIndex:50,maxWidth:`${m}px`};return jsx("div",{ref:p,className:a("max-h-[240px] min-w-[200px] overflow-y-auto","bg-popover rounded-xl border p-2 shadow-md","animate-in fade-in-0 zoom-in-95"),style:v,role:"listbox","aria-label":`${g} suggestions`,children:n?jsx("div",{role:"option","aria-selected":false,className:"text-muted-foreground px-3 py-2 text-sm",children:"Loading suggestions..."}):o?jsx("div",{role:"option","aria-selected":false,className:"text-destructive px-3 py-2 text-sm",children:o}):e.length===0&&t?jsx("div",{role:"option","aria-selected":false,className:"text-muted-foreground px-3 py-2 text-sm",children:t}):e.map((f,b)=>jsxs("button",{ref:b===r?T:void 0,type:"button",role:"option","aria-selected":b===r,className:a("text-foreground flex w-full items-start gap-2 rounded-lg px-3 py-2 text-left text-sm","hover:bg-accent cursor-pointer transition-colors",b===r&&"bg-accent"),onMouseDown:P=>{P.preventDefault(),s(f);},children:[f.icon&&jsx("span",{className:"mt-0.5 shrink-0",children:f.icon}),jsxs("div",{className:"min-w-0 flex-1",children:[jsx("div",{className:"truncate font-medium",children:f.label}),f.description&&jsx("div",{className:"text-muted-foreground truncate text-xs",children:f.description})]})]},f.value))})}function $t({texts:e,interval:n=3e3}){let[o,t]=useState(0);return useEffect(()=>{if(e.length<=1)return;let r=setInterval(()=>{t(s=>(s+1)%e.length);},n);return ()=>clearInterval(r)},[e.length,n]),jsx("div",{className:"pointer-events-none absolute top-0 left-0 overflow-hidden text-sm leading-relaxed select-none",style:{color:"var(--prompt-area-placeholder, var(--muted-foreground))"},"aria-hidden":"true",children:jsx("div",{className:"animate-in fade-in-0 slide-in-from-top-4 duration-300 ease-in-out",children:e[o]},o)})}function Ke({onClick:e,label:n,className:o}){return jsx("button",{type:"button",onClick:t=>{t.stopPropagation(),e();},className:a("absolute top-0.5 right-0.5 grid h-3.5 w-3.5 cursor-pointer place-items-center","rounded-full bg-black/60 text-white hover:bg-black/80 dark:bg-white/60 dark:text-black dark:hover:bg-white/80","transition-colors",o),"aria-label":n,children:jsxs("svg",{width:"8",height:"8",viewBox:"0 0 10 10",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",children:[jsx("line",{x1:"2.75",y1:"2.75",x2:"7.25",y2:"7.25"}),jsx("line",{x1:"7.25",y1:"2.75",x2:"2.75",y2:"7.25"})]})})}function Ut({images:e,onRemove:n,onClick:o,className:t}){return e.length===0?null:jsx("div",{className:a("flex flex-wrap gap-2",t),role:"list","aria-label":"Attached images",children:e.map(r=>jsxs("div",{role:"listitem",className:a("border-border relative h-16 w-16 flex-shrink-0 overflow-hidden rounded-md border",o&&"cursor-pointer"),onClick:()=>o?.(r),children:[jsx("img",{src:r.url,alt:r.alt??"Attached image",className:"h-full w-full object-cover"}),r.loading&&jsx("div",{className:"absolute inset-0 flex items-center justify-center bg-black/40",children:jsx("div",{className:"h-4 w-4 animate-spin rounded-full border-2 border-white border-t-transparent"})}),n&&jsx(Ke,{onClick:()=>n(r),label:`Remove ${r.alt??"image"}`})]},r.id))})}function He({className:e,children:n}){return jsx("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",className:e,children:n})}var ze=jsxs(Fragment,{children:[jsx("path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z"}),jsx("path",{d:"M14 2v5a1 1 0 0 0 1 1h5"})]}),on=({className:e})=>jsx(He,{className:e,children:ze}),sn=({className:e})=>jsxs(He,{className:e,children:[ze,jsx("path",{d:"M10 9H8"}),jsx("path",{d:"M16 13H8"}),jsx("path",{d:"M16 17H8"})]}),ln=({className:e})=>jsxs(He,{className:e,children:[ze,jsx("path",{d:"M8 13h2"}),jsx("path",{d:"M14 13h2"}),jsx("path",{d:"M8 17h2"}),jsx("path",{d:"M14 17h2"})]}),an=({className:e})=>jsxs(He,{className:e,children:[ze,jsx("path",{d:"M10 12.5 8 15l2 2.5"}),jsx("path",{d:"m14 12.5 2 2.5-2 2.5"})]}),cn=({className:e})=>jsxs(He,{className:e,children:[jsx("rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2"}),jsx("circle",{cx:"9",cy:"9",r:"2"}),jsx("path",{d:"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21"})]}),_e=3;function un(e){return e?e==="application/pdf"?"pdf":e.includes("spreadsheet")||e==="text/csv"?"spreadsheet":e.startsWith("text/")||e.includes("javascript")||e.includes("json")||e.includes("xml")?"code":e.startsWith("image/")?"image":"default":"default"}var dn={pdf:sn,spreadsheet:ln,code:an,image:cn,default:on};function fn(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:e<1024*1024*1024?`${(e/(1024*1024)).toFixed(1)} MB`:`${(e/(1024*1024*1024)).toFixed(1)} GB`}function gn(e){let n=e.lastIndexOf(".");return n===-1||n===e.length-1?null:e.slice(n+1).toUpperCase()}function _t({file:e,compact:n,onRemove:o,onClick:t}){let r=gn(e.name),s=e.size!=null?fn(e.size):null,a$1=[r,s].filter(Boolean).join(" \xB7 ");return jsxs("div",{role:"listitem",className:a("border-border relative flex flex-shrink-0 items-center gap-2 overflow-hidden rounded-lg border transition-colors","hover:bg-accent",n?"h-10 w-36 px-2":"h-14 w-48 px-3",t&&"cursor-pointer"),onClick:()=>t?.(e),children:[(()=>{let u=dn[un(e.type)];return jsx(u,{className:a("text-muted-foreground flex-shrink-0",n?"h-4 w-4":"h-5 w-5")})})(),jsxs("div",{className:"min-w-0 flex-1",children:[jsx("div",{className:a("truncate font-medium",n?"text-xs":"text-sm"),title:e.name,children:e.name}),!n&&a$1&&jsx("div",{className:"text-muted-foreground truncate text-xs",children:a$1})]}),e.loading&&jsx("div",{className:"absolute inset-0 flex items-center justify-center bg-black/40",children:jsx("div",{className:"h-4 w-4 animate-spin rounded-full border-2 border-white border-t-transparent"})}),o&&jsx(Ke,{onClick:()=>o(e),label:`Remove ${e.name}`})]})}function zt({files:e,onRemove:n,onClick:o,className:t}){let[r,s]=useState(false),a$1=useRef(null),u=useRef(null);if(useEffect(()=>{if(!r)return;let S=v=>{let f=v.target;a$1.current&&!a$1.current.contains(f)&&!u.current?.contains(f)&&s(false);};return document.addEventListener("mousedown",S),()=>document.removeEventListener("mousedown",S)},[r]),e.length===0)return null;let g=e.length>_e,p=g,T=e.length-_e,m=e.slice(0,_e);return jsxs("div",{className:a("relative",t),children:[jsxs("div",{className:"flex flex-wrap gap-2",role:"list","aria-label":"Attached files",children:[(g?m:e).map(S=>jsx(_t,{file:S,compact:p,onRemove:n,onClick:o},S.id)),g&&jsx("div",{role:"listitem",children:jsx("button",{ref:u,type:"button",onClick:()=>s(S=>!S),className:a("border-border text-muted-foreground hover:bg-accent flex flex-shrink-0 cursor-pointer items-center justify-center rounded-lg border transition-colors",p?"h-10 px-3 text-xs":"h-14 px-4 text-sm"),children:r?"Show less":`+${T} more`})})]}),r&&jsx("div",{ref:a$1,className:a("bg-popover border-border absolute bottom-full left-0 z-10 mb-2 max-h-48 overflow-y-auto rounded-lg border p-2 shadow-lg"),children:jsx("div",{className:"flex flex-wrap gap-2",role:"list","aria-label":"More attached files",children:e.slice(_e).map(S=>jsx(_t,{file:S,compact:p,onRemove:n,onClick:o},S.id))})})]})}function yr({value:e,onChange:n,triggers:o,placeholder:t,className:r,disabled:s=false,markdown:a$1,onSubmit:u,onEscape:g,onChipClick:p,onChipAdd:T,onChipDelete:m,onLinkClick:S,onPaste:v,onUndo:f,onRedo:b,minHeight:P=80,maxHeight:K,autoFocus:$=false,autoGrow:I=false,"aria-label":V,"data-test-id":G,images:xe=[],imagePosition:ae="above",onImagePaste:ve,onImageRemove:oe,onImageClick:N,files:w=[],filePosition:D="above",onFileRemove:L,onFileClick:E,ref:k}){let{editorRef:M,activeTrigger:U,suggestions:R,suggestionsLoading:ce,suggestionsError:se,selectedSuggestionIndex:ee,handleInput:O,handleKeyDown:_,handleClick:ye,selectSuggestion:ie,dismissTrigger:ue,handle:Te,triggerRect:Xe,eventHandlers:J}=At({value:e,onChange:n,triggers:o,onSubmit:u,onEscape:g,onChipClick:p,onChipAdd:T,onChipDelete:m,onLinkClick:S,onPaste:v,onUndo:f,onRedo:b,onImagePaste:ve,markdown:a$1});useImperativeHandle(k,()=>Te,[Te]),useEffect(()=>{$&&M.current?.focus();},[$,M]);let[q,Pe]=useState(false),[i,h]=useState(void 0),y=useCallback(()=>{let Q=M.current;if(!Q)return;Q.style.height="auto";let de=Q.scrollHeight;Q.style.height=`${de}px`,h(de);},[M]),l=useCallback(()=>{I&&(Pe(true),y());},[I,y]),c=useCallback(()=>{J.onBlur(),I&&setTimeout(()=>{let Q=M.current;if(!Q)return;let de=document.activeElement;de&&Q.parentElement?.contains(de)||(Pe(false),h(void 0));},Qe);},[J,I,M]),d=useCallback(()=>{O(),I&&q&&y();},[O,I,q,y]);useEffect(()=>{I&&q&&requestAnimationFrame(()=>y());},[e,I,q,y]);let[x,C]=useState(false),H=useRef(null);useEffect(()=>{if(!I)return;let Q=()=>{if(q){C(false);return}let Ve=M.current;Ve&&C(Ve.scrollHeight>Ve.clientHeight);},de=q?0:160;return H.current=setTimeout(Q,de),()=>{H.current!==null&&clearTimeout(H.current);}},[I,q,e,M]);let z=useMemo(()=>I?{height:q&&i?`${i}px`:`${P}px`,minHeight:`${P}px`,maxHeight:"70dvh",overflowY:q?"auto":"hidden",transition:"height 150ms ease-out"}:{minHeight:`${P}px`,...K?{maxHeight:`${K}px`,overflowY:"auto"}:{}},[I,P,K,q,i]),Ie=e.length===0||e.length===1&&e[0].type==="text"&&e[0].text==="",Ne=xe.length>0?jsx(Ut,{images:xe,onRemove:oe,onClick:N,className:ae==="above"?"pb-2":"pt-2"}):null,Fe=w.length>0?jsx(zt,{files:w,onRemove:L,onClick:E,className:D==="above"?"pb-2":"pt-2"}):null;return jsxs("div",{className:a("prompt-area-container relative",r),children:[ae==="above"&&Ne,D==="above"&&Fe,jsxs("div",{className:"relative",children:[jsx("div",{ref:M,contentEditable:!s,suppressContentEditableWarning:true,role:"textbox","aria-label":V??"Text input","aria-multiline":"true","aria-disabled":s||void 0,"data-test-id":G,className:a("prompt-area-editor","w-full min-w-0 break-words whitespace-pre-wrap outline-none","text-sm leading-relaxed",s&&"cursor-not-allowed opacity-50"),style:z,onFocus:l,onInput:I?d:O,onKeyDown:_,onClick:ye,onPaste:J.onPaste,onCopy:J.onCopy,onCut:J.onCut,onDrop:J.onDrop,onDragOver:J.onDragOver,onCompositionStart:J.onCompositionStart,onCompositionEnd:J.onCompositionEnd,onBlur:I?c:J.onBlur}),I&&x&&!q&&jsx("div",{"aria-hidden":"true",className:"pointer-events-auto absolute right-0 bottom-0 left-0 cursor-pointer",style:{height:"32px"},onClick:()=>M.current?.focus(),children:jsx("div",{className:"h-full w-full",style:{background:"linear-gradient(to bottom, transparent, color-mix(in srgb, var(--prompt-area-surface, var(--background)) 80%, transparent), var(--prompt-area-surface, var(--background)))"}})}),Ie&&t&&(Array.isArray(t)?jsx($t,{texts:t}):jsx("div",{className:"pointer-events-none absolute top-0 left-0 text-sm leading-relaxed select-none",style:{color:"var(--prompt-area-placeholder, var(--muted-foreground))"},"aria-hidden":"true",children:t}))]}),D==="below"&&Fe,ae==="below"&&Ne,U&&U.config.mode==="dropdown"&&jsx(Ft,{suggestions:R,loading:ce,error:se,emptyMessage:U.config.emptyMessage,selectedIndex:ee,onSelect:ie,onDismiss:ue,triggerRect:Xe,triggerChar:U.config.char})]})}
20
+ export{Y as a,vn as b,qe as c,st as d,Be as e,at as f,yn as g,ut as h,fe as i,Qe as j,At as k,yr as l};
@@ -1,6 +1,2 @@
1
1
  'use client';
2
- export { CompactPromptArea } from '../chunk-BPJO4DGM.js';
3
- import '../chunk-E7HUXORB.js';
4
- import '../chunk-NF2LHZIE.js';
5
- //# sourceMappingURL=index.js.map
6
- //# sourceMappingURL=index.js.map
2
+ export{a as CompactPromptArea}from'../chunk-2DBBB352.js';import'../chunk-WBAKQRYT.js';import'../chunk-23Y7B365.js';
@@ -1,291 +1,7 @@
1
- // src/prompt-area/prompt-area-engine.ts
2
- function segmentsToPlainText(segments) {
3
- return segments.map((seg) => {
4
- if (seg.type === "text") return seg.text;
5
- return `${seg.trigger}${seg.displayText}`;
6
- }).join("");
7
- }
8
- function plainTextToSegments(text2) {
9
- if (!text2) return [];
10
- return [{ type: "text", text: text2 }];
11
- }
12
- function isValidTriggerPosition(text2, charIndex, position) {
13
- if (charIndex === 0) return true;
14
- const prevChar = text2[charIndex - 1];
15
- if (position === "start") {
16
- return prevChar === "\n";
17
- }
18
- return prevChar === " " || prevChar === "\n" || prevChar === " ";
19
- }
20
- function detectActiveTrigger(text2, cursorPos, triggers) {
21
- if (!text2 || cursorPos === 0 || triggers.length === 0) return null;
22
- for (let i = cursorPos - 1; i >= 0; i--) {
23
- const char = text2[i];
24
- if (char === " " || char === "\n" || char === " ") {
25
- if (i + 1 < cursorPos) {
26
- const nextChar = text2[i + 1];
27
- const matchingTrigger2 = triggers.find((t) => t.char === nextChar);
28
- if (matchingTrigger2 && isValidTriggerPosition(text2, i + 1, matchingTrigger2.position)) {
29
- return {
30
- config: matchingTrigger2,
31
- startOffset: i + 1,
32
- query: text2.slice(i + 2, cursorPos)
33
- };
34
- }
35
- }
36
- return null;
37
- }
38
- const matchingTrigger = triggers.find((t) => t.char === char);
39
- if (matchingTrigger && isValidTriggerPosition(text2, i, matchingTrigger.position)) {
40
- return {
41
- config: matchingTrigger,
42
- startOffset: i,
43
- query: text2.slice(i + 1, cursorPos)
44
- };
45
- }
46
- }
47
- return null;
48
- }
49
- function resolveChip(segments, activeTrigger, chip2) {
50
- const triggerStart = activeTrigger.startOffset;
51
- const triggerEnd = triggerStart + 1 + activeTrigger.query.length;
52
- const newSegments = [];
53
- let offset = 0;
54
- for (const seg of segments) {
55
- if (seg.type === "chip") {
56
- const chipText = `${seg.trigger}${seg.displayText}`;
57
- const chipStart = offset;
58
- const chipEnd = offset + chipText.length;
59
- if (chipEnd <= triggerStart || chipStart >= triggerEnd) {
60
- newSegments.push(seg);
61
- }
62
- offset = chipEnd;
63
- } else {
64
- const textStart = offset;
65
- const textEnd = offset + seg.text.length;
66
- if (textEnd <= triggerStart) {
67
- newSegments.push(seg);
68
- } else if (textStart >= triggerEnd) {
69
- newSegments.push(seg);
70
- } else {
71
- const beforeText = seg.text.slice(0, Math.max(0, triggerStart - textStart));
72
- const afterText = seg.text.slice(Math.min(seg.text.length, triggerEnd - textStart));
73
- if (beforeText) {
74
- newSegments.push({ type: "text", text: beforeText });
75
- }
76
- const newChip = {
77
- type: "chip",
78
- trigger: activeTrigger.config.char,
79
- value: chip2.value,
80
- displayText: chip2.displayText,
81
- ...chip2.data !== void 0 ? { data: chip2.data } : {},
82
- ...chip2.autoResolved ? { autoResolved: true } : {}
83
- };
84
- newSegments.push(newChip);
85
- if (afterText) {
86
- newSegments.push({ type: "text", text: " " + afterText.replace(/^\s/, "") });
87
- } else {
88
- newSegments.push({ type: "text", text: " " });
89
- }
90
- }
91
- offset = textEnd;
92
- }
93
- }
94
- const merged = mergeAdjacentTextSegments(newSegments);
95
- let lastChipEndOffset = -1;
96
- let runningOffset = 0;
97
- for (const seg of merged) {
98
- if (seg.type === "text") {
99
- runningOffset += seg.text.length;
100
- } else {
101
- runningOffset += seg.trigger.length + seg.displayText.length;
102
- if (seg.value === chip2.value && seg.displayText === chip2.displayText && seg.trigger === activeTrigger.config.char) {
103
- lastChipEndOffset = runningOffset;
104
- }
105
- }
106
- }
107
- const cursorOffset = lastChipEndOffset === -1 ? runningOffset : lastChipEndOffset + 1;
108
- return { segments: merged, cursorOffset };
109
- }
110
- function resolveTriggersInSegments(segments, triggers) {
111
- const autoResolveTriggers = triggers.filter((t) => t.resolveOnSpace);
112
- if (autoResolveTriggers.length === 0) return segments;
113
- const triggerChars = new Set(autoResolveTriggers.map((t) => t.char));
114
- const result = [];
115
- for (const seg of segments) {
116
- if (seg.type === "chip") {
117
- result.push(seg);
118
- continue;
119
- }
120
- const parts = splitTextByTriggerPatterns(seg.text, autoResolveTriggers, triggerChars);
121
- result.push(...parts);
122
- }
123
- return mergeAdjacentTextSegments(result);
124
- }
125
- function splitTextByTriggerPatterns(text2, triggers, triggerChars) {
126
- if (!text2) return [];
127
- const segments = [];
128
- let i = 0;
129
- while (i < text2.length) {
130
- const char = text2[i];
131
- if (triggerChars.has(char)) {
132
- const isAtBoundary = i === 0 || text2[i - 1] === " " || text2[i - 1] === "\n" || text2[i - 1] === " ";
133
- if (isAtBoundary) {
134
- const trigger = triggers.find((t) => t.char === char);
135
- if (trigger && isValidTriggerPosition(text2, i, trigger.position)) {
136
- let end = i + 1;
137
- while (end < text2.length && text2[end] !== " " && text2[end] !== "\n" && text2[end] !== " ") {
138
- end++;
139
- }
140
- const query = text2.slice(i + 1, end);
141
- if (query.length > 0) {
142
- const displayText = trigger.onSelect?.({ value: query, label: query }) || query;
143
- segments.push({
144
- type: "chip",
145
- trigger: char,
146
- value: query,
147
- displayText,
148
- autoResolved: true
149
- });
150
- i = end;
151
- continue;
152
- }
153
- }
154
- }
155
- }
156
- const start = i;
157
- i++;
158
- while (i < text2.length && !(triggerChars.has(text2[i]) && (text2[i - 1] === " " || text2[i - 1] === "\n" || text2[i - 1] === " "))) {
159
- i++;
160
- }
161
- segments.push({ type: "text", text: text2.slice(start, i) });
162
- }
163
- return segments;
164
- }
165
- function parseInlineMarkdown(text2) {
166
- if (!text2) return [];
167
- const tokens = [];
168
- const pattern = /(\*{3}(.+?)\*{3})|(\*{2}(.+?)\*{2})|(\*(.+?)\*)|(https?:\/\/[^\s),]+)/g;
169
- let lastIndex = 0;
170
- let match;
171
- while ((match = pattern.exec(text2)) !== null) {
172
- if (match.index > lastIndex) {
173
- tokens.push({ type: "plain", text: text2.slice(lastIndex, match.index) });
174
- }
175
- if (match[1] && match[2]) {
176
- tokens.push({ type: "bold-italic", text: match[2] });
177
- } else if (match[3] && match[4]) {
178
- tokens.push({ type: "bold", text: match[4] });
179
- } else if (match[5] && match[6]) {
180
- tokens.push({ type: "italic", text: match[6] });
181
- } else if (match[7]) {
182
- tokens.push({ type: "url", text: match[7] });
183
- }
184
- lastIndex = match.index + match[0].length;
185
- }
186
- if (lastIndex < text2.length) {
187
- tokens.push({ type: "plain", text: text2.slice(lastIndex) });
188
- }
189
- return tokens;
190
- }
191
- function segmentsEqual(a, b) {
192
- if (a === b) return true;
193
- if (a.length !== b.length) return false;
194
- for (let i = 0; i < a.length; i++) {
195
- const sa = a[i];
196
- const sb = b[i];
197
- if (sa.type !== sb.type) return false;
198
- if (sa.type === "text") {
199
- if (sb.type !== "text" || sa.text !== sb.text) return false;
200
- } else {
201
- if (sb.type !== "chip" || sa.trigger !== sb.trigger || sa.value !== sb.value || sa.displayText !== sb.displayText || sa.autoResolved !== sb.autoResolved)
202
- return false;
203
- }
204
- }
205
- return true;
206
- }
207
- function mergeAdjacentTextSegments(segments) {
208
- const result = [];
209
- for (const seg of segments) {
210
- if (seg.type === "text" && seg.text === "") continue;
211
- const last = result[result.length - 1];
212
- if (seg.type === "text" && last?.type === "text") {
213
- result[result.length - 1] = { type: "text", text: last.text + seg.text };
214
- } else {
215
- result.push(seg);
216
- }
217
- }
218
- return result;
219
- }
220
-
221
- // src/prompt-area/segment-helpers.ts
222
- function text(value) {
223
- return { type: "text", text: value };
224
- }
225
- function chip(opts) {
226
- return { type: "chip", ...opts };
227
- }
228
- function isSegmentsEmpty(segments) {
229
- if (segments.length === 0) return true;
230
- return segments.every((seg) => seg.type === "text" && seg.text.trim() === "");
231
- }
232
- function hasChips(segments) {
233
- return segments.some((seg) => seg.type === "chip");
234
- }
235
- function getChips(segments) {
236
- return segments.filter((seg) => seg.type === "chip");
237
- }
238
- function getChipsByTrigger(segments, trigger) {
239
- return segments.filter(
240
- (seg) => seg.type === "chip" && seg.trigger === trigger
241
- );
242
- }
243
-
244
- // src/prompt-area/trigger-presets.ts
245
- function mentionTrigger(opts = {}) {
246
- const { char = "@", ...rest } = opts;
247
- return {
248
- char,
249
- position: "any",
250
- mode: "dropdown",
251
- chipStyle: "pill",
252
- accessibilityLabel: "mention",
253
- ...rest
254
- };
255
- }
256
- function commandTrigger(opts = {}) {
257
- const { char = "/", ...rest } = opts;
258
- return {
259
- char,
260
- position: "start",
261
- mode: "dropdown",
262
- chipStyle: "inline",
263
- accessibilityLabel: "command",
264
- ...rest
265
- };
266
- }
267
- function hashtagTrigger(opts = {}) {
268
- const { char = "#", ...rest } = opts;
269
- return {
270
- char,
271
- position: "any",
272
- mode: "dropdown",
273
- chipStyle: "pill",
274
- resolveOnSpace: true,
275
- accessibilityLabel: "tag",
276
- ...rest
277
- };
278
- }
279
- function callbackTrigger(opts) {
280
- const { char, ...rest } = opts;
281
- return {
282
- char,
283
- position: "start",
284
- mode: "callback",
285
- ...rest
286
- };
287
- }
288
-
289
- export { callbackTrigger, chip, commandTrigger, detectActiveTrigger, getChips, getChipsByTrigger, hasChips, hashtagTrigger, isSegmentsEmpty, isValidTriggerPosition, mentionTrigger, mergeAdjacentTextSegments, parseInlineMarkdown, plainTextToSegments, resolveChip, resolveTriggersInSegments, segmentsEqual, segmentsToPlainText, text };
290
- //# sourceMappingURL=index.js.map
291
- //# sourceMappingURL=index.js.map
1
+ function d(e){return e.map(t=>t.type==="text"?t.text:`${t.trigger}${t.displayText}`).join("")}function S(e){return e?[{type:"text",text:e}]:[]}function m(e,t,r){if(t===0)return true;let i=e[t-1];return r==="start"?i===`
2
+ `:i===" "||i===`
3
+ `||i===" "}function C(e,t,r){if(!e||t===0||r.length===0)return null;for(let i=t-1;i>=0;i--){let n=e[i];if(n===" "||n===`
4
+ `||n===" "){if(i+1<t){let s=e[i+1],a=r.find(l=>l.char===s);if(a&&m(e,i+1,a.position))return {config:a,startOffset:i+1,query:e.slice(i+2,t)}}return null}let g=r.find(s=>s.char===n);if(g&&m(e,i,g.position))return {config:g,startOffset:i,query:e.slice(i+1,t)}}return null}function b(e,t,r){let i=t.startOffset,n=i+1+t.query.length,g=[],s=0;for(let o of e)if(o.type==="chip"){let u=`${o.trigger}${o.displayText}`,h=s,f=s+u.length;(f<=i||h>=n)&&g.push(o),s=f;}else {let u=s,h=s+o.text.length;if(h<=i)g.push(o);else if(u>=n)g.push(o);else {let f=o.text.slice(0,Math.max(0,i-u)),T=o.text.slice(Math.min(o.text.length,n-u));f&&g.push({type:"text",text:f});let y={type:"chip",trigger:t.config.char,value:r.value,displayText:r.displayText,...r.data!==void 0?{data:r.data}:{},...r.autoResolved?{autoResolved:true}:{}};g.push(y),T?g.push({type:"text",text:" "+T.replace(/^\s/,"")}):g.push({type:"text",text:" "});}s=h;}let a=x(g),l=-1,p=0;for(let o of a)o.type==="text"?p+=o.text.length:(p+=o.trigger.length+o.displayText.length,o.value===r.value&&o.displayText===r.displayText&&o.trigger===t.config.char&&(l=p));let c=l===-1?p:l+1;return {segments:a,cursorOffset:c}}function O(e,t){let r=t.filter(g=>g.resolveOnSpace);if(r.length===0)return e;let i=new Set(r.map(g=>g.char)),n=[];for(let g of e){if(g.type==="chip"){n.push(g);continue}let s=v(g.text,r,i);n.push(...s);}return x(n)}function v(e,t,r){if(!e)return [];let i=[],n=0;for(;n<e.length;){let g=e[n];if(r.has(g)&&(n===0||e[n-1]===" "||e[n-1]===`
5
+ `||e[n-1]===" ")){let l=t.find(p=>p.char===g);if(l&&m(e,n,l.position)){let p=n+1;for(;p<e.length&&e[p]!==" "&&e[p]!==`
6
+ `&&e[p]!==" ";)p++;let c=e.slice(n+1,p);if(c.length>0){let o=l.onSelect?.({value:c,label:c})||c;i.push({type:"chip",trigger:g,value:c,displayText:o,autoResolved:true}),n=p;continue}}}let s=n;for(n++;n<e.length&&!(r.has(e[n])&&(e[n-1]===" "||e[n-1]===`
7
+ `||e[n-1]===" "));)n++;i.push({type:"text",text:e.slice(s,n)});}return i}function w(e){if(!e)return [];let t=[],r=/(\*{3}(.+?)\*{3})|(\*{2}(.+?)\*{2})|(\*(.+?)\*)|(https?:\/\/[^\s),]+)/g,i=0,n;for(;(n=r.exec(e))!==null;)n.index>i&&t.push({type:"plain",text:e.slice(i,n.index)}),n[1]&&n[2]?t.push({type:"bold-italic",text:n[2]}):n[3]&&n[4]?t.push({type:"bold",text:n[4]}):n[5]&&n[6]?t.push({type:"italic",text:n[6]}):n[7]&&t.push({type:"url",text:n[7]}),i=n.index+n[0].length;return i<e.length&&t.push({type:"plain",text:e.slice(i)}),t}function A(e,t){if(e===t)return true;if(e.length!==t.length)return false;for(let r=0;r<e.length;r++){let i=e[r],n=t[r];if(i.type!==n.type)return false;if(i.type==="text"){if(n.type!=="text"||i.text!==n.text)return false}else if(n.type!=="chip"||i.trigger!==n.trigger||i.value!==n.value||i.displayText!==n.displayText||i.autoResolved!==n.autoResolved)return false}return true}function x(e){let t=[];for(let r of e){if(r.type==="text"&&r.text==="")continue;let i=t[t.length-1];r.type==="text"&&i?.type==="text"?t[t.length-1]={type:"text",text:i.text+r.text}:t.push(r);}return t}function M(e){return {type:"text",text:e}}function k(e){return {type:"chip",...e}}function P(e){return e.length===0?true:e.every(t=>t.type==="text"&&t.text.trim()==="")}function R(e){return e.some(t=>t.type==="chip")}function $(e){return e.filter(t=>t.type==="chip")}function B(e,t){return e.filter(r=>r.type==="chip"&&r.trigger===t)}function I(e={}){let{char:t="@",...r}=e;return {char:t,position:"any",mode:"dropdown",chipStyle:"pill",accessibilityLabel:"mention",...r}}function q(e={}){let{char:t="/",...r}=e;return {char:t,position:"start",mode:"dropdown",chipStyle:"inline",accessibilityLabel:"command",...r}}function E(e={}){let{char:t="#",...r}=e;return {char:t,position:"any",mode:"dropdown",chipStyle:"pill",resolveOnSpace:true,accessibilityLabel:"tag",...r}}function L(e){let{char:t,...r}=e;return {char:t,position:"start",mode:"callback",...r}}export{L as callbackTrigger,k as chip,q as commandTrigger,C as detectActiveTrigger,$ as getChips,B as getChipsByTrigger,R as hasChips,E as hashtagTrigger,P as isSegmentsEmpty,m as isValidTriggerPosition,I as mentionTrigger,x as mergeAdjacentTextSegments,w as parseInlineMarkdown,S as plainTextToSegments,b as resolveChip,O as resolveTriggersInSegments,A as segmentsEqual,d as segmentsToPlainText,M as text};
package/dist/index.js CHANGED
@@ -1,10 +1,2 @@
1
1
  'use client';
2
- export { callbackTrigger, chip, commandTrigger, getChips, getChipsByTrigger, hasChips, hashtagTrigger, isSegmentsEmpty, mentionTrigger, text, usePromptAreaState } from './chunk-UBBCAMJA.js';
3
- export { ActionBar } from './chunk-BWVBDP7C.js';
4
- export { StatusBar } from './chunk-ANZZEZP2.js';
5
- export { CompactPromptArea } from './chunk-BPJO4DGM.js';
6
- export { PromptArea, detectActiveTrigger, isValidTriggerPosition, mergeAdjacentTextSegments, parseInlineMarkdown, plainTextToSegments, resolveChip, resolveTriggersInSegments, segmentsEqual, segmentsToPlainText, usePromptArea } from './chunk-E7HUXORB.js';
7
- export { ChatPromptLayout } from './chunk-XDKRP7UE.js';
8
- import './chunk-NF2LHZIE.js';
9
- //# sourceMappingURL=index.js.map
10
- //# sourceMappingURL=index.js.map
2
+ export{k as callbackTrigger,c as chip,i as commandTrigger,f as getChips,g as getChipsByTrigger,e as hasChips,j as hashtagTrigger,d as isSegmentsEmpty,h as mentionTrigger,b as text,a as usePromptAreaState}from'./chunk-AUCRB7HL.js';export{a as ActionBar}from'./chunk-VULUMPYE.js';export{a as StatusBar}from'./chunk-6VISE4VA.js';export{a as CompactPromptArea}from'./chunk-2DBBB352.js';export{l as PromptArea,d as detectActiveTrigger,c as isValidTriggerPosition,i as mergeAdjacentTextSegments,g as parseInlineMarkdown,b as plainTextToSegments,e as resolveChip,f as resolveTriggersInSegments,h as segmentsEqual,a as segmentsToPlainText,k as usePromptArea}from'./chunk-WBAKQRYT.js';export{a as ChatPromptLayout}from'./chunk-CRC4ST6U.js';import'./chunk-23Y7B365.js';
@@ -1,6 +1,2 @@
1
1
  'use client';
2
- export { callbackTrigger, chip, commandTrigger, getChips, getChipsByTrigger, hasChips, hashtagTrigger, isSegmentsEmpty, mentionTrigger, text, usePromptAreaState } from '../chunk-UBBCAMJA.js';
3
- export { PromptArea, detectActiveTrigger, isValidTriggerPosition, mergeAdjacentTextSegments, parseInlineMarkdown, plainTextToSegments, resolveChip, resolveTriggersInSegments, segmentsEqual, segmentsToPlainText, usePromptArea } from '../chunk-E7HUXORB.js';
4
- import '../chunk-NF2LHZIE.js';
5
- //# sourceMappingURL=index.js.map
6
- //# sourceMappingURL=index.js.map
2
+ export{k as callbackTrigger,c as chip,i as commandTrigger,f as getChips,g as getChipsByTrigger,e as hasChips,j as hashtagTrigger,d as isSegmentsEmpty,h as mentionTrigger,b as text,a as usePromptAreaState}from'../chunk-AUCRB7HL.js';export{l as PromptArea,d as detectActiveTrigger,c as isValidTriggerPosition,i as mergeAdjacentTextSegments,g as parseInlineMarkdown,b as plainTextToSegments,e as resolveChip,f as resolveTriggersInSegments,h as segmentsEqual,a as segmentsToPlainText,k as usePromptArea}from'../chunk-WBAKQRYT.js';import'../chunk-23Y7B365.js';
@@ -1,5 +1,2 @@
1
1
  'use client';
2
- export { StatusBar } from '../chunk-ANZZEZP2.js';
3
- import '../chunk-NF2LHZIE.js';
4
- //# sourceMappingURL=index.js.map
5
- //# sourceMappingURL=index.js.map
2
+ export{a as StatusBar}from'../chunk-6VISE4VA.js';import'../chunk-23Y7B365.js';