@peam-ai/client 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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["#style-inject:#style-inject","../src/global.css","../src/lib/db.ts","../src/hooks/useDebounceCallback.ts","../src/hooks/useChatPersistence.ts","../src/hooks/useAskAI.ts","../src/lib/utils.ts","../src/components/ui/button.tsx","../src/components/ai-elements/conversation.tsx","../src/components/ui/tooltip.tsx","../src/components/ai-elements/message.tsx","../src/components/ui/textarea.tsx","../src/components/ui/input-group.tsx","../src/components/ai-elements/prompt-input.tsx","../src/components/ai-elements/shimmer.tsx","../src/components/ui/collapsible.tsx","../src/components/ai-elements/sources.tsx","../src/components/SuggestedPrompts.tsx","../src/lib/messageWindow.ts","../src/hooks/useSummarization.ts","../src/lib/BoundedChatTransport.ts","../src/components/icons/peam.tsx","../src/components/Chat.tsx","../src/components/AskAIChat.tsx","../src/components/AskAIDialog.tsx","../src/components/AskAISidepane.tsx","../src/components/AskAI.tsx"],"names":["styleInject","css","insertAt","head","style","ChatDatabase","Dexie","db","useDebounceCallback","callback","delay","timeoutRef","useRef","debouncedCallback","useCallback","args","log","loggers","CURRENT_CONVERSATION_ID","useChatPersistence","_b","storedMessages","useLiveQuery","storedSummary","isLoading","initialMessages","_a","message","__objRest","summary","lastSummarizedMessageId","saveMessagesImmediate","messages","__async","baseTimestamp","messagesToStore","index","__spreadProps","__spreadValues","error","saveMessages","saveSummary","summaryText","lastMessageId","clearMessages","useAskAI","isOpen","setIsOpen","useState","chatClearRef","chatPersistence","handleToggle","prev","handleOpen","handleClose","handleClear","useEffect","handleKeyboard","event","isIKey","cn","inputs","twMerge","clsx","buttonVariants","cva","Button","className","variant","size","asChild","props","jsx","Slot","Conversation","StickToBottom","ConversationContent","ConversationEmptyState","title","description","icon","children","jsxs","Fragment","ConversationScrollButton","isAtBottom","scrollToBottom","useStickToBottomContext","handleScrollToBottom","ArrowDownIcon","TooltipProvider","delayDuration","V","Tooltip","TooltipTrigger","TooltipContent","sideOffset","Message","from","MessageContent","MessageActions","MessageAction","tooltip","label","button","createContext","MessageResponse","memo","Streamdown","prevProps","nextProps","Textarea","InputGroup","inputGroupAddonVariants","InputGroupAddon","align","e","inputGroupButtonVariants","InputGroupButton","type","InputGroupTextarea","PromptInputController","ProviderAttachmentsContext","useOptionalPromptInputController","useContext","useOptionalProviderAttachments","LocalAttachmentsContext","usePromptInputAttachments","provider","local","context","PromptInput","accept","multiple","globalDrop","syncHiddenInput","maxFiles","maxFileSize","onError","onSubmit","controller","usingProvider","inputRef","formRef","items","setItems","files","filesRef","openFileDialogLocal","matchesAccept","f","s","pattern","prefix","addLocal","fileList","incoming","accepted","withinSize","sized","capacity","capped","next","file","nanoid","removeLocal","id","found","clearLocal","add","remove","clear","openFileDialog","form","onDragOver","onDrop","_c","handleChange","convertBlobUrlToDataUrl","url","blob","resolve","reader","ctx","useMemo","item","handleSubmit","text","dataUrl","convertedFiles","result","inner","PromptInputBody","PromptInputTextarea","onChange","placeholder","attachments","isComposing","setIsComposing","handleKeyDown","submitButton","lastAttachment","handlePaste","controlledProps","PromptInputFooter","PromptInputButton","newSize","Children","PromptInputSubmit","status","Icon","CornerDownLeftIcon","Loader2Icon","SquareIcon","XIcon","PromptInputSpeechButton","textareaRef","onTranscriptionChange","isListening","setIsListening","recognition","setRecognition","recognitionRef","SpeechRecognition","speechRecognition","finalTranscript","i","textarea","currentValue","newValue","toggleListening","MicIcon","ShimmerComponent","Component","duration","spread","MotionComponent","motion","dynamicSpread","Shimmer","Collapsible","mt","CollapsibleTrigger","CollapsibleContent","Sources","SourcesTrigger","count","ChevronDownIcon","SourcesContent","Source","href","BookIcon","DEFAULT_SUGGESTED_PROMPTS","SuggestedPrompts","prompts","onPromptClick","prompt","MAX_MESSAGES","getRecentMessages","maxMessages","lastSummarizedIndex","m","shouldSummarize","getMessagesToSummarize","useSummarization","options","api","isSummarizing","setIsSummarizing","messagesToSummarizeRef","isProcessingRef","transport","DefaultChatTransport","setMessages","regenerate","useChat","part","summarizedMessages","summarize","previousSummary","triggerSummarization","allMessages","messagesToSummarize","lastMessage","BoundedChatTransport","body","recentMessages","PeamIcon","PeamCloseIcon","Chat","suggestedPrompts","onClearRef","chatTransport","input","setInput","isInitialized","setIsInitialized","copiedMessageId","setCopiedMessageId","isSyncing","lastSavedMessageCount","maybeTriggerSummarization","_sendMessage","isIdle","timeoutId","sendMessage","handleSuggestedPromptClick","handleCopy","messageId","handleClearChat","getErrorMessage","parsed","sourceParts","uniqueSources","uniqueSourceCount","isLastMessage","isAssistant","isStreaming","isReady","textContent","hasText","showShimmer","showActions","Check","Copy","RefreshCcw","AskAIChat","Trash2","X","clearFn","AskAIDialog","AskAISidepane","originalBodyStyles","width","AskAI"],"mappings":"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","file":"index.js","sourcesContent":["\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\"/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */@layer properties;.peam-root,.peam-root :host{--font-sans: ui-sans-serif, system-ui, sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\";--font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace;--color-red-50: oklch(97.1% .013 17.38);--color-red-100: oklch(93.6% .032 17.717);--color-red-200: oklch(88.5% .062 18.334);--color-red-600: oklch(57.7% .245 27.325);--color-red-700: oklch(50.5% .213 27.518);--color-red-800: oklch(44.4% .177 26.899);--color-orange-600: oklch(64.6% .222 41.116);--color-yellow-600: oklch(68.1% .162 75.834);--color-green-600: oklch(62.7% .194 149.214);--color-blue-600: oklch(54.6% .245 262.881);--color-black: #000;--color-white: #fff;--spacing: .25rem;--container-sm: 24rem;--container-lg: 32rem;--container-2xl: 42rem;--text-xs: .75rem;--text-xs--line-height: calc(1 / .75);--text-sm: .875rem;--text-sm--line-height: calc(1.25 / .875);--text-base: 1rem;--text-base--line-height: 1.5 ;--text-lg: 1.125rem;--text-lg--line-height: calc(1.75 / 1.125);--text-xl: 1.25rem;--text-xl--line-height: calc(1.75 / 1.25);--text-2xl: 1.5rem;--text-2xl--line-height: calc(2 / 1.5);--text-3xl: 1.875rem;--text-3xl--line-height: 1.2 ;--font-weight-normal: 400;--font-weight-medium: 500;--font-weight-semibold: 600;--tracking-tight: -.025em;--tracking-wide: .025em;--tracking-widest: .1em;--leading-tight: 1.25;--leading-relaxed: 1.625;--radius-xs: .125rem;--drop-shadow-lg: 0 4px 4px rgb(0 0 0 / .15);--ease-out: cubic-bezier(0, 0, .2, 1);--ease-in-out: cubic-bezier(.4, 0, .2, 1);--animate-spin: spin 1s linear infinite;--animate-pulse: pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm: 8px;--default-transition-duration: .15s;--default-transition-timing-function: cubic-bezier(.4, 0, .2, 1);--default-font-family: var(--font-sans);--default-mono-font-family: var(--font-mono);--color-background: var(--background);--color-muted-foreground: var(--muted-foreground);--color-ring: var(--ring)}.peam-root *,.peam-root :after,.peam-root :before,.peam-root ::backdrop,.peam-root ::file-selector-button{box-sizing:border-box;margin:0;padding:0;border:0 solid}.peam-root,.peam-root :host{line-height:1.5;-webkit-text-size-adjust:100%;tab-size:4;font-family:var(--default-font-family, ui-sans-serif, system-ui, sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\");font-feature-settings:var(--default-font-feature-settings, normal);font-variation-settings:var(--default-font-variation-settings, normal);-webkit-tap-highlight-color:transparent}.peam-root hr{height:0;color:inherit;border-top-width:1px}.peam-root abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.peam-root h1,.peam-root h2,.peam-root h3,.peam-root h4,.peam-root h5,.peam-root h6{font-size:inherit;font-weight:inherit}.peam-root a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}.peam-root b,.peam-root strong{font-weight:bolder}.peam-root code,.peam-root kbd,.peam-root samp,.peam-root pre{font-family:var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace);font-feature-settings:var(--default-mono-font-feature-settings, normal);font-variation-settings:var(--default-mono-font-variation-settings, normal);font-size:1em}.peam-root small{font-size:80%}.peam-root sub,.peam-root sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}.peam-root sub{bottom:-.25em}.peam-root sup{top:-.5em}.peam-root table{text-indent:0;border-color:inherit;border-collapse:collapse}.peam-root :-moz-focusring{outline:auto}.peam-root progress{vertical-align:baseline}.peam-root summary{display:list-item}.peam-root ol,.peam-root ul,.peam-root menu{list-style:none}.peam-root img,.peam-root svg,.peam-root video,.peam-root canvas,.peam-root audio,.peam-root iframe,.peam-root embed,.peam-root object{display:block;vertical-align:middle}.peam-root img,.peam-root video{max-width:100%;height:auto}.peam-root button,.peam-root input,.peam-root select,.peam-root optgroup,.peam-root textarea,.peam-root ::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;border-radius:0;background-color:transparent;opacity:1}.peam-root :where(select:is([multiple],[size])) optgroup{font-weight:bolder}.peam-root :where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}.peam-root ::file-selector-button{margin-inline-end:4px}.peam-root ::placeholder{opacity:1}@supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px){.peam-root ::placeholder{color:currentcolor;@supports (color: color-mix(in lab,red,red)){color:color-mix(in oklab,currentcolor 50%,transparent)}}}.peam-root textarea{resize:vertical}.peam-root ::-webkit-search-decoration{-webkit-appearance:none}.peam-root ::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}.peam-root ::-webkit-datetime-edit{display:inline-flex}.peam-root ::-webkit-datetime-edit-fields-wrapper{padding:0}.peam-root ::-webkit-datetime-edit,.peam-root ::-webkit-datetime-edit-year-field,.peam-root ::-webkit-datetime-edit-month-field,.peam-root ::-webkit-datetime-edit-day-field,.peam-root ::-webkit-datetime-edit-hour-field,.peam-root ::-webkit-datetime-edit-minute-field,.peam-root ::-webkit-datetime-edit-second-field,.peam-root ::-webkit-datetime-edit-millisecond-field,.peam-root ::-webkit-datetime-edit-meridiem-field{padding-block:0}.peam-root ::-webkit-calendar-picker-indicator{line-height:1}.peam-root :-moz-ui-invalid{box-shadow:none}.peam-root button,.peam-root input:where([type=button],[type=reset],[type=submit]),.peam-root ::file-selector-button{appearance:button}.peam-root ::-webkit-inner-spin-button,.peam-root ::-webkit-outer-spin-button{height:auto}.peam-root [hidden]:where(:not([hidden=until-found])){display:none!important}.peam-root .\\\\@container\\\\/card-header{container-type:inline-size;container-name:card-header}.peam-root .pointer-events-none{pointer-events:none}.peam-root .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border-width:0}.peam-root .absolute{position:absolute}.peam-root .fixed{position:fixed}.peam-root .relative{position:relative}.peam-root .static{position:static}.peam-root .inset-0{inset:calc(var(--spacing) * 0)}.peam-root .inset-x-0{inset-inline:calc(var(--spacing) * 0)}.peam-root .-top-12{top:calc(var(--spacing) * -12)}.peam-root .top-1\\\\/2{top:50%}.peam-root .top-2{top:calc(var(--spacing) * 2)}.peam-root .top-3{top:calc(var(--spacing) * 3)}.peam-root .top-4{top:calc(var(--spacing) * 4)}.peam-root .top-7{top:calc(var(--spacing) * 7)}.peam-root .top-\\\\[50\\\\%\\\\]{top:50%}.peam-root .top-full{top:100%}.peam-root .-right-12{right:calc(var(--spacing) * -12)}.peam-root .right-0{right:calc(var(--spacing) * 0)}.peam-root .right-2{right:calc(var(--spacing) * 2)}.peam-root .right-3{right:calc(var(--spacing) * 3)}.peam-root .right-4{right:calc(var(--spacing) * 4)}.peam-root .-bottom-12{bottom:calc(var(--spacing) * -12)}.peam-root .bottom-0{bottom:calc(var(--spacing) * 0)}.peam-root .bottom-2{bottom:calc(var(--spacing) * 2)}.peam-root .bottom-4{bottom:calc(var(--spacing) * 4)}.peam-root .-left-12{left:calc(var(--spacing) * -12)}.peam-root .left-1\\\\/2{left:50%}.peam-root .left-2{left:calc(var(--spacing) * 2)}.peam-root .left-4{left:calc(var(--spacing) * 4)}.peam-root .left-\\\\[50\\\\%\\\\]{left:50%}.peam-root .z-10{z-index:10}.peam-root .z-40{z-index:40}.peam-root .z-50{z-index:50}.peam-root .z-60{z-index:60}.peam-root .order-first{order:-9999}.peam-root .order-last{order:9999}.peam-root .col-start-2{grid-column-start:2}.peam-root .row-span-2{grid-row:span 2 / span 2}.peam-root .row-start-1{grid-row-start:1}.peam-root .container{width:100%;@media(width>=40rem){max-width:40rem}@media(width>=48rem){max-width:48rem}@media(width>=64rem){max-width:64rem}@media(width>=80rem){max-width:80rem}@media(width>=96rem){max-width:96rem}}.peam-root .\\\\!m-0{margin:calc(var(--spacing) * 0)!important}.peam-root .m-4{margin:calc(var(--spacing) * 4)}.peam-root .-mx-1{margin-inline:calc(var(--spacing) * -1)}.peam-root .-mx-px{margin-inline:-1px}.peam-root .my-1{margin-block:calc(var(--spacing) * 1)}.peam-root .my-4{margin-block:calc(var(--spacing) * 4)}.peam-root .my-6{margin-block:calc(var(--spacing) * 6)}.peam-root .-mt-4{margin-top:calc(var(--spacing) * -4)}.peam-root .mt-0\\\\.5{margin-top:calc(var(--spacing) * .5)}.peam-root .mt-1{margin-top:calc(var(--spacing) * 1)}.peam-root .mt-2{margin-top:calc(var(--spacing) * 2)}.peam-root .mt-3{margin-top:calc(var(--spacing) * 3)}.peam-root .mt-4{margin-top:calc(var(--spacing) * 4)}.peam-root .mt-6{margin-top:calc(var(--spacing) * 6)}.peam-root .mr-2{margin-right:calc(var(--spacing) * 2)}.peam-root .mr-4{margin-right:calc(var(--spacing) * 4)}.peam-root .-mb-1{margin-bottom:calc(var(--spacing) * -1)}.peam-root .mb-2{margin-bottom:calc(var(--spacing) * 2)}.peam-root .mb-4{margin-bottom:calc(var(--spacing) * 4)}.peam-root .-ml-4{margin-left:calc(var(--spacing) * -4)}.peam-root .ml-1{margin-left:calc(var(--spacing) * 1)}.peam-root .ml-2{margin-left:calc(var(--spacing) * 2)}.peam-root .ml-6{margin-left:calc(var(--spacing) * 6)}.peam-root .ml-auto{margin-left:auto}.peam-root .line-clamp-1{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.peam-root .line-clamp-3{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.peam-root .block{display:block}.peam-root .contents{display:contents}.peam-root .flex{display:flex}.peam-root .grid{display:grid}.peam-root .hidden{display:none}.peam-root .inline{display:inline}.peam-root .inline-block{display:inline-block}.peam-root .inline-flex{display:inline-flex}.peam-root .list-item{display:list-item}.peam-root .table{display:table}.peam-root .table-cell{display:table-cell}.peam-root .table-row{display:table-row}.peam-root .field-sizing-content{field-sizing:content}.peam-root .size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.peam-root .size-2\\\\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.peam-root .size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.peam-root .size-3\\\\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.peam-root .size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.peam-root .size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.peam-root .size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.peam-root .size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.peam-root .size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.peam-root .size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.peam-root .size-12{width:calc(var(--spacing) * 12);height:calc(var(--spacing) * 12)}.peam-root .size-24{width:calc(var(--spacing) * 24);height:calc(var(--spacing) * 24)}.peam-root .size-auto{width:auto;height:auto}.peam-root .size-full{width:100%;height:100%}.peam-root .h-0{height:calc(var(--spacing) * 0)}.peam-root .h-2{height:calc(var(--spacing) * 2)}.peam-root .h-2\\\\.5{height:calc(var(--spacing) * 2.5)}.peam-root .h-4{height:calc(var(--spacing) * 4)}.peam-root .h-6{height:calc(var(--spacing) * 6)}.peam-root .h-8{height:calc(var(--spacing) * 8)}.peam-root .h-9{height:calc(var(--spacing) * 9)}.peam-root .h-10{height:calc(var(--spacing) * 10)}.peam-root .h-\\\\[46px\\\\]{height:46px}.peam-root .h-\\\\[66vh\\\\]{height:66vh}.peam-root .h-\\\\[80vh\\\\]{height:80vh}.peam-root .h-\\\\[var\\\\(--radix-select-trigger-height\\\\)\\\\]{height:var(--radix-select-trigger-height)}.peam-root .h-auto{height:auto}.peam-root .h-full{height:100%}.peam-root .h-px{height:1px}.peam-root .max-h-\\\\(--radix-dropdown-menu-content-available-height\\\\){max-height:var(--radix-dropdown-menu-content-available-height)}.peam-root .max-h-\\\\(--radix-select-content-available-height\\\\){max-height:var(--radix-select-content-available-height)}.peam-root .max-h-40{max-height:calc(var(--spacing) * 40)}.peam-root .max-h-48{max-height:calc(var(--spacing) * 48)}.peam-root .max-h-96{max-height:calc(var(--spacing) * 96)}.peam-root .max-h-\\\\[22rem\\\\]{max-height:22rem}.peam-root .max-h-\\\\[300px\\\\]{max-height:300px}.peam-root .max-h-full{max-height:100%}.peam-root .min-h-0{min-height:calc(var(--spacing) * 0)}.peam-root .min-h-4{min-height:calc(var(--spacing) * 4)}.peam-root .min-h-16{min-height:calc(var(--spacing) * 16)}.peam-root .min-h-full{min-height:100%}.peam-root .w-2\\\\.5{width:calc(var(--spacing) * 2.5)}.peam-root .w-4{width:calc(var(--spacing) * 4)}.peam-root .w-8{width:calc(var(--spacing) * 8)}.peam-root .w-64{width:calc(var(--spacing) * 64)}.peam-root .w-80{width:calc(var(--spacing) * 80)}.peam-root .w-96{width:calc(var(--spacing) * 96)}.peam-root .w-\\\\[240px\\\\]{width:240px}.peam-root .w-auto{width:auto}.peam-root .w-fit{width:fit-content}.peam-root .w-full{width:100%}.peam-root .w-max{width:max-content}.peam-root .w-px{width:1px}.peam-root .w-sm{width:var(--container-sm)}.peam-root .max-w-2xl{max-width:var(--container-2xl)}.peam-root .max-w-\\\\[95\\\\%\\\\]{max-width:95%}.peam-root .max-w-\\\\[100px\\\\]{max-width:100px}.peam-root .max-w-\\\\[calc\\\\(100\\\\%-2rem\\\\)\\\\]{max-width:calc(100% - 2rem)}.peam-root .max-w-full{max-width:100%}.peam-root .max-w-prose{max-width:65ch}.peam-root .min-w-0{min-width:calc(var(--spacing) * 0)}.peam-root .min-w-10{min-width:calc(var(--spacing) * 10)}.peam-root .min-w-60{min-width:calc(var(--spacing) * 60)}.peam-root .min-w-\\\\[8rem\\\\]{min-width:8rem}.peam-root .min-w-\\\\[120px\\\\]{min-width:120px}.peam-root .min-w-\\\\[var\\\\(--radix-select-trigger-width\\\\)\\\\]{min-width:var(--radix-select-trigger-width)}.peam-root .flex-1{flex:1}.peam-root .shrink-0{flex-shrink:0}.peam-root .grow{flex-grow:1}.peam-root .grow-0{flex-grow:0}.peam-root .basis-full{flex-basis:100%}.peam-root .border-collapse{border-collapse:collapse}.peam-root .origin-\\\\(--radix-dropdown-menu-content-transform-origin\\\\){transform-origin:var(--radix-dropdown-menu-content-transform-origin)}.peam-root .origin-\\\\(--radix-hover-card-content-transform-origin\\\\){transform-origin:var(--radix-hover-card-content-transform-origin)}.peam-root .origin-\\\\(--radix-select-content-transform-origin\\\\){transform-origin:var(--radix-select-content-transform-origin)}.peam-root .origin-\\\\(--radix-tooltip-content-transform-origin\\\\){transform-origin:var(--radix-tooltip-content-transform-origin)}.peam-root .origin-center{transform-origin:center}.peam-root .-translate-x-1\\\\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.peam-root .translate-x-\\\\[-50\\\\%\\\\]{--tw-translate-x: -50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.peam-root .-translate-y-1\\\\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.peam-root .translate-y-\\\\[-50\\\\%\\\\]{--tw-translate-y: -50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.peam-root .translate-y-\\\\[calc\\\\(-50\\\\%_-_2px\\\\)\\\\]{--tw-translate-y: calc(-50% - 2px) ;translate:var(--tw-translate-x) var(--tw-translate-y)}.peam-root .rotate-0{rotate:0deg}.peam-root .rotate-45{rotate:45deg}.peam-root .rotate-90{rotate:90deg}.peam-root .rotate-180{rotate:180deg}.peam-root .transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.peam-root .animate-in{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.peam-root .animate-pulse{animation:var(--animate-pulse)}.peam-root .animate-spin{animation:var(--animate-spin)}.peam-root .cursor-default{cursor:default}.peam-root .cursor-pointer{cursor:pointer}.peam-root .cursor-text{cursor:text}.peam-root .touch-none{touch-action:none}.peam-root .resize{resize:both}.peam-root .resize-none{resize:none}.peam-root .scroll-my-1{scroll-margin-block:calc(var(--spacing) * 1)}.peam-root .scroll-py-1{scroll-padding-block:calc(var(--spacing) * 1)}.peam-root .list-inside{list-style-position:inside}.peam-root .list-decimal{list-style-type:decimal}.peam-root .list-disc{list-style-type:disc}.peam-root .auto-rows-min{grid-auto-rows:min-content}.peam-root .grid-cols-\\\\[0_1fr\\\\]{grid-template-columns:0 1fr}.peam-root .grid-rows-\\\\[auto_auto\\\\]{grid-template-rows:auto auto}.peam-root .flex-col{flex-direction:column}.peam-root .flex-col-reverse{flex-direction:column-reverse}.peam-root .flex-nowrap{flex-wrap:nowrap}.peam-root .flex-wrap{flex-wrap:wrap}.peam-root .items-center{align-items:center}.peam-root .items-start{align-items:flex-start}.peam-root .items-stretch{align-items:stretch}.peam-root .justify-between{justify-content:space-between}.peam-root .justify-center{justify-content:center}.peam-root .justify-end{justify-content:flex-end}.peam-root .justify-start{justify-content:flex-start}.peam-root .justify-items-start{justify-items:start}.peam-root .gap-0{gap:calc(var(--spacing) * 0)}.peam-root .gap-0\\\\.5{gap:calc(var(--spacing) * .5)}.peam-root .gap-1{gap:calc(var(--spacing) * 1)}.peam-root .gap-1\\\\.5{gap:calc(var(--spacing) * 1.5)}.peam-root .gap-2{gap:calc(var(--spacing) * 2)}.peam-root .gap-2\\\\.5{gap:calc(var(--spacing) * 2.5)}.peam-root .gap-3{gap:calc(var(--spacing) * 3)}.peam-root .gap-4{gap:calc(var(--spacing) * 4)}.peam-root .gap-6{gap:calc(var(--spacing) * 6)}.peam-root .gap-8{gap:calc(var(--spacing) * 8)}.peam-root .gap-px{gap:1px}.peam-root .space-y-1{.peam-root :where(&>:not(:last-child)){--tw-space-y-reverse: 0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}}.peam-root .space-y-2{.peam-root :where(&>:not(:last-child)){--tw-space-y-reverse: 0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}}.peam-root .space-y-3{.peam-root :where(&>:not(:last-child)){--tw-space-y-reverse: 0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}}.peam-root .space-y-4{.peam-root :where(&>:not(:last-child)){--tw-space-y-reverse: 0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}}.peam-root .-space-x-1{.peam-root :where(&>:not(:last-child)){--tw-space-x-reverse: 0;margin-inline-start:calc(calc(var(--spacing) * -1) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * -1) * calc(1 - var(--tw-space-x-reverse)))}}.peam-root .space-x-2{.peam-root :where(&>:not(:last-child)){--tw-space-x-reverse: 0;margin-inline-start:calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)))}}.peam-root .gap-y-0\\\\.5{row-gap:calc(var(--spacing) * .5)}.peam-root .divide-y{.peam-root :where(&>:not(:last-child)){--tw-divide-y-reverse: 0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}}.peam-root .divide-border{.peam-root :where(&>:not(:last-child)){border-color:var(--border)}}.peam-root .self-end{align-self:flex-end}.peam-root .self-start{align-self:flex-start}.peam-root .self-stretch{align-self:stretch}.peam-root .justify-self-end{justify-self:flex-end}.peam-root .truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.peam-root .overflow-auto{overflow:auto}.peam-root .overflow-hidden{overflow:hidden}.peam-root .overflow-x-auto{overflow-x:auto}.peam-root .overflow-x-hidden{overflow-x:hidden}.peam-root .overflow-y-auto{overflow-y:auto}.peam-root .overflow-y-hidden{overflow-y:hidden}.peam-root .rounded{border-radius:.25rem}.peam-root .rounded-\\\\[2px\\\\]{border-radius:2px}.peam-root .rounded-\\\\[calc\\\\(var\\\\(--radius\\\\)-5px\\\\)\\\\]{border-radius:calc(var(--radius) - 5px)}.peam-root .rounded-\\\\[inherit\\\\]{border-radius:inherit}.peam-root .rounded-full{border-radius:calc(infinity * 1px)}.peam-root .rounded-lg{border-radius:var(--radius)}.peam-root .rounded-md{border-radius:calc(var(--radius) - 2px)}.peam-root .rounded-none{border-radius:0}.peam-root .rounded-sm{border-radius:calc(var(--radius) - 4px)}.peam-root .rounded-xl{border-radius:calc(var(--radius) + 4px)}.peam-root .rounded-xs{border-radius:var(--radius-xs)}.peam-root .rounded-t-md{border-top-left-radius:calc(var(--radius) - 2px);border-top-right-radius:calc(var(--radius) - 2px)}.peam-root .rounded-b-md{border-bottom-right-radius:calc(var(--radius) - 2px);border-bottom-left-radius:calc(var(--radius) - 2px)}.peam-root .border{border-style:var(--tw-border-style);border-width:1px}.peam-root .border-0{border-style:var(--tw-border-style);border-width:0px}.peam-root .border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.peam-root .border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.peam-root .border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.peam-root .border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.peam-root .border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.peam-root .border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.peam-root .border-none{--tw-border-style: none;border-style:none}.peam-root .border-border{border-color:var(--border)}.peam-root .border-current{border-color:currentcolor}.peam-root .border-input{border-color:var(--input)}.peam-root .border-muted{border-color:var(--muted)}.peam-root .border-muted-foreground\\\\/20{border-color:var(--muted-foreground);@supports (color: color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--muted-foreground) 20%,transparent)}}.peam-root .border-muted-foreground\\\\/30{border-color:var(--muted-foreground);@supports (color: color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--muted-foreground) 30%,transparent)}}.peam-root .border-muted-foreground\\\\/50{border-color:var(--muted-foreground);@supports (color: color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--muted-foreground) 50%,transparent)}}.peam-root .border-red-200{border-color:var(--color-red-200)}.peam-root .border-transparent{border-color:transparent}.peam-root .border-t-transparent{border-top-color:transparent}.peam-root .border-l-transparent{border-left-color:transparent}.peam-root .bg-accent{background-color:var(--accent)}.peam-root .bg-background{background-color:var(--background)}.peam-root .bg-background\\\\/80{background-color:var(--background);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--background) 80%,transparent)}}.peam-root .bg-background\\\\/90{background-color:var(--background);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--background) 90%,transparent)}}.peam-root .bg-background\\\\/95{background-color:var(--background);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--background) 95%,transparent)}}.peam-root .bg-black\\\\/10{background-color:color-mix(in srgb,#000 10%,transparent);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}.peam-root .bg-black\\\\/50{background-color:color-mix(in srgb,#000 50%,transparent);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--color-black) 50%,transparent)}}.peam-root .bg-border{background-color:var(--border)}.peam-root .bg-card{background-color:var(--card)}.peam-root .bg-destructive{background-color:var(--destructive)}.peam-root .bg-destructive\\\\/10{background-color:var(--destructive);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--destructive) 10%,transparent)}}.peam-root .bg-foreground{background-color:var(--foreground)}.peam-root .bg-input{background-color:var(--input)}.peam-root .bg-muted{background-color:var(--muted)}.peam-root .bg-muted-foreground\\\\/10{background-color:var(--muted-foreground);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--muted-foreground) 10%,transparent)}}.peam-root .bg-muted\\\\/40{background-color:var(--muted);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--muted) 40%,transparent)}}.peam-root .bg-muted\\\\/50{background-color:var(--muted);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--muted) 50%,transparent)}}.peam-root .bg-muted\\\\/80{background-color:var(--muted);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--muted) 80%,transparent)}}.peam-root .bg-popover{background-color:var(--popover)}.peam-root .bg-primary{background-color:var(--primary)}.peam-root .bg-primary\\\\/20{background-color:var(--primary);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--primary) 20%,transparent)}}.peam-root .bg-red-50{background-color:var(--color-red-50)}.peam-root .bg-red-100{background-color:var(--color-red-100)}.peam-root .bg-secondary{background-color:var(--secondary)}.peam-root .bg-transparent{background-color:transparent}.peam-root .bg-\\\\[length\\\\:250\\\\%_100\\\\%\\\\,auto\\\\]{background-size:250% 100%,auto}.peam-root .bg-clip-text{background-clip:text}.peam-root .\\\\[background-repeat\\\\:no-repeat\\\\,padding-box\\\\]{background-repeat:no-repeat,padding-box}.peam-root .fill-current{fill:currentcolor}.peam-root .fill-foreground{fill:var(--foreground)}.peam-root .stroke-ring{stroke:var(--ring)}.peam-root .stroke-1{stroke-width:1}.peam-root .object-contain{object-fit:contain}.peam-root .object-cover{object-fit:cover}.peam-root .p-0{padding:calc(var(--spacing) * 0)}.peam-root .p-1{padding:calc(var(--spacing) * 1)}.peam-root .p-1\\\\.5{padding:calc(var(--spacing) * 1.5)}.peam-root .p-2{padding:calc(var(--spacing) * 2)}.peam-root .p-3{padding:calc(var(--spacing) * 3)}.peam-root .p-3\\\\!{padding:calc(var(--spacing) * 3)!important}.peam-root .p-4{padding:calc(var(--spacing) * 4)}.peam-root .p-6{padding:calc(var(--spacing) * 6)}.peam-root .p-8{padding:calc(var(--spacing) * 8)}.peam-root .p-px{padding:1px}.peam-root .px-0\\\\.5{padding-inline:calc(var(--spacing) * .5)}.peam-root .px-1\\\\.5{padding-inline:calc(var(--spacing) * 1.5)}.peam-root .px-2{padding-inline:calc(var(--spacing) * 2)}.peam-root .px-2\\\\.5{padding-inline:calc(var(--spacing) * 2.5)}.peam-root .px-3{padding-inline:calc(var(--spacing) * 3)}.peam-root .px-4{padding-inline:calc(var(--spacing) * 4)}.peam-root .px-6{padding-inline:calc(var(--spacing) * 6)}.peam-root .py-0\\\\.5{padding-block:calc(var(--spacing) * .5)}.peam-root .py-1{padding-block:calc(var(--spacing) * 1)}.peam-root .py-1\\\\.5{padding-block:calc(var(--spacing) * 1.5)}.peam-root .py-2{padding-block:calc(var(--spacing) * 2)}.peam-root .py-3{padding-block:calc(var(--spacing) * 3)}.peam-root .py-3\\\\.5{padding-block:calc(var(--spacing) * 3.5)}.peam-root .py-6{padding-block:calc(var(--spacing) * 6)}.peam-root .pt-2{padding-top:calc(var(--spacing) * 2)}.peam-root .pt-3{padding-top:calc(var(--spacing) * 3)}.peam-root .pt-4{padding-top:calc(var(--spacing) * 4)}.peam-root .pr-2{padding-right:calc(var(--spacing) * 2)}.peam-root .pr-3{padding-right:calc(var(--spacing) * 3)}.peam-root .pr-4{padding-right:calc(var(--spacing) * 4)}.peam-root .pr-8{padding-right:calc(var(--spacing) * 8)}.peam-root .pb-2{padding-bottom:calc(var(--spacing) * 2)}.peam-root .pb-3{padding-bottom:calc(var(--spacing) * 3)}.peam-root .pb-4{padding-bottom:calc(var(--spacing) * 4)}.peam-root .pl-2{padding-left:calc(var(--spacing) * 2)}.peam-root .pl-3{padding-left:calc(var(--spacing) * 3)}.peam-root .pl-4{padding-left:calc(var(--spacing) * 4)}.peam-root .pl-8{padding-left:calc(var(--spacing) * 8)}.peam-root .text-center{text-align:center}.peam-root .text-left{text-align:left}.peam-root .text-right{text-align:right}.peam-root .font-mono{font-family:var(--font-mono)}.peam-root .text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading, var(--text-2xl--line-height))}.peam-root .text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading, var(--text-3xl--line-height))}.peam-root .text-base{font-size:var(--text-base);line-height:var(--tw-leading, var(--text-base--line-height))}.peam-root .text-lg{font-size:var(--text-lg);line-height:var(--tw-leading, var(--text-lg--line-height))}.peam-root .text-sm{font-size:var(--text-sm);line-height:var(--tw-leading, var(--text-sm--line-height))}.peam-root .text-xl{font-size:var(--text-xl);line-height:var(--tw-leading, var(--text-xl--line-height))}.peam-root .text-xs{font-size:var(--text-xs);line-height:var(--tw-leading, var(--text-xs--line-height))}.peam-root .leading-none{--tw-leading: 1;line-height:1}.peam-root .leading-relaxed{--tw-leading: var(--leading-relaxed);line-height:var(--leading-relaxed)}.peam-root .leading-tight{--tw-leading: var(--leading-tight);line-height:var(--leading-tight)}.peam-root .font-medium{--tw-font-weight: var(--font-weight-medium);font-weight:var(--font-weight-medium)}.peam-root .font-normal{--tw-font-weight: var(--font-weight-normal);font-weight:var(--font-weight-normal)}.peam-root .font-semibold{--tw-font-weight: var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.peam-root .tracking-tight{--tw-tracking: var(--tracking-tight);letter-spacing:var(--tracking-tight)}.peam-root .tracking-wide{--tw-tracking: var(--tracking-wide);letter-spacing:var(--tracking-wide)}.peam-root .tracking-widest{--tw-tracking: var(--tracking-widest);letter-spacing:var(--tracking-widest)}.peam-root .text-balance{text-wrap:balance}.peam-root .break-words{overflow-wrap:break-word}.peam-root .wrap-anywhere{overflow-wrap:anywhere}.peam-root .break-all{word-break:break-all}.peam-root .whitespace-normal{white-space:normal}.peam-root .whitespace-nowrap{white-space:nowrap}.peam-root .text-accent-foreground{color:var(--accent-foreground)}.peam-root .text-background{color:var(--background)}.peam-root .text-blue-600{color:var(--color-blue-600)}.peam-root .text-card-foreground{color:var(--card-foreground)}.peam-root .text-destructive{color:var(--destructive)}.peam-root .text-foreground{color:var(--foreground)}.peam-root .text-green-600{color:var(--color-green-600)}.peam-root .text-muted-foreground{color:var(--muted-foreground)}.peam-root .text-muted-foreground\\\\/40{color:var(--muted-foreground);@supports (color: color-mix(in lab,red,red)){color:color-mix(in oklab,var(--muted-foreground) 40%,transparent)}}.peam-root .text-muted-foreground\\\\/50{color:var(--muted-foreground);@supports (color: color-mix(in lab,red,red)){color:color-mix(in oklab,var(--muted-foreground) 50%,transparent)}}.peam-root .text-orange-600{color:var(--color-orange-600)}.peam-root .text-popover-foreground{color:var(--popover-foreground)}.peam-root .text-primary{color:var(--primary)}.peam-root .text-primary-foreground{color:var(--primary-foreground)}.peam-root .text-red-600{color:var(--color-red-600)}.peam-root .text-red-700{color:var(--color-red-700)}.peam-root .text-red-800{color:var(--color-red-800)}.peam-root .text-secondary-foreground{color:var(--secondary-foreground)}.peam-root .text-transparent{color:transparent}.peam-root .text-white{color:var(--color-white)}.peam-root .text-yellow-600{color:var(--color-yellow-600)}.peam-root .lowercase{text-transform:lowercase}.peam-root .uppercase{text-transform:uppercase}.peam-root .italic{font-style:italic}.peam-root .line-through{text-decoration-line:line-through}.peam-root .underline{text-decoration-line:underline}.peam-root .underline-offset-4{text-underline-offset:4px}.peam-root .opacity-0{opacity:0%}.peam-root .opacity-50{opacity:50%}.peam-root .opacity-70{opacity:70%}.peam-root .shadow-2xl{--tw-shadow: 0 25px 50px -12px var(--tw-shadow-color, rgb(0 0 0 / .25));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.peam-root .shadow-\\\\[0_-4px_20px_rgba\\\\(0\\\\,0\\\\,0\\\\,0\\\\.25\\\\)\\\\]{--tw-shadow: 0 -4px 20px var(--tw-shadow-color, rgba(0,0,0,.25));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.peam-root .shadow-lg{--tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.peam-root .shadow-md{--tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.peam-root .shadow-none{--tw-shadow: 0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.peam-root .shadow-none\\\\!{--tw-shadow: 0 0 #0000 !important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.peam-root .shadow-sm{--tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.peam-root .shadow-xs{--tw-shadow: 0 1px 2px 0 var(--tw-shadow-color, rgb(0 0 0 / .05));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.peam-root .ring-offset-background{--tw-ring-offset-color: var(--background)}.peam-root .outline-hidden{--tw-outline-style: none;outline-style:none;@media(forced-colors:active){outline:2px solid transparent;outline-offset:2px}}.peam-root .outline{outline-style:var(--tw-outline-style);outline-width:1px}.peam-root .drop-shadow-lg{--tw-drop-shadow-size: drop-shadow(0 4px 4px var(--tw-drop-shadow-color, rgb(0 0 0 / .15)));--tw-drop-shadow: drop-shadow(var(--drop-shadow-lg));filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.peam-root .backdrop-blur-sm{--tw-backdrop-blur: blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.peam-root .transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.peam-root .transition-\\\\[color\\\\,box-shadow\\\\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.peam-root .transition-all{transition-property:all;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.peam-root .transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.peam-root .transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.peam-root .transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.peam-root .delay-100{transition-delay:.1s}.peam-root .duration-150{--tw-duration: .15s;transition-duration:.15s}.peam-root .duration-200{--tw-duration: .2s;transition-duration:.2s}.peam-root .duration-300{--tw-duration: .3s;transition-duration:.3s}.peam-root .ease-in-out{--tw-ease: var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.peam-root .ease-out{--tw-ease: var(--ease-out);transition-timing-function:var(--ease-out)}.peam-root .delay-100{animation-delay:100ms;animation-delay:.1s;--tw-animation-delay: 100ms ;--tw-animation-delay: .1s}.peam-root .fade-in-0{--tw-enter-opacity: 0 ;--tw-enter-opacity: 0}.peam-root .outline-none{--tw-outline-style: none;outline-style:none}.peam-root .select-none{-webkit-user-select:none;user-select:none}.peam-root .zoom-in-95{--tw-enter-scale: 95% ;--tw-enter-scale: .95}.peam-root .\\\\[--bg\\\\:linear-gradient\\\\(90deg\\\\,\\\\#0000_calc\\\\(50\\\\%-var\\\\(--spread\\\\)\\\\)\\\\,var\\\\(--color-background\\\\)\\\\,\\\\#0000_calc\\\\(50\\\\%\\\\+var\\\\(--spread\\\\)\\\\)\\\\)\\\\]{--bg: linear-gradient(90deg,#0000 calc(50% - var(--spread)),var(--color-background),#0000 calc(50% + var(--spread)))}.peam-root .\\\\[counter-increment\\\\:line_0\\\\]{counter-increment:line 0}.peam-root .\\\\[counter-reset\\\\:line\\\\]{counter-reset:line}.peam-root .fade-in{--tw-enter-opacity: 0}.peam-root .slide-in-from-bottom{--tw-enter-translate-y: 100%}.peam-root .slide-in-from-top-2{--tw-enter-translate-y: calc(2*var(--spacing)*-1)}.peam-root .group-hover\\\\:pointer-events-auto{.peam-root &:is(:where(.group):hover *){@media(hover:hover){pointer-events:auto}}}.peam-root .group-hover\\\\:block{.peam-root &:is(:where(.group):hover *){@media(hover:hover){display:block}}}.peam-root .group-hover\\\\:bg-accent{.peam-root &:is(:where(.group):hover *){@media(hover:hover){background-color:var(--accent)}}}.peam-root .group-hover\\\\:opacity-0{.peam-root &:is(:where(.group):hover *){@media(hover:hover){opacity:0%}}}.peam-root .group-hover\\\\:opacity-100{.peam-root &:is(:where(.group):hover *){@media(hover:hover){opacity:100%}}}.peam-root .group-has-\\\\[\\\\>input\\\\]\\\\/input-group\\\\:pt-2\\\\.5{.peam-root &:is(:where(.group\\\\/input-group):has(>input) *){padding-top:calc(var(--spacing) * 2.5)}}.peam-root .group-has-\\\\[\\\\>input\\\\]\\\\/input-group\\\\:pb-2\\\\.5{.peam-root &:is(:where(.group\\\\/input-group):has(>input) *){padding-bottom:calc(var(--spacing) * 2.5)}}.peam-root .group-data-\\\\[disabled\\\\=true\\\\]\\\\/input-group\\\\:opacity-50{.peam-root &:is(:where(.group\\\\/input-group)[data-disabled=true] *){opacity:50%}}.peam-root .group-data-\\\\[state\\\\=closed\\\\]\\\\:-rotate-90{.peam-root &:is(:where(.group)[data-state=closed] *){rotate:-90deg}}.peam-root .group-data-\\\\[state\\\\=open\\\\]\\\\:rotate-180{.peam-root &:is(:where(.group)[data-state=open] *){rotate:180deg}}.peam-root .group-\\\\[\\\\.is-assistant\\\\]\\\\:text-foreground{.peam-root &:is(:where(.group):is(.is-assistant) *){color:var(--foreground)}}.peam-root .group-\\\\[\\\\.is-user\\\\]\\\\:ml-auto{.peam-root &:is(:where(.group):is(.is-user) *){margin-left:auto}}.peam-root .group-\\\\[\\\\.is-user\\\\]\\\\:rounded-lg{.peam-root &:is(:where(.group):is(.is-user) *){border-radius:var(--radius)}}.peam-root .group-\\\\[\\\\.is-user\\\\]\\\\:bg-secondary{.peam-root &:is(:where(.group):is(.is-user) *){background-color:var(--secondary)}}.peam-root .group-\\\\[\\\\.is-user\\\\]\\\\:px-4{.peam-root &:is(:where(.group):is(.is-user) *){padding-inline:calc(var(--spacing) * 4)}}.peam-root .group-\\\\[\\\\.is-user\\\\]\\\\:py-3{.peam-root &:is(:where(.group):is(.is-user) *){padding-block:calc(var(--spacing) * 3)}}.peam-root .group-\\\\[\\\\.is-user\\\\]\\\\:text-foreground{.peam-root &:is(:where(.group):is(.is-user) *){color:var(--foreground)}}.peam-root .selection\\\\:bg-primary{.peam-root & *::selection{background-color:var(--primary)}.peam-root &::selection{background-color:var(--primary)}}.peam-root .selection\\\\:text-primary-foreground{.peam-root & *::selection{color:var(--primary-foreground)}.peam-root &::selection{color:var(--primary-foreground)}}.peam-root .file\\\\:inline-flex{.peam-root &::file-selector-button{display:inline-flex}}.peam-root .file\\\\:h-7{.peam-root &::file-selector-button{height:calc(var(--spacing) * 7)}}.peam-root .file\\\\:border-0{.peam-root &::file-selector-button{border-style:var(--tw-border-style);border-width:0px}}.peam-root .file\\\\:bg-transparent{.peam-root &::file-selector-button{background-color:transparent}}.peam-root .file\\\\:text-sm{.peam-root &::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading, var(--text-sm--line-height))}}.peam-root .file\\\\:font-medium{.peam-root &::file-selector-button{--tw-font-weight: var(--font-weight-medium);font-weight:var(--font-weight-medium)}}.peam-root .file\\\\:text-foreground{.peam-root &::file-selector-button{color:var(--foreground)}}.peam-root .placeholder\\\\:text-muted-foreground{.peam-root &::placeholder{color:var(--muted-foreground)}}.peam-root .before\\\\:mr-4{.peam-root &:before{content:var(--tw-content);margin-right:calc(var(--spacing) * 4)}}.peam-root .before\\\\:inline-block{.peam-root &:before{content:var(--tw-content);display:inline-block}}.peam-root .before\\\\:w-4{.peam-root &:before{content:var(--tw-content);width:calc(var(--spacing) * 4)}}.peam-root .before\\\\:text-right{.peam-root &:before{content:var(--tw-content);text-align:right}}.peam-root .before\\\\:font-mono{.peam-root &:before{content:var(--tw-content);font-family:var(--font-mono)}}.peam-root .before\\\\:text-\\\\[13px\\\\]{.peam-root &:before{content:var(--tw-content);font-size:13px}}.peam-root .before\\\\:text-muted-foreground\\\\/50{.peam-root &:before{content:var(--tw-content);color:var(--muted-foreground);@supports (color: color-mix(in lab,red,red)){color:color-mix(in oklab,var(--muted-foreground) 50%,transparent)}}}.peam-root .before\\\\:content-\\\\[counter\\\\(line\\\\)\\\\]{.peam-root &:before{--tw-content: counter(line);content:var(--tw-content)}}.peam-root .before\\\\:select-none{.peam-root &:before{content:var(--tw-content);-webkit-user-select:none;user-select:none}}.peam-root .before\\\\:\\\\[counter-increment\\\\:line\\\\]{.peam-root &:before{content:var(--tw-content);counter-increment:line}}.peam-root .hover\\\\:scale-110{.peam-root &:hover{@media(hover:hover){--tw-scale-x: 110%;--tw-scale-y: 110%;--tw-scale-z: 110%;scale:var(--tw-scale-x) var(--tw-scale-y)}}}.peam-root .hover\\\\:bg-accent{.peam-root &:hover{@media(hover:hover){background-color:var(--accent)}}}.peam-root .hover\\\\:bg-background{.peam-root &:hover{@media(hover:hover){background-color:var(--background)}}}.peam-root .hover\\\\:bg-destructive\\\\/90{.peam-root &:hover{@media(hover:hover){background-color:var(--destructive);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--destructive) 90%,transparent)}}}}.peam-root .hover\\\\:bg-muted{.peam-root &:hover{@media(hover:hover){background-color:var(--muted)}}}.peam-root .hover\\\\:bg-muted-foreground\\\\/10{.peam-root &:hover{@media(hover:hover){background-color:var(--muted-foreground);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--muted-foreground) 10%,transparent)}}}}.peam-root .hover\\\\:bg-muted\\\\/40{.peam-root &:hover{@media(hover:hover){background-color:var(--muted);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--muted) 40%,transparent)}}}}.peam-root .hover\\\\:bg-muted\\\\/50{.peam-root &:hover{@media(hover:hover){background-color:var(--muted);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--muted) 50%,transparent)}}}}.peam-root .hover\\\\:bg-primary\\\\/90{.peam-root &:hover{@media(hover:hover){background-color:var(--primary);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--primary) 90%,transparent)}}}}.peam-root .hover\\\\:bg-secondary\\\\/80{.peam-root &:hover{@media(hover:hover){background-color:var(--secondary);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--secondary) 80%,transparent)}}}}.peam-root .hover\\\\:text-accent-foreground{.peam-root &:hover{@media(hover:hover){color:var(--accent-foreground)}}}.peam-root .hover\\\\:text-foreground{.peam-root &:hover{@media(hover:hover){color:var(--foreground)}}}.peam-root .hover\\\\:underline{.peam-root &:hover{@media(hover:hover){text-decoration-line:underline}}}.peam-root .hover\\\\:opacity-100{.peam-root &:hover{@media(hover:hover){opacity:100%}}}.peam-root .focus\\\\:bg-accent{.peam-root &:focus{background-color:var(--accent)}}.peam-root .focus\\\\:text-accent-foreground{.peam-root &:focus{color:var(--accent-foreground)}}.peam-root .focus\\\\:ring-2{.peam-root &:focus{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.peam-root .focus\\\\:ring-ring{.peam-root &:focus{--tw-ring-color: var(--ring)}}.peam-root .focus\\\\:ring-offset-2{.peam-root &:focus{--tw-ring-offset-width: 2px;--tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}}.peam-root .focus\\\\:outline-hidden{.peam-root &:focus{--tw-outline-style: none;outline-style:none;@media(forced-colors:active){outline:2px solid transparent;outline-offset:2px}}}.peam-root .focus-visible\\\\:border-ring{.peam-root &:focus-visible{border-color:var(--ring)}}.peam-root .focus-visible\\\\:ring-0{.peam-root &:focus-visible{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.peam-root .focus-visible\\\\:ring-\\\\[3px\\\\]{.peam-root &:focus-visible{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.peam-root .focus-visible\\\\:ring-destructive\\\\/20{.peam-root &:focus-visible{--tw-ring-color: var(--destructive);@supports (color: color-mix(in lab,red,red)){--tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent)}}}.peam-root .focus-visible\\\\:ring-ring\\\\/50{.peam-root &:focus-visible{--tw-ring-color: var(--ring);@supports (color: color-mix(in lab,red,red)){--tw-ring-color: color-mix(in oklab, var(--ring) 50%, transparent)}}}.peam-root .focus-visible\\\\:outline-1{.peam-root &:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}}.peam-root .active\\\\:scale-90{.peam-root &:active{--tw-scale-x: 90%;--tw-scale-y: 90%;--tw-scale-z: 90%;scale:var(--tw-scale-x) var(--tw-scale-y)}}.peam-root .disabled\\\\:pointer-events-none{.peam-root &:disabled{pointer-events:none}}.peam-root .disabled\\\\:cursor-not-allowed{.peam-root &:disabled{cursor:not-allowed}}.peam-root .disabled\\\\:opacity-50{.peam-root &:disabled{opacity:50%}}.peam-root .has-data-\\\\[slot\\\\=card-action\\\\]\\\\:grid-cols-\\\\[1fr_auto\\\\]{.peam-root &:has(*[data-slot=card-action]){grid-template-columns:1fr auto}}.peam-root .has-\\\\[\\\\[data-slot\\\\=input-group-control\\\\]\\\\:focus-visible\\\\]\\\\:border-ring{.peam-root &:has(*:is([data-slot=input-group-control]:focus-visible)){border-color:var(--ring)}}.peam-root .has-\\\\[\\\\[data-slot\\\\=input-group-control\\\\]\\\\:focus-visible\\\\]\\\\:ring-\\\\[3px\\\\]{.peam-root &:has(*:is([data-slot=input-group-control]:focus-visible)){--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.peam-root .has-\\\\[\\\\[data-slot\\\\=input-group-control\\\\]\\\\:focus-visible\\\\]\\\\:ring-ring\\\\/50{.peam-root &:has(*:is([data-slot=input-group-control]:focus-visible)){--tw-ring-color: var(--ring);@supports (color: color-mix(in lab,red,red)){--tw-ring-color: color-mix(in oklab, var(--ring) 50%, transparent)}}}.peam-root .has-\\\\[\\\\[data-slot\\\\]\\\\[aria-invalid\\\\=true\\\\]\\\\]\\\\:border-destructive{.peam-root &:has(*:is([data-slot][aria-invalid=true])){border-color:var(--destructive)}}.peam-root .has-\\\\[\\\\[data-slot\\\\]\\\\[aria-invalid\\\\=true\\\\]\\\\]\\\\:ring-destructive\\\\/20{.peam-root &:has(*:is([data-slot][aria-invalid=true])){--tw-ring-color: var(--destructive);@supports (color: color-mix(in lab,red,red)){--tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent)}}}.peam-root .has-\\\\[\\\\>\\\\[data-align\\\\=block-end\\\\]\\\\]\\\\:h-auto{.peam-root &:has(>[data-align=block-end]){height:auto}}.peam-root .has-\\\\[\\\\>\\\\[data-align\\\\=block-end\\\\]\\\\]\\\\:flex-col{.peam-root &:has(>[data-align=block-end]){flex-direction:column}}.peam-root .has-\\\\[\\\\>\\\\[data-align\\\\=block-start\\\\]\\\\]\\\\:h-auto{.peam-root &:has(>[data-align=block-start]){height:auto}}.peam-root .has-\\\\[\\\\>\\\\[data-align\\\\=block-start\\\\]\\\\]\\\\:flex-col{.peam-root &:has(>[data-align=block-start]){flex-direction:column}}.peam-root .has-\\\\[\\\\>\\\\[data-slot\\\\=button-group\\\\]\\\\]\\\\:gap-2{.peam-root &:has(>[data-slot=button-group]){gap:calc(var(--spacing) * 2)}}.peam-root .has-\\\\[\\\\>button\\\\]\\\\:mr-\\\\[-0\\\\.45rem\\\\]{.peam-root &:has(>button){margin-right:-.45rem}}.peam-root .has-\\\\[\\\\>button\\\\]\\\\:ml-\\\\[-0\\\\.45rem\\\\]{.peam-root &:has(>button){margin-left:-.45rem}}.peam-root .has-\\\\[\\\\>kbd\\\\]\\\\:mr-\\\\[-0\\\\.35rem\\\\]{.peam-root &:has(>kbd){margin-right:-.35rem}}.peam-root .has-\\\\[\\\\>kbd\\\\]\\\\:ml-\\\\[-0\\\\.35rem\\\\]{.peam-root &:has(>kbd){margin-left:-.35rem}}.peam-root .has-\\\\[\\\\>svg\\\\]\\\\:grid-cols-\\\\[calc\\\\(var\\\\(--spacing\\\\)\\\\*4\\\\)_1fr\\\\]{.peam-root &:has(>svg){grid-template-columns:calc(var(--spacing) * 4) 1fr}}.peam-root .has-\\\\[\\\\>svg\\\\]\\\\:gap-x-3{.peam-root &:has(>svg){column-gap:calc(var(--spacing) * 3)}}.peam-root .has-\\\\[\\\\>svg\\\\]\\\\:p-0{.peam-root &:has(>svg){padding:calc(var(--spacing) * 0)}}.peam-root .has-\\\\[\\\\>svg\\\\]\\\\:px-2{.peam-root &:has(>svg){padding-inline:calc(var(--spacing) * 2)}}.peam-root .has-\\\\[\\\\>svg\\\\]\\\\:px-2\\\\.5{.peam-root &:has(>svg){padding-inline:calc(var(--spacing) * 2.5)}}.peam-root .has-\\\\[\\\\>svg\\\\]\\\\:px-3{.peam-root &:has(>svg){padding-inline:calc(var(--spacing) * 3)}}.peam-root .has-\\\\[\\\\>svg\\\\]\\\\:px-4{.peam-root &:has(>svg){padding-inline:calc(var(--spacing) * 4)}}.peam-root .has-\\\\[\\\\>textarea\\\\]\\\\:h-auto{.peam-root &:has(>textarea){height:auto}}.peam-root .aria-expanded\\\\:bg-accent{.peam-root &[aria-expanded=true]{background-color:var(--accent)}}.peam-root .aria-expanded\\\\:text-foreground{.peam-root &[aria-expanded=true]{color:var(--foreground)}}.peam-root .aria-invalid\\\\:border-destructive{.peam-root &[aria-invalid=true]{border-color:var(--destructive)}}.peam-root .aria-invalid\\\\:ring-destructive\\\\/20{.peam-root &[aria-invalid=true]{--tw-ring-color: var(--destructive);@supports (color: color-mix(in lab,red,red)){--tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent)}}}.peam-root .data-\\\\[disabled\\\\]\\\\:pointer-events-none{.peam-root &[data-disabled]{pointer-events:none}}.peam-root .data-\\\\[disabled\\\\]\\\\:opacity-50{.peam-root &[data-disabled]{opacity:50%}}.peam-root .data-\\\\[disabled\\\\=true\\\\]\\\\:pointer-events-none{.peam-root &[data-disabled=true]{pointer-events:none}}.peam-root .data-\\\\[disabled\\\\=true\\\\]\\\\:opacity-50{.peam-root &[data-disabled=true]{opacity:50%}}.peam-root .data-\\\\[inset\\\\]\\\\:pl-8{.peam-root &[data-inset]{padding-left:calc(var(--spacing) * 8)}}.peam-root .data-\\\\[orientation\\\\=horizontal\\\\]\\\\:h-px{.peam-root &[data-orientation=horizontal]{height:1px}}.peam-root .data-\\\\[orientation\\\\=horizontal\\\\]\\\\:w-full{.peam-root &[data-orientation=horizontal]{width:100%}}.peam-root .data-\\\\[orientation\\\\=vertical\\\\]\\\\:h-auto{.peam-root &[data-orientation=vertical]{height:auto}}.peam-root .data-\\\\[orientation\\\\=vertical\\\\]\\\\:h-full{.peam-root &[data-orientation=vertical]{height:100%}}.peam-root .data-\\\\[orientation\\\\=vertical\\\\]\\\\:w-px{.peam-root &[data-orientation=vertical]{width:1px}}.peam-root .data-\\\\[placeholder\\\\]\\\\:text-muted-foreground{.peam-root &[data-placeholder]{color:var(--muted-foreground)}}.peam-root .data-\\\\[selected\\\\=true\\\\]\\\\:bg-accent{.peam-root &[data-selected=true]{background-color:var(--accent)}}.peam-root .data-\\\\[selected\\\\=true\\\\]\\\\:text-accent-foreground{.peam-root &[data-selected=true]{color:var(--accent-foreground)}}.peam-root .data-\\\\[side\\\\=bottom\\\\]\\\\:translate-y-1{.peam-root &[data-side=bottom]{--tw-translate-y: calc(var(--spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}}.peam-root .data-\\\\[side\\\\=bottom\\\\]\\\\:slide-in-from-top-2{.peam-root &[data-side=bottom]{--tw-enter-translate-y: calc(2*var(--spacing)*-1)}}.peam-root .data-\\\\[side\\\\=left\\\\]\\\\:-translate-x-1{.peam-root &[data-side=left]{--tw-translate-x: calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}}.peam-root .data-\\\\[side\\\\=left\\\\]\\\\:slide-in-from-right-2{.peam-root &[data-side=left]{--tw-enter-translate-x: calc(2*var(--spacing))}}.peam-root .data-\\\\[side\\\\=right\\\\]\\\\:translate-x-1{.peam-root &[data-side=right]{--tw-translate-x: calc(var(--spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}}.peam-root .data-\\\\[side\\\\=right\\\\]\\\\:slide-in-from-left-2{.peam-root &[data-side=right]{--tw-enter-translate-x: calc(2*var(--spacing)*-1)}}.peam-root .data-\\\\[side\\\\=top\\\\]\\\\:-translate-y-1{.peam-root &[data-side=top]{--tw-translate-y: calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}}.peam-root .data-\\\\[side\\\\=top\\\\]\\\\:slide-in-from-bottom-2{.peam-root &[data-side=top]{--tw-enter-translate-y: calc(2*var(--spacing))}}.peam-root .data-\\\\[size\\\\=default\\\\]\\\\:h-9{.peam-root &[data-size=default]{height:calc(var(--spacing) * 9)}}.peam-root .data-\\\\[size\\\\=sm\\\\]\\\\:h-8{.peam-root &[data-size=sm]{height:calc(var(--spacing) * 8)}}.peam-root .\\\\*\\\\:data-\\\\[slot\\\\=alert-description\\\\]\\\\:text-destructive\\\\/90{.peam-root :is(&>*){.peam-root &[data-slot=alert-description]{color:var(--destructive);@supports (color: color-mix(in lab,red,red)){color:color-mix(in oklab,var(--destructive) 90%,transparent)}}}}.peam-root .\\\\*\\\\*\\\\:data-\\\\[slot\\\\=command-input-wrapper\\\\]\\\\:h-12{.peam-root :is(& *){.peam-root &[data-slot=command-input-wrapper]{height:calc(var(--spacing) * 12)}}}.peam-root .\\\\*\\\\*\\\\:data-\\\\[slot\\\\=command-input-wrapper\\\\]\\\\:h-auto{.peam-root :is(& *){.peam-root &[data-slot=command-input-wrapper]{height:auto}}}.peam-root .\\\\*\\\\:data-\\\\[slot\\\\=select-value\\\\]\\\\:line-clamp-1{.peam-root :is(&>*){.peam-root &[data-slot=select-value]{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}}}.peam-root .\\\\*\\\\:data-\\\\[slot\\\\=select-value\\\\]\\\\:flex{.peam-root :is(&>*){.peam-root &[data-slot=select-value]{display:flex}}}.peam-root .\\\\*\\\\:data-\\\\[slot\\\\=select-value\\\\]\\\\:items-center{.peam-root :is(&>*){.peam-root &[data-slot=select-value]{align-items:center}}}.peam-root .\\\\*\\\\:data-\\\\[slot\\\\=select-value\\\\]\\\\:gap-2{.peam-root :is(&>*){.peam-root &[data-slot=select-value]{gap:calc(var(--spacing) * 2)}}}.peam-root .data-\\\\[state\\\\=closed\\\\]\\\\:animate-out{.peam-root &[data-state=closed]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}}.peam-root .data-\\\\[state\\\\=closed\\\\]\\\\:fade-out-0{.peam-root &[data-state=closed]{--tw-exit-opacity: 0 ;--tw-exit-opacity: 0}}.peam-root .data-\\\\[state\\\\=closed\\\\]\\\\:zoom-out-95{.peam-root &[data-state=closed]{--tw-exit-scale: 95% ;--tw-exit-scale: .95}}.peam-root .data-\\\\[state\\\\=closed\\\\]\\\\:slide-out-to-top-2{.peam-root &[data-state=closed]{--tw-exit-translate-y: calc(2*var(--spacing)*-1)}}.peam-root .data-\\\\[state\\\\=open\\\\]\\\\:animate-in{.peam-root &[data-state=open]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}}.peam-root .data-\\\\[state\\\\=open\\\\]\\\\:bg-accent{.peam-root &[data-state=open]{background-color:var(--accent)}}.peam-root .data-\\\\[state\\\\=open\\\\]\\\\:text-accent-foreground{.peam-root &[data-state=open]{color:var(--accent-foreground)}}.peam-root .data-\\\\[state\\\\=open\\\\]\\\\:text-muted-foreground{.peam-root &[data-state=open]{color:var(--muted-foreground)}}.peam-root .data-\\\\[state\\\\=open\\\\]\\\\:fade-in-0{.peam-root &[data-state=open]{--tw-enter-opacity: 0 ;--tw-enter-opacity: 0}}.peam-root .data-\\\\[state\\\\=open\\\\]\\\\:zoom-in-95{.peam-root &[data-state=open]{--tw-enter-scale: 95% ;--tw-enter-scale: .95}}.peam-root .data-\\\\[state\\\\=open\\\\]\\\\:slide-in-from-top-2{.peam-root &[data-state=open]{--tw-enter-translate-y: calc(2*var(--spacing)*-1)}}.peam-root .data-\\\\[variant\\\\=destructive\\\\]\\\\:text-destructive{.peam-root &[data-variant=destructive]{color:var(--destructive)}}.peam-root .data-\\\\[variant\\\\=destructive\\\\]\\\\:focus\\\\:bg-destructive\\\\/10{.peam-root &[data-variant=destructive]{.peam-root &:focus{background-color:var(--destructive);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--destructive) 10%,transparent)}}}}.peam-root .data-\\\\[variant\\\\=destructive\\\\]\\\\:focus\\\\:text-destructive{.peam-root &[data-variant=destructive]{.peam-root &:focus{color:var(--destructive)}}}.peam-root .sm\\\\:max-w-lg{@media(width>=40rem){max-width:var(--container-lg)}}.peam-root .sm\\\\:flex-row{@media(width>=40rem){flex-direction:row}}.peam-root .sm\\\\:justify-end{@media(width>=40rem){justify-content:flex-end}}.peam-root .sm\\\\:text-left{@media(width>=40rem){text-align:left}}.peam-root .md\\\\:inset-auto{@media(width>=48rem){inset:auto}}.peam-root .md\\\\:top-0{@media(width>=48rem){top:calc(var(--spacing) * 0)}}.peam-root .md\\\\:right-0{@media(width>=48rem){right:calc(var(--spacing) * 0)}}.peam-root .md\\\\:right-4{@media(width>=48rem){right:calc(var(--spacing) * 4)}}.peam-root .md\\\\:bottom-4{@media(width>=48rem){bottom:calc(var(--spacing) * 4)}}.peam-root .md\\\\:bottom-18{@media(width>=48rem){bottom:calc(var(--spacing) * 18)}}.peam-root .md\\\\:hidden{@media(width>=48rem){display:none}}.peam-root .md\\\\:h-125{@media(width>=48rem){height:calc(var(--spacing) * 125)}}.peam-root .md\\\\:h-150{@media(width>=48rem){height:calc(var(--spacing) * 150)}}.peam-root .md\\\\:h-full{@media(width>=48rem){height:100%}}.peam-root .md\\\\:w-100{@media(width>=48rem){width:calc(var(--spacing) * 100)}}.peam-root .md\\\\:rounded-sm{@media(width>=48rem){border-radius:calc(var(--radius) - 4px)}}.peam-root .md\\\\:border{@media(width>=48rem){border-style:var(--tw-border-style);border-width:1px}}.peam-root .md\\\\:border-t-0{@media(width>=48rem){border-top-style:var(--tw-border-style);border-top-width:0px}}.peam-root .md\\\\:border-l{@media(width>=48rem){border-left-style:var(--tw-border-style);border-left-width:1px}}.peam-root .md\\\\:p-0{@media(width>=48rem){padding:calc(var(--spacing) * 0)}}.peam-root .md\\\\:text-sm{@media(width>=48rem){font-size:var(--text-sm);line-height:var(--tw-leading, var(--text-sm--line-height))}}.peam-root .md\\\\:shadow-2xl{@media(width>=48rem){--tw-shadow: 0 25px 50px -12px var(--tw-shadow-color, rgb(0 0 0 / .25));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.peam-root .md\\\\:shadow-xl{@media(width>=48rem){--tw-shadow: 0 20px 25px -5px var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 8px 10px -6px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.peam-root .md\\\\:duration-0{@media(width>=48rem){--tw-duration: 0ms;transition-duration:0ms}}.peam-root .md\\\\:slide-in-from-right{@media(width>=48rem){--tw-enter-translate-x: 100%}}.peam-root .lg\\\\:w-120{@media(width>=64rem){width:calc(var(--spacing) * 120)}}.peam-root .dark\\\\:block{.peam-root &:is(.dark *){display:block}}.peam-root .dark\\\\:hidden{.peam-root &:is(.dark *){display:none}}.peam-root .dark\\\\:border-input{.peam-root &:is(.dark *){border-color:var(--input)}}.peam-root .dark\\\\:bg-\\\\(--shiki-dark-bg\\\\)\\\\!{.peam-root &:is(.dark *){background-color:var(--shiki-dark-bg)!important}}.peam-root .dark\\\\:bg-destructive\\\\/60{.peam-root &:is(.dark *){background-color:var(--destructive);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--destructive) 60%,transparent)}}}.peam-root .dark\\\\:bg-input\\\\/30{.peam-root &:is(.dark *){background-color:var(--input);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--input) 30%,transparent)}}}.peam-root .dark\\\\:bg-transparent{.peam-root &:is(.dark *){background-color:transparent}}.peam-root .dark\\\\:text-\\\\(--shiki-dark\\\\)\\\\!{.peam-root &:is(.dark *){color:var(--shiki-dark)!important}}.peam-root .dark\\\\:invert{.peam-root &:is(.dark *){--tw-invert: invert(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}}.peam-root .dark\\\\:hover\\\\:bg-accent\\\\/50{.peam-root &:is(.dark *){.peam-root &:hover{@media(hover:hover){background-color:var(--accent);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--accent) 50%,transparent)}}}}}.peam-root .dark\\\\:hover\\\\:bg-input\\\\/50{.peam-root &:is(.dark *){.peam-root &:hover{@media(hover:hover){background-color:var(--input);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--input) 50%,transparent)}}}}}.peam-root .dark\\\\:focus-visible\\\\:ring-destructive\\\\/40{.peam-root &:is(.dark *){.peam-root &:focus-visible{--tw-ring-color: var(--destructive);@supports (color: color-mix(in lab,red,red)){--tw-ring-color: color-mix(in oklab, var(--destructive) 40%, transparent)}}}}.peam-root .dark\\\\:has-\\\\[\\\\[data-slot\\\\]\\\\[aria-invalid\\\\=true\\\\]\\\\]\\\\:ring-destructive\\\\/40{.peam-root &:is(.dark *){.peam-root &:has(*:is([data-slot][aria-invalid=true])){--tw-ring-color: var(--destructive);@supports (color: color-mix(in lab,red,red)){--tw-ring-color: color-mix(in oklab, var(--destructive) 40%, transparent)}}}}.peam-root .dark\\\\:aria-invalid\\\\:ring-destructive\\\\/40{.peam-root &:is(.dark *){.peam-root &[aria-invalid=true]{--tw-ring-color: var(--destructive);@supports (color: color-mix(in lab,red,red)){--tw-ring-color: color-mix(in oklab, var(--destructive) 40%, transparent)}}}}.peam-root .dark\\\\:data-\\\\[variant\\\\=destructive\\\\]\\\\:focus\\\\:bg-destructive\\\\/20{.peam-root &:is(.dark *){.peam-root &[data-variant=destructive]{.peam-root &:focus{background-color:var(--destructive);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--destructive) 20%,transparent)}}}}}.peam-root .starting\\\\:opacity-0{@starting-style{opacity:0%}}.peam-root .\\\\[\\\\&_\\\\[cmdk-group-heading\\\\]\\\\]\\\\:px-2{.peam-root & [cmdk-group-heading]{padding-inline:calc(var(--spacing) * 2)}}.peam-root .\\\\[\\\\&_\\\\[cmdk-group-heading\\\\]\\\\]\\\\:py-1\\\\.5{.peam-root & [cmdk-group-heading]{padding-block:calc(var(--spacing) * 1.5)}}.peam-root .\\\\[\\\\&_\\\\[cmdk-group-heading\\\\]\\\\]\\\\:text-xs{.peam-root & [cmdk-group-heading]{font-size:var(--text-xs);line-height:var(--tw-leading, var(--text-xs--line-height))}}.peam-root .\\\\[\\\\&_\\\\[cmdk-group-heading\\\\]\\\\]\\\\:font-medium{.peam-root & [cmdk-group-heading]{--tw-font-weight: var(--font-weight-medium);font-weight:var(--font-weight-medium)}}.peam-root .\\\\[\\\\&_\\\\[cmdk-group-heading\\\\]\\\\]\\\\:text-muted-foreground{.peam-root & [cmdk-group-heading]{color:var(--muted-foreground)}}.peam-root .\\\\[\\\\&_\\\\[cmdk-group\\\\]\\\\]\\\\:px-2{.peam-root & [cmdk-group]{padding-inline:calc(var(--spacing) * 2)}}.peam-root .\\\\[\\\\&_\\\\[cmdk-group\\\\]\\\\:not\\\\(\\\\[hidden\\\\]\\\\)_\\\\~\\\\[cmdk-group\\\\]\\\\]\\\\:pt-0{.peam-root & [cmdk-group]:not([hidden])~[cmdk-group]{padding-top:calc(var(--spacing) * 0)}}.peam-root .\\\\[\\\\&_\\\\[cmdk-input-wrapper\\\\]_svg\\\\]\\\\:h-5{.peam-root & [cmdk-input-wrapper] svg{height:calc(var(--spacing) * 5)}}.peam-root .\\\\[\\\\&_\\\\[cmdk-input-wrapper\\\\]_svg\\\\]\\\\:w-5{.peam-root & [cmdk-input-wrapper] svg{width:calc(var(--spacing) * 5)}}.peam-root .\\\\[\\\\&_\\\\[cmdk-input\\\\]\\\\]\\\\:h-12{.peam-root & [cmdk-input]{height:calc(var(--spacing) * 12)}}.peam-root .\\\\[\\\\&_\\\\[cmdk-item\\\\]\\\\]\\\\:px-2{.peam-root & [cmdk-item]{padding-inline:calc(var(--spacing) * 2)}}.peam-root .\\\\[\\\\&_\\\\[cmdk-item\\\\]\\\\]\\\\:py-3{.peam-root & [cmdk-item]{padding-block:calc(var(--spacing) * 3)}}.peam-root .\\\\[\\\\&_\\\\[cmdk-item\\\\]_svg\\\\]\\\\:h-5{.peam-root & [cmdk-item] svg{height:calc(var(--spacing) * 5)}}.peam-root .\\\\[\\\\&_\\\\[cmdk-item\\\\]_svg\\\\]\\\\:w-5{.peam-root & [cmdk-item] svg{width:calc(var(--spacing) * 5)}}.peam-root .\\\\[\\\\&_code\\\\]\\\\:font-mono{.peam-root & code{font-family:var(--font-mono)}}.peam-root .\\\\[\\\\&_code\\\\]\\\\:text-sm{.peam-root & code{font-size:var(--text-sm);line-height:var(--tw-leading, var(--text-sm--line-height))}}.peam-root .\\\\[\\\\&_p\\\\]\\\\:leading-relaxed{.peam-root & p{--tw-leading: var(--leading-relaxed);line-height:var(--leading-relaxed)}}.peam-root .\\\\[\\\\&_svg\\\\]\\\\:pointer-events-none{.peam-root & svg{pointer-events:none}}.peam-root .\\\\[\\\\&_svg\\\\]\\\\:h-auto{.peam-root & svg{height:auto}}.peam-root .\\\\[\\\\&_svg\\\\]\\\\:w-auto{.peam-root & svg{width:auto}}.peam-root .\\\\[\\\\&_svg\\\\]\\\\:shrink-0{.peam-root & svg{flex-shrink:0}}.peam-root .\\\\[\\\\&_svg\\\\:not\\\\(\\\\[class\\\\*\\\\=\\\\'size-\\\\'\\\\]\\\\)\\\\]\\\\:size-4{.peam-root & svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}}.peam-root .\\\\[\\\\&_svg\\\\:not\\\\(\\\\[class\\\\*\\\\=\\\\'text-\\\\'\\\\]\\\\)\\\\]\\\\:text-muted-foreground{.peam-root & svg:not([class*=text-]){color:var(--muted-foreground)}}.peam-root .\\\\[\\\\&_table\\\\]\\\\:w-full{.peam-root & table{width:100%}}.peam-root .\\\\[\\\\.border-b\\\\]\\\\:pb-3{.peam-root &:is(.border-b){padding-bottom:calc(var(--spacing) * 3)}}.peam-root .\\\\[\\\\.border-b\\\\]\\\\:pb-6{.peam-root &:is(.border-b){padding-bottom:calc(var(--spacing) * 6)}}.peam-root .\\\\[\\\\.border-t\\\\]\\\\:pt-3{.peam-root &:is(.border-t){padding-top:calc(var(--spacing) * 3)}}.peam-root .\\\\[\\\\.border-t\\\\]\\\\:pt-6{.peam-root &:is(.border-t){padding-top:calc(var(--spacing) * 6)}}.peam-root .\\\\*\\\\:\\\\[span\\\\]\\\\:last\\\\:flex{.peam-root :is(&>*){.peam-root &:is(span){.peam-root &:last-child{display:flex}}}}.peam-root .\\\\*\\\\:\\\\[span\\\\]\\\\:last\\\\:items-center{.peam-root :is(&>*){.peam-root &:is(span){.peam-root &:last-child{align-items:center}}}}.peam-root .\\\\*\\\\:\\\\[span\\\\]\\\\:last\\\\:gap-2{.peam-root :is(&>*){.peam-root &:is(span){.peam-root &:last-child{gap:calc(var(--spacing) * 2)}}}}.peam-root .data-\\\\[variant\\\\=destructive\\\\]\\\\:\\\\*\\\\:\\\\[svg\\\\]\\\\:\\\\!text-destructive{.peam-root &[data-variant=destructive]{.peam-root :is(&>*){.peam-root &:is(svg){color:var(--destructive)!important}}}}.peam-root .\\\\[\\\\&\\\\>\\\\*\\\\]\\\\:focus-visible\\\\:relative{.peam-root &>*{.peam-root &:focus-visible{position:relative}}}.peam-root .\\\\[\\\\&\\\\>\\\\*\\\\]\\\\:focus-visible\\\\:z-10{.peam-root &>*{.peam-root &:focus-visible{z-index:10}}}.peam-root .\\\\[\\\\&\\\\>\\\\*\\\\:first-child\\\\]\\\\:mt-0{.peam-root &>*:first-child{margin-top:calc(var(--spacing) * 0)}}.peam-root .\\\\[\\\\&\\\\>\\\\*\\\\:last-child\\\\]\\\\:mb-0{.peam-root &>*:last-child{margin-bottom:calc(var(--spacing) * 0)}}.peam-root .\\\\[\\\\&\\\\>\\\\*\\\\:not\\\\(\\\\:first-child\\\\)\\\\]\\\\:rounded-t-none{.peam-root &>*:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}}.peam-root .\\\\[\\\\&\\\\>\\\\*\\\\:not\\\\(\\\\:first-child\\\\)\\\\]\\\\:rounded-l-md{.peam-root &>*:not(:first-child){border-top-left-radius:calc(var(--radius) - 2px);border-bottom-left-radius:calc(var(--radius) - 2px)}}.peam-root .\\\\[\\\\&\\\\>\\\\*\\\\:not\\\\(\\\\:first-child\\\\)\\\\]\\\\:rounded-l-none{.peam-root &>*:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}}.peam-root .\\\\[\\\\&\\\\>\\\\*\\\\:not\\\\(\\\\:first-child\\\\)\\\\]\\\\:border-t-0{.peam-root &>*:not(:first-child){border-top-style:var(--tw-border-style);border-top-width:0px}}.peam-root .\\\\[\\\\&\\\\>\\\\*\\\\:not\\\\(\\\\:first-child\\\\)\\\\]\\\\:border-l-0{.peam-root &>*:not(:first-child){border-left-style:var(--tw-border-style);border-left-width:0px}}.peam-root .\\\\[\\\\&\\\\>\\\\*\\\\:not\\\\(\\\\:last-child\\\\)\\\\]\\\\:rounded-r-md{.peam-root &>*:not(:last-child){border-top-right-radius:calc(var(--radius) - 2px);border-bottom-right-radius:calc(var(--radius) - 2px)}}.peam-root .\\\\[\\\\&\\\\>\\\\*\\\\:not\\\\(\\\\:last-child\\\\)\\\\]\\\\:rounded-r-none{.peam-root &>*:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}}.peam-root .\\\\[\\\\&\\\\>\\\\*\\\\:not\\\\(\\\\:last-child\\\\)\\\\]\\\\:rounded-b-none{.peam-root &>*:not(:last-child){border-bottom-right-radius:0;border-bottom-left-radius:0}}.peam-root .has-\\\\[select\\\\[aria-hidden\\\\=true\\\\]\\\\:last-child\\\\]\\\\:\\\\[\\\\&\\\\>\\\\[data-slot\\\\=select-trigger\\\\]\\\\:last-of-type\\\\]\\\\:rounded-r-md{.peam-root &:has(*:is(select[aria-hidden=true]:last-child)){.peam-root &>[data-slot=select-trigger]:last-of-type{border-top-right-radius:calc(var(--radius) - 2px);border-bottom-right-radius:calc(var(--radius) - 2px)}}}.peam-root .\\\\[\\\\&\\\\>\\\\[data-slot\\\\=select-trigger\\\\]\\\\:not\\\\(\\\\[class\\\\*\\\\=\\\\'w-\\\\'\\\\]\\\\)\\\\]\\\\:w-fit{.peam-root &>[data-slot=select-trigger]:not([class*=w-]){width:fit-content}}.peam-root .\\\\[\\\\&\\\\>button\\\\]\\\\:rounded-md{.peam-root &>button{border-radius:calc(var(--radius) - 2px)}}.peam-root .\\\\[\\\\&\\\\>button\\\\]\\\\:border-none\\\\!{.peam-root &>button{--tw-border-style: none !important;border-style:none!important}}.peam-root .\\\\[\\\\&\\\\>button\\\\]\\\\:bg-transparent\\\\!{.peam-root &>button{background-color:transparent!important}}.peam-root .\\\\[\\\\&\\\\>button\\\\]\\\\:hover\\\\:bg-secondary\\\\!{.peam-root &>button{.peam-root &:hover{@media(hover:hover){background-color:var(--secondary)!important}}}}.peam-root .\\\\[\\\\&\\\\>div\\\\]\\\\:h-full{.peam-root &>div{height:100%}}.peam-root .\\\\[\\\\&\\\\>div\\\\]\\\\:overflow-hidden{.peam-root &>div{overflow:hidden}}.peam-root .\\\\[\\\\&\\\\>div\\\\]\\\\:pb-0{.peam-root &>div{padding-bottom:calc(var(--spacing) * 0)}}.peam-root .\\\\[\\\\&\\\\>img\\\\]\\\\:rounded-full{.peam-root &>img{border-radius:calc(infinity * 1px)}}.peam-root .\\\\[\\\\&\\\\>img\\\\]\\\\:bg-background{.peam-root &>img{background-color:var(--background)}}.peam-root .\\\\[\\\\&\\\\>img\\\\]\\\\:p-px{.peam-root &>img{padding:1px}}.peam-root .\\\\[\\\\&\\\\>img\\\\]\\\\:ring-1{.peam-root &>img{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.peam-root .dark\\\\:\\\\[\\\\&\\\\>img\\\\]\\\\:bg-foreground{.peam-root &:is(.dark *){.peam-root &>img{background-color:var(--foreground)}}}.peam-root .\\\\[\\\\&\\\\>input\\\\]\\\\:flex-1{.peam-root &>input{flex:1}}.peam-root .has-\\\\[\\\\>\\\\[data-align\\\\=block-end\\\\]\\\\]\\\\:\\\\[\\\\&\\\\>input\\\\]\\\\:pt-3{.peam-root &:has(>[data-align=block-end]){.peam-root &>input{padding-top:calc(var(--spacing) * 3)}}}.peam-root .has-\\\\[\\\\>\\\\[data-align\\\\=block-start\\\\]\\\\]\\\\:\\\\[\\\\&\\\\>input\\\\]\\\\:pb-3{.peam-root &:has(>[data-align=block-start]){.peam-root &>input{padding-bottom:calc(var(--spacing) * 3)}}}.peam-root .has-\\\\[\\\\>\\\\[data-align\\\\=inline-end\\\\]\\\\]\\\\:\\\\[\\\\&\\\\>input\\\\]\\\\:pr-2{.peam-root &:has(>[data-align=inline-end]){.peam-root &>input{padding-right:calc(var(--spacing) * 2)}}}.peam-root .has-\\\\[\\\\>\\\\[data-align\\\\=inline-start\\\\]\\\\]\\\\:\\\\[\\\\&\\\\>input\\\\]\\\\:pl-2{.peam-root &:has(>[data-align=inline-start]){.peam-root &>input{padding-left:calc(var(--spacing) * 2)}}}.peam-root .\\\\[\\\\&\\\\>kbd\\\\]\\\\:rounded-\\\\[calc\\\\(var\\\\(--radius\\\\)-5px\\\\)\\\\]{.peam-root &>kbd{border-radius:calc(var(--radius) - 5px)}}.peam-root .\\\\[\\\\&\\\\>p\\\\]\\\\:inline{.peam-root &>p{display:inline}}.peam-root .\\\\[\\\\&\\\\>pre\\\\]\\\\:m-0{.peam-root &>pre{margin:calc(var(--spacing) * 0)}}.peam-root .\\\\[\\\\&\\\\>pre\\\\]\\\\:bg-background\\\\!{.peam-root &>pre{background-color:var(--background)!important}}.peam-root .\\\\[\\\\&\\\\>pre\\\\]\\\\:p-4{.peam-root &>pre{padding:calc(var(--spacing) * 4)}}.peam-root .\\\\[\\\\&\\\\>pre\\\\]\\\\:text-sm{.peam-root &>pre{font-size:var(--text-sm);line-height:var(--tw-leading, var(--text-sm--line-height))}}.peam-root .\\\\[\\\\&\\\\>pre\\\\]\\\\:text-foreground\\\\!{.peam-root &>pre{color:var(--foreground)!important}}.peam-root .\\\\[\\\\&\\\\>svg\\\\]\\\\:pointer-events-none{.peam-root &>svg{pointer-events:none}}.peam-root .\\\\[\\\\&\\\\>svg\\\\]\\\\:size-2\\\\.5{.peam-root &>svg{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}}.peam-root .\\\\[\\\\&\\\\>svg\\\\]\\\\:size-3{.peam-root &>svg{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}}.peam-root .\\\\[\\\\&\\\\>svg\\\\]\\\\:size-4{.peam-root &>svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}}.peam-root .\\\\[\\\\&\\\\>svg\\\\]\\\\:translate-y-0\\\\.5{.peam-root &>svg{--tw-translate-y: calc(var(--spacing) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}}.peam-root .\\\\[\\\\&\\\\>svg\\\\]\\\\:text-current{.peam-root &>svg{color:currentcolor}}.peam-root .\\\\[\\\\&\\\\>svg\\\\:not\\\\(\\\\[class\\\\*\\\\=\\\\'size-\\\\'\\\\]\\\\)\\\\]\\\\:size-3\\\\.5{.peam-root &>svg:not([class*=size-]){width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}}.peam-root .\\\\[\\\\&\\\\>svg\\\\:not\\\\(\\\\[class\\\\*\\\\=\\\\'size-\\\\'\\\\]\\\\)\\\\]\\\\:size-4{.peam-root &>svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}}.peam-root .\\\\[a\\\\&\\\\]\\\\:hover\\\\:bg-accent{.peam-root a&{.peam-root &:hover{@media(hover:hover){background-color:var(--accent)}}}}.peam-root .\\\\[a\\\\&\\\\]\\\\:hover\\\\:bg-destructive\\\\/90{.peam-root a&{.peam-root &:hover{@media(hover:hover){background-color:var(--destructive);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--destructive) 90%,transparent)}}}}}.peam-root .\\\\[a\\\\&\\\\]\\\\:hover\\\\:bg-primary\\\\/90{.peam-root a&{.peam-root &:hover{@media(hover:hover){background-color:var(--primary);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--primary) 90%,transparent)}}}}}.peam-root .\\\\[a\\\\&\\\\]\\\\:hover\\\\:bg-secondary\\\\/90{.peam-root a&{.peam-root &:hover{@media(hover:hover){background-color:var(--secondary);@supports (color: color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--secondary) 90%,transparent)}}}}}.peam-root .\\\\[a\\\\&\\\\]\\\\:hover\\\\:text-accent-foreground{.peam-root a&{.peam-root &:hover{@media(hover:hover){color:var(--accent-foreground)}}}}@property --tw-animation-delay{syntax: \\\"*\\\"; inherits: false; initial-value: 0s;}@property --tw-animation-direction{syntax: \\\"*\\\"; inherits: false; initial-value: normal;}@property --tw-animation-duration{syntax: \\\"*\\\"; inherits: false;}@property --tw-animation-fill-mode{syntax: \\\"*\\\"; inherits: false; initial-value: none;}@property --tw-animation-iteration-count{syntax: \\\"*\\\"; inherits: false; initial-value: 1;}@property --tw-enter-blur{syntax: \\\"*\\\"; inherits: false; initial-value: 0;}@property --tw-enter-opacity{syntax: \\\"*\\\"; inherits: false; initial-value: 1;}@property --tw-enter-rotate{syntax: \\\"*\\\"; inherits: false; initial-value: 0;}@property --tw-enter-scale{syntax: \\\"*\\\"; inherits: false; initial-value: 1;}@property --tw-enter-translate-x{syntax: \\\"*\\\"; inherits: false; initial-value: 0;}@property --tw-enter-translate-y{syntax: \\\"*\\\"; inherits: false; initial-value: 0;}@property --tw-exit-blur{syntax: \\\"*\\\"; inherits: false; initial-value: 0;}@property --tw-exit-opacity{syntax: \\\"*\\\"; inherits: false; initial-value: 1;}@property --tw-exit-rotate{syntax: \\\"*\\\"; inherits: false; initial-value: 0;}@property --tw-exit-scale{syntax: \\\"*\\\"; inherits: false; initial-value: 1;}@property --tw-exit-translate-x{syntax: \\\"*\\\"; inherits: false; initial-value: 0;}@property --tw-exit-translate-y{syntax: \\\"*\\\"; inherits: false; initial-value: 0;}.peam-root{--background: oklch(1 0 0);--foreground: oklch(.145 0 0);--card: oklch(1 0 0);--card-foreground: oklch(.145 0 0);--popover: oklch(1 0 0);--popover-foreground: oklch(.145 0 0);--primary: oklch(57.61% .2508 258.23);--primary-foreground: oklch(1 0 0);--secondary: oklch(.97 0 0);--secondary-foreground: oklch(.205 0 0);--muted: oklch(.97 0 0);--muted-foreground: oklch(.556 0 0);--accent: oklch(.97 0 0);--accent-foreground: oklch(.205 0 0);--destructive: oklch(.732 .218 27.994);--destructive-foreground: oklch(.577 .245 27.325);--border: oklch(.85 0 0);--input: oklch(.85 0 0);--ring: oklch(.708 0 0);--chart-1: oklch(.646 .222 41.116);--chart-2: oklch(.6 .118 184.704);--chart-3: oklch(.398 .07 227.392);--chart-4: oklch(.828 .189 84.429);--chart-5: oklch(.769 .188 70.08);--radius: .625rem;--sidebar: oklch(.985 0 0);--sidebar-foreground: oklch(.145 0 0);--sidebar-primary: oklch(.205 0 0);--sidebar-primary-foreground: oklch(.985 0 0);--sidebar-accent: oklch(.97 0 0);--sidebar-accent-foreground: oklch(.205 0 0);--sidebar-border: oklch(.922 0 0);--sidebar-ring: oklch(.708 0 0)}@media(prefers-color-scheme:dark){.peam-root{--background: oklch(.145 0 0);--foreground: oklch(.985 0 0);--card: oklch(.205 0 0);--card-foreground: oklch(.985 0 0);--popover: oklch(.205 0 0);--popover-foreground: oklch(.985 0 0);--primary: oklch(57.61% .2508 258.23);--primary-foreground: oklch(1 0 0);--secondary: oklch(.269 0 0);--secondary-foreground: oklch(.985 0 0);--muted: oklch(.269 0 0);--muted-foreground: oklch(.708 0 0);--accent: oklch(.269 0 0);--accent-foreground: oklch(.985 0 0);--destructive: oklch(.704 .191 22.216);--destructive-foreground: oklch(.637 .237 25.331);--border: oklch(1 0 0 / 20%);--input: oklch(1 0 0 / 20%);--ring: oklch(.556 0 0);--chart-1: oklch(.488 .243 264.376);--chart-2: oklch(.696 .17 162.48);--chart-3: oklch(.769 .188 70.08);--chart-4: oklch(.627 .265 303.9);--chart-5: oklch(.645 .246 16.439);--sidebar: oklch(.205 0 0);--sidebar-foreground: oklch(.985 0 0);--sidebar-primary: oklch(.488 .243 264.376);--sidebar-primary-foreground: oklch(.985 0 0);--sidebar-accent: oklch(.269 0 0);--sidebar-accent-foreground: oklch(.985 0 0);--sidebar-border: oklch(1 0 0 / 10%);--sidebar-ring: oklch(.556 0 0)}}@layer base{.peam-root *{border-color:var(--border);outline-color:var(--ring);@supports (color: color-mix(in lab,red,red)){outline-color:color-mix(in oklab,var(--ring) 50%,transparent)}}.peam-root{background-color:var(--background);color:var(--foreground)}.peam-root button:not(:disabled),.peam-root [role=button]:not(:disabled){cursor:pointer}}@property --tw-translate-x{syntax: \\\"*\\\"; inherits: false; initial-value: 0;}@property --tw-translate-y{syntax: \\\"*\\\"; inherits: false; initial-value: 0;}@property --tw-translate-z{syntax: \\\"*\\\"; inherits: false; initial-value: 0;}@property --tw-rotate-x{syntax: \\\"*\\\"; inherits: false;}@property --tw-rotate-y{syntax: \\\"*\\\"; inherits: false;}@property --tw-rotate-z{syntax: \\\"*\\\"; inherits: false;}@property --tw-skew-x{syntax: \\\"*\\\"; inherits: false;}@property --tw-skew-y{syntax: \\\"*\\\"; inherits: false;}@property --tw-space-y-reverse{syntax: \\\"*\\\"; inherits: false; initial-value: 0;}@property --tw-space-x-reverse{syntax: \\\"*\\\"; inherits: false; initial-value: 0;}@property --tw-divide-y-reverse{syntax: \\\"*\\\"; inherits: false; initial-value: 0;}@property --tw-border-style{syntax: \\\"*\\\"; inherits: false; initial-value: solid;}@property --tw-leading{syntax: \\\"*\\\"; inherits: false;}@property --tw-font-weight{syntax: \\\"*\\\"; inherits: false;}@property --tw-tracking{syntax: \\\"*\\\"; inherits: false;}@property --tw-shadow{syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \\\"*\\\"; inherits: false;}@property --tw-shadow-alpha{syntax: \\\"<percentage>\\\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \\\"*\\\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \\\"<percentage>\\\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \\\"*\\\"; inherits: false;}@property --tw-ring-shadow{syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \\\"*\\\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \\\"*\\\"; inherits: false;}@property --tw-ring-offset-width{syntax: \\\"<length>\\\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \\\"*\\\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-outline-style{syntax: \\\"*\\\"; inherits: false; initial-value: solid;}@property --tw-blur{syntax: \\\"*\\\"; inherits: false;}@property --tw-brightness{syntax: \\\"*\\\"; inherits: false;}@property --tw-contrast{syntax: \\\"*\\\"; inherits: false;}@property --tw-grayscale{syntax: \\\"*\\\"; inherits: false;}@property --tw-hue-rotate{syntax: \\\"*\\\"; inherits: false;}@property --tw-invert{syntax: \\\"*\\\"; inherits: false;}@property --tw-opacity{syntax: \\\"*\\\"; inherits: false;}@property --tw-saturate{syntax: \\\"*\\\"; inherits: false;}@property --tw-sepia{syntax: \\\"*\\\"; inherits: false;}@property --tw-drop-shadow{syntax: \\\"*\\\"; inherits: false;}@property --tw-drop-shadow-color{syntax: \\\"*\\\"; inherits: false;}@property --tw-drop-shadow-alpha{syntax: \\\"<percentage>\\\"; inherits: false; initial-value: 100%;}@property --tw-drop-shadow-size{syntax: \\\"*\\\"; inherits: false;}@property --tw-backdrop-blur{syntax: \\\"*\\\"; inherits: false;}@property --tw-backdrop-brightness{syntax: \\\"*\\\"; inherits: false;}@property --tw-backdrop-contrast{syntax: \\\"*\\\"; inherits: false;}@property --tw-backdrop-grayscale{syntax: \\\"*\\\"; inherits: false;}@property --tw-backdrop-hue-rotate{syntax: \\\"*\\\"; inherits: false;}@property --tw-backdrop-invert{syntax: \\\"*\\\"; inherits: false;}@property --tw-backdrop-opacity{syntax: \\\"*\\\"; inherits: false;}@property --tw-backdrop-saturate{syntax: \\\"*\\\"; inherits: false;}@property --tw-backdrop-sepia{syntax: \\\"*\\\"; inherits: false;}@property --tw-duration{syntax: \\\"*\\\"; inherits: false;}@property --tw-ease{syntax: \\\"*\\\"; inherits: false;}@property --tw-content{syntax: \\\"*\\\"; initial-value: \\\"\\\"; inherits: false;}@property --tw-scale-x{syntax: \\\"*\\\"; inherits: false; initial-value: 1;}@property --tw-scale-y{syntax: \\\"*\\\"; inherits: false; initial-value: 1;}@property --tw-scale-z{syntax: \\\"*\\\"; inherits: false; initial-value: 1;}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));filter:blur(var(--tw-enter-blur,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));filter:blur(var(--tw-exit-blur,0))}}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){.peam-root *,.peam-root :before,.peam-root :after,.peam-root ::backdrop{--tw-translate-x: 0;--tw-translate-y: 0;--tw-translate-z: 0;--tw-rotate-x: initial;--tw-rotate-y: initial;--tw-rotate-z: initial;--tw-skew-x: initial;--tw-skew-y: initial;--tw-space-y-reverse: 0;--tw-space-x-reverse: 0;--tw-divide-y-reverse: 0;--tw-border-style: solid;--tw-leading: initial;--tw-font-weight: initial;--tw-tracking: initial;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000;--tw-outline-style: solid;--tw-blur: initial;--tw-brightness: initial;--tw-contrast: initial;--tw-grayscale: initial;--tw-hue-rotate: initial;--tw-invert: initial;--tw-opacity: initial;--tw-saturate: initial;--tw-sepia: initial;--tw-drop-shadow: initial;--tw-drop-shadow-color: initial;--tw-drop-shadow-alpha: 100%;--tw-drop-shadow-size: initial;--tw-backdrop-blur: initial;--tw-backdrop-brightness: initial;--tw-backdrop-contrast: initial;--tw-backdrop-grayscale: initial;--tw-backdrop-hue-rotate: initial;--tw-backdrop-invert: initial;--tw-backdrop-opacity: initial;--tw-backdrop-saturate: initial;--tw-backdrop-sepia: initial;--tw-duration: initial;--tw-ease: initial;--tw-content: \\\"\\\";--tw-scale-x: 1;--tw-scale-y: 1;--tw-scale-z: 1;--tw-animation-delay: 0s;--tw-animation-direction: normal;--tw-animation-duration: initial;--tw-animation-fill-mode: none;--tw-animation-iteration-count: 1;--tw-enter-blur: 0;--tw-enter-opacity: 1;--tw-enter-rotate: 0;--tw-enter-scale: 1;--tw-enter-translate-x: 0;--tw-enter-translate-y: 0;--tw-exit-blur: 0;--tw-exit-opacity: 1;--tw-exit-rotate: 0;--tw-exit-scale: 1;--tw-exit-translate-x: 0;--tw-exit-translate-y: 0}}}\\n\")","import type { UIMessage } from '@ai-sdk/react';\nimport Dexie, { type EntityTable } from 'dexie';\n\ninterface StoredMessage extends UIMessage {\n timestamp: number;\n sequence: number;\n}\n\ninterface ConversationSummary {\n id: string;\n summary: string;\n lastSummarizedMessageId: string;\n timestamp: number;\n}\n\nclass ChatDatabase extends Dexie {\n messages!: EntityTable<StoredMessage, 'id'>;\n summaries!: EntityTable<ConversationSummary, 'id'>;\n\n constructor() {\n super('PeamChatMessages');\n this.version(1).stores({\n messages: 'id, timestamp, sequence',\n summaries: 'id, timestamp',\n });\n }\n}\n\nexport const db = new ChatDatabase();\nexport type { ConversationSummary, StoredMessage };\n","import { useCallback, useRef } from 'react';\n\n/**\n * Hook that debounces a callback function\n * @param callback - The callback function to debounce\n * @param delay - The delay in milliseconds (default: 300ms)\n * @returns A debounced version of the callback\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function useDebounceCallback<T extends (...args: any[]) => any>(\n callback: T,\n delay: number = 300\n): (...args: Parameters<T>) => void {\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n\n const debouncedCallback = useCallback(\n (...args: Parameters<T>) => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n timeoutRef.current = setTimeout(() => {\n callback(...args);\n }, delay);\n },\n [callback, delay]\n );\n\n useCallback(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, []);\n\n return debouncedCallback;\n}\n","'use client';\n\nimport type { UIMessage } from '@ai-sdk/react';\nimport { loggers } from '@peam-ai/logger';\nimport { useLiveQuery } from 'dexie-react-hooks';\nimport { useCallback } from 'react';\nimport { db } from '../lib/db';\nimport { useDebounceCallback } from './useDebounceCallback';\n\nconst log = loggers.ui;\nconst CURRENT_CONVERSATION_ID = 'current';\n\nexport const useChatPersistence = () => {\n const storedMessages = useLiveQuery(() => db.messages.orderBy('sequence').toArray());\n const storedSummary = useLiveQuery(() => db.summaries.get(CURRENT_CONVERSATION_ID));\n\n const isLoading = !storedMessages;\n const initialMessages = storedMessages?.map(({ ...message }) => message) ?? [];\n const summary = storedSummary?.summary;\n const lastSummarizedMessageId = storedSummary?.lastSummarizedMessageId;\n\n const saveMessagesImmediate = useCallback(async (messages: UIMessage[]) => {\n try {\n const baseTimestamp = Date.now();\n const messagesToStore = messages.map((message, index) => ({\n ...message,\n timestamp: baseTimestamp + index * 1000,\n sequence: index,\n }));\n\n await db.transaction('rw', db.messages, async () => {\n await db.messages.clear();\n await db.messages.bulkAdd(messagesToStore);\n });\n } catch (error) {\n log.error('Failed to save messages:', error);\n }\n }, []);\n\n const saveMessages = useDebounceCallback(saveMessagesImmediate, 300);\n\n const saveSummary = useCallback(async (summaryText: string, lastMessageId: string) => {\n try {\n await db.summaries.put({\n id: CURRENT_CONVERSATION_ID,\n summary: summaryText,\n lastSummarizedMessageId: lastMessageId,\n timestamp: Date.now(),\n });\n } catch (error) {\n log.error('Failed to save summary:', error);\n }\n }, []);\n\n const clearMessages = useCallback(async () => {\n try {\n await db.transaction('rw', [db.messages, db.summaries], async () => {\n await db.messages.clear();\n await db.summaries.delete(CURRENT_CONVERSATION_ID);\n });\n } catch (error) {\n log.error('Failed to clear messages:', error);\n }\n }, []);\n\n return {\n initialMessages,\n isLoading,\n saveMessages,\n clearMessages,\n summary,\n lastSummarizedMessageId,\n saveSummary,\n };\n};\n","import { useEffect, useRef, useState } from 'react';\nimport { useChatPersistence } from './useChatPersistence';\n\nexport function useAskAI() {\n const [isOpen, setIsOpen] = useState(false);\n const chatClearRef = useRef<(() => void) | null>(null);\n const chatPersistence = useChatPersistence();\n\n const handleToggle = () => {\n setIsOpen((prev) => !prev);\n };\n\n const handleOpen = () => {\n setIsOpen(true);\n };\n\n const handleClose = () => {\n setIsOpen(false);\n };\n\n const handleClear = () => {\n if (chatClearRef.current) {\n chatClearRef.current();\n }\n };\n\n useEffect(() => {\n const handleKeyboard = (event: KeyboardEvent) => {\n const isEscape = event.key === 'Escape' || event.key === 'Esc' || event.keyCode === 27;\n if (isEscape && isOpen) {\n handleClose();\n return;\n }\n\n const isIKey = event.key === 'i' || event.key === 'I' || event.keyCode === 73;\n const hasModifier = event.metaKey;\n\n if (hasModifier && isIKey) {\n event.preventDefault();\n event.stopPropagation();\n setIsOpen((prev) => !prev);\n }\n };\n\n document.addEventListener('keydown', handleKeyboard);\n\n return () => {\n document.removeEventListener('keydown', handleKeyboard);\n };\n }, [isOpen]);\n\n return {\n isOpen,\n chatClearRef,\n chatPersistence,\n handleToggle,\n handleOpen,\n handleClose,\n handleClear,\n };\n}\n","import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport * as React from 'react';\n\nimport { cn } from '@/lib/utils';\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default: 'bg-primary text-primary-foreground hover:bg-primary/90',\n destructive:\n 'bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60',\n outline:\n 'border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50',\n secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80',\n ghost: 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50',\n link: 'text-primary underline-offset-4 hover:underline',\n },\n size: {\n default: 'h-9 px-4 py-2 has-[>svg]:px-3',\n sm: 'h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5',\n lg: 'h-10 rounded-md px-6 has-[>svg]:px-4',\n icon: 'size-9',\n 'icon-sm': 'size-8',\n 'icon-lg': 'size-10',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n);\n\nfunction Button({\n className,\n variant = 'default',\n size = 'default',\n asChild = false,\n ...props\n}: React.ComponentProps<'button'> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean;\n }) {\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n );\n}\n\nexport { Button, buttonVariants };\n","'use client';\n\nimport { Button } from '@/components/ui/button';\nimport { cn } from '@/lib/utils';\nimport { ArrowDownIcon } 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('relative flex-1 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('flex flex-col gap-8 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('flex size-full flex-col items-center justify-center gap-3 p-8 text-center', className)}\n {...props}\n >\n {children ?? (\n <>\n {icon && <div className=\"text-muted-foreground\">{icon}</div>}\n <div className=\"space-y-1\">\n <h3 className=\"font-medium text-sm\">{title}</h3>\n {description && <p className=\"text-muted-foreground 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('absolute bottom-4 left-[50%] translate-x-[-50%] rounded-full', className)}\n onClick={handleScrollToBottom}\n size=\"icon\"\n type=\"button\"\n variant=\"outline\"\n {...props}\n >\n <ArrowDownIcon className=\"size-4\" />\n </Button>\n )\n );\n};\n","import * as TooltipPrimitive from '@radix-ui/react-tooltip';\nimport * as React from 'react';\n\nimport { cn } from '@/lib/utils';\n\nfunction TooltipProvider({ delayDuration = 0, ...props }: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return <TooltipPrimitive.Provider data-slot=\"tooltip-provider\" delayDuration={delayDuration} {...props} />;\n}\n\nfunction Tooltip({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return (\n <TooltipProvider>\n <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n </TooltipProvider>\n );\n}\n\nfunction TooltipTrigger({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />;\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <div className=\"peam-root\">\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n 'bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance',\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]\" />\n </TooltipPrimitive.Content>\n </div>\n </TooltipPrimitive.Portal>\n );\n}\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };\n","'use client';\n\nimport { Button } from '@/components/ui/button';\nimport { ButtonGroup, ButtonGroupText } from '@/components/ui/button-group';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';\nimport { cn } from '@/lib/utils';\nimport type { FileUIPart, UIMessage } from 'ai';\nimport { ChevronLeftIcon, ChevronRightIcon, PaperclipIcon, XIcon } from 'lucide-react';\nimport type { ComponentProps, HTMLAttributes, ReactElement } from 'react';\nimport { createContext, memo, useContext, useEffect, 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 'group flex w-full max-w-[95%] flex-col gap-2',\n from === 'user' ? 'is-user ml-auto justify-end' : '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 'is-user:dark flex w-fit max-w-full min-w-0 flex-col gap-2 overflow-hidden text-sm',\n 'group-[.is-user]:ml-auto group-[.is-user]:rounded-lg group-[.is-user]:bg-secondary group-[.is-user]:px-4 group-[.is-user]:py-3 group-[.is-user]:text-foreground',\n '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('flex items-center 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=\"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\ntype 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 = (newBranch: number) => {\n setCurrentBranch(newBranch);\n onBranchChange?.(newBranch);\n };\n\n const goToPrevious = () => {\n const newBranch = currentBranch > 0 ? currentBranch - 1 : branches.length - 1;\n handleBranchChange(newBranch);\n };\n\n const goToNext = () => {\n const newBranch = currentBranch < branches.length - 1 ? currentBranch + 1 : 0;\n handleBranchChange(newBranch);\n };\n\n const contextValue: MessageBranchContextType = {\n currentBranch,\n totalBranches: branches.length,\n goToPrevious,\n goToNext,\n branches,\n setBranches,\n };\n\n return (\n <MessageBranchContext.Provider value={contextValue}>\n <div className={cn('grid w-full gap-2 [&>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 = Array.isArray(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('grid gap-2 overflow-hidden [&>div]:pb-0', index === currentBranch ? 'block' : 'hidden')}\n key={branch.key}\n {...props}\n >\n {branch}\n </div>\n ));\n};\n\nexport type MessageBranchSelectorProps = HTMLAttributes<HTMLDivElement> & {\n from: UIMessage['role'];\n};\n\nexport const MessageBranchSelector = ({ className, from, ...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=\"[&>*:not(:first-child)]:rounded-l-md [&>*:not(:last-child)]:rounded-r-md\"\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, className, ...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('border-none bg-transparent text-muted-foreground shadow-none', className)}\n {...props}\n >\n {currentBranch + 1} of {totalBranches}\n </ButtonGroupText>\n );\n};\n\nexport type MessageResponseProps = ComponentProps<typeof Streamdown>;\n\nexport const MessageResponse = memo(\n ({ className, ...props }: MessageResponseProps) => (\n <Streamdown className={cn('size-full [&>*:first-child]:mt-0 [&>*:last-child]:mb-0', className)} {...props} />\n ),\n (prevProps, nextProps) => prevProps.children === nextProps.children\n);\n\nMessageResponse.displayName = 'MessageResponse';\n\nexport type MessageAttachmentProps = HTMLAttributes<HTMLDivElement> & {\n data: FileUIPart;\n className?: string;\n onRemove?: () => void;\n};\n\nexport function MessageAttachment({ data, className, onRemove, ...props }: MessageAttachmentProps) {\n const filename = data.filename || '';\n const mediaType = data.mediaType?.startsWith('image/') && data.url ? 'image' : 'file';\n const isImage = mediaType === 'image';\n const attachmentLabel = filename || (isImage ? 'Image' : 'Attachment');\n\n return (\n <div className={cn('group relative size-24 overflow-hidden rounded-lg', className)} {...props}>\n {isImage ? (\n <>\n <img\n alt={filename || 'attachment'}\n className=\"size-full object-cover\"\n height={100}\n src={data.url}\n width={100}\n />\n {onRemove && (\n <Button\n aria-label=\"Remove attachment\"\n className=\"absolute top-2 right-2 size-6 rounded-full bg-background/80 p-0 opacity-0 backdrop-blur-sm transition-opacity hover:bg-background group-hover:opacity-100 [&>svg]:size-3\"\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n type=\"button\"\n variant=\"ghost\"\n >\n <XIcon />\n <span className=\"sr-only\">Remove</span>\n </Button>\n )}\n </>\n ) : (\n <>\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex size-full shrink-0 items-center justify-center rounded-lg bg-muted text-muted-foreground\">\n <PaperclipIcon className=\"size-4\" />\n </div>\n </TooltipTrigger>\n <TooltipContent>\n <p>{attachmentLabel}</p>\n </TooltipContent>\n </Tooltip>\n {onRemove && (\n <Button\n aria-label=\"Remove attachment\"\n className=\"size-6 shrink-0 rounded-full p-0 opacity-0 transition-opacity hover:bg-accent group-hover:opacity-100 [&>svg]:size-3\"\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n type=\"button\"\n variant=\"ghost\"\n >\n <XIcon />\n <span className=\"sr-only\">Remove</span>\n </Button>\n )}\n </>\n )}\n </div>\n );\n}\n\nexport type MessageAttachmentsProps = ComponentProps<'div'>;\n\nexport function MessageAttachments({ children, className, ...props }: MessageAttachmentsProps) {\n if (!children) {\n return null;\n }\n\n return (\n <div className={cn('ml-auto flex w-fit flex-wrap items-start gap-2', className)} {...props}>\n {children}\n </div>\n );\n}\n\nexport type MessageToolbarProps = ComponentProps<'div'>;\n\nexport const MessageToolbar = ({ className, children, ...props }: MessageToolbarProps) => (\n <div className={cn('mt-4 flex w-full items-center justify-between gap-4', className)} {...props}>\n {children}\n </div>\n);\n","import * as React from 'react';\n\nimport { cn } from '@/lib/utils';\n\nfunction Textarea({ className, ...props }: React.ComponentProps<'textarea'>) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n 'border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',\n className\n )}\n {...props}\n />\n );\n}\n\nexport { Textarea };\n","'use client';\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport * as React from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport { Textarea } from '@/components/ui/textarea';\nimport { cn } from '@/lib/utils';\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"input-group\"\n role=\"group\"\n className={cn(\n 'group/input-group border-input dark:bg-input/30 relative flex w-full items-center rounded-md border shadow-xs transition-[color,box-shadow] outline-none',\n 'h-9 min-w-0 has-[>textarea]:h-auto',\n\n // Variants based on alignment.\n 'has-[>[data-align=inline-start]]:[&>input]:pl-2',\n 'has-[>[data-align=inline-end]]:[&>input]:pr-2',\n 'has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>[data-align=block-start]]:[&>input]:pb-3',\n 'has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-end]]:[&>input]:pt-3',\n\n // Focus state.\n 'has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot=input-group-control]:focus-visible]:ring-[3px]',\n\n // Error state.\n 'has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[[data-slot][aria-invalid=true]]:border-destructive dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40',\n\n className\n )}\n {...props}\n />\n );\n}\n\nconst inputGroupAddonVariants = cva(\n \"text-muted-foreground flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium select-none [&>svg:not([class*='size-'])]:size-4 [&>kbd]:rounded-[calc(var(--radius)-5px)] group-data-[disabled=true]/input-group:opacity-50\",\n {\n variants: {\n align: {\n 'inline-start': 'order-first pl-3 has-[>button]:ml-[-0.45rem] has-[>kbd]:ml-[-0.35rem]',\n 'inline-end': 'order-last pr-3 has-[>button]:mr-[-0.45rem] has-[>kbd]:mr-[-0.35rem]',\n 'block-start':\n 'order-first w-full justify-start px-3 pt-3 [.border-b]:pb-3 group-has-[>input]/input-group:pt-2.5',\n 'block-end': 'order-last w-full justify-start px-3 pb-3 [.border-t]:pt-3 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 e.currentTarget.parentElement?.querySelector('input')?.focus();\n }}\n {...props}\n />\n );\n}\n\nconst inputGroupButtonVariants = cva('text-sm shadow-none flex gap-2 items-center', {\n variants: {\n size: {\n xs: \"h-6 gap-1 px-2 rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-3.5 has-[>svg]:px-2\",\n sm: 'h-8 px-2.5 gap-1.5 rounded-md has-[>svg]:px-2.5',\n 'icon-xs': 'size-6 rounded-[calc(var(--radius)-5px)] p-0 has-[>svg]:p-0',\n 'icon-sm': 'size-8 p-0 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 \"text-muted-foreground flex items-center gap-2 text-sm [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4\",\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 'flex-1 rounded-none border-0 bg-transparent shadow-none focus-visible:ring-0 dark:bg-transparent',\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 'flex-1 resize-none rounded-none border-0 bg-transparent py-3 shadow-none focus-visible:ring-0 dark:bg-transparent',\n className\n )}\n {...props}\n />\n );\n}\n\nexport { InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea };\n","'use client';\n\nimport { Button } from '@/components/ui/button';\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n} from '@/components/ui/command';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu';\nimport { HoverCard, HoverCardContent, HoverCardTrigger } from '@/components/ui/hover-card';\nimport { InputGroup, InputGroupAddon, InputGroupButton, InputGroupTextarea } from '@/components/ui/input-group';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';\nimport { cn } from '@/lib/utils';\nimport type { ChatStatus, FileUIPart } from 'ai';\nimport {\n CornerDownLeftIcon,\n ImageIcon,\n Loader2Icon,\n MicIcon,\n PaperclipIcon,\n PlusIcon,\n SquareIcon,\n XIcon,\n} from 'lucide-react';\nimport { nanoid } from 'nanoid';\nimport {\n type ChangeEvent,\n type ChangeEventHandler,\n Children,\n type ClipboardEventHandler,\n type ComponentProps,\n createContext,\n type FormEvent,\n type FormEventHandler,\n Fragment,\n type HTMLAttributes,\n type KeyboardEventHandler,\n type PropsWithChildren,\n type ReactNode,\n type RefObject,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\n// ============================================================================\n// Provider Context & Types\n// ============================================================================\n\nexport type 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 type TextInputContext = {\n value: string;\n setInput: (v: string) => void;\n clear: () => void;\n};\n\nexport type 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 function 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 const openRef = useRef<() => void>(() => {});\n\n const add = useCallback((files: File[] | FileList) => {\n const incoming = Array.from(files);\n if (incoming.length === 0) {\n return;\n }\n\n setAttachmentFiles((prev) =>\n prev.concat(\n incoming.map((file) => ({\n id: nanoid(),\n type: 'file' as const,\n url: URL.createObjectURL(file),\n mediaType: file.type,\n filename: file.name,\n }))\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 attachmentsRef.current = attachmentFiles;\n\n // Cleanup blob URLs on unmount to prevent memory leaks\n useEffect(() => {\n return () => {\n for (const f of attachmentsRef.current) {\n if (f.url) {\n URL.revokeObjectURL(f.url);\n }\n }\n };\n }, []);\n\n const openFileDialog = useCallback(() => {\n openRef.current?.();\n }, []);\n\n const attachments = useMemo<AttachmentsContext>(\n () => ({\n files: attachmentFiles,\n add,\n remove,\n clear,\n openFileDialog,\n fileInputRef,\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 textInput: {\n value: textInput,\n setInput: setTextInput,\n clear: clearInput,\n },\n attachments,\n __registerFileInput,\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 // Dual-mode: prefer provider if present, otherwise use local\n const provider = useOptionalProviderAttachments();\n const local = useContext(LocalAttachmentsContext);\n const context = provider ?? local;\n if (!context) {\n throw new Error('usePromptInputAttachments must be used within a PromptInput or PromptInputProvider');\n }\n return context;\n};\n\nexport type PromptInputAttachmentProps = HTMLAttributes<HTMLDivElement> & {\n data: FileUIPart & { id: string };\n className?: string;\n};\n\nexport function PromptInputAttachment({ data, className, ...props }: PromptInputAttachmentProps) {\n const attachments = usePromptInputAttachments();\n\n const filename = data.filename || '';\n\n const mediaType = data.mediaType?.startsWith('image/') && data.url ? 'image' : 'file';\n const isImage = mediaType === 'image';\n\n const attachmentLabel = filename || (isImage ? 'Image' : 'Attachment');\n\n return (\n <PromptInputHoverCard>\n <HoverCardTrigger asChild>\n <div\n className={cn(\n 'group relative flex h-8 cursor-pointer select-none items-center gap-1.5 rounded-md border border-border px-1.5 font-medium text-sm transition-all hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50',\n className\n )}\n key={data.id}\n {...props}\n >\n <div className=\"relative size-5 shrink-0\">\n <div className=\"absolute inset-0 flex size-5 items-center justify-center overflow-hidden rounded bg-background transition-opacity group-hover:opacity-0\">\n {isImage ? (\n <img\n alt={filename || 'attachment'}\n className=\"size-5 object-cover\"\n height={20}\n src={data.url}\n width={20}\n />\n ) : (\n <div className=\"flex size-5 items-center justify-center text-muted-foreground\">\n <PaperclipIcon className=\"size-3\" />\n </div>\n )}\n </div>\n <Button\n aria-label=\"Remove attachment\"\n className=\"absolute inset-0 size-5 cursor-pointer rounded p-0 opacity-0 transition-opacity group-hover:pointer-events-auto group-hover:opacity-100 [&>svg]:size-2.5\"\n onClick={(e) => {\n e.stopPropagation();\n attachments.remove(data.id);\n }}\n type=\"button\"\n variant=\"ghost\"\n >\n <XIcon />\n <span className=\"sr-only\">Remove</span>\n </Button>\n </div>\n\n <span className=\"flex-1 truncate\">{attachmentLabel}</span>\n </div>\n </HoverCardTrigger>\n <PromptInputHoverCardContent className=\"w-auto p-2\">\n <div className=\"w-auto space-y-3\">\n {isImage && (\n <div className=\"flex max-h-96 w-96 items-center justify-center overflow-hidden rounded-md border\">\n <img\n alt={filename || 'attachment preview'}\n className=\"max-h-full max-w-full object-contain\"\n height={384}\n src={data.url}\n width={448}\n />\n </div>\n )}\n <div className=\"flex items-center gap-2.5\">\n <div className=\"min-w-0 flex-1 space-y-1 px-0.5\">\n <h4 className=\"truncate font-semibold text-sm leading-none\">\n {filename || (isImage ? 'Image' : 'Attachment')}\n </h4>\n {data.mediaType && <p className=\"truncate font-mono text-muted-foreground text-xs\">{data.mediaType}</p>}\n </div>\n </div>\n </div>\n </PromptInputHoverCardContent>\n </PromptInputHoverCard>\n );\n}\n\nexport type PromptInputAttachmentsProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {\n children: (attachment: FileUIPart & { id: string }) => ReactNode;\n};\n\nexport function PromptInputAttachments({ children, className, ...props }: PromptInputAttachmentsProps) {\n const attachments = usePromptInputAttachments();\n\n if (!attachments.files.length) {\n return null;\n }\n\n return (\n <div className={cn('flex flex-wrap items-center gap-2 p-3 w-full', className)} {...props}>\n {attachments.files.map((file) => (\n <Fragment key={file.id}>{children(file)}</Fragment>\n ))}\n </div>\n );\n}\n\nexport type PromptInputActionAddAttachmentsProps = ComponentProps<typeof DropdownMenuItem> & {\n label?: string;\n};\n\nexport const PromptInputActionAddAttachments = ({\n label = 'Add photos or files',\n ...props\n}: PromptInputActionAddAttachmentsProps) => {\n const attachments = usePromptInputAttachments();\n\n return (\n <DropdownMenuItem\n {...props}\n onSelect={(e) => {\n e.preventDefault();\n attachments.openFileDialog();\n }}\n >\n <ImageIcon className=\"mr-2 size-4\" /> {label}\n </DropdownMenuItem>\n );\n};\n\nexport type PromptInputMessage = {\n text: string;\n files: FileUIPart[];\n};\n\nexport type PromptInputProps = Omit<HTMLAttributes<HTMLFormElement>, 'onSubmit' | 'onError'> & {\n accept?: string; // e.g., \"image/*\" or leave undefined for any\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 maxFileSize?: number; // bytes\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 // Keep a ref to files for cleanup on unmount (avoids stale closure)\n const filesRef = useRef(files);\n filesRef.current = 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.endsWith('/*')) {\n const prefix = pattern.slice(0, -1); // e.g: image/* -> image/\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 id: nanoid(),\n type: 'file',\n url: URL.createObjectURL(file),\n mediaType: file.type,\n filename: file.name,\n });\n }\n return prev.concat(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 const clearLocal = useCallback(\n () =>\n setItems((prev) => {\n for (const file of prev) {\n if (file.url) {\n URL.revokeObjectURL(file.url);\n }\n }\n return [];\n }),\n []\n );\n\n const add = usingProvider ? controller.attachments.add : addLocal;\n const remove = usingProvider ? controller.attachments.remove : removeLocal;\n const clear = usingProvider ? controller.attachments.clear : clearLocal;\n const openFileDialog = usingProvider ? controller.attachments.openFileDialog : openFileDialogLocal;\n\n // Let provider know about our hidden file input so external menus can call openFileDialog()\n useEffect(() => {\n if (!usingProvider) return;\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) return;\n if (globalDrop) return; // when global drop is on, let the document-level handler own drops\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) return;\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) URL.revokeObjectURL(f.url);\n }\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps -- cleanup only on unmount; filesRef always current\n [usingProvider]\n );\n\n const handleChange: ChangeEventHandler<HTMLInputElement> = (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\n const convertBlobUrlToDataUrl = async (url: string): Promise<string | null> => {\n try {\n const response = await fetch(url);\n const blob = await response.blob();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.onloadend = () => resolve(reader.result as string);\n reader.onerror = () => resolve(null);\n reader.readAsDataURL(blob);\n });\n } catch {\n return null;\n }\n };\n\n const ctx = useMemo<AttachmentsContext>(\n () => ({\n files: files.map((item) => ({ ...item, id: item.id })),\n add,\n remove,\n clear,\n openFileDialog,\n fileInputRef: inputRef,\n }),\n [files, add, remove, clear, openFileDialog]\n );\n\n const handleSubmit: FormEventHandler<HTMLFormElement> = (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 // Convert blob URLs to data URLs asynchronously\n Promise.all(\n files.map(async ({ id, ...item }) => {\n if (item.url && 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 .then((convertedFiles: FileUIPart[]) => {\n try {\n const result = onSubmit({ text, files: convertedFiles }, event);\n\n // Handle both sync and async onSubmit\n if (result instanceof Promise) {\n result\n .then(() => {\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 } else {\n // Sync function completed without throwing, clear attachments\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 .catch(() => {\n // Don't clear on error - user may want to retry\n });\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=\"hidden\"\n multiple={multiple}\n onChange={handleChange}\n ref={inputRef}\n title=\"Upload files\"\n type=\"file\"\n />\n <form className={cn('w-full', className)} onSubmit={handleSubmit} ref={formRef} {...props}>\n <InputGroup className=\"overflow-hidden\">{children}</InputGroup>\n </form>\n </>\n );\n\n return usingProvider ? (\n inner\n ) : (\n <LocalAttachmentsContext.Provider value={ctx}>{inner}</LocalAttachmentsContext.Provider>\n );\n};\n\nexport type PromptInputBodyProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputBody = ({ className, ...props }: PromptInputBodyProps) => (\n <div className={cn('contents', className)} {...props} />\n);\n\nexport type PromptInputTextareaProps = ComponentProps<typeof InputGroupTextarea>;\n\nexport const PromptInputTextarea = ({\n onChange,\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> = (e) => {\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.form;\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.at(-1);\n if (lastAttachment) {\n attachments.remove(lastAttachment.id);\n }\n }\n };\n\n const handlePaste: ClipboardEventHandler<HTMLTextAreaElement> = (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 items) {\n if (item.kind === 'file') {\n const file = item.getAsFile();\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\n const controlledProps = controller\n ? {\n value: controller.textInput.value,\n onChange: (e: ChangeEvent<HTMLTextAreaElement>) => {\n controller.textInput.setInput(e.currentTarget.value);\n onChange?.(e);\n },\n }\n : {\n onChange,\n };\n\n return (\n <InputGroupTextarea\n className={cn('field-sizing-content max-h-48 min-h-16', className)}\n name=\"message\"\n onCompositionEnd={() => setIsComposing(false)}\n onCompositionStart={() => setIsComposing(true)}\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('order-first flex-wrap 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('justify-between gap-1', className)} {...props} />\n);\n\nexport type PromptInputToolsProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTools = ({ className, ...props }: PromptInputToolsProps) => (\n <div className={cn('flex items-center gap-1', className)} {...props} />\n);\n\nexport type PromptInputButtonProps = ComponentProps<typeof InputGroupButton>;\n\nexport const PromptInputButton = ({ variant = 'ghost', className, size, ...props }: PromptInputButtonProps) => {\n const newSize = size ?? (Children.count(props.children) > 1 ? 'sm' : 'icon-sm');\n\n return <InputGroupButton className={cn(className)} size={newSize} type=\"button\" variant={variant} {...props} />;\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=\"size-4\" />}\n </PromptInputButton>\n </DropdownMenuTrigger>\n);\n\nexport type PromptInputActionMenuContentProps = ComponentProps<typeof DropdownMenuContent>;\nexport const PromptInputActionMenuContent = ({ className, ...props }: PromptInputActionMenuContentProps) => (\n <DropdownMenuContent align=\"start\" className={cn(className)} {...props} />\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};\n\nexport const PromptInputSubmit = ({\n className,\n variant = 'default',\n size = 'icon-sm',\n status,\n children,\n ...props\n}: PromptInputSubmitProps) => {\n let Icon = <CornerDownLeftIcon className=\"size-4\" />;\n\n if (status === 'submitted') {\n Icon = <Loader2Icon className=\"size-4 animate-spin\" />;\n } else if (status === 'streaming') {\n Icon = <SquareIcon className=\"size-4\" />;\n } else if (status === 'error') {\n Icon = <XIcon className=\"size-4\" />;\n }\n\n return (\n <InputGroupButton\n aria-label=\"Submit\"\n className={cn(className)}\n size={size}\n type=\"submit\"\n variant={variant}\n {...props}\n >\n {children ?? Icon}\n </InputGroupButton>\n );\n};\n\ninterface SpeechRecognition extends EventTarget {\n continuous: boolean;\n interimResults: boolean;\n lang: string;\n start(): void;\n stop(): void;\n onstart: ((this: SpeechRecognition, ev: Event) => any) | null;\n onend: ((this: SpeechRecognition, ev: Event) => any) | null;\n onresult: ((this: SpeechRecognition, ev: SpeechRecognitionEvent) => any) | null;\n onerror: ((this: SpeechRecognition, ev: SpeechRecognitionErrorEvent) => any) | null;\n}\n\ninterface SpeechRecognitionEvent extends Event {\n results: SpeechRecognitionResultList;\n resultIndex: number;\n}\n\ntype SpeechRecognitionResultList = {\n readonly length: number;\n item(index: number): SpeechRecognitionResult;\n [index: number]: SpeechRecognitionResult;\n};\n\ntype SpeechRecognitionResult = {\n readonly length: number;\n item(index: number): SpeechRecognitionAlternative;\n [index: number]: SpeechRecognitionAlternative;\n isFinal: boolean;\n};\n\ntype SpeechRecognitionAlternative = {\n transcript: string;\n confidence: number;\n};\n\ninterface SpeechRecognitionErrorEvent extends Event {\n error: string;\n}\n\ndeclare global {\n interface Window {\n SpeechRecognition: {\n new (): SpeechRecognition;\n };\n webkitSpeechRecognition: {\n new (): SpeechRecognition;\n };\n }\n}\n\nexport type PromptInputSpeechButtonProps = ComponentProps<typeof PromptInputButton> & {\n textareaRef?: RefObject<HTMLTextAreaElement | null>;\n onTranscriptionChange?: (text: string) => void;\n};\n\nexport const PromptInputSpeechButton = ({\n className,\n textareaRef,\n onTranscriptionChange,\n ...props\n}: PromptInputSpeechButtonProps) => {\n const [isListening, setIsListening] = useState(false);\n const [recognition, setRecognition] = useState<SpeechRecognition | null>(null);\n const recognitionRef = useRef<SpeechRecognition | null>(null);\n\n useEffect(() => {\n if (typeof window !== 'undefined' && ('SpeechRecognition' in window || 'webkitSpeechRecognition' in window)) {\n const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;\n const speechRecognition = new SpeechRecognition();\n\n speechRecognition.continuous = true;\n speechRecognition.interimResults = true;\n speechRecognition.lang = 'en-US';\n\n speechRecognition.onstart = () => {\n setIsListening(true);\n };\n\n speechRecognition.onend = () => {\n setIsListening(false);\n };\n\n speechRecognition.onresult = (event) => {\n let finalTranscript = '';\n\n for (let i = event.resultIndex; i < event.results.length; i++) {\n const result = event.results[i];\n if (result.isFinal) {\n finalTranscript += result[0]?.transcript ?? '';\n }\n }\n\n if (finalTranscript && textareaRef?.current) {\n const textarea = textareaRef.current;\n const currentValue = textarea.value;\n const newValue = currentValue + (currentValue ? ' ' : '') + finalTranscript;\n\n textarea.value = newValue;\n textarea.dispatchEvent(new Event('input', { bubbles: true }));\n onTranscriptionChange?.(newValue);\n }\n };\n\n speechRecognition.onerror = (event) => {\n console.error('Speech recognition error:', event.error);\n setIsListening(false);\n };\n\n recognitionRef.current = speechRecognition;\n setRecognition(speechRecognition);\n }\n\n return () => {\n if (recognitionRef.current) {\n recognitionRef.current.stop();\n }\n };\n }, [textareaRef, onTranscriptionChange]);\n\n const toggleListening = useCallback(() => {\n if (!recognition) {\n return;\n }\n\n if (isListening) {\n recognition.stop();\n } else {\n recognition.start();\n }\n }, [recognition, isListening]);\n\n return (\n <PromptInputButton\n className={cn(\n 'relative transition-all duration-200',\n isListening && 'animate-pulse bg-accent text-accent-foreground',\n className\n )}\n disabled={!recognition}\n onClick={toggleListening}\n {...props}\n >\n <MicIcon className=\"size-4\" />\n </PromptInputButton>\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 'border-none bg-transparent font-medium text-muted-foreground shadow-none transition-colors',\n 'hover:bg-accent hover:text-foreground aria-expanded:bg-accent 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 <h3 className={cn('mb-2 px-3 font-medium text-muted-foreground text-xs', className)} {...props} />\n);\n\nexport type PromptInputTabBodyProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTabBody = ({ className, ...props }: PromptInputTabBodyProps) => (\n <div className={cn('space-y-1', className)} {...props} />\n);\n\nexport type PromptInputTabItemProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTabItem = ({ className, ...props }: PromptInputTabItemProps) => (\n <div className={cn('flex items-center gap-2 px-3 py-2 text-xs hover:bg-accent', className)} {...props} />\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 { motion } from 'motion/react';\nimport { type CSSProperties, type ElementType, type JSX, memo, useMemo } from 'react';\n\nexport type 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 = motion.create(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 'relative inline-block bg-[length:250%_100%,auto] bg-clip-text text-transparent',\n '[--bg:linear-gradient(90deg,#0000_calc(50%-var(--spread)),var(--color-background),#0000_calc(50%+var(--spread)))] [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 repeat: Number.POSITIVE_INFINITY,\n duration,\n ease: 'linear',\n }}\n >\n {children}\n </MotionComponent>\n );\n};\n\nexport const Shimmer = memo(ShimmerComponent);\n","'use client';\n\nimport * as CollapsiblePrimitive from '@radix-ui/react-collapsible';\n\nfunction Collapsible({ ...props }: React.ComponentProps<typeof CollapsiblePrimitive.Root>) {\n return <CollapsiblePrimitive.Root data-slot=\"collapsible\" {...props} />;\n}\n\nfunction CollapsibleTrigger({ ...props }: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleTrigger>) {\n return <CollapsiblePrimitive.CollapsibleTrigger data-slot=\"collapsible-trigger\" {...props} />;\n}\n\nfunction CollapsibleContent({ ...props }: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleContent>) {\n return <CollapsiblePrimitive.CollapsibleContent data-slot=\"collapsible-content\" {...props} />;\n}\n\nexport { Collapsible, CollapsibleContent, CollapsibleTrigger };\n","'use client';\n\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/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('not-prose mb-4 text-primary 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('flex items-center gap-2', className)} {...props}>\n {children ?? (\n <>\n <p className=\"font-medium\">Used {count} sources</p>\n <ChevronDownIcon className=\"h-4 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 'mt-3 flex w-fit flex-col gap-2',\n 'data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 outline-none data-[state=closed]:animate-out 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=\"flex items-center gap-2\" href={href} rel=\"noreferrer\" target=\"_blank\" {...props}>\n {children ?? (\n <>\n <BookIcon className=\"h-4 w-4\" />\n <span className=\"block font-medium\">{title}</span>\n </>\n )}\n </a>\n);\n","'use client';\n\nexport interface SuggestedPromptsProps {\n prompts?: string[];\n onPromptClick: (prompt: string) => void;\n}\n\nconst DEFAULT_SUGGESTED_PROMPTS = ['Summarize this page', 'Where should I get started?', 'What can you help me with?'];\n\nexport const SuggestedPrompts = ({ prompts = DEFAULT_SUGGESTED_PROMPTS, onPromptClick }: SuggestedPromptsProps) => {\n if (!prompts || prompts.length === 0) {\n return null;\n }\n\n return (\n <div className=\"flex flex-col justify-center gap-3 w-full\">\n <div className=\"flex flex-col gap-1 text-xs items-start\">\n {prompts.map((prompt, index) => (\n <button\n key={index}\n onClick={() => onPromptClick(prompt)}\n className=\"text-primary hover:underline cursor-pointer text-left starting:opacity-0 transition-opacity duration-200 delay-100\"\n >\n {prompt}\n </button>\n ))}\n </div>\n </div>\n );\n};\n","import { UIMessage } from 'ai';\n\n/**\n * Default maximum number of messages before triggering summarization\n */\nexport const MAX_MESSAGES = 10;\n\n/**\n * Get messages to send to backend after the last summarized message.\n * If lastSummarizedMessageId is not found (corrupted DB), send last maxMessages as recovery.\n */\nexport function getRecentMessages(\n messages: UIMessage[],\n lastSummarizedMessageId: string | undefined,\n maxMessages: number = MAX_MESSAGES\n): UIMessage[] {\n if (!lastSummarizedMessageId) {\n // No summary yet - send last maxMessages messages\n return messages.slice(-maxMessages);\n }\n\n const lastSummarizedIndex = messages.findIndex((m) => m.id === lastSummarizedMessageId);\n\n if (lastSummarizedIndex === -1) {\n return messages.slice(-maxMessages);\n }\n\n const recentMessages = messages.slice(lastSummarizedIndex + 1);\n return recentMessages.slice(-maxMessages);\n}\n\n/**\n * Determine if we should trigger summarization.\n */\nexport function shouldSummarize(\n messages: UIMessage[],\n lastSummarizedMessageId: string | undefined,\n maxMessages: number = MAX_MESSAGES\n): boolean {\n if (!lastSummarizedMessageId) {\n return messages.length >= maxMessages;\n }\n\n const lastSummarizedIndex = messages.findIndex((m) => m.id === lastSummarizedMessageId);\n\n if (lastSummarizedIndex === -1) {\n return messages.length >= maxMessages;\n }\n\n const messagesSinceLastSummary = messages.length - lastSummarizedIndex - 1;\n return messagesSinceLastSummary >= maxMessages;\n}\n\n/**\n * Get all messages to include in the summarization.\n */\nexport function getMessagesToSummarize(\n messages: UIMessage[],\n lastSummarizedMessageId: string | undefined,\n maxMessages: number = MAX_MESSAGES\n): UIMessage[] {\n if (!lastSummarizedMessageId) {\n return messages.slice(-maxMessages);\n }\n\n const lastSummarizedIndex = messages.findIndex((m) => m.id === lastSummarizedMessageId);\n\n if (lastSummarizedIndex === -1) {\n return messages.slice(-maxMessages);\n }\n\n return messages.slice(lastSummarizedIndex + 1);\n}\n","import type { UIMessage } from '@ai-sdk/react';\nimport { useChat } from '@ai-sdk/react';\nimport { loggers } from '@peam-ai/logger';\nimport { DefaultChatTransport } from 'ai';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { getMessagesToSummarize, shouldSummarize } from '../lib/messageWindow';\nimport { useChatPersistence } from './useChatPersistence';\n\nconst log = loggers.ui;\n\nexport interface UseSummarizationOptions {\n api?: string;\n maxMessages?: number;\n}\n\n/**\n * Hook for summarizing messages history with automatic saving.\n */\nexport function useSummarization(options: UseSummarizationOptions = {}) {\n const { api = '/api/peam', maxMessages } = options;\n\n const { summary, saveSummary, lastSummarizedMessageId } = useChatPersistence();\n const [isSummarizing, setIsSummarizing] = useState(false);\n const messagesToSummarizeRef = useRef<UIMessage[]>([]);\n const isProcessingRef = useRef(false);\n\n const transport = useMemo(\n () =>\n new DefaultChatTransport({\n api,\n }),\n [api]\n );\n\n const { status, messages, setMessages, regenerate } = useChat({\n transport,\n });\n\n // Handle summarization completion and save\n useEffect(() => {\n if (isProcessingRef.current) {\n return;\n }\n\n if (status === 'submitted' || status === 'streaming') {\n return;\n }\n\n if (messages.length === 0) {\n return;\n }\n\n const processSummary = async () => {\n isProcessingRef.current = true;\n\n try {\n const summaryMessages = messages;\n\n const summaryText = summaryMessages\n .filter((message) => message.role === 'assistant')\n .map((message) => {\n return message.parts\n .filter((part) => part.type === 'text')\n .map((part) => ('text' in part ? part.text : ''))\n .join('');\n })\n .join('\\n');\n\n if (summaryText) {\n // Get the last message ID from the messages that were summarized\n const summarizedMessages = messagesToSummarizeRef.current;\n const lastMessageId = summarizedMessages[summarizedMessages.length - 1]?.id;\n\n if (lastMessageId && saveSummary) {\n await saveSummary(summaryText, lastMessageId);\n }\n }\n } catch (error) {\n log.error('Error processing summary:', error);\n } finally {\n setIsSummarizing(false);\n isProcessingRef.current = false;\n }\n };\n\n processSummary();\n }, [status, messages, saveSummary]);\n\n const summarize = useCallback(\n (messages: UIMessage[], previousSummary?: string) => {\n if (isSummarizing) {\n return;\n }\n\n messagesToSummarizeRef.current = [...messages];\n setIsSummarizing(true);\n\n setMessages(messages);\n regenerate({\n body: {\n mode: 'summarize',\n messages,\n previousSummary,\n },\n });\n },\n [setMessages, regenerate, isSummarizing]\n );\n\n /**\n * Attempts to summarize messages based on the provided criteria.\n * Returns true if summarization was triggered, false otherwise.\n */\n const triggerSummarization = useCallback(\n (allMessages: UIMessage[], lastSummarizedMessageId?: string, previousSummary?: string) => {\n if (isSummarizing) {\n return false;\n }\n\n const messagesToSummarize = getMessagesToSummarize(allMessages, lastSummarizedMessageId, maxMessages);\n\n if (messagesToSummarize.length === 0) {\n return false;\n }\n\n summarize(messagesToSummarize, previousSummary);\n return true;\n },\n [summarize, isSummarizing, maxMessages]\n );\n\n /**\n * Attempts to summarize after an assistant response.\n */\n const maybeTriggerSummarization = useCallback(\n (allMessages: UIMessage[]) => {\n if (isSummarizing) {\n return false;\n }\n\n const lastMessage = allMessages[allMessages.length - 1];\n if (!lastMessage || lastMessage.role !== 'assistant') {\n return false;\n }\n\n if (!shouldSummarize(allMessages, lastSummarizedMessageId, maxMessages)) {\n return false;\n }\n\n return triggerSummarization(allMessages, lastSummarizedMessageId, summary);\n },\n [isSummarizing, triggerSummarization, summary, lastSummarizedMessageId, maxMessages]\n );\n\n return {\n /**\n * Attempt to summarize after assistant response with all eligibility checks.\n */\n maybeTriggerSummarization,\n /**\n * The current summary text from persistence\n */\n summary,\n /**\n * The ID of the last message that was summarized\n */\n lastSummarizedMessageId,\n };\n}\n","import type { UIMessage } from '@ai-sdk/react';\nimport { DefaultChatTransport } from 'ai';\nimport { getRecentMessages } from './messageWindow';\n\nexport interface BoundedChatTransportOptions {\n api: string;\n maxMessages?: number;\n}\n\n/**\n * Custom chat transport that implements bounded context.\n */\nexport class BoundedChatTransport extends DefaultChatTransport<UIMessage> {\n constructor(options: BoundedChatTransportOptions) {\n super({\n api: options.api,\n prepareSendMessagesRequest: ({ messages, body }) => {\n const lastSummarizedMessageId = body?.lastSummarizedMessageId;\n const recentMessages = getRecentMessages(messages, lastSummarizedMessageId, options.maxMessages);\n\n return {\n body: {\n ...body,\n messages: recentMessages,\n },\n };\n },\n });\n }\n}\n","export const PeamIcon = (props: React.SVGProps<SVGSVGElement>) => (\n <svg viewBox=\"3 3 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M12 3C7.02944 3 3 7.02944 3 12C3 16.9706 7.02944 21 12 21H16.5C17.8978 21 18.5967 21 19.1481 20.7716C19.8831 20.4672 20.4672 19.8831 20.7716 19.1481C21 18.5967 21 17.8978 21 16.5V12C21 7.02944 16.9706 3 12 3Z\"\n fill=\"currentColor\"\n />\n <rect x=\"8\" y=\"10\" width=\"8\" height=\"2\" rx=\"1\" fill=\"var(--background)\" />\n <rect x=\"11\" y=\"14\" width=\"5\" height=\"2\" rx=\"1\" fill=\"var(--background)\" />\n </svg>\n);\n\nexport const PeamCloseIcon = (props: React.SVGProps<SVGSVGElement>) => (\n <svg viewBox=\"3 3 18 18\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M12 3C7.02944 3 3 7.02944 3 12C3 16.9706 7.02944 21 12 21H16.5C17.8978 21 18.5967 21 19.1481 20.7716C19.8831 20.4672 20.4672 19.8831 20.7716 19.1481C21 18.5967 21 17.8978 21 16.5V12C21 7.02944 16.9706 3 12 3Z\"\n />\n <path\n fill=\"var(--background)\"\n d=\"M10.71 9.03C10.32 8.64 9.69 8.64 9.3 9.03C8.91 9.42 8.91 10.05 9.3 10.44L11.06 12.2L9.3 13.96C8.91 14.35 8.91 14.98 9.3 15.37C9.69 15.76 10.32 15.76 10.71 15.37L12.47 13.61L14.23 15.37C14.62 15.76 15.25 15.76 15.64 15.37C16.03 14.98 16.03 14.35 15.64 13.96L13.88 12.2L15.64 10.44C16.03 10.05 16.03 9.42 15.64 9.03C15.25 8.64 14.62 8.64 14.23 9.03L12.47 10.79L10.71 9.03Z\"\n />\n </svg>\n);\n","'use client';\n\nimport {\n Conversation,\n ConversationContent,\n ConversationEmptyState,\n ConversationScrollButton,\n} from '@/components/ai-elements/conversation';\nimport {\n Message,\n MessageAction,\n MessageActions,\n MessageContent,\n MessageResponse,\n} from '@/components/ai-elements/message';\nimport {\n PromptInput,\n PromptInputBody,\n PromptInputFooter,\n PromptInputSpeechButton,\n PromptInputSubmit,\n PromptInputTextarea,\n type PromptInputMessage,\n} from '@/components/ai-elements/prompt-input';\nimport { Shimmer } from '@/components/ai-elements/shimmer';\nimport { Source, Sources, SourcesContent, SourcesTrigger } from '@/components/ai-elements/sources';\nimport { SuggestedPrompts } from '@/components/SuggestedPrompts';\nimport { useChatPersistence } from '@/hooks/useChatPersistence';\nimport { useSummarization } from '@/hooks/useSummarization';\nimport { BoundedChatTransport } from '@/lib/BoundedChatTransport';\nimport { useChat } from '@ai-sdk/react';\nimport { loggers } from '@peam-ai/logger';\nimport { HttpChatTransport, UIMessage } from 'ai';\nimport { Check, Copy, RefreshCcw } from 'lucide-react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { PeamIcon } from './icons/peam';\n\nconst log = loggers.ui;\n\nexport interface ChatProps {\n chatPersistence: ReturnType<typeof useChatPersistence>;\n suggestedPrompts?: string[];\n onClearRef?: (clearFn: () => void) => void;\n chatTransport?: HttpChatTransport<UIMessage>;\n maxMessages?: number;\n}\n\nexport const Chat = ({ chatPersistence, suggestedPrompts, onClearRef, chatTransport, maxMessages }: ChatProps) => {\n const [input, setInput] = useState('');\n const [isInitialized, setIsInitialized] = useState(false);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const [copiedMessageId, setCopiedMessageId] = useState<string | null>(null);\n const isSyncing = useRef(false);\n const lastSavedMessageCount = useRef(0);\n\n const { initialMessages, isLoading, saveMessages, clearMessages } = chatPersistence;\n const { summary, lastSummarizedMessageId, maybeTriggerSummarization } = useSummarization({ maxMessages });\n\n const {\n messages,\n sendMessage: _sendMessage,\n status,\n error,\n regenerate,\n setMessages,\n } = useChat({\n transport:\n chatTransport ??\n new BoundedChatTransport({\n api: '/api/peam',\n maxMessages,\n }),\n });\n\n const isIdle = useMemo(() => status !== 'submitted' && status !== 'streaming', [status]);\n\n useEffect(() => {\n if (!(isLoading || isInitialized) && initialMessages.length > 0) {\n setMessages(initialMessages);\n lastSavedMessageCount.current = initialMessages.length;\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setIsInitialized(true);\n } else if (!(isLoading || isInitialized)) {\n setIsInitialized(true);\n }\n }, [isLoading, initialMessages, isInitialized, setMessages]);\n\n useEffect(() => {\n if (isInitialized && !isLoading && !isSyncing.current && isIdle) {\n if (initialMessages.length !== lastSavedMessageCount.current) {\n isSyncing.current = true;\n setMessages(initialMessages);\n lastSavedMessageCount.current = initialMessages.length;\n setTimeout(() => {\n isSyncing.current = false;\n }, 100);\n }\n }\n }, [initialMessages, isInitialized, isLoading, setMessages, isIdle]);\n\n useEffect(() => {\n if (isInitialized && messages.length >= 0 && !isSyncing.current && isIdle) {\n saveMessages(messages);\n lastSavedMessageCount.current = messages.length;\n }\n }, [messages, saveMessages, isInitialized, isIdle]);\n\n // Trigger summarization\n useEffect(() => {\n if (!isIdle || !isInitialized) {\n return;\n }\n\n const timeoutId = setTimeout(() => {\n maybeTriggerSummarization(messages);\n }, 300);\n\n return () => clearTimeout(timeoutId);\n }, [messages, isIdle, isInitialized, maybeTriggerSummarization]);\n\n const sendMessage = useCallback(\n (message: { text: string }) => {\n _sendMessage(\n {\n ...message,\n ...{\n metadata: {\n currentPage: {\n title: window.document.title,\n origin: window.location.origin,\n path: window.location.pathname,\n },\n },\n },\n },\n {\n body: { summary, lastSummarizedMessageId },\n }\n );\n },\n [_sendMessage, summary, lastSummarizedMessageId]\n );\n\n useEffect(() => {\n textareaRef?.current?.focus();\n }, [textareaRef]);\n\n const handleSubmit = useCallback(\n (message: PromptInputMessage) => {\n const hasText = Boolean(message.text);\n\n if (!hasText) {\n return;\n }\n\n sendMessage({\n text: message.text,\n });\n setInput('');\n },\n [sendMessage, setInput]\n );\n\n const handleSuggestedPromptClick = useCallback(\n (prompt: string) => {\n sendMessage({\n text: prompt,\n });\n },\n [sendMessage]\n );\n\n const handleCopy = useCallback(\n async (messageId: string, text: string) => {\n await navigator.clipboard.writeText(text);\n setCopiedMessageId(messageId);\n setTimeout(() => setCopiedMessageId(null), 2000);\n },\n [setCopiedMessageId]\n );\n\n const handleClearChat = useCallback(async () => {\n try {\n await clearMessages();\n setMessages([]);\n } catch (error) {\n log.error('Failed to clear chat history:', error);\n }\n }, [clearMessages, setMessages]);\n\n useEffect(() => {\n if (onClearRef) {\n onClearRef(handleClearChat);\n }\n }, [onClearRef, handleClearChat]);\n\n const getErrorMessage = (error: Error) => {\n try {\n const parsed = JSON.parse(error.message);\n\n if (parsed.error) {\n return parsed.error;\n }\n } catch {\n // noop\n }\n\n return 'An error occurred while processing your request.';\n };\n\n return (\n <div className=\"flex flex-col h-full bg-background rounded-sm\">\n <Conversation>\n <ConversationContent\n className={messages.length === 0 && !error && !isLoading ? 'justify-between min-h-full' : ''}\n >\n {isLoading ? (\n <div className=\"flex items-center justify-center flex-1\">\n <ConversationEmptyState\n icon={<PeamIcon className=\"size-12 animate-pulse\" />}\n title=\"Loading chat history...\"\n description=\"Please wait\"\n />\n </div>\n ) : messages.length === 0 && !error ? (\n <>\n <div className=\"flex items-center justify-center flex-1\">\n <ConversationEmptyState\n icon={<PeamIcon className=\"size-12\" />}\n title=\"Ask me anything\"\n description=\"How can I help you today?\"\n />\n </div>\n <SuggestedPrompts prompts={suggestedPrompts} onPromptClick={handleSuggestedPromptClick} />\n </>\n ) : (\n <>\n {messages.map((message, index) => {\n const sourceParts = message.parts.filter((part) => part.type === 'source-url');\n const uniqueSources = Array.from(new Map(sourceParts.map((part) => [part.sourceId, part])).values());\n const uniqueSourceCount = uniqueSources.length;\n const isLastMessage = index === messages.length - 1;\n const isAssistant = message.role === 'assistant';\n const isStreaming = isLastMessage && status === 'streaming';\n const isReady = !isStreaming;\n\n const textContent = message.parts\n .filter((part) => part.type === 'text')\n .map((part) => part.text)\n .join('\\n');\n\n const hasText = textContent.length > 0;\n const showShimmer = isAssistant && isStreaming && !hasText;\n const showActions = isAssistant && isReady && hasText;\n\n return (\n <div key={message.id}>\n {isAssistant && uniqueSourceCount > 0 && (\n <Sources>\n <SourcesTrigger count={uniqueSourceCount} />\n {uniqueSources.map((part) => {\n return (\n <SourcesContent key={`${message.id}-source-${part.sourceId}`}>\n <Source href={part.url} title={part.title || part.url} />\n </SourcesContent>\n );\n })}\n </Sources>\n )}\n\n <Message from={message.role}>\n <MessageContent>\n {message.parts.map((part, i) => {\n switch (part.type) {\n case 'text':\n return <MessageResponse key={`${message.id}-${i}`}>{part.text}</MessageResponse>;\n default:\n return null;\n }\n })}\n\n {showShimmer && <Shimmer>Thinking...</Shimmer>}\n </MessageContent>\n\n {showActions && (\n <MessageActions>\n <MessageAction\n onClick={() => handleCopy(message.id, textContent)}\n tooltip={copiedMessageId === message.id ? 'Copied!' : 'Copy'}\n label=\"Copy\"\n >\n {copiedMessageId === message.id ? (\n <Check className=\"size-4\" />\n ) : (\n <Copy className=\"size-4\" />\n )}\n </MessageAction>\n <MessageAction\n onClick={() => regenerate({ messageId: message.id })}\n tooltip=\"Regenerate\"\n label=\"Regenerate\"\n >\n <RefreshCcw className=\"size-4\" />\n </MessageAction>\n </MessageActions>\n )}\n </Message>\n </div>\n );\n })}\n\n {error && (\n <Message from=\"assistant\">\n <MessageContent>\n <div className=\"font-semibold text-destructive\">{getErrorMessage(error)}</div>\n </MessageContent>\n <MessageActions>\n <MessageAction onClick={() => regenerate()} tooltip=\"Retry\" label=\"Retry\">\n <RefreshCcw className=\"size-4\" />\n </MessageAction>\n </MessageActions>\n </Message>\n )}\n </>\n )}\n </ConversationContent>\n <ConversationScrollButton />\n </Conversation>\n\n <div className=\"p-4 shrink-0\">\n <PromptInput onSubmit={handleSubmit}>\n <PromptInputBody>\n <PromptInputTextarea\n value={input}\n ref={textareaRef}\n placeholder=\"Type your question...\"\n onChange={(e) => setInput(e.currentTarget.value)}\n maxLength={1000}\n />\n </PromptInputBody>\n <PromptInputFooter>\n <PromptInputSpeechButton onTranscriptionChange={setInput} textareaRef={textareaRef} />\n <PromptInputSubmit status={status} disabled={!input.trim() && status !== 'streaming'} />\n </PromptInputFooter>\n </PromptInput>\n </div>\n </div>\n );\n};\n","'use client';\n\nimport { Trash2, X } from 'lucide-react';\nimport { useAskAI } from '../hooks/useAskAI';\nimport type { AskAIBaseProps } from './AskAI';\nimport { Chat } from './Chat';\nimport { PeamCloseIcon, PeamIcon } from './icons/peam';\nimport { Tooltip, TooltipContent, TooltipTrigger } from './ui/tooltip';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface AskAIChatProps extends AskAIBaseProps {}\n\nexport function AskAIChat({ suggestedPrompts, button, maxMessages }: AskAIChatProps = {}) {\n const { isOpen, chatClearRef, chatPersistence, handleToggle, handleOpen, handleClose, handleClear } = useAskAI();\n\n return (\n <div className=\"peam-root\">\n {button ? (\n button({ isOpen, toggle: handleToggle, open: handleOpen, close: handleClose })\n ) : (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={handleToggle}\n className=\"fixed right-4 bottom-4 z-50 hover:scale-110 active:scale-90 transition-transform flex items-center justify-center cursor-pointer bg-transparent border-0 p-0\"\n aria-label=\"Ask AI\"\n >\n {isOpen ? (\n <PeamCloseIcon className=\"size-10 drop-shadow-lg\" />\n ) : (\n <PeamIcon className=\"size-10 drop-shadow-lg\" />\n )}\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"left\">Ask AI</TooltipContent>\n </Tooltip>\n )}\n\n {isOpen && (\n <>\n {/* Mobile backdrop */}\n <div\n className=\"fixed inset-0 z-40 bg-black/50 md:hidden animate-in fade-in duration-200 cursor-pointer\"\n onClick={handleClose}\n aria-hidden=\"true\"\n />\n\n {/* Container */}\n <div\n className={`fixed z-50 bg-background flex flex-col\n inset-x-0 bottom-0 h-[66vh] md:h-125 md:inset-auto\n md:right-4 ${button ? 'md:bottom-4' : 'md:bottom-18'} md:w-100 md:rounded-sm\n border-t md:border border-border\n shadow-[0_-4px_20px_rgba(0,0,0,0.25)] md:shadow-xl\n animate-in slide-in-from-bottom duration-300 md:duration-0`}\n >\n <div className=\"absolute top-3 right-3 z-10 flex gap-1\">\n {chatPersistence.initialMessages.length > 0 && (\n <button\n onClick={handleClear}\n className=\"p-1 rounded-full border-0 bg-transparent hover:bg-muted cursor-pointer transition-colors\"\n aria-label=\"Clear chat history\"\n >\n <Trash2 className=\"size-4\" />\n </button>\n )}\n <button\n onClick={handleClose}\n className=\"p-1 rounded-full border-0 bg-transparent hover:bg-muted cursor-pointer transition-colors\"\n aria-label=\"Close Ask AI\"\n >\n <X className=\"size-4\" />\n </button>\n </div>\n\n <div className=\"px-4 py-3 shrink-0 flex items-center gap-2\">\n <PeamIcon className=\"size-5\" />\n <h2 className=\"text-lg font-semibold\">Ask AI</h2>\n </div>\n\n <div className=\"flex-1 min-h-0 h-0\">\n <Chat\n chatPersistence={chatPersistence}\n suggestedPrompts={suggestedPrompts}\n onClearRef={(clearFn) => (chatClearRef.current = clearFn)}\n maxMessages={maxMessages}\n />\n </div>\n </div>\n </>\n )}\n </div>\n );\n}\n","'use client';\n\nimport { Trash2, X } from 'lucide-react';\nimport { useAskAI } from '../hooks/useAskAI';\nimport type { AskAIBaseProps } from './AskAI';\nimport { Chat } from './Chat';\nimport { PeamCloseIcon, PeamIcon } from './icons/peam';\nimport { Tooltip, TooltipContent, TooltipTrigger } from './ui/tooltip';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface AskAIDialogProps extends AskAIBaseProps {}\n\nexport function AskAIDialog({ suggestedPrompts, button, maxMessages }: AskAIDialogProps = {}) {\n const { isOpen, chatClearRef, chatPersistence, handleToggle, handleOpen, handleClose, handleClear } = useAskAI();\n\n return (\n <div className=\"peam-root\">\n {button ? (\n button({ isOpen, toggle: handleToggle, open: handleOpen, close: handleClose })\n ) : (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={handleToggle}\n className=\"fixed right-4 bottom-4 z-60 hover:scale-110 active:scale-90 transition-transform flex items-center justify-center cursor-pointer bg-transparent border-0 p-0\"\n aria-label=\"Ask AI\"\n aria-expanded={isOpen}\n >\n {isOpen ? (\n <PeamCloseIcon className=\"size-10 drop-shadow-lg\" />\n ) : (\n <PeamIcon className=\"size-10 drop-shadow-lg\" />\n )}\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"left\">Ask AI</TooltipContent>\n </Tooltip>\n )}\n\n {isOpen && (\n <>\n <div\n className=\"fixed inset-0 z-40 bg-black/50 animate-in fade-in duration-200 cursor-pointer\"\n onClick={handleClose}\n aria-hidden=\"true\"\n />\n\n <div\n className=\"fixed z-50 inset-0 flex items-center justify-center p-4 md:p-0 cursor-pointer\"\n onClick={handleClose}\n >\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"ask-ai-dialog-title\"\n className=\"bg-background flex flex-col w-full max-w-2xl h-[80vh] md:h-150 rounded-lg border border-border shadow-2xl animate-in zoom-in-95 duration-200 relative cursor-default\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"absolute top-3 right-3 z-10 flex gap-1\">\n {!chatPersistence.isLoading && chatPersistence.initialMessages.length > 0 && (\n <button\n onClick={handleClear}\n className=\"p-1 rounded-full border-0 bg-transparent hover:bg-muted cursor-pointer transition-colors\"\n aria-label=\"Clear chat history\"\n >\n <Trash2 className=\"size-4\" />\n </button>\n )}\n <button\n onClick={handleClose}\n className=\"p-1 rounded-full border-0 bg-transparent hover:bg-muted cursor-pointer transition-colors\"\n aria-label=\"Close dialog\"\n >\n <X className=\"size-4\" />\n </button>\n </div>\n\n <div className=\"px-4 py-3 shrink-0 flex items-center gap-2\">\n <PeamIcon className=\"size-5\" />\n <h2 id=\"ask-ai-dialog-title\" className=\"text-lg font-semibold\">\n Ask AI\n </h2>\n </div>\n\n <div className=\"flex-1 min-h-0 h-0\">\n <Chat\n chatPersistence={chatPersistence}\n suggestedPrompts={suggestedPrompts}\n onClearRef={(clearFn) => (chatClearRef.current = clearFn)}\n maxMessages={maxMessages}\n />\n </div>\n </div>\n </div>\n </>\n )}\n </div>\n );\n}\n","'use client';\n\nimport { Trash2, X } from 'lucide-react';\nimport { useEffect, useRef } from 'react';\nimport { useAskAI } from '../hooks/useAskAI';\nimport type { AskAIBaseProps } from './AskAI';\nimport { Chat } from './Chat';\nimport { PeamIcon } from './icons/peam';\nimport { Tooltip, TooltipContent, TooltipTrigger } from './ui/tooltip';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface AskAISidepaneProps extends AskAIBaseProps {}\n\nexport function AskAISidepane({ suggestedPrompts, button, maxMessages }: AskAISidepaneProps = {}) {\n const { isOpen, chatClearRef, chatPersistence, handleToggle, handleOpen, handleClose, handleClear } = useAskAI();\n const originalBodyStyles = useRef<{ marginRight: string; transition: string } | null>(null);\n\n useEffect(() => {\n const handleBodyMargin = () => {\n const isDesktop = window.innerWidth >= 768;\n\n if (!isDesktop) {\n if (originalBodyStyles.current) {\n document.body.style.marginRight = originalBodyStyles.current.marginRight;\n document.body.style.transition = originalBodyStyles.current.transition;\n }\n return;\n }\n\n // Desktop behavior\n if (isOpen) {\n if (!originalBodyStyles.current) {\n originalBodyStyles.current = {\n marginRight: document.body.style.marginRight,\n transition: document.body.style.transition,\n };\n }\n\n const width = window.innerWidth >= 1024 ? '480px' : '400px';\n document.body.style.marginRight = width;\n document.body.style.transition = 'margin-right 300ms ease-in-out';\n } else if (originalBodyStyles.current) {\n document.body.style.marginRight = originalBodyStyles.current.marginRight;\n document.body.style.transition = originalBodyStyles.current.transition;\n }\n };\n\n handleBodyMargin();\n\n return () => {\n if (originalBodyStyles.current) {\n document.body.style.marginRight = originalBodyStyles.current.marginRight;\n document.body.style.transition = originalBodyStyles.current.transition;\n }\n };\n }, [isOpen]);\n\n return (\n <div className=\"peam-root\">\n {button ? (\n button({ isOpen, toggle: handleToggle, open: handleOpen, close: handleClose })\n ) : isOpen ? (\n <></>\n ) : (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={handleToggle}\n className=\"fixed right-4 bottom-4 z-60 hover:scale-110 active:scale-90 transition-transform flex items-center justify-center cursor-pointer bg-transparent border-0 p-0\"\n aria-label=\"Ask AI\"\n aria-expanded={isOpen}\n >\n <PeamIcon className=\"size-10 drop-shadow-lg\" />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"left\">Ask AI</TooltipContent>\n </Tooltip>\n )}\n\n {isOpen && (\n <>\n {/* Mobile backdrop */}\n <div\n className=\"fixed inset-0 z-40 bg-black/50 md:hidden animate-in fade-in duration-200 cursor-pointer\"\n onClick={handleClose}\n aria-hidden=\"true\"\n />\n\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"ask-ai-sidepane-title\"\n className={`fixed z-50 bg-background flex flex-col\n inset-x-0 bottom-0 h-[66vh] md:inset-auto\n md:right-0 md:top-0 md:h-full md:w-100 lg:w-120\n border-t md:border-t-0 md:border-l border-border\n shadow-[0_-4px_20px_rgba(0,0,0,0.25)] md:shadow-2xl\n animate-in slide-in-from-bottom md:slide-in-from-right duration-300`}\n >\n <div className=\"absolute top-3 right-3 z-10 flex gap-1\">\n {!chatPersistence.isLoading && chatPersistence.initialMessages.length > 0 && (\n <button\n onClick={handleClear}\n className=\"p-1 rounded-full border-0 bg-transparent hover:bg-muted cursor-pointer transition-colors\"\n aria-label=\"Clear chat history\"\n >\n <Trash2 className=\"size-4\" />\n </button>\n )}\n <button\n onClick={handleClose}\n className=\"p-1 rounded-full border-0 bg-transparent hover:bg-muted cursor-pointer transition-colors\"\n aria-label=\"Close sidepane\"\n >\n <X className=\"size-4\" />\n </button>\n </div>\n\n <div className=\"px-4 py-3 shrink-0 flex items-center gap-2\">\n <PeamIcon className=\"size-5\" />\n <h2 id=\"ask-ai-sidepane-title\" className=\"text-lg font-semibold\">\n Ask AI\n </h2>\n </div>\n\n <div className=\"flex-1 min-h-0 h-0\">\n <Chat\n chatPersistence={chatPersistence}\n suggestedPrompts={suggestedPrompts}\n onClearRef={(clearFn) => (chatClearRef.current = clearFn)}\n maxMessages={maxMessages}\n />\n </div>\n </div>\n </>\n )}\n </div>\n );\n}\n","'use client';\n\nimport type { ReactNode } from 'react';\nimport { AskAIChat, type AskAIChatProps } from './AskAIChat';\nimport { AskAIDialog, type AskAIDialogProps } from './AskAIDialog';\nimport { AskAISidepane, type AskAISidepaneProps } from './AskAISidepane';\n\nexport type AskAIType = 'chat' | 'dialog' | 'sidepane';\n\nexport interface AskAIBaseProps {\n /**\n * Array of suggested prompts to display to the user.\n */\n suggestedPrompts?: string[];\n /**\n * Maximum number of messages to keep in context before summarizing.\n * @default 10\n */\n maxMessages?: number;\n /**\n * Custom button component.\n *\n * @example\n * ```tsx\n * <AskAI\n * type=\"dialog\"\n * button={({ isOpen, toggle, open, close }) => (\n * <button onClick={toggle}>\n * {isOpen ? 'Close' : 'Open'} AI\n * </button>\n * )}\n * />\n * ```\n */\n button?: (props: { isOpen: boolean; toggle: () => void; open: () => void; close: () => void }) => ReactNode;\n}\n\nexport type AskAIProps =\n | ({ type?: 'chat' } & AskAIChatProps)\n | ({ type: 'dialog' } & AskAIDialogProps)\n | ({ type: 'sidepane' } & AskAISidepaneProps);\n\nexport function AskAI({ type = 'chat', ...props }: AskAIProps) {\n switch (type) {\n case 'dialog':\n return <AskAIDialog {...props} />;\n case 'sidepane':\n return <AskAISidepane {...props} />;\n case 'chat':\n default:\n return <AskAIChat {...props} />;\n }\n}\n"]}