@tribepad/themis 1.5.7 → 1.5.9

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 (179) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/elements/AlertDialog/index.js +1 -1
  3. package/dist/elements/AlertDialog/index.js.map +1 -1
  4. package/dist/elements/AlertDialog/index.mjs +1 -1
  5. package/dist/elements/AlertDialog/index.mjs.map +1 -1
  6. package/dist/elements/Badge/index.js +1 -1
  7. package/dist/elements/Badge/index.js.map +1 -1
  8. package/dist/elements/Badge/index.mjs +1 -1
  9. package/dist/elements/Badge/index.mjs.map +1 -1
  10. package/dist/elements/Breadcrumbs/index.js +1 -1
  11. package/dist/elements/Breadcrumbs/index.js.map +1 -1
  12. package/dist/elements/Breadcrumbs/index.mjs +1 -1
  13. package/dist/elements/Breadcrumbs/index.mjs.map +1 -1
  14. package/dist/elements/Button/index.js +1 -1
  15. package/dist/elements/Button/index.js.map +1 -1
  16. package/dist/elements/Button/index.mjs +1 -1
  17. package/dist/elements/Button/index.mjs.map +1 -1
  18. package/dist/elements/Card/index.js +1 -1
  19. package/dist/elements/Card/index.js.map +1 -1
  20. package/dist/elements/Card/index.mjs +1 -1
  21. package/dist/elements/Card/index.mjs.map +1 -1
  22. package/dist/elements/Carousel/index.js +1 -1
  23. package/dist/elements/Carousel/index.js.map +1 -1
  24. package/dist/elements/Carousel/index.mjs +1 -1
  25. package/dist/elements/Carousel/index.mjs.map +1 -1
  26. package/dist/elements/Chart/index.js +1 -1
  27. package/dist/elements/Chart/index.js.map +1 -1
  28. package/dist/elements/Chart/index.mjs +1 -1
  29. package/dist/elements/Chart/index.mjs.map +1 -1
  30. package/dist/elements/ChatInterface/index.js +1 -1
  31. package/dist/elements/ChatInterface/index.js.map +1 -1
  32. package/dist/elements/ChatInterface/index.mjs +1 -1
  33. package/dist/elements/ChatInterface/index.mjs.map +1 -1
  34. package/dist/elements/Checkbox/index.js +1 -1
  35. package/dist/elements/Checkbox/index.js.map +1 -1
  36. package/dist/elements/Checkbox/index.mjs +1 -1
  37. package/dist/elements/Checkbox/index.mjs.map +1 -1
  38. package/dist/elements/CheckboxGroup/index.js +1 -1
  39. package/dist/elements/CheckboxGroup/index.js.map +1 -1
  40. package/dist/elements/CheckboxGroup/index.mjs +1 -1
  41. package/dist/elements/CheckboxGroup/index.mjs.map +1 -1
  42. package/dist/elements/ColorPicker/index.js +1 -1
  43. package/dist/elements/ColorPicker/index.js.map +1 -1
  44. package/dist/elements/ColorPicker/index.mjs +1 -1
  45. package/dist/elements/ColorPicker/index.mjs.map +1 -1
  46. package/dist/elements/Combobox/Combobox.styles.d.ts.map +1 -1
  47. package/dist/elements/Combobox/index.js +1 -1
  48. package/dist/elements/Combobox/index.js.map +1 -1
  49. package/dist/elements/Combobox/index.mjs +1 -1
  50. package/dist/elements/Combobox/index.mjs.map +1 -1
  51. package/dist/elements/DatePicker/index.js +1 -1
  52. package/dist/elements/DatePicker/index.js.map +1 -1
  53. package/dist/elements/DatePicker/index.mjs +1 -1
  54. package/dist/elements/DatePicker/index.mjs.map +1 -1
  55. package/dist/elements/Dropdown/index.js +1 -1
  56. package/dist/elements/Dropdown/index.js.map +1 -1
  57. package/dist/elements/Dropdown/index.mjs +1 -1
  58. package/dist/elements/Dropdown/index.mjs.map +1 -1
  59. package/dist/elements/FileField/index.js +1 -1
  60. package/dist/elements/FileField/index.js.map +1 -1
  61. package/dist/elements/FileField/index.mjs +1 -1
  62. package/dist/elements/FileField/index.mjs.map +1 -1
  63. package/dist/elements/Modal/Modal.styles.d.ts.map +1 -1
  64. package/dist/elements/Modal/index.js +1 -1
  65. package/dist/elements/Modal/index.js.map +1 -1
  66. package/dist/elements/Modal/index.mjs +1 -1
  67. package/dist/elements/Modal/index.mjs.map +1 -1
  68. package/dist/elements/NumberField/index.js +1 -1
  69. package/dist/elements/NumberField/index.js.map +1 -1
  70. package/dist/elements/NumberField/index.mjs +1 -1
  71. package/dist/elements/NumberField/index.mjs.map +1 -1
  72. package/dist/elements/PageTitle/PageTitle.d.ts.map +1 -1
  73. package/dist/elements/PageTitle/PageTitle.styles.d.ts.map +1 -1
  74. package/dist/elements/PageTitle/index.js +1 -1
  75. package/dist/elements/PageTitle/index.js.map +1 -1
  76. package/dist/elements/PageTitle/index.mjs +1 -1
  77. package/dist/elements/PageTitle/index.mjs.map +1 -1
  78. package/dist/elements/Pagination/index.js +1 -1
  79. package/dist/elements/Pagination/index.js.map +1 -1
  80. package/dist/elements/Pagination/index.mjs +1 -1
  81. package/dist/elements/Pagination/index.mjs.map +1 -1
  82. package/dist/elements/Panel/Panel.d.ts.map +1 -1
  83. package/dist/elements/Panel/index.js +1 -1
  84. package/dist/elements/Panel/index.js.map +1 -1
  85. package/dist/elements/Panel/index.mjs +1 -1
  86. package/dist/elements/Panel/index.mjs.map +1 -1
  87. package/dist/elements/PasswordField/index.js +1 -1
  88. package/dist/elements/PasswordField/index.js.map +1 -1
  89. package/dist/elements/PasswordField/index.mjs +1 -1
  90. package/dist/elements/PasswordField/index.mjs.map +1 -1
  91. package/dist/elements/RadioGroup/index.js +1 -1
  92. package/dist/elements/RadioGroup/index.js.map +1 -1
  93. package/dist/elements/RadioGroup/index.mjs +1 -1
  94. package/dist/elements/RadioGroup/index.mjs.map +1 -1
  95. package/dist/elements/RatingScale/RatingScale.styles.d.ts.map +1 -1
  96. package/dist/elements/RatingScale/index.js +1 -1
  97. package/dist/elements/RatingScale/index.js.map +1 -1
  98. package/dist/elements/RatingScale/index.mjs +1 -1
  99. package/dist/elements/RatingScale/index.mjs.map +1 -1
  100. package/dist/elements/Resizable/components/ResizablePopover.d.ts.map +1 -1
  101. package/dist/elements/Resizable/index.js +1 -1
  102. package/dist/elements/Resizable/index.js.map +1 -1
  103. package/dist/elements/Resizable/index.mjs +1 -1
  104. package/dist/elements/Resizable/index.mjs.map +1 -1
  105. package/dist/elements/SearchField/index.js +1 -1
  106. package/dist/elements/SearchField/index.js.map +1 -1
  107. package/dist/elements/SearchField/index.mjs +1 -1
  108. package/dist/elements/SearchField/index.mjs.map +1 -1
  109. package/dist/elements/Select/Select.styles.d.ts.map +1 -1
  110. package/dist/elements/Select/index.js +1 -1
  111. package/dist/elements/Select/index.js.map +1 -1
  112. package/dist/elements/Select/index.mjs +1 -1
  113. package/dist/elements/Select/index.mjs.map +1 -1
  114. package/dist/elements/Sidebar/Sidebar.styles.d.ts +34 -3
  115. package/dist/elements/Sidebar/Sidebar.styles.d.ts.map +1 -1
  116. package/dist/elements/Sidebar/Sidebar.types.d.ts +6 -0
  117. package/dist/elements/Sidebar/Sidebar.types.d.ts.map +1 -1
  118. package/dist/elements/Sidebar/SidebarPanel.d.ts.map +1 -1
  119. package/dist/elements/Sidebar/SidebarRail.d.ts.map +1 -1
  120. package/dist/elements/Sidebar/index.js +1 -1
  121. package/dist/elements/Sidebar/index.js.map +1 -1
  122. package/dist/elements/Sidebar/index.mjs +1 -1
  123. package/dist/elements/Sidebar/index.mjs.map +1 -1
  124. package/dist/elements/SituationalJudgement/index.js +1 -1
  125. package/dist/elements/SituationalJudgement/index.js.map +1 -1
  126. package/dist/elements/SituationalJudgement/index.mjs +1 -1
  127. package/dist/elements/SituationalJudgement/index.mjs.map +1 -1
  128. package/dist/elements/Switch/index.js +1 -1
  129. package/dist/elements/Switch/index.js.map +1 -1
  130. package/dist/elements/Switch/index.mjs +1 -1
  131. package/dist/elements/Switch/index.mjs.map +1 -1
  132. package/dist/elements/Table/index.js +1 -1
  133. package/dist/elements/Table/index.js.map +1 -1
  134. package/dist/elements/Table/index.mjs +1 -1
  135. package/dist/elements/Table/index.mjs.map +1 -1
  136. package/dist/elements/Tabs/Tabs.d.ts.map +1 -1
  137. package/dist/elements/Tabs/index.js +1 -1
  138. package/dist/elements/Tabs/index.js.map +1 -1
  139. package/dist/elements/Tabs/index.mjs +1 -1
  140. package/dist/elements/Tabs/index.mjs.map +1 -1
  141. package/dist/elements/TextField/index.js +1 -1
  142. package/dist/elements/TextField/index.js.map +1 -1
  143. package/dist/elements/TextField/index.mjs +1 -1
  144. package/dist/elements/TextField/index.mjs.map +1 -1
  145. package/dist/elements/Toast/Toast.d.ts.map +1 -1
  146. package/dist/elements/Toast/index.js +1 -1
  147. package/dist/elements/Toast/index.js.map +1 -1
  148. package/dist/elements/Toast/index.mjs +1 -1
  149. package/dist/elements/Toast/index.mjs.map +1 -1
  150. package/dist/elements/Tooltip/index.js +1 -1
  151. package/dist/elements/Tooltip/index.js.map +1 -1
  152. package/dist/elements/Tooltip/index.mjs +1 -1
  153. package/dist/elements/Tooltip/index.mjs.map +1 -1
  154. package/dist/elements/Wizard/Wizard.types.d.ts +19 -0
  155. package/dist/elements/Wizard/Wizard.types.d.ts.map +1 -1
  156. package/dist/elements/Wizard/WizardContent.d.ts +17 -8
  157. package/dist/elements/Wizard/WizardContent.d.ts.map +1 -1
  158. package/dist/elements/Wizard/index.js +1 -1
  159. package/dist/elements/Wizard/index.js.map +1 -1
  160. package/dist/elements/Wizard/index.mjs +1 -1
  161. package/dist/elements/Wizard/index.mjs.map +1 -1
  162. package/dist/elements/index.js +1 -1
  163. package/dist/elements/index.js.map +1 -1
  164. package/dist/elements/index.mjs +1 -1
  165. package/dist/elements/index.mjs.map +1 -1
  166. package/dist/index.js +2 -2
  167. package/dist/index.js.map +1 -1
  168. package/dist/index.mjs +2 -2
  169. package/dist/index.mjs.map +1 -1
  170. package/dist/styles/index.js +1 -1
  171. package/dist/styles/index.js.map +1 -1
  172. package/dist/styles/index.mjs +1 -1
  173. package/dist/styles/index.mjs.map +1 -1
  174. package/dist/styles/interaction-states.d.ts +2 -2
  175. package/dist/styles/interaction-states.d.ts.map +1 -1
  176. package/package.json +1 -1
  177. package/src/elements/PageTitle/PageTitle.stories.tsx +15 -19
  178. package/src/elements/Sidebar/Sidebar.stories.tsx +13 -2
  179. package/src/elements/Wizard/Wizard.stories.tsx +95 -0
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- 'use strict';var react=require('react'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),reactAriaComponents=require('react-aria-components'),lucideReact=require('lucide-react'),classVarianceAuthority=require('class-variance-authority'),jsxRuntime=require('react/jsx-runtime'),zod=require('zod');function x(...n){return tailwindMerge.twMerge(clsx.clsx(n))}var He="(prefers-reduced-motion: reduce)";function Lt(){return typeof window>"u"?false:window.matchMedia(He).matches}function G(){let[n,e]=react.useState(Lt);return react.useEffect(()=>{let r=window.matchMedia(He);e(r.matches);let t=o=>{e(o.matches);};return r.addEventListener("change",t),()=>r.removeEventListener("change",t)},[]),n}var Pe=classVarianceAuthority.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}}),ze=classVarianceAuthority.cva("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium 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)] shadow-md 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)] shadow-md 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-8",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)] !shadow-md 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 pe="data-[hovered]:shadow-md";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 Ge=react.createContext(null);Ge.displayName="ButtonGroupContext";function Fe(){return react.useContext(Ge)}var $e=react.createContext(null);$e.displayName="ButtonGroupItemContext";function We(){return react.useContext($e)}classVarianceAuthority.cva("inline-flex items-center gap-0",{variants:{orientation:{horizontal:"flex-row",vertical:"flex-col w-full"}},defaultVariants:{orientation:"horizontal"}});var qe=classVarianceAuthority.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"}});classVarianceAuthority.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=react.memo(react.forwardRef(({className:n,buttonVisualClassName:e,variant:r,size:t,visualSize:o,fullWidth:u,loading:i=false,loadingText:a="Loading...",shortcut:f,children:c,isDisabled:h,paywall:l=false,paywallRedirect:m,paywallDescription:p,onPress:y,...v},A)=>{let I=react.useId(),R=Fe(),N=We(),d=r??R?.variant??"default",S=t??R?.size,P=h??R?.isDisabled??false,g=R?.orientation==="vertical",C=u||g,M=N?qe({orientation:R?.orientation??"horizontal",position:N.position}):"",E=o??S??"default";return process.env.NODE_ENV!=="production"&&(E==="dot"||E==="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)'),jsxRuntime.jsx(reactAriaComponents.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(Pe({fullWidth:C,inVerticalGroup:g}),n),...v,children:$=>jsxRuntime.jsxs("span",{className:x(ze({variant:d,visualSize:E,paywall:l,fullWidth:C}),M,e,me,pe,oe,ae),"data-pressed":$.isPressed||void 0,children:[i&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(lucideReact.Loader2,{className:"motion-safe:animate-spin","aria-hidden":"true"}),jsxRuntime.jsx("span",{className:"sr-only","aria-live":"polite",children:a})]}),!i&&c,l&&jsxRuntime.jsx(lucideReact.Zap,{"data-testid":"zap-icon","aria-hidden":"true",className:"ml-1"}),l&&jsxRuntime.jsxs("span",{id:I,className:"sr-only",children:["Premium feature: ",p||"Upgrade required to access this feature"]}),$.isFocusVisible&&f&&jsxRuntime.jsx("kbd",{className:"ml-auto hidden text-xs opacity-60 lg:inline",children:f})]})})}));O.displayName="Button";var Ye=classVarianceAuthority.cva("flex flex-col h-full w-full bg-[var(--content-background)] text-[var(--content-foreground)]"),je=classVarianceAuthority.cva("flex-shrink-0 border-b border-[var(--border)] px-4 py-2"),Ke=classVarianceAuthority.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=classVarianceAuthority.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=classVarianceAuthority.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}}),be=classVarianceAuthority.cva("flex-shrink-0 self-end",{variants:{role:{user:"order-2",assistant:"order-1",system:"hidden"}},defaultVariants:{role:"assistant"}}),Qe=classVarianceAuthority.cva("flex-shrink-0 flex items-end gap-2 border-t border-[var(--border)] bg-[var(--content-background)] p-3"),Je=classVarianceAuthority.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}}),Xe=classVarianceAuthority.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]"),Ze=classVarianceAuthority.cva("inline-flex items-center gap-1 px-2 py-1",{variants:{animate:{true:"[&>span]:motion-safe:animate-pulse",false:""}},defaultVariants:{animate:true}}),et=classVarianceAuthority.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}}),tt=classVarianceAuthority.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"}}),nt=classVarianceAuthority.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}}),rt=classVarianceAuthority.cva("sr-only"),ot=classVarianceAuthority.cva("mt-2 flex flex-wrap items-center gap-2");var at=react.memo(function({current:e,className:r,testId:t}){return jsxRuntime.jsx("div",{role:"status","aria-live":"polite","aria-atomic":"true",className:x(rt(),r),"data-testid":t,children:e})});var st=react.memo(function({className:e}){let r=G();return jsxRuntime.jsxs("span",{className:x(Ze({animate:!r}),e),"aria-hidden":"true",children:[jsxRuntime.jsx("span",{className:"inline-block h-1.5 w-1.5 rounded-full bg-[var(--muted-foreground)]"}),jsxRuntime.jsx("span",{className:"inline-block h-1.5 w-1.5 rounded-full bg-[var(--muted-foreground)]",style:{animationDelay:"0.15s"}}),jsxRuntime.jsx("span",{className:"inline-block h-1.5 w-1.5 rounded-full bg-[var(--muted-foreground)]",style:{animationDelay:"0.3s"}})]})});var it=react.memo(function({parts:e,mode:r,disclosureLabel:t,className:o}){let u=G();if(e.length===0)return null;let i=jsxRuntime.jsx("div",{className:"flex flex-col gap-1",children:e.map((a,f)=>{if(a.kind==="text")return jsxRuntime.jsx("p",{className:"text-xs text-[var(--muted-foreground)]",children:a.text},f);let c=a.status==="running"?lucideReact.Loader2:a.status==="done"?lucideReact.Check:lucideReact.AlertCircle,h=a.status==="running"?"running":a.status==="done"?"completed":"failed";return jsxRuntime.jsxs("div",{className:tt({status:a.status}),children:[jsxRuntime.jsx(c,{className:x("h-3 w-3",a.status==="running"&&!u&&"motion-safe:animate-spin"),"aria-hidden":"true"}),jsxRuntime.jsxs("span",{className:"sr-only",children:[a.name," tool, "]}),jsxRuntime.jsx("span",{className:"font-medium",children:a.name}),jsxRuntime.jsx("span",{"aria-hidden":"true",className:"text-[var(--muted-foreground)]",children:"\xB7"}),jsxRuntime.jsx("span",{children:h}),a.summary?jsxRuntime.jsxs("span",{className:"ml-1 text-[var(--muted-foreground)]",children:["\u2014 ",a.summary]}):null]},f)})});return r==="active"?jsxRuntime.jsxs("div",{className:x("flex flex-col gap-2",o),children:[jsxRuntime.jsx("span",{className:et({animate:!u}),children:"Thinking\u2026"}),i]}):jsxRuntime.jsxs("details",{className:x("mt-2 text-xs",o),children:[jsxRuntime.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}),jsxRuntime.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 xe=react.memo(function(e){let r=G(),{message:t,isStreamingHere:o,isOffscreen:u,assistantAvatar:i,userAvatar:a,renderAssistantContent:f,renderUserContent:c,thinkingDisclosureLabel:h,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:h,contentRef:l,onRetry:m,onEscalate:p,prefersReducedMotion:r})},Kt);xe.displayName="ChatMessageBubble";function Qt(n){return jsxRuntime.jsx("div",{className:se({align:"system",offscreen:false}),children:jsxRuntime.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):jsxRuntime.jsx("div",{className:"whitespace-pre-wrap text-sm",children:n.content});return jsxRuntime.jsxs("div",{className:se({align:"user",offscreen:t}),children:[e?jsxRuntime.jsx("div",{className:be({role:"user"}),children:e}):null,jsxRuntime.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:h}=n,l=e.status==="error",m=e.status==="thinking",p=r&&!m&&h&&e.status==="streaming",y=u?u(e):jsxRuntime.jsx("div",{className:"whitespace-pre-wrap text-sm",children:e.content});return jsxRuntime.jsxs("div",{className:se({align:"assistant",offscreen:t&&!(r||m)}),children:[o?jsxRuntime.jsx("div",{className:be({role:"assistant"}),children:o}):null,jsxRuntime.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&&jsxRuntime.jsx(it,{parts:e.parts,mode:m?"active":"collapsed",disclosureLabel:i}),!m&&!p&&jsxRuntime.jsx("div",{ref:a,"data-content":true,children:y}),p&&jsxRuntime.jsx("div",{className:"text-sm text-[var(--muted-foreground)]","data-streaming-placeholder":true,children:"Generating response\u2026"}),r&&!m&&jsxRuntime.jsx(st,{}),l&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[e.errorMessage?jsxRuntime.jsx("p",{className:"text-xs text-[var(--content-foreground)]",children:e.errorMessage}):null,jsxRuntime.jsxs("div",{className:ot(),children:[f?jsxRuntime.jsx(O,{variant:"outline",size:"sm",onPress:()=>f(e.id),"data-action":"retry",children:"Try again"}):null,c?jsxRuntime.jsx(O,{variant:"ghost",size:"sm",onPress:c,"data-action":"escalate",children:"Submit a support request"}):null]})]})]})]})}var nn=200,lt=react.forwardRef(function({messages:e,streamingMessageId:r,assistantAvatar:t,userAvatar:o,renderAssistantContent:u,renderUserContent:i,thinkingDisclosureLabel:a,logLabel:f,emptyState:c,onRetry:h,onEscalate:l,registerStreamingContentRef:m,bottomSentinelRef:p,className:y,testId:v},A){let I=react.useMemo(()=>{let g=new Set;for(let C=Math.max(0,e.length-5);C<e.length;C++){let M=e[C];M&&g.add(M.id);}return g},[e]),R=react.useRef(new Map),N=react.useRef(void 0);N.current!==u&&(R.current.clear(),N.current=u);let d=react.useMemo(()=>{if(u)return g=>{let C=R.current,M=C.get(g.id);if(M&&M.content===g.content)return C.delete(g.id),C.set(g.id,M),M.node;let E=u(g);if(C.set(g.id,{content:g.content,node:E}),C.size>nn){let z=C.keys().next().value;z!==void 0&&C.delete(z);}return E}},[u]),S=react.useRef(new Map),P=react.useCallback(g=>{if(!m)return;let C=S.current,M=C.get(g);return M||(M=E=>{m(g,E),E===null&&C.delete(g);},C.set(g,M)),M},[m]);return jsxRuntime.jsxs("div",{ref:A,role:"log","aria-label":f,tabIndex:0,className:x(Ke(),y),"data-testid":v,children:[e.length===0&&c?jsxRuntime.jsx("div",{className:"flex h-full items-center justify-center",children:c}):null,e.map(g=>{let C=r===g.id,M=!I.has(g.id),E=g.role==="assistant"?P(g.id):void 0;return jsxRuntime.jsx(xe,{message:g,isStreamingHere:C,isOffscreen:M,assistantAvatar:t,userAvatar:o,renderAssistantContent:d,renderUserContent:i,thinkingDisclosureLabel:a,contentRef:E,onRetry:h,onEscalate:l},g.id)}),jsxRuntime.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 ct(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 dt(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 ft(n,e,r=6){let[t]=react.useState(sn),o=react.useRef(null),u=react.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),h=Number.isFinite(c)?c*r:0;a.style.height="auto";let l=h>0?Math.min(a.scrollHeight,h):a.scrollHeight;a.style.height=`${l}px`,a.style.overflowY=a.scrollHeight>l?"auto":"hidden";}));},[n,t,r]);react.useLayoutEffect(()=>{u();},[e,u]),react.useEffect(()=>()=>{o.current!==null&&(cancelAnimationFrame(o.current),o.current=null);},[]);}function mt(n,e,r){let[t,o]=react.useState(true);react.useEffect(()=>{let i=n.current,a=e.current;if(!i||!a||typeof IntersectionObserver>"u")return;let f=new IntersectionObserver(c=>{let h=c[c.length-1];h&&o(h.isIntersecting);},{root:i,rootMargin:"0px 0px 256px 0px",threshold:0});return f.observe(a),()=>f.disconnect()},[n,e]);let u=react.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 Se=[3e3,15e3,6e4];function pt(n){let{isStreaming:e,streamingContentLength:r,enabled:t,message:o,onAnnounce:u}=n,i=react.useRef(0),a=react.useRef(0),f=react.useRef(r),c=react.useRef(null),h=react.useRef(o),l=react.useRef(u);r>f.current&&(f.current=r,i.current=Date.now());let m=react.useCallback(()=>{c.current!==null&&(clearTimeout(c.current),c.current=null);},[]);react.useEffect(()=>{h.current=o,l.current=u;}),react.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>=Se.length)return;let v=Se[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=Se[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(h.current),p();}},I);};return p(),m},[e,t,m]);}var un=200,ln=32;function ht(n){let e=500,r=1e3,t=un,o=ln,[u,i]=react.useState(""),a=react.useRef([]),f=react.useRef(0),c=react.useRef(""),h=react.useRef(0),l=react.useRef(null),m=react.useRef(true),p=react.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,h.current=A,i(v),l.current=setTimeout(()=>{l.current=null,m.current&&(i(""),a.current.length>0&&p());},t);},0));},[e,t]),y=react.useCallback(v=>{if(!v)return;let A=Date.now();v===c.current&&A-h.current<r||(a.current.length>=o&&a.current.shift(),a.current.push(v),p());},[r,p,o]);return react.useEffect(()=>()=>{m.current=false,l.current!==null&&(clearTimeout(l.current),l.current=null);},[]),{current:u,enqueue:y}}var bt=react.forwardRef(function({isDisabled:e,placeholder:r,maxLength:t,"aria-label":o,onSubmit:u,onChange:i,onFocus:a,onBlur:f,sendShortcut:c="enter"},h){let[l,m]=react.useState(""),p=react.useRef(null);ft(p,l);let y=react.useRef(l),v=react.useRef(e),A=react.useRef(u),I=react.useRef(i);react.useLayoutEffect(()=>{y.current=l,v.current=e,A.current=u,I.current=i;});let R=react.useCallback(()=>{if(v.current)return;let d=y.current;d.trim().length!==0&&A.current(d);},[]);react.useImperativeHandle(h,()=>({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=react.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 jsxRuntime.jsx("div",{className:Je({isDisabled:e}),children:jsxRuntime.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(Xe())})})});function Ct({status:n,consumerDisabled:e,inputComponent:r,placeholder:t,maxInputLength:o,sendShortcut:u,inputActions:i,inputAriaLabel:a,onSendMessage:f,onStopGeneration:c,registerInputHandle:h,className:l}){let m=e||n==="streaming"||n==="error",p=react.useRef(null),y=react.useCallback(d=>{p.current=d,h(d);},[h]),v=react.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=react.useCallback(()=>{p.current?.submit();},[]),I=react.useCallback(()=>{c?.();},[c]),R=n==="streaming",N=r;return jsxRuntime.jsxs("div",{className:x(Qe(),l),children:[jsxRuntime.jsx("div",{className:"flex-1 min-w-0",children:N?jsxRuntime.jsx(N,{ref:y,isDisabled:m,placeholder:t,maxLength:o,"aria-label":a,onSubmit:v}):jsxRuntime.jsx(bt,{ref:y,isDisabled:m,placeholder:t,maxLength:o,"aria-label":a,onSubmit:v,sendShortcut:u})}),i?jsxRuntime.jsx("div",{className:"flex-shrink-0",children:i}):null,R?jsxRuntime.jsx(O,{variant:"destructive",visualSize:"icon","aria-label":"Stop generating",onPress:I,"data-action":"stop",children:jsxRuntime.jsx(lucideReact.StopCircle,{"aria-hidden":"true"})}):jsxRuntime.jsx(O,{variant:"default",visualSize:"icon","aria-label":"Send message",isDisabled:e,onPress:A,"data-action":"send",children:jsxRuntime.jsx(lucideReact.Send,{"aria-hidden":"true"})})]})}var xt=zod.z.object({className:zod.z.string().optional(),children:zod.z.any().optional(),id:zod.z.string().optional(),"aria-label":zod.z.string().optional(),"aria-labelledby":zod.z.string().optional(),"aria-describedby":zod.z.string().optional(),"aria-live":zod.z.enum(["off","polite","assertive"]).optional(),"aria-hidden":zod.z.boolean().optional(),"data-testid":zod.z.string().optional()});zod.z.enum(["user","assistant","system"]);var bn=zod.z.enum(["complete","streaming","thinking","error"]),Cn=zod.z.enum(["idle","streaming","error"]),xn=zod.z.discriminatedUnion("kind",[zod.z.object({kind:zod.z.literal("text"),text:zod.z.string()}).strict(),zod.z.object({kind:zod.z.literal("tool_call"),name:zod.z.string(),status:zod.z.enum(["running","done","error"]),summary:zod.z.string().optional()}).strict()]),yn=zod.z.object({id:zod.z.string(),role:zod.z.literal("user"),status:zod.z.enum(["complete","error"]),content:zod.z.string(),createdAt:zod.z.number().optional()}).strict(),Rn=zod.z.object({id:zod.z.string(),role:zod.z.literal("assistant"),status:bn,content:zod.z.string(),parts:zod.z.array(xn).optional(),errorMessage:zod.z.string().optional(),createdAt:zod.z.number().optional()}).strict(),Sn=zod.z.object({id:zod.z.string(),role:zod.z.literal("system"),status:zod.z.literal("complete"),content:zod.z.unknown(),announce:zod.z.boolean().optional(),createdAt:zod.z.number().optional()}).strict(),yt=zod.z.union([yn,Rn,Sn]),Ie=xt.extend({status:Cn,messages:zod.z.array(yt),onSendMessage:zod.z.custom(),onStopGeneration:zod.z.custom().optional(),onRetry:zod.z.custom().optional(),onEscalate:zod.z.custom().optional(),renderAssistantContent:zod.z.any().optional(),renderUserContent:zod.z.any().optional(),inputComponent:zod.z.any().optional(),assistantAvatar:zod.z.any().optional(),userAvatar:zod.z.any().optional(),header:zod.z.any().optional(),emptyState:zod.z.any().optional(),inputActions:zod.z.any().optional(),placeholder:zod.z.string().optional(),isDisabled:zod.z.boolean().optional(),maxInputLength:zod.z.number().int().positive().optional(),sendShortcut:zod.z.enum(["enter","mod-enter"]).optional(),progressAnnouncements:zod.z.boolean().optional(),completionAnnouncementMaxChars:zod.z.number().int().positive().optional(),logLabel:zod.z.string().optional(),thinkingDisclosureLabel:zod.z.string().optional()}).strict();var Rt=react.forwardRef(function(e,r){let{messages:t,status:o,onSendMessage:u,onStopGeneration:i,onRetry:a,onEscalate:f,renderAssistantContent:c,renderUserContent:h,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":g="Chat",logLabel:C="Conversation transcript",thinkingDisclosureLabel:M="Thoughts",className:E,"data-testid":z}=e;if(process.env.NODE_ENV!=="production"){try{Ie.parse(e);}catch(b){console.warn("[ChatInterface] props failed validation:",b);}l&&!h&&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(),$=react.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=react.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]),St=H?.id??null,ce=react.useRef(null),Me=react.useRef(null),Ne=react.useRef(null),de=react.useRef(new Map),At=react.useCallback((b,L)=>{L?de.current.set(b,L):de.current.delete(b);},[]),{current:It,enqueue:Y}=ht(),{isAtBottom:Q,scrollToBottom:_}=mt(ce,Me,le),Te=react.useRef(false);react.useEffect(()=>{Te.current||(Te.current=true,_({smooth:false}));},[_]);let we=react.useRef(t);react.useEffect(()=>{let b=we.current;we.current=t,t.length>b.length&&Q&&_({smooth:false});},[t,Q,_]);let Ee=H&&H.status==="streaming"?H.content.length:0,j=react.useRef(null);react.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 ke=react.useRef(null),fe=react.useRef(false),J=react.useRef(new Set);react.useEffect(()=>{fe.current=false;let b=ke.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 Ve=(de.current.get(V.id)?.innerText??V.content??"").toString(),Nt=ct(Ve),De=dt(Nt,P);De&&Y(`Assistant replied: ${De}`);});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="${wn(V.id)}"]`)?.querySelector('[data-action="retry"]')?.focus();});J.current.add(W);}}}ke.current=L;},[H,t,P,Y]),react.useEffect(()=>{let b=J.current;return ()=>{for(let L of b)cancelAnimationFrame(L);b.clear();}},[]);let Le=react.useRef(o);return react.useEffect(()=>{let b=Le.current;Le.current=o,b==="streaming"&&o==="idle"&&!fe.current&&Y("Generation stopped");},[o,Y]),pt({isStreaming:o==="streaming",streamingContentLength:Ee,enabled:S,message:"Assistant is still working",onAnnounce:Y}),react.useImperativeHandle(r,()=>({focusInput:()=>Ne.current?.focus(),scrollToBottom:b=>_(b)}),[_]),jsxRuntime.jsxs("section",{className:x(Ye(),E,"relative"),"aria-label":g,"data-testid":z,"data-themis-chatinterface":true,children:[y?jsxRuntime.jsx("div",{className:je(),children:y}):null,jsxRuntime.jsx(lt,{ref:ce,messages:t,streamingMessageId:St,assistantAvatar:m,userAvatar:p,renderAssistantContent:c,renderUserContent:h,thinkingDisclosureLabel:M,logLabel:C,emptyState:v,onRetry:a,onEscalate:f,registerStreamingContentRef:At,bottomSentinelRef:Me,testId:z?`${z}-log`:void 0}),jsxRuntime.jsx("div",{className:nt({visible:!Q&&t.length>0}),children:jsxRuntime.jsx(O,{variant:"secondary",visualSize:"icon","aria-label":"Jump to latest message",onPress:()=>_({smooth:!le}),"data-action":"jump-to-latest",children:jsxRuntime.jsx(lucideReact.ArrowDown,{"aria-hidden":"true"})})}),jsxRuntime.jsx(Ct,{status:o,consumerDisabled:R,inputComponent:l,placeholder:I,maxInputLength:N,sendShortcut:d,inputActions:A,inputAriaLabel:I,onSendMessage:u,onStopGeneration:i,registerInputHandle:b=>{Ne.current=b;}}),jsxRuntime.jsx(at,{current:It,testId:z?`${z}-status`:void 0})]})});Rt.displayName="ChatInterface";function wn(n){return typeof CSS<"u"&&typeof CSS.escape=="function"?CSS.escape(n):n.replace(/["\\]/g,"\\$&")}exports.ChatInterface=Rt;exports.ChatInterfacePropsSchema=Ie;exports.ChatMessageSchema=yt;//# sourceMappingURL=index.js.map
2
+ 'use strict';var react=require('react'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),reactAriaComponents=require('react-aria-components'),lucideReact=require('lucide-react'),classVarianceAuthority=require('class-variance-authority'),jsxRuntime=require('react/jsx-runtime'),zod=require('zod');function x(...n){return tailwindMerge.twMerge(clsx.clsx(n))}var De="(prefers-reduced-motion: reduce)";function kt(){return typeof window>"u"?false:window.matchMedia(De).matches}function G(){let[n,e]=react.useState(kt);return react.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=classVarianceAuthority.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=classVarianceAuthority.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=react.createContext(null);Ue.displayName="ButtonGroupContext";function Ge(){return react.useContext(Ue)}var Fe=react.createContext(null);Fe.displayName="ButtonGroupItemContext";function $e(){return react.useContext(Fe)}classVarianceAuthority.cva("inline-flex items-center gap-0",{variants:{orientation:{horizontal:"flex-row",vertical:"flex-col w-full"}},defaultVariants:{orientation:"horizontal"}});var We=classVarianceAuthority.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"}});classVarianceAuthority.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=react.memo(react.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=react.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)'),jsxRuntime.jsx(reactAriaComponents.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:$=>jsxRuntime.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&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(lucideReact.Loader2,{className:"motion-safe:animate-spin","aria-hidden":"true"}),jsxRuntime.jsx("span",{className:"sr-only","aria-live":"polite",children:a})]}),!i&&c,l&&jsxRuntime.jsx(lucideReact.Zap,{"data-testid":"zap-icon","aria-hidden":"true",className:"ml-1"}),l&&jsxRuntime.jsxs("span",{id:I,className:"sr-only",children:["Premium feature: ",p||"Upgrade required to access this feature"]}),$.isFocusVisible&&f&&jsxRuntime.jsx("kbd",{className:"ml-auto hidden text-xs opacity-60 lg:inline",children:f})]})})}));O.displayName="Button";var qe=classVarianceAuthority.cva("flex flex-col h-full w-full bg-[var(--content-background)] text-[var(--content-foreground)]"),Ye=classVarianceAuthority.cva("flex-shrink-0 border-b border-[var(--border)] px-4 py-2"),je=classVarianceAuthority.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=classVarianceAuthority.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=classVarianceAuthority.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=classVarianceAuthority.cva("flex-shrink-0 self-end",{variants:{role:{user:"order-2",assistant:"order-1",system:"hidden"}},defaultVariants:{role:"assistant"}}),Ke=classVarianceAuthority.cva("flex-shrink-0 flex items-end gap-2 border-t border-[var(--border)] bg-[var(--content-background)] p-3"),Qe=classVarianceAuthority.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=classVarianceAuthority.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=classVarianceAuthority.cva("inline-flex items-center gap-1 px-2 py-1",{variants:{animate:{true:"[&>span]:motion-safe:animate-pulse",false:""}},defaultVariants:{animate:true}}),Ze=classVarianceAuthority.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=classVarianceAuthority.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=classVarianceAuthority.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=classVarianceAuthority.cva("sr-only"),rt=classVarianceAuthority.cva("mt-2 flex flex-wrap items-center gap-2");var ot=react.memo(function({current:e,className:r,testId:t}){return jsxRuntime.jsx("div",{role:"status","aria-live":"polite","aria-atomic":"true",className:x(nt(),r),"data-testid":t,children:e})});var at=react.memo(function({className:e}){let r=G();return jsxRuntime.jsxs("span",{className:x(Xe({animate:!r}),e),"aria-hidden":"true",children:[jsxRuntime.jsx("span",{className:"inline-block h-1.5 w-1.5 rounded-full bg-[var(--muted-foreground)]"}),jsxRuntime.jsx("span",{className:"inline-block h-1.5 w-1.5 rounded-full bg-[var(--muted-foreground)]",style:{animationDelay:"0.15s"}}),jsxRuntime.jsx("span",{className:"inline-block h-1.5 w-1.5 rounded-full bg-[var(--muted-foreground)]",style:{animationDelay:"0.3s"}})]})});var st=react.memo(function({parts:e,mode:r,disclosureLabel:t,className:o}){let u=G();if(e.length===0)return null;let i=jsxRuntime.jsx("div",{className:"flex flex-col gap-1",children:e.map((a,f)=>{if(a.kind==="text")return jsxRuntime.jsx("p",{className:"text-xs text-[var(--muted-foreground)]",children:a.text},f);let c=a.status==="running"?lucideReact.Loader2:a.status==="done"?lucideReact.Check:lucideReact.AlertCircle,g=a.status==="running"?"running":a.status==="done"?"completed":"failed";return jsxRuntime.jsxs("div",{className:et({status:a.status}),children:[jsxRuntime.jsx(c,{className:x("h-3 w-3",a.status==="running"&&!u&&"motion-safe:animate-spin"),"aria-hidden":"true"}),jsxRuntime.jsxs("span",{className:"sr-only",children:[a.name," tool, "]}),jsxRuntime.jsx("span",{className:"font-medium",children:a.name}),jsxRuntime.jsx("span",{"aria-hidden":"true",className:"text-[var(--muted-foreground)]",children:"\xB7"}),jsxRuntime.jsx("span",{children:g}),a.summary?jsxRuntime.jsxs("span",{className:"ml-1 text-[var(--muted-foreground)]",children:["\u2014 ",a.summary]}):null]},f)})});return r==="active"?jsxRuntime.jsxs("div",{className:x("flex flex-col gap-2",o),children:[jsxRuntime.jsx("span",{className:Ze({animate:!u}),children:"Thinking\u2026"}),i]}):jsxRuntime.jsxs("details",{className:x("mt-2 text-xs",o),children:[jsxRuntime.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}),jsxRuntime.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=react.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 jsxRuntime.jsx("div",{className:se({align:"system",offscreen:false}),children:jsxRuntime.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):jsxRuntime.jsx("div",{className:"whitespace-pre-wrap text-sm",children:n.content});return jsxRuntime.jsxs("div",{className:se({align:"user",offscreen:t}),children:[e?jsxRuntime.jsx("div",{className:ve({role:"user"}),children:e}):null,jsxRuntime.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):jsxRuntime.jsx("div",{className:"whitespace-pre-wrap text-sm",children:e.content});return jsxRuntime.jsxs("div",{className:se({align:"assistant",offscreen:t&&!(r||m)}),children:[o?jsxRuntime.jsx("div",{className:ve({role:"assistant"}),children:o}):null,jsxRuntime.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&&jsxRuntime.jsx(st,{parts:e.parts,mode:m?"active":"collapsed",disclosureLabel:i}),!m&&!p&&jsxRuntime.jsx("div",{ref:a,"data-content":true,children:y}),p&&jsxRuntime.jsx("div",{className:"text-sm text-[var(--muted-foreground)]","data-streaming-placeholder":true,children:"Generating response\u2026"}),r&&!m&&jsxRuntime.jsx(at,{}),l&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[e.errorMessage?jsxRuntime.jsx("p",{className:"text-xs text-[var(--content-foreground)]",children:e.errorMessage}):null,jsxRuntime.jsxs("div",{className:rt(),children:[f?jsxRuntime.jsx(O,{variant:"outline",size:"sm",onPress:()=>f(e.id),"data-action":"retry",children:"Try again"}):null,c?jsxRuntime.jsx(O,{variant:"ghost",size:"sm",onPress:c,"data-action":"escalate",children:"Submit a support request"}):null]})]})]})]})}var nn=200,ut=react.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=react.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=react.useRef(new Map),N=react.useRef(void 0);N.current!==u&&(R.current.clear(),N.current=u);let d=react.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=react.useRef(new Map),P=react.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 jsxRuntime.jsxs("div",{ref:A,role:"log","aria-label":f,tabIndex:0,className:x(je(),y),"data-testid":v,children:[e.length===0&&c?jsxRuntime.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 jsxRuntime.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)}),jsxRuntime.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]=react.useState(sn),o=react.useRef(null),u=react.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]);react.useLayoutEffect(()=>{u();},[e,u]),react.useEffect(()=>()=>{o.current!==null&&(cancelAnimationFrame(o.current),o.current=null);},[]);}function ft(n,e,r){let[t,o]=react.useState(true);react.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=react.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=react.useRef(0),a=react.useRef(0),f=react.useRef(r),c=react.useRef(null),g=react.useRef(o),l=react.useRef(u);r>f.current&&(f.current=r,i.current=Date.now());let m=react.useCallback(()=>{c.current!==null&&(clearTimeout(c.current),c.current=null);},[]);react.useEffect(()=>{g.current=o,l.current=u;}),react.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]=react.useState(""),a=react.useRef([]),f=react.useRef(0),c=react.useRef(""),g=react.useRef(0),l=react.useRef(null),m=react.useRef(true),p=react.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=react.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 react.useEffect(()=>()=>{m.current=false,l.current!==null&&(clearTimeout(l.current),l.current=null);},[]),{current:u,enqueue:y}}var vt=react.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]=react.useState(""),p=react.useRef(null);dt(p,l);let y=react.useRef(l),v=react.useRef(e),A=react.useRef(u),I=react.useRef(i);react.useLayoutEffect(()=>{y.current=l,v.current=e,A.current=u,I.current=i;});let R=react.useCallback(()=>{if(v.current)return;let d=y.current;d.trim().length!==0&&A.current(d);},[]);react.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=react.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 jsxRuntime.jsx("div",{className:Qe({isDisabled:e}),children:jsxRuntime.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=react.useRef(null),y=react.useCallback(d=>{p.current=d,g(d);},[g]),v=react.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=react.useCallback(()=>{p.current?.submit();},[]),I=react.useCallback(()=>{c?.();},[c]),R=n==="streaming",N=r;return jsxRuntime.jsxs("div",{className:x(Ke(),l),children:[jsxRuntime.jsx("div",{className:"flex-1 min-w-0",children:N?jsxRuntime.jsx(N,{ref:y,isDisabled:m,placeholder:t,maxLength:o,"aria-label":a,onSubmit:v}):jsxRuntime.jsx(vt,{ref:y,isDisabled:m,placeholder:t,maxLength:o,"aria-label":a,onSubmit:v,sendShortcut:u})}),i?jsxRuntime.jsx("div",{className:"flex-shrink-0",children:i}):null,R?jsxRuntime.jsx(O,{variant:"destructive",visualSize:"icon","aria-label":"Stop generating",onPress:I,"data-action":"stop",children:jsxRuntime.jsx(lucideReact.StopCircle,{"aria-hidden":"true"})}):jsxRuntime.jsx(O,{variant:"default",visualSize:"icon","aria-label":"Send message",isDisabled:e,onPress:A,"data-action":"send",children:jsxRuntime.jsx(lucideReact.Send,{"aria-hidden":"true"})})]})}var Ct=zod.z.object({className:zod.z.string().optional(),children:zod.z.any().optional(),id:zod.z.string().optional(),"aria-label":zod.z.string().optional(),"aria-labelledby":zod.z.string().optional(),"aria-describedby":zod.z.string().optional(),"aria-live":zod.z.enum(["off","polite","assertive"]).optional(),"aria-hidden":zod.z.boolean().optional(),"data-testid":zod.z.string().optional()});zod.z.enum(["user","assistant","system"]);var bn=zod.z.enum(["complete","streaming","thinking","error"]),Cn=zod.z.enum(["idle","streaming","error"]),xn=zod.z.discriminatedUnion("kind",[zod.z.object({kind:zod.z.literal("text"),text:zod.z.string()}).strict(),zod.z.object({kind:zod.z.literal("tool_call"),name:zod.z.string(),status:zod.z.enum(["running","done","error"]),summary:zod.z.string().optional()}).strict()]),yn=zod.z.object({id:zod.z.string(),role:zod.z.literal("user"),status:zod.z.enum(["complete","error"]),content:zod.z.string(),createdAt:zod.z.number().optional()}).strict(),Rn=zod.z.object({id:zod.z.string(),role:zod.z.literal("assistant"),status:bn,content:zod.z.string(),parts:zod.z.array(xn).optional(),errorMessage:zod.z.string().optional(),createdAt:zod.z.number().optional()}).strict(),Sn=zod.z.object({id:zod.z.string(),role:zod.z.literal("system"),status:zod.z.literal("complete"),content:zod.z.unknown(),announce:zod.z.boolean().optional(),createdAt:zod.z.number().optional()}).strict(),xt=zod.z.union([yn,Rn,Sn]),Ae=Ct.extend({status:Cn,messages:zod.z.array(xt),onSendMessage:zod.z.custom(),onStopGeneration:zod.z.custom().optional(),onRetry:zod.z.custom().optional(),onEscalate:zod.z.custom().optional(),renderAssistantContent:zod.z.any().optional(),renderUserContent:zod.z.any().optional(),inputComponent:zod.z.any().optional(),assistantAvatar:zod.z.any().optional(),userAvatar:zod.z.any().optional(),header:zod.z.any().optional(),emptyState:zod.z.any().optional(),inputActions:zod.z.any().optional(),placeholder:zod.z.string().optional(),isDisabled:zod.z.boolean().optional(),maxInputLength:zod.z.number().int().positive().optional(),sendShortcut:zod.z.enum(["enter","mod-enter"]).optional(),progressAnnouncements:zod.z.boolean().optional(),completionAnnouncementMaxChars:zod.z.number().int().positive().optional(),logLabel:zod.z.string().optional(),thinkingDisclosureLabel:zod.z.string().optional()}).strict();var yt=react.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(),$=react.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=react.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=react.useRef(null),Ie=react.useRef(null),Me=react.useRef(null),de=react.useRef(new Map),St=react.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=react.useRef(false);react.useEffect(()=>{Ne.current||(Ne.current=true,_({smooth:false}));},[_]);let Te=react.useRef(t);react.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=react.useRef(null);react.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=react.useRef(null),fe=react.useRef(false),J=react.useRef(new Set);react.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]),react.useEffect(()=>{let b=J.current;return ()=>{for(let L of b)cancelAnimationFrame(L);b.clear();}},[]);let ke=react.useRef(o);return react.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}),react.useImperativeHandle(r,()=>({focusInput:()=>Me.current?.focus(),scrollToBottom:b=>_(b)}),[_]),jsxRuntime.jsxs("section",{className:x(qe(),w,"relative"),"aria-label":h,"data-testid":z,"data-themis-chatinterface":true,children:[y?jsxRuntime.jsx("div",{className:Ye(),children:y}):null,jsxRuntime.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}),jsxRuntime.jsx("div",{className:tt({visible:!Q&&t.length>0}),children:jsxRuntime.jsx(O,{variant:"secondary",visualSize:"icon","aria-label":"Jump to latest message",onPress:()=>_({smooth:!le}),"data-action":"jump-to-latest",children:jsxRuntime.jsx(lucideReact.ArrowDown,{"aria-hidden":"true"})})}),jsxRuntime.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;}}),jsxRuntime.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,"\\$&")}exports.ChatInterface=yt;exports.ChatInterfacePropsSchema=Ae;exports.ChatMessageSchema=xt;//# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map