@tribepad/themis 1.9.4 → 1.9.5
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.
- package/CHANGELOG.md +7 -0
- package/dist/elements/AlertDialog/index.js +1 -1
- package/dist/elements/AlertDialog/index.js.map +1 -1
- package/dist/elements/AlertDialog/index.mjs +1 -1
- package/dist/elements/AlertDialog/index.mjs.map +1 -1
- package/dist/elements/Breadcrumbs/index.js +1 -1
- package/dist/elements/Breadcrumbs/index.js.map +1 -1
- package/dist/elements/Breadcrumbs/index.mjs +1 -1
- package/dist/elements/Breadcrumbs/index.mjs.map +1 -1
- package/dist/elements/Button/index.js +1 -1
- package/dist/elements/Button/index.js.map +1 -1
- package/dist/elements/Button/index.mjs +1 -1
- package/dist/elements/Button/index.mjs.map +1 -1
- package/dist/elements/Card/index.js +1 -1
- package/dist/elements/Card/index.js.map +1 -1
- package/dist/elements/Card/index.mjs +1 -1
- package/dist/elements/Card/index.mjs.map +1 -1
- package/dist/elements/Carousel/Carousel.d.ts +8 -1
- package/dist/elements/Carousel/Carousel.d.ts.map +1 -1
- package/dist/elements/Carousel/LazyCarousel.d.ts +1 -1
- package/dist/elements/Carousel/LazyCarousel.d.ts.map +1 -1
- package/dist/elements/Carousel/index.js +1 -1
- package/dist/elements/Carousel/index.js.map +1 -1
- package/dist/elements/Carousel/index.mjs +1 -1
- package/dist/elements/Carousel/index.mjs.map +1 -1
- package/dist/elements/ChatInterface/ChatLiveRegions.d.ts +2 -2
- package/dist/elements/ChatInterface/ChatLiveRegions.d.ts.map +1 -1
- package/dist/elements/ChatInterface/ChatMessageBubble.d.ts +1 -1
- package/dist/elements/ChatInterface/ChatMessageBubble.d.ts.map +1 -1
- package/dist/elements/ChatInterface/ChatThinkingDisplay.d.ts +2 -2
- package/dist/elements/ChatInterface/ChatThinkingDisplay.d.ts.map +1 -1
- package/dist/elements/ChatInterface/ChatTypingIndicator.d.ts +2 -2
- package/dist/elements/ChatInterface/ChatTypingIndicator.d.ts.map +1 -1
- package/dist/elements/ChatInterface/index.js +1 -1
- package/dist/elements/ChatInterface/index.js.map +1 -1
- package/dist/elements/ChatInterface/index.mjs +1 -1
- package/dist/elements/ChatInterface/index.mjs.map +1 -1
- package/dist/elements/FeatureIcon/FeatureIcon.d.ts +3 -0
- package/dist/elements/FeatureIcon/FeatureIcon.d.ts.map +1 -0
- package/dist/elements/FeatureIcon/FeatureIcon.styles.d.ts +17 -0
- package/dist/elements/FeatureIcon/FeatureIcon.styles.d.ts.map +1 -0
- package/dist/elements/FeatureIcon/FeatureIcon.types.d.ts +137 -0
- package/dist/elements/FeatureIcon/FeatureIcon.types.d.ts.map +1 -0
- package/dist/elements/FeatureIcon/index.d.ts +25 -0
- package/dist/elements/FeatureIcon/index.d.ts.map +1 -0
- package/dist/elements/FeatureIcon/index.js +3 -0
- package/dist/elements/FeatureIcon/index.js.map +1 -0
- package/dist/elements/FeatureIcon/index.mjs +3 -0
- package/dist/elements/FeatureIcon/index.mjs.map +1 -0
- package/dist/elements/FileField/index.js +1 -1
- package/dist/elements/FileField/index.js.map +1 -1
- package/dist/elements/FileField/index.mjs +1 -1
- package/dist/elements/FileField/index.mjs.map +1 -1
- package/dist/elements/Filters/index.js +1 -1
- package/dist/elements/Filters/index.js.map +1 -1
- package/dist/elements/Filters/index.mjs +1 -1
- package/dist/elements/Filters/index.mjs.map +1 -1
- package/dist/elements/Modal/Modal.styles.d.ts +2 -2
- package/dist/elements/Modal/Modal.types.d.ts +2 -2
- package/dist/elements/NumberField/index.js +1 -1
- package/dist/elements/NumberField/index.js.map +1 -1
- package/dist/elements/NumberField/index.mjs +1 -1
- package/dist/elements/NumberField/index.mjs.map +1 -1
- package/dist/elements/PageTitle/index.js +1 -1
- package/dist/elements/PageTitle/index.js.map +1 -1
- package/dist/elements/PageTitle/index.mjs +1 -1
- package/dist/elements/PageTitle/index.mjs.map +1 -1
- package/dist/elements/Pagination/index.js +1 -1
- package/dist/elements/Pagination/index.js.map +1 -1
- package/dist/elements/Pagination/index.mjs +1 -1
- package/dist/elements/Pagination/index.mjs.map +1 -1
- package/dist/elements/Panel/Panel.d.ts +1 -1
- package/dist/elements/Panel/Panel.types.d.ts +2 -2
- package/dist/elements/PasswordField/index.js +1 -1
- package/dist/elements/PasswordField/index.js.map +1 -1
- package/dist/elements/PasswordField/index.mjs +1 -1
- package/dist/elements/PasswordField/index.mjs.map +1 -1
- package/dist/elements/Resizable/index.js +1 -1
- package/dist/elements/Resizable/index.js.map +1 -1
- package/dist/elements/Resizable/index.mjs +1 -1
- package/dist/elements/Resizable/index.mjs.map +1 -1
- package/dist/elements/SearchField/index.js +1 -1
- package/dist/elements/SearchField/index.js.map +1 -1
- package/dist/elements/SearchField/index.mjs +1 -1
- package/dist/elements/SearchField/index.mjs.map +1 -1
- package/dist/elements/Select/Select.d.ts +3 -3
- package/dist/elements/Select/Select.d.ts.map +1 -1
- package/dist/elements/Sidebar/Sidebar.styles.d.ts +1 -1
- package/dist/elements/Sidebar/Sidebar.styles.d.ts.map +1 -1
- package/dist/elements/Sidebar/Sidebar.types.d.ts +2 -2
- package/dist/elements/Sidebar/SidebarRail.d.ts.map +1 -1
- package/dist/elements/Sidebar/index.js +1 -1
- package/dist/elements/Sidebar/index.js.map +1 -1
- package/dist/elements/Sidebar/index.mjs +1 -1
- package/dist/elements/Sidebar/index.mjs.map +1 -1
- package/dist/elements/Table/index.js +1 -1
- package/dist/elements/Table/index.js.map +1 -1
- package/dist/elements/Table/index.mjs +1 -1
- package/dist/elements/Table/index.mjs.map +1 -1
- package/dist/elements/TextField/index.js +1 -1
- package/dist/elements/TextField/index.js.map +1 -1
- package/dist/elements/TextField/index.mjs +1 -1
- package/dist/elements/TextField/index.mjs.map +1 -1
- package/dist/elements/Timeline/index.js +1 -1
- package/dist/elements/Timeline/index.js.map +1 -1
- package/dist/elements/Timeline/index.mjs +1 -1
- package/dist/elements/Timeline/index.mjs.map +1 -1
- package/dist/elements/Toast/index.js +1 -1
- package/dist/elements/Toast/index.js.map +1 -1
- package/dist/elements/Toast/index.mjs +1 -1
- package/dist/elements/Toast/index.mjs.map +1 -1
- package/dist/elements/Wizard/index.js +1 -1
- package/dist/elements/Wizard/index.js.map +1 -1
- package/dist/elements/Wizard/index.mjs +1 -1
- package/dist/elements/Wizard/index.mjs.map +1 -1
- package/dist/elements/index.d.ts +2 -0
- package/dist/elements/index.d.ts.map +1 -1
- package/dist/elements/index.js +1 -1
- package/dist/elements/index.js.map +1 -1
- package/dist/elements/index.mjs +1 -1
- package/dist/elements/index.mjs.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/dist/styles/animations.css +15 -0
- package/package.json +16 -14
- package/src/elements/FeatureIcon/FeatureIcon.stories.tsx +164 -0
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {createContext,memo,forwardRef,useId,useMemo,useRef,useCallback,useState,useLayoutEffect,useImperativeHandle,useEffect,useContext}from'react';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {Button}from'react-aria-components';import {Loader2,Zap,Check,AlertCircle,ArrowDown,StopCircle,Send}from'lucide-react';import {cva}from'class-variance-authority';import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {z}from'zod';function x(...n){return twMerge(clsx(n))}var De="(prefers-reduced-motion: reduce)";function kt(){return typeof window>"u"?false:window.matchMedia(De).matches}function G(){let[n,e]=useState(kt);return useEffect(()=>{let r=window.matchMedia(De);e(r.matches);let t=o=>{e(o.matches);};return r.addEventListener("change",t),()=>r.removeEventListener("change",t)},[]),n}var Be=cva("inline-flex justify-center min-h-[44px] min-w-[44px] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50",{variants:{fullWidth:{true:"w-full",false:""},inVerticalGroup:{true:"items-stretch",false:"items-center"}},defaultVariants:{fullWidth:false,inVerticalGroup:false}}),Pe=cva("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-normal ring-offset-background motion-safe:transition-transform motion-safe:duration-200 motion-safe:[transition-timing-function:cubic-bezier(0.34,1.56,0.64,1)] motion-reduce:transition-none [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 relative cursor-pointer",{variants:{variant:{default:"bg-[var(--primary-action)] text-[var(--primary-action-foreground)] shadow-md hover:bg-[var(--primary-action-hover)] hover:-translate-y-1",destructive:"bg-[var(--destructive-background)] text-[var(--destructive-foreground)] hover:bg-[var(--destructive-background-hover,var(--destructive-background))] motion-safe:hover:btn-warn-shake",outline:"border border-[var(--input-border)] bg-[var(--page-background)] hover:bg-[var(--input-border)]",secondary:"bg-[var(--secondary)] text-[var(--secondary-foreground)] hover:bg-[var(--secondary-hover,var(--secondary))]",ghost:"hover:bg-[var(--accent)] hover:text-[var(--accent-foreground)]",link:"text-[var(--text-link)] underline underline-offset-4 hover:bg-[var(--accent)] hover:text-[var(--text-link-hover)]"},fullWidth:{true:"w-full",false:""},visualSize:{default:"h-10 px-4 py-2",sm:"h-9 rounded-md px-3 text-xs",lg:"h-11 rounded-md px-6 text-base",icon:"h-10 w-10",dot:"h-5 w-5 rounded-full p-0 min-h-0 min-w-0"},paywall:{true:"!bg-[var(--paywall)] !text-[var(--paywall-foreground)] hover:!bg-[var(--paywall)]/90 !cursor-not-allowed !border-transparent",false:""}},defaultVariants:{variant:"default",visualSize:"default",paywall:false}});var me="data-[pressed]:scale-[0.97]";var oe="hc:data-[hovered]:outline hc:data-[hovered]:outline-2 hc:data-[hovered]:outline-foreground",ae="hc:data-[pressed]:outline hc:data-[pressed]:outline-2 hc:data-[pressed]:outline-offset-1 hc:data-[pressed]:outline-foreground";var Ue=createContext(null);Ue.displayName="ButtonGroupContext";function Ge(){return useContext(Ue)}var Fe=createContext(null);Fe.displayName="ButtonGroupItemContext";function $e(){return useContext(Fe)}cva("inline-flex items-center gap-0",{variants:{orientation:{horizontal:"flex-row",vertical:"flex-col w-full"}},defaultVariants:{orientation:"horizontal"}});var We=cva("",{variants:{orientation:{horizontal:"min-w-[44px]",vertical:"flex min-h-[44px]"},position:{first:"",middle:"",last:"",only:""}},compoundVariants:[{orientation:"horizontal",position:"first",className:"rounded-r-none border-r-0"},{orientation:"horizontal",position:"middle",className:"rounded-none border-r-0"},{orientation:"horizontal",position:"last",className:"rounded-l-none"},{orientation:"vertical",position:"first",className:"rounded-b-none border-b-0"},{orientation:"vertical",position:"middle",className:"rounded-none border-b-0"},{orientation:"vertical",position:"last",className:"rounded-t-none"}],defaultVariants:{orientation:"horizontal",position:"only"}});cva("bg-[var(--border)]",{variants:{orientation:{horizontal:"w-px h-6 mx-1",vertical:"h-px w-full my-1"}},defaultVariants:{orientation:"horizontal"}});var O=memo(forwardRef(({className:n,buttonVisualClassName:e,variant:r,size:t,visualSize:o,fullWidth:u,loading:i=false,loadingText:a="Loading...",shortcut:f,children:c,isDisabled:g,paywall:l=false,paywallRedirect:m,paywallDescription:p,onPress:y,...v},A)=>{let I=useId(),R=Ge(),N=$e(),d=r??R?.variant??"default",S=t??R?.size,P=g??R?.isDisabled??false,h=R?.orientation==="vertical",C=u||h,M=N?We({orientation:R?.orientation??"horizontal",position:N.position}):"",w=o??S??"default";return process.env.NODE_ENV!=="production"&&(w==="dot"||w==="icon")&&!v["aria-label"]&&!c&&console.warn('[Button] visualSize="dot" or "icon" requires aria-label when no visible text is provided (WCAG 1.1.1)'),jsx(Button,{ref:A,isDisabled:P||i||void 0,"aria-disabled":l?true:void 0,"aria-describedby":l?I:void 0,onPress:$=>{if(l){m&&window.open(m,"_blank","noopener,noreferrer");return}y?.($);},className:x(Be({fullWidth:C,inVerticalGroup:h}),n),...v,children:$=>jsxs("span",{className:x(Pe({variant:d,visualSize:w,paywall:l,fullWidth:C}),M,e,me,"",oe,ae),"data-pressed":$.isPressed||void 0,children:[i&&jsxs(Fragment,{children:[jsx(Loader2,{className:"motion-safe:animate-spin","aria-hidden":"true"}),jsx("span",{className:"sr-only","aria-live":"polite",children:a})]}),!i&&c,l&&jsx(Zap,{"data-testid":"zap-icon","aria-hidden":"true",className:"ml-1"}),l&&jsxs("span",{id:I,className:"sr-only",children:["Premium feature: ",p||"Upgrade required to access this feature"]}),$.isFocusVisible&&f&&jsx("kbd",{className:"ml-auto hidden text-xs opacity-60 lg:inline",children:f})]})})}));O.displayName="Button";var qe=cva("flex flex-col h-full w-full bg-[var(--content-background)] text-[var(--content-foreground)]"),Ye=cva("flex-shrink-0 border-b border-[var(--border)] px-4 py-2"),je=cva("flex-1 min-h-0 overflow-y-auto overflow-x-hidden flex flex-col gap-3 px-4 py-3 outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2 [--tw-ring-offset-color:var(--content-background)] [overflow-anchor:none]"),se=cva("flex w-full gap-2",{variants:{align:{user:"justify-end",assistant:"justify-start",system:"justify-center"},offscreen:{true:"[content-visibility:auto] [contain-intrinsic-size:auto_80px]",false:""}},defaultVariants:{align:"assistant",offscreen:true}}),ie=cva("rounded-[var(--radius-md)] px-3 py-2 max-w-[85%] break-words",{variants:{role:{user:"bg-[var(--primary-action)] text-[var(--primary-action-foreground)]",assistant:"bg-[var(--muted)] text-[var(--content-foreground)] border border-[var(--border)]",system:"bg-transparent text-[var(--muted-foreground)] text-sm italic"},isError:{true:"border border-[var(--destructive-background)] bg-[var(--destructive-background)]/10",false:""}},defaultVariants:{role:"assistant",isError:false}}),ve=cva("flex-shrink-0 self-end",{variants:{role:{user:"order-2",assistant:"order-1",system:"hidden"}},defaultVariants:{role:"assistant"}}),Ke=cva("flex-shrink-0 flex items-end gap-2 border-t border-[var(--border)] bg-[var(--content-background)] p-3"),Qe=cva("flex-1 min-w-0 min-h-[44px] flex items-center rounded-[var(--radius-lg)] border border-[var(--input-border)] bg-[var(--input-background)] focus-within:border-[var(--ring)] focus-within:ring-2 focus-within:ring-[var(--ring)] focus-within:ring-offset-1 [--tw-ring-offset-color:var(--content-background)] motion-safe:transition-colors",{variants:{isDisabled:{true:"opacity-60 cursor-not-allowed",false:""}},defaultVariants:{isDisabled:false}}),Je=cva("block w-full resize-none border-0 bg-transparent px-3 py-2 text-sm text-[var(--content-foreground)] placeholder:text-[var(--muted-foreground)] outline-none focus:outline-none disabled:cursor-not-allowed [field-sizing:content]"),Xe=cva("inline-flex items-center gap-1 px-2 py-1",{variants:{animate:{true:"[&>span]:motion-safe:animate-pulse",false:""}},defaultVariants:{animate:true}}),Ze=cva("inline-flex items-center gap-1 rounded-full bg-[var(--muted)] px-2 py-0.5 text-xs text-[var(--muted-foreground)]",{variants:{animate:{true:"motion-safe:animate-pulse",false:""}},defaultVariants:{animate:true}}),et=cva("flex items-center gap-2 rounded px-2 py-1 text-xs",{variants:{status:{running:"bg-[var(--muted)] text-[var(--muted-foreground)]",done:"bg-[var(--success-background)]/20 text-[var(--content-foreground)]",error:"bg-[var(--destructive-background)]/20 text-[var(--content-foreground)]"}},defaultVariants:{status:"running"}}),tt=cva("absolute bottom-20 right-4 z-10 motion-safe:transition-transform motion-safe:duration-150",{variants:{visible:{true:"translate-y-0 opacity-100",false:"translate-y-2 opacity-0 pointer-events-none"}},defaultVariants:{visible:false}}),nt=cva("sr-only"),rt=cva("mt-2 flex flex-wrap items-center gap-2");var ot=memo(function({current:e,className:r,testId:t}){return jsx("div",{role:"status","aria-live":"polite","aria-atomic":"true",className:x(nt(),r),"data-testid":t,children:e})});var at=memo(function({className:e}){let r=G();return jsxs("span",{className:x(Xe({animate:!r}),e),"aria-hidden":"true",children:[jsx("span",{className:"inline-block h-1.5 w-1.5 rounded-full bg-[var(--muted-foreground)]"}),jsx("span",{className:"inline-block h-1.5 w-1.5 rounded-full bg-[var(--muted-foreground)]",style:{animationDelay:"0.15s"}}),jsx("span",{className:"inline-block h-1.5 w-1.5 rounded-full bg-[var(--muted-foreground)]",style:{animationDelay:"0.3s"}})]})});var st=memo(function({parts:e,mode:r,disclosureLabel:t,className:o}){let u=G();if(e.length===0)return null;let i=jsx("div",{className:"flex flex-col gap-1",children:e.map((a,f)=>{if(a.kind==="text")return jsx("p",{className:"text-xs text-[var(--muted-foreground)]",children:a.text},f);let c=a.status==="running"?Loader2:a.status==="done"?Check:AlertCircle,g=a.status==="running"?"running":a.status==="done"?"completed":"failed";return jsxs("div",{className:et({status:a.status}),children:[jsx(c,{className:x("h-3 w-3",a.status==="running"&&!u&&"motion-safe:animate-spin"),"aria-hidden":"true"}),jsxs("span",{className:"sr-only",children:[a.name," tool, "]}),jsx("span",{className:"font-medium",children:a.name}),jsx("span",{"aria-hidden":"true",className:"text-[var(--muted-foreground)]",children:"\xB7"}),jsx("span",{children:g}),a.summary?jsxs("span",{className:"ml-1 text-[var(--muted-foreground)]",children:["\u2014 ",a.summary]}):null]},f)})});return r==="active"?jsxs("div",{className:x("flex flex-col gap-2",o),children:[jsx("span",{className:Ze({animate:!u}),children:"Thinking\u2026"}),i]}):jsxs("details",{className:x("mt-2 text-xs",o),children:[jsx("summary",{className:"cursor-pointer inline-flex items-center min-h-[44px] py-1 text-[var(--muted-foreground)] hover:text-[var(--content-foreground)]",children:t}),jsx("div",{className:"mt-2",children:i})]})});function Kt(n,e){if(n.isStreamingHere!==e.isStreamingHere||n.isOffscreen!==e.isOffscreen||n.thinkingDisclosureLabel!==e.thinkingDisclosureLabel||n.assistantAvatar!==e.assistantAvatar||n.userAvatar!==e.userAvatar||n.renderAssistantContent!==e.renderAssistantContent||n.renderUserContent!==e.renderUserContent||n.onRetry!==e.onRetry||n.onEscalate!==e.onEscalate||n.contentRef!==e.contentRef)return false;let r=n.message,t=e.message;if(r===t)return true;if(r.id!==t.id||r.role!==t.role||r.status!==t.status||r.createdAt!==t.createdAt)return false;if(r.role==="assistant"&&t.role==="assistant"){if(r.content!==t.content||r.errorMessage!==t.errorMessage||(r.parts?.length??0)!==(t.parts?.length??0))return false;if(r.parts&&t.parts)for(let o=0;o<r.parts.length;o++){let u=r.parts[o],i=t.parts[o];if(!u||!i||u.kind!==i.kind)return false;if(u.kind==="text"&&i.kind==="text"){if(u.text!==i.text)return false}else if(u.kind==="tool_call"&&i.kind==="tool_call"&&(u.name!==i.name||u.status!==i.status||u.summary!==i.summary))return false}return true}return r.role==="user"&&t.role==="user"?r.content===t.content:r.role==="system"&&t.role==="system"?r.content===t.content&&r.announce===t.announce:false}var Ce=memo(function(e){let r=G(),{message:t,isStreamingHere:o,isOffscreen:u,assistantAvatar:i,userAvatar:a,renderAssistantContent:f,renderUserContent:c,thinkingDisclosureLabel:g,contentRef:l,onRetry:m,onEscalate:p}=e;return t.role==="system"?Qt(t):t.role==="user"?Jt(t,a,c,u):Xt({message:t,isStreamingHere:o,isOffscreen:u,assistantAvatar:i,renderAssistantContent:f,thinkingDisclosureLabel:g,contentRef:l,onRetry:m,onEscalate:p,prefersReducedMotion:r})},Kt);Ce.displayName="ChatMessageBubble";function Qt(n){return jsx("div",{className:se({align:"system",offscreen:false}),children:jsx("div",{className:ie({role:"system"}),"data-message-id":n.id,children:n.content})})}function Jt(n,e,r,t){let o=r?r(n):jsx("div",{className:"whitespace-pre-wrap text-sm",children:n.content});return jsxs("div",{className:se({align:"user",offscreen:t}),children:[e?jsx("div",{className:ve({role:"user"}),children:e}):null,jsx("div",{className:x(ie({role:"user",isError:n.status==="error"}),"order-1"),"data-message-id":n.id,children:o})]})}function Xt(n){let{message:e,isStreamingHere:r,isOffscreen:t,assistantAvatar:o,renderAssistantContent:u,thinkingDisclosureLabel:i,contentRef:a,onRetry:f,onEscalate:c,prefersReducedMotion:g}=n,l=e.status==="error",m=e.status==="thinking",p=r&&!m&&g&&e.status==="streaming",y=u?u(e):jsx("div",{className:"whitespace-pre-wrap text-sm",children:e.content});return jsxs("div",{className:se({align:"assistant",offscreen:t&&!(r||m)}),children:[o?jsx("div",{className:ve({role:"assistant"}),children:o}):null,jsxs("div",{className:x(ie({role:"assistant",isError:l}),"flex flex-col gap-1"),"data-message-id":e.id,"data-status":e.status,children:[e.parts&&e.parts.length>0&&jsx(st,{parts:e.parts,mode:m?"active":"collapsed",disclosureLabel:i}),!m&&!p&&jsx("div",{ref:a,"data-content":true,children:y}),p&&jsx("div",{className:"text-sm text-[var(--muted-foreground)]","data-streaming-placeholder":true,children:"Generating response\u2026"}),r&&!m&&jsx(at,{}),l&&jsxs(Fragment,{children:[e.errorMessage?jsx("p",{className:"text-xs text-[var(--content-foreground)]",children:e.errorMessage}):null,jsxs("div",{className:rt(),children:[f?jsx(O,{variant:"outline",size:"sm",onPress:()=>f(e.id),"data-action":"retry",children:"Try again"}):null,c?jsx(O,{variant:"ghost",size:"sm",onPress:c,"data-action":"escalate",children:"Submit a support request"}):null]})]})]})]})}var nn=200,ut=forwardRef(function({messages:e,streamingMessageId:r,assistantAvatar:t,userAvatar:o,renderAssistantContent:u,renderUserContent:i,thinkingDisclosureLabel:a,logLabel:f,emptyState:c,onRetry:g,onEscalate:l,registerStreamingContentRef:m,bottomSentinelRef:p,className:y,testId:v},A){let I=useMemo(()=>{let h=new Set;for(let C=Math.max(0,e.length-5);C<e.length;C++){let M=e[C];M&&h.add(M.id);}return h},[e]),R=useRef(new Map),N=useRef(void 0);N.current!==u&&(R.current.clear(),N.current=u);let d=useMemo(()=>{if(u)return h=>{let C=R.current,M=C.get(h.id);if(M&&M.content===h.content)return C.delete(h.id),C.set(h.id,M),M.node;let w=u(h);if(C.set(h.id,{content:h.content,node:w}),C.size>nn){let z=C.keys().next().value;z!==void 0&&C.delete(z);}return w}},[u]),S=useRef(new Map),P=useCallback(h=>{if(!m)return;let C=S.current,M=C.get(h);return M||(M=w=>{m(h,w),w===null&&C.delete(h);},C.set(h,M)),M},[m]);return jsxs("div",{ref:A,role:"log","aria-label":f,tabIndex:0,className:x(je(),y),"data-testid":v,children:[e.length===0&&c?jsx("div",{className:"flex h-full items-center justify-center",children:c}):null,e.map(h=>{let C=r===h.id,M=!I.has(h.id),w=h.role==="assistant"?P(h.id):void 0;return jsx(Ce,{message:h,isStreamingHere:C,isOffscreen:M,assistantAvatar:t,userAvatar:o,renderAssistantContent:d,renderUserContent:i,thinkingDisclosureLabel:a,contentRef:w,onRetry:g,onEscalate:l},h.id)}),jsx("div",{ref:p,"aria-hidden":"true",style:{height:1,flexShrink:0}})]})});var an=new RegExp("[\\u0000-\\u001F\\u007F\\u0080-\\u009F\\u200B-\\u200F\\u202A-\\u202E\\u2066-\\u2069\\uFEFF]","g");function lt(n){if(!n)return "";let e=n.replace(an,"");return typeof e.normalize=="function"&&(e=e.normalize("NFC")),e=e.replace(/\s+/g," ").trim(),e}function ct(n,e,r="\u2026full response in transcript"){let t=typeof e=="number"?e:200,o=Math.min(Math.max(t,50),1e3);return process.env.NODE_ENV!=="production"&&t!==o&&console.warn(`[ChatInterface] completionAnnouncementMaxChars must be in [50, 1000]; got ${t}, clamped to ${o}.`),n.length<=o?n:`${n.slice(0,o).trimEnd()}${r?` ${r}`:""}`}function sn(){if(typeof CSS>"u"||typeof CSS.supports!="function")return false;try{return CSS.supports("field-sizing","content")}catch{return false}}function dt(n,e,r=6){let[t]=useState(sn),o=useRef(null),u=useCallback(()=>{t||!n.current||o.current===null&&(o.current=requestAnimationFrame(()=>{o.current=null;let a=n.current;if(!a)return;let f=window.getComputedStyle(a),c=parseFloat(f.lineHeight),g=Number.isFinite(c)?c*r:0;a.style.height="auto";let l=g>0?Math.min(a.scrollHeight,g):a.scrollHeight;a.style.height=`${l}px`,a.style.overflowY=a.scrollHeight>l?"auto":"hidden";}));},[n,t,r]);useLayoutEffect(()=>{u();},[e,u]),useEffect(()=>()=>{o.current!==null&&(cancelAnimationFrame(o.current),o.current=null);},[]);}function ft(n,e,r){let[t,o]=useState(true);useEffect(()=>{let i=n.current,a=e.current;if(!i||!a||typeof IntersectionObserver>"u")return;let f=new IntersectionObserver(c=>{let g=c[c.length-1];g&&o(g.isIntersecting);},{root:i,rootMargin:"0px 0px 256px 0px",threshold:0});return f.observe(a),()=>f.disconnect()},[n,e]);let u=useCallback(i=>{let a=e.current;if(!a)return;let f=i?.smooth&&!r;a.scrollIntoView({behavior:f?"smooth":"auto",block:"end"});},[e,r]);return {isAtBottom:t,scrollToBottom:u}}var Re=[3e3,15e3,6e4];function mt(n){let{isStreaming:e,streamingContentLength:r,enabled:t,message:o,onAnnounce:u}=n,i=useRef(0),a=useRef(0),f=useRef(r),c=useRef(null),g=useRef(o),l=useRef(u);r>f.current&&(f.current=r,i.current=Date.now());let m=useCallback(()=>{c.current!==null&&(clearTimeout(c.current),c.current=null);},[]);useEffect(()=>{g.current=o,l.current=u;}),useEffect(()=>{if(!e||!t)return m(),a.current=0,f.current=0,i.current=Date.now(),m;i.current=Date.now();let p=()=>{let y=a.current;if(y>=Re.length)return;let v=Re[y];if(v===void 0)return;let A=Date.now()-i.current,I=Math.max(v-A,0);c.current=setTimeout(()=>{c.current=null;let R=Date.now()-i.current,N=a.current,d=Re[N];if(d!==void 0){if(R<d){p();return}if(typeof document<"u"&&document.visibilityState!=="visible"){a.current=N+1,p();return}a.current=N+1,l.current(g.current),p();}},I);};return p(),m},[e,t,m]);}var un=200,ln=32;function pt(n){let e=500,r=1e3,t=un,o=ln,[u,i]=useState(""),a=useRef([]),f=useRef(0),c=useRef(""),g=useRef(0),l=useRef(null),m=useRef(true),p=useCallback(()=>{l.current===null&&(l.current=setTimeout(()=>{if(l.current=null,!m.current)return;let v=a.current.shift();if(v===void 0){i("");return}let A=Date.now(),I=A-f.current;if(I<e){a.current.unshift(v),l.current=setTimeout(()=>{l.current=null,m.current&&p();},e-I);return}f.current=A,c.current=v,g.current=A,i(v),l.current=setTimeout(()=>{l.current=null,m.current&&(i(""),a.current.length>0&&p());},t);},0));},[e,t]),y=useCallback(v=>{if(!v)return;let A=Date.now();v===c.current&&A-g.current<r||(a.current.length>=o&&a.current.shift(),a.current.push(v),p());},[r,p,o]);return useEffect(()=>()=>{m.current=false,l.current!==null&&(clearTimeout(l.current),l.current=null);},[]),{current:u,enqueue:y}}var vt=forwardRef(function({isDisabled:e,placeholder:r,maxLength:t,"aria-label":o,onSubmit:u,onChange:i,onFocus:a,onBlur:f,sendShortcut:c="enter"},g){let[l,m]=useState(""),p=useRef(null);dt(p,l);let y=useRef(l),v=useRef(e),A=useRef(u),I=useRef(i);useLayoutEffect(()=>{y.current=l,v.current=e,A.current=u,I.current=i;});let R=useCallback(()=>{if(v.current)return;let d=y.current;d.trim().length!==0&&A.current(d);},[]);useImperativeHandle(g,()=>({focus:()=>{p.current?.focus();let d=p.current;if(d){let S=d.value.length;d.setSelectionRange(S,S);}},clear:()=>{m(""),I.current?.("");},submit:()=>{R();},setValue:d=>{m(d),I.current?.(d),requestAnimationFrame(()=>{let S=p.current;if(!S)return;let P=S.value.length;S.setSelectionRange(P,P);});}}),[R]);let N=useCallback(d=>{let S=d.nativeEvent.isComposing||d.keyCode===229;d.key==="Enter"&&(S||d.shiftKey||c==="mod-enter"&&!(d.metaKey||d.ctrlKey)||(d.preventDefault(),R()));},[R,c]);return jsx("div",{className:Qe({isDisabled:e}),children:jsx("textarea",{ref:p,value:l,onChange:d=>{m(d.target.value),i?.(d.target.value);},onKeyDown:N,onFocus:a,onBlur:f,disabled:e,placeholder:r,maxLength:t,autoComplete:"off","aria-label":o??"Message",rows:1,className:x(Je())})})});function bt({status:n,consumerDisabled:e,inputComponent:r,placeholder:t,maxInputLength:o,sendShortcut:u,inputActions:i,inputAriaLabel:a,onSendMessage:f,onStopGeneration:c,registerInputHandle:g,className:l}){let m=e||n==="streaming"||n==="error",p=useRef(null),y=useCallback(d=>{p.current=d,g(d);},[g]),v=useCallback(d=>{let S=d;typeof o=="number"&&S.length>o&&(process.env.NODE_ENV!=="production"&&console.warn(`[ChatInterface] Input exceeded maxInputLength (${o}); truncating before send.`),S=S.slice(0,o)),f(S),p.current?.clear();},[o,f]),A=useCallback(()=>{p.current?.submit();},[]),I=useCallback(()=>{c?.();},[c]),R=n==="streaming",N=r;return jsxs("div",{className:x(Ke(),l),children:[jsx("div",{className:"flex-1 min-w-0",children:N?jsx(N,{ref:y,isDisabled:m,placeholder:t,maxLength:o,"aria-label":a,onSubmit:v}):jsx(vt,{ref:y,isDisabled:m,placeholder:t,maxLength:o,"aria-label":a,onSubmit:v,sendShortcut:u})}),i?jsx("div",{className:"flex-shrink-0",children:i}):null,R?jsx(O,{variant:"destructive",visualSize:"icon","aria-label":"Stop generating",onPress:I,"data-action":"stop",children:jsx(StopCircle,{"aria-hidden":"true"})}):jsx(O,{variant:"default",visualSize:"icon","aria-label":"Send message",isDisabled:e,onPress:A,"data-action":"send",children:jsx(Send,{"aria-hidden":"true"})})]})}var Ct=z.object({className:z.string().optional(),children:z.any().optional(),id:z.string().optional(),"aria-label":z.string().optional(),"aria-labelledby":z.string().optional(),"aria-describedby":z.string().optional(),"aria-live":z.enum(["off","polite","assertive"]).optional(),"aria-hidden":z.boolean().optional(),"data-testid":z.string().optional()});z.enum(["user","assistant","system"]);var bn=z.enum(["complete","streaming","thinking","error"]),Cn=z.enum(["idle","streaming","error"]),xn=z.discriminatedUnion("kind",[z.object({kind:z.literal("text"),text:z.string()}).strict(),z.object({kind:z.literal("tool_call"),name:z.string(),status:z.enum(["running","done","error"]),summary:z.string().optional()}).strict()]),yn=z.object({id:z.string(),role:z.literal("user"),status:z.enum(["complete","error"]),content:z.string(),createdAt:z.number().optional()}).strict(),Rn=z.object({id:z.string(),role:z.literal("assistant"),status:bn,content:z.string(),parts:z.array(xn).optional(),errorMessage:z.string().optional(),createdAt:z.number().optional()}).strict(),Sn=z.object({id:z.string(),role:z.literal("system"),status:z.literal("complete"),content:z.unknown(),announce:z.boolean().optional(),createdAt:z.number().optional()}).strict(),xt=z.union([yn,Rn,Sn]),Ae=Ct.extend({status:Cn,messages:z.array(xt),onSendMessage:z.custom(),onStopGeneration:z.custom().optional(),onRetry:z.custom().optional(),onEscalate:z.custom().optional(),renderAssistantContent:z.any().optional(),renderUserContent:z.any().optional(),inputComponent:z.any().optional(),assistantAvatar:z.any().optional(),userAvatar:z.any().optional(),header:z.any().optional(),emptyState:z.any().optional(),inputActions:z.any().optional(),placeholder:z.string().optional(),isDisabled:z.boolean().optional(),maxInputLength:z.number().int().positive().optional(),sendShortcut:z.enum(["enter","mod-enter"]).optional(),progressAnnouncements:z.boolean().optional(),completionAnnouncementMaxChars:z.number().int().positive().optional(),logLabel:z.string().optional(),thinkingDisclosureLabel:z.string().optional()}).strict();var yt=forwardRef(function(e,r){let{messages:t,status:o,onSendMessage:u,onStopGeneration:i,onRetry:a,onEscalate:f,renderAssistantContent:c,renderUserContent:g,inputComponent:l,assistantAvatar:m,userAvatar:p,header:y,emptyState:v,inputActions:A,placeholder:I="Type a message\u2026",isDisabled:R=false,maxInputLength:N,sendShortcut:d="enter",progressAnnouncements:S=true,completionAnnouncementMaxChars:P,"aria-label":h="Chat",logLabel:C="Conversation transcript",thinkingDisclosureLabel:M="Thoughts",className:w,"data-testid":z}=e;if(process.env.NODE_ENV!=="production"){try{Ae.parse(e);}catch(b){console.warn("[ChatInterface] props failed validation:",b);}l&&!g&&console.warn("[ChatInterface] `inputComponent` is set but `renderUserContent` is not. User messages will render markdown source verbatim \u2014 provide `renderUserContent` for parsed output.");}let le=G(),$=useRef(false);process.env.NODE_ENV!=="production"&&t.length>1e3&&!$.current&&($.current=true,console.warn(`[ChatInterface] messages.length is ${t.length} (>1000). Render performance may degrade \u2014 consider paginating in the consumer state. Full virtualisation is a v2 candidate.`));let H=useMemo(()=>{let b=null,L=0;for(let V of t)V.role==="assistant"&&(V.status==="streaming"||V.status==="thinking")&&(b||(b=V),L+=1);return process.env.NODE_ENV!=="production"&&L>1&&console.warn(`[ChatInterface] Found ${L} messages with status='streaming' or 'thinking'; expected at most 1. Using the first.`),b},[t]),Rt=H?.id??null,ce=useRef(null),Ie=useRef(null),Me=useRef(null),de=useRef(new Map),St=useCallback((b,L)=>{L?de.current.set(b,L):de.current.delete(b);},[]),{current:At,enqueue:Y}=pt(),{isAtBottom:Q,scrollToBottom:_}=ft(ce,Ie,le),Ne=useRef(false);useEffect(()=>{Ne.current||(Ne.current=true,_({smooth:false}));},[_]);let Te=useRef(t);useEffect(()=>{let b=Te.current;Te.current=t,t.length>b.length&&Q&&_({smooth:false});},[t,Q,_]);let Ee=H&&H.status==="streaming"?H.content.length:0,j=useRef(null);useEffect(()=>{if(H&&Q&&j.current===null)return j.current=requestAnimationFrame(()=>{j.current=null,_({smooth:false});}),()=>{j.current!==null&&(cancelAnimationFrame(j.current),j.current=null);}},[Ee,H,Q,_]);let we=useRef(null),fe=useRef(false),J=useRef(new Set);useEffect(()=>{fe.current=false;let b=we.current,L=H?{id:H.id,status:H.status}:null;if(b&&(!L||L.id!==b.id)){let V=t.find(W=>W.id===b.id);if(V&&V.role==="assistant"){if(V.status==="complete"){let W=requestAnimationFrame(()=>{J.current.delete(W);let Le=(de.current.get(V.id)?.innerText??V.content??"").toString(),Mt=lt(Le),Ve=ct(Mt,P);Ve&&Y(`Assistant replied: ${Ve}`);});J.current.add(W);}else if(V.status==="error"){fe.current=true,Y("Response failed");let W=requestAnimationFrame(()=>{J.current.delete(W),ce.current?.querySelector(`[data-message-id="${En(V.id)}"]`)?.querySelector('[data-action="retry"]')?.focus();});J.current.add(W);}}}we.current=L;},[H,t,P,Y]),useEffect(()=>{let b=J.current;return ()=>{for(let L of b)cancelAnimationFrame(L);b.clear();}},[]);let ke=useRef(o);return useEffect(()=>{let b=ke.current;ke.current=o,b==="streaming"&&o==="idle"&&!fe.current&&Y("Generation stopped");},[o,Y]),mt({isStreaming:o==="streaming",streamingContentLength:Ee,enabled:S,message:"Assistant is still working",onAnnounce:Y}),useImperativeHandle(r,()=>({focusInput:()=>Me.current?.focus(),scrollToBottom:b=>_(b)}),[_]),jsxs("section",{className:x(qe(),w,"relative"),"aria-label":h,"data-testid":z,"data-themis-chatinterface":true,children:[y?jsx("div",{className:Ye(),children:y}):null,jsx(ut,{ref:ce,messages:t,streamingMessageId:Rt,assistantAvatar:m,userAvatar:p,renderAssistantContent:c,renderUserContent:g,thinkingDisclosureLabel:M,logLabel:C,emptyState:v,onRetry:a,onEscalate:f,registerStreamingContentRef:St,bottomSentinelRef:Ie,testId:z?`${z}-log`:void 0}),jsx("div",{className:tt({visible:!Q&&t.length>0}),children:jsx(O,{variant:"secondary",visualSize:"icon","aria-label":"Jump to latest message",onPress:()=>_({smooth:!le}),"data-action":"jump-to-latest",children:jsx(ArrowDown,{"aria-hidden":"true"})})}),jsx(bt,{status:o,consumerDisabled:R,inputComponent:l,placeholder:I,maxInputLength:N,sendShortcut:d,inputActions:A,inputAriaLabel:I,onSendMessage:u,onStopGeneration:i,registerInputHandle:b=>{Me.current=b;}}),jsx(ot,{current:At,testId:z?`${z}-status`:void 0})]})});yt.displayName="ChatInterface";function En(n){return typeof CSS<"u"&&typeof CSS.escape=="function"?CSS.escape(n):n.replace(/["\\]/g,"\\$&")}export{yt as ChatInterface,Ae as ChatInterfacePropsSchema,xt as ChatMessageSchema};//# sourceMappingURL=index.mjs.map
|
|
2
|
+
import {createContext,memo,forwardRef,useId,useMemo,useRef,useCallback,useState,useLayoutEffect,useImperativeHandle,useEffect,useContext}from'react';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {Button}from'react-aria-components';import {Loader2,Zap,Check,AlertCircle,ArrowDown,StopCircle,Send}from'lucide-react';import {cva}from'class-variance-authority';import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {z}from'zod';function x(...n){return twMerge(clsx(n))}var De="(prefers-reduced-motion: reduce)";function kt(){return typeof window>"u"?false:window.matchMedia(De).matches}function G(){let[n,e]=useState(kt);return useEffect(()=>{let r=window.matchMedia(De);e(r.matches);let t=o=>{e(o.matches);};return r.addEventListener("change",t),()=>r.removeEventListener("change",t)},[]),n}var Be=cva("inline-flex justify-center min-h-[44px] min-w-[44px] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50",{variants:{fullWidth:{true:"w-full",false:""},inVerticalGroup:{true:"items-stretch",false:"items-center"}},defaultVariants:{fullWidth:false,inVerticalGroup:false}}),Pe=cva("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-normal ring-offset-background motion-safe:transition-transform motion-safe:duration-200 motion-safe:[transition-timing-function:cubic-bezier(0.34,1.56,0.64,1)] motion-reduce:transition-none [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 relative cursor-pointer",{variants:{variant:{default:"bg-[var(--primary-action)] text-[var(--primary-action-foreground)] shadow-md hover:bg-[var(--primary-action-hover)] hover:-translate-y-1",destructive:"bg-[var(--destructive-background)] text-[var(--destructive-foreground)] hover:bg-[var(--destructive-background-hover,var(--destructive-background))] motion-safe:hover:btn-warn-shake",outline:"border border-[var(--input-border)] bg-[var(--content-background)] hover:bg-[var(--accent-background)]/50",secondary:"bg-[var(--secondary)] text-[var(--secondary-foreground)] hover:bg-[var(--secondary-hover,var(--secondary))]",ghost:"hover:bg-[var(--accent)] hover:text-[var(--accent-foreground)]",link:"text-[var(--text-link)] underline underline-offset-4 hover:bg-[var(--accent)] hover:text-[var(--text-link-hover)]"},fullWidth:{true:"w-full",false:""},visualSize:{default:"h-10 px-4 py-2",sm:"h-9 rounded-md px-3 text-xs",lg:"h-11 rounded-md px-6 text-base",icon:"h-10 w-10",dot:"h-5 w-5 rounded-full p-0 min-h-0 min-w-0"},paywall:{true:"!bg-[var(--paywall)] !text-[var(--paywall-foreground)] hover:!bg-[var(--paywall)]/90 !cursor-not-allowed !border-transparent",false:""}},defaultVariants:{variant:"default",visualSize:"default",paywall:false}});var me="data-[pressed]:scale-[0.97]";var oe="hc:data-[hovered]:outline hc:data-[hovered]:outline-2 hc:data-[hovered]:outline-foreground",ae="hc:data-[pressed]:outline hc:data-[pressed]:outline-2 hc:data-[pressed]:outline-offset-1 hc:data-[pressed]:outline-foreground";var Ue=createContext(null);Ue.displayName="ButtonGroupContext";function Ge(){return useContext(Ue)}var Fe=createContext(null);Fe.displayName="ButtonGroupItemContext";function $e(){return useContext(Fe)}cva("inline-flex items-center gap-0",{variants:{orientation:{horizontal:"flex-row",vertical:"flex-col w-full"}},defaultVariants:{orientation:"horizontal"}});var We=cva("",{variants:{orientation:{horizontal:"min-w-[44px]",vertical:"flex min-h-[44px]"},position:{first:"",middle:"",last:"",only:""}},compoundVariants:[{orientation:"horizontal",position:"first",className:"rounded-r-none border-r-0"},{orientation:"horizontal",position:"middle",className:"rounded-none border-r-0"},{orientation:"horizontal",position:"last",className:"rounded-l-none"},{orientation:"vertical",position:"first",className:"rounded-b-none border-b-0"},{orientation:"vertical",position:"middle",className:"rounded-none border-b-0"},{orientation:"vertical",position:"last",className:"rounded-t-none"}],defaultVariants:{orientation:"horizontal",position:"only"}});cva("bg-[var(--border)]",{variants:{orientation:{horizontal:"w-px h-6 mx-1",vertical:"h-px w-full my-1"}},defaultVariants:{orientation:"horizontal"}});var O=memo(forwardRef(({className:n,buttonVisualClassName:e,variant:r,size:t,visualSize:o,fullWidth:u,loading:i=false,loadingText:a="Loading...",shortcut:f,children:c,isDisabled:g,paywall:l=false,paywallRedirect:m,paywallDescription:p,onPress:y,...v},A)=>{let I=useId(),R=Ge(),N=$e(),d=r??R?.variant??"default",S=t??R?.size,P=g??R?.isDisabled??false,h=R?.orientation==="vertical",C=u||h,M=N?We({orientation:R?.orientation??"horizontal",position:N.position}):"",w=o??S??"default";return process.env.NODE_ENV!=="production"&&(w==="dot"||w==="icon")&&!v["aria-label"]&&!c&&console.warn('[Button] visualSize="dot" or "icon" requires aria-label when no visible text is provided (WCAG 1.1.1)'),jsx(Button,{ref:A,isDisabled:P||i||void 0,"aria-disabled":l?true:void 0,"aria-describedby":l?I:void 0,onPress:$=>{if(l){m&&window.open(m,"_blank","noopener,noreferrer");return}y?.($);},className:x(Be({fullWidth:C,inVerticalGroup:h}),n),...v,children:$=>jsxs("span",{className:x(Pe({variant:d,visualSize:w,paywall:l,fullWidth:C}),M,e,me,"",oe,ae),"data-pressed":$.isPressed||void 0,children:[i&&jsxs(Fragment,{children:[jsx(Loader2,{className:"motion-safe:animate-spin","aria-hidden":"true"}),jsx("span",{className:"sr-only","aria-live":"polite",children:a})]}),!i&&c,l&&jsx(Zap,{"data-testid":"zap-icon","aria-hidden":"true",className:"ml-1"}),l&&jsxs("span",{id:I,className:"sr-only",children:["Premium feature: ",p||"Upgrade required to access this feature"]}),$.isFocusVisible&&f&&jsx("kbd",{className:"ml-auto hidden text-xs opacity-60 lg:inline",children:f})]})})}));O.displayName="Button";var qe=cva("flex flex-col h-full w-full bg-[var(--content-background)] text-[var(--content-foreground)]"),Ye=cva("flex-shrink-0 border-b border-[var(--border)] px-4 py-2"),je=cva("flex-1 min-h-0 overflow-y-auto overflow-x-hidden flex flex-col gap-3 px-4 py-3 outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2 [--tw-ring-offset-color:var(--content-background)] [overflow-anchor:none]"),se=cva("flex w-full gap-2",{variants:{align:{user:"justify-end",assistant:"justify-start",system:"justify-center"},offscreen:{true:"[content-visibility:auto] [contain-intrinsic-size:auto_80px]",false:""}},defaultVariants:{align:"assistant",offscreen:true}}),ie=cva("rounded-[var(--radius-md)] px-3 py-2 max-w-[85%] break-words",{variants:{role:{user:"bg-[var(--primary-action)] text-[var(--primary-action-foreground)]",assistant:"bg-[var(--muted)] text-[var(--content-foreground)] border border-[var(--border)]",system:"bg-transparent text-[var(--muted-foreground)] text-sm italic"},isError:{true:"border border-[var(--destructive-background)] bg-[var(--destructive-background)]/10",false:""}},defaultVariants:{role:"assistant",isError:false}}),ve=cva("flex-shrink-0 self-end",{variants:{role:{user:"order-2",assistant:"order-1",system:"hidden"}},defaultVariants:{role:"assistant"}}),Ke=cva("flex-shrink-0 flex items-end gap-2 border-t border-[var(--border)] bg-[var(--content-background)] p-3"),Qe=cva("flex-1 min-w-0 min-h-[44px] flex items-center rounded-[var(--radius-lg)] border border-[var(--input-border)] bg-[var(--input-background)] focus-within:border-[var(--ring)] focus-within:ring-2 focus-within:ring-[var(--ring)] focus-within:ring-offset-1 [--tw-ring-offset-color:var(--content-background)] motion-safe:transition-colors",{variants:{isDisabled:{true:"opacity-60 cursor-not-allowed",false:""}},defaultVariants:{isDisabled:false}}),Je=cva("block w-full resize-none border-0 bg-transparent px-3 py-2 text-sm text-[var(--content-foreground)] placeholder:text-[var(--muted-foreground)] outline-none focus:outline-none disabled:cursor-not-allowed [field-sizing:content]"),Xe=cva("inline-flex items-center gap-1 px-2 py-1",{variants:{animate:{true:"[&>span]:motion-safe:animate-pulse",false:""}},defaultVariants:{animate:true}}),Ze=cva("inline-flex items-center gap-1 rounded-full bg-[var(--muted)] px-2 py-0.5 text-xs text-[var(--muted-foreground)]",{variants:{animate:{true:"motion-safe:animate-pulse",false:""}},defaultVariants:{animate:true}}),et=cva("flex items-center gap-2 rounded px-2 py-1 text-xs",{variants:{status:{running:"bg-[var(--muted)] text-[var(--muted-foreground)]",done:"bg-[var(--success-background)]/20 text-[var(--content-foreground)]",error:"bg-[var(--destructive-background)]/20 text-[var(--content-foreground)]"}},defaultVariants:{status:"running"}}),tt=cva("absolute bottom-20 right-4 z-10 motion-safe:transition-transform motion-safe:duration-150",{variants:{visible:{true:"translate-y-0 opacity-100",false:"translate-y-2 opacity-0 pointer-events-none"}},defaultVariants:{visible:false}}),nt=cva("sr-only"),rt=cva("mt-2 flex flex-wrap items-center gap-2");var ot=memo(function({current:e,className:r,testId:t}){return jsx("div",{role:"status","aria-live":"polite","aria-atomic":"true",className:x(nt(),r),"data-testid":t,children:e})});var at=memo(function({className:e}){let r=G();return jsxs("span",{className:x(Xe({animate:!r}),e),"aria-hidden":"true",children:[jsx("span",{className:"inline-block h-1.5 w-1.5 rounded-full bg-[var(--muted-foreground)]"}),jsx("span",{className:"inline-block h-1.5 w-1.5 rounded-full bg-[var(--muted-foreground)]",style:{animationDelay:"0.15s"}}),jsx("span",{className:"inline-block h-1.5 w-1.5 rounded-full bg-[var(--muted-foreground)]",style:{animationDelay:"0.3s"}})]})});var st=memo(function({parts:e,mode:r,disclosureLabel:t,className:o}){let u=G();if(e.length===0)return null;let i=jsx("div",{className:"flex flex-col gap-1",children:e.map((a,f)=>{if(a.kind==="text")return jsx("p",{className:"text-xs text-[var(--muted-foreground)]",children:a.text},f);let c=a.status==="running"?Loader2:a.status==="done"?Check:AlertCircle,g=a.status==="running"?"running":a.status==="done"?"completed":"failed";return jsxs("div",{className:et({status:a.status}),children:[jsx(c,{className:x("h-3 w-3",a.status==="running"&&!u&&"motion-safe:animate-spin"),"aria-hidden":"true"}),jsxs("span",{className:"sr-only",children:[a.name," tool, "]}),jsx("span",{className:"font-medium",children:a.name}),jsx("span",{"aria-hidden":"true",className:"text-[var(--muted-foreground)]",children:"\xB7"}),jsx("span",{children:g}),a.summary?jsxs("span",{className:"ml-1 text-[var(--muted-foreground)]",children:["\u2014 ",a.summary]}):null]},f)})});return r==="active"?jsxs("div",{className:x("flex flex-col gap-2",o),children:[jsx("span",{className:Ze({animate:!u}),children:"Thinking\u2026"}),i]}):jsxs("details",{className:x("mt-2 text-xs",o),children:[jsx("summary",{className:"cursor-pointer inline-flex items-center min-h-[44px] py-1 text-[var(--muted-foreground)] hover:text-[var(--content-foreground)]",children:t}),jsx("div",{className:"mt-2",children:i})]})});function Kt(n,e){if(n.isStreamingHere!==e.isStreamingHere||n.isOffscreen!==e.isOffscreen||n.thinkingDisclosureLabel!==e.thinkingDisclosureLabel||n.assistantAvatar!==e.assistantAvatar||n.userAvatar!==e.userAvatar||n.renderAssistantContent!==e.renderAssistantContent||n.renderUserContent!==e.renderUserContent||n.onRetry!==e.onRetry||n.onEscalate!==e.onEscalate||n.contentRef!==e.contentRef)return false;let r=n.message,t=e.message;if(r===t)return true;if(r.id!==t.id||r.role!==t.role||r.status!==t.status||r.createdAt!==t.createdAt)return false;if(r.role==="assistant"&&t.role==="assistant"){if(r.content!==t.content||r.errorMessage!==t.errorMessage||(r.parts?.length??0)!==(t.parts?.length??0))return false;if(r.parts&&t.parts)for(let o=0;o<r.parts.length;o++){let u=r.parts[o],i=t.parts[o];if(!u||!i||u.kind!==i.kind)return false;if(u.kind==="text"&&i.kind==="text"){if(u.text!==i.text)return false}else if(u.kind==="tool_call"&&i.kind==="tool_call"&&(u.name!==i.name||u.status!==i.status||u.summary!==i.summary))return false}return true}return r.role==="user"&&t.role==="user"?r.content===t.content:r.role==="system"&&t.role==="system"?r.content===t.content&&r.announce===t.announce:false}var Ce=memo(function(e){let r=G(),{message:t,isStreamingHere:o,isOffscreen:u,assistantAvatar:i,userAvatar:a,renderAssistantContent:f,renderUserContent:c,thinkingDisclosureLabel:g,contentRef:l,onRetry:m,onEscalate:p}=e;return t.role==="system"?Qt(t):t.role==="user"?Jt(t,a,c,u):Xt({message:t,isStreamingHere:o,isOffscreen:u,assistantAvatar:i,renderAssistantContent:f,thinkingDisclosureLabel:g,contentRef:l,onRetry:m,onEscalate:p,prefersReducedMotion:r})},Kt);Ce.displayName="ChatMessageBubble";function Qt(n){return jsx("div",{className:se({align:"system",offscreen:false}),children:jsx("div",{className:ie({role:"system"}),"data-message-id":n.id,children:n.content})})}function Jt(n,e,r,t){let o=r?r(n):jsx("div",{className:"whitespace-pre-wrap text-sm",children:n.content});return jsxs("div",{className:se({align:"user",offscreen:t}),children:[e?jsx("div",{className:ve({role:"user"}),children:e}):null,jsx("div",{className:x(ie({role:"user",isError:n.status==="error"}),"order-1"),"data-message-id":n.id,children:o})]})}function Xt(n){let{message:e,isStreamingHere:r,isOffscreen:t,assistantAvatar:o,renderAssistantContent:u,thinkingDisclosureLabel:i,contentRef:a,onRetry:f,onEscalate:c,prefersReducedMotion:g}=n,l=e.status==="error",m=e.status==="thinking",p=r&&!m&&g&&e.status==="streaming",y=u?u(e):jsx("div",{className:"whitespace-pre-wrap text-sm",children:e.content});return jsxs("div",{className:se({align:"assistant",offscreen:t&&!(r||m)}),children:[o?jsx("div",{className:ve({role:"assistant"}),children:o}):null,jsxs("div",{className:x(ie({role:"assistant",isError:l}),"flex flex-col gap-1"),"data-message-id":e.id,"data-status":e.status,children:[e.parts&&e.parts.length>0&&jsx(st,{parts:e.parts,mode:m?"active":"collapsed",disclosureLabel:i}),!m&&!p&&jsx("div",{ref:a,"data-content":true,children:y}),p&&jsx("div",{className:"text-sm text-[var(--muted-foreground)]","data-streaming-placeholder":true,children:"Generating response\u2026"}),r&&!m&&jsx(at,{}),l&&jsxs(Fragment,{children:[e.errorMessage?jsx("p",{className:"text-xs text-[var(--content-foreground)]",children:e.errorMessage}):null,jsxs("div",{className:rt(),children:[f?jsx(O,{variant:"outline",size:"sm",onPress:()=>f(e.id),"data-action":"retry",children:"Try again"}):null,c?jsx(O,{variant:"ghost",size:"sm",onPress:c,"data-action":"escalate",children:"Submit a support request"}):null]})]})]})]})}var nn=200,ut=forwardRef(function({messages:e,streamingMessageId:r,assistantAvatar:t,userAvatar:o,renderAssistantContent:u,renderUserContent:i,thinkingDisclosureLabel:a,logLabel:f,emptyState:c,onRetry:g,onEscalate:l,registerStreamingContentRef:m,bottomSentinelRef:p,className:y,testId:v},A){let I=useMemo(()=>{let h=new Set;for(let C=Math.max(0,e.length-5);C<e.length;C++){let M=e[C];M&&h.add(M.id);}return h},[e]),R=useRef(new Map),N=useRef(void 0);N.current!==u&&(R.current.clear(),N.current=u);let d=useMemo(()=>{if(u)return h=>{let C=R.current,M=C.get(h.id);if(M&&M.content===h.content)return C.delete(h.id),C.set(h.id,M),M.node;let w=u(h);if(C.set(h.id,{content:h.content,node:w}),C.size>nn){let z=C.keys().next().value;z!==void 0&&C.delete(z);}return w}},[u]),S=useRef(new Map),P=useCallback(h=>{if(!m)return;let C=S.current,M=C.get(h);return M||(M=w=>{m(h,w),w===null&&C.delete(h);},C.set(h,M)),M},[m]);return jsxs("div",{ref:A,role:"log","aria-label":f,tabIndex:0,className:x(je(),y),"data-testid":v,children:[e.length===0&&c?jsx("div",{className:"flex h-full items-center justify-center",children:c}):null,e.map(h=>{let C=r===h.id,M=!I.has(h.id),w=h.role==="assistant"?P(h.id):void 0;return jsx(Ce,{message:h,isStreamingHere:C,isOffscreen:M,assistantAvatar:t,userAvatar:o,renderAssistantContent:d,renderUserContent:i,thinkingDisclosureLabel:a,contentRef:w,onRetry:g,onEscalate:l},h.id)}),jsx("div",{ref:p,"aria-hidden":"true",style:{height:1,flexShrink:0}})]})});var an=new RegExp("[\\u0000-\\u001F\\u007F\\u0080-\\u009F\\u200B-\\u200F\\u202A-\\u202E\\u2066-\\u2069\\uFEFF]","g");function lt(n){if(!n)return "";let e=n.replace(an,"");return typeof e.normalize=="function"&&(e=e.normalize("NFC")),e=e.replace(/\s+/g," ").trim(),e}function ct(n,e,r="\u2026full response in transcript"){let t=typeof e=="number"?e:200,o=Math.min(Math.max(t,50),1e3);return process.env.NODE_ENV!=="production"&&t!==o&&console.warn(`[ChatInterface] completionAnnouncementMaxChars must be in [50, 1000]; got ${t}, clamped to ${o}.`),n.length<=o?n:`${n.slice(0,o).trimEnd()}${r?` ${r}`:""}`}function sn(){if(typeof CSS>"u"||typeof CSS.supports!="function")return false;try{return CSS.supports("field-sizing","content")}catch{return false}}function dt(n,e,r=6){let[t]=useState(sn),o=useRef(null),u=useCallback(()=>{t||!n.current||o.current===null&&(o.current=requestAnimationFrame(()=>{o.current=null;let a=n.current;if(!a)return;let f=window.getComputedStyle(a),c=parseFloat(f.lineHeight),g=Number.isFinite(c)?c*r:0;a.style.height="auto";let l=g>0?Math.min(a.scrollHeight,g):a.scrollHeight;a.style.height=`${l}px`,a.style.overflowY=a.scrollHeight>l?"auto":"hidden";}));},[n,t,r]);useLayoutEffect(()=>{u();},[e,u]),useEffect(()=>()=>{o.current!==null&&(cancelAnimationFrame(o.current),o.current=null);},[]);}function ft(n,e,r){let[t,o]=useState(true);useEffect(()=>{let i=n.current,a=e.current;if(!i||!a||typeof IntersectionObserver>"u")return;let f=new IntersectionObserver(c=>{let g=c[c.length-1];g&&o(g.isIntersecting);},{root:i,rootMargin:"0px 0px 256px 0px",threshold:0});return f.observe(a),()=>f.disconnect()},[n,e]);let u=useCallback(i=>{let a=e.current;if(!a)return;let f=i?.smooth&&!r;a.scrollIntoView({behavior:f?"smooth":"auto",block:"end"});},[e,r]);return {isAtBottom:t,scrollToBottom:u}}var Re=[3e3,15e3,6e4];function mt(n){let{isStreaming:e,streamingContentLength:r,enabled:t,message:o,onAnnounce:u}=n,i=useRef(0),a=useRef(0),f=useRef(r),c=useRef(null),g=useRef(o),l=useRef(u);r>f.current&&(f.current=r,i.current=Date.now());let m=useCallback(()=>{c.current!==null&&(clearTimeout(c.current),c.current=null);},[]);useEffect(()=>{g.current=o,l.current=u;}),useEffect(()=>{if(!e||!t)return m(),a.current=0,f.current=0,i.current=Date.now(),m;i.current=Date.now();let p=()=>{let y=a.current;if(y>=Re.length)return;let v=Re[y];if(v===void 0)return;let A=Date.now()-i.current,I=Math.max(v-A,0);c.current=setTimeout(()=>{c.current=null;let R=Date.now()-i.current,N=a.current,d=Re[N];if(d!==void 0){if(R<d){p();return}if(typeof document<"u"&&document.visibilityState!=="visible"){a.current=N+1,p();return}a.current=N+1,l.current(g.current),p();}},I);};return p(),m},[e,t,m]);}var un=200,ln=32;function pt(n){let e=500,r=1e3,t=un,o=ln,[u,i]=useState(""),a=useRef([]),f=useRef(0),c=useRef(""),g=useRef(0),l=useRef(null),m=useRef(true),p=useCallback(()=>{l.current===null&&(l.current=setTimeout(()=>{if(l.current=null,!m.current)return;let v=a.current.shift();if(v===void 0){i("");return}let A=Date.now(),I=A-f.current;if(I<e){a.current.unshift(v),l.current=setTimeout(()=>{l.current=null,m.current&&p();},e-I);return}f.current=A,c.current=v,g.current=A,i(v),l.current=setTimeout(()=>{l.current=null,m.current&&(i(""),a.current.length>0&&p());},t);},0));},[e,t]),y=useCallback(v=>{if(!v)return;let A=Date.now();v===c.current&&A-g.current<r||(a.current.length>=o&&a.current.shift(),a.current.push(v),p());},[r,p,o]);return useEffect(()=>()=>{m.current=false,l.current!==null&&(clearTimeout(l.current),l.current=null);},[]),{current:u,enqueue:y}}var vt=forwardRef(function({isDisabled:e,placeholder:r,maxLength:t,"aria-label":o,onSubmit:u,onChange:i,onFocus:a,onBlur:f,sendShortcut:c="enter"},g){let[l,m]=useState(""),p=useRef(null);dt(p,l);let y=useRef(l),v=useRef(e),A=useRef(u),I=useRef(i);useLayoutEffect(()=>{y.current=l,v.current=e,A.current=u,I.current=i;});let R=useCallback(()=>{if(v.current)return;let d=y.current;d.trim().length!==0&&A.current(d);},[]);useImperativeHandle(g,()=>({focus:()=>{p.current?.focus();let d=p.current;if(d){let S=d.value.length;d.setSelectionRange(S,S);}},clear:()=>{m(""),I.current?.("");},submit:()=>{R();},setValue:d=>{m(d),I.current?.(d),requestAnimationFrame(()=>{let S=p.current;if(!S)return;let P=S.value.length;S.setSelectionRange(P,P);});}}),[R]);let N=useCallback(d=>{let S=d.nativeEvent.isComposing||d.keyCode===229;d.key==="Enter"&&(S||d.shiftKey||c==="mod-enter"&&!(d.metaKey||d.ctrlKey)||(d.preventDefault(),R()));},[R,c]);return jsx("div",{className:Qe({isDisabled:e}),children:jsx("textarea",{ref:p,value:l,onChange:d=>{m(d.target.value),i?.(d.target.value);},onKeyDown:N,onFocus:a,onBlur:f,disabled:e,placeholder:r,maxLength:t,autoComplete:"off","aria-label":o??"Message",rows:1,className:x(Je())})})});function bt({status:n,consumerDisabled:e,inputComponent:r,placeholder:t,maxInputLength:o,sendShortcut:u,inputActions:i,inputAriaLabel:a,onSendMessage:f,onStopGeneration:c,registerInputHandle:g,className:l}){let m=e||n==="streaming"||n==="error",p=useRef(null),y=useCallback(d=>{p.current=d,g(d);},[g]),v=useCallback(d=>{let S=d;typeof o=="number"&&S.length>o&&(process.env.NODE_ENV!=="production"&&console.warn(`[ChatInterface] Input exceeded maxInputLength (${o}); truncating before send.`),S=S.slice(0,o)),f(S),p.current?.clear();},[o,f]),A=useCallback(()=>{p.current?.submit();},[]),I=useCallback(()=>{c?.();},[c]),R=n==="streaming",N=r;return jsxs("div",{className:x(Ke(),l),children:[jsx("div",{className:"flex-1 min-w-0",children:N?jsx(N,{ref:y,isDisabled:m,placeholder:t,maxLength:o,"aria-label":a,onSubmit:v}):jsx(vt,{ref:y,isDisabled:m,placeholder:t,maxLength:o,"aria-label":a,onSubmit:v,sendShortcut:u})}),i?jsx("div",{className:"flex-shrink-0",children:i}):null,R?jsx(O,{variant:"destructive",visualSize:"icon","aria-label":"Stop generating",onPress:I,"data-action":"stop",children:jsx(StopCircle,{"aria-hidden":"true"})}):jsx(O,{variant:"default",visualSize:"icon","aria-label":"Send message",isDisabled:e,onPress:A,"data-action":"send",children:jsx(Send,{"aria-hidden":"true"})})]})}var Ct=z.object({className:z.string().optional(),children:z.any().optional(),id:z.string().optional(),"aria-label":z.string().optional(),"aria-labelledby":z.string().optional(),"aria-describedby":z.string().optional(),"aria-live":z.enum(["off","polite","assertive"]).optional(),"aria-hidden":z.boolean().optional(),"data-testid":z.string().optional()});z.enum(["user","assistant","system"]);var bn=z.enum(["complete","streaming","thinking","error"]),Cn=z.enum(["idle","streaming","error"]),xn=z.discriminatedUnion("kind",[z.object({kind:z.literal("text"),text:z.string()}).strict(),z.object({kind:z.literal("tool_call"),name:z.string(),status:z.enum(["running","done","error"]),summary:z.string().optional()}).strict()]),yn=z.object({id:z.string(),role:z.literal("user"),status:z.enum(["complete","error"]),content:z.string(),createdAt:z.number().optional()}).strict(),Rn=z.object({id:z.string(),role:z.literal("assistant"),status:bn,content:z.string(),parts:z.array(xn).optional(),errorMessage:z.string().optional(),createdAt:z.number().optional()}).strict(),Sn=z.object({id:z.string(),role:z.literal("system"),status:z.literal("complete"),content:z.unknown(),announce:z.boolean().optional(),createdAt:z.number().optional()}).strict(),xt=z.union([yn,Rn,Sn]),Ae=Ct.extend({status:Cn,messages:z.array(xt),onSendMessage:z.custom(),onStopGeneration:z.custom().optional(),onRetry:z.custom().optional(),onEscalate:z.custom().optional(),renderAssistantContent:z.any().optional(),renderUserContent:z.any().optional(),inputComponent:z.any().optional(),assistantAvatar:z.any().optional(),userAvatar:z.any().optional(),header:z.any().optional(),emptyState:z.any().optional(),inputActions:z.any().optional(),placeholder:z.string().optional(),isDisabled:z.boolean().optional(),maxInputLength:z.number().int().positive().optional(),sendShortcut:z.enum(["enter","mod-enter"]).optional(),progressAnnouncements:z.boolean().optional(),completionAnnouncementMaxChars:z.number().int().positive().optional(),logLabel:z.string().optional(),thinkingDisclosureLabel:z.string().optional()}).strict();var yt=forwardRef(function(e,r){let{messages:t,status:o,onSendMessage:u,onStopGeneration:i,onRetry:a,onEscalate:f,renderAssistantContent:c,renderUserContent:g,inputComponent:l,assistantAvatar:m,userAvatar:p,header:y,emptyState:v,inputActions:A,placeholder:I="Type a message\u2026",isDisabled:R=false,maxInputLength:N,sendShortcut:d="enter",progressAnnouncements:S=true,completionAnnouncementMaxChars:P,"aria-label":h="Chat",logLabel:C="Conversation transcript",thinkingDisclosureLabel:M="Thoughts",className:w,"data-testid":z}=e;if(process.env.NODE_ENV!=="production"){try{Ae.parse(e);}catch(b){console.warn("[ChatInterface] props failed validation:",b);}l&&!g&&console.warn("[ChatInterface] `inputComponent` is set but `renderUserContent` is not. User messages will render markdown source verbatim \u2014 provide `renderUserContent` for parsed output.");}let le=G(),$=useRef(false);process.env.NODE_ENV!=="production"&&t.length>1e3&&!$.current&&($.current=true,console.warn(`[ChatInterface] messages.length is ${t.length} (>1000). Render performance may degrade \u2014 consider paginating in the consumer state. Full virtualisation is a v2 candidate.`));let H=useMemo(()=>{let b=null,L=0;for(let V of t)V.role==="assistant"&&(V.status==="streaming"||V.status==="thinking")&&(b||(b=V),L+=1);return process.env.NODE_ENV!=="production"&&L>1&&console.warn(`[ChatInterface] Found ${L} messages with status='streaming' or 'thinking'; expected at most 1. Using the first.`),b},[t]),Rt=H?.id??null,ce=useRef(null),Ie=useRef(null),Me=useRef(null),de=useRef(new Map),St=useCallback((b,L)=>{L?de.current.set(b,L):de.current.delete(b);},[]),{current:At,enqueue:Y}=pt(),{isAtBottom:Q,scrollToBottom:_}=ft(ce,Ie,le),Ne=useRef(false);useEffect(()=>{Ne.current||(Ne.current=true,_({smooth:false}));},[_]);let Te=useRef(t);useEffect(()=>{let b=Te.current;Te.current=t,t.length>b.length&&Q&&_({smooth:false});},[t,Q,_]);let Ee=H&&H.status==="streaming"?H.content.length:0,j=useRef(null);useEffect(()=>{if(H&&Q&&j.current===null)return j.current=requestAnimationFrame(()=>{j.current=null,_({smooth:false});}),()=>{j.current!==null&&(cancelAnimationFrame(j.current),j.current=null);}},[Ee,H,Q,_]);let we=useRef(null),fe=useRef(false),J=useRef(new Set);useEffect(()=>{fe.current=false;let b=we.current,L=H?{id:H.id,status:H.status}:null;if(b&&(!L||L.id!==b.id)){let V=t.find(W=>W.id===b.id);if(V&&V.role==="assistant"){if(V.status==="complete"){let W=requestAnimationFrame(()=>{J.current.delete(W);let Le=(de.current.get(V.id)?.innerText??V.content??"").toString(),Mt=lt(Le),Ve=ct(Mt,P);Ve&&Y(`Assistant replied: ${Ve}`);});J.current.add(W);}else if(V.status==="error"){fe.current=true,Y("Response failed");let W=requestAnimationFrame(()=>{J.current.delete(W),ce.current?.querySelector(`[data-message-id="${En(V.id)}"]`)?.querySelector('[data-action="retry"]')?.focus();});J.current.add(W);}}}we.current=L;},[H,t,P,Y]),useEffect(()=>{let b=J.current;return ()=>{for(let L of b)cancelAnimationFrame(L);b.clear();}},[]);let ke=useRef(o);return useEffect(()=>{let b=ke.current;ke.current=o,b==="streaming"&&o==="idle"&&!fe.current&&Y("Generation stopped");},[o,Y]),mt({isStreaming:o==="streaming",streamingContentLength:Ee,enabled:S,message:"Assistant is still working",onAnnounce:Y}),useImperativeHandle(r,()=>({focusInput:()=>Me.current?.focus(),scrollToBottom:b=>_(b)}),[_]),jsxs("section",{className:x(qe(),w,"relative"),"aria-label":h,"data-testid":z,"data-themis-chatinterface":true,children:[y?jsx("div",{className:Ye(),children:y}):null,jsx(ut,{ref:ce,messages:t,streamingMessageId:Rt,assistantAvatar:m,userAvatar:p,renderAssistantContent:c,renderUserContent:g,thinkingDisclosureLabel:M,logLabel:C,emptyState:v,onRetry:a,onEscalate:f,registerStreamingContentRef:St,bottomSentinelRef:Ie,testId:z?`${z}-log`:void 0}),jsx("div",{className:tt({visible:!Q&&t.length>0}),children:jsx(O,{variant:"secondary",visualSize:"icon","aria-label":"Jump to latest message",onPress:()=>_({smooth:!le}),"data-action":"jump-to-latest",children:jsx(ArrowDown,{"aria-hidden":"true"})})}),jsx(bt,{status:o,consumerDisabled:R,inputComponent:l,placeholder:I,maxInputLength:N,sendShortcut:d,inputActions:A,inputAriaLabel:I,onSendMessage:u,onStopGeneration:i,registerInputHandle:b=>{Me.current=b;}}),jsx(ot,{current:At,testId:z?`${z}-status`:void 0})]})});yt.displayName="ChatInterface";function En(n){return typeof CSS<"u"&&typeof CSS.escape=="function"?CSS.escape(n):n.replace(/["\\]/g,"\\$&")}export{yt as ChatInterface,Ae as ChatInterfacePropsSchema,xt as ChatMessageSchema};//# sourceMappingURL=index.mjs.map
|
|
3
3
|
//# sourceMappingURL=index.mjs.map
|