@flexkit/studio 0.0.36 → 0.1.1

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 (165) hide show
  1. package/README.md +81 -0
  2. package/dist/astro.d.ts +3 -5
  3. package/dist/astro.js +3 -8
  4. package/dist/chat-page-NWMI4XOE.js +2 -0
  5. package/dist/chat-page-NWMI4XOE.js.map +1 -0
  6. package/dist/chunk-2DXR5NJV.js +2 -0
  7. package/dist/chunk-2DXR5NJV.js.map +1 -0
  8. package/dist/chunk-3CPWATOI.js +2 -0
  9. package/dist/chunk-3CPWATOI.js.map +1 -0
  10. package/dist/chunk-5DHOBLAE.js +2 -0
  11. package/dist/chunk-5DHOBLAE.js.map +1 -0
  12. package/dist/chunk-6LYEDKFY.js +7 -0
  13. package/dist/chunk-6LYEDKFY.js.map +1 -0
  14. package/dist/chunk-7PDYCDX6.js +2 -0
  15. package/dist/chunk-7PDYCDX6.js.map +1 -0
  16. package/dist/chunk-7SK5YPHT.js +2 -0
  17. package/dist/chunk-7SK5YPHT.js.map +1 -0
  18. package/dist/chunk-AKQ6ELDX.js +2 -0
  19. package/dist/chunk-AKQ6ELDX.js.map +1 -0
  20. package/dist/chunk-CSUHZFEP.js +2 -0
  21. package/dist/chunk-CSUHZFEP.js.map +1 -0
  22. package/dist/chunk-G4PYYHI3.js +2 -0
  23. package/dist/chunk-G4PYYHI3.js.map +1 -0
  24. package/dist/chunk-GZIMMYLK.js +2 -0
  25. package/dist/chunk-GZIMMYLK.js.map +1 -0
  26. package/dist/chunk-HROHAMPM.js +3 -0
  27. package/dist/chunk-HROHAMPM.js.map +1 -0
  28. package/dist/chunk-NNA4MLFC.js +3 -0
  29. package/dist/chunk-NNA4MLFC.js.map +1 -0
  30. package/dist/chunk-NSYO57O3.js +5 -0
  31. package/dist/chunk-NSYO57O3.js.map +1 -0
  32. package/dist/chunk-ODORXGGY.js +2 -0
  33. package/dist/chunk-ODORXGGY.js.map +1 -0
  34. package/dist/chunk-OUSEULBR.js +384 -0
  35. package/dist/chunk-OUSEULBR.js.map +1 -0
  36. package/dist/chunk-P6BZ4QP7.js +2 -0
  37. package/dist/chunk-P6BZ4QP7.js.map +1 -0
  38. package/dist/chunk-QQUNCDUB.js +2 -0
  39. package/dist/chunk-QQUNCDUB.js.map +1 -0
  40. package/dist/chunk-SZEGGBOC.js +2 -0
  41. package/dist/chunk-SZEGGBOC.js.map +1 -0
  42. package/dist/chunk-TXK4OFAG.js +248 -0
  43. package/dist/chunk-W2EBZZAY.js +3 -0
  44. package/dist/chunk-W2EBZZAY.js.map +1 -0
  45. package/dist/chunk-YINI2YKQ.js +4 -0
  46. package/dist/chunk-YINI2YKQ.js.map +1 -0
  47. package/dist/{core-handler-C3xC98bN.d.ts → core-handler-XAVVKLhV.d.ts} +0 -3
  48. package/dist/edit-entity-PVT34FD7.js +2 -0
  49. package/dist/edit-entity-PVT34FD7.js.map +1 -0
  50. package/dist/index.css +1402 -0
  51. package/dist/index.d.ts +433 -33
  52. package/dist/index.js +12 -395
  53. package/dist/index.js.map +1 -1
  54. package/dist/list-SQCN7HA3.js +2 -0
  55. package/dist/list-SQCN7HA3.js.map +1 -0
  56. package/dist/nextjs.d.ts +61 -56
  57. package/dist/nextjs.js +3 -8
  58. package/dist/pages-OIAPASPF.js +3 -0
  59. package/dist/pages-OIAPASPF.js.map +1 -0
  60. package/dist/plugin-pages-AHOA6YJE.js +2 -0
  61. package/dist/plugin-pages-AHOA6YJE.js.map +1 -0
  62. package/dist/project-selector-72VM6SUI.js +2 -0
  63. package/dist/project-selector-72VM6SUI.js.map +1 -0
  64. package/dist/root-4FGNRGCD.js +23 -0
  65. package/dist/root-4FGNRGCD.js.map +1 -0
  66. package/dist/root-5ZW536V7.js +2 -0
  67. package/dist/root-5ZW536V7.js.map +1 -0
  68. package/dist/root-IIILTOJI.js +31 -0
  69. package/dist/root-IIILTOJI.js.map +1 -0
  70. package/dist/root-QPQQ3DFJ.js +2 -0
  71. package/dist/root-QPQQ3DFJ.js.map +1 -0
  72. package/dist/search-2K2BU4UU.js +2 -0
  73. package/dist/{search-XKG5A7XM.js.map → search-2K2BU4UU.js.map} +1 -1
  74. package/dist/skills-pages-PSBRTFGK.js +2 -0
  75. package/dist/skills-pages-PSBRTFGK.js.map +1 -0
  76. package/dist/tanstack-start.d.ts +4 -6
  77. package/dist/tanstack-start.js +5 -12
  78. package/dist/ui.d.ts +5 -7
  79. package/dist/ui.js +1 -6
  80. package/dist/ui.js.map +1 -1
  81. package/dist/user-nav-QZFCICK3.js +2 -0
  82. package/dist/{user-nav-LSEOOH4E.js.map → user-nav-QZFCICK3.js.map} +1 -1
  83. package/package.json +30 -12
  84. package/dist/asset-3XMRPTA5.js +0 -2
  85. package/dist/asset-3XMRPTA5.js.map +0 -1
  86. package/dist/boolean-MTD44LXP.js +0 -2
  87. package/dist/boolean-MTD44LXP.js.map +0 -1
  88. package/dist/chunk-3VOTTOJT.js +0 -2
  89. package/dist/chunk-3VOTTOJT.js.map +0 -1
  90. package/dist/chunk-5I7Q5ODB.js +0 -2
  91. package/dist/chunk-5I7Q5ODB.js.map +0 -1
  92. package/dist/chunk-6NRQMG26.js +0 -2
  93. package/dist/chunk-6NRQMG26.js.map +0 -1
  94. package/dist/chunk-6V73336R.js +0 -623
  95. package/dist/chunk-7BOX7HHO.js +0 -2
  96. package/dist/chunk-7BOX7HHO.js.map +0 -1
  97. package/dist/chunk-7JFLGBWE.js +0 -2
  98. package/dist/chunk-7JFLGBWE.js.map +0 -1
  99. package/dist/chunk-7ZJN4MWQ.js +0 -2
  100. package/dist/chunk-7ZJN4MWQ.js.map +0 -1
  101. package/dist/chunk-AICNS7KW.js +0 -2
  102. package/dist/chunk-AICNS7KW.js.map +0 -1
  103. package/dist/chunk-D4XLXU2H.js +0 -2
  104. package/dist/chunk-D4XLXU2H.js.map +0 -1
  105. package/dist/chunk-FLT6RWXH.js +0 -2
  106. package/dist/chunk-FLT6RWXH.js.map +0 -1
  107. package/dist/chunk-GBM7VKFS.js +0 -2
  108. package/dist/chunk-GBM7VKFS.js.map +0 -1
  109. package/dist/chunk-HMMBYXYA.js +0 -2
  110. package/dist/chunk-HMMBYXYA.js.map +0 -1
  111. package/dist/chunk-IRY4KWB5.js +0 -2
  112. package/dist/chunk-IRY4KWB5.js.map +0 -1
  113. package/dist/chunk-JH4MVD36.js +0 -2
  114. package/dist/chunk-JH4MVD36.js.map +0 -1
  115. package/dist/chunk-JKHUO27E.js +0 -2
  116. package/dist/chunk-JKHUO27E.js.map +0 -1
  117. package/dist/chunk-LIV5RBWJ.js +0 -2
  118. package/dist/chunk-LIV5RBWJ.js.map +0 -1
  119. package/dist/chunk-PENRGDNC.js +0 -2
  120. package/dist/chunk-PENRGDNC.js.map +0 -1
  121. package/dist/chunk-POQX5GIA.js +0 -366
  122. package/dist/chunk-QOX3QNMM.js +0 -2
  123. package/dist/chunk-QOX3QNMM.js.map +0 -1
  124. package/dist/chunk-QVBNGGOE.js +0 -2
  125. package/dist/chunk-QVBNGGOE.js.map +0 -1
  126. package/dist/chunk-S6MOM5G3.js +0 -2
  127. package/dist/chunk-S6MOM5G3.js.map +0 -1
  128. package/dist/chunk-UGRS4FEI.js +0 -2
  129. package/dist/chunk-UGRS4FEI.js.map +0 -1
  130. package/dist/chunk-USNXQOMJ.js +0 -2
  131. package/dist/chunk-USNXQOMJ.js.map +0 -1
  132. package/dist/chunk-UWMJBBTY.js +0 -2
  133. package/dist/chunk-UWMJBBTY.js.map +0 -1
  134. package/dist/chunk-W3Z33ETA.js +0 -2
  135. package/dist/chunk-W3Z33ETA.js.map +0 -1
  136. package/dist/chunk-WDRCARCP.js +0 -3
  137. package/dist/chunk-WDRCARCP.js.map +0 -1
  138. package/dist/chunk-WIUPQHZ5.js +0 -2
  139. package/dist/chunk-WIUPQHZ5.js.map +0 -1
  140. package/dist/chunk-WJ4ORIXF.js +0 -2
  141. package/dist/chunk-WJ4ORIXF.js.map +0 -1
  142. package/dist/chunk-YSLN4XT6.js +0 -2
  143. package/dist/chunk-YSLN4XT6.js.map +0 -1
  144. package/dist/datetime-C55QQQJK.js +0 -2
  145. package/dist/datetime-C55QQQJK.js.map +0 -1
  146. package/dist/editor-NZLXIOE7.js +0 -2
  147. package/dist/editor-NZLXIOE7.js.map +0 -1
  148. package/dist/project-selector-GQ24PVO6.js +0 -2
  149. package/dist/project-selector-GQ24PVO6.js.map +0 -1
  150. package/dist/search-XKG5A7XM.js +0 -2
  151. package/dist/select-SO3DICYX.js +0 -2
  152. package/dist/select-SO3DICYX.js.map +0 -1
  153. package/dist/switch-SU3OIXL6.js +0 -2
  154. package/dist/switch-SU3OIXL6.js.map +0 -1
  155. package/dist/text-FZSI6W5I.js +0 -2
  156. package/dist/text-FZSI6W5I.js.map +0 -1
  157. package/dist/text-QXGOD2KW.js +0 -2
  158. package/dist/text-QXGOD2KW.js.map +0 -1
  159. package/dist/textarea-INLURFNU.js +0 -2
  160. package/dist/textarea-INLURFNU.js.map +0 -1
  161. package/dist/tools.d.ts +0 -78
  162. package/dist/tools.js +0 -60
  163. package/dist/types-U28Ppixq.d.ts +0 -56
  164. package/dist/types.d-CPIuPrvL.d.ts +0 -458
  165. package/dist/user-nav-LSEOOH4E.js +0 -2
package/dist/ui.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ui/primitives/external-link.tsx","../src/ui/primitives/resizable.tsx","../src/ui/primitives/sheet.tsx","../src/ui/hooks/use-mobile.tsx","../src/ui/primitives/sidebar.tsx","../src/ui/components/sidebar.tsx","../src/ui/primitives/hover-card.tsx","../src/ui/primitives/spinner.tsx","../src/ui/primitives/input-group.tsx","../src/ui/ai-elements/attachments.tsx","../src/ui/ai-elements/code-block.tsx","../src/ui/ai-elements/conversation.tsx","../src/ui/ai-elements/message.tsx","../src/ui/ai-elements/model-selector.tsx","../src/ui/ai-elements/prompt-input.tsx","../src/ui/ai-elements/shimmer.tsx","../src/ui/ai-elements/reasoning.tsx","../src/ui/ai-elements/sources.tsx","../src/ui/ai-elements/speech-input.tsx","../src/ui/ai-elements/suggestion.tsx","../src/ui/ai-elements/tool.tsx"],"names":["ExternalLink","href","children","jsx","Button","jsxs","ExternalLinkIcon","ResizablePanelGroup","className","props","cn","ResizablePanel","ResizableHandle","withHandle","GripVerticalIcon","Sheet","SheetPrimitive","SheetTrigger","SheetClose","SheetPortal","SheetOverlay","SheetContent","side","showCloseButton","XIcon","SheetHeader","SheetFooter","SheetTitle","SheetDescription","MOBILE_BREAKPOINT","useIsMobile","isMobile","setIsMobile","Ye","mql","onChange","SIDEBAR_COOKIE_NAME","SIDEBAR_COOKIE_MAX_AGE","SIDEBAR_WIDTH","SIDEBAR_WIDTH_MOBILE","SIDEBAR_WIDTH_ICON","SIDEBAR_KEYBOARD_SHORTCUT","SidebarContext","useSidebar","context","SidebarProvider","defaultOpen","openProp","setOpenProp","style","openMobile","setOpenMobile","_open","_setOpen","open","setOpen","value","openState","toggleSidebar","handleKeyDown","event","state","contextValue","TooltipProvider","Sidebar","variant","collapsible","SidebarTrigger","onClick","PanelLeftIcon","SidebarRail","SidebarInset","SidebarContent","SidebarGroup","SidebarGroupLabel","asChild","Comp","Slot","SidebarGroupContent","SidebarMenu","SidebarMenuItem","sidebarMenuButtonVariants","cva","SidebarMenuButton","isActive","size","tooltip","button","Tooltip","TooltipTrigger","TooltipContent","NavLinkCompat","NavLink","iconList","Icons","iconName","fuse","Fuse","menuGroups","schema","visibleItems","item","itemsByGroup","groupBy","g","nonEmptyGroups","menuGroup","group","entity","capitalize","createElement","getBestMatchingIcon","str","withSpaces","concept","result","HoverCard","HoverCardPrimitive","HoverCardTrigger","HoverCardContent","align","sideOffset","Spinner","Loader2Icon","InputGroup","inputGroupAddonVariants","InputGroupAddon","e","inputGroupButtonVariants","InputGroupButton","type","InputGroupText","InputGroupInput","Input","InputGroupTextarea","Textarea","mediaCategoryIcons","Music2Icon","FileTextIcon","ImageIcon","GlobeIcon","PaperclipIcon","VideoIcon","getMediaCategory","data","mediaType","getAttachmentLabel","category","renderAttachmentImage","url","filename","isGrid","AttachmentsContext","createContext","AttachmentContext","useAttachmentsContext","useContext","useAttachmentContext","ctx","Attachments","useMemo","Attachment","onRemove","mediaCategory","AttachmentPreview","fallbackIcon","iconSize","renderIcon","Icon","renderContent","AttachmentInfo","showMediaType","label","AttachmentRemove","handleClick","useCallback","AttachmentHoverCard","openDelay","closeDelay","AttachmentHoverCardTrigger","AttachmentHoverCardContent","AttachmentEmpty","isItalic","fontStyle","isBold","isUnderline","addKeysToTokens","lines","line","lineIdx","token","tokenIdx","TokenSpan","LINE_NUMBER_CLASSES","LineSpan","keyedLine","showLineNumbers","key","CodeBlockContext","highlighterCache","tokensCache","subscribers","getTokensCacheKey","code","language","start","end","getHighlighter","cached","highlighterPromise","createHighlighter","createRawTokens","highlightCode","callback","tokensCacheKey","highlighter","langToUse","tokenized","subs","sub","error","CodeBlockBody","memo","preStyle","keyedLines","prevProps","nextProps","CodeBlockContainer","CodeBlockHeader","CodeBlockTitle","CodeBlockFilename","CodeBlockActions","CodeBlockContent","rawTokens","syncTokens","asyncTokens","setAsyncTokens","useState","asyncKeyRef","useRef","useEffect","cancelled","CodeBlock","CodeBlockCopyButton","onCopy","onError","timeout","isCopied","setIsCopied","timeoutRef","copyToClipboard","CheckIcon","CopyIcon","CodeBlockLanguageSelector","Select","CodeBlockLanguageSelectorTrigger","SelectTrigger","CodeBlockLanguageSelectorValue","SelectValue","CodeBlockLanguageSelectorContent","SelectContent","CodeBlockLanguageSelectorItem","SelectItem","Conversation","StickToBottom","ConversationContent","ConversationEmptyState","title","description","icon","Fragment","ConversationScrollButton","isAtBottom","scrollToBottom","useStickToBottomContext","handleScrollToBottom","ArrowDownIcon","getMessageText","message","part","defaultFormatMessage","messagesToMarkdown","messages","formatMessage","msg","i","ConversationDownload","handleDownload","markdown","blob","link","DownloadIcon","Message","from","MessageContent","MessageActions","MessageAction","MessageBranchContext","useMessageBranch","MessageBranch","defaultBranch","onBranchChange","currentBranch","setCurrentBranch","branches","setBranches","handleBranchChange","newBranch","goToPrevious","goToNext","MessageBranchContent","childrenArray","branch","index","MessageBranchSelector","totalBranches","ButtonGroup","MessageBranchPrevious","ChevronLeftIcon","MessageBranchNext","ChevronRightIcon","MessageBranchPage","ButtonGroupText","streamdownPlugins","cjk","math","mermaid","MessageResponse","Streamdown","MessageToolbar","ModelSelector","Dialog","ModelSelectorTrigger","DialogTrigger","ModelSelectorContent","DialogContent","DialogTitle","Command","ModelSelectorDialog","CommandDialog","ModelSelectorInput","CommandInput","ModelSelectorList","CommandList","ModelSelectorEmpty","CommandEmpty","ModelSelectorGroup","CommandGroup","ModelSelectorItem","CommandItem","ModelSelectorShortcut","CommandShortcut","ModelSelectorSeparator","CommandSeparator","ModelSelectorLogo","provider","ModelSelectorLogoGroup","ModelSelectorName","convertBlobUrlToDataUrl","resolve","reader","captureScreenshot","stream","video","reject","width","height","canvas","timestamp","track","PromptInputController","ProviderAttachmentsContext","usePromptInputController","useOptionalPromptInputController","useProviderAttachments","useOptionalProviderAttachments","PromptInputProvider","initialTextInput","textInput","setTextInput","clearInput","attachmentFiles","setAttachmentFiles","fileInputRef","openRef","add","files","incoming","prev","file","nanoid","remove","id","found","f","clear","attachmentsRef","openFileDialog","attachments","__registerFileInput","ref","controller","LocalAttachmentsContext","usePromptInputAttachments","LocalReferencedSourcesContext","usePromptInputReferencedSources","PromptInputActionAddAttachments","onSelect","handleSelect","DropdownMenuItem","PromptInputActionAddScreenshot","screenshot","Monitor","PromptInput","accept","multiple","globalDrop","syncHiddenInput","maxFiles","maxFileSize","onSubmit","usingProvider","inputRef","formRef","items","setItems","referencedSources","setReferencedSources","filesRef","openFileDialogLocal","matchesAccept","s","pattern","prefix","addLocal","fileList","accepted","withinSize","sized","capacity","capped","next","removeLocal","addWithProviderValidation","currentCount","clearAttachments","clearReferencedSources","form","onDragOver","onDrop","handleChange","attachmentsCtx","refsCtx","array","handleSubmit","text","convertedFiles","_id","dataUrl","inner","withReferencedSources","PromptInputBody","PromptInputTextarea","onKeyDown","placeholder","isComposing","setIsComposing","lastAttachment","handlePaste","handleCompositionEnd","handleCompositionStart","controlledProps","PromptInputHeader","PromptInputFooter","PromptInputTools","PromptInputButton","newSize","Children","tooltipContent","shortcut","PromptInputActionMenu","DropdownMenu","PromptInputActionMenuTrigger","DropdownMenuTrigger","PlusIcon","PromptInputActionMenuContent","onCloseAutoFocus","DropdownMenuContent","PromptInputActionMenuItem","PromptInputSubmit","status","onStop","isGenerating","CornerDownLeftIcon","SquareIcon","PromptInputSelect","PromptInputSelectTrigger","PromptInputSelectContent","PromptInputSelectItem","PromptInputSelectValue","PromptInputHoverCard","PromptInputHoverCardTrigger","PromptInputHoverCardContent","PromptInputTabsList","PromptInputTab","PromptInputTabLabel","PromptInputTabBody","PromptInputTabItem","PromptInputCommand","PromptInputCommandInput","PromptInputCommandList","PromptInputCommandEmpty","PromptInputCommandGroup","PromptInputCommandItem","PromptInputCommandSeparator","motionComponentCache","getMotionComponent","element","component","motion","ShimmerComponent","Component","duration","spread","MotionComponent","dynamicSpread","Shimmer","ReasoningContext","useReasoning","AUTO_CLOSE_DELAY","MS_IN_S","Reasoning","isStreaming","onOpenChange","durationProp","resolvedDefaultOpen","isExplicitlyClosed","isOpen","setIsOpen","useControllableState","setDuration","hasEverStreamedRef","hasAutoClosed","setHasAutoClosed","startTimeRef","timer","handleOpenChange","newOpen","Collapsible","defaultGetThinkingMessage","ReasoningTrigger","getThinkingMessage","CollapsibleTrigger","BrainIcon","ChevronDownIcon","ReasoningContent","CollapsibleContent","Sources","SourcesTrigger","count","SourcesContent","Source","BookIcon","MAX_RECORDING_MS","isMediaRecorderSupported","getSupportedRecorderMimeType","toSpeechInputError","fallback","isAbortError","getTooltip","isSupported","isListening","isProcessing","SpeechInput","disabled","onAudioRecorded","onTranscriptionChange","setIsListening","setIsProcessing","setIsSupported","mediaRecorderRef","streamRef","audioChunksRef","maxDurationTimerRef","abortControllerRef","discardNextStopRef","disabledRef","onAudioRecordedRef","onErrorRef","onTranscriptionChangeRef","releaseStream","clearMaxDurationTimer","stopMediaRecorder","abortProcessing","cancelCapture","recorder","startMediaRecorder","mimeType","mediaRecorder","audioBlob","abortController","transcribe","transcript","isDisabled","LoaderIcon","MicIcon","Suggestions","ScrollArea","ScrollBar","Suggestion","suggestion","Tool","statusLabels","statusIcons","ClockIcon","CheckCircleIcon","CircleIcon","XCircleIcon","getStatusBadge","Badge","ToolHeader","toolName","derivedName","WrenchIcon","ToolContent","ToolInput","input","ToolOutput","output","errorText","Output","isValidElement"],"mappings":"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","file":"ui.js","sourcesContent":["import { SquareArrowOutUpRight as ExternalLinkIcon } from 'lucide-react';\nimport { Button } from './button';\nimport type { JSX } from 'react';\n\nexport function ExternalLink({ href, children }: { href: string; children: React.ReactNode }): JSX.Element {\n return (\n <Button asChild className=\"fk:h-6 fk:px-1! fk:py-0 fk:text-sm fk:font-light fk:text-link\" size=\"sm\" variant=\"link\">\n <a href={href} target=\"_blank\">\n {children} <ExternalLinkIcon className=\"fk:size-3\" strokeWidth={3} />\n </a>\n </Button>\n );\n}\n","import { GripVerticalIcon } from 'lucide-react';\nimport * as ResizablePrimitive from 'react-resizable-panels';\nimport { cn } from '../lib/utils';\n\nfunction ResizablePanelGroup({ className, ...props }: ResizablePrimitive.GroupProps) {\n return (\n <ResizablePrimitive.Group\n data-slot=\"resizable-panel-group\"\n className={cn('fk:flex fk:h-full fk:w-full fk:aria-[orientation=vertical]:flex-col', className)}\n {...props}\n />\n );\n}\n\nfunction ResizablePanel({ ...props }: ResizablePrimitive.PanelProps) {\n return <ResizablePrimitive.Panel data-slot=\"resizable-panel\" {...props} />;\n}\n\nfunction ResizableHandle({\n withHandle,\n className,\n ...props\n}: ResizablePrimitive.SeparatorProps & {\n withHandle?: boolean;\n}) {\n return (\n <ResizablePrimitive.Separator\n data-slot=\"resizable-handle\"\n className={cn(\n 'fk:relative fk:flex fk:w-px fk:items-center fk:justify-center fk:bg-border fk:after:absolute fk:after:inset-y-0 fk:after:left-1/2 fk:after:w-1 fk:after:-translate-x-1/2 fk:focus-visible:ring-1 fk:focus-visible:ring-ring fk:focus-visible:ring-offset-1 fk:focus-visible:outline-hidden fk:aria-[orientation=horizontal]:h-px fk:aria-[orientation=horizontal]:w-full fk:aria-[orientation=horizontal]:after:left-0 fk:aria-[orientation=horizontal]:after:h-1 fk:aria-[orientation=horizontal]:after:w-full fk:aria-[orientation=horizontal]:after:translate-x-0 fk:aria-[orientation=horizontal]:after:-translate-y-1/2 fk:[&[aria-orientation=horizontal]>div]:rotate-90',\n className\n )}\n {...props}\n >\n {withHandle && (\n <div className=\"fk:z-10 fk:flex fk:h-8 fk:w-3 fk:items-center fk:justify-center fk:rounded-xs fk:border fk:bg-border fk:corner-squircle\">\n <GripVerticalIcon className=\"fk:size-2.5\" />\n </div>\n )}\n </ResizablePrimitive.Separator>\n );\n}\n\nexport { ResizableHandle, ResizablePanel, ResizablePanelGroup };\n","'use client';\n\nimport * as React from 'react';\nimport { Dialog as SheetPrimitive } from 'radix-ui';\nimport { XIcon } from 'lucide-react';\nimport { cn } from '../lib/utils';\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />;\n}\n\nfunction SheetTrigger({ ...props }: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />;\n}\n\nfunction SheetClose({ ...props }: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />;\n}\n\nfunction SheetPortal({ ...props }: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />;\n}\n\nfunction SheetOverlay({ className, ...props }: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n 'fk:fixed fk:inset-0 fk:z-50 fk:bg-black/50 fk:data-[state=closed]:animate-out fk:data-[state=closed]:fade-out-0 fk:data-[state=open]:animate-in fk:data-[state=open]:fade-in-0',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SheetContent({\n className,\n children,\n side = 'right',\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: 'top' | 'right' | 'bottom' | 'left';\n showCloseButton?: boolean;\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n className={cn(\n 'fk:fixed fk:z-50 fk:flex fk:flex-col fk:gap-4 fk:bg-background fk:shadow-lg fk:transition fk:ease-in-out fk:data-[state=closed]:animate-out fk:data-[state=closed]:duration-300 fk:data-[state=open]:animate-in fk:data-[state=open]:duration-500',\n side === 'right' &&\n 'fk:inset-y-0 fk:right-0 fk:h-full fk:w-3/4 fk:border-l fk:data-[state=closed]:slide-out-to-right fk:data-[state=open]:slide-in-from-right fk:sm:max-w-sm',\n side === 'left' &&\n 'fk:inset-y-0 fk:left-0 fk:h-full fk:w-3/4 fk:border-r fk:data-[state=closed]:slide-out-to-left fk:data-[state=open]:slide-in-from-left fk:sm:max-w-sm',\n side === 'top' &&\n 'fk:inset-x-0 fk:top-0 fk:h-auto fk:border-b fk:data-[state=closed]:slide-out-to-top fk:data-[state=open]:slide-in-from-top',\n side === 'bottom' &&\n 'fk:inset-x-0 fk:bottom-0 fk:h-auto fk:border-t fk:data-[state=closed]:slide-out-to-bottom fk:data-[state=open]:slide-in-from-bottom',\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <SheetPrimitive.Close className=\"fk:absolute fk:top-4 fk:right-4 fk:rounded-xs fk:opacity-70 fk:ring-offset-background fk:transition-opacity fk:hover:opacity-100 fk:focus:ring-2 fk:focus:ring-ring fk:focus:ring-offset-2 fk:focus:outline-hidden fk:disabled:pointer-events-none fk:data-[state=open]:bg-secondary fk:corner-squircle\">\n <XIcon className=\"fk:size-4\" />\n <span className=\"fk:sr-only\">Close</span>\n </SheetPrimitive.Close>\n )}\n </SheetPrimitive.Content>\n </SheetPortal>\n );\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"sheet-header\" className={cn('fk:flex fk:flex-col fk:gap-1.5 fk:p-4', className)} {...props} />;\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn('fk:mt-auto fk:flex fk:flex-col fk:gap-2 fk:p-4', className)}\n {...props}\n />\n );\n}\n\nfunction SheetTitle({ className, ...props }: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn('fk:font-semibold fk:text-foreground', className)}\n {...props}\n />\n );\n}\n\nfunction SheetDescription({ className, ...props }: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn('fk:text-sm fk:text-muted-foreground', className)}\n {...props}\n />\n );\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n SheetPortal,\n SheetOverlay,\n};\n","import * as React from 'react';\n\nconst MOBILE_BREAKPOINT = 768;\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined);\n\n React.useEffect(() => {\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n };\n mql.addEventListener('change', onChange);\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n return () => mql.removeEventListener('change', onChange);\n }, []);\n\n return !!isMobile;\n}\n","'use client';\n\nimport * as React from 'react';\nimport { Slot } from 'radix-ui';\nimport { VariantProps, cva } from 'class-variance-authority';\nimport { PanelLeftIcon } from 'lucide-react';\nimport { useIsMobile } from '../hooks/use-mobile';\nimport { cn } from '../lib/utils';\nimport { Button } from './button';\nimport { Input } from './input';\nimport { Separator } from './separator';\nimport { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle } from './sheet';\nimport { Skeleton } from './skeleton';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from './tooltip';\n\nconst SIDEBAR_COOKIE_NAME = 'flexkit:sidebar:state';\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;\nconst SIDEBAR_WIDTH = '16rem';\nconst SIDEBAR_WIDTH_MOBILE = '18rem';\nconst SIDEBAR_WIDTH_ICON = '2rem';\nconst SIDEBAR_KEYBOARD_SHORTCUT = 'b';\n\ntype SidebarContextProps = {\n state: 'expanded' | 'collapsed';\n open: boolean;\n setOpen: (open: boolean) => void;\n openMobile: boolean;\n setOpenMobile: (open: boolean) => void;\n isMobile: boolean;\n toggleSidebar: () => void;\n};\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null);\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext);\n if (!context) {\n throw new Error('useSidebar must be used within a SidebarProvider.');\n }\n\n return context;\n}\n\nfunction SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n}: React.ComponentProps<'div'> & {\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}) {\n const isMobile = useIsMobile();\n const [openMobile, setOpenMobile] = React.useState(false);\n\n // This is the internal state of the sidebar.\n // We use openProp and setOpenProp for control from outside the component.\n const [_open, _setOpen] = React.useState(defaultOpen);\n const open = openProp ?? _open;\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === 'function' ? value(open) : value;\n if (setOpenProp) {\n setOpenProp(openState);\n } else {\n _setOpen(openState);\n }\n\n // This sets the cookie to keep the sidebar state.\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;\n },\n [setOpenProp, open]\n );\n\n // Helper to toggle the sidebar.\n const toggleSidebar = React.useCallback(() => {\n return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open);\n }, [isMobile, setOpen, setOpenMobile]);\n\n // Adds a keyboard shortcut to toggle the sidebar.\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {\n event.preventDefault();\n toggleSidebar();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [toggleSidebar]);\n\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n // This makes it easier to style the sidebar with Tailwind classes.\n const state = open ? 'expanded' : 'collapsed';\n\n const contextValue = React.useMemo<SidebarContextProps>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n }),\n [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]\n );\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <TooltipProvider delayDuration={0}>\n <div\n data-slot=\"sidebar-wrapper\"\n style={\n {\n '--sidebar-width': SIDEBAR_WIDTH,\n '--sidebar-width-icon': SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn(\n 'fk:group/sidebar-wrapper fk:flex fk:w-full fk:has-data-[variant=inset]:bg-sidebar fk:overflow-hidden',\n className\n )}\n {...props}\n >\n {children}\n </div>\n </TooltipProvider>\n </SidebarContext.Provider>\n );\n}\n\nfunction Sidebar({\n side = 'left',\n variant = 'sidebar',\n collapsible = 'offcanvas',\n className,\n children,\n ...props\n}: React.ComponentProps<'div'> & {\n side?: 'left' | 'right';\n variant?: 'sidebar' | 'floating' | 'inset';\n collapsible?: 'offcanvas' | 'icon' | 'none';\n}) {\n const { isMobile, state, openMobile, setOpenMobile } = useSidebar();\n\n if (collapsible === 'none') {\n return (\n <div\n data-slot=\"sidebar\"\n className={cn(\n 'fk:flex fk:h-full fk:w-(--sidebar-width) fk:flex-col fk:bg-sidebar fk:text-sidebar-foreground',\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n }\n\n if (isMobile) {\n return (\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\n <SheetContent\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar\"\n data-mobile=\"true\"\n className=\"fk:w-(--sidebar-width) fk:bg-sidebar fk:p-0 fk:text-sidebar-foreground fk:[&>button]:hidden\"\n style={\n {\n '--sidebar-width': SIDEBAR_WIDTH_MOBILE,\n } as React.CSSProperties\n }\n side={side}\n >\n <SheetHeader className=\"fk:sr-only\">\n <SheetTitle>Sidebar</SheetTitle>\n <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n </SheetHeader>\n <div className=\"fk:flex fk:h-full fk:w-full fk:flex-col\">{children}</div>\n </SheetContent>\n </Sheet>\n );\n }\n\n return (\n <div\n className=\"fk:group fk:peer flexkit-sidebar-desktop-block fk:text-sidebar-foreground\"\n data-state={state}\n data-collapsible={state === 'collapsed' ? collapsible : ''}\n data-variant={variant}\n data-side={side}\n data-slot=\"sidebar\"\n >\n {/* This is what handles the sidebar gap on desktop */}\n <div\n data-slot=\"sidebar-gap\"\n className={cn(\n 'fk:relative fk:w-(--sidebar-width) fk:bg-transparent fk:transition-[width] fk:duration-200 fk:ease-linear',\n 'fk:group-data-[collapsible=offcanvas]:w-0',\n 'fk:group-data-[side=right]:rotate-180',\n variant === 'floating' || variant === 'inset'\n ? 'fk:group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]'\n : 'fk:group-data-[collapsible=icon]:w-(--sidebar-width-icon)'\n )}\n />\n <div\n data-slot=\"sidebar-container\"\n className={cn(\n 'fk:relative fk:inset-y-0 fk:z-10 flexkit-sidebar-desktop-flex fk:h-[calc(100svh-3.5rem)] fk:w-(--sidebar-width) fk:transition-[left,right,width] fk:duration-200 fk:ease-linear',\n side === 'left'\n ? 'fk:left-0 fk:group-data-[collapsible=offcanvas]:-left-(--sidebar-width)'\n : 'fk:right-0 k:group-data-[collapsible=offcanvas]:-right-(--sidebar-width)',\n // Adjust the padding for floating and inset variants.\n variant === 'floating' || variant === 'inset'\n ? 'fk:group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)] fk:group-data-[side=left]:border-r'\n : 'fk:group-data-[collapsible=icon]:w-(--sidebar-width-icon) fk:group-data-[side=left]:border-r fk:group-data-[side=right]:border-l',\n className\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar-inner\"\n className=\"fk:flex fk:h-full fk:w-full fk:flex-col fk:bg-sidebar fk:group-data-[variant=floating]:rounded-lg fk:group-data-[variant=floating]:border fk:group-data-[variant=floating]:border-sidebar-border fk:group-data-[variant=floating]:shadow-sm\"\n >\n {children}\n </div>\n </div>\n </div>\n );\n}\n\nfunction SidebarTrigger({ className, onClick, ...props }: React.ComponentProps<typeof Button>) {\n const { toggleSidebar } = useSidebar();\n\n return (\n <Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n size=\"icon\"\n className={cn('fk:size-7', className)}\n onClick={(event) => {\n onClick?.(event);\n toggleSidebar();\n }}\n {...props}\n >\n <PanelLeftIcon />\n <span className=\"fk:sr-only\">Toggle Sidebar</span>\n </Button>\n );\n}\n\nfunction SidebarRail({ className, ...props }: React.ComponentProps<'button'>) {\n const { toggleSidebar } = useSidebar();\n\n return (\n <button\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n 'fk:absolute fk:inset-y-0 fk:z-20 flexkit-sidebar-sm-flex fk:w-4 fk:-translate-x-1/2 fk:transition-all fk:ease-linear fk:group-data-[side=left]:-right-4 fk:group-data-[side=right]:left-0 fk:after:absolute fk:after:inset-y-0 fk:after:left-1/2 fk:after:w-[2px] fk:hover:after:bg-sidebar-border',\n 'fk:in-data-[side=left]:cursor-w-resize fk:in-data-[side=right]:cursor-e-resize',\n 'fk:[[data-side=left][data-state=collapsed]_&]:cursor-e-resize fk:[[data-side=right][data-state=collapsed]_&]:cursor-w-resize',\n 'fk:group-data-[collapsible=offcanvas]:translate-x-0 fk:group-data-[collapsible=offcanvas]:after:left-full fk:hover:group-data-[collapsible=offcanvas]:bg-sidebar',\n 'fk:[[data-side=left][data-collapsible=offcanvas]_&]:-right-2',\n 'fk:[[data-side=right][data-collapsible=offcanvas]_&]:-left-2',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarInset({ className, ...props }: React.ComponentProps<'main'>) {\n return (\n <main\n data-slot=\"sidebar-inset\"\n className={cn(\n 'fk:relative fk:flex fk:flex-1 fk:flex-col fk:bg-background fk:overflow-hidden fk:peer-data-[variant=inset]:h-[calc(100svh-3.625rem)]',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarInput({ className, ...props }: React.ComponentProps<typeof Input>) {\n return (\n <Input\n data-slot=\"sidebar-input\"\n data-sidebar=\"input\"\n className={cn('fk:h-8 fk:w-full fk:bg-background fk:shadow-none', className)}\n {...props}\n />\n );\n}\n\nfunction SidebarHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-header\"\n data-sidebar=\"header\"\n className={cn('fk:flex fk:flex-col fk:gap-2 fk:p-2', className)}\n {...props}\n />\n );\n}\n\nfunction SidebarFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-footer\"\n data-sidebar=\"footer\"\n className={cn('fk:flex fk:flex-col fk:gap-2 fk:p-2', className)}\n {...props}\n />\n );\n}\n\nfunction SidebarSeparator({ className, ...props }: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"sidebar-separator\"\n data-sidebar=\"separator\"\n className={cn('fk:mx-2 fk:w-auto fk:bg-sidebar-border', className)}\n {...props}\n />\n );\n}\n\nfunction SidebarContent({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-content\"\n data-sidebar=\"content\"\n className={cn(\n 'fk:flex fk:min-h-0 fk:flex-1 fk:flex-col fk:overflow-auto fk:group-data-[collapsible=icon]:overflow-hidden',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarGroup({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-group\"\n data-sidebar=\"group\"\n className={cn('fk:relative fk:flex fk:w-full fk:min-w-0 fk:flex-col fk:p-2', className)}\n {...props}\n />\n );\n}\n\nfunction SidebarGroupLabel({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<'div'> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : 'div';\n\n return (\n <Comp\n data-slot=\"sidebar-group-label\"\n data-sidebar=\"group-label\"\n className={cn(\n 'fk:flex fk:h-8 fk:shrink-0 fk:items-center fk:rounded-md fk:px-2 fk:text-xs fk:font-medium fk:text-sidebar-foreground/70 fk:ring-sidebar-ring fk:outline-hidden fk:transition-[margin,opacity] fk:duration-200 fk:ease-linear fk:focus-visible:ring-2 fk:[&>svg]:size-4 fk:[&>svg]:shrink-0 fk:corner-squircle',\n 'fk:group-data-[collapsible=icon]:-mt-8 fk:group-data-[collapsible=icon]:opacity-0',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarGroupAction({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<'button'> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : 'button';\n\n return (\n <Comp\n data-slot=\"sidebar-group-action\"\n data-sidebar=\"group-action\"\n className={cn(\n 'fk:absolute fk:top-3.5 fk:right-3 fk:flex fk:aspect-square fk:w-5 fk:items-center fk:justify-center fk:rounded-md fk:p-0 fk:text-sidebar-foreground fk:ring-sidebar-ring fk:outline-hidden fk:transition-transform fk:hover:bg-sidebar-accent fk:hover:text-sidebar-accent-foreground fk:focus-visible:ring-2 fk:[&>svg]:size-4 fk:[&>svg]:shrink-0 fk:corner-squircle',\n // Increases the hit area of the button on mobile.\n 'fk:after:absolute fk:after:-inset-2 fk:md:after:hidden',\n 'fk:group-data-[collapsible=icon]:hidden',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarGroupContent({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-group-content\"\n data-sidebar=\"group-content\"\n className={cn('fk:w-full fk:text-sm', className)}\n {...props}\n />\n );\n}\n\nfunction SidebarMenu({ className, ...props }: React.ComponentProps<'ul'>) {\n return (\n <ul\n data-slot=\"sidebar-menu\"\n data-sidebar=\"menu\"\n className={cn('fk:flex fk:w-full fk:min-w-0 fk:flex-col fk:gap-1', className)}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuItem({ className, ...props }: React.ComponentProps<'li'>) {\n return (\n <li\n data-slot=\"sidebar-menu-item\"\n data-sidebar=\"menu-item\"\n className={cn('fk:group/menu-item fk:relative', className)}\n {...props}\n />\n );\n}\n\nconst sidebarMenuButtonVariants = cva(\n 'fk:peer/menu-button fk:flex fk:w-full fk:items-center fk:gap-2 fk:overflow-hidden fk:rounded-md fk:p-2 fk:text-left fk:text-sm fk:ring-sidebar-ring fk:outline-hidden fk:transition-[width,height,padding] fk:group-has-data-[sidebar=menu-action]/menu-item:pr-8 fk:group-data-[collapsible=icon]:size-8! fk:group-data-[collapsible=icon]:p-2! fk:hover:bg-sidebar-accent fk:hover:text-sidebar-accent-foreground fk:focus-visible:ring-2 fk:active:bg-sidebar-accent fk:active:text-sidebar-accent-foreground fk:disabled:pointer-events-none fk:disabled:opacity-50 fk:aria-disabled:pointer-events-none fk:aria-disabled:opacity-50 fk:data-[active=true]:bg-sidebar-accent fk:data-[active=true]:font-medium fk:data-[active=true]:text-sidebar-accent-foreground fk:data-[state=open]:hover:bg-sidebar-accent fk:data-[state=open]:hover:text-sidebar-accent-foreground fk:[&>span:last-child]:truncate fk:[&>svg]:size-4 fk:[&>svg]:shrink-0 fk:corner-squircle',\n {\n variants: {\n variant: {\n default: 'fk:hover:bg-sidebar-accent fk:hover:text-sidebar-accent-foreground',\n outline:\n 'fk:bg-background fk:shadow-[0_0_0_1px_hsl(var(--sidebar-border))] fk:hover:bg-sidebar-accent fk:hover:text-sidebar-accent-foreground fk:hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]',\n },\n size: {\n default: 'fk:h-8 fk:text-sm',\n sm: 'fk:h-7 fk:text-xs',\n lg: 'fk:h-12 fk:text-sm fk:group-data-[collapsible=icon]:p-0!',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n);\n\nfunction SidebarMenuButton({\n asChild = false,\n isActive = false,\n variant = 'default',\n size = 'default',\n tooltip,\n className,\n ...props\n}: React.ComponentProps<'button'> & {\n asChild?: boolean;\n isActive?: boolean;\n tooltip?: string | React.ComponentProps<typeof TooltipContent>;\n} & VariantProps<typeof sidebarMenuButtonVariants>) {\n const Comp = asChild ? Slot.Root : 'button';\n const { isMobile, state } = useSidebar();\n\n const button = (\n <Comp\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n {...props}\n />\n );\n\n if (!tooltip) {\n return button;\n }\n\n if (typeof tooltip === 'string') {\n tooltip = {\n children: tooltip,\n };\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent side=\"right\" align=\"center\" hidden={state !== 'collapsed' || isMobile} {...tooltip} />\n </Tooltip>\n );\n}\n\nfunction SidebarMenuAction({\n className,\n asChild = false,\n showOnHover = false,\n ...props\n}: React.ComponentProps<'button'> & {\n asChild?: boolean;\n showOnHover?: boolean;\n}) {\n const Comp = asChild ? Slot.Root : 'button';\n\n return (\n <Comp\n data-slot=\"sidebar-menu-action\"\n data-sidebar=\"menu-action\"\n className={cn(\n 'fk:absolute fk:top-1.5 fk:right-1 fk:flex fk:aspect-square fk:w-5 fk:items-center fk:justify-center fk:rounded-md fk:p-0 fk:text-sidebar-foreground fk:ring-sidebar-ring fk:outline-hidden fk:transition-transform fk:peer-hover/menu-button:text-sidebar-accent-foreground fk:hover:bg-sidebar-accent fk:hover:text-sidebar-accent-foreground fk:focus-visible:ring-2 fk:[&>svg]:size-4 fk:[&>svg]:shrink-0 fk:corner-squircle',\n // Increases the hit area of the button on mobile.\n 'fk:after:absolute fk:after:-inset-2 fk:md:after:hidden',\n 'fk:peer-data-[size=sm]/menu-button:top-1',\n 'fk:peer-data-[size=default]/menu-button:top-1.5',\n 'fk:peer-data-[size=lg]/menu-button:top-2.5',\n 'fk:group-data-[collapsible=icon]:hidden',\n showOnHover &&\n 'fk:group-focus-within/menu-item:opacity-100 fk:group-hover/menu-item:opacity-100 fk:peer-data-[active=true]/menu-button:text-sidebar-accent-foreground fk:data-[state=open]:opacity-100 fk:md:opacity-0',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuBadge({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n 'fk:pointer-events-none fk:absolute fk:right-1 fk:flex fk:h-5 fk:min-w-5 fk:items-center fk:justify-center fk:rounded-md fk:px-1 fk:text-xs fk:font-medium fk:text-sidebar-foreground fk:tabular-nums fk:select-none fk:corner-squircle',\n 'fk:peer-hover/menu-button:text-sidebar-accent-foreground fk:peer-data-[active=true]/menu-button:text-sidebar-accent-foreground',\n 'fk:peer-data-[size=sm]/menu-button:top-1',\n 'fk:peer-data-[size=default]/menu-button:top-1.5',\n 'fk:peer-data-[size=lg]/menu-button:top-2.5',\n 'fk:group-data-[collapsible=icon]:hidden',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuSkeleton({\n className,\n showIcon = false,\n ...props\n}: React.ComponentProps<'div'> & {\n showIcon?: boolean;\n}) {\n // Random width between 50 to 90%.\n const width = React.useMemo(() => {\n return `${Math.floor(Math.random() * 40) + 50}%`;\n }, []);\n\n return (\n <div\n data-slot=\"sidebar-menu-skeleton\"\n data-sidebar=\"menu-skeleton\"\n className={cn('fk:flex fk:h-8 fk:items-center fk:gap-2 fk:rounded-md fk:px-2 fk:corner-squircle', className)}\n {...props}\n >\n {showIcon && <Skeleton className=\"fk:size-4 fk:rounded-md fk:corner-squircle\" data-sidebar=\"menu-skeleton-icon\" />}\n <Skeleton\n className=\"fk:h-4 fk:max-w-(--skeleton-width) fk:flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n '--skeleton-width': width,\n } as React.CSSProperties\n }\n />\n </div>\n );\n}\n\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<'ul'>) {\n return (\n <ul\n data-slot=\"sidebar-menu-sub\"\n data-sidebar=\"menu-sub\"\n className={cn(\n 'fk:mx-3.5 fk:flex fk:min-w-0 fk:translate-x-px fk:flex-col fk:gap-1 fk:border-l fk:border-sidebar-border fk:px-2.5 fk:py-0.5',\n 'fk:group-data-[collapsible=icon]:hidden',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuSubItem({ className, ...props }: React.ComponentProps<'li'>) {\n return (\n <li\n data-slot=\"sidebar-menu-sub-item\"\n data-sidebar=\"menu-sub-item\"\n className={cn('fk:group/menu-sub-item fk:relative', className)}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuSubButton({\n asChild = false,\n size = 'md',\n isActive = false,\n className,\n ...props\n}: React.ComponentProps<'a'> & {\n asChild?: boolean;\n size?: 'sm' | 'md';\n isActive?: boolean;\n}) {\n const Comp = asChild ? Slot.Root : 'a';\n\n return (\n <Comp\n data-slot=\"sidebar-menu-sub-button\"\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n 'fk:flex fk:h-7 fk:min-w-0 fk:-translate-x-px fk:items-center fk:gap-2 fk:overflow-hidden fk:rounded-md fk:px-2 fk:text-sidebar-foreground fk:ring-sidebar-ring fk:outline-hidden fk:hover:bg-sidebar-accent fk:hover:text-sidebar-accent-foreground fk:focus-visible:ring-2 fk:active:bg-sidebar-accent fk:active:text-sidebar-accent-foreground fk:disabled:pointer-events-none fk:disabled:opacity-50 fk:aria-disabled:pointer-events-none fk:aria-disabled:opacity-50 fk:[&>span:last-child]:truncate fk:[&>svg]:size-4 fk:[&>svg]:shrink-0 fk:[&>svg]:text-sidebar-accent-foreground fk:corner-squircle',\n 'fk:data-[active=true]:bg-sidebar-accent fk:data-[active=true]:text-sidebar-accent-foreground',\n size === 'sm' && 'fk:text-xs',\n size === 'md' && 'fk:text-sm',\n 'fk:group-data-[collapsible=icon]:hidden',\n className\n )}\n {...props}\n />\n );\n}\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n useSidebar,\n};\n","import { createElement, type JSX } from 'react';\nimport * as Icons from 'lucide-react';\nimport Fuse from 'fuse.js';\nimport { NavLink } from 'react-router-dom';\nimport {\n Sidebar as SidebarPrimitive,\n SidebarContent,\n SidebarGroup,\n SidebarGroupLabel,\n SidebarMenu,\n SidebarMenuItem,\n SidebarMenuButton,\n SidebarRail,\n} from '../primitives/sidebar';\nimport type { SingleProject } from '../../core/config/types';\nimport { groupBy } from 'ramda';\n\nconst NavLinkCompat = NavLink as unknown as React.ComponentType<{\n children?: React.ReactNode;\n to: string;\n}>;\n\ninterface SidebarProps extends React.HTMLAttributes<HTMLDivElement> {\n className?: string;\n menuGroups?: SingleProject['menuGroups'];\n schema: SingleProject['schema'];\n}\n\ntype VisibleMenuSchema = Array<\n Omit<SingleProject['schema'][number], 'menu'> & {\n menu?: Exclude<SingleProject['schema'][number]['menu'], { hidden: true }>;\n }\n>;\n\nconst iconList = Object.keys(Icons).map((iconName) => ({\n name: iconName,\n icon: Icons[iconName as keyof typeof Icons],\n}));\n\nconst fuse = new Fuse(iconList, {\n keys: ['name'],\n threshold: 0.5,\n});\n\nexport function Sidebar({ className, menuGroups, schema }: SidebarProps): JSX.Element {\n // Filter out hidden items first, then group them\n const visibleItems = schema.filter((item) => !(item.menu && 'hidden' in item.menu)) as VisibleMenuSchema;\n const itemsByGroup = groupBy(\n (item) => (item.menu?.group && menuGroups?.find((g) => g.name === item.menu?.group)?.name) || 'ungrouped',\n visibleItems\n );\n const nonEmptyGroups = menuGroups?.filter((menuGroup) => itemsByGroup[menuGroup.name]?.length);\n\n return (\n <SidebarPrimitive className={className} collapsible=\"icon\" variant=\"inset\">\n <SidebarContent>\n {nonEmptyGroups?.map((group) => (\n <SidebarGroup key={group.name}>\n <SidebarGroupLabel>{group.title}</SidebarGroupLabel>\n <SidebarMenu>\n {itemsByGroup[group.name]?.map((entity) => (\n <SidebarMenuItem key={entity.plural}>\n <SidebarMenuButton\n asChild\n isActive={location.pathname.includes(`/list/${entity.plural}`)}\n tooltip={capitalize(entity.menu?.label ?? entity.plural)}\n >\n <NavLinkCompat to={`list/${entity.plural}`}>\n {entity.menu?.icon ??\n createElement(\n Icons[getBestMatchingIcon(entity.name)] as React.ComponentType<React.SVGProps<SVGSVGElement>>,\n {\n className: 'fk:h-4 fk:w-4 fk:mr-2',\n strokeWidth: 2,\n }\n )}\n <span>{capitalize(entity.menu?.label ?? entity.plural)}</span>\n </NavLinkCompat>\n </SidebarMenuButton>\n </SidebarMenuItem>\n ))}\n </SidebarMenu>\n </SidebarGroup>\n ))}\n <SidebarGroup>\n <SidebarMenu>\n {itemsByGroup['ungrouped']?.map((entity) => (\n <SidebarMenuItem key={entity.plural}>\n <SidebarMenuButton\n asChild\n isActive={location.pathname.includes(`/list/${entity.plural}`)}\n tooltip={capitalize(entity.menu?.label ?? entity.plural)}\n >\n <NavLinkCompat to={`list/${entity.plural}`}>\n {createElement(\n Icons[getBestMatchingIcon(entity.name)] as React.ComponentType<React.SVGProps<SVGSVGElement>>,\n {\n className: 'fk:h-4 fk:w-4 fk:mr-2',\n strokeWidth: 2,\n }\n )}\n <span>{capitalize(entity.menu?.label ?? entity.plural)}</span>\n </NavLinkCompat>\n </SidebarMenuButton>\n </SidebarMenuItem>\n ))}\n </SidebarMenu>\n </SidebarGroup>\n </SidebarContent>\n <SidebarRail />\n </SidebarPrimitive>\n );\n}\n\nfunction capitalize(str: string): string {\n // Add space before capital letters and capitalize first letter\n const withSpaces = str.replace(/([A-Z])/g, ' $1');\n // Capitalize first letter and trim any leading space\n return withSpaces.charAt(0).toUpperCase() + withSpaces.slice(1).trim();\n}\n\n/**\n * Tries to get the best matching icon for an entity name using fuzy search\n */\nfunction getBestMatchingIcon(concept: string): keyof typeof Icons {\n const result = fuse.search(concept);\n\n if (result.length > 0) {\n return result[0].item.name as keyof typeof Icons;\n }\n\n return 'Dock' as keyof typeof Icons;\n}\n","'use client';\n\nimport * as React from 'react';\nimport { HoverCard as HoverCardPrimitive } from 'radix-ui';\nimport { cn } from '../lib/utils';\n\nfunction HoverCard({ ...props }: React.ComponentProps<typeof HoverCardPrimitive.Root>) {\n return <HoverCardPrimitive.Root data-slot=\"hover-card\" {...props} />;\n}\n\nfunction HoverCardTrigger({ ...props }: React.ComponentProps<typeof HoverCardPrimitive.Trigger>) {\n return <HoverCardPrimitive.Trigger data-slot=\"hover-card-trigger\" {...props} />;\n}\n\nfunction HoverCardContent({\n className,\n align = 'center',\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Content>) {\n return (\n <HoverCardPrimitive.Portal data-slot=\"hover-card-portal\">\n <HoverCardPrimitive.Content\n data-slot=\"hover-card-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n 'fk:z-50 fk:w-64 fk:origin-(--radix-hover-card-content-transform-origin) fk:rounded-md fk:border fk:bg-popover fk:p-4 fk:text-popover-foreground fk:shadow-md fk:outline-hidden fk:data-[side=bottom]:slide-in-from-top-2 fk:data-[side=left]:slide-in-from-right-2 fk:data-[side=right]:slide-in-from-left-2 fk:data-[side=top]:slide-in-from-bottom-2 fk:data-[state=closed]:animate-out fk:data-[state=closed]:fade-out-0 fk:data-[state=closed]:zoom-out-95 fk:data-[state=open]:animate-in fk:data-[state=open]:fade-in-0 fk:data-[state=open]:zoom-in-95 fk:corner-squircle',\n className\n )}\n {...props}\n />\n </HoverCardPrimitive.Portal>\n );\n}\n\nexport { HoverCard, HoverCardTrigger, HoverCardContent };\n","import * as React from 'react';\nimport { Loader2Icon } from 'lucide-react';\nimport { cn } from '../lib/utils';\n\nfunction Spinner({ className, ...props }: React.ComponentProps<'svg'>) {\n return (\n <Loader2Icon\n role=\"status\"\n aria-label=\"Loading\"\n className={cn('fk:size-4 fk:animate-spin', className)}\n {...props}\n />\n );\n}\n\nexport { Spinner };\n","'use client';\n\nimport * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../lib/utils';\nimport { Button } from './button';\nimport { Input } from './input';\nimport { Textarea } from './textarea';\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"input-group\"\n role=\"group\"\n className={cn(\n 'fk:group/input-group fk:border-input fk:dark:bg-input/30 fk:shadow-xs fk:relative fk:flex fk:w-full fk:items-center fk:rounded-lg fk:border fk:outline-none fk:transition-[color,box-shadow] fk:corner-squircle',\n 'fk:h-9 fk:has-[>textarea]:h-auto',\n 'fk:has-[>[data-align=inline-start]]:[&>input]:pl-2',\n 'fk:has-[>[data-align=inline-end]]:[&>input]:pr-2',\n 'fk:has-[>[data-align=block-start]]:h-auto fk:has-[>[data-align=block-start]]:flex-col fk:has-[>[data-align=block-start]]:[&>input]:pb-3',\n 'fk:has-[>[data-align=block-end]]:h-auto fk:has-[>[data-align=block-end]]:flex-col fk:has-[>[data-align=block-end]]:[&>input]:pt-3',\n 'fk:has-[[data-slot=input-group-control]:focus-visible]:ring-ring fk:has-[[data-slot=input-group-control]:focus-visible]:ring-1',\n 'fk:has-[[data-slot][aria-invalid=true]]:ring-destructive/20 fk:has-[[data-slot][aria-invalid=true]]:border-destructive fk:dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40',\n className\n )}\n {...props}\n />\n );\n}\n\nconst inputGroupAddonVariants = cva(\n 'fk:text-muted-foreground fk:flex fk:h-auto fk:cursor-text fk:select-none fk:items-center fk:justify-center fk:gap-2 fk:py-1.5 fk:text-sm fk:font-medium fk:group-data-[disabled=true]/input-group:opacity-50 fk:[&>kbd]:rounded-[calc(var(--radius)-5px)] fk:[&>svg:not([class*=size-])]:size-4',\n {\n variants: {\n align: {\n 'inline-start':\n 'fk:order-first fk:pl-3 fk:has-[>button]:ml-[-0.45rem] fk:has-[>kbd]:ml-[-0.35rem]',\n 'inline-end':\n 'fk:order-last fk:pr-3 fk:has-[>button]:mr-[-0.4rem] fk:has-[>kbd]:mr-[-0.35rem]',\n 'block-start':\n 'fk:[.border-b]:pb-3 fk:order-first fk:w-full fk:justify-start fk:px-3 fk:pt-3 fk:group-has-[>input]/input-group:pt-2.5',\n 'block-end':\n 'fk:[.border-t]:pt-3 fk:order-last fk:w-full fk:justify-start fk:px-3 fk:pb-3 fk:group-has-[>input]/input-group:pb-2.5',\n },\n },\n defaultVariants: {\n align: 'inline-start',\n },\n }\n);\n\nfunction InputGroupAddon({\n className,\n align = 'inline-start',\n ...props\n}: React.ComponentProps<'div'> & VariantProps<typeof inputGroupAddonVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(inputGroupAddonVariants({ align }), className)}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest('button')) {\n return;\n }\n\n e.currentTarget.parentElement?.querySelector('input')?.focus();\n }}\n {...props}\n />\n );\n}\n\nconst inputGroupButtonVariants = cva('fk:flex fk:items-center fk:gap-2 fk:text-sm fk:shadow-none', {\n variants: {\n size: {\n xs: 'fk:h-6 fk:gap-1 fk:rounded-[calc(var(--radius)-5px)] fk:px-2 fk:has-[>svg]:px-2 fk:[&>svg:not([class*=size-])]:size-3.5 fk:corner-squircle',\n sm: 'fk:h-8 fk:gap-1.5 fk:rounded-lg fk:px-2.5 fk:has-[>svg]:px-2.5 fk:corner-squircle',\n 'icon-xs': 'fk:size-6 fk:rounded-[calc(var(--radius)-5px)] fk:p-0 fk:has-[>svg]:p-0 fk:corner-squircle',\n 'icon-sm': 'fk:size-8 fk:p-0 fk:has-[>svg]:p-0',\n },\n },\n defaultVariants: {\n size: 'xs',\n },\n});\n\nfunction InputGroupButton({\n className,\n type = 'button',\n variant = 'ghost',\n size = 'xs',\n ...props\n}: Omit<React.ComponentProps<typeof Button>, 'size'> & VariantProps<typeof inputGroupButtonVariants>) {\n return (\n <Button\n type={type}\n data-size={size}\n variant={variant}\n className={cn(inputGroupButtonVariants({ size }), className)}\n {...props}\n />\n );\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<'span'>) {\n return (\n <span\n className={cn(\n 'fk:text-muted-foreground fk:flex fk:items-center fk:gap-2 fk:text-sm fk:[&_svg:not([class*=size-])]:size-4 fk:[&_svg]:pointer-events-none',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction InputGroupInput({ className, ...props }: React.ComponentProps<'input'>) {\n return (\n <Input\n data-slot=\"input-group-control\"\n className={cn(\n 'fk:flex-1 fk:rounded-none fk:border-0 fk:bg-transparent fk:shadow-none fk:focus-visible:ring-0 fk:dark:bg-transparent fk:corner-squircle',\n className\n )}\n {...props}\n />\n );\n}\n\nfunction InputGroupTextarea({ className, ...props }: React.ComponentProps<'textarea'>) {\n return (\n <Textarea\n data-slot=\"input-group-control\"\n className={cn(\n 'fk:flex-1 fk:resize-none fk:rounded-none fk:border-0 fk:bg-transparent fk:py-3 fk:shadow-none fk:focus-visible:ring-0 fk:dark:bg-transparent fk:corner-squircle',\n className\n )}\n {...props}\n />\n );\n}\n\nexport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupText,\n InputGroupInput,\n InputGroupTextarea,\n};\n","'use client';\n\nimport { Button } from '../primitives/button';\nimport { HoverCard, HoverCardContent, HoverCardTrigger } from '../primitives/hover-card';\nimport { cn } from '../lib/utils';\nimport type { FileUIPart, SourceDocumentUIPart } from 'ai';\nimport { FileTextIcon, GlobeIcon, ImageIcon, Music2Icon, PaperclipIcon, VideoIcon, XIcon } from 'lucide-react';\nimport type { ComponentProps, HTMLAttributes, ReactNode } from 'react';\nimport { createContext, useCallback, useContext, useMemo } from 'react';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type AttachmentData = (FileUIPart & { id: string }) | (SourceDocumentUIPart & { id: string });\n\nexport type AttachmentMediaCategory = 'image' | 'video' | 'audio' | 'document' | 'source' | 'unknown';\n\nexport type AttachmentVariant = 'grid' | 'inline' | 'list';\n\nconst mediaCategoryIcons: Record<AttachmentMediaCategory, typeof ImageIcon> = {\n audio: Music2Icon,\n document: FileTextIcon,\n image: ImageIcon,\n source: GlobeIcon,\n unknown: PaperclipIcon,\n video: VideoIcon,\n};\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\nexport const getMediaCategory = (data: AttachmentData): AttachmentMediaCategory => {\n if (data.type === 'source-document') {\n return 'source';\n }\n\n const mediaType = data.mediaType ?? '';\n\n if (mediaType.startsWith('image/')) {\n return 'image';\n }\n if (mediaType.startsWith('video/')) {\n return 'video';\n }\n if (mediaType.startsWith('audio/')) {\n return 'audio';\n }\n if (mediaType.startsWith('application/') || mediaType.startsWith('text/')) {\n return 'document';\n }\n\n return 'unknown';\n};\n\nexport const getAttachmentLabel = (data: AttachmentData): string => {\n if (data.type === 'source-document') {\n return data.title || data.filename || 'Source';\n }\n\n const category = getMediaCategory(data);\n return data.filename || (category === 'image' ? 'Image' : 'Attachment');\n};\n\nconst renderAttachmentImage = (url: string, filename: string | undefined, isGrid: boolean) =>\n isGrid ? (\n <img alt={filename || 'Image'} className=\"fk:size-full fk:object-cover\" height={96} src={url} width={96} />\n ) : (\n <img\n alt={filename || 'Image'}\n className=\"fk:size-full fk:rounded fk:object-cover fk:corner-squircle\"\n height={20}\n src={url}\n width={20}\n />\n );\n\n// ============================================================================\n// Contexts\n// ============================================================================\n\ninterface AttachmentsContextValue {\n variant: AttachmentVariant;\n}\n\nconst AttachmentsContext = createContext<AttachmentsContextValue | null>(null);\n\ninterface AttachmentContextValue {\n data: AttachmentData;\n mediaCategory: AttachmentMediaCategory;\n onRemove?: () => void;\n variant: AttachmentVariant;\n}\n\nconst AttachmentContext = createContext<AttachmentContextValue | null>(null);\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\nexport const useAttachmentsContext = () => useContext(AttachmentsContext) ?? { variant: 'grid' as const };\n\nexport const useAttachmentContext = () => {\n const ctx = useContext(AttachmentContext);\n if (!ctx) {\n throw new Error('Attachment components must be used within <Attachment>');\n }\n return ctx;\n};\n\n// ============================================================================\n// Attachments - Container\n// ============================================================================\n\nexport type AttachmentsProps = HTMLAttributes<HTMLDivElement> & {\n variant?: AttachmentVariant;\n};\n\nexport const Attachments = ({ variant = 'grid', className, children, ...props }: AttachmentsProps) => {\n const contextValue = useMemo(() => ({ variant }), [variant]);\n\n return (\n <AttachmentsContext.Provider value={contextValue}>\n <div\n className={cn(\n 'fk:flex fk:items-start',\n variant === 'list' ? 'fk:flex-col fk:gap-2' : 'fk:flex-wrap fk:gap-2',\n variant === 'grid' && 'fk:ml-auto fk:w-fit',\n className\n )}\n {...props}\n >\n {children}\n </div>\n </AttachmentsContext.Provider>\n );\n};\n\n// ============================================================================\n// Attachment - Item\n// ============================================================================\n\nexport type AttachmentProps = HTMLAttributes<HTMLDivElement> & {\n data: AttachmentData;\n onRemove?: () => void;\n};\n\nexport const Attachment = ({ data, onRemove, className, children, ...props }: AttachmentProps) => {\n const { variant } = useAttachmentsContext();\n const mediaCategory = getMediaCategory(data);\n\n const contextValue = useMemo<AttachmentContextValue>(\n () => ({ data, mediaCategory, onRemove, variant }),\n [data, mediaCategory, onRemove, variant]\n );\n\n return (\n <AttachmentContext.Provider value={contextValue}>\n <div\n className={cn(\n 'fk:group fk:relative',\n variant === 'grid' && 'fk:size-24 fk:overflow-hidden fk:rounded-lg fk:corner-squircle',\n variant === 'inline' && [\n 'fk:flex fk:h-8 fk:cursor-pointer fk:select-none fk:items-center fk:gap-1.5',\n 'fk:rounded-md fk:border fk:border-border fk:px-1.5 fk:corner-squircle',\n 'fk:font-medium fk:text-sm fk:transition-all',\n 'fk:hover:bg-accent fk:hover:text-accent-foreground fk:dark:hover:bg-accent/50',\n ],\n variant === 'list' && [\n 'fk:flex fk:w-full fk:items-center fk:gap-3 fk:rounded-lg fk:border fk:p-3 fk:corner-squircle',\n 'fk:hover:bg-accent/50',\n ],\n className\n )}\n {...props}\n >\n {children}\n </div>\n </AttachmentContext.Provider>\n );\n};\n\n// ============================================================================\n// AttachmentPreview - Media preview\n// ============================================================================\n\nexport type AttachmentPreviewProps = HTMLAttributes<HTMLDivElement> & {\n fallbackIcon?: ReactNode;\n};\n\nexport const AttachmentPreview = ({ fallbackIcon, className, ...props }: AttachmentPreviewProps) => {\n const { data, mediaCategory, variant } = useAttachmentContext();\n\n const iconSize = variant === 'inline' ? 'fk:size-3' : 'fk:size-4';\n\n const renderIcon = (Icon: typeof ImageIcon) => <Icon className={cn(iconSize, 'fk:text-muted-foreground')} />;\n\n const renderContent = () => {\n if (mediaCategory === 'image' && data.type === 'file' && data.url) {\n return renderAttachmentImage(data.url, data.filename, variant === 'grid');\n }\n\n if (mediaCategory === 'video' && data.type === 'file' && data.url) {\n return <video className=\"fk:size-full fk:object-cover\" muted src={data.url} />;\n }\n\n const Icon = mediaCategoryIcons[mediaCategory];\n return fallbackIcon ?? renderIcon(Icon);\n };\n\n return (\n <div\n className={cn(\n 'fk:flex fk:shrink-0 fk:items-center fk:justify-center fk:overflow-hidden',\n variant === 'grid' && 'fk:size-full fk:bg-muted',\n variant === 'inline' && 'fk:size-5 fk:rounded fk:bg-background fk:corner-squircle',\n variant === 'list' && 'fk:size-12 fk:rounded fk:bg-muted fk:corner-squircle',\n className\n )}\n {...props}\n >\n {renderContent()}\n </div>\n );\n};\n\n// ============================================================================\n// AttachmentInfo - Name and type display\n// ============================================================================\n\nexport type AttachmentInfoProps = HTMLAttributes<HTMLDivElement> & {\n showMediaType?: boolean;\n};\n\nexport const AttachmentInfo = ({ showMediaType = false, className, ...props }: AttachmentInfoProps) => {\n const { data, variant } = useAttachmentContext();\n const label = getAttachmentLabel(data);\n\n if (variant === 'grid') {\n return null;\n }\n\n return (\n <div className={cn('fk:min-w-0 fk:flex-1', className)} {...props}>\n <span className=\"fk:block fk:truncate\">{label}</span>\n {showMediaType && data.mediaType && (\n <span className=\"fk:block fk:truncate fk:text-muted-foreground fk:text-xs\">{data.mediaType}</span>\n )}\n </div>\n );\n};\n\n// ============================================================================\n// AttachmentRemove - Remove button\n// ============================================================================\n\nexport type AttachmentRemoveProps = ComponentProps<typeof Button> & {\n label?: string;\n};\n\nexport const AttachmentRemove = ({ label = 'Remove', className, children, ...props }: AttachmentRemoveProps) => {\n const { onRemove, variant } = useAttachmentContext();\n\n const handleClick = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onRemove?.();\n },\n [onRemove]\n );\n\n if (!onRemove) {\n return null;\n }\n\n return (\n <Button\n aria-label={label}\n className={cn(\n variant === 'grid' && [\n 'fk:absolute fk:top-2 fk:right-2 fk:size-6 fk:rounded-full fk:p-0 fk:corner-squircle',\n 'fk:bg-background/80 fk:backdrop-blur-sm',\n 'fk:opacity-0 fk:transition-opacity fk:group-hover:opacity-100',\n 'fk:hover:bg-background',\n 'fk:[&>svg]:size-3',\n ],\n variant === 'inline' && [\n 'fk:size-5 fk:rounded fk:p-0 fk:corner-squircle',\n 'fk:opacity-0 fk:transition-opacity fk:group-hover:opacity-100',\n 'fk:[&>svg]:size-2.5',\n ],\n variant === 'list' && ['fk:size-8 fk:shrink-0 fk:rounded fk:p-0 fk:corner-squircle', 'fk:[&>svg]:size-4'],\n className\n )}\n onClick={handleClick}\n type=\"button\"\n variant=\"ghost\"\n {...props}\n >\n {children ?? <XIcon />}\n <span className=\"fk:sr-only\">{label}</span>\n </Button>\n );\n};\n\n// ============================================================================\n// AttachmentHoverCard - Hover preview\n// ============================================================================\n\nexport type AttachmentHoverCardProps = ComponentProps<typeof HoverCard>;\n\nexport const AttachmentHoverCard = ({ openDelay = 0, closeDelay = 0, ...props }: AttachmentHoverCardProps) => (\n <HoverCard closeDelay={closeDelay} openDelay={openDelay} {...props} />\n);\n\nexport type AttachmentHoverCardTriggerProps = ComponentProps<typeof HoverCardTrigger>;\n\nexport const AttachmentHoverCardTrigger = (props: AttachmentHoverCardTriggerProps) => <HoverCardTrigger {...props} />;\n\nexport type AttachmentHoverCardContentProps = ComponentProps<typeof HoverCardContent>;\n\nexport const AttachmentHoverCardContent = ({\n align = 'start',\n className,\n ...props\n}: AttachmentHoverCardContentProps) => (\n <HoverCardContent align={align} className={cn('fk:w-auto fk:p-2', className)} {...props} />\n);\n\n// ============================================================================\n// AttachmentEmpty - Empty state\n// ============================================================================\n\nexport type AttachmentEmptyProps = HTMLAttributes<HTMLDivElement>;\n\nexport const AttachmentEmpty = ({ className, children, ...props }: AttachmentEmptyProps) => (\n <div\n className={cn('fk:flex fk:items-center fk:justify-center fk:p-4 fk:text-muted-foreground fk:text-sm', className)}\n {...props}\n >\n {children ?? 'No attachments'}\n </div>\n);\n","'use client';\n\nimport { Button } from '../primitives/button';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../primitives/select';\nimport { cn } from '../lib/utils';\nimport { CheckIcon, CopyIcon } from 'lucide-react';\nimport type { ComponentProps, CSSProperties, HTMLAttributes } from 'react';\nimport { createContext, memo, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport type { BundledLanguage, BundledTheme, HighlighterGeneric, ThemedToken } from 'shiki';\nimport { createHighlighter } from 'shiki';\n\n// Shiki uses bitflags for font styles: 1=italic, 2=bold, 4=underline\n// oxlint-disable-next-line eslint(no-bitwise)\nconst isItalic = (fontStyle: number | undefined) => fontStyle && fontStyle & 1;\n// oxlint-disable-next-line eslint(no-bitwise)\nconst isBold = (fontStyle: number | undefined) => fontStyle && fontStyle & 2;\nconst isUnderline = (fontStyle: number | undefined) =>\n // oxlint-disable-next-line eslint(no-bitwise)\n fontStyle && fontStyle & 4;\n\n// Transform tokens to include pre-computed keys to avoid noArrayIndexKey lint\ninterface KeyedToken {\n token: ThemedToken;\n key: string;\n}\ninterface KeyedLine {\n tokens: KeyedToken[];\n key: string;\n}\n\nconst addKeysToTokens = (lines: ThemedToken[][]): KeyedLine[] =>\n lines.map((line, lineIdx) => ({\n key: `line-${lineIdx}`,\n tokens: line.map((token, tokenIdx) => ({\n key: `line-${lineIdx}-${tokenIdx}`,\n token,\n })),\n }));\n\n// Token rendering component\nconst TokenSpan = ({ token }: { token: ThemedToken }) => (\n <span\n className=\"fk:dark:bg-(--shiki-dark-bg)! fk:dark:text-(--shiki-dark)!\"\n style={\n {\n backgroundColor: token.bgColor,\n color: token.color,\n fontStyle: isItalic(token.fontStyle) ? 'italic' : undefined,\n fontWeight: isBold(token.fontStyle) ? 'bold' : undefined,\n textDecoration: isUnderline(token.fontStyle) ? 'underline' : undefined,\n ...token.htmlStyle,\n } as CSSProperties\n }\n >\n {token.content}\n </span>\n);\n\n// Line number styles using CSS counters\nconst LINE_NUMBER_CLASSES = cn(\n 'fk:block',\n 'fk:before:content-[counter(line)]',\n 'fk:before:inline-block',\n 'fk:before:[counter-increment:line]',\n 'fk:before:w-8',\n 'fk:before:mr-4',\n 'fk:before:text-right',\n 'fk:before:text-muted-foreground/50',\n 'fk:before:font-mono',\n 'fk:before:select-none'\n);\n\n// Line rendering component\nconst LineSpan = ({ keyedLine, showLineNumbers }: { keyedLine: KeyedLine; showLineNumbers: boolean }) => (\n <span className={showLineNumbers ? LINE_NUMBER_CLASSES : 'fk:block'}>\n {keyedLine.tokens.length === 0\n ? '\\n'\n : keyedLine.tokens.map(({ token, key }) => <TokenSpan key={key} token={token} />)}\n </span>\n);\n\n// Types\ntype CodeBlockProps = HTMLAttributes<HTMLDivElement> & {\n code: string;\n language: BundledLanguage;\n showLineNumbers?: boolean;\n};\n\ninterface TokenizedCode {\n tokens: ThemedToken[][];\n fg: string;\n bg: string;\n}\n\ninterface CodeBlockContextType {\n code: string;\n}\n\n// Context\nconst CodeBlockContext = createContext<CodeBlockContextType>({\n code: '',\n});\n\n// Highlighter cache (singleton per language)\nconst highlighterCache = new Map<string, Promise<HighlighterGeneric<BundledLanguage, BundledTheme>>>();\n\n// Token cache\nconst tokensCache = new Map<string, TokenizedCode>();\n\n// Subscribers for async token updates\nconst subscribers = new Map<string, Set<(result: TokenizedCode) => void>>();\n\nconst getTokensCacheKey = (code: string, language: BundledLanguage) => {\n const start = code.slice(0, 100);\n const end = code.length > 100 ? code.slice(-100) : '';\n return `${language}:${code.length}:${start}:${end}`;\n};\n\nconst getHighlighter = (language: BundledLanguage): Promise<HighlighterGeneric<BundledLanguage, BundledTheme>> => {\n const cached = highlighterCache.get(language);\n if (cached) {\n return cached;\n }\n\n const highlighterPromise = createHighlighter({\n langs: [language],\n themes: ['github-light', 'github-dark'],\n });\n\n highlighterCache.set(language, highlighterPromise);\n return highlighterPromise;\n};\n\n// Create raw tokens for immediate display while highlighting loads\nconst createRawTokens = (code: string): TokenizedCode => ({\n bg: 'transparent',\n fg: 'inherit',\n tokens: code.split('\\n').map((line) =>\n line === ''\n ? []\n : [\n {\n color: 'inherit',\n content: line,\n } as ThemedToken,\n ]\n ),\n});\n\n// Synchronous highlight with callback for async results\nexport const highlightCode = (\n code: string,\n language: BundledLanguage,\n // oxlint-disable-next-line eslint-plugin-promise(prefer-await-to-callbacks)\n callback?: (result: TokenizedCode) => void\n): TokenizedCode | null => {\n const tokensCacheKey = getTokensCacheKey(code, language);\n\n // Return cached result if available\n const cached = tokensCache.get(tokensCacheKey);\n if (cached) {\n return cached;\n }\n\n // Subscribe callback if provided\n if (callback) {\n if (!subscribers.has(tokensCacheKey)) {\n subscribers.set(tokensCacheKey, new Set());\n }\n subscribers.get(tokensCacheKey)?.add(callback);\n }\n\n // Start highlighting in background - fire-and-forget async pattern\n getHighlighter(language)\n // oxlint-disable-next-line eslint-plugin-promise(prefer-await-to-then)\n .then((highlighter) => {\n const availableLangs = highlighter.getLoadedLanguages();\n const langToUse = availableLangs.includes(language) ? language : 'text';\n\n const result = highlighter.codeToTokens(code, {\n lang: langToUse,\n themes: {\n dark: 'github-dark',\n light: 'github-light',\n },\n });\n\n const tokenized: TokenizedCode = {\n bg: result.bg ?? 'transparent',\n fg: result.fg ?? 'inherit',\n tokens: result.tokens,\n };\n\n // Cache the result\n tokensCache.set(tokensCacheKey, tokenized);\n\n // Notify all subscribers\n const subs = subscribers.get(tokensCacheKey);\n if (subs) {\n for (const sub of subs) {\n sub(tokenized);\n }\n subscribers.delete(tokensCacheKey);\n }\n })\n // oxlint-disable-next-line eslint-plugin-promise(prefer-await-to-then), eslint-plugin-promise(prefer-await-to-callbacks)\n .catch((error) => {\n console.error('Failed to highlight code:', error);\n subscribers.delete(tokensCacheKey);\n });\n\n return null;\n};\n\nconst CodeBlockBody = memo(\n ({\n tokenized,\n showLineNumbers,\n className,\n }: {\n tokenized: TokenizedCode;\n showLineNumbers: boolean;\n className?: string;\n }) => {\n const preStyle = useMemo(\n () => ({\n backgroundColor: tokenized.bg,\n color: tokenized.fg,\n }),\n [tokenized.bg, tokenized.fg]\n );\n\n const keyedLines = useMemo(() => addKeysToTokens(tokenized.tokens), [tokenized.tokens]);\n\n return (\n <pre\n className={cn('fk:dark:bg-(--shiki-dark-bg)! fk:dark:text-(--shiki-dark)! fk:m-0 fk:p-4 fk:text-sm', className)}\n style={preStyle}\n >\n <code\n className={cn(\n 'fk:font-mono fk:text-sm',\n showLineNumbers && 'fk:[counter-increment:line_0] fk:[counter-reset:line]'\n )}\n >\n {keyedLines.map((keyedLine) => (\n <LineSpan key={keyedLine.key} keyedLine={keyedLine} showLineNumbers={showLineNumbers} />\n ))}\n </code>\n </pre>\n );\n },\n (prevProps, nextProps) =>\n prevProps.tokenized === nextProps.tokenized &&\n prevProps.showLineNumbers === nextProps.showLineNumbers &&\n prevProps.className === nextProps.className\n);\n\nCodeBlockBody.displayName = 'CodeBlockBody';\n\nexport const CodeBlockContainer = ({\n className,\n language,\n style,\n ...props\n}: HTMLAttributes<HTMLDivElement> & { language: string }) => (\n <div\n className={cn(\n 'fk:group fk:relative fk:w-full fk:overflow-hidden fk:rounded-md fk:border fk:bg-background fk:text-foreground fk:corner-squircle',\n className\n )}\n data-language={language}\n style={{\n containIntrinsicSize: 'auto 200px',\n contentVisibility: 'auto',\n ...style,\n }}\n {...props}\n />\n);\n\nexport const CodeBlockHeader = ({ children, className, ...props }: HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n 'fk:flex fk:items-center fk:justify-between fk:border-b fk:bg-muted/80 fk:px-3 fk:py-2 fk:text-muted-foreground fk:text-xs',\n className\n )}\n {...props}\n >\n {children}\n </div>\n);\n\nexport const CodeBlockTitle = ({ children, className, ...props }: HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('fk:flex fk:items-center fk:gap-2', className)} {...props}>\n {children}\n </div>\n);\n\nexport const CodeBlockFilename = ({ children, className, ...props }: HTMLAttributes<HTMLSpanElement>) => (\n <span className={cn('fk:font-mono', className)} {...props}>\n {children}\n </span>\n);\n\nexport const CodeBlockActions = ({ children, className, ...props }: HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('fk:-my-1 fk:-mr-1 fk:flex fk:items-center fk:gap-2', className)} {...props}>\n {children}\n </div>\n);\n\nexport const CodeBlockContent = ({\n code,\n language,\n showLineNumbers = false,\n}: {\n code: string;\n language: BundledLanguage;\n showLineNumbers?: boolean;\n}) => {\n // Memoized raw tokens for immediate display\n const rawTokens = useMemo(() => createRawTokens(code), [code]);\n\n // Synchronous cache lookup — avoids setState in effect for cached results\n const syncTokens = useMemo(() => highlightCode(code, language) ?? rawTokens, [code, language, rawTokens]);\n\n // Async highlighting result (populated after shiki loads)\n const [asyncTokens, setAsyncTokens] = useState<TokenizedCode | null>(null);\n const asyncKeyRef = useRef({ code, language });\n\n // Invalidate stale async tokens synchronously during render\n if (asyncKeyRef.current.code !== code || asyncKeyRef.current.language !== language) {\n asyncKeyRef.current = { code, language };\n setAsyncTokens(null);\n }\n\n useEffect(() => {\n let cancelled = false;\n\n highlightCode(code, language, (result) => {\n if (!cancelled) {\n setAsyncTokens(result);\n }\n });\n\n return () => {\n cancelled = true;\n };\n }, [code, language]);\n\n const tokenized = asyncTokens ?? syncTokens;\n\n return (\n <div className=\"fk:relative fk:overflow-auto\">\n <CodeBlockBody showLineNumbers={showLineNumbers} tokenized={tokenized} />\n </div>\n );\n};\n\nexport const CodeBlock = ({\n code,\n language,\n showLineNumbers = false,\n className,\n children,\n ...props\n}: CodeBlockProps) => {\n const contextValue = useMemo(() => ({ code }), [code]);\n\n return (\n <CodeBlockContext.Provider value={contextValue}>\n <CodeBlockContainer className={className} language={language} {...props}>\n {children}\n <CodeBlockContent code={code} language={language} showLineNumbers={showLineNumbers} />\n </CodeBlockContainer>\n </CodeBlockContext.Provider>\n );\n};\n\nexport type CodeBlockCopyButtonProps = ComponentProps<typeof Button> & {\n onCopy?: () => void;\n onError?: (error: Error) => void;\n timeout?: number;\n};\n\nexport const CodeBlockCopyButton = ({\n onCopy,\n onError,\n timeout = 2000,\n children,\n className,\n ...props\n}: CodeBlockCopyButtonProps) => {\n const [isCopied, setIsCopied] = useState(false);\n const timeoutRef = useRef<number>(0);\n const { code } = useContext(CodeBlockContext);\n\n const copyToClipboard = useCallback(async () => {\n if (typeof window === 'undefined' || !navigator?.clipboard?.writeText) {\n onError?.(new Error('Clipboard API not available'));\n return;\n }\n\n try {\n if (!isCopied) {\n await navigator.clipboard.writeText(code);\n setIsCopied(true);\n onCopy?.();\n timeoutRef.current = window.setTimeout(() => setIsCopied(false), timeout);\n }\n } catch (error) {\n onError?.(error as Error);\n }\n }, [code, onCopy, onError, timeout, isCopied]);\n\n useEffect(\n () => () => {\n window.clearTimeout(timeoutRef.current);\n },\n []\n );\n\n const Icon = isCopied ? CheckIcon : CopyIcon;\n\n return (\n <Button className={cn('fk:shrink-0', className)} onClick={copyToClipboard} size=\"icon\" variant=\"ghost\" {...props}>\n {children ?? <Icon size={14} />}\n </Button>\n );\n};\n\nexport type CodeBlockLanguageSelectorProps = ComponentProps<typeof Select>;\n\nexport const CodeBlockLanguageSelector = (props: CodeBlockLanguageSelectorProps) => <Select {...props} />;\n\nexport type CodeBlockLanguageSelectorTriggerProps = ComponentProps<typeof SelectTrigger>;\n\nexport const CodeBlockLanguageSelectorTrigger = ({ className, ...props }: CodeBlockLanguageSelectorTriggerProps) => (\n <SelectTrigger\n className={cn('fk:h-7 fk:border-none fk:bg-transparent fk:px-2 fk:text-xs fk:shadow-none', className)}\n size=\"sm\"\n {...props}\n />\n);\n\nexport type CodeBlockLanguageSelectorValueProps = ComponentProps<typeof SelectValue>;\n\nexport const CodeBlockLanguageSelectorValue = (props: CodeBlockLanguageSelectorValueProps) => (\n <SelectValue {...props} />\n);\n\nexport type CodeBlockLanguageSelectorContentProps = ComponentProps<typeof SelectContent>;\n\nexport const CodeBlockLanguageSelectorContent = ({\n align = 'end',\n ...props\n}: CodeBlockLanguageSelectorContentProps) => <SelectContent align={align} {...props} />;\n\nexport type CodeBlockLanguageSelectorItemProps = ComponentProps<typeof SelectItem>;\n\nexport const CodeBlockLanguageSelectorItem = (props: CodeBlockLanguageSelectorItemProps) => <SelectItem {...props} />;\n","'use client';\n\nimport { Button } from '../primitives/button';\nimport { cn } from '../lib/utils';\nimport type { UIMessage } from 'ai';\nimport { ArrowDownIcon, DownloadIcon } from 'lucide-react';\nimport type { ComponentProps } from 'react';\nimport { useCallback } from 'react';\nimport { StickToBottom, useStickToBottomContext } from 'use-stick-to-bottom';\n\nexport type ConversationProps = ComponentProps<typeof StickToBottom>;\n\nexport const Conversation = ({ className, ...props }: ConversationProps) => (\n <StickToBottom\n className={cn('fk:relative fk:flex-1 fk:overflow-y-hidden', className)}\n initial=\"smooth\"\n resize=\"smooth\"\n role=\"log\"\n {...props}\n />\n);\n\nexport type ConversationContentProps = ComponentProps<typeof StickToBottom.Content>;\n\nexport const ConversationContent = ({ className, ...props }: ConversationContentProps) => (\n <StickToBottom.Content className={cn('fk:flex fk:flex-col fk:gap-8 fk:p-4', className)} {...props} />\n);\n\nexport type ConversationEmptyStateProps = ComponentProps<'div'> & {\n title?: string;\n description?: string;\n icon?: React.ReactNode;\n};\n\nexport const ConversationEmptyState = ({\n className,\n title = 'No messages yet',\n description = 'Start a conversation to see messages here',\n icon,\n children,\n ...props\n}: ConversationEmptyStateProps) => (\n <div\n className={cn(\n 'fk:flex fk:size-full fk:flex-col fk:items-center fk:justify-center fk:gap-3 fk:p-8 fk:text-center',\n className\n )}\n {...props}\n >\n {children ?? (\n <>\n {icon && <div className=\"fk:text-muted-foreground\">{icon}</div>}\n <div className=\"fk:space-y-1\">\n <h3 className=\"fk:font-medium fk:text-sm\">{title}</h3>\n {description && <p className=\"fk:text-muted-foreground fk:text-sm\">{description}</p>}\n </div>\n </>\n )}\n </div>\n);\n\nexport type ConversationScrollButtonProps = ComponentProps<typeof Button>;\n\nexport const ConversationScrollButton = ({ className, ...props }: ConversationScrollButtonProps) => {\n const { isAtBottom, scrollToBottom } = useStickToBottomContext();\n\n const handleScrollToBottom = useCallback(() => {\n scrollToBottom();\n }, [scrollToBottom]);\n\n return (\n !isAtBottom && (\n <Button\n className={cn(\n 'fk:absolute fk:bottom-4 fk:left-[50%] fk:translate-x-[-50%] fk:rounded-full fk:dark:bg-background fk:dark:hover:bg-muted fk:corner-squircle',\n className\n )}\n onClick={handleScrollToBottom}\n size=\"icon\"\n type=\"button\"\n variant=\"outline\"\n {...props}\n >\n <ArrowDownIcon className=\"fk:size-4\" />\n </Button>\n )\n );\n};\n\nconst getMessageText = (message: UIMessage): string =>\n message.parts\n .filter((part) => part.type === 'text')\n .map((part) => part.text)\n .join('');\n\nexport type ConversationDownloadProps = Omit<ComponentProps<typeof Button>, 'onClick'> & {\n messages: UIMessage[];\n filename?: string;\n formatMessage?: (message: UIMessage, index: number) => string;\n};\n\nconst defaultFormatMessage = (message: UIMessage): string => {\n const roleLabel = message.role.charAt(0).toUpperCase() + message.role.slice(1);\n return `**${roleLabel}:** ${getMessageText(message)}`;\n};\n\nexport const messagesToMarkdown = (\n messages: UIMessage[],\n formatMessage: (message: UIMessage, index: number) => string = defaultFormatMessage\n): string => messages.map((msg, i) => formatMessage(msg, i)).join('\\n\\n');\n\nexport const ConversationDownload = ({\n messages,\n filename = 'conversation.md',\n formatMessage = defaultFormatMessage,\n className,\n children,\n ...props\n}: ConversationDownloadProps) => {\n const handleDownload = useCallback(() => {\n const markdown = messagesToMarkdown(messages, formatMessage);\n const blob = new Blob([markdown], { type: 'text/markdown' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n document.body.append(link);\n link.click();\n link.remove();\n URL.revokeObjectURL(url);\n }, [messages, filename, formatMessage]);\n\n return (\n <Button\n className={cn(\n 'fk:absolute fk:top-4 fk:right-4 fk:rounded-full fk:dark:bg-background fk:dark:hover:bg-muted fk:corner-squircle',\n className\n )}\n onClick={handleDownload}\n size=\"icon\"\n type=\"button\"\n variant=\"outline\"\n {...props}\n >\n {children ?? <DownloadIcon className=\"fk:size-4\" />}\n </Button>\n );\n};\n","'use client';\n\nimport { Button } from '../primitives/button';\nimport { ButtonGroup, ButtonGroupText } from '../primitives/button-group';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../primitives/tooltip';\nimport { cn } from '../lib/utils';\nimport { cjk } from '@streamdown/cjk';\nimport { code } from '@streamdown/code';\nimport { math } from '@streamdown/math';\nimport { mermaid } from '@streamdown/mermaid';\nimport type { UIMessage } from 'ai';\nimport { ChevronLeftIcon, ChevronRightIcon } from 'lucide-react';\nimport type { ComponentProps, HTMLAttributes, ReactElement } from 'react';\nimport { createContext, memo, useCallback, useContext, useEffect, useMemo, useState } from 'react';\nimport { Streamdown } from 'streamdown';\n\nexport type MessageProps = HTMLAttributes<HTMLDivElement> & {\n from: UIMessage['role'];\n};\n\nexport const Message = ({ className, from, ...props }: MessageProps) => (\n <div\n className={cn(\n 'fk:group fk:flex fk:w-full fk:max-w-[95%] fk:flex-col fk:gap-2',\n from === 'user' ? 'fk:is-user fk:ml-auto fk:justify-end' : 'fk:is-assistant',\n className\n )}\n {...props}\n />\n);\n\nexport type MessageContentProps = HTMLAttributes<HTMLDivElement>;\n\nexport const MessageContent = ({ children, className, ...props }: MessageContentProps) => (\n <div\n className={cn(\n 'fk:is-user:dark fk:flex fk:w-fit fk:min-w-0 fk:max-w-full fk:flex-col fk:gap-2 fk:overflow-hidden fk:text-sm',\n 'fk:group-[.is-user]:ml-auto fk:group-[.is-user]:rounded-lg fk:group-[.is-user]:bg-secondary fk:group-[.is-user]:px-4 fk:group-[.is-user]:py-3 fk:group-[.is-user]:text-foreground',\n 'fk:group-[.is-assistant]:text-foreground',\n className\n )}\n {...props}\n >\n {children}\n </div>\n);\n\nexport type MessageActionsProps = ComponentProps<'div'>;\n\nexport const MessageActions = ({ className, children, ...props }: MessageActionsProps) => (\n <div className={cn('fk:flex fk:items-center fk:gap-1', className)} {...props}>\n {children}\n </div>\n);\n\nexport type MessageActionProps = ComponentProps<typeof Button> & {\n tooltip?: string;\n label?: string;\n};\n\nexport const MessageAction = ({\n tooltip,\n children,\n label,\n variant = 'ghost',\n size = 'icon-sm',\n ...props\n}: MessageActionProps) => {\n const button = (\n <Button size={size} type=\"button\" variant={variant} {...props}>\n {children}\n <span className=\"fk:sr-only\">{label || tooltip}</span>\n </Button>\n );\n\n if (tooltip) {\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent>\n <p>{tooltip}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n }\n\n return button;\n};\n\ninterface MessageBranchContextType {\n currentBranch: number;\n totalBranches: number;\n goToPrevious: () => void;\n goToNext: () => void;\n branches: ReactElement[];\n setBranches: (branches: ReactElement[]) => void;\n}\n\nconst MessageBranchContext = createContext<MessageBranchContextType | null>(null);\n\nconst useMessageBranch = () => {\n const context = useContext(MessageBranchContext);\n\n if (!context) {\n throw new Error('MessageBranch components must be used within MessageBranch');\n }\n\n return context;\n};\n\nexport type MessageBranchProps = HTMLAttributes<HTMLDivElement> & {\n defaultBranch?: number;\n onBranchChange?: (branchIndex: number) => void;\n};\n\nexport const MessageBranch = ({ defaultBranch = 0, onBranchChange, className, ...props }: MessageBranchProps) => {\n const [currentBranch, setCurrentBranch] = useState(defaultBranch);\n const [branches, setBranches] = useState<ReactElement[]>([]);\n\n const handleBranchChange = useCallback(\n (newBranch: number) => {\n setCurrentBranch(newBranch);\n onBranchChange?.(newBranch);\n },\n [onBranchChange]\n );\n\n const goToPrevious = useCallback(() => {\n const newBranch = currentBranch > 0 ? currentBranch - 1 : branches.length - 1;\n handleBranchChange(newBranch);\n }, [currentBranch, branches.length, handleBranchChange]);\n\n const goToNext = useCallback(() => {\n const newBranch = currentBranch < branches.length - 1 ? currentBranch + 1 : 0;\n handleBranchChange(newBranch);\n }, [currentBranch, branches.length, handleBranchChange]);\n\n const contextValue = useMemo<MessageBranchContextType>(\n () => ({\n branches,\n currentBranch,\n goToNext,\n goToPrevious,\n setBranches,\n totalBranches: branches.length,\n }),\n [branches, currentBranch, goToNext, goToPrevious]\n );\n\n return (\n <MessageBranchContext.Provider value={contextValue}>\n <div className={cn('fk:grid fk:w-full fk:gap-2 fk:[&>div]:pb-0', className)} {...props} />\n </MessageBranchContext.Provider>\n );\n};\n\nexport type MessageBranchContentProps = HTMLAttributes<HTMLDivElement>;\n\nexport const MessageBranchContent = ({ children, ...props }: MessageBranchContentProps) => {\n const { currentBranch, setBranches, branches } = useMessageBranch();\n const childrenArray = useMemo(() => (Array.isArray(children) ? children : [children]), [children]);\n\n // Use useEffect to update branches when they change\n useEffect(() => {\n if (branches.length !== childrenArray.length) {\n setBranches(childrenArray);\n }\n }, [childrenArray, branches, setBranches]);\n\n return childrenArray.map((branch, index) => (\n <div\n className={cn(\n 'fk:grid fk:gap-2 fk:overflow-hidden fk:[&>div]:pb-0',\n index === currentBranch ? 'fk:block' : 'fk:hidden'\n )}\n key={branch.key}\n {...props}\n >\n {branch}\n </div>\n ));\n};\n\nexport type MessageBranchSelectorProps = ComponentProps<typeof ButtonGroup>;\n\nexport const MessageBranchSelector = ({ className, ...props }: MessageBranchSelectorProps) => {\n const { totalBranches } = useMessageBranch();\n\n // Don't render if there's only one branch\n if (totalBranches <= 1) {\n return null;\n }\n\n return (\n <ButtonGroup\n className={cn('fk:[&>*:not(:first-child)]:rounded-l-md fk:[&>*:not(:last-child)]:rounded-r-md', className)}\n orientation=\"horizontal\"\n {...props}\n />\n );\n};\n\nexport type MessageBranchPreviousProps = ComponentProps<typeof Button>;\n\nexport const MessageBranchPrevious = ({ children, ...props }: MessageBranchPreviousProps) => {\n const { goToPrevious, totalBranches } = useMessageBranch();\n\n return (\n <Button\n aria-label=\"Previous branch\"\n disabled={totalBranches <= 1}\n onClick={goToPrevious}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n {...props}\n >\n {children ?? <ChevronLeftIcon size={14} />}\n </Button>\n );\n};\n\nexport type MessageBranchNextProps = ComponentProps<typeof Button>;\n\nexport const MessageBranchNext = ({ children, ...props }: MessageBranchNextProps) => {\n const { goToNext, totalBranches } = useMessageBranch();\n\n return (\n <Button\n aria-label=\"Next branch\"\n disabled={totalBranches <= 1}\n onClick={goToNext}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n {...props}\n >\n {children ?? <ChevronRightIcon size={14} />}\n </Button>\n );\n};\n\nexport type MessageBranchPageProps = HTMLAttributes<HTMLSpanElement>;\n\nexport const MessageBranchPage = ({ className, ...props }: MessageBranchPageProps) => {\n const { currentBranch, totalBranches } = useMessageBranch();\n\n return (\n <ButtonGroupText\n className={cn('fk:border-none fk:bg-transparent fk:text-muted-foreground fk:shadow-none', className)}\n {...props}\n >\n {currentBranch + 1} of {totalBranches}\n </ButtonGroupText>\n );\n};\n\nexport type MessageResponseProps = ComponentProps<typeof Streamdown>;\n\nconst streamdownPlugins = { cjk, code, math, mermaid };\n\nexport const MessageResponse = memo(\n ({ className, ...props }: MessageResponseProps) => (\n <Streamdown\n className={cn('fk:size-full fk:[&>*:first-child]:mt-0 fk:[&>*:last-child]:mb-0', className)}\n plugins={streamdownPlugins}\n prefix=\"fk\"\n {...props}\n />\n ),\n (prevProps, nextProps) => prevProps.children === nextProps.children && nextProps.isAnimating === prevProps.isAnimating\n);\n\nMessageResponse.displayName = 'MessageResponse';\n\nexport type MessageToolbarProps = ComponentProps<'div'>;\n\nexport const MessageToolbar = ({ className, children, ...props }: MessageToolbarProps) => (\n <div className={cn('fk:mt-4 fk:flex fk:w-full fk:items-center fk:justify-between fk:gap-4', className)} {...props}>\n {children}\n </div>\n);\n","import {\n Command,\n CommandDialog,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n CommandShortcut,\n} from '../primitives/command';\nimport { Dialog, DialogContent, DialogTitle, DialogTrigger } from '../primitives/dialog';\nimport { cn } from '../lib/utils';\nimport type { ComponentProps, ReactNode } from 'react';\n\nexport type ModelSelectorProps = ComponentProps<typeof Dialog>;\n\nexport const ModelSelector = (props: ModelSelectorProps) => <Dialog {...props} />;\n\nexport type ModelSelectorTriggerProps = ComponentProps<typeof DialogTrigger>;\n\nexport const ModelSelectorTrigger = (props: ModelSelectorTriggerProps) => <DialogTrigger {...props} />;\n\nexport type ModelSelectorContentProps = ComponentProps<typeof DialogContent> & {\n title?: ReactNode;\n};\n\nexport const ModelSelectorContent = ({\n className,\n children,\n title = 'Model Selector',\n ...props\n}: ModelSelectorContentProps) => (\n <DialogContent\n aria-describedby={undefined}\n className={cn('fk:outline! fk:border-none! fk:p-0 fk:outline-border! fk:outline-solid!', className)}\n {...props}\n >\n <DialogTitle className=\"fk:sr-only\">{title}</DialogTitle>\n <Command className=\"fk:**:data-[slot=command-input-wrapper]:h-auto\">{children}</Command>\n </DialogContent>\n);\n\nexport type ModelSelectorDialogProps = ComponentProps<typeof CommandDialog>;\n\nexport const ModelSelectorDialog = (props: ModelSelectorDialogProps) => <CommandDialog {...props} />;\n\nexport type ModelSelectorInputProps = ComponentProps<typeof CommandInput>;\n\nexport const ModelSelectorInput = ({ className, ...props }: ModelSelectorInputProps) => (\n <CommandInput className={cn('fk:h-auto fk:py-3.5', className)} {...props} />\n);\n\nexport type ModelSelectorListProps = ComponentProps<typeof CommandList>;\n\nexport const ModelSelectorList = (props: ModelSelectorListProps) => <CommandList {...props} />;\n\nexport type ModelSelectorEmptyProps = ComponentProps<typeof CommandEmpty>;\n\nexport const ModelSelectorEmpty = (props: ModelSelectorEmptyProps) => <CommandEmpty {...props} />;\n\nexport type ModelSelectorGroupProps = ComponentProps<typeof CommandGroup>;\n\nexport const ModelSelectorGroup = (props: ModelSelectorGroupProps) => <CommandGroup {...props} />;\n\nexport type ModelSelectorItemProps = ComponentProps<typeof CommandItem>;\n\nexport const ModelSelectorItem = (props: ModelSelectorItemProps) => <CommandItem {...props} />;\n\nexport type ModelSelectorShortcutProps = ComponentProps<typeof CommandShortcut>;\n\nexport const ModelSelectorShortcut = (props: ModelSelectorShortcutProps) => <CommandShortcut {...props} />;\n\nexport type ModelSelectorSeparatorProps = ComponentProps<typeof CommandSeparator>;\n\nexport const ModelSelectorSeparator = (props: ModelSelectorSeparatorProps) => <CommandSeparator {...props} />;\n\nexport type ModelSelectorLogoProps = Omit<ComponentProps<'img'>, 'src' | 'alt'> & {\n provider:\n | 'moonshotai-cn'\n | 'lucidquery'\n | 'moonshotai'\n | 'zai-coding-plan'\n | 'alibaba'\n | 'xai'\n | 'vultr'\n | 'nvidia'\n | 'upstage'\n | 'groq'\n | 'github-copilot'\n | 'mistral'\n | 'vercel'\n | 'nebius'\n | 'deepseek'\n | 'alibaba-cn'\n | 'google-vertex-anthropic'\n | 'venice'\n | 'chutes'\n | 'cortecs'\n | 'github-models'\n | 'togetherai'\n | 'azure'\n | 'baseten'\n | 'huggingface'\n | 'opencode'\n | 'fastrouter'\n | 'google'\n | 'google-vertex'\n | 'cloudflare-workers-ai'\n | 'inception'\n | 'wandb'\n | 'openai'\n | 'zhipuai-coding-plan'\n | 'perplexity'\n | 'openrouter'\n | 'zenmux'\n | 'v0'\n | 'iflowcn'\n | 'synthetic'\n | 'deepinfra'\n | 'zhipuai'\n | 'submodel'\n | 'zai'\n | 'inference'\n | 'requesty'\n | 'morph'\n | 'lmstudio'\n | 'anthropic'\n | 'aihubmix'\n | 'fireworks-ai'\n | 'modelscope'\n | 'llama'\n | 'scaleway'\n | 'amazon-bedrock'\n | 'cerebras'\n // oxlint-disable-next-line typescript-eslint(ban-types) -- intentional pattern for autocomplete-friendly string union\n | (string & {});\n};\n\nexport const ModelSelectorLogo = ({ provider, className, ...props }: ModelSelectorLogoProps) => (\n <img\n {...props}\n alt={`${provider} logo`}\n className={cn('fk:size-3 fk:dark:invert', className)}\n height={12}\n src={`https://models.dev/logos/${provider}.svg`}\n width={12}\n />\n);\n\nexport type ModelSelectorLogoGroupProps = ComponentProps<'div'>;\n\nexport const ModelSelectorLogoGroup = ({ className, ...props }: ModelSelectorLogoGroupProps) => (\n <div\n className={cn(\n 'fk:flex fk:shrink-0 fk:items-center fk:-space-x-1 fk:[&>img]:rounded-full fk:[&>img]:bg-background fk:[&>img]:p-px fk:[&>img]:ring-1 fk:dark:[&>img]:bg-foreground',\n className\n )}\n {...props}\n />\n);\n\nexport type ModelSelectorNameProps = ComponentProps<'span'>;\n\nexport const ModelSelectorName = ({ className, ...props }: ModelSelectorNameProps) => (\n <span className={cn('fk:flex-1 fk:truncate fk:text-left', className)} {...props} />\n);\n","'use client';\n\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n} from '../primitives/command';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '../primitives/dropdown-menu';\nimport { HoverCard, HoverCardContent, HoverCardTrigger } from '../primitives/hover-card';\nimport { InputGroup, InputGroupAddon, InputGroupButton, InputGroupTextarea } from '../primitives/input-group';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../primitives/select';\nimport { Spinner } from '../primitives/spinner';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../primitives/tooltip';\nimport { cn } from '../lib/utils';\nimport type { ChatStatus, FileUIPart, SourceDocumentUIPart } from 'ai';\nimport { CornerDownLeftIcon, ImageIcon, Monitor, PlusIcon, SquareIcon, XIcon } from 'lucide-react';\nimport { nanoid } from 'nanoid';\nimport type {\n ChangeEvent,\n ChangeEventHandler,\n ClipboardEventHandler,\n ComponentProps,\n FormEvent,\n FormEventHandler,\n HTMLAttributes,\n KeyboardEventHandler,\n PropsWithChildren,\n ReactNode,\n RefObject,\n} from 'react';\nimport { Children, createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nconst convertBlobUrlToDataUrl = async (url: string): Promise<string | null> => {\n try {\n const response = await fetch(url);\n const blob = await response.blob();\n // FileReader uses callback-based API, wrapping in Promise is necessary\n // oxlint-disable-next-line eslint-plugin-promise(avoid-new)\n return new Promise((resolve) => {\n const reader = new FileReader();\n // oxlint-disable-next-line eslint-plugin-unicorn(prefer-add-event-listener)\n reader.onloadend = () => resolve(reader.result as string);\n // oxlint-disable-next-line eslint-plugin-unicorn(prefer-add-event-listener)\n reader.onerror = () => resolve(null);\n reader.readAsDataURL(blob);\n });\n } catch {\n return null;\n }\n};\n\nconst captureScreenshot = async (): Promise<File | null> => {\n if (typeof navigator === 'undefined' || !navigator.mediaDevices?.getDisplayMedia) {\n return null;\n }\n\n let stream: MediaStream | null = null;\n const video = document.createElement('video');\n video.muted = true;\n video.playsInline = true;\n\n try {\n stream = await navigator.mediaDevices.getDisplayMedia({\n audio: false,\n video: true,\n });\n\n video.srcObject = stream;\n\n // Video element uses callback-based API, wrapping in Promise is necessary\n // oxlint-disable-next-line eslint-plugin-promise(avoid-new)\n await new Promise<void>((resolve, reject) => {\n // oxlint-disable-next-line eslint-plugin-unicorn(prefer-add-event-listener)\n video.onloadedmetadata = () => resolve();\n // oxlint-disable-next-line eslint-plugin-unicorn(prefer-add-event-listener)\n video.onerror = () => reject(new Error('Failed to load screen stream'));\n });\n\n await video.play();\n\n const width = video.videoWidth;\n const height = video.videoHeight;\n if (!width || !height) {\n return null;\n }\n\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const context = canvas.getContext('2d');\n if (!context) {\n return null;\n }\n\n context.drawImage(video, 0, 0, width, height);\n // canvas.toBlob uses callback-based API, wrapping in Promise is necessary\n // oxlint-disable-next-line eslint-plugin-promise(avoid-new)\n const blob = await new Promise<Blob | null>((resolve) => {\n canvas.toBlob(resolve, 'image/png');\n });\n if (!blob) {\n return null;\n }\n\n const timestamp = new Date().toISOString().replaceAll(/[:.]/g, '-').replace('T', '_').replace('Z', '');\n\n return new File([blob], `screenshot-${timestamp}.png`, {\n lastModified: Date.now(),\n type: 'image/png',\n });\n } finally {\n if (stream) {\n for (const track of stream.getTracks()) {\n track.stop();\n }\n }\n video.pause();\n video.srcObject = null;\n }\n};\n\n// ============================================================================\n// Provider Context & Types\n// ============================================================================\n\nexport interface AttachmentsContext {\n files: (FileUIPart & { id: string })[];\n add: (files: File[] | FileList) => void;\n remove: (id: string) => void;\n clear: () => void;\n openFileDialog: () => void;\n fileInputRef: RefObject<HTMLInputElement | null>;\n}\n\nexport interface TextInputContext {\n value: string;\n setInput: (v: string) => void;\n clear: () => void;\n}\n\nexport interface PromptInputControllerProps {\n textInput: TextInputContext;\n attachments: AttachmentsContext;\n /** INTERNAL: Allows PromptInput to register its file textInput + \"open\" callback */\n __registerFileInput: (ref: RefObject<HTMLInputElement | null>, open: () => void) => void;\n}\n\nconst PromptInputController = createContext<PromptInputControllerProps | null>(null);\nconst ProviderAttachmentsContext = createContext<AttachmentsContext | null>(null);\n\nexport const usePromptInputController = () => {\n const ctx = useContext(PromptInputController);\n if (!ctx) {\n throw new Error('Wrap your component inside <PromptInputProvider> to use usePromptInputController().');\n }\n return ctx;\n};\n\n// Optional variants (do NOT throw). Useful for dual-mode components.\nconst useOptionalPromptInputController = () => useContext(PromptInputController);\n\nexport const useProviderAttachments = () => {\n const ctx = useContext(ProviderAttachmentsContext);\n if (!ctx) {\n throw new Error('Wrap your component inside <PromptInputProvider> to use useProviderAttachments().');\n }\n return ctx;\n};\n\nconst useOptionalProviderAttachments = () => useContext(ProviderAttachmentsContext);\n\nexport type PromptInputProviderProps = PropsWithChildren<{\n initialInput?: string;\n}>;\n\n/**\n * Optional global provider that lifts PromptInput state outside of PromptInput.\n * If you don't use it, PromptInput stays fully self-managed.\n */\nexport const PromptInputProvider = ({ initialInput: initialTextInput = '', children }: PromptInputProviderProps) => {\n // ----- textInput state\n const [textInput, setTextInput] = useState(initialTextInput);\n const clearInput = useCallback(() => setTextInput(''), []);\n\n // ----- attachments state (global when wrapped)\n const [attachmentFiles, setAttachmentFiles] = useState<(FileUIPart & { id: string })[]>([]);\n const fileInputRef = useRef<HTMLInputElement | null>(null);\n // oxlint-disable-next-line eslint(no-empty-function)\n const openRef = useRef<() => void>(() => {});\n\n const add = useCallback((files: File[] | FileList) => {\n const incoming = Array.from(files);\n\n if (incoming.length === 0) {\n return;\n }\n\n setAttachmentFiles((prev) => [\n ...prev,\n ...incoming.map((file) => ({\n filename: file.name,\n id: nanoid(),\n mediaType: file.type,\n type: 'file' as const,\n url: URL.createObjectURL(file),\n })),\n ]);\n }, []);\n\n const remove = useCallback((id: string) => {\n setAttachmentFiles((prev) => {\n const found = prev.find((f) => f.id === id);\n if (found?.url) {\n URL.revokeObjectURL(found.url);\n }\n return prev.filter((f) => f.id !== id);\n });\n }, []);\n\n const clear = useCallback(() => {\n setAttachmentFiles((prev) => {\n for (const f of prev) {\n if (f.url) {\n URL.revokeObjectURL(f.url);\n }\n }\n return [];\n });\n }, []);\n\n // Keep a ref to attachments for cleanup on unmount (avoids stale closure)\n const attachmentsRef = useRef(attachmentFiles);\n\n useEffect(() => {\n attachmentsRef.current = attachmentFiles;\n }, [attachmentFiles]);\n\n // Cleanup blob URLs on unmount to prevent memory leaks\n useEffect(\n () => () => {\n for (const f of attachmentsRef.current) {\n if (f.url) {\n URL.revokeObjectURL(f.url);\n }\n }\n },\n []\n );\n\n const openFileDialog = useCallback(() => {\n openRef.current?.();\n }, []);\n\n const attachments = useMemo<AttachmentsContext>(\n () => ({\n add,\n clear,\n fileInputRef,\n files: attachmentFiles,\n openFileDialog,\n remove,\n }),\n [attachmentFiles, add, remove, clear, openFileDialog]\n );\n\n const __registerFileInput = useCallback((ref: RefObject<HTMLInputElement | null>, open: () => void) => {\n fileInputRef.current = ref.current;\n openRef.current = open;\n }, []);\n\n const controller = useMemo<PromptInputControllerProps>(\n () => ({\n __registerFileInput,\n attachments,\n textInput: {\n clear: clearInput,\n setInput: setTextInput,\n value: textInput,\n },\n }),\n [textInput, clearInput, attachments, __registerFileInput]\n );\n\n return (\n <PromptInputController.Provider value={controller}>\n <ProviderAttachmentsContext.Provider value={attachments}>{children}</ProviderAttachmentsContext.Provider>\n </PromptInputController.Provider>\n );\n};\n\n// ============================================================================\n// Component Context & Hooks\n// ============================================================================\n\nconst LocalAttachmentsContext = createContext<AttachmentsContext | null>(null);\n\nexport const usePromptInputAttachments = () => {\n // Prefer local context (inside PromptInput) as it has validation, fall back to provider\n const provider = useOptionalProviderAttachments();\n const local = useContext(LocalAttachmentsContext);\n const context = local ?? provider;\n if (!context) {\n throw new Error('usePromptInputAttachments must be used within a PromptInput or PromptInputProvider');\n }\n return context;\n};\n\n// ============================================================================\n// Referenced Sources (Local to PromptInput)\n// ============================================================================\n\nexport interface ReferencedSourcesContext {\n sources: (SourceDocumentUIPart & { id: string })[];\n add: (sources: SourceDocumentUIPart[] | SourceDocumentUIPart) => void;\n remove: (id: string) => void;\n clear: () => void;\n}\n\nexport const LocalReferencedSourcesContext = createContext<ReferencedSourcesContext | null>(null);\n\nexport const usePromptInputReferencedSources = () => {\n const ctx = useContext(LocalReferencedSourcesContext);\n if (!ctx) {\n throw new Error('usePromptInputReferencedSources must be used within a LocalReferencedSourcesContext.Provider');\n }\n return ctx;\n};\n\nexport type PromptInputActionAddAttachmentsProps = ComponentProps<typeof DropdownMenuItem> & {\n label?: string;\n};\n\nexport const PromptInputActionAddAttachments = ({\n label = 'Add photos or files',\n onSelect,\n ...props\n}: PromptInputActionAddAttachmentsProps) => {\n const attachments = usePromptInputAttachments();\n\n const handleSelect = useCallback(\n (event: Event) => {\n onSelect?.(event);\n if (event.defaultPrevented) {\n return;\n }\n\n // Not calling preventDefault lets the menu close; the file dialog still\n // opens because input.click() runs within the same user gesture.\n attachments.openFileDialog();\n },\n [attachments, onSelect]\n );\n\n return (\n <DropdownMenuItem {...props} onSelect={handleSelect}>\n <ImageIcon className=\"fk:mr-2 fk:size-4\" /> {label}\n </DropdownMenuItem>\n );\n};\n\nexport type PromptInputActionAddScreenshotProps = ComponentProps<typeof DropdownMenuItem> & {\n label?: string;\n};\n\nexport const PromptInputActionAddScreenshot = ({\n label = 'Take screenshot',\n onSelect,\n ...props\n}: PromptInputActionAddScreenshotProps) => {\n const attachments = usePromptInputAttachments();\n\n const handleSelect = useCallback(\n async (event: Event) => {\n onSelect?.(event);\n if (event.defaultPrevented) {\n return;\n }\n\n try {\n const screenshot = await captureScreenshot();\n if (screenshot) {\n attachments.add([screenshot]);\n }\n } catch (error) {\n if (error instanceof DOMException && (error.name === 'NotAllowedError' || error.name === 'AbortError')) {\n return;\n }\n throw error;\n }\n },\n [onSelect, attachments]\n );\n\n return (\n <DropdownMenuItem {...props} onSelect={handleSelect}>\n <Monitor className=\"fk:mr-2 fk:size-4\" />\n {label}\n </DropdownMenuItem>\n );\n};\n\nexport interface PromptInputMessage {\n text: string;\n files: FileUIPart[];\n}\n\nexport type PromptInputProps = Omit<HTMLAttributes<HTMLFormElement>, 'onSubmit' | 'onError'> & {\n // e.g., \"image/*\" or leave undefined for any\n accept?: string;\n multiple?: boolean;\n // When true, accepts drops anywhere on document. Default false (opt-in).\n globalDrop?: boolean;\n // Render a hidden input with given name and keep it in sync for native form posts. Default false.\n syncHiddenInput?: boolean;\n // Minimal constraints\n maxFiles?: number;\n // bytes\n maxFileSize?: number;\n onError?: (err: { code: 'max_files' | 'max_file_size' | 'accept'; message: string }) => void;\n onSubmit: (message: PromptInputMessage, event: FormEvent<HTMLFormElement>) => void | Promise<void>;\n};\n\nexport const PromptInput = ({\n className,\n accept,\n multiple,\n globalDrop,\n syncHiddenInput,\n maxFiles,\n maxFileSize,\n onError,\n onSubmit,\n children,\n ...props\n}: PromptInputProps) => {\n // Try to use a provider controller if present\n const controller = useOptionalPromptInputController();\n const usingProvider = !!controller;\n\n // Refs\n const inputRef = useRef<HTMLInputElement | null>(null);\n const formRef = useRef<HTMLFormElement | null>(null);\n\n // ----- Local attachments (only used when no provider)\n const [items, setItems] = useState<(FileUIPart & { id: string })[]>([]);\n const files = usingProvider ? controller.attachments.files : items;\n\n // ----- Local referenced sources (always local to PromptInput)\n const [referencedSources, setReferencedSources] = useState<(SourceDocumentUIPart & { id: string })[]>([]);\n\n // Keep a ref to files for cleanup on unmount (avoids stale closure)\n const filesRef = useRef(files);\n\n useEffect(() => {\n filesRef.current = files;\n }, [files]);\n\n const openFileDialogLocal = useCallback(() => {\n inputRef.current?.click();\n }, []);\n\n const matchesAccept = useCallback(\n (f: File) => {\n if (!accept || accept.trim() === '') {\n return true;\n }\n\n const patterns = accept\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n\n return patterns.some((pattern) => {\n if (pattern.startsWith('.')) {\n // e.g: .csv — match on the filename like the native accept attribute,\n // since browsers report inconsistent media types for many extensions\n return f.name.toLowerCase().endsWith(pattern.toLowerCase());\n }\n if (pattern.endsWith('/*')) {\n // e.g: image/* -> image/\n const prefix = pattern.slice(0, -1);\n return f.type.startsWith(prefix);\n }\n return f.type === pattern;\n });\n },\n [accept]\n );\n\n const addLocal = useCallback(\n (fileList: File[] | FileList) => {\n const incoming = Array.from(fileList);\n const accepted = incoming.filter((f) => matchesAccept(f));\n if (incoming.length && accepted.length === 0) {\n onError?.({\n code: 'accept',\n message: 'No files match the accepted types.',\n });\n return;\n }\n const withinSize = (f: File) => (maxFileSize ? f.size <= maxFileSize : true);\n const sized = accepted.filter(withinSize);\n if (accepted.length > 0 && sized.length === 0) {\n onError?.({\n code: 'max_file_size',\n message: 'All files exceed the maximum size.',\n });\n return;\n }\n\n setItems((prev) => {\n const capacity = typeof maxFiles === 'number' ? Math.max(0, maxFiles - prev.length) : undefined;\n const capped = typeof capacity === 'number' ? sized.slice(0, capacity) : sized;\n if (typeof capacity === 'number' && sized.length > capacity) {\n onError?.({\n code: 'max_files',\n message: 'Too many files. Some were not added.',\n });\n }\n const next: (FileUIPart & { id: string })[] = [];\n for (const file of capped) {\n next.push({\n filename: file.name,\n id: nanoid(),\n mediaType: file.type,\n type: 'file',\n url: URL.createObjectURL(file),\n });\n }\n return [...prev, ...next];\n });\n },\n [matchesAccept, maxFiles, maxFileSize, onError]\n );\n\n const removeLocal = useCallback(\n (id: string) =>\n setItems((prev) => {\n const found = prev.find((file) => file.id === id);\n if (found?.url) {\n URL.revokeObjectURL(found.url);\n }\n return prev.filter((file) => file.id !== id);\n }),\n []\n );\n\n // Wrapper that validates files before calling provider's add\n const addWithProviderValidation = useCallback(\n (fileList: File[] | FileList) => {\n const incoming = Array.from(fileList);\n const accepted = incoming.filter((f) => matchesAccept(f));\n if (incoming.length && accepted.length === 0) {\n onError?.({\n code: 'accept',\n message: 'No files match the accepted types.',\n });\n return;\n }\n const withinSize = (f: File) => (maxFileSize ? f.size <= maxFileSize : true);\n const sized = accepted.filter(withinSize);\n if (accepted.length > 0 && sized.length === 0) {\n onError?.({\n code: 'max_file_size',\n message: 'All files exceed the maximum size.',\n });\n return;\n }\n\n const currentCount = files.length;\n const capacity = typeof maxFiles === 'number' ? Math.max(0, maxFiles - currentCount) : undefined;\n const capped = typeof capacity === 'number' ? sized.slice(0, capacity) : sized;\n if (typeof capacity === 'number' && sized.length > capacity) {\n onError?.({\n code: 'max_files',\n message: 'Too many files. Some were not added.',\n });\n }\n\n if (capped.length > 0) {\n controller?.attachments.add(capped);\n }\n },\n [matchesAccept, maxFileSize, maxFiles, onError, files.length, controller]\n );\n\n const clearAttachments = useCallback(\n () =>\n usingProvider\n ? controller?.attachments.clear()\n : setItems((prev) => {\n for (const file of prev) {\n if (file.url) {\n URL.revokeObjectURL(file.url);\n }\n }\n return [];\n }),\n [usingProvider, controller]\n );\n\n const clearReferencedSources = useCallback(() => setReferencedSources([]), []);\n\n const add = usingProvider ? addWithProviderValidation : addLocal;\n const remove = usingProvider ? controller.attachments.remove : removeLocal;\n const openFileDialog = usingProvider ? controller.attachments.openFileDialog : openFileDialogLocal;\n\n const clear = useCallback(() => {\n clearAttachments();\n clearReferencedSources();\n }, [clearAttachments, clearReferencedSources]);\n\n // Let provider know about our hidden file input so external menus can call openFileDialog()\n useEffect(() => {\n if (!usingProvider) {\n return;\n }\n controller.__registerFileInput(inputRef, () => inputRef.current?.click());\n }, [usingProvider, controller]);\n\n // Note: File input cannot be programmatically set for security reasons\n // The syncHiddenInput prop is no longer functional\n useEffect(() => {\n if (syncHiddenInput && inputRef.current && files.length === 0) {\n inputRef.current.value = '';\n }\n }, [files, syncHiddenInput]);\n\n // Attach drop handlers on nearest form and document (opt-in)\n useEffect(() => {\n const form = formRef.current;\n if (!form) {\n return;\n }\n if (globalDrop) {\n // when global drop is on, let the document-level handler own drops\n return;\n }\n\n const onDragOver = (e: DragEvent) => {\n if (e.dataTransfer?.types?.includes('Files')) {\n e.preventDefault();\n }\n };\n const onDrop = (e: DragEvent) => {\n if (e.dataTransfer?.types?.includes('Files')) {\n e.preventDefault();\n }\n if (e.dataTransfer?.files && e.dataTransfer.files.length > 0) {\n add(e.dataTransfer.files);\n }\n };\n form.addEventListener('dragover', onDragOver);\n form.addEventListener('drop', onDrop);\n return () => {\n form.removeEventListener('dragover', onDragOver);\n form.removeEventListener('drop', onDrop);\n };\n }, [add, globalDrop]);\n\n useEffect(() => {\n if (!globalDrop) {\n return;\n }\n\n const onDragOver = (e: DragEvent) => {\n if (e.dataTransfer?.types?.includes('Files')) {\n e.preventDefault();\n }\n };\n const onDrop = (e: DragEvent) => {\n if (e.dataTransfer?.types?.includes('Files')) {\n e.preventDefault();\n }\n if (e.dataTransfer?.files && e.dataTransfer.files.length > 0) {\n add(e.dataTransfer.files);\n }\n };\n document.addEventListener('dragover', onDragOver);\n document.addEventListener('drop', onDrop);\n return () => {\n document.removeEventListener('dragover', onDragOver);\n document.removeEventListener('drop', onDrop);\n };\n }, [add, globalDrop]);\n\n useEffect(\n () => () => {\n if (!usingProvider) {\n for (const f of filesRef.current) {\n if (f.url) {\n URL.revokeObjectURL(f.url);\n }\n }\n }\n },\n [usingProvider]\n );\n\n const handleChange: ChangeEventHandler<HTMLInputElement> = useCallback(\n (event) => {\n if (event.currentTarget.files) {\n add(event.currentTarget.files);\n }\n // Reset input value to allow selecting files that were previously removed\n event.currentTarget.value = '';\n },\n [add]\n );\n\n const attachmentsCtx = useMemo<AttachmentsContext>(\n () => ({\n add,\n clear: clearAttachments,\n fileInputRef: inputRef,\n files: files.map((item) => ({ ...item, id: item.id })),\n openFileDialog,\n remove,\n }),\n [files, add, remove, clearAttachments, openFileDialog]\n );\n\n const refsCtx = useMemo<ReferencedSourcesContext>(\n () => ({\n add: (incoming: SourceDocumentUIPart[] | SourceDocumentUIPart) => {\n const array = Array.isArray(incoming) ? incoming : [incoming];\n setReferencedSources((prev) => [...prev, ...array.map((s) => ({ ...s, id: nanoid() }))]);\n },\n clear: clearReferencedSources,\n remove: (id: string) => {\n setReferencedSources((prev) => prev.filter((s) => s.id !== id));\n },\n sources: referencedSources,\n }),\n [referencedSources, clearReferencedSources]\n );\n\n const handleSubmit: FormEventHandler<HTMLFormElement> = useCallback(\n async (event) => {\n event.preventDefault();\n\n const form = event.currentTarget;\n const text = usingProvider\n ? controller.textInput.value\n : (() => {\n const formData = new FormData(form);\n return (formData.get('message') as string) || '';\n })();\n\n // Reset form immediately after capturing text to avoid race condition\n // where user input during async blob conversion would be lost\n if (!usingProvider) {\n form.reset();\n }\n\n try {\n // Convert blob URLs to data URLs asynchronously\n const convertedFiles: FileUIPart[] = await Promise.all(\n files.map(async ({ id: _id, ...item }) => {\n if (item.url?.startsWith('blob:')) {\n const dataUrl = await convertBlobUrlToDataUrl(item.url);\n // If conversion failed, keep the original blob URL\n return {\n ...item,\n url: dataUrl ?? item.url,\n };\n }\n return item;\n })\n );\n\n const result = onSubmit({ files: convertedFiles, text }, event);\n\n // Handle both sync and async onSubmit\n if (result instanceof Promise) {\n try {\n await result;\n clear();\n if (usingProvider) {\n controller.textInput.clear();\n }\n } catch {\n // Don't clear on error - user may want to retry\n }\n } else {\n // Sync function completed without throwing, clear inputs\n clear();\n if (usingProvider) {\n controller.textInput.clear();\n }\n }\n } catch {\n // Don't clear on error - user may want to retry\n }\n },\n [usingProvider, controller, files, onSubmit, clear]\n );\n\n // Render with or without local provider\n const inner = (\n <>\n <input\n accept={accept}\n aria-label=\"Upload files\"\n className=\"fk:hidden\"\n multiple={multiple}\n onChange={handleChange}\n ref={inputRef}\n title=\"Upload files\"\n type=\"file\"\n />\n <form className={cn('fk:w-full', className)} onSubmit={handleSubmit} ref={formRef} {...props}>\n <InputGroup className=\"fk:overflow-hidden\">{children}</InputGroup>\n </form>\n </>\n );\n\n const withReferencedSources = (\n <LocalReferencedSourcesContext.Provider value={refsCtx}>{inner}</LocalReferencedSourcesContext.Provider>\n );\n\n // Always provide LocalAttachmentsContext so children get validated add function\n return (\n <LocalAttachmentsContext.Provider value={attachmentsCtx}>{withReferencedSources}</LocalAttachmentsContext.Provider>\n );\n};\n\nexport type PromptInputBodyProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputBody = ({ className, ...props }: PromptInputBodyProps) => (\n <div className={cn('fk:contents', className)} {...props} />\n);\n\nexport type PromptInputTextareaProps = ComponentProps<typeof InputGroupTextarea>;\n\nexport const PromptInputTextarea = ({\n onChange,\n onKeyDown,\n className,\n placeholder = 'What would you like to know?',\n ...props\n}: PromptInputTextareaProps) => {\n const controller = useOptionalPromptInputController();\n const attachments = usePromptInputAttachments();\n const [isComposing, setIsComposing] = useState(false);\n\n const handleKeyDown: KeyboardEventHandler<HTMLTextAreaElement> = useCallback(\n (e) => {\n // Call the external onKeyDown handler first\n onKeyDown?.(e);\n\n // If the external handler prevented default, don't run internal logic\n if (e.defaultPrevented) {\n return;\n }\n\n if (e.key === 'Enter') {\n if (isComposing || e.nativeEvent.isComposing) {\n return;\n }\n if (e.shiftKey) {\n return;\n }\n e.preventDefault();\n\n // Check if the submit button is disabled before submitting\n const { form } = e.currentTarget;\n const submitButton = form?.querySelector('button[type=\"submit\"]') as HTMLButtonElement | null;\n if (submitButton?.disabled) {\n return;\n }\n\n form?.requestSubmit();\n }\n\n // Remove last attachment when Backspace is pressed and textarea is empty\n if (e.key === 'Backspace' && e.currentTarget.value === '' && attachments.files.length > 0) {\n e.preventDefault();\n const lastAttachment = attachments.files[attachments.files.length - 1];\n\n if (lastAttachment) {\n attachments.remove(lastAttachment.id);\n }\n }\n },\n [onKeyDown, isComposing, attachments]\n );\n\n const handlePaste: ClipboardEventHandler<HTMLTextAreaElement> = useCallback(\n (event) => {\n const items = event.clipboardData?.items;\n\n if (!items) {\n return;\n }\n\n const files: File[] = [];\n\n for (const item of Array.from(items)) {\n if (item.kind === 'file') {\n const file = item.getAsFile();\n\n if (file) {\n files.push(file);\n }\n }\n }\n\n if (files.length > 0) {\n event.preventDefault();\n attachments.add(files);\n }\n },\n [attachments]\n );\n\n const handleCompositionEnd = useCallback(() => setIsComposing(false), []);\n const handleCompositionStart = useCallback(() => setIsComposing(true), []);\n\n const controlledProps = controller\n ? {\n onChange: (e: ChangeEvent<HTMLTextAreaElement>) => {\n controller.textInput.setInput(e.currentTarget.value);\n onChange?.(e);\n },\n value: controller.textInput.value,\n }\n : {\n onChange,\n };\n\n return (\n <InputGroupTextarea\n className={cn('fk:field-sizing-content fk:max-h-48 fk:min-h-16', className)}\n name=\"message\"\n onCompositionEnd={handleCompositionEnd}\n onCompositionStart={handleCompositionStart}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n placeholder={placeholder}\n {...props}\n {...controlledProps}\n />\n );\n};\n\nexport type PromptInputHeaderProps = Omit<ComponentProps<typeof InputGroupAddon>, 'align'>;\n\nexport const PromptInputHeader = ({ className, ...props }: PromptInputHeaderProps) => (\n <InputGroupAddon align=\"block-end\" className={cn('fk:order-first fk:flex-wrap fk:gap-1', className)} {...props} />\n);\n\nexport type PromptInputFooterProps = Omit<ComponentProps<typeof InputGroupAddon>, 'align'>;\n\nexport const PromptInputFooter = ({ className, ...props }: PromptInputFooterProps) => (\n <InputGroupAddon align=\"block-end\" className={cn('fk:justify-between fk:gap-1', className)} {...props} />\n);\n\nexport type PromptInputToolsProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTools = ({ className, ...props }: PromptInputToolsProps) => (\n <div className={cn('fk:flex fk:min-w-0 fk:items-center fk:gap-1', className)} {...props} />\n);\n\nexport type PromptInputButtonTooltip =\n | string\n | {\n content: ReactNode;\n shortcut?: string;\n side?: ComponentProps<typeof TooltipContent>['side'];\n };\n\nexport type PromptInputButtonProps = ComponentProps<typeof InputGroupButton> & {\n tooltip?: PromptInputButtonTooltip;\n};\n\nexport const PromptInputButton = ({\n variant = 'ghost',\n className,\n size,\n tooltip,\n ...props\n}: PromptInputButtonProps) => {\n const newSize = size ?? (Children.count(props.children) > 1 ? 'sm' : 'icon-sm');\n\n const button = (\n <InputGroupButton className={cn(className)} size={newSize} type=\"button\" variant={variant} {...props} />\n );\n\n if (!tooltip) {\n return button;\n }\n\n const tooltipContent = typeof tooltip === 'string' ? tooltip : tooltip.content;\n const shortcut = typeof tooltip === 'string' ? undefined : tooltip.shortcut;\n const side = typeof tooltip === 'string' ? 'top' : (tooltip.side ?? 'top');\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent side={side}>\n {tooltipContent}\n {shortcut && <span className=\"fk:ml-2 fk:text-muted-foreground\">{shortcut}</span>}\n </TooltipContent>\n </Tooltip>\n );\n};\n\nexport type PromptInputActionMenuProps = ComponentProps<typeof DropdownMenu>;\nexport const PromptInputActionMenu = (props: PromptInputActionMenuProps) => <DropdownMenu {...props} />;\n\nexport type PromptInputActionMenuTriggerProps = PromptInputButtonProps;\n\nexport const PromptInputActionMenuTrigger = ({ className, children, ...props }: PromptInputActionMenuTriggerProps) => (\n <DropdownMenuTrigger asChild>\n <PromptInputButton className={className} {...props}>\n {children ?? <PlusIcon className=\"fk:size-4\" />}\n </PromptInputButton>\n </DropdownMenuTrigger>\n);\n\nexport type PromptInputActionMenuContentProps = ComponentProps<typeof DropdownMenuContent>;\nexport const PromptInputActionMenuContent = ({ className, onCloseAutoFocus, ...props }: PromptInputActionMenuContentProps) => (\n <DropdownMenuContent\n align=\"start\"\n className={cn(className)}\n onCloseAutoFocus={(event) => {\n onCloseAutoFocus?.(event);\n if (event.defaultPrevented) {\n return;\n }\n\n // Radix refocuses the trigger on close, which would open the trigger's\n // tooltip (tooltips show on focus) right after picking an action.\n event.preventDefault();\n }}\n {...props}\n />\n);\n\nexport type PromptInputActionMenuItemProps = ComponentProps<typeof DropdownMenuItem>;\nexport const PromptInputActionMenuItem = ({ className, ...props }: PromptInputActionMenuItemProps) => (\n <DropdownMenuItem className={cn(className)} {...props} />\n);\n\n// Note: Actions that perform side-effects (like opening a file dialog)\n// are provided in opt-in modules (e.g., prompt-input-attachments).\n\nexport type PromptInputSubmitProps = ComponentProps<typeof InputGroupButton> & {\n status?: ChatStatus;\n onStop?: () => void;\n};\n\nexport const PromptInputSubmit = ({\n className,\n variant = 'default',\n size = 'icon-sm',\n status,\n onStop,\n onClick,\n children,\n ...props\n}: PromptInputSubmitProps) => {\n const isGenerating = status === 'submitted' || status === 'streaming';\n\n let Icon = <CornerDownLeftIcon className=\"fk:size-4\" />;\n\n if (status === 'submitted') {\n Icon = <Spinner />;\n } else if (status === 'streaming') {\n Icon = <SquareIcon className=\"fk:size-4\" />;\n } else if (status === 'error') {\n Icon = <XIcon className=\"fk:size-4\" />;\n }\n\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n if (isGenerating && onStop) {\n e.preventDefault();\n onStop();\n return;\n }\n onClick?.(e);\n },\n [isGenerating, onStop, onClick]\n );\n\n return (\n <InputGroupButton\n aria-label={isGenerating ? 'Stop' : 'Submit'}\n className={cn(className)}\n onClick={handleClick}\n size={size}\n type={isGenerating && onStop ? 'button' : 'submit'}\n variant={variant}\n {...props}\n >\n {children ?? Icon}\n </InputGroupButton>\n );\n};\n\nexport type PromptInputSelectProps = ComponentProps<typeof Select>;\n\nexport const PromptInputSelect = (props: PromptInputSelectProps) => <Select {...props} />;\n\nexport type PromptInputSelectTriggerProps = ComponentProps<typeof SelectTrigger>;\n\nexport const PromptInputSelectTrigger = ({ className, ...props }: PromptInputSelectTriggerProps) => (\n <SelectTrigger\n className={cn(\n 'fk:border-none fk:bg-transparent fk:font-medium fk:text-muted-foreground fk:shadow-none fk:transition-colors',\n 'fk:hover:bg-accent fk:hover:text-foreground fk:aria-expanded:bg-accent fk:aria-expanded:text-foreground',\n className\n )}\n {...props}\n />\n);\n\nexport type PromptInputSelectContentProps = ComponentProps<typeof SelectContent>;\n\nexport const PromptInputSelectContent = ({ className, ...props }: PromptInputSelectContentProps) => (\n <SelectContent className={cn(className)} {...props} />\n);\n\nexport type PromptInputSelectItemProps = ComponentProps<typeof SelectItem>;\n\nexport const PromptInputSelectItem = ({ className, ...props }: PromptInputSelectItemProps) => (\n <SelectItem className={cn(className)} {...props} />\n);\n\nexport type PromptInputSelectValueProps = ComponentProps<typeof SelectValue>;\n\nexport const PromptInputSelectValue = ({ className, ...props }: PromptInputSelectValueProps) => (\n <SelectValue className={cn(className)} {...props} />\n);\n\nexport type PromptInputHoverCardProps = ComponentProps<typeof HoverCard>;\n\nexport const PromptInputHoverCard = ({ openDelay = 0, closeDelay = 0, ...props }: PromptInputHoverCardProps) => (\n <HoverCard closeDelay={closeDelay} openDelay={openDelay} {...props} />\n);\n\nexport type PromptInputHoverCardTriggerProps = ComponentProps<typeof HoverCardTrigger>;\n\nexport const PromptInputHoverCardTrigger = (props: PromptInputHoverCardTriggerProps) => <HoverCardTrigger {...props} />;\n\nexport type PromptInputHoverCardContentProps = ComponentProps<typeof HoverCardContent>;\n\nexport const PromptInputHoverCardContent = ({ align = 'start', ...props }: PromptInputHoverCardContentProps) => (\n <HoverCardContent align={align} {...props} />\n);\n\nexport type PromptInputTabsListProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTabsList = ({ className, ...props }: PromptInputTabsListProps) => (\n <div className={cn(className)} {...props} />\n);\n\nexport type PromptInputTabProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTab = ({ className, ...props }: PromptInputTabProps) => (\n <div className={cn(className)} {...props} />\n);\n\nexport type PromptInputTabLabelProps = HTMLAttributes<HTMLHeadingElement>;\n\nexport const PromptInputTabLabel = ({ className, ...props }: PromptInputTabLabelProps) => (\n // Content provided via children in props\n // oxlint-disable-next-line eslint-plugin-jsx-a11y(heading-has-content)\n <h3 className={cn('fk:mb-2 fk:px-3 fk:font-medium fk:text-muted-foreground fk:text-xs', className)} {...props} />\n);\n\nexport type PromptInputTabBodyProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTabBody = ({ className, ...props }: PromptInputTabBodyProps) => (\n <div className={cn('fk:space-y-1', className)} {...props} />\n);\n\nexport type PromptInputTabItemProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTabItem = ({ className, ...props }: PromptInputTabItemProps) => (\n <div\n className={cn('fk:flex fk:items-center fk:gap-2 fk:px-3 fk:py-2 fk:text-xs fk:hover:bg-accent', className)}\n {...props}\n />\n);\n\nexport type PromptInputCommandProps = ComponentProps<typeof Command>;\n\nexport const PromptInputCommand = ({ className, ...props }: PromptInputCommandProps) => (\n <Command className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandInputProps = ComponentProps<typeof CommandInput>;\n\nexport const PromptInputCommandInput = ({ className, ...props }: PromptInputCommandInputProps) => (\n <CommandInput className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandListProps = ComponentProps<typeof CommandList>;\n\nexport const PromptInputCommandList = ({ className, ...props }: PromptInputCommandListProps) => (\n <CommandList className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandEmptyProps = ComponentProps<typeof CommandEmpty>;\n\nexport const PromptInputCommandEmpty = ({ className, ...props }: PromptInputCommandEmptyProps) => (\n <CommandEmpty className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandGroupProps = ComponentProps<typeof CommandGroup>;\n\nexport const PromptInputCommandGroup = ({ className, ...props }: PromptInputCommandGroupProps) => (\n <CommandGroup className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandItemProps = ComponentProps<typeof CommandItem>;\n\nexport const PromptInputCommandItem = ({ className, ...props }: PromptInputCommandItemProps) => (\n <CommandItem className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandSeparatorProps = ComponentProps<typeof CommandSeparator>;\n\nexport const PromptInputCommandSeparator = ({ className, ...props }: PromptInputCommandSeparatorProps) => (\n <CommandSeparator className={cn(className)} {...props} />\n);\n","'use client';\n\nimport { cn } from '../lib/utils';\nimport type { MotionProps } from 'motion/react';\nimport { motion } from 'motion/react';\nimport type { CSSProperties, ElementType, JSX } from 'react';\nimport { memo, useMemo } from 'react';\n\ntype MotionHTMLProps = MotionProps & Record<string, unknown>;\n\n// Cache motion components at module level to avoid creating during render\nconst motionComponentCache = new Map<keyof JSX.IntrinsicElements, React.ComponentType<MotionHTMLProps>>();\n\nconst getMotionComponent = (element: keyof JSX.IntrinsicElements) => {\n let component = motionComponentCache.get(element);\n if (!component) {\n component = motion.create(element);\n motionComponentCache.set(element, component);\n }\n return component;\n};\n\nexport interface TextShimmerProps {\n children: string;\n as?: ElementType;\n className?: string;\n duration?: number;\n spread?: number;\n}\n\nconst ShimmerComponent = ({ children, as: Component = 'p', className, duration = 2, spread = 2 }: TextShimmerProps) => {\n const MotionComponent = getMotionComponent(Component as keyof JSX.IntrinsicElements);\n\n const dynamicSpread = useMemo(() => (children?.length ?? 0) * spread, [children, spread]);\n\n return (\n <MotionComponent\n animate={{ backgroundPosition: '0% center' }}\n className={cn(\n 'fk:relative fk:inline-block fk:bg-[length:250%_100%,auto] fk:bg-clip-text fk:text-transparent',\n 'fk:[--bg:linear-gradient(90deg,#0000_calc(50%-var(--spread)),var(--color-background),#0000_calc(50%+var(--spread)))] fk:[background-repeat:no-repeat,padding-box]',\n className\n )}\n initial={{ backgroundPosition: '100% center' }}\n style={\n {\n '--spread': `${dynamicSpread}px`,\n backgroundImage: 'var(--bg), linear-gradient(var(--color-muted-foreground), var(--color-muted-foreground))',\n } as CSSProperties\n }\n transition={{\n duration,\n ease: 'linear',\n repeat: Number.POSITIVE_INFINITY,\n }}\n >\n {children}\n </MotionComponent>\n );\n};\n\nexport const Shimmer = memo(ShimmerComponent);\n","'use client';\n\nimport { useControllableState } from '@radix-ui/react-use-controllable-state';\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from '../primitives/collapsible';\nimport { cn } from '../lib/utils';\nimport { cjk } from '@streamdown/cjk';\nimport { code } from '@streamdown/code';\nimport { math } from '@streamdown/math';\nimport { mermaid } from '@streamdown/mermaid';\nimport { BrainIcon, ChevronDownIcon } from 'lucide-react';\nimport type { ComponentProps, ReactNode } from 'react';\nimport { createContext, memo, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport { Streamdown } from 'streamdown';\n\nimport { Shimmer } from './shimmer';\n\ninterface ReasoningContextValue {\n isStreaming: boolean;\n isOpen: boolean;\n setIsOpen: (open: boolean) => void;\n duration: number | undefined;\n}\n\nconst ReasoningContext = createContext<ReasoningContextValue | null>(null);\n\nexport const useReasoning = () => {\n const context = useContext(ReasoningContext);\n if (!context) {\n throw new Error('Reasoning components must be used within Reasoning');\n }\n return context;\n};\n\nexport type ReasoningProps = ComponentProps<typeof Collapsible> & {\n isStreaming?: boolean;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n duration?: number;\n};\n\nconst AUTO_CLOSE_DELAY = 1000;\nconst MS_IN_S = 1000;\n\nexport const Reasoning = memo(\n ({\n className,\n isStreaming = false,\n open,\n defaultOpen,\n onOpenChange,\n duration: durationProp,\n children,\n ...props\n }: ReasoningProps) => {\n const resolvedDefaultOpen = defaultOpen ?? isStreaming;\n // Track if defaultOpen was explicitly set to false (to prevent auto-open)\n const isExplicitlyClosed = defaultOpen === false;\n\n const [isOpen, setIsOpen] = useControllableState<boolean>({\n defaultProp: resolvedDefaultOpen,\n onChange: onOpenChange,\n prop: open,\n });\n const [duration, setDuration] = useControllableState<number | undefined>({\n defaultProp: undefined,\n prop: durationProp,\n });\n\n const hasEverStreamedRef = useRef(isStreaming);\n const [hasAutoClosed, setHasAutoClosed] = useState(false);\n const startTimeRef = useRef<number | null>(null);\n\n // Track when streaming starts and compute duration\n useEffect(() => {\n if (isStreaming) {\n hasEverStreamedRef.current = true;\n if (startTimeRef.current === null) {\n startTimeRef.current = Date.now();\n }\n } else if (startTimeRef.current !== null) {\n setDuration(Math.ceil((Date.now() - startTimeRef.current) / MS_IN_S));\n startTimeRef.current = null;\n }\n }, [isStreaming, setDuration]);\n\n // Auto-open when streaming starts (unless explicitly closed)\n useEffect(() => {\n if (isStreaming && !isOpen && !isExplicitlyClosed) {\n setIsOpen(true);\n }\n }, [isStreaming, isOpen, setIsOpen, isExplicitlyClosed]);\n\n // Auto-close when streaming ends (once only, and only if it ever streamed)\n useEffect(() => {\n if (hasEverStreamedRef.current && !isStreaming && isOpen && !hasAutoClosed) {\n const timer = setTimeout(() => {\n setIsOpen(false);\n setHasAutoClosed(true);\n }, AUTO_CLOSE_DELAY);\n\n return () => clearTimeout(timer);\n }\n }, [isStreaming, isOpen, setIsOpen, hasAutoClosed]);\n\n const handleOpenChange = useCallback(\n (newOpen: boolean) => {\n setIsOpen(newOpen);\n },\n [setIsOpen]\n );\n\n const contextValue = useMemo(\n () => ({ duration, isOpen, isStreaming, setIsOpen }),\n [duration, isOpen, isStreaming, setIsOpen]\n );\n\n return (\n <ReasoningContext.Provider value={contextValue}>\n <Collapsible\n className={cn('fk:not-prose fk:mb-4', className)}\n onOpenChange={handleOpenChange}\n open={isOpen}\n {...props}\n >\n {children}\n </Collapsible>\n </ReasoningContext.Provider>\n );\n }\n);\n\nexport type ReasoningTriggerProps = ComponentProps<typeof CollapsibleTrigger> & {\n getThinkingMessage?: (isStreaming: boolean, duration?: number) => ReactNode;\n};\n\nconst defaultGetThinkingMessage = (isStreaming: boolean, duration?: number) => {\n if (isStreaming || duration === 0) {\n return <Shimmer duration={1}>Thinking...</Shimmer>;\n }\n if (duration === undefined) {\n return <p>Thought for a few seconds</p>;\n }\n return <p>Thought for {duration} seconds</p>;\n};\n\nexport const ReasoningTrigger = memo(\n ({ className, children, getThinkingMessage = defaultGetThinkingMessage, ...props }: ReasoningTriggerProps) => {\n const { isStreaming, isOpen, duration } = useReasoning();\n\n return (\n <CollapsibleTrigger\n className={cn(\n 'fk:flex fk:w-full fk:items-center fk:gap-2 fk:text-muted-foreground fk:text-sm fk:transition-colors fk:hover:text-foreground',\n className\n )}\n {...props}\n >\n {children ?? (\n <>\n <BrainIcon className=\"fk:size-4\" />\n {getThinkingMessage(isStreaming, duration)}\n <ChevronDownIcon\n className={cn('fk:size-4 fk:transition-transform', isOpen ? 'fk:rotate-180' : 'fk:rotate-0')}\n />\n </>\n )}\n </CollapsibleTrigger>\n );\n }\n);\n\nexport type ReasoningContentProps = ComponentProps<typeof CollapsibleContent> & {\n children: string;\n};\n\nconst streamdownPlugins = { cjk, code, math, mermaid };\n\nexport const ReasoningContent = memo(({ className, children, ...props }: ReasoningContentProps) => (\n <CollapsibleContent\n className={cn(\n 'fk:mt-4 fk:text-sm',\n 'fk:data-[state=closed]:fade-out-0 fk:data-[state=closed]:slide-out-to-top-2 fk:data-[state=open]:slide-in-from-top-2 fk:text-muted-foreground fk:outline-none fk:data-[state=closed]:animate-out fk:data-[state=open]:animate-in',\n className\n )}\n {...props}\n >\n <Streamdown plugins={streamdownPlugins}>{children}</Streamdown>\n </CollapsibleContent>\n));\n\nReasoning.displayName = 'Reasoning';\nReasoningTrigger.displayName = 'ReasoningTrigger';\nReasoningContent.displayName = 'ReasoningContent';\n","'use client';\n\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from '../primitives/collapsible';\nimport { cn } from '../lib/utils';\nimport { BookIcon, ChevronDownIcon } from 'lucide-react';\nimport type { ComponentProps } from 'react';\n\nexport type SourcesProps = ComponentProps<'div'>;\n\nexport const Sources = ({ className, ...props }: SourcesProps) => (\n <Collapsible className={cn('fk:not-prose fk:mb-4 fk:text-primary fk:text-xs', className)} {...props} />\n);\n\nexport type SourcesTriggerProps = ComponentProps<typeof CollapsibleTrigger> & {\n count: number;\n};\n\nexport const SourcesTrigger = ({ className, count, children, ...props }: SourcesTriggerProps) => (\n <CollapsibleTrigger className={cn('fk:flex fk:items-center fk:gap-2', className)} {...props}>\n {children ?? (\n <>\n <p className=\"fk:font-medium\">Used {count} sources</p>\n <ChevronDownIcon className=\"fk:h-4 fk:w-4\" />\n </>\n )}\n </CollapsibleTrigger>\n);\n\nexport type SourcesContentProps = ComponentProps<typeof CollapsibleContent>;\n\nexport const SourcesContent = ({ className, ...props }: SourcesContentProps) => (\n <CollapsibleContent\n className={cn(\n 'fk:mt-3 fk:flex fk:w-fit fk:flex-col fk:gap-2',\n 'fk:data-[state=closed]:fade-out-0 fk:data-[state=closed]:slide-out-to-top-2 fk:data-[state=open]:slide-in-from-top-2 fk:outline-none fk:data-[state=closed]:animate-out fk:data-[state=open]:animate-in',\n className\n )}\n {...props}\n />\n);\n\nexport type SourceProps = ComponentProps<'a'>;\n\nexport const Source = ({ href, title, children, ...props }: SourceProps) => (\n <a className=\"fk:flex fk:items-center fk:gap-2\" href={href} rel=\"noreferrer\" target=\"_blank\" {...props}>\n {children ?? (\n <>\n <BookIcon className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:block fk:font-medium\">{title}</span>\n </>\n )}\n </a>\n);\n","'use client';\n\nimport { Button } from '../primitives/button';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../primitives/tooltip';\nimport { cn } from '../lib/utils';\nimport { LoaderIcon, MicIcon, SquareIcon } from 'lucide-react';\nimport { type ComponentProps, useCallback, useEffect, useRef, useState } from 'react';\n\nexport type SpeechInputProps = Omit<ComponentProps<typeof Button>, 'onError'> & {\n onTranscriptionChange?: (text: string) => void;\n /**\n * Required. Receives the recorded audio blob and an abort signal that is\n * cancelled if the user stops processing. Return the transcribed text.\n */\n onAudioRecorded?: (audioBlob: Blob, signal: AbortSignal) => Promise<string>;\n onError?: (error: Error) => void;\n};\n\nconst MAX_RECORDING_MS = 60_000;\n\nfunction isMediaRecorderSupported(): boolean {\n return (\n typeof window !== 'undefined' &&\n 'MediaRecorder' in window &&\n typeof navigator !== 'undefined' &&\n 'mediaDevices' in navigator &&\n typeof navigator.mediaDevices.getUserMedia === 'function'\n );\n}\n\nfunction getSupportedRecorderMimeType(): string | undefined {\n const candidates = ['audio/webm;codecs=opus', 'audio/webm', 'audio/mp4', 'audio/ogg;codecs=opus'];\n\n return candidates.find((type) => MediaRecorder.isTypeSupported(type));\n}\n\nfunction toSpeechInputError(error: unknown, fallback: string): Error {\n if (error instanceof DOMException && (error.name === 'NotAllowedError' || error.name === 'PermissionDeniedError')) {\n return new Error('Microphone permission was denied. Enable the microphone to dictate.');\n }\n\n if (error instanceof DOMException && error.name === 'NotFoundError') {\n return new Error('No microphone was found.');\n }\n\n if (error instanceof Error) {\n return error;\n }\n\n return new Error(fallback);\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === 'AbortError';\n}\n\nfunction getTooltip(isSupported: boolean, isListening: boolean, isProcessing: boolean): string {\n if (!isSupported) {\n return 'Dictation is not available in this browser.';\n }\n\n if (isProcessing) {\n return 'Cancel transcription';\n }\n\n if (isListening) {\n return 'Stop recording';\n }\n\n return 'Dictate';\n}\n\nexport const SpeechInput = ({\n className,\n disabled,\n onAudioRecorded,\n onError,\n onTranscriptionChange,\n size = 'icon-sm',\n variant = 'ghost',\n ...props\n}: SpeechInputProps) => {\n const [isListening, setIsListening] = useState(false);\n const [isProcessing, setIsProcessing] = useState(false);\n const [isSupported, setIsSupported] = useState(false);\n const mediaRecorderRef = useRef<MediaRecorder | null>(null);\n const streamRef = useRef<MediaStream | null>(null);\n const audioChunksRef = useRef<Blob[]>([]);\n const maxDurationTimerRef = useRef<number | null>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n const discardNextStopRef = useRef(false);\n const disabledRef = useRef(Boolean(disabled));\n const onAudioRecordedRef = useRef(onAudioRecorded);\n const onErrorRef = useRef(onError);\n const onTranscriptionChangeRef = useRef(onTranscriptionChange);\n\n disabledRef.current = Boolean(disabled);\n onAudioRecordedRef.current = onAudioRecorded;\n onErrorRef.current = onError;\n onTranscriptionChangeRef.current = onTranscriptionChange;\n\n useEffect(() => {\n setIsSupported(isMediaRecorderSupported());\n }, []);\n\n const releaseStream = useCallback(() => {\n if (!streamRef.current) {\n return;\n }\n\n for (const track of streamRef.current.getTracks()) {\n track.stop();\n }\n\n streamRef.current = null;\n }, []);\n\n const clearMaxDurationTimer = useCallback(() => {\n if (maxDurationTimerRef.current === null) {\n return;\n }\n\n window.clearTimeout(maxDurationTimerRef.current);\n maxDurationTimerRef.current = null;\n }, []);\n\n const stopMediaRecorder = useCallback(() => {\n clearMaxDurationTimer();\n\n if (mediaRecorderRef.current?.state === 'recording') {\n mediaRecorderRef.current.stop();\n }\n\n setIsListening(false);\n }, [clearMaxDurationTimer]);\n\n const abortProcessing = useCallback(() => {\n abortControllerRef.current?.abort();\n abortControllerRef.current = null;\n setIsProcessing(false);\n }, []);\n\n const cancelCapture = useCallback(() => {\n abortProcessing();\n clearMaxDurationTimer();\n\n const recorder = mediaRecorderRef.current;\n\n if (recorder?.state === 'recording') {\n discardNextStopRef.current = true;\n recorder.stop();\n }\n\n setIsListening(false);\n releaseStream();\n }, [abortProcessing, clearMaxDurationTimer, releaseStream]);\n\n const startMediaRecorder = useCallback(async () => {\n if (disabledRef.current) {\n return;\n }\n\n if (!onAudioRecordedRef.current) {\n onErrorRef.current?.(new Error('Dictation is not configured.'));\n\n return;\n }\n\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n\n if (disabledRef.current) {\n for (const track of stream.getTracks()) {\n track.stop();\n }\n\n return;\n }\n\n streamRef.current = stream;\n const mimeType = getSupportedRecorderMimeType();\n const mediaRecorder = mimeType ? new MediaRecorder(stream, { mimeType }) : new MediaRecorder(stream);\n audioChunksRef.current = [];\n\n mediaRecorder.ondataavailable = (event) => {\n if (event.data.size > 0) {\n audioChunksRef.current.push(event.data);\n }\n };\n\n mediaRecorder.onstop = async () => {\n releaseStream();\n clearMaxDurationTimer();\n setIsListening(false);\n\n if (discardNextStopRef.current) {\n discardNextStopRef.current = false;\n audioChunksRef.current = [];\n\n return;\n }\n\n const audioBlob = new Blob(audioChunksRef.current, {\n type: mediaRecorder.mimeType || 'audio/webm',\n });\n\n if (audioBlob.size === 0) {\n return;\n }\n\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n setIsProcessing(true);\n\n try {\n const transcribe = onAudioRecordedRef.current;\n\n if (!transcribe) {\n return;\n }\n\n const transcript = await transcribe(audioBlob, abortController.signal);\n\n if (transcript) {\n onTranscriptionChangeRef.current?.(transcript);\n }\n } catch (error) {\n if (isAbortError(error)) {\n return;\n }\n\n onErrorRef.current?.(toSpeechInputError(error, 'Transcription failed.'));\n } finally {\n // Cancel already nulls the shared ref so the UI can re-record.\n // Only this attempt may clear its own controller and flag.\n if (abortControllerRef.current === abortController) {\n abortControllerRef.current = null;\n setIsProcessing(false);\n }\n }\n };\n\n mediaRecorder.onerror = () => {\n setIsListening(false);\n releaseStream();\n clearMaxDurationTimer();\n onErrorRef.current?.(new Error('Recording failed. Try again.'));\n };\n\n mediaRecorderRef.current = mediaRecorder;\n mediaRecorder.start(250);\n setIsListening(true);\n maxDurationTimerRef.current = window.setTimeout(() => {\n stopMediaRecorder();\n }, MAX_RECORDING_MS);\n } catch (error) {\n setIsListening(false);\n releaseStream();\n onErrorRef.current?.(toSpeechInputError(error, 'Could not start the microphone.'));\n }\n }, [clearMaxDurationTimer, releaseStream, stopMediaRecorder]);\n\n // `disabled` must tear down capture, not only grey out the button. In the\n // chat composer, submit/stream sets this true and would otherwise freeze\n // the mic in the listening state.\n useEffect(() => {\n if (!disabled) {\n return;\n }\n\n cancelCapture();\n }, [cancelCapture, disabled]);\n\n useEffect(() => {\n return () => {\n cancelCapture();\n };\n }, [cancelCapture]);\n\n const handleClick = useCallback(() => {\n if (isProcessing) {\n abortProcessing();\n\n return;\n }\n\n if (isListening) {\n stopMediaRecorder();\n\n return;\n }\n\n void startMediaRecorder();\n }, [abortProcessing, isListening, isProcessing, startMediaRecorder, stopMediaRecorder]);\n\n const isDisabled = disabled || !isSupported || !onAudioRecorded;\n const tooltip = getTooltip(isSupported && Boolean(onAudioRecorded), isListening, isProcessing);\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"fk:relative fk:inline-flex fk:items-center fk:justify-center\">\n {isListening\n ? [0, 1, 2].map((index) => (\n <span\n className=\"fk:absolute fk:inset-0 fk:animate-ping fk:rounded-full fk:border-2 fk:border-red-400/30 fk:corner-squircle\"\n key={index}\n style={{\n animationDelay: `${String(index * 0.3)}s`,\n animationDuration: '2s',\n }}\n />\n ))\n : null}\n <Button\n aria-label={tooltip}\n aria-pressed={isListening}\n size={size}\n variant={isListening ? 'destructive' : variant}\n {...props}\n className={cn('fk:relative fk:z-10 fk:rounded-full fk:dark:hover:bg-accent fk:corner-squircle', className)}\n disabled={isDisabled}\n onClick={handleClick}\n type=\"button\"\n >\n {isProcessing ? <LoaderIcon className=\"fk:size-4 fk:animate-spin\" /> : null}\n {!isProcessing && isListening ? <SquareIcon className=\"fk:size-4\" /> : null}\n {!(isProcessing || isListening) ? <MicIcon className=\"fk:size-5\" /> : null}\n </Button>\n </span>\n </TooltipTrigger>\n <TooltipContent>{tooltip}</TooltipContent>\n </Tooltip>\n );\n};\n","'use client';\n\nimport { Button } from '../primitives/button';\nimport { ScrollArea, ScrollBar } from '../primitives/scroll-area';\nimport { cn } from '../lib/utils';\nimport type { ComponentProps } from 'react';\nimport { useCallback } from 'react';\n\nexport type SuggestionsProps = ComponentProps<typeof ScrollArea>;\n\nexport const Suggestions = ({ className, children, ...props }: SuggestionsProps) => (\n <ScrollArea className=\"fk:w-full fk:overflow-x-auto fk:whitespace-nowrap\" {...props}>\n <div className={cn('fk:flex fk:w-max fk:flex-nowrap fk:items-center fk:gap-2', className)}>{children}</div>\n <ScrollBar className=\"fk:hidden\" orientation=\"horizontal\" />\n </ScrollArea>\n);\n\nexport type SuggestionProps = Omit<ComponentProps<typeof Button>, 'onClick'> & {\n suggestion: string;\n onClick?: (suggestion: string) => void;\n};\n\nexport const Suggestion = ({\n suggestion,\n onClick,\n className,\n variant = 'outline',\n size = 'sm',\n children,\n ...props\n}: SuggestionProps) => {\n const handleClick = useCallback(() => {\n onClick?.(suggestion);\n }, [onClick, suggestion]);\n\n return (\n <Button\n className={cn('fk:cursor-pointer fk:rounded-full fk:px-4 fk:corner-squircle', className)}\n onClick={handleClick}\n size={size}\n type=\"button\"\n variant={variant}\n {...props}\n >\n {children || suggestion}\n </Button>\n );\n};\n","'use client';\n\nimport { Badge } from '../primitives/badge';\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from '../primitives/collapsible';\nimport { cn } from '../lib/utils';\nimport type { DynamicToolUIPart, ToolUIPart } from 'ai';\nimport { CheckCircleIcon, ChevronDownIcon, CircleIcon, ClockIcon, WrenchIcon, XCircleIcon } from 'lucide-react';\nimport type { ComponentProps, ReactNode } from 'react';\nimport { isValidElement } from 'react';\n\nimport { CodeBlock } from './code-block';\n\nexport type ToolProps = ComponentProps<typeof Collapsible>;\n\nexport const Tool = ({ className, ...props }: ToolProps) => (\n <Collapsible\n className={cn('fk:group fk:not-prose fk:mb-4 fk:w-full fk:rounded-md fk:border fk:corner-squircle', className)}\n {...props}\n />\n);\n\nexport type ToolPart = ToolUIPart | DynamicToolUIPart;\n\nexport type ToolHeaderProps = {\n title?: string;\n className?: string;\n} & (\n | { type: ToolUIPart['type']; state: ToolUIPart['state']; toolName?: never }\n | {\n type: DynamicToolUIPart['type'];\n state: DynamicToolUIPart['state'];\n toolName: string;\n }\n);\n\nconst statusLabels: Record<ToolPart['state'], string> = {\n 'approval-requested': 'Awaiting Approval',\n 'approval-responded': 'Responded',\n 'input-available': 'Running',\n 'input-streaming': 'Pending',\n 'output-available': 'Completed',\n 'output-denied': 'Denied',\n 'output-error': 'Error',\n};\n\nconst statusIcons: Record<ToolPart['state'], ReactNode> = {\n 'approval-requested': <ClockIcon className=\"fk:size-4 fk:text-yellow-600\" />,\n 'approval-responded': <CheckCircleIcon className=\"fk:size-4 fk:text-blue-600\" />,\n 'input-available': <ClockIcon className=\"fk:size-4 fk:animate-pulse\" />,\n 'input-streaming': <CircleIcon className=\"fk:size-4\" />,\n 'output-available': <CheckCircleIcon className=\"fk:size-4 fk:text-green-600\" />,\n 'output-denied': <XCircleIcon className=\"fk:size-4 fk:text-orange-600\" />,\n 'output-error': <XCircleIcon className=\"fk:size-4 fk:text-red-600\" />,\n};\n\nexport const getStatusBadge = (status: ToolPart['state']) => (\n <Badge className=\"fk:gap-1.5 fk:py-px fk:rounded-full fk:text-xs fk:corner-squircle\" variant=\"secondary\">\n {statusIcons[status]}\n {statusLabels[status]}\n </Badge>\n);\n\nexport const ToolHeader = ({ className, title, type, state, toolName, ...props }: ToolHeaderProps) => {\n const derivedName = type === 'dynamic-tool' ? toolName : type.split('-').slice(1).join('-');\n\n return (\n <CollapsibleTrigger\n className={cn('fk:flex fk:w-full fk:items-center fk:justify-between fk:gap-4 fk:px-3 fk:py-2', className)}\n {...props}\n >\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <WrenchIcon className=\"fk:size-4 fk:text-muted-foreground\" />\n <span className=\"fk:font-medium fk:text-sm\">{title ?? derivedName}</span>\n {getStatusBadge(state)}\n </div>\n <ChevronDownIcon className=\"fk:size-4 fk:text-muted-foreground fk:transition-transform fk:group-data-[state=open]:rotate-180\" />\n </CollapsibleTrigger>\n );\n};\n\nexport type ToolContentProps = ComponentProps<typeof CollapsibleContent>;\n\nexport const ToolContent = ({ className, ...props }: ToolContentProps) => (\n <CollapsibleContent\n className={cn(\n 'fk:data-[state=closed]:fade-out-0 fk:data-[state=closed]:slide-out-to-top-2 fk:data-[state=open]:slide-in-from-top-2 fk:space-y-4 fk:p-4 fk:text-popover-foreground fk:outline-none fk:data-[state=closed]:animate-out fk:data-[state=open]:animate-in',\n className\n )}\n {...props}\n />\n);\n\nexport type ToolInputProps = ComponentProps<'div'> & {\n input: ToolPart['input'];\n};\n\nexport const ToolInput = ({ className, input, ...props }: ToolInputProps) => (\n <div className={cn('fk:space-y-2 fk:overflow-hidden', className)} {...props}>\n <h4 className=\"fk:font-medium fk:text-muted-foreground fk:text-xs fk:uppercase fk:tracking-wide\">Parameters</h4>\n <div className=\"fk:rounded-md fk:bg-muted/50 fk:corner-squircle\">\n <CodeBlock code={JSON.stringify(input, null, 2)} language=\"json\" />\n </div>\n </div>\n);\n\nexport type ToolOutputProps = ComponentProps<'div'> & {\n output: ToolPart['output'];\n errorText: ToolPart['errorText'];\n};\n\nexport const ToolOutput = ({ className, output, errorText, ...props }: ToolOutputProps) => {\n if (!(output || errorText)) {\n return null;\n }\n\n let Output = <div>{output as ReactNode}</div>;\n\n if (typeof output === 'object' && !isValidElement(output)) {\n Output = <CodeBlock code={JSON.stringify(output, null, 2)} language=\"json\" />;\n } else if (typeof output === 'string') {\n Output = <CodeBlock code={output} language=\"json\" />;\n }\n\n return (\n <div className={cn('fk:space-y-2', className)} {...props}>\n <h4 className=\"fk:font-medium fk:text-muted-foreground fk:text-xs fk:uppercase fk:tracking-wide\">\n {errorText ? 'Error' : 'Result'}\n </h4>\n <div\n className={cn(\n 'fk:overflow-x-auto fk:rounded-md fk:text-xs fk:[&_table]:w-full fk:corner-squircle',\n errorText ? 'fk:bg-destructive/10 fk:text-destructive' : 'fk:bg-muted/50 fk:text-foreground'\n )}\n >\n {errorText && <div>{errorText}</div>}\n {Output}\n </div>\n </div>\n );\n};\n"]}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"ui.js"}