@tetrascience-npm/tetrascience-react-ui 0.5.0-beta.39.1 → 0.5.0-beta.41.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/dist/components/ai/attachments.cjs +2 -0
  2. package/dist/components/ai/attachments.cjs.map +1 -0
  3. package/dist/components/ai/attachments.js +224 -0
  4. package/dist/components/ai/attachments.js.map +1 -0
  5. package/dist/components/ai/chain-of-thought.cjs +2 -0
  6. package/dist/components/ai/chain-of-thought.cjs.map +1 -0
  7. package/dist/components/ai/chain-of-thought.js +145 -0
  8. package/dist/components/ai/chain-of-thought.js.map +1 -0
  9. package/dist/components/ai/confirmation.cjs +2 -0
  10. package/dist/components/ai/confirmation.cjs.map +1 -0
  11. package/dist/components/ai/confirmation.js +109 -0
  12. package/dist/components/ai/confirmation.js.map +1 -0
  13. package/dist/components/ai/context.cjs +2 -0
  14. package/dist/components/ai/context.cjs.map +1 -0
  15. package/dist/components/ai/context.js +266 -0
  16. package/dist/components/ai/context.js.map +1 -0
  17. package/dist/components/ai/conversation.cjs +4 -0
  18. package/dist/components/ai/conversation.cjs.map +1 -0
  19. package/dist/components/ai/conversation.js +108 -0
  20. package/dist/components/ai/conversation.js.map +1 -0
  21. package/dist/components/ai/inline-citation.cjs +2 -0
  22. package/dist/components/ai/inline-citation.cjs.map +1 -0
  23. package/dist/components/ai/inline-citation.js +182 -0
  24. package/dist/components/ai/inline-citation.js.map +1 -0
  25. package/dist/components/ai/message.cjs +2 -0
  26. package/dist/components/ai/message.cjs.map +1 -0
  27. package/dist/components/ai/message.js +237 -0
  28. package/dist/components/ai/message.js.map +1 -0
  29. package/dist/components/ai/model-selector.cjs +2 -0
  30. package/dist/components/ai/model-selector.cjs.map +1 -0
  31. package/dist/components/ai/model-selector.js +77 -0
  32. package/dist/components/ai/model-selector.js.map +1 -0
  33. package/dist/components/ai/prompt-input.cjs +2 -0
  34. package/dist/components/ai/prompt-input.cjs.map +1 -0
  35. package/dist/components/ai/prompt-input.js +774 -0
  36. package/dist/components/ai/prompt-input.js.map +1 -0
  37. package/dist/components/ai/queue.cjs +2 -0
  38. package/dist/components/ai/queue.cjs.map +1 -0
  39. package/dist/components/ai/queue.js +209 -0
  40. package/dist/components/ai/queue.js.map +1 -0
  41. package/dist/components/ai/reasoning.cjs +2 -0
  42. package/dist/components/ai/reasoning.cjs.map +1 -0
  43. package/dist/components/ai/reasoning.js +129 -0
  44. package/dist/components/ai/reasoning.js.map +1 -0
  45. package/dist/components/ai/shimmer.cjs +2 -0
  46. package/dist/components/ai/shimmer.cjs.map +1 -0
  47. package/dist/components/ai/shimmer.js +49 -0
  48. package/dist/components/ai/shimmer.js.map +1 -0
  49. package/dist/components/ai/sources.cjs +2 -0
  50. package/dist/components/ai/sources.cjs.map +1 -0
  51. package/dist/components/ai/sources.js +54 -0
  52. package/dist/components/ai/sources.js.map +1 -0
  53. package/dist/components/ai/speech-input.cjs +2 -0
  54. package/dist/components/ai/speech-input.cjs.map +1 -0
  55. package/dist/components/ai/speech-input.js +123 -0
  56. package/dist/components/ai/speech-input.js.map +1 -0
  57. package/dist/components/ai/stream-status.cjs +2 -0
  58. package/dist/components/ai/stream-status.cjs.map +1 -0
  59. package/dist/components/ai/stream-status.js +106 -0
  60. package/dist/components/ai/stream-status.js.map +1 -0
  61. package/dist/components/ai/suggestion.cjs +2 -0
  62. package/dist/components/ai/suggestion.cjs.map +1 -0
  63. package/dist/components/ai/suggestion.js +38 -0
  64. package/dist/components/ai/suggestion.js.map +1 -0
  65. package/dist/components/ai/task.cjs +2 -0
  66. package/dist/components/ai/task.cjs.map +1 -0
  67. package/dist/components/ai/task.js +94 -0
  68. package/dist/components/ai/task.js.map +1 -0
  69. package/dist/components/ai/tool.cjs +2 -0
  70. package/dist/components/ai/tool.cjs.map +1 -0
  71. package/dist/components/ai/tool.js +143 -0
  72. package/dist/components/ai/tool.js.map +1 -0
  73. package/dist/components/composed/Chat/Chat.cjs +2 -0
  74. package/dist/components/composed/Chat/Chat.cjs.map +1 -0
  75. package/dist/components/composed/Chat/Chat.js +167 -0
  76. package/dist/components/composed/Chat/Chat.js.map +1 -0
  77. package/dist/components/ui/code-block.cjs +4 -0
  78. package/dist/components/ui/code-block.cjs.map +1 -0
  79. package/dist/components/ui/code-block.js +306 -0
  80. package/dist/components/ui/code-block.js.map +1 -0
  81. package/dist/components/ui/progress.cjs +2 -0
  82. package/dist/components/ui/progress.cjs.map +1 -0
  83. package/dist/components/ui/progress.js +32 -0
  84. package/dist/components/ui/progress.js.map +1 -0
  85. package/dist/index.cjs +1 -1
  86. package/dist/index.css +1 -1
  87. package/dist/index.d.ts +1145 -0
  88. package/dist/index.js +574 -372
  89. package/dist/index.js.map +1 -1
  90. package/dist/index.tailwind.css +1 -1
  91. package/package.json +12 -1
@@ -0,0 +1,77 @@
1
+ import { jsx as e, jsxs as m } from "react/jsx-runtime";
2
+ import { Command as s, CommandDialog as c, CommandEmpty as n, CommandGroup as d, CommandInput as i, CommandItem as g, CommandList as p, CommandSeparator as u } from "../ui/command.js";
3
+ import { Dialog as S, DialogContent as M, DialogTitle as f, DialogTrigger as h } from "../ui/dialog.js";
4
+ import { Kbd as C } from "../ui/kbd.js";
5
+ import { cn as l } from "../../lib/utils.js";
6
+ const k = (o) => /* @__PURE__ */ e(S, { ...o }), v = (o) => /* @__PURE__ */ e(h, { ...o }), I = ({
7
+ className: o,
8
+ children: t,
9
+ title: r = "Model Selector",
10
+ ...a
11
+ }) => /* @__PURE__ */ m(
12
+ M,
13
+ {
14
+ "aria-describedby": void 0,
15
+ className: l(
16
+ "outline! border-none! p-0 outline-border! outline-solid!",
17
+ o
18
+ ),
19
+ ...a,
20
+ children: [
21
+ /* @__PURE__ */ e(f, { className: "sr-only", children: r }),
22
+ /* @__PURE__ */ e(s, { className: "**:data-[slot=command-input-wrapper]:h-auto", children: t })
23
+ ]
24
+ }
25
+ ), L = (o) => /* @__PURE__ */ e(c, { ...o }), G = ({
26
+ className: o,
27
+ ...t
28
+ }) => /* @__PURE__ */ e(i, { className: l("h-auto py-3.5", o), ...t }), T = (o) => /* @__PURE__ */ e(p, { ...o }), j = (o) => /* @__PURE__ */ e(n, { ...o }), w = (o) => /* @__PURE__ */ e(d, { ...o }), E = (o) => /* @__PURE__ */ e(g, { ...o }), $ = ({
29
+ className: o,
30
+ ...t
31
+ }) => /* @__PURE__ */ e(C, { className: l("ml-auto", o), ...t }), z = (o) => /* @__PURE__ */ e(u, { ...o }), K = ({
32
+ provider: o,
33
+ className: t,
34
+ ...r
35
+ }) => /* @__PURE__ */ e(
36
+ "img",
37
+ {
38
+ ...r,
39
+ alt: `${o} logo`,
40
+ className: l("size-3 dark:invert", t),
41
+ height: 12,
42
+ src: `https://models.dev/logos/${o}.svg`,
43
+ width: 12
44
+ }
45
+ ), q = ({
46
+ className: o,
47
+ ...t
48
+ }) => /* @__PURE__ */ e(
49
+ "div",
50
+ {
51
+ className: l(
52
+ "flex shrink-0 items-center -space-x-1 [&>img]:rounded-full [&>img]:bg-background [&>img]:p-px [&>img]:ring-1 dark:[&>img]:bg-foreground",
53
+ o
54
+ ),
55
+ ...t
56
+ }
57
+ ), A = ({
58
+ className: o,
59
+ ...t
60
+ }) => /* @__PURE__ */ e("span", { className: l("flex-1 truncate text-left", o), ...t });
61
+ export {
62
+ k as ModelSelector,
63
+ I as ModelSelectorContent,
64
+ L as ModelSelectorDialog,
65
+ j as ModelSelectorEmpty,
66
+ w as ModelSelectorGroup,
67
+ G as ModelSelectorInput,
68
+ E as ModelSelectorItem,
69
+ T as ModelSelectorList,
70
+ K as ModelSelectorLogo,
71
+ q as ModelSelectorLogoGroup,
72
+ A as ModelSelectorName,
73
+ z as ModelSelectorSeparator,
74
+ $ as ModelSelectorShortcut,
75
+ v as ModelSelectorTrigger
76
+ };
77
+ //# sourceMappingURL=model-selector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-selector.js","sources":["../../../src/components/ai/model-selector.tsx"],"sourcesContent":["import type { ComponentProps, ReactNode } from \"react\";\n\nimport {\n Command,\n CommandDialog,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n} from \"@/components/ui/command\";\nimport {\n Dialog,\n DialogContent,\n DialogTitle,\n DialogTrigger,\n} from \"@/components/ui/dialog\";\nimport { Kbd } from \"@/components/ui/kbd\";\nimport { cn } from \"@/lib/utils\";\n\nexport type ModelSelectorProps = ComponentProps<typeof Dialog>;\n\nexport const ModelSelector = (props: ModelSelectorProps) => (\n <Dialog {...props} />\n);\n\nexport type ModelSelectorTriggerProps = ComponentProps<typeof DialogTrigger>;\n\nexport const ModelSelectorTrigger = (props: ModelSelectorTriggerProps) => (\n <DialogTrigger {...props} />\n);\n\nexport type ModelSelectorContentProps = ComponentProps<typeof DialogContent> & {\n title?: ReactNode;\n};\n\nexport const ModelSelectorContent = ({\n className,\n children,\n title = \"Model Selector\",\n ...props\n}: ModelSelectorContentProps) => (\n <DialogContent\n aria-describedby={undefined}\n className={cn(\n \"outline! border-none! p-0 outline-border! outline-solid!\",\n className\n )}\n {...props}\n >\n <DialogTitle className=\"sr-only\">{title}</DialogTitle>\n <Command className=\"**:data-[slot=command-input-wrapper]:h-auto\">\n {children}\n </Command>\n </DialogContent>\n);\n\nexport type ModelSelectorDialogProps = ComponentProps<typeof CommandDialog>;\n\nexport const ModelSelectorDialog = (props: ModelSelectorDialogProps) => (\n <CommandDialog {...props} />\n);\n\nexport type ModelSelectorInputProps = ComponentProps<typeof CommandInput>;\n\nexport const ModelSelectorInput = ({\n className,\n ...props\n}: ModelSelectorInputProps) => (\n <CommandInput className={cn(\"h-auto py-3.5\", className)} {...props} />\n);\n\nexport type ModelSelectorListProps = ComponentProps<typeof CommandList>;\n\nexport const ModelSelectorList = (props: ModelSelectorListProps) => (\n <CommandList {...props} />\n);\n\nexport type ModelSelectorEmptyProps = ComponentProps<typeof CommandEmpty>;\n\nexport const ModelSelectorEmpty = (props: ModelSelectorEmptyProps) => (\n <CommandEmpty {...props} />\n);\n\nexport type ModelSelectorGroupProps = ComponentProps<typeof CommandGroup>;\n\nexport const ModelSelectorGroup = (props: ModelSelectorGroupProps) => (\n <CommandGroup {...props} />\n);\n\nexport type ModelSelectorItemProps = ComponentProps<typeof CommandItem>;\n\nexport const ModelSelectorItem = (props: ModelSelectorItemProps) => (\n <CommandItem {...props} />\n);\n\nexport type ModelSelectorShortcutProps = ComponentProps<typeof Kbd>;\n\nexport const ModelSelectorShortcut = ({\n className,\n ...props\n}: ModelSelectorShortcutProps) => (\n <Kbd className={cn(\"ml-auto\", className)} {...props} />\n);\n\nexport type ModelSelectorSeparatorProps = ComponentProps<\n typeof CommandSeparator\n>;\n\nexport const ModelSelectorSeparator = (props: ModelSelectorSeparatorProps) => (\n <CommandSeparator {...props} />\n);\n\nexport type ModelSelectorLogoProps = Omit<\n ComponentProps<\"img\">,\n \"src\" | \"alt\"\n> & {\n provider:\n | \"moonshotai-cn\"\n | \"lucidquery\"\n | \"moonshotai\"\n | \"zai-coding-plan\"\n | \"alibaba\"\n | \"xai\"\n | \"vultr\"\n | \"nvidia\"\n | \"upstage\"\n | \"groq\"\n | \"github-copilot\"\n | \"mistral\"\n | \"vercel\"\n | \"nebius\"\n | \"deepseek\"\n | \"alibaba-cn\"\n | \"google-vertex-anthropic\"\n | \"venice\"\n | \"chutes\"\n | \"cortecs\"\n | \"github-models\"\n | \"togetherai\"\n | \"azure\"\n | \"baseten\"\n | \"huggingface\"\n | \"opencode\"\n | \"fastrouter\"\n | \"google\"\n | \"google-vertex\"\n | \"cloudflare-workers-ai\"\n | \"inception\"\n | \"wandb\"\n | \"openai\"\n | \"zhipuai-coding-plan\"\n | \"perplexity\"\n | \"openrouter\"\n | \"zenmux\"\n | \"v0\"\n | \"iflowcn\"\n | \"synthetic\"\n | \"deepinfra\"\n | \"zhipuai\"\n | \"submodel\"\n | \"zai\"\n | \"inference\"\n | \"requesty\"\n | \"morph\"\n | \"lmstudio\"\n | \"anthropic\"\n | \"aihubmix\"\n | \"fireworks-ai\"\n | \"modelscope\"\n | \"llama\"\n | \"scaleway\"\n | \"amazon-bedrock\"\n | \"cerebras\"\n // oxlint-disable-next-line typescript-eslint(ban-types) -- intentional pattern for autocomplete-friendly string union\n | (string & {});\n};\n\nexport const ModelSelectorLogo = ({\n provider,\n className,\n ...props\n}: ModelSelectorLogoProps) => (\n <img\n {...props}\n alt={`${provider} logo`}\n className={cn(\"size-3 dark:invert\", className)}\n height={12}\n src={`https://models.dev/logos/${provider}.svg`}\n width={12}\n />\n);\n\nexport type ModelSelectorLogoGroupProps = ComponentProps<\"div\">;\n\nexport const ModelSelectorLogoGroup = ({\n className,\n ...props\n}: ModelSelectorLogoGroupProps) => (\n <div\n className={cn(\n \"flex shrink-0 items-center -space-x-1 [&>img]:rounded-full [&>img]:bg-background [&>img]:p-px [&>img]:ring-1 dark:[&>img]:bg-foreground\",\n className\n )}\n {...props}\n />\n);\n\nexport type ModelSelectorNameProps = ComponentProps<\"span\">;\n\nexport const ModelSelectorName = ({\n className,\n ...props\n}: ModelSelectorNameProps) => (\n <span className={cn(\"flex-1 truncate text-left\", className)} {...props} />\n);\n"],"names":["ModelSelector","props","jsx","Dialog","ModelSelectorTrigger","DialogTrigger","ModelSelectorContent","className","children","title","jsxs","DialogContent","cn","DialogTitle","Command","ModelSelectorDialog","CommandDialog","ModelSelectorInput","CommandInput","ModelSelectorList","CommandList","ModelSelectorEmpty","CommandEmpty","ModelSelectorGroup","CommandGroup","ModelSelectorItem","CommandItem","ModelSelectorShortcut","Kbd","ModelSelectorSeparator","CommandSeparator","ModelSelectorLogo","provider","ModelSelectorLogoGroup","ModelSelectorName"],"mappings":";;;;;AAuBO,MAAMA,IAAgB,CAACC,MAC5B,gBAAAC,EAACC,GAAA,EAAQ,GAAGF,EAAA,CAAO,GAKRG,IAAuB,CAACH,MACnC,gBAAAC,EAACG,GAAA,EAAe,GAAGJ,EAAA,CAAO,GAOfK,IAAuB,CAAC;AAAA,EACnC,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,OAAAC,IAAQ;AAAA,EACR,GAAGR;AACL,MACE,gBAAAS;AAAA,EAACC;AAAA,EAAA;AAAA,IACC,oBAAkB;AAAA,IAClB,WAAWC;AAAA,MACT;AAAA,MACAL;AAAA,IAAA;AAAA,IAED,GAAGN;AAAA,IAEJ,UAAA;AAAA,MAAA,gBAAAC,EAACW,GAAA,EAAY,WAAU,WAAW,UAAAJ,GAAM;AAAA,MACxC,gBAAAP,EAACY,GAAA,EAAQ,WAAU,+CAChB,UAAAN,EAAA,CACH;AAAA,IAAA;AAAA,EAAA;AACF,GAKWO,IAAsB,CAACd,MAClC,gBAAAC,EAACc,GAAA,EAAe,GAAGf,EAAA,CAAO,GAKfgB,IAAqB,CAAC;AAAA,EACjC,WAAAV;AAAA,EACA,GAAGN;AACL,MACE,gBAAAC,EAACgB,KAAa,WAAWN,EAAG,iBAAiBL,CAAS,GAAI,GAAGN,EAAA,CAAO,GAKzDkB,IAAoB,CAAClB,MAChC,gBAAAC,EAACkB,GAAA,EAAa,GAAGnB,EAAA,CAAO,GAKboB,IAAqB,CAACpB,MACjC,gBAAAC,EAACoB,GAAA,EAAc,GAAGrB,EAAA,CAAO,GAKdsB,IAAqB,CAACtB,MACjC,gBAAAC,EAACsB,GAAA,EAAc,GAAGvB,EAAA,CAAO,GAKdwB,IAAoB,CAACxB,MAChC,gBAAAC,EAACwB,GAAA,EAAa,GAAGzB,EAAA,CAAO,GAKb0B,IAAwB,CAAC;AAAA,EACpC,WAAApB;AAAA,EACA,GAAGN;AACL,MACE,gBAAAC,EAAC0B,KAAI,WAAWhB,EAAG,WAAWL,CAAS,GAAI,GAAGN,EAAA,CAAO,GAO1C4B,IAAyB,CAAC5B,MACrC,gBAAAC,EAAC4B,GAAA,EAAkB,GAAG7B,EAAA,CAAO,GAoElB8B,IAAoB,CAAC;AAAA,EAChC,UAAAC;AAAA,EACA,WAAAzB;AAAA,EACA,GAAGN;AACL,MACE,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACE,GAAGD;AAAA,IACJ,KAAK,GAAG+B,CAAQ;AAAA,IAChB,WAAWpB,EAAG,sBAAsBL,CAAS;AAAA,IAC7C,QAAQ;AAAA,IACR,KAAK,4BAA4ByB,CAAQ;AAAA,IACzC,OAAO;AAAA,EAAA;AACT,GAKWC,IAAyB,CAAC;AAAA,EACrC,WAAA1B;AAAA,EACA,GAAGN;AACL,MACE,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,WAAWU;AAAA,MACT;AAAA,MACAL;AAAA,IAAA;AAAA,IAED,GAAGN;AAAA,EAAA;AACN,GAKWiC,IAAoB,CAAC;AAAA,EAChC,WAAA3B;AAAA,EACA,GAAGN;AACL,MACE,gBAAAC,EAAC,UAAK,WAAWU,EAAG,6BAA6BL,CAAS,GAAI,GAAGN,EAAA,CAAO;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react/jsx-runtime"),M=require("lucide-react"),n=require("react"),D=require("../ui/command.cjs"),E=require("../ui/dropdown-menu.cjs"),K=require("../ui/hover-card.cjs"),O=require("../ui/input-group.cjs"),q=require("../ui/select.cjs"),pe=require("../ui/spinner.cjs"),V=require("../ui/tooltip.cjs"),l=require("../../lib/utils.cjs"),de=async e=>{try{const o=await(await fetch(e)).blob();return new Promise(s=>{const u=new FileReader;u.onloadend=()=>s(u.result),u.onerror=()=>s(null),u.readAsDataURL(o)})}catch{return null}},fe=async()=>{if(typeof navigator>"u"||!navigator.mediaDevices?.getDisplayMedia)return null;let e=null;const t=document.createElement("video");t.muted=!0,t.playsInline=!0;try{e=await navigator.mediaDevices.getDisplayMedia({audio:!1,video:!0}),t.srcObject=e,await new Promise((g,b)=>{t.onloadedmetadata=()=>g(),t.onerror=()=>b(new Error("Failed to load screen stream"))}),await t.play();const o=t.videoWidth,s=t.videoHeight;if(!o||!s)return null;const u=document.createElement("canvas");u.width=o,u.height=s;const i=u.getContext("2d");if(!i)return null;i.drawImage(t,0,0,o,s);const a=await new Promise(g=>{u.toBlob(g,"image/png")});if(!a)return null;const h=new Date().toISOString().replace(/[:.]/g,"-").replace("T","_").replace("Z","");return new File([a],`screenshot-${h}.png`,{lastModified:Date.now(),type:"image/png"})}finally{if(e)for(const o of e.getTracks())o.stop();t.pause(),t.srcObject=null}},X=n.createContext(null),Z=n.createContext(null),Ie=()=>{const e=n.useContext(X);if(!e)throw new Error("Wrap your component inside <PromptInputProvider> to use usePromptInputController().");return e},$=()=>n.useContext(X),he=()=>{const e=n.useContext(Z);if(!e)throw new Error("Wrap your component inside <PromptInputProvider> to use useProviderAttachments().");return e},ge=()=>n.useContext(Z),Pe=({initialInput:e="",children:t})=>{const[o,s]=n.useState(e),u=n.useCallback(()=>s(""),[]),[i,a]=n.useState([]),h=n.useRef(null),g=n.useRef(()=>{}),b=n.useCallback(m=>{const v=[...m];v.length!==0&&a(A=>[...A,...v.map(k=>({filename:k.name,id:crypto.randomUUID(),mediaType:k.type,type:"file",url:URL.createObjectURL(k)}))])},[]),R=n.useCallback(m=>{a(v=>{const A=v.find(k=>k.id===m);return A?.url&&URL.revokeObjectURL(A.url),v.filter(k=>k.id!==m)})},[]),f=n.useCallback(()=>{a(m=>{for(const v of m)v.url&&URL.revokeObjectURL(v.url);return[]})},[]),P=n.useRef(i);n.useEffect(()=>{P.current=i},[i]),n.useEffect(()=>()=>{for(const m of P.current)m.url&&URL.revokeObjectURL(m.url)},[]);const S=n.useCallback(()=>{g.current?.()},[]),d=n.useMemo(()=>({add:b,clear:f,fileInputRef:h,files:i,openFileDialog:S,remove:R}),[i,b,R,f,S]),w=n.useCallback((m,v)=>{h.current=m.current,g.current=v},[]),T=n.useMemo(()=>({__registerFileInput:w,attachments:d,textInput:{clear:u,setInput:s,value:o}}),[o,u,d,w]);return r.jsx(X.Provider,{value:T,children:r.jsx(Z.Provider,{value:d,children:t})})},ee=n.createContext(null),G=()=>{const e=ge(),o=n.useContext(ee)??e;if(!o)throw new Error("usePromptInputAttachments must be used within a PromptInput or PromptInputProvider");return o},J=n.createContext(null),xe=()=>{const e=n.useContext(J);if(!e)throw new Error("usePromptInputReferencedSources must be used within a LocalReferencedSourcesContext.Provider");return e},Ce=({label:e="Add photos or files",...t})=>{const o=G(),s=n.useCallback(u=>{u.preventDefault(),o.openFileDialog()},[o]);return r.jsxs(E.DropdownMenuItem,{...t,onSelect:s,children:[r.jsx(M.ImageIcon,{className:"mr-2 size-4"})," ",e]})},ve=({label:e="Take screenshot",onSelect:t,...o})=>{const s=G(),u=n.useCallback(async i=>{if(t?.(i),!i.defaultPrevented)try{const a=await fe();a&&s.add([a])}catch(a){if(a instanceof DOMException&&(a.name==="NotAllowedError"||a.name==="AbortError"))return;throw a}},[t,s]);return r.jsxs(E.DropdownMenuItem,{...o,onSelect:u,children:[r.jsx(M.Monitor,{className:"mr-2 size-4"}),e]})},be=({className:e,accept:t,multiple:o,globalDrop:s,syncHiddenInput:u,maxFiles:i,maxFileSize:a,onError:h,onSubmit:g,children:b,...R})=>{const f=$(),P=!!f,S=n.useRef(null),d=n.useRef(null),[w,T]=n.useState([]),m=P?f.attachments.files:w,[v,A]=n.useState([]),k=n.useRef(m);n.useEffect(()=>{k.current=m},[m]);const ne=n.useCallback(()=>{S.current?.click()},[]),z=n.useCallback(c=>!t||t.trim()===""?!0:t.split(",").map(p=>p.trim()).filter(Boolean).some(p=>{if(p.endsWith("/*")){const C=p.slice(0,-1);return c.type.startsWith(C)}return c.type===p}),[t]),re=n.useCallback(c=>{const I=[...c],p=I.filter(y=>z(y));if(I.length&&p.length===0){h?.({code:"accept",message:"No files match the accepted types."});return}const C=y=>a?y.size<=a:!0,x=p.filter(C);if(p.length>0&&x.length===0){h?.({code:"max_file_size",message:"All files exceed the maximum size."});return}T(y=>{const j=typeof i=="number"?Math.max(0,i-y.length):void 0,L=typeof j=="number"?x.slice(0,j):x;typeof j=="number"&&x.length>j&&h?.({code:"max_files",message:"Too many files. Some were not added."});const U=[];for(const W of L)U.push({filename:W.name,id:crypto.randomUUID(),mediaType:W.type,type:"file",url:URL.createObjectURL(W)});return[...y,...U]})},[z,i,a,h]),oe=n.useCallback(c=>T(I=>{const p=I.find(C=>C.id===c);return p?.url&&URL.revokeObjectURL(p.url),I.filter(C=>C.id!==c)}),[]),se=n.useCallback(c=>{const I=[...c],p=I.filter(U=>z(U));if(I.length&&p.length===0){h?.({code:"accept",message:"No files match the accepted types."});return}const C=U=>a?U.size<=a:!0,x=p.filter(C);if(p.length>0&&x.length===0){h?.({code:"max_file_size",message:"All files exceed the maximum size."});return}const y=m.length,j=typeof i=="number"?Math.max(0,i-y):void 0,L=typeof j=="number"?x.slice(0,j):x;typeof j=="number"&&x.length>j&&h?.({code:"max_files",message:"Too many files. Some were not added."}),L.length>0&&f?.attachments.add(L)},[z,a,i,h,m.length,f]),B=n.useCallback(()=>P?f?.attachments.clear():T(c=>{for(const I of c)I.url&&URL.revokeObjectURL(I.url);return[]}),[P,f]),H=n.useCallback(()=>A([]),[]),N=P?se:re,Q=P?f.attachments.remove:oe,Y=P?f.attachments.openFileDialog:ne,F=n.useCallback(()=>{B(),H()},[B,H]);n.useEffect(()=>{P&&f.__registerFileInput(S,()=>S.current?.click())},[P,f]),n.useEffect(()=>{u&&S.current&&m.length===0&&(S.current.value="")},[m,u]);const _=n.useCallback((c,I)=>{const p=x=>{x.dataTransfer?.types?.includes("Files")&&x.preventDefault()},C=x=>{const y=x;y.dataTransfer?.types?.includes("Files")&&x.preventDefault(),y.dataTransfer?.files&&y.dataTransfer.files.length>0&&I(y.dataTransfer.files)};return c.addEventListener("dragover",p),c.addEventListener("drop",C),()=>{c.removeEventListener("dragover",p),c.removeEventListener("drop",C)}},[]);n.useEffect(()=>{const c=d.current;if(c&&!s)return _(c,N)},[N,s,_]),n.useEffect(()=>{if(s)return _(document,N)},[N,s,_]),n.useEffect(()=>()=>{if(!P)for(const c of k.current)c.url&&URL.revokeObjectURL(c.url)},[P]);const ce=n.useCallback(c=>{c.currentTarget.files&&N(c.currentTarget.files),c.currentTarget.value=""},[N]),ae=n.useMemo(()=>({add:N,clear:B,fileInputRef:S,files:m.map(c=>({...c,id:c.id})),openFileDialog:Y,remove:Q}),[m,N,Q,B,Y]),ue=n.useMemo(()=>({add:c=>{const I=Array.isArray(c)?c:[c];A(p=>[...p,...I.map(C=>({...C,id:crypto.randomUUID()}))])},clear:H,remove:c=>{A(I=>I.filter(p=>p.id!==c))},sources:v}),[v,H]),ie=n.useCallback(async c=>{c.preventDefault();const I=c.currentTarget,p=P?f.textInput.value:new FormData(I).get("message")||"";P||I.reset();try{const C=await Promise.all(m.map(async({id:y,...j})=>{if(j.url?.startsWith("blob:")){const L=await de(j.url);return{...j,url:L??j.url}}return j})),x=g({files:C,text:p},c);if(x instanceof Promise)try{await x,F(),P&&f.textInput.clear()}catch{}else F(),P&&f.textInput.clear()}catch{}},[P,f,m,g,F]),le=r.jsxs(r.Fragment,{children:[r.jsx("input",{accept:t,"aria-label":"Upload files",className:"hidden",multiple:o,onChange:ce,ref:S,title:"Upload files",type:"file"}),r.jsx("form",{className:l.cn("w-full",e),onSubmit:ie,ref:d,...R,children:r.jsx(O.InputGroup,{className:"border-border overflow-hidden has-[[data-slot=input-group-control]:focus-visible]:ring-0",children:b})})]}),me=r.jsx(J.Provider,{value:ue,children:le});return r.jsx(ee.Provider,{value:ae,children:me})},ye=({className:e,...t})=>r.jsx("div",{className:l.cn("contents",e),...t}),je=({onChange:e,onKeyDown:t,className:o,placeholder:s="What would you like to know?",...u})=>{const i=$(),a=G(),[h,g]=n.useState(!1),b=n.useCallback(d=>{if(t?.(d),!d.defaultPrevented){if(d.key==="Enter"){if(h||d.nativeEvent.isComposing||d.shiftKey)return;d.preventDefault();const{form:w}=d.currentTarget;if(w?.querySelector('button[type="submit"]')?.disabled)return;w?.requestSubmit()}if(d.key==="Backspace"&&d.currentTarget.value===""&&a.files.length>0){d.preventDefault();const w=a.files[a.files.length-1];w&&a.remove(w.id)}}},[t,h,a]),R=n.useCallback(d=>{const w=d.clipboardData?.items;if(!w)return;const T=[];for(const m of w)if(m.kind==="file"){const v=m.getAsFile();v&&T.push(v)}T.length>0&&(d.preventDefault(),a.add(T))},[a]),f=n.useCallback(()=>g(!1),[]),P=n.useCallback(()=>g(!0),[]),S=i?{onChange:d=>{i.textInput.setInput(d.currentTarget.value),e?.(d)},value:i.textInput.value}:{onChange:e};return r.jsx(O.InputGroupTextarea,{className:l.cn("field-sizing-content max-h-48 min-h-16",o),name:"message",onCompositionEnd:f,onCompositionStart:P,onKeyDown:b,onPaste:R,placeholder:s,...u,...S})},we=({className:e,...t})=>r.jsx(O.InputGroupAddon,{align:"block-end",className:l.cn("order-first flex-wrap gap-1",e),...t}),Se=({className:e,...t})=>r.jsx(O.InputGroupAddon,{align:"block-end",className:l.cn("justify-between gap-1",e),...t}),Te=({className:e,...t})=>r.jsx("div",{className:l.cn("flex min-w-0 items-center gap-1",e),...t}),te=({variant:e="ghost",className:t,size:o,tooltip:s,...u})=>{const i=o??(n.Children.count(u.children)>1?"sm":"icon-sm"),a=r.jsx(O.InputGroupButton,{className:l.cn(t),size:i,type:"button",variant:e,...u});if(!s)return a;const h=typeof s=="string"?s:s.content,g=typeof s=="string"?void 0:s.shortcut,b=typeof s=="string"?"top":s.side??"top";return r.jsxs(V.Tooltip,{children:[r.jsx(V.TooltipTrigger,{asChild:!0,children:a}),r.jsxs(V.TooltipContent,{side:b,children:[h,g&&r.jsx("span",{className:"ml-2 text-muted-foreground",children:g})]})]})},ke=e=>r.jsx(E.DropdownMenu,{...e}),Re=({className:e,children:t,tooltip:o,"aria-label":s,...u})=>{const i=s??(typeof o=="string"?o:typeof o?.content=="string"?o.content:void 0);return r.jsx(E.DropdownMenuTrigger,{asChild:!0,children:r.jsx(te,{"aria-label":i,className:e,tooltip:o,...u,children:t??r.jsx(M.PlusIcon,{className:"size-4"})})})},Ae=({className:e,...t})=>r.jsx(E.DropdownMenuContent,{align:"start",className:l.cn(e),...t}),Ne=({className:e,...t})=>r.jsx(E.DropdownMenuItem,{className:l.cn(e),...t}),De=({className:e,variant:t="default",size:o="icon-sm",status:s,onStop:u,onClick:i,children:a,...h})=>{const g=s==="submitted"||s==="streaming";let b=r.jsx(M.CornerDownLeftIcon,{className:"size-4"});s==="submitted"?b=r.jsx(pe.Spinner,{}):s==="streaming"?b=r.jsx(M.SquareIcon,{className:"size-4"}):s==="error"&&(b=r.jsx(M.XIcon,{className:"size-4"}));const R=n.useCallback(f=>{if(g&&u){f.preventDefault(),u();return}i?.(f)},[g,u,i]);return r.jsx(O.InputGroupButton,{"aria-label":g?"Stop":"Submit",className:l.cn(e),onClick:R,size:o,type:g&&u?"button":"submit",variant:t,...h,children:a??b})},Le=e=>r.jsx(q.Select,{...e}),Ue=({className:e,...t})=>r.jsx(q.SelectTrigger,{className:l.cn("border-none bg-transparent font-medium text-muted-foreground shadow-none transition-colors","hover:bg-accent hover:text-foreground aria-expanded:bg-accent aria-expanded:text-foreground",e),...t}),Me=({className:e,...t})=>r.jsx(q.SelectContent,{className:l.cn(e),...t}),Ee=({className:e,...t})=>r.jsx(q.SelectItem,{className:l.cn(e),...t}),Oe=({className:e,...t})=>r.jsx(q.SelectValue,{className:l.cn(e),...t}),qe=({openDelay:e=0,closeDelay:t=0,...o})=>r.jsx(K.HoverCard,{closeDelay:t,openDelay:e,...o}),ze=e=>r.jsx(K.HoverCardTrigger,{...e}),Be=({align:e="start",...t})=>r.jsx(K.HoverCardContent,{align:e,...t}),He=({a:e,b:t,show:o,className:s})=>r.jsxs("div",{className:l.cn("relative inline-flex items-center justify-center",s),children:[r.jsx("div",{"aria-hidden":o,className:l.cn("transition-all duration-200 ease-out",o?"pointer-events-none scale-75 opacity-0":"scale-100 opacity-100"),children:e}),r.jsx("div",{"aria-hidden":!o,className:l.cn("absolute transition-all duration-200 ease-out",o?"scale-100 opacity-100":"pointer-events-none scale-75 opacity-0"),children:t})]}),_e=({className:e,...t})=>r.jsx("div",{className:l.cn(e),...t}),Ge=({className:e,...t})=>r.jsx("div",{className:l.cn(e),...t}),Fe=({className:e,children:t,...o})=>r.jsx("h3",{className:l.cn("mb-2 px-3 font-medium text-muted-foreground text-xs",e),...o,children:t}),We=({className:e,...t})=>r.jsx("div",{className:l.cn("space-y-1",e),...t}),Ve=({className:e,...t})=>r.jsx("div",{className:l.cn("flex items-center gap-2 px-3 py-2 text-xs hover:bg-accent",e),...t}),Ke=({className:e,...t})=>r.jsx(D.Command,{className:l.cn(e),...t}),Xe=({className:e,...t})=>r.jsx(D.CommandInput,{className:l.cn(e),...t}),Ze=({className:e,...t})=>r.jsx(D.CommandList,{className:l.cn(e),...t}),Je=({className:e,...t})=>r.jsx(D.CommandEmpty,{className:l.cn(e),...t}),Qe=({className:e,...t})=>r.jsx(D.CommandGroup,{className:l.cn(e),...t}),Ye=({className:e,...t})=>r.jsx(D.CommandItem,{className:l.cn(e),...t}),$e=({className:e,...t})=>r.jsx(D.CommandSeparator,{className:l.cn(e),...t});exports.LocalReferencedSourcesContext=J;exports.PromptInput=be;exports.PromptInputActionAddAttachments=Ce;exports.PromptInputActionAddScreenshot=ve;exports.PromptInputActionMenu=ke;exports.PromptInputActionMenuContent=Ae;exports.PromptInputActionMenuItem=Ne;exports.PromptInputActionMenuTrigger=Re;exports.PromptInputBody=ye;exports.PromptInputButton=te;exports.PromptInputCommand=Ke;exports.PromptInputCommandEmpty=Je;exports.PromptInputCommandGroup=Qe;exports.PromptInputCommandInput=Xe;exports.PromptInputCommandItem=Ye;exports.PromptInputCommandList=Ze;exports.PromptInputCommandSeparator=$e;exports.PromptInputFooter=Se;exports.PromptInputHeader=we;exports.PromptInputHoverCard=qe;exports.PromptInputHoverCardContent=Be;exports.PromptInputHoverCardTrigger=ze;exports.PromptInputProvider=Pe;exports.PromptInputSelect=Le;exports.PromptInputSelectContent=Me;exports.PromptInputSelectItem=Ee;exports.PromptInputSelectTrigger=Ue;exports.PromptInputSelectValue=Oe;exports.PromptInputSlotSwap=He;exports.PromptInputSubmit=De;exports.PromptInputTab=Ge;exports.PromptInputTabBody=We;exports.PromptInputTabItem=Ve;exports.PromptInputTabLabel=Fe;exports.PromptInputTabsList=_e;exports.PromptInputTextarea=je;exports.PromptInputTools=Te;exports.usePromptInputAttachments=G;exports.usePromptInputController=Ie;exports.usePromptInputReferencedSources=xe;exports.useProviderAttachments=he;
2
+ //# sourceMappingURL=prompt-input.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-input.cjs","sources":["../../../src/components/ai/prompt-input.tsx"],"sourcesContent":["import {\n CornerDownLeftIcon,\n ImageIcon,\n Monitor,\n PlusIcon,\n SquareIcon,\n XIcon,\n} from \"lucide-react\";\nimport {\n Children,\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport type { ChatStatus, FileUIPart, SourceDocumentUIPart } from \"ai\";\nimport type {\n ChangeEvent,\n ChangeEventHandler,\n ClipboardEventHandler,\n ComponentProps,\n FormEvent,\n FormEventHandler,\n HTMLAttributes,\n KeyboardEventHandler,\n PropsWithChildren,\n ReactNode,\n RefObject,\n} from \"react\";\n\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 {\n HoverCard,\n HoverCardContent,\n HoverCardTrigger,\n} from \"@/components/ui/hover-card\";\nimport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupTextarea,\n} from \"@/components/ui/input-group\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\";\nimport { Spinner } from \"@/components/ui/spinner\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { cn } from \"@/lib/utils\";\n\n\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nconst convertBlobUrlToDataUrl = async (url: string): Promise<string | null> => {\n try {\n const response = await fetch(url);\n const blob = await response.blob();\n // FileReader uses callback-based API, wrapping in Promise is necessary\n // oxlint-disable-next-line eslint-plugin-promise(avoid-new)\n return new Promise((resolve) => {\n const reader = new FileReader();\n // oxlint-disable-next-line eslint-plugin-unicorn(prefer-add-event-listener)\n reader.onloadend = () => resolve(reader.result as string);\n // oxlint-disable-next-line eslint-plugin-unicorn(prefer-add-event-listener)\n reader.onerror = () => resolve(null);\n reader.readAsDataURL(blob);\n });\n } catch {\n return null;\n }\n};\n\nconst captureScreenshot = async (): Promise<File | null> => {\n if (\n typeof navigator === \"undefined\" ||\n !navigator.mediaDevices?.getDisplayMedia\n ) {\n return null;\n }\n\n let stream: MediaStream | null = null;\n const video = document.createElement(\"video\");\n video.muted = true;\n video.playsInline = true;\n\n try {\n stream = await navigator.mediaDevices.getDisplayMedia({\n audio: false,\n video: true,\n });\n\n video.srcObject = stream;\n\n // Video element uses callback-based API, wrapping in Promise is necessary\n // oxlint-disable-next-line eslint-plugin-promise(avoid-new)\n await new Promise<void>((resolve, reject) => {\n // oxlint-disable-next-line eslint-plugin-unicorn(prefer-add-event-listener)\n video.onloadedmetadata = () => resolve();\n // oxlint-disable-next-line eslint-plugin-unicorn(prefer-add-event-listener)\n video.onerror = () => reject(new Error(\"Failed to load screen stream\"));\n });\n\n await video.play();\n\n const width = video.videoWidth;\n const height = video.videoHeight;\n if (!width || !height) {\n return null;\n }\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n const context = canvas.getContext(\"2d\");\n if (!context) {\n return null;\n }\n\n context.drawImage(video, 0, 0, width, height);\n // canvas.toBlob uses callback-based API, wrapping in Promise is necessary\n // oxlint-disable-next-line eslint-plugin-promise(avoid-new)\n const blob = await new Promise<Blob | null>((resolve) => {\n canvas.toBlob(resolve, \"image/png\");\n });\n if (!blob) {\n return null;\n }\n\n const timestamp = new Date()\n .toISOString()\n .replace(/[:.]/g, \"-\")\n .replace(\"T\", \"_\")\n .replace(\"Z\", \"\");\n\n return new File([blob], `screenshot-${timestamp}.png`, {\n lastModified: Date.now(),\n type: \"image/png\",\n });\n } finally {\n if (stream) {\n for (const track of stream.getTracks()) {\n track.stop();\n }\n }\n video.pause();\n video.srcObject = null;\n }\n};\n\n// ============================================================================\n// Provider Context & Types\n// ============================================================================\n\nexport interface AttachmentsContext {\n files: (FileUIPart & { id: string })[];\n add: (files: File[] | FileList) => void;\n remove: (id: string) => void;\n clear: () => void;\n openFileDialog: () => void;\n fileInputRef: RefObject<HTMLInputElement | null>;\n}\n\nexport interface TextInputContext {\n value: string;\n setInput: (v: string) => void;\n clear: () => void;\n}\n\nexport interface PromptInputControllerProps {\n textInput: TextInputContext;\n attachments: AttachmentsContext;\n /** INTERNAL: Allows PromptInput to register its file textInput + \"open\" callback */\n __registerFileInput: (\n ref: RefObject<HTMLInputElement | null>,\n open: () => void\n ) => void;\n}\n\nconst PromptInputController = createContext<PromptInputControllerProps | null>(\n null\n);\nconst ProviderAttachmentsContext = createContext<AttachmentsContext | null>(\n null\n);\n\nexport const usePromptInputController = () => {\n const ctx = useContext(PromptInputController);\n if (!ctx) {\n throw new Error(\n \"Wrap your component inside <PromptInputProvider> to use usePromptInputController().\"\n );\n }\n return ctx;\n};\n\n// Optional variants (do NOT throw). Useful for dual-mode components.\nconst useOptionalPromptInputController = () =>\n useContext(PromptInputController);\n\nexport const useProviderAttachments = () => {\n const ctx = useContext(ProviderAttachmentsContext);\n if (!ctx) {\n throw new Error(\n \"Wrap your component inside <PromptInputProvider> to use useProviderAttachments().\"\n );\n }\n return ctx;\n};\n\nconst useOptionalProviderAttachments = () =>\n useContext(ProviderAttachmentsContext);\n\nexport type PromptInputProviderProps = PropsWithChildren<{\n initialInput?: string;\n}>;\n\n/**\n * Optional global provider that lifts PromptInput state outside of PromptInput.\n * If you don't use it, PromptInput stays fully self-managed.\n */\nexport const PromptInputProvider = ({\n initialInput: initialTextInput = \"\",\n children,\n}: 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<\n (FileUIPart & { id: string })[]\n >([]);\n const fileInputRef = useRef<HTMLInputElement | null>(null);\n // oxlint-disable-next-line eslint(no-empty-function)\n const openRef = useRef<() => void>(() => {});\n\n const add = useCallback((files: File[] | FileList) => {\n const incoming = [...files];\n if (incoming.length === 0) {\n return;\n }\n\n setAttachmentFiles((prev) => [\n ...prev,\n ...incoming.map((file) => ({\n filename: file.name,\n id: crypto.randomUUID(),\n mediaType: file.type,\n type: \"file\" as const,\n url: URL.createObjectURL(file),\n })),\n ]);\n }, []);\n\n const remove = useCallback((id: string) => {\n setAttachmentFiles((prev) => {\n const found = prev.find((f) => f.id === id);\n if (found?.url) {\n URL.revokeObjectURL(found.url);\n }\n return prev.filter((f) => f.id !== id);\n });\n }, []);\n\n const clear = useCallback(() => {\n setAttachmentFiles((prev) => {\n for (const f of prev) {\n if (f.url) {\n URL.revokeObjectURL(f.url);\n }\n }\n return [];\n });\n }, []);\n\n // Keep a ref to attachments for cleanup on unmount (avoids stale closure)\n const attachmentsRef = useRef(attachmentFiles);\n\n useEffect(() => {\n attachmentsRef.current = attachmentFiles;\n }, [attachmentFiles]);\n\n // Cleanup blob URLs on unmount to prevent memory leaks\n useEffect(\n () => () => {\n for (const f of attachmentsRef.current) {\n if (f.url) {\n URL.revokeObjectURL(f.url);\n }\n }\n },\n []\n );\n\n const openFileDialog = useCallback(() => {\n openRef.current?.();\n }, []);\n\n const attachments = useMemo<AttachmentsContext>(\n () => ({\n add,\n clear,\n fileInputRef,\n files: attachmentFiles,\n openFileDialog,\n remove,\n }),\n [attachmentFiles, add, remove, clear, openFileDialog]\n );\n\n const __registerFileInput = useCallback(\n (ref: RefObject<HTMLInputElement | null>, open: () => void) => {\n fileInputRef.current = ref.current;\n openRef.current = open;\n },\n []\n );\n\n const controller = useMemo<PromptInputControllerProps>(\n () => ({\n __registerFileInput,\n attachments,\n textInput: {\n clear: clearInput,\n setInput: setTextInput,\n value: textInput,\n },\n }),\n [textInput, clearInput, attachments, __registerFileInput]\n );\n\n return (\n <PromptInputController.Provider value={controller}>\n <ProviderAttachmentsContext.Provider value={attachments}>\n {children}\n </ProviderAttachmentsContext.Provider>\n </PromptInputController.Provider>\n );\n};\n\n// ============================================================================\n// Component Context & Hooks\n// ============================================================================\n\nconst LocalAttachmentsContext = createContext<AttachmentsContext | null>(null);\n\nexport const usePromptInputAttachments = () => {\n // Prefer local context (inside PromptInput) as it has validation, fall back to provider\n const provider = useOptionalProviderAttachments();\n const local = useContext(LocalAttachmentsContext);\n const context = local ?? provider;\n if (!context) {\n throw new Error(\n \"usePromptInputAttachments must be used within a PromptInput or PromptInputProvider\"\n );\n }\n return context;\n};\n\n// ============================================================================\n// Referenced Sources (Local to PromptInput)\n// ============================================================================\n\nexport interface ReferencedSourcesContext {\n sources: (SourceDocumentUIPart & { id: string })[];\n add: (sources: SourceDocumentUIPart[] | SourceDocumentUIPart) => void;\n remove: (id: string) => void;\n clear: () => void;\n}\n\nexport const LocalReferencedSourcesContext =\n createContext<ReferencedSourcesContext | null>(null);\n\nexport const usePromptInputReferencedSources = () => {\n const ctx = useContext(LocalReferencedSourcesContext);\n if (!ctx) {\n throw new Error(\n \"usePromptInputReferencedSources must be used within a LocalReferencedSourcesContext.Provider\"\n );\n }\n return ctx;\n};\n\nexport type PromptInputActionAddAttachmentsProps = ComponentProps<\n typeof DropdownMenuItem\n> & {\n label?: string;\n};\n\nexport const PromptInputActionAddAttachments = ({\n label = \"Add photos or files\",\n ...props\n}: PromptInputActionAddAttachmentsProps) => {\n const attachments = usePromptInputAttachments();\n\n const handleSelect = useCallback(\n (e: Event) => {\n e.preventDefault();\n attachments.openFileDialog();\n },\n [attachments]\n );\n\n return (\n <DropdownMenuItem {...props} onSelect={handleSelect}>\n <ImageIcon className=\"mr-2 size-4\" /> {label}\n </DropdownMenuItem>\n );\n};\n\nexport type PromptInputActionAddScreenshotProps = ComponentProps<\n typeof DropdownMenuItem\n> & {\n label?: string;\n};\n\nexport const PromptInputActionAddScreenshot = ({\n label = \"Take screenshot\",\n onSelect,\n ...props\n}: PromptInputActionAddScreenshotProps) => {\n const attachments = usePromptInputAttachments();\n\n const handleSelect = useCallback(\n async (event: Event) => {\n onSelect?.(event);\n if (event.defaultPrevented) {\n return;\n }\n\n try {\n const screenshot = await captureScreenshot();\n if (screenshot) {\n attachments.add([screenshot]);\n }\n } catch (error) {\n if (\n error instanceof DOMException &&\n (error.name === \"NotAllowedError\" || error.name === \"AbortError\")\n ) {\n return;\n }\n throw error;\n }\n },\n [onSelect, attachments]\n );\n\n return (\n <DropdownMenuItem {...props} onSelect={handleSelect}>\n <Monitor className=\"mr-2 size-4\" />\n {label}\n </DropdownMenuItem>\n );\n};\n\nexport interface PromptInputMessage {\n text: string;\n files: FileUIPart[];\n}\n\nexport type PromptInputProps = Omit<\n HTMLAttributes<HTMLFormElement>,\n \"onSubmit\" | \"onError\"\n> & {\n // e.g., \"image/*\" or leave undefined for any\n accept?: string;\n multiple?: boolean;\n // When true, accepts drops anywhere on document. Default false (opt-in).\n globalDrop?: boolean;\n // Render a hidden input with given name and keep it in sync for native form posts. Default false.\n syncHiddenInput?: boolean;\n // Minimal constraints\n maxFiles?: number;\n // bytes\n maxFileSize?: number;\n onError?: (err: {\n code: \"max_files\" | \"max_file_size\" | \"accept\";\n message: string;\n }) => void;\n onSubmit: (\n message: PromptInputMessage,\n event: FormEvent<HTMLFormElement>\n ) => void | Promise<void>;\n};\n\nexport const PromptInput = ({\n className,\n accept,\n multiple,\n globalDrop,\n syncHiddenInput,\n maxFiles,\n maxFileSize,\n onError,\n onSubmit,\n children,\n ...props\n}: PromptInputProps) => {\n // Try to use a provider controller if present\n const controller = useOptionalPromptInputController();\n const usingProvider = !!controller;\n\n // Refs\n const inputRef = useRef<HTMLInputElement | null>(null);\n const formRef = useRef<HTMLFormElement | null>(null);\n\n // ----- Local attachments (only used when no provider)\n const [items, setItems] = useState<(FileUIPart & { id: string })[]>([]);\n const files = usingProvider ? controller.attachments.files : items;\n\n // ----- Local referenced sources (always local to PromptInput)\n const [referencedSources, setReferencedSources] = useState<\n (SourceDocumentUIPart & { id: string })[]\n >([]);\n\n // Keep a ref to files for cleanup on unmount (avoids stale closure)\n const filesRef = useRef(files);\n\n useEffect(() => {\n filesRef.current = files;\n }, [files]);\n\n const openFileDialogLocal = useCallback(() => {\n inputRef.current?.click();\n }, []);\n\n const matchesAccept = useCallback(\n (f: File) => {\n if (!accept || accept.trim() === \"\") {\n return true;\n }\n\n const patterns = accept\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n\n return patterns.some((pattern) => {\n if (pattern.endsWith(\"/*\")) {\n // e.g: image/* -> image/\n const prefix = pattern.slice(0, -1);\n return f.type.startsWith(prefix);\n }\n return f.type === pattern;\n });\n },\n [accept]\n );\n\n const addLocal = useCallback(\n (fileList: File[] | FileList) => {\n const incoming = [...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) =>\n 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 =\n typeof maxFiles === \"number\"\n ? Math.max(0, maxFiles - prev.length)\n : undefined;\n const capped =\n typeof capacity === \"number\" ? sized.slice(0, capacity) : sized;\n if (typeof capacity === \"number\" && sized.length > capacity) {\n onError?.({\n code: \"max_files\",\n message: \"Too many files. Some were not added.\",\n });\n }\n const next: (FileUIPart & { id: string })[] = [];\n for (const file of capped) {\n next.push({\n filename: file.name,\n id: crypto.randomUUID(),\n mediaType: file.type,\n type: \"file\",\n url: URL.createObjectURL(file),\n });\n }\n return [...prev, ...next];\n });\n },\n [matchesAccept, maxFiles, maxFileSize, onError]\n );\n\n const removeLocal = useCallback(\n (id: string) =>\n setItems((prev) => {\n const found = prev.find((file) => file.id === id);\n if (found?.url) {\n URL.revokeObjectURL(found.url);\n }\n return prev.filter((file) => file.id !== id);\n }),\n []\n );\n\n // Wrapper that validates files before calling provider's add\n const addWithProviderValidation = useCallback(\n (fileList: File[] | FileList) => {\n const incoming = [...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) =>\n maxFileSize ? f.size <= maxFileSize : true;\n const sized = accepted.filter(withinSize);\n if (accepted.length > 0 && sized.length === 0) {\n onError?.({\n code: \"max_file_size\",\n message: \"All files exceed the maximum size.\",\n });\n return;\n }\n\n const currentCount = files.length;\n const capacity =\n typeof maxFiles === \"number\"\n ? Math.max(0, maxFiles - currentCount)\n : undefined;\n const capped =\n typeof capacity === \"number\" ? sized.slice(0, capacity) : sized;\n if (typeof capacity === \"number\" && sized.length > capacity) {\n onError?.({\n code: \"max_files\",\n message: \"Too many files. Some were not added.\",\n });\n }\n\n if (capped.length > 0) {\n controller?.attachments.add(capped);\n }\n },\n [matchesAccept, maxFileSize, maxFiles, onError, files.length, controller]\n );\n\n const clearAttachments = useCallback(\n () =>\n usingProvider\n ? controller?.attachments.clear()\n : setItems((prev) => {\n for (const file of prev) {\n if (file.url) {\n URL.revokeObjectURL(file.url);\n }\n }\n return [];\n }),\n [usingProvider, controller]\n );\n\n const clearReferencedSources = useCallback(\n () => setReferencedSources([]),\n []\n );\n\n const add = usingProvider ? addWithProviderValidation : addLocal;\n const remove = usingProvider ? controller.attachments.remove : removeLocal;\n const openFileDialog = usingProvider\n ? controller.attachments.openFileDialog\n : openFileDialogLocal;\n\n const clear = useCallback(() => {\n clearAttachments();\n clearReferencedSources();\n }, [clearAttachments, clearReferencedSources]);\n\n // Let provider know about our hidden file input so external menus can call openFileDialog()\n useEffect(() => {\n if (!usingProvider) {\n return;\n }\n controller.__registerFileInput(inputRef, () => inputRef.current?.click());\n }, [usingProvider, controller]);\n\n // Note: File input cannot be programmatically set for security reasons\n // The syncHiddenInput prop is no longer functional\n useEffect(() => {\n if (syncHiddenInput && inputRef.current && files.length === 0) {\n inputRef.current.value = \"\";\n }\n }, [files, syncHiddenInput]);\n\n // Shared drag-and-drop handlers used by both form-level and document-level effects\n const makeDragHandlers = useCallback(\n (target: HTMLElement | Document, onAddFiles: (files: FileList) => void) => {\n const onDragOver = (e: Event) => {\n const drag = e as DragEvent;\n if (drag.dataTransfer?.types?.includes(\"Files\")) {\n e.preventDefault();\n }\n };\n const onDrop = (e: Event) => {\n const drag = e as DragEvent;\n if (drag.dataTransfer?.types?.includes(\"Files\")) {\n e.preventDefault();\n }\n if (drag.dataTransfer?.files && drag.dataTransfer.files.length > 0) {\n onAddFiles(drag.dataTransfer.files);\n }\n };\n target.addEventListener(\"dragover\", onDragOver);\n target.addEventListener(\"drop\", onDrop);\n return () => {\n target.removeEventListener(\"dragover\", onDragOver);\n target.removeEventListener(\"drop\", onDrop);\n };\n },\n []\n );\n\n // Attach drop handlers on nearest form and document (opt-in)\n useEffect(() => {\n const form = formRef.current;\n if (!form) {\n return;\n }\n if (globalDrop) {\n // when global drop is on, let the document-level handler own drops\n return;\n }\n return makeDragHandlers(form, add);\n }, [add, globalDrop, makeDragHandlers]);\n\n useEffect(() => {\n if (!globalDrop) {\n return;\n }\n return makeDragHandlers(document, add);\n }, [add, globalDrop, makeDragHandlers]);\n\n useEffect(\n () => () => {\n if (!usingProvider) {\n for (const f of filesRef.current) {\n if (f.url) {\n URL.revokeObjectURL(f.url);\n }\n }\n }\n },\n [usingProvider]\n );\n\n const handleChange: ChangeEventHandler<HTMLInputElement> = useCallback(\n (event) => {\n if (event.currentTarget.files) {\n add(event.currentTarget.files);\n }\n // Reset input value to allow selecting files that were previously removed\n event.currentTarget.value = \"\";\n },\n [add]\n );\n\n const attachmentsCtx = useMemo<AttachmentsContext>(\n () => ({\n add,\n clear: clearAttachments,\n fileInputRef: inputRef,\n files: files.map((item) => ({ ...item, id: item.id })),\n openFileDialog,\n remove,\n }),\n [files, add, remove, clearAttachments, openFileDialog]\n );\n\n const refsCtx = useMemo<ReferencedSourcesContext>(\n () => ({\n add: (incoming: SourceDocumentUIPart[] | SourceDocumentUIPart) => {\n const array = Array.isArray(incoming) ? incoming : [incoming];\n setReferencedSources((prev) => [\n ...prev,\n ...array.map((s) => ({ ...s, id: crypto.randomUUID() })),\n ]);\n },\n clear: clearReferencedSources,\n remove: (id: string) => {\n setReferencedSources((prev) => prev.filter((s) => s.id !== id));\n },\n sources: referencedSources,\n }),\n [referencedSources, clearReferencedSources]\n );\n\n const handleSubmit: FormEventHandler<HTMLFormElement> = useCallback(\n async (event) => {\n event.preventDefault();\n\n const form = event.currentTarget;\n const text = usingProvider\n ? controller.textInput.value\n : (() => {\n const formData = new FormData(form);\n return (formData.get(\"message\") as string) || \"\";\n })();\n\n // Reset form immediately after capturing text to avoid race condition\n // where user input during async blob conversion would be lost\n if (!usingProvider) {\n form.reset();\n }\n\n try {\n // Convert blob URLs to data URLs asynchronously\n const convertedFiles: FileUIPart[] = await Promise.all(\n files.map(async ({ id: _id, ...item }) => {\n if (item.url?.startsWith(\"blob:\")) {\n const dataUrl = await convertBlobUrlToDataUrl(item.url);\n // If conversion failed, keep the original blob URL\n return {\n ...item,\n url: dataUrl ?? item.url,\n };\n }\n return item;\n })\n );\n\n const result = onSubmit({ files: convertedFiles, text }, event);\n\n // Handle both sync and async onSubmit\n if (result instanceof Promise) {\n try {\n await result;\n clear();\n if (usingProvider) {\n controller.textInput.clear();\n }\n } catch {\n // Don't clear on error - user may want to retry\n }\n } else {\n // Sync function completed without throwing, clear inputs\n clear();\n if (usingProvider) {\n controller.textInput.clear();\n }\n }\n } catch {\n // Don't clear on error - user may want to retry\n }\n },\n [usingProvider, controller, files, onSubmit, clear]\n );\n\n // Render with or without local provider\n const inner = (\n <>\n <input\n accept={accept}\n aria-label=\"Upload files\"\n className=\"hidden\"\n multiple={multiple}\n onChange={handleChange}\n ref={inputRef}\n title=\"Upload files\"\n type=\"file\"\n />\n <form\n className={cn(\"w-full\", className)}\n onSubmit={handleSubmit}\n ref={formRef}\n {...props}\n >\n <InputGroup className=\"border-border overflow-hidden has-[[data-slot=input-group-control]:focus-visible]:ring-0\">{children}</InputGroup>\n </form>\n </>\n );\n\n const withReferencedSources = (\n <LocalReferencedSourcesContext.Provider value={refsCtx}>\n {inner}\n </LocalReferencedSourcesContext.Provider>\n );\n\n // Always provide LocalAttachmentsContext so children get validated add function\n return (\n <LocalAttachmentsContext.Provider value={attachmentsCtx}>\n {withReferencedSources}\n </LocalAttachmentsContext.Provider>\n );\n};\n\nexport type PromptInputBodyProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputBody = ({\n className,\n ...props\n}: PromptInputBodyProps) => (\n <div className={cn(\"contents\", className)} {...props} />\n);\n\nexport type PromptInputTextareaProps = ComponentProps<\n typeof InputGroupTextarea\n>;\n\nexport const PromptInputTextarea = ({\n onChange,\n onKeyDown,\n className,\n placeholder = \"What would you like to know?\",\n ...props\n}: PromptInputTextareaProps) => {\n const controller = useOptionalPromptInputController();\n const attachments = usePromptInputAttachments();\n const [isComposing, setIsComposing] = useState(false);\n\n const handleKeyDown: KeyboardEventHandler<HTMLTextAreaElement> = useCallback(\n (e) => {\n // Call the external onKeyDown handler first\n onKeyDown?.(e);\n\n // If the external handler prevented default, don't run internal logic\n if (e.defaultPrevented) {\n return;\n }\n\n if (e.key === \"Enter\") {\n if (isComposing || e.nativeEvent.isComposing) {\n return;\n }\n if (e.shiftKey) {\n return;\n }\n e.preventDefault();\n\n // Check if the submit button is disabled before submitting\n const { form } = e.currentTarget;\n const submitButton = form?.querySelector(\n 'button[type=\"submit\"]'\n ) 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 (\n e.key === \"Backspace\" &&\n e.currentTarget.value === \"\" &&\n attachments.files.length > 0\n ) {\n e.preventDefault();\n const lastAttachment = attachments.files[attachments.files.length - 1];\n if (lastAttachment) {\n attachments.remove(lastAttachment.id);\n }\n }\n },\n [onKeyDown, isComposing, attachments]\n );\n\n const handlePaste: ClipboardEventHandler<HTMLTextAreaElement> = useCallback(\n (event) => {\n const items = event.clipboardData?.items;\n\n if (!items) {\n return;\n }\n\n const files: File[] = [];\n\n for (const item of 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 [attachments]\n );\n\n const handleCompositionEnd = useCallback(() => setIsComposing(false), []);\n const handleCompositionStart = useCallback(() => setIsComposing(true), []);\n\n const controlledProps = controller\n ? {\n onChange: (e: ChangeEvent<HTMLTextAreaElement>) => {\n controller.textInput.setInput(e.currentTarget.value);\n onChange?.(e);\n },\n value: controller.textInput.value,\n }\n : {\n onChange,\n };\n\n return (\n <InputGroupTextarea\n className={cn(\"field-sizing-content max-h-48 min-h-16\", className)}\n name=\"message\"\n onCompositionEnd={handleCompositionEnd}\n onCompositionStart={handleCompositionStart}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n placeholder={placeholder}\n {...props}\n {...controlledProps}\n />\n );\n};\n\nexport type PromptInputHeaderProps = Omit<\n ComponentProps<typeof InputGroupAddon>,\n \"align\"\n>;\n\nexport const PromptInputHeader = ({\n className,\n ...props\n}: PromptInputHeaderProps) => (\n <InputGroupAddon\n align=\"block-end\"\n className={cn(\"order-first flex-wrap gap-1\", className)}\n {...props}\n />\n);\n\nexport type PromptInputFooterProps = Omit<\n ComponentProps<typeof InputGroupAddon>,\n \"align\"\n>;\n\nexport const PromptInputFooter = ({\n className,\n ...props\n}: PromptInputFooterProps) => (\n <InputGroupAddon\n align=\"block-end\"\n className={cn(\"justify-between gap-1\", className)}\n {...props}\n />\n);\n\nexport type PromptInputToolsProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTools = ({\n className,\n ...props\n}: PromptInputToolsProps) => (\n <div\n className={cn(\"flex min-w-0 items-center gap-1\", className)}\n {...props}\n />\n);\n\nexport type PromptInputButtonTooltip =\n | string\n | {\n content: ReactNode;\n shortcut?: string;\n side?: ComponentProps<typeof TooltipContent>[\"side\"];\n };\n\nexport type PromptInputButtonProps = ComponentProps<typeof InputGroupButton> & {\n tooltip?: PromptInputButtonTooltip;\n};\n\nexport const PromptInputButton = ({\n variant = \"ghost\",\n className,\n size,\n tooltip,\n ...props\n}: PromptInputButtonProps) => {\n const newSize =\n size ?? (Children.count(props.children) > 1 ? \"sm\" : \"icon-sm\");\n\n const button = (\n <InputGroupButton\n className={cn(className)}\n size={newSize}\n type=\"button\"\n variant={variant}\n {...props}\n />\n );\n\n if (!tooltip) {\n return button;\n }\n\n const tooltipContent =\n typeof tooltip === \"string\" ? tooltip : tooltip.content;\n const shortcut = typeof tooltip === \"string\" ? undefined : tooltip.shortcut;\n const side = typeof tooltip === \"string\" ? \"top\" : (tooltip.side ?? \"top\");\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent side={side}>\n {tooltipContent}\n {shortcut && (\n <span className=\"ml-2 text-muted-foreground\">{shortcut}</span>\n )}\n </TooltipContent>\n </Tooltip>\n );\n};\n\nexport type PromptInputActionMenuProps = ComponentProps<typeof DropdownMenu>;\nexport const PromptInputActionMenu = (props: PromptInputActionMenuProps) => (\n <DropdownMenu {...props} />\n);\n\nexport type PromptInputActionMenuTriggerProps = PromptInputButtonProps;\n\nexport const PromptInputActionMenuTrigger = ({\n className,\n children,\n tooltip,\n \"aria-label\": ariaLabel,\n ...props\n}: PromptInputActionMenuTriggerProps) => {\n const derivedLabel =\n ariaLabel ??\n (typeof tooltip === \"string\"\n ? tooltip\n : typeof tooltip?.content === \"string\"\n ? tooltip.content\n : undefined);\n\n return (\n <DropdownMenuTrigger asChild>\n <PromptInputButton\n aria-label={derivedLabel}\n className={className}\n tooltip={tooltip}\n {...props}\n >\n {children ?? <PlusIcon className=\"size-4\" />}\n </PromptInputButton>\n </DropdownMenuTrigger>\n );\n};\n\nexport type PromptInputActionMenuContentProps = ComponentProps<\n typeof DropdownMenuContent\n>;\nexport const PromptInputActionMenuContent = ({\n className,\n ...props\n}: PromptInputActionMenuContentProps) => (\n <DropdownMenuContent align=\"start\" className={cn(className)} {...props} />\n);\n\nexport type PromptInputActionMenuItemProps = ComponentProps<\n typeof DropdownMenuItem\n>;\nexport const PromptInputActionMenuItem = ({\n className,\n ...props\n}: PromptInputActionMenuItemProps) => (\n <DropdownMenuItem className={cn(className)} {...props} />\n);\n\n// Note: Actions that perform side-effects (like opening a file dialog)\n// are provided in opt-in modules (e.g., prompt-input-attachments).\n\nexport type PromptInputSubmitProps = ComponentProps<typeof InputGroupButton> & {\n status?: ChatStatus;\n onStop?: () => void;\n};\n\nexport const PromptInputSubmit = ({\n className,\n variant = \"default\",\n size = \"icon-sm\",\n status,\n onStop,\n onClick,\n children,\n ...props\n}: PromptInputSubmitProps) => {\n const isGenerating = status === \"submitted\" || status === \"streaming\";\n\n let Icon = <CornerDownLeftIcon className=\"size-4\" />;\n\n if (status === \"submitted\") {\n Icon = <Spinner />;\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 const handleClick = useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n if (isGenerating && onStop) {\n e.preventDefault();\n onStop();\n return;\n }\n onClick?.(e);\n },\n [isGenerating, onStop, onClick]\n );\n\n return (\n <InputGroupButton\n aria-label={isGenerating ? \"Stop\" : \"Submit\"}\n className={cn(className)}\n onClick={handleClick}\n size={size}\n type={isGenerating && onStop ? \"button\" : \"submit\"}\n variant={variant}\n {...props}\n >\n {children ?? Icon}\n </InputGroupButton>\n );\n};\n\nexport type PromptInputSelectProps = ComponentProps<typeof Select>;\n\nexport const PromptInputSelect = (props: PromptInputSelectProps) => (\n <Select {...props} />\n);\n\nexport type PromptInputSelectTriggerProps = ComponentProps<\n typeof SelectTrigger\n>;\n\nexport const PromptInputSelectTrigger = ({\n className,\n ...props\n}: 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<\n typeof SelectContent\n>;\n\nexport const PromptInputSelectContent = ({\n className,\n ...props\n}: PromptInputSelectContentProps) => (\n <SelectContent className={cn(className)} {...props} />\n);\n\nexport type PromptInputSelectItemProps = ComponentProps<typeof SelectItem>;\n\nexport const PromptInputSelectItem = ({\n className,\n ...props\n}: PromptInputSelectItemProps) => (\n <SelectItem className={cn(className)} {...props} />\n);\n\nexport type PromptInputSelectValueProps = ComponentProps<typeof SelectValue>;\n\nexport const PromptInputSelectValue = ({\n className,\n ...props\n}: PromptInputSelectValueProps) => (\n <SelectValue className={cn(className)} {...props} />\n);\n\nexport type PromptInputHoverCardProps = ComponentProps<typeof HoverCard>;\n\nexport const PromptInputHoverCard = ({\n openDelay = 0,\n closeDelay = 0,\n ...props\n}: PromptInputHoverCardProps) => (\n <HoverCard closeDelay={closeDelay} openDelay={openDelay} {...props} />\n);\n\nexport type PromptInputHoverCardTriggerProps = ComponentProps<\n typeof HoverCardTrigger\n>;\n\nexport const PromptInputHoverCardTrigger = (\n props: PromptInputHoverCardTriggerProps\n) => <HoverCardTrigger {...props} />;\n\nexport type PromptInputHoverCardContentProps = ComponentProps<\n typeof HoverCardContent\n>;\n\nexport const PromptInputHoverCardContent = ({\n align = \"start\",\n ...props\n}: PromptInputHoverCardContentProps) => (\n <HoverCardContent align={align} {...props} />\n);\n\n// ============================================================================\n// PromptInputSlotSwap\n// ============================================================================\n\nexport type PromptInputSlotSwapProps = {\n /** Shown when show=false (e.g. mic button). */\n a: ReactNode;\n /** Shown when show=true (e.g. submit button). */\n b: ReactNode;\n /** When true, b is visible; when false, a is visible. */\n show: boolean;\n className?: string;\n};\n\nexport const PromptInputSlotSwap = ({\n a,\n b,\n show,\n className,\n}: PromptInputSlotSwapProps) => (\n <div\n className={cn(\"relative inline-flex items-center justify-center\", className)}\n >\n <div\n aria-hidden={show}\n className={cn(\n \"transition-all duration-200 ease-out\",\n show ? \"pointer-events-none scale-75 opacity-0\" : \"scale-100 opacity-100\"\n )}\n >\n {a}\n </div>\n <div\n aria-hidden={!show}\n className={cn(\n \"absolute transition-all duration-200 ease-out\",\n show ? \"scale-100 opacity-100\" : \"pointer-events-none scale-75 opacity-0\"\n )}\n >\n {b}\n </div>\n </div>\n);\n\nexport type PromptInputTabsListProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTabsList = ({\n className,\n ...props\n}: PromptInputTabsListProps) => <div className={cn(className)} {...props} />;\n\nexport type PromptInputTabProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTab = ({\n className,\n ...props\n}: PromptInputTabProps) => <div className={cn(className)} {...props} />;\n\nexport type PromptInputTabLabelProps = HTMLAttributes<HTMLHeadingElement>;\n\nexport const PromptInputTabLabel = ({\n className,\n children,\n ...props\n}: PromptInputTabLabelProps) => (\n <h3\n className={cn(\n \"mb-2 px-3 font-medium text-muted-foreground text-xs\",\n className\n )}\n {...props}\n >\n {children}\n </h3>\n);\n\nexport type PromptInputTabBodyProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTabBody = ({\n className,\n ...props\n}: PromptInputTabBodyProps) => (\n <div className={cn(\"space-y-1\", className)} {...props} />\n);\n\nexport type PromptInputTabItemProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTabItem = ({\n className,\n ...props\n}: PromptInputTabItemProps) => (\n <div\n className={cn(\n \"flex items-center gap-2 px-3 py-2 text-xs hover:bg-accent\",\n className\n )}\n {...props}\n />\n);\n\nexport type PromptInputCommandProps = ComponentProps<typeof Command>;\n\nexport const PromptInputCommand = ({\n className,\n ...props\n}: PromptInputCommandProps) => <Command className={cn(className)} {...props} />;\n\nexport type PromptInputCommandInputProps = ComponentProps<typeof CommandInput>;\n\nexport const PromptInputCommandInput = ({\n className,\n ...props\n}: PromptInputCommandInputProps) => (\n <CommandInput className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandListProps = ComponentProps<typeof CommandList>;\n\nexport const PromptInputCommandList = ({\n className,\n ...props\n}: PromptInputCommandListProps) => (\n <CommandList className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandEmptyProps = ComponentProps<typeof CommandEmpty>;\n\nexport const PromptInputCommandEmpty = ({\n className,\n ...props\n}: PromptInputCommandEmptyProps) => (\n <CommandEmpty className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandGroupProps = ComponentProps<typeof CommandGroup>;\n\nexport const PromptInputCommandGroup = ({\n className,\n ...props\n}: PromptInputCommandGroupProps) => (\n <CommandGroup className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandItemProps = ComponentProps<typeof CommandItem>;\n\nexport const PromptInputCommandItem = ({\n className,\n ...props\n}: PromptInputCommandItemProps) => (\n <CommandItem className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandSeparatorProps = ComponentProps<\n typeof CommandSeparator\n>;\n\nexport const PromptInputCommandSeparator = ({\n className,\n ...props\n}: PromptInputCommandSeparatorProps) => (\n <CommandSeparator className={cn(className)} {...props} />\n);\n"],"names":["convertBlobUrlToDataUrl","url","blob","resolve","reader","captureScreenshot","stream","video","reject","width","height","canvas","context","timestamp","track","PromptInputController","createContext","ProviderAttachmentsContext","usePromptInputController","ctx","useContext","useOptionalPromptInputController","useProviderAttachments","useOptionalProviderAttachments","PromptInputProvider","initialTextInput","children","textInput","setTextInput","useState","clearInput","useCallback","attachmentFiles","setAttachmentFiles","fileInputRef","useRef","openRef","add","files","incoming","prev","file","remove","id","found","f","clear","attachmentsRef","useEffect","openFileDialog","attachments","useMemo","__registerFileInput","ref","open","controller","jsx","LocalAttachmentsContext","usePromptInputAttachments","provider","LocalReferencedSourcesContext","usePromptInputReferencedSources","PromptInputActionAddAttachments","label","props","handleSelect","e","jsxs","DropdownMenuItem","ImageIcon","PromptInputActionAddScreenshot","onSelect","event","screenshot","error","Monitor","PromptInput","className","accept","multiple","globalDrop","syncHiddenInput","maxFiles","maxFileSize","onError","onSubmit","usingProvider","inputRef","formRef","items","setItems","referencedSources","setReferencedSources","filesRef","openFileDialogLocal","matchesAccept","s","pattern","prefix","addLocal","fileList","accepted","withinSize","sized","capacity","capped","next","removeLocal","addWithProviderValidation","currentCount","clearAttachments","clearReferencedSources","makeDragHandlers","target","onAddFiles","onDragOver","onDrop","drag","form","handleChange","attachmentsCtx","item","refsCtx","array","handleSubmit","text","convertedFiles","_id","dataUrl","result","inner","Fragment","cn","InputGroup","withReferencedSources","PromptInputBody","PromptInputTextarea","onChange","onKeyDown","placeholder","isComposing","setIsComposing","handleKeyDown","lastAttachment","handlePaste","handleCompositionEnd","handleCompositionStart","controlledProps","InputGroupTextarea","PromptInputHeader","InputGroupAddon","PromptInputFooter","PromptInputTools","PromptInputButton","variant","size","tooltip","newSize","Children","button","InputGroupButton","tooltipContent","shortcut","side","Tooltip","TooltipTrigger","TooltipContent","PromptInputActionMenu","DropdownMenu","PromptInputActionMenuTrigger","ariaLabel","derivedLabel","DropdownMenuTrigger","PlusIcon","PromptInputActionMenuContent","DropdownMenuContent","PromptInputActionMenuItem","PromptInputSubmit","status","onStop","onClick","isGenerating","Icon","CornerDownLeftIcon","Spinner","SquareIcon","XIcon","handleClick","PromptInputSelect","Select","PromptInputSelectTrigger","SelectTrigger","PromptInputSelectContent","SelectContent","PromptInputSelectItem","SelectItem","PromptInputSelectValue","SelectValue","PromptInputHoverCard","openDelay","closeDelay","HoverCard","PromptInputHoverCardTrigger","HoverCardTrigger","PromptInputHoverCardContent","align","HoverCardContent","PromptInputSlotSwap","a","b","show","PromptInputTabsList","PromptInputTab","PromptInputTabLabel","PromptInputTabBody","PromptInputTabItem","PromptInputCommand","Command","PromptInputCommandInput","CommandInput","PromptInputCommandList","CommandList","PromptInputCommandEmpty","CommandEmpty","PromptInputCommandGroup","CommandGroup","PromptInputCommandItem","CommandItem","PromptInputCommandSeparator","CommandSeparator"],"mappings":"yaAiFMA,GAA0B,MAAOC,GAAwC,CAC7E,GAAI,CAEF,MAAMC,EAAO,MADI,MAAM,MAAMD,CAAG,GACJ,KAAA,EAG5B,OAAO,IAAI,QAASE,GAAY,CAC9B,MAAMC,EAAS,IAAI,WAEnBA,EAAO,UAAY,IAAMD,EAAQC,EAAO,MAAgB,EAExDA,EAAO,QAAU,IAAMD,EAAQ,IAAI,EACnCC,EAAO,cAAcF,CAAI,CAC3B,CAAC,CACH,MAAQ,CACN,OAAO,IACT,CACF,EAEMG,GAAoB,SAAkC,CAC1D,GACE,OAAO,UAAc,KACrB,CAAC,UAAU,cAAc,gBAEzB,OAAO,KAGT,IAAIC,EAA6B,KACjC,MAAMC,EAAQ,SAAS,cAAc,OAAO,EAC5CA,EAAM,MAAQ,GACdA,EAAM,YAAc,GAEpB,GAAI,CACFD,EAAS,MAAM,UAAU,aAAa,gBAAgB,CACpD,MAAO,GACP,MAAO,EAAA,CACR,EAEDC,EAAM,UAAYD,EAIlB,MAAM,IAAI,QAAc,CAACH,EAASK,IAAW,CAE3CD,EAAM,iBAAmB,IAAMJ,EAAA,EAE/BI,EAAM,QAAU,IAAMC,EAAO,IAAI,MAAM,8BAA8B,CAAC,CACxE,CAAC,EAED,MAAMD,EAAM,KAAA,EAEZ,MAAME,EAAQF,EAAM,WACdG,EAASH,EAAM,YACrB,GAAI,CAACE,GAAS,CAACC,EACb,OAAO,KAGT,MAAMC,EAAS,SAAS,cAAc,QAAQ,EAC9CA,EAAO,MAAQF,EACfE,EAAO,OAASD,EAChB,MAAME,EAAUD,EAAO,WAAW,IAAI,EACtC,GAAI,CAACC,EACH,OAAO,KAGTA,EAAQ,UAAUL,EAAO,EAAG,EAAGE,EAAOC,CAAM,EAG5C,MAAMR,EAAO,MAAM,IAAI,QAAsBC,GAAY,CACvDQ,EAAO,OAAOR,EAAS,WAAW,CACpC,CAAC,EACD,GAAI,CAACD,EACH,OAAO,KAGT,MAAMW,EAAY,IAAI,KAAA,EACnB,YAAA,EACA,QAAQ,QAAS,GAAG,EACpB,QAAQ,IAAK,GAAG,EAChB,QAAQ,IAAK,EAAE,EAElB,OAAO,IAAI,KAAK,CAACX,CAAI,EAAG,cAAcW,CAAS,OAAQ,CACrD,aAAc,KAAK,IAAA,EACnB,KAAM,WAAA,CACP,CACH,QAAA,CACE,GAAIP,EACF,UAAWQ,KAASR,EAAO,YACzBQ,EAAM,KAAA,EAGVP,EAAM,MAAA,EACNA,EAAM,UAAY,IACpB,CACF,EA+BMQ,EAAwBC,EAAAA,cAC5B,IACF,EACMC,EAA6BD,EAAAA,cACjC,IACF,EAEaE,GAA2B,IAAM,CAC5C,MAAMC,EAAMC,EAAAA,WAAWL,CAAqB,EAC5C,GAAI,CAACI,EACH,MAAM,IAAI,MACR,qFAAA,EAGJ,OAAOA,CACT,EAGME,EAAmC,IACvCD,EAAAA,WAAWL,CAAqB,EAErBO,GAAyB,IAAM,CAC1C,MAAMH,EAAMC,EAAAA,WAAWH,CAA0B,EACjD,GAAI,CAACE,EACH,MAAM,IAAI,MACR,mFAAA,EAGJ,OAAOA,CACT,EAEMI,GAAiC,IACrCH,EAAAA,WAAWH,CAA0B,EAU1BO,GAAsB,CAAC,CAClC,aAAcC,EAAmB,GACjC,SAAAC,CACF,IAAgC,CAE9B,KAAM,CAACC,EAAWC,CAAY,EAAIC,EAAAA,SAASJ,CAAgB,EACrDK,EAAaC,EAAAA,YAAY,IAAMH,EAAa,EAAE,EAAG,CAAA,CAAE,EAGnD,CAACI,EAAiBC,CAAkB,EAAIJ,EAAAA,SAE5C,CAAA,CAAE,EACEK,EAAeC,EAAAA,OAAgC,IAAI,EAEnDC,EAAUD,EAAAA,OAAmB,IAAM,CAAC,CAAC,EAErCE,EAAMN,cAAaO,GAA6B,CACpD,MAAMC,EAAW,CAAC,GAAGD,CAAK,EACtBC,EAAS,SAAW,GAIxBN,EAAoBO,GAAS,CAC3B,GAAGA,EACH,GAAGD,EAAS,IAAKE,IAAU,CACzB,SAAUA,EAAK,KACf,GAAI,OAAO,WAAA,EACX,UAAWA,EAAK,KAChB,KAAM,OACN,IAAK,IAAI,gBAAgBA,CAAI,CAAA,EAC7B,CAAA,CACH,CACH,EAAG,CAAA,CAAE,EAECC,EAASX,cAAaY,GAAe,CACzCV,EAAoBO,GAAS,CAC3B,MAAMI,EAAQJ,EAAK,KAAMK,GAAMA,EAAE,KAAOF,CAAE,EAC1C,OAAIC,GAAO,KACT,IAAI,gBAAgBA,EAAM,GAAG,EAExBJ,EAAK,OAAQK,GAAMA,EAAE,KAAOF,CAAE,CACvC,CAAC,CACH,EAAG,CAAA,CAAE,EAECG,EAAQf,EAAAA,YAAY,IAAM,CAC9BE,EAAoBO,GAAS,CAC3B,UAAWK,KAAKL,EACVK,EAAE,KACJ,IAAI,gBAAgBA,EAAE,GAAG,EAG7B,MAAO,CAAA,CACT,CAAC,CACH,EAAG,CAAA,CAAE,EAGCE,EAAiBZ,EAAAA,OAAOH,CAAe,EAE7CgB,EAAAA,UAAU,IAAM,CACdD,EAAe,QAAUf,CAC3B,EAAG,CAACA,CAAe,CAAC,EAGpBgB,EAAAA,UACE,IAAM,IAAM,CACV,UAAWH,KAAKE,EAAe,QACzBF,EAAE,KACJ,IAAI,gBAAgBA,EAAE,GAAG,CAG/B,EACA,CAAA,CAAC,EAGH,MAAMI,EAAiBlB,EAAAA,YAAY,IAAM,CACvCK,EAAQ,UAAA,CACV,EAAG,CAAA,CAAE,EAECc,EAAcC,EAAAA,QAClB,KAAO,CACL,IAAAd,EACA,MAAAS,EACA,aAAAZ,EACA,MAAOF,EACP,eAAAiB,EACA,OAAAP,CAAA,GAEF,CAACV,EAAiBK,EAAKK,EAAQI,EAAOG,CAAc,CAAA,EAGhDG,EAAsBrB,EAAAA,YAC1B,CAACsB,EAAyCC,IAAqB,CAC7DpB,EAAa,QAAUmB,EAAI,QAC3BjB,EAAQ,QAAUkB,CACpB,EACA,CAAA,CAAC,EAGGC,EAAaJ,EAAAA,QACjB,KAAO,CACL,oBAAAC,EACA,YAAAF,EACA,UAAW,CACT,MAAOpB,EACP,SAAUF,EACV,MAAOD,CAAA,CACT,GAEF,CAACA,EAAWG,EAAYoB,EAAaE,CAAmB,CAAA,EAG1D,OACEI,EAAAA,IAACzC,EAAsB,SAAtB,CAA+B,MAAOwC,EACrC,SAAAC,EAAAA,IAACvC,EAA2B,SAA3B,CAAoC,MAAOiC,EACzC,SAAAxB,EACH,EACF,CAEJ,EAMM+B,GAA0BzC,EAAAA,cAAyC,IAAI,EAEhE0C,EAA4B,IAAM,CAE7C,MAAMC,EAAWpC,GAAA,EAEXX,EADQQ,EAAAA,WAAWqC,EAAuB,GACvBE,EACzB,GAAI,CAAC/C,EACH,MAAM,IAAI,MACR,oFAAA,EAGJ,OAAOA,CACT,EAaagD,EACX5C,EAAAA,cAA+C,IAAI,EAExC6C,GAAkC,IAAM,CACnD,MAAM1C,EAAMC,EAAAA,WAAWwC,CAA6B,EACpD,GAAI,CAACzC,EACH,MAAM,IAAI,MACR,8FAAA,EAGJ,OAAOA,CACT,EAQa2C,GAAkC,CAAC,CAC9C,MAAAC,EAAQ,sBACR,GAAGC,CACL,IAA4C,CAC1C,MAAMd,EAAcQ,EAAA,EAEdO,EAAelC,EAAAA,YAClBmC,GAAa,CACZA,EAAE,eAAA,EACFhB,EAAY,eAAA,CACd,EACA,CAACA,CAAW,CAAA,EAGd,OACEiB,EAAAA,KAACC,EAAAA,iBAAA,CAAkB,GAAGJ,EAAO,SAAUC,EACrC,SAAA,CAAAT,EAAAA,IAACa,EAAAA,UAAA,CAAU,UAAU,aAAA,CAAc,EAAE,IAAEN,CAAA,EACzC,CAEJ,EAQaO,GAAiC,CAAC,CAC7C,MAAAP,EAAQ,kBACR,SAAAQ,EACA,GAAGP,CACL,IAA2C,CACzC,MAAMd,EAAcQ,EAAA,EAEdO,EAAelC,EAAAA,YACnB,MAAOyC,GAAiB,CAEtB,GADAD,IAAWC,CAAK,EACZ,CAAAA,EAAM,iBAIV,GAAI,CACF,MAAMC,EAAa,MAAMpE,GAAA,EACrBoE,GACFvB,EAAY,IAAI,CAACuB,CAAU,CAAC,CAEhC,OAASC,EAAO,CACd,GACEA,aAAiB,eAChBA,EAAM,OAAS,mBAAqBA,EAAM,OAAS,cAEpD,OAEF,MAAMA,CACR,CACF,EACA,CAACH,EAAUrB,CAAW,CAAA,EAGxB,OACEiB,EAAAA,KAACC,EAAAA,iBAAA,CAAkB,GAAGJ,EAAO,SAAUC,EACrC,SAAA,CAAAT,EAAAA,IAACmB,EAAAA,QAAA,CAAQ,UAAU,aAAA,CAAc,EAChCZ,CAAA,EACH,CAEJ,EAgCaa,GAAc,CAAC,CAC1B,UAAAC,EACA,OAAAC,EACA,SAAAC,EACA,WAAAC,EACA,gBAAAC,EACA,SAAAC,EACA,YAAAC,EACA,QAAAC,EACA,SAAAC,EACA,SAAA3D,EACA,GAAGsC,CACL,IAAwB,CAEtB,MAAMT,EAAalC,EAAA,EACbiE,EAAgB,CAAC,CAAC/B,EAGlBgC,EAAWpD,EAAAA,OAAgC,IAAI,EAC/CqD,EAAUrD,EAAAA,OAA+B,IAAI,EAG7C,CAACsD,EAAOC,CAAQ,EAAI7D,EAAAA,SAA0C,CAAA,CAAE,EAChES,EAAQgD,EAAgB/B,EAAW,YAAY,MAAQkC,EAGvD,CAACE,EAAmBC,CAAoB,EAAI/D,EAAAA,SAEhD,CAAA,CAAE,EAGEgE,EAAW1D,EAAAA,OAAOG,CAAK,EAE7BU,EAAAA,UAAU,IAAM,CACd6C,EAAS,QAAUvD,CACrB,EAAG,CAACA,CAAK,CAAC,EAEV,MAAMwD,GAAsB/D,EAAAA,YAAY,IAAM,CAC5CwD,EAAS,SAAS,MAAA,CACpB,EAAG,CAAA,CAAE,EAECQ,EAAgBhE,EAAAA,YACnBc,GACK,CAACiC,GAAUA,EAAO,KAAA,IAAW,GACxB,GAGQA,EACd,MAAM,GAAG,EACT,IAAKkB,GAAMA,EAAE,KAAA,CAAM,EACnB,OAAO,OAAO,EAED,KAAMC,GAAY,CAChC,GAAIA,EAAQ,SAAS,IAAI,EAAG,CAE1B,MAAMC,EAASD,EAAQ,MAAM,EAAG,EAAE,EAClC,OAAOpD,EAAE,KAAK,WAAWqD,CAAM,CACjC,CACA,OAAOrD,EAAE,OAASoD,CACpB,CAAC,EAEH,CAACnB,CAAM,CAAA,EAGHqB,GAAWpE,EAAAA,YACdqE,GAAgC,CAC/B,MAAM7D,EAAW,CAAC,GAAG6D,CAAQ,EACvBC,EAAW9D,EAAS,OAAQM,GAAMkD,EAAclD,CAAC,CAAC,EACxD,GAAIN,EAAS,QAAU8D,EAAS,SAAW,EAAG,CAC5CjB,IAAU,CACR,KAAM,SACN,QAAS,oCAAA,CACV,EACD,MACF,CACA,MAAMkB,EAAczD,GAClBsC,EAActC,EAAE,MAAQsC,EAAc,GAClCoB,EAAQF,EAAS,OAAOC,CAAU,EACxC,GAAID,EAAS,OAAS,GAAKE,EAAM,SAAW,EAAG,CAC7CnB,IAAU,CACR,KAAM,gBACN,QAAS,oCAAA,CACV,EACD,MACF,CAEAM,EAAUlD,GAAS,CACjB,MAAMgE,EACJ,OAAOtB,GAAa,SAChB,KAAK,IAAI,EAAGA,EAAW1C,EAAK,MAAM,EAClC,OACAiE,EACJ,OAAOD,GAAa,SAAWD,EAAM,MAAM,EAAGC,CAAQ,EAAID,EACxD,OAAOC,GAAa,UAAYD,EAAM,OAASC,GACjDpB,IAAU,CACR,KAAM,YACN,QAAS,sCAAA,CACV,EAEH,MAAMsB,EAAwC,CAAA,EAC9C,UAAWjE,KAAQgE,EACjBC,EAAK,KAAK,CACR,SAAUjE,EAAK,KACf,GAAI,OAAO,WAAA,EACX,UAAWA,EAAK,KAChB,KAAM,OACN,IAAK,IAAI,gBAAgBA,CAAI,CAAA,CAC9B,EAEH,MAAO,CAAC,GAAGD,EAAM,GAAGkE,CAAI,CAC1B,CAAC,CACH,EACA,CAACX,EAAeb,EAAUC,EAAaC,CAAO,CAAA,EAG1CuB,GAAc5E,EAAAA,YACjBY,GACC+C,EAAUlD,GAAS,CACjB,MAAMI,EAAQJ,EAAK,KAAMC,GAASA,EAAK,KAAOE,CAAE,EAChD,OAAIC,GAAO,KACT,IAAI,gBAAgBA,EAAM,GAAG,EAExBJ,EAAK,OAAQC,GAASA,EAAK,KAAOE,CAAE,CAC7C,CAAC,EACH,CAAA,CAAC,EAIGiE,GAA4B7E,EAAAA,YAC/BqE,GAAgC,CAC/B,MAAM7D,EAAW,CAAC,GAAG6D,CAAQ,EACvBC,EAAW9D,EAAS,OAAQM,GAAMkD,EAAclD,CAAC,CAAC,EACxD,GAAIN,EAAS,QAAU8D,EAAS,SAAW,EAAG,CAC5CjB,IAAU,CACR,KAAM,SACN,QAAS,oCAAA,CACV,EACD,MACF,CACA,MAAMkB,EAAczD,GAClBsC,EAActC,EAAE,MAAQsC,EAAc,GAClCoB,EAAQF,EAAS,OAAOC,CAAU,EACxC,GAAID,EAAS,OAAS,GAAKE,EAAM,SAAW,EAAG,CAC7CnB,IAAU,CACR,KAAM,gBACN,QAAS,oCAAA,CACV,EACD,MACF,CAEA,MAAMyB,EAAevE,EAAM,OACrBkE,EACJ,OAAOtB,GAAa,SAChB,KAAK,IAAI,EAAGA,EAAW2B,CAAY,EACnC,OACAJ,EACJ,OAAOD,GAAa,SAAWD,EAAM,MAAM,EAAGC,CAAQ,EAAID,EACxD,OAAOC,GAAa,UAAYD,EAAM,OAASC,GACjDpB,IAAU,CACR,KAAM,YACN,QAAS,sCAAA,CACV,EAGCqB,EAAO,OAAS,GAClBlD,GAAY,YAAY,IAAIkD,CAAM,CAEtC,EACA,CAACV,EAAeZ,EAAaD,EAAUE,EAAS9C,EAAM,OAAQiB,CAAU,CAAA,EAGpEuD,EAAmB/E,EAAAA,YACvB,IACEuD,EACI/B,GAAY,YAAY,QACxBmC,EAAUlD,GAAS,CACjB,UAAWC,KAAQD,EACbC,EAAK,KACP,IAAI,gBAAgBA,EAAK,GAAG,EAGhC,MAAO,CAAA,CACT,CAAC,EACP,CAAC6C,EAAe/B,CAAU,CAAA,EAGtBwD,EAAyBhF,EAAAA,YAC7B,IAAM6D,EAAqB,CAAA,CAAE,EAC7B,CAAA,CAAC,EAGGvD,EAAMiD,EAAgBsB,GAA4BT,GAClDzD,EAAS4C,EAAgB/B,EAAW,YAAY,OAASoD,GACzD1D,EAAiBqC,EACnB/B,EAAW,YAAY,eACvBuC,GAEEhD,EAAQf,EAAAA,YAAY,IAAM,CAC9B+E,EAAA,EACAC,EAAA,CACF,EAAG,CAACD,EAAkBC,CAAsB,CAAC,EAG7C/D,EAAAA,UAAU,IAAM,CACTsC,GAGL/B,EAAW,oBAAoBgC,EAAU,IAAMA,EAAS,SAAS,OAAO,CAC1E,EAAG,CAACD,EAAe/B,CAAU,CAAC,EAI9BP,EAAAA,UAAU,IAAM,CACViC,GAAmBM,EAAS,SAAWjD,EAAM,SAAW,IAC1DiD,EAAS,QAAQ,MAAQ,GAE7B,EAAG,CAACjD,EAAO2C,CAAe,CAAC,EAG3B,MAAM+B,EAAmBjF,EAAAA,YACvB,CAACkF,EAAgCC,IAA0C,CACzE,MAAMC,EAAcjD,GAAa,CAClBA,EACJ,cAAc,OAAO,SAAS,OAAO,GAC5CA,EAAE,eAAA,CAEN,EACMkD,EAAUlD,GAAa,CAC3B,MAAMmD,EAAOnD,EACTmD,EAAK,cAAc,OAAO,SAAS,OAAO,GAC5CnD,EAAE,eAAA,EAEAmD,EAAK,cAAc,OAASA,EAAK,aAAa,MAAM,OAAS,GAC/DH,EAAWG,EAAK,aAAa,KAAK,CAEtC,EACA,OAAAJ,EAAO,iBAAiB,WAAYE,CAAU,EAC9CF,EAAO,iBAAiB,OAAQG,CAAM,EAC/B,IAAM,CACXH,EAAO,oBAAoB,WAAYE,CAAU,EACjDF,EAAO,oBAAoB,OAAQG,CAAM,CAC3C,CACF,EACA,CAAA,CAAC,EAIHpE,EAAAA,UAAU,IAAM,CACd,MAAMsE,EAAO9B,EAAQ,QACrB,GAAK8B,GAGD,CAAAtC,EAIJ,OAAOgC,EAAiBM,EAAMjF,CAAG,CACnC,EAAG,CAACA,EAAK2C,EAAYgC,CAAgB,CAAC,EAEtChE,EAAAA,UAAU,IAAM,CACd,GAAKgC,EAGL,OAAOgC,EAAiB,SAAU3E,CAAG,CACvC,EAAG,CAACA,EAAK2C,EAAYgC,CAAgB,CAAC,EAEtChE,EAAAA,UACE,IAAM,IAAM,CACV,GAAI,CAACsC,EACH,UAAWzC,KAAKgD,EAAS,QACnBhD,EAAE,KACJ,IAAI,gBAAgBA,EAAE,GAAG,CAIjC,EACA,CAACyC,CAAa,CAAA,EAGhB,MAAMiC,GAAqDxF,EAAAA,YACxDyC,GAAU,CACLA,EAAM,cAAc,OACtBnC,EAAImC,EAAM,cAAc,KAAK,EAG/BA,EAAM,cAAc,MAAQ,EAC9B,EACA,CAACnC,CAAG,CAAA,EAGAmF,GAAiBrE,EAAAA,QACrB,KAAO,CACL,IAAAd,EACA,MAAOyE,EACP,aAAcvB,EACd,MAAOjD,EAAM,IAAKmF,IAAU,CAAE,GAAGA,EAAM,GAAIA,EAAK,EAAA,EAAK,EACrD,eAAAxE,EACA,OAAAP,CAAA,GAEF,CAACJ,EAAOD,EAAKK,EAAQoE,EAAkB7D,CAAc,CAAA,EAGjDyE,GAAUvE,EAAAA,QACd,KAAO,CACL,IAAMZ,GAA4D,CAChE,MAAMoF,EAAQ,MAAM,QAAQpF,CAAQ,EAAIA,EAAW,CAACA,CAAQ,EAC5DqD,EAAsBpD,GAAS,CAC7B,GAAGA,EACH,GAAGmF,EAAM,IAAK3B,IAAO,CAAE,GAAGA,EAAG,GAAI,OAAO,WAAA,GAAe,CAAA,CACxD,CACH,EACA,MAAOe,EACP,OAASpE,GAAe,CACtBiD,EAAsBpD,GAASA,EAAK,OAAQwD,GAAMA,EAAE,KAAOrD,CAAE,CAAC,CAChE,EACA,QAASgD,CAAA,GAEX,CAACA,EAAmBoB,CAAsB,CAAA,EAGtCa,GAAkD7F,EAAAA,YACtD,MAAOyC,GAAU,CACfA,EAAM,eAAA,EAEN,MAAM8C,EAAO9C,EAAM,cACbqD,EAAOvC,EACT/B,EAAW,UAAU,MAEF,IAAI,SAAS+D,CAAI,EACjB,IAAI,SAAS,GAAgB,GAK/ChC,GACHgC,EAAK,MAAA,EAGP,GAAI,CAEF,MAAMQ,EAA+B,MAAM,QAAQ,IACjDxF,EAAM,IAAI,MAAO,CAAE,GAAIyF,EAAK,GAAGN,KAAW,CACxC,GAAIA,EAAK,KAAK,WAAW,OAAO,EAAG,CACjC,MAAMO,EAAU,MAAMhI,GAAwByH,EAAK,GAAG,EAEtD,MAAO,CACL,GAAGA,EACH,IAAKO,GAAWP,EAAK,GAAA,CAEzB,CACA,OAAOA,CACT,CAAC,CAAA,EAGGQ,EAAS5C,EAAS,CAAE,MAAOyC,EAAgB,KAAAD,CAAA,EAAQrD,CAAK,EAG9D,GAAIyD,aAAkB,QACpB,GAAI,CACF,MAAMA,EACNnF,EAAA,EACIwC,GACF/B,EAAW,UAAU,MAAA,CAEzB,MAAQ,CAER,MAGAT,EAAA,EACIwC,GACF/B,EAAW,UAAU,MAAA,CAG3B,MAAQ,CAER,CACF,EACA,CAAC+B,EAAe/B,EAAYjB,EAAO+C,EAAUvC,CAAK,CAAA,EAI9CoF,GACJ/D,EAAAA,KAAAgE,EAAAA,SAAA,CACE,SAAA,CAAA3E,EAAAA,IAAC,QAAA,CACC,OAAAsB,EACA,aAAW,eACX,UAAU,SACV,SAAAC,EACA,SAAUwC,GACV,IAAKhC,EACL,MAAM,eACN,KAAK,MAAA,CAAA,EAEP/B,EAAAA,IAAC,OAAA,CACC,UAAW4E,EAAAA,GAAG,SAAUvD,CAAS,EACjC,SAAU+C,GACV,IAAKpC,EACJ,GAAGxB,EAEJ,SAAAR,EAAAA,IAAC6E,EAAAA,WAAA,CAAW,UAAU,2FAA4F,SAAA3G,CAAA,CAAS,CAAA,CAAA,CAC7H,EACF,EAGI4G,GACJ9E,MAACI,EAA8B,SAA9B,CAAuC,MAAO8D,GAC5C,SAAAQ,GACH,EAIF,aACGzE,GAAwB,SAAxB,CAAiC,MAAO+D,GACtC,SAAAc,GACH,CAEJ,EAIaC,GAAkB,CAAC,CAC9B,UAAA1D,EACA,GAAGb,CACL,IACER,EAAAA,IAAC,OAAI,UAAW4E,EAAAA,GAAG,WAAYvD,CAAS,EAAI,GAAGb,CAAA,CAAO,EAO3CwE,GAAsB,CAAC,CAClC,SAAAC,EACA,UAAAC,EACA,UAAA7D,EACA,YAAA8D,EAAc,+BACd,GAAG3E,CACL,IAAgC,CAC9B,MAAMT,EAAalC,EAAA,EACb6B,EAAcQ,EAAA,EACd,CAACkF,EAAaC,CAAc,EAAIhH,EAAAA,SAAS,EAAK,EAE9CiH,EAA2D/G,EAAAA,YAC9DmC,GAAM,CAKL,GAHAwE,IAAYxE,CAAC,EAGT,CAAAA,EAAE,iBAIN,IAAIA,EAAE,MAAQ,QAAS,CAIrB,GAHI0E,GAAe1E,EAAE,YAAY,aAG7BA,EAAE,SACJ,OAEFA,EAAE,eAAA,EAGF,KAAM,CAAE,KAAAoD,GAASpD,EAAE,cAInB,GAHqBoD,GAAM,cACzB,uBAAA,GAEgB,SAChB,OAGFA,GAAM,cAAA,CACR,CAGA,GACEpD,EAAE,MAAQ,aACVA,EAAE,cAAc,QAAU,IAC1BhB,EAAY,MAAM,OAAS,EAC3B,CACAgB,EAAE,eAAA,EACF,MAAM6E,EAAiB7F,EAAY,MAAMA,EAAY,MAAM,OAAS,CAAC,EACjE6F,GACF7F,EAAY,OAAO6F,EAAe,EAAE,CAExC,EACF,EACA,CAACL,EAAWE,EAAa1F,CAAW,CAAA,EAGhC8F,EAA0DjH,EAAAA,YAC7DyC,GAAU,CACT,MAAMiB,EAAQjB,EAAM,eAAe,MAEnC,GAAI,CAACiB,EACH,OAGF,MAAMnD,EAAgB,CAAA,EAEtB,UAAWmF,KAAQhC,EACjB,GAAIgC,EAAK,OAAS,OAAQ,CACxB,MAAMhF,EAAOgF,EAAK,UAAA,EACdhF,GACFH,EAAM,KAAKG,CAAI,CAEnB,CAGEH,EAAM,OAAS,IACjBkC,EAAM,eAAA,EACNtB,EAAY,IAAIZ,CAAK,EAEzB,EACA,CAACY,CAAW,CAAA,EAGR+F,EAAuBlH,EAAAA,YAAY,IAAM8G,EAAe,EAAK,EAAG,CAAA,CAAE,EAClEK,EAAyBnH,EAAAA,YAAY,IAAM8G,EAAe,EAAI,EAAG,CAAA,CAAE,EAEnEM,EAAkB5F,EACpB,CACE,SAAWW,GAAwC,CACjDX,EAAW,UAAU,SAASW,EAAE,cAAc,KAAK,EACnDuE,IAAWvE,CAAC,CACd,EACA,MAAOX,EAAW,UAAU,KAAA,EAE9B,CACE,SAAAkF,CAAA,EAGN,OACEjF,EAAAA,IAAC4F,EAAAA,mBAAA,CACC,UAAWhB,EAAAA,GAAG,yCAA0CvD,CAAS,EACjE,KAAK,UACL,iBAAkBoE,EAClB,mBAAoBC,EACpB,UAAWJ,EACX,QAASE,EACT,YAAAL,EACC,GAAG3E,EACH,GAAGmF,CAAA,CAAA,CAGV,EAOaE,GAAoB,CAAC,CAChC,UAAAxE,EACA,GAAGb,CACL,IACER,EAAAA,IAAC8F,EAAAA,gBAAA,CACC,MAAM,YACN,UAAWlB,EAAAA,GAAG,8BAA+BvD,CAAS,EACrD,GAAGb,CAAA,CACN,EAQWuF,GAAoB,CAAC,CAChC,UAAA1E,EACA,GAAGb,CACL,IACER,EAAAA,IAAC8F,EAAAA,gBAAA,CACC,MAAM,YACN,UAAWlB,EAAAA,GAAG,wBAAyBvD,CAAS,EAC/C,GAAGb,CAAA,CACN,EAKWwF,GAAmB,CAAC,CAC/B,UAAA3E,EACA,GAAGb,CACL,IACER,EAAAA,IAAC,MAAA,CACC,UAAW4E,EAAAA,GAAG,kCAAmCvD,CAAS,EACzD,GAAGb,CAAA,CACN,EAeWyF,GAAoB,CAAC,CAChC,QAAAC,EAAU,QACV,UAAA7E,EACA,KAAA8E,EAAA,QACAC,EACA,GAAG5F,CACL,IAA8B,CAC5B,MAAM6F,EACJF,IAASG,EAAAA,SAAS,MAAM9F,EAAM,QAAQ,EAAI,EAAI,KAAO,WAEjD+F,EACJvG,EAAAA,IAACwG,EAAAA,iBAAA,CACC,UAAW5B,EAAAA,GAAGvD,CAAS,EACvB,KAAMgF,EACN,KAAK,SACL,QAAAH,EACC,GAAG1F,CAAA,CAAA,EAIR,GAAI,CAAC4F,EACH,OAAOG,EAGT,MAAME,EACJ,OAAOL,GAAY,SAAWA,EAAUA,EAAQ,QAC5CM,EAAW,OAAON,GAAY,SAAW,OAAYA,EAAQ,SAC7DO,EAAO,OAAOP,GAAY,SAAW,MAASA,EAAQ,MAAQ,MAEpE,cACGQ,UAAA,CACC,SAAA,CAAA5G,EAAAA,IAAC6G,EAAAA,eAAA,CAAe,QAAO,GAAE,SAAAN,EAAO,EAChC5F,EAAAA,KAACmG,EAAAA,gBAAe,KAAAH,EACb,SAAA,CAAAF,EACAC,GACC1G,EAAAA,IAAC,OAAA,CAAK,UAAU,6BAA8B,SAAA0G,CAAA,CAAS,CAAA,CAAA,CAE3D,CAAA,EACF,CAEJ,EAGaK,GAAyBvG,GACpCR,EAAAA,IAACgH,EAAAA,aAAA,CAAc,GAAGxG,CAAA,CAAO,EAKdyG,GAA+B,CAAC,CAC3C,UAAA5F,EACA,SAAAnD,EACA,QAAAkI,EACA,aAAcc,EACd,GAAG1G,CACL,IAAyC,CACvC,MAAM2G,EACJD,IACC,OAAOd,GAAY,SAChBA,EACA,OAAOA,GAAS,SAAY,SAC1BA,EAAQ,QACR,QAER,OACEpG,EAAAA,IAACoH,EAAAA,oBAAA,CAAoB,QAAO,GAC1B,SAAApH,EAAAA,IAACiG,GAAA,CACC,aAAYkB,EACZ,UAAA9F,EACA,QAAA+E,EACC,GAAG5F,EAEH,SAAAtC,GAAY8B,EAAAA,IAACqH,EAAAA,SAAA,CAAS,UAAU,QAAA,CAAS,CAAA,CAAA,EAE9C,CAEJ,EAKaC,GAA+B,CAAC,CAC3C,UAAAjG,EACA,GAAGb,CACL,IACER,EAAAA,IAACuH,uBAAoB,MAAM,QAAQ,UAAW3C,KAAGvD,CAAS,EAAI,GAAGb,CAAA,CAAO,EAM7DgH,GAA4B,CAAC,CACxC,UAAAnG,EACA,GAAGb,CACL,UACGI,EAAAA,iBAAA,CAAiB,UAAWgE,EAAAA,GAAGvD,CAAS,EAAI,GAAGb,CAAA,CAAO,EAW5CiH,GAAoB,CAAC,CAChC,UAAApG,EACA,QAAA6E,EAAU,UACV,KAAAC,EAAO,UACP,OAAAuB,EACA,OAAAC,EACA,QAAAC,EACA,SAAA1J,EACA,GAAGsC,CACL,IAA8B,CAC5B,MAAMqH,EAAeH,IAAW,aAAeA,IAAW,YAE1D,IAAII,EAAO9H,EAAAA,IAAC+H,EAAAA,mBAAA,CAAmB,UAAU,QAAA,CAAS,EAE9CL,IAAW,YACbI,QAAQE,GAAAA,QAAA,EAAQ,EACPN,IAAW,YACpBI,EAAO9H,EAAAA,IAACiI,EAAAA,WAAA,CAAW,UAAU,QAAA,CAAS,EAC7BP,IAAW,UACpBI,EAAO9H,EAAAA,IAACkI,EAAAA,MAAA,CAAM,UAAU,QAAA,CAAS,GAGnC,MAAMC,EAAc5J,EAAAA,YACjBmC,GAA2C,CAC1C,GAAImH,GAAgBF,EAAQ,CAC1BjH,EAAE,eAAA,EACFiH,EAAA,EACA,MACF,CACAC,IAAUlH,CAAC,CACb,EACA,CAACmH,EAAcF,EAAQC,CAAO,CAAA,EAGhC,OACE5H,EAAAA,IAACwG,EAAAA,iBAAA,CACC,aAAYqB,EAAe,OAAS,SACpC,UAAWjD,EAAAA,GAAGvD,CAAS,EACvB,QAAS8G,EACT,KAAAhC,EACA,KAAM0B,GAAgBF,EAAS,SAAW,SAC1C,QAAAzB,EACC,GAAG1F,EAEH,SAAAtC,GAAY4J,CAAA,CAAA,CAGnB,EAIaM,GAAqB5H,GAChCR,EAAAA,IAACqI,EAAAA,OAAA,CAAQ,GAAG7H,CAAA,CAAO,EAOR8H,GAA2B,CAAC,CACvC,UAAAjH,EACA,GAAGb,CACL,IACER,EAAAA,IAACuI,EAAAA,cAAA,CACC,UAAW3D,EAAAA,GACT,6FACA,8FACAvD,CAAA,EAED,GAAGb,CAAA,CACN,EAOWgI,GAA2B,CAAC,CACvC,UAAAnH,EACA,GAAGb,CACL,UACGiI,EAAAA,cAAA,CAAc,UAAW7D,EAAAA,GAAGvD,CAAS,EAAI,GAAGb,CAAA,CAAO,EAKzCkI,GAAwB,CAAC,CACpC,UAAArH,EACA,GAAGb,CACL,UACGmI,EAAAA,WAAA,CAAW,UAAW/D,EAAAA,GAAGvD,CAAS,EAAI,GAAGb,CAAA,CAAO,EAKtCoI,GAAyB,CAAC,CACrC,UAAAvH,EACA,GAAGb,CACL,UACGqI,EAAAA,YAAA,CAAY,UAAWjE,EAAAA,GAAGvD,CAAS,EAAI,GAAGb,CAAA,CAAO,EAKvCsI,GAAuB,CAAC,CACnC,UAAAC,EAAY,EACZ,WAAAC,EAAa,EACb,GAAGxI,CACL,IACER,EAAAA,IAACiJ,EAAAA,UAAA,CAAU,WAAAD,EAAwB,UAAAD,EAAuB,GAAGvI,CAAA,CAAO,EAOzD0I,GACX1I,GACGR,EAAAA,IAACmJ,EAAAA,iBAAA,CAAkB,GAAG3I,CAAA,CAAO,EAMrB4I,GAA8B,CAAC,CAC1C,MAAAC,EAAQ,QACR,GAAG7I,CACL,IACER,EAAAA,IAACsJ,EAAAA,iBAAA,CAAiB,MAAAD,EAAe,GAAG7I,CAAA,CAAO,EAiBhC+I,GAAsB,CAAC,CAClC,EAAAC,EACA,EAAAC,EACA,KAAAC,EACA,UAAArI,CACF,IACEV,EAAAA,KAAC,MAAA,CACC,UAAWiE,EAAAA,GAAG,mDAAoDvD,CAAS,EAE3E,SAAA,CAAArB,EAAAA,IAAC,MAAA,CACC,cAAa0J,EACb,UAAW9E,EAAAA,GACT,uCACA8E,EAAO,yCAA2C,uBAAA,EAGnD,SAAAF,CAAA,CAAA,EAEHxJ,EAAAA,IAAC,MAAA,CACC,cAAa,CAAC0J,EACd,UAAW9E,EAAAA,GACT,gDACA8E,EAAO,wBAA0B,wCAAA,EAGlC,SAAAD,CAAA,CAAA,CACH,CAAA,CACF,EAKWE,GAAsB,CAAC,CAClC,UAAAtI,EACA,GAAGb,CACL,UAAiC,MAAA,CAAI,UAAWoE,EAAAA,GAAGvD,CAAS,EAAI,GAAGb,CAAA,CAAO,EAI7DoJ,GAAiB,CAAC,CAC7B,UAAAvI,EACA,GAAGb,CACL,UAA4B,MAAA,CAAI,UAAWoE,EAAAA,GAAGvD,CAAS,EAAI,GAAGb,CAAA,CAAO,EAIxDqJ,GAAsB,CAAC,CAClC,UAAAxI,EACA,SAAAnD,EACA,GAAGsC,CACL,IACER,EAAAA,IAAC,KAAA,CACC,UAAW4E,EAAAA,GACT,sDACAvD,CAAA,EAED,GAAGb,EAEH,SAAAtC,CAAA,CACH,EAKW4L,GAAqB,CAAC,CACjC,UAAAzI,EACA,GAAGb,CACL,IACER,EAAAA,IAAC,OAAI,UAAW4E,EAAAA,GAAG,YAAavD,CAAS,EAAI,GAAGb,CAAA,CAAO,EAK5CuJ,GAAqB,CAAC,CACjC,UAAA1I,EACA,GAAGb,CACL,IACER,EAAAA,IAAC,MAAA,CACC,UAAW4E,EAAAA,GACT,4DACAvD,CAAA,EAED,GAAGb,CAAA,CACN,EAKWwJ,GAAqB,CAAC,CACjC,UAAA3I,EACA,GAAGb,CACL,UAAgCyJ,EAAAA,QAAA,CAAQ,UAAWrF,EAAAA,GAAGvD,CAAS,EAAI,GAAGb,CAAA,CAAO,EAIhE0J,GAA0B,CAAC,CACtC,UAAA7I,EACA,GAAGb,CACL,UACG2J,EAAAA,aAAA,CAAa,UAAWvF,EAAAA,GAAGvD,CAAS,EAAI,GAAGb,CAAA,CAAO,EAKxC4J,GAAyB,CAAC,CACrC,UAAA/I,EACA,GAAGb,CACL,UACG6J,EAAAA,YAAA,CAAY,UAAWzF,EAAAA,GAAGvD,CAAS,EAAI,GAAGb,CAAA,CAAO,EAKvC8J,GAA0B,CAAC,CACtC,UAAAjJ,EACA,GAAGb,CACL,UACG+J,EAAAA,aAAA,CAAa,UAAW3F,EAAAA,GAAGvD,CAAS,EAAI,GAAGb,CAAA,CAAO,EAKxCgK,GAA0B,CAAC,CACtC,UAAAnJ,EACA,GAAGb,CACL,UACGiK,EAAAA,aAAA,CAAa,UAAW7F,EAAAA,GAAGvD,CAAS,EAAI,GAAGb,CAAA,CAAO,EAKxCkK,GAAyB,CAAC,CACrC,UAAArJ,EACA,GAAGb,CACL,UACGmK,EAAAA,YAAA,CAAY,UAAW/F,EAAAA,GAAGvD,CAAS,EAAI,GAAGb,CAAA,CAAO,EAOvCoK,GAA8B,CAAC,CAC1C,UAAAvJ,EACA,GAAGb,CACL,UACGqK,EAAAA,iBAAA,CAAiB,UAAWjG,EAAAA,GAAGvD,CAAS,EAAI,GAAGb,CAAA,CAAO"}