@shytv/ai-chart 0.0.0-stage → 0.0.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 (44) hide show
  1. package/README.md +74 -2
  2. package/dist/App.d.ts +1 -0
  3. package/dist/chat/ChatApp.d.ts +5 -0
  4. package/dist/chat/ChatRuntimeProvider.d.ts +9 -0
  5. package/dist/components/attachment-state.d.ts +10 -0
  6. package/dist/components/attachment.aui.d.ts +4 -0
  7. package/dist/components/collapsible-root.d.ts +4 -0
  8. package/dist/components/conversation-list.d.ts +5 -0
  9. package/dist/components/file.d.ts +49 -0
  10. package/dist/components/follow-up-suggestions.aui.d.ts +2 -0
  11. package/dist/components/href.d.ts +8 -0
  12. package/dist/components/image.d.ts +55 -0
  13. package/dist/components/markdown-text.d.ts +8 -0
  14. package/dist/components/media-player.d.ts +16 -0
  15. package/dist/components/reasoning.aui.d.ts +22 -0
  16. package/dist/components/reasoning.d.ts +25 -0
  17. package/dist/components/surfaces.d.ts +37 -0
  18. package/dist/components/thread.aui.d.ts +34 -0
  19. package/dist/components/tool-fallback.aui.d.ts +46 -0
  20. package/dist/components/tool-group.aui.d.ts +34 -0
  21. package/dist/components/tooltip-icon-button.d.ts +7 -0
  22. package/dist/components/ui/avatar.d.ts +11 -0
  23. package/dist/components/ui/button.d.ts +10 -0
  24. package/dist/components/ui/dialog.d.ts +17 -0
  25. package/dist/components/ui/skeleton.d.ts +2 -0
  26. package/dist/components/ui/textarea.d.ts +3 -0
  27. package/dist/components/ui/tooltip.d.ts +6 -0
  28. package/dist/components/useIsomorphicLayoutEffect.d.ts +2 -0
  29. package/dist/favicon.svg +1 -0
  30. package/dist/hooks/use-attachment-src.d.ts +1 -0
  31. package/dist/hooks/use-copy-to-clipboard.d.ts +7 -0
  32. package/dist/icons.svg +24 -0
  33. package/dist/index.cjs +117 -0
  34. package/dist/index.d.ts +3 -0
  35. package/dist/index.js +42000 -0
  36. package/dist/lib/composables/monarchTokens.d.ts +203 -0
  37. package/dist/lib/composables/tools.d.ts +3 -0
  38. package/dist/lib/composables/v6/monarchTokens.d.ts +205 -0
  39. package/dist/lib/utils.d.ts +1 -0
  40. package/dist/main.d.ts +0 -0
  41. package/dist/services/chat-adapter.d.ts +39 -0
  42. package/dist/services/conversation-adapter.d.ts +51 -0
  43. package/dist/style.css +2 -0
  44. package/package.json +70 -4
package/README.md CHANGED
@@ -1,3 +1,75 @@
1
- # Temporary Holding Version
1
+ # React + TypeScript + Vite
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
4
+
5
+ Currently, two official plugins are available:
6
+
7
+ - [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Oxc](https://oxc.rs)
8
+ - [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/)
9
+
10
+ ## React Compiler
11
+
12
+ The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation).
13
+
14
+ ## Expanding the ESLint configuration
15
+
16
+ If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:
17
+
18
+ ```js
19
+ export default defineConfig([
20
+ globalIgnores(['dist']),
21
+ {
22
+ files: ['**/*.{ts,tsx}'],
23
+ extends: [
24
+ // Other configs...
25
+
26
+ // Remove tseslint.configs.recommended and replace with this
27
+ tseslint.configs.recommendedTypeChecked,
28
+ // Alternatively, use this for stricter rules
29
+ tseslint.configs.strictTypeChecked,
30
+ // Optionally, add this for stylistic rules
31
+ tseslint.configs.stylisticTypeChecked,
32
+
33
+ // Other configs...
34
+ ],
35
+ languageOptions: {
36
+ parserOptions: {
37
+ project: ['./tsconfig.node.json', './tsconfig.app.json'],
38
+ tsconfigRootDir: import.meta.dirname,
39
+ },
40
+ // other options...
41
+ },
42
+ },
43
+ ])
44
+
45
+ ```
46
+
47
+ You can also install [eslint-plugin-react-x](https://npmx.dev/package/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://npmx.dev/package/eslint-plugin-react-dom) for React-specific lint rules:
48
+
49
+ ```js
50
+ // eslint.config.js
51
+ import reactX from 'eslint-plugin-react-x'
52
+ import reactDom from 'eslint-plugin-react-dom'
53
+
54
+ export default defineConfig([
55
+ globalIgnores(['dist']),
56
+ {
57
+ files: ['**/*.{ts,tsx}'],
58
+ extends: [
59
+ // Other configs...
60
+ // Enable lint rules for React
61
+ reactX.configs['recommended-typescript'],
62
+ // Enable lint rules for React DOM
63
+ reactDom.configs.recommended,
64
+ ],
65
+ languageOptions: {
66
+ parserOptions: {
67
+ project: ['./tsconfig.node.json', './tsconfig.app.json'],
68
+ tsconfigRootDir: import.meta.dirname,
69
+ },
70
+ // other options...
71
+ },
72
+ },
73
+ ])
74
+
75
+ ```
package/dist/App.d.ts ADDED
@@ -0,0 +1 @@
1
+ export default function ChatPage(): import('react').JSX.Element;
@@ -0,0 +1,5 @@
1
+ interface IProps {
2
+ theme?: string;
3
+ }
4
+ export declare function ChatApp(props: IProps): import('react').JSX.Element;
5
+ export {};
@@ -0,0 +1,9 @@
1
+ import { streamChat } from '../services/chat-adapter';
2
+ type CustomEventHandler = NonNullable<Parameters<typeof streamChat>[0]["onCustomEvent"]>;
3
+ export interface ChatRuntimeProviderProps {
4
+ children: React.ReactNode;
5
+ token: string;
6
+ onCustomEvent?: CustomEventHandler;
7
+ }
8
+ export declare function ChatRuntimeProvider({ children, token, onCustomEvent, }: ChatRuntimeProviderProps): import('react').JSX.Element;
9
+ export {};
@@ -0,0 +1,10 @@
1
+ export declare function useAttachmentState(): {
2
+ isComposer: boolean;
3
+ src: string;
4
+ isImage: boolean;
5
+ name: string;
6
+ typeLabel: string | (string & {});
7
+ isUploading: boolean;
8
+ isError: boolean;
9
+ errorMessage: string;
10
+ };
@@ -0,0 +1,4 @@
1
+ import { FC } from 'react';
2
+ export declare const UserMessageAttachments: FC;
3
+ export declare const ComposerAttachments: FC;
4
+ export declare const ComposerAddAttachment: FC;
@@ -0,0 +1,4 @@
1
+ import { Collapsible } from '@base-ui/react/collapsible';
2
+ export declare const CollapsibleRoot: import('react').ForwardRefExoticComponent<Omit<Omit<import('@base-ui/react').CollapsibleRootProps, "ref"> & import('react').RefAttributes<HTMLDivElement>, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
3
+ export declare function CollapsibleTrigger({ ...props }: Collapsible.Trigger.Props): import('react').JSX.Element;
4
+ export declare function CollapsibleContent({ ...props }: Collapsible.Panel.Props): import('react').JSX.Element;
@@ -0,0 +1,5 @@
1
+ interface ConversationListProps {
2
+ onSelect: () => void;
3
+ }
4
+ export declare function ConversationList({ onSelect }: ConversationListProps): import('react').JSX.Element;
5
+ export {};
@@ -0,0 +1,49 @@
1
+ import { FC } from 'react';
2
+ import { VariantProps } from 'class-variance-authority';
3
+ import { FileMessagePartComponent } from '@assistant-ui/react';
4
+ declare const fileVariants: (props?: {
5
+ variant?: "outline" | "ghost" | "muted";
6
+ size?: "default" | "sm" | "lg";
7
+ } & import('class-variance-authority/types').ClassProp) => string;
8
+ declare function getMimeTypeIcon(mimeType: string): FC<{
9
+ className?: string;
10
+ }>;
11
+ export type FileDataKind = "data-uri" | "url" | "base64" | "id";
12
+ declare function getFileDataKind(data: string, sourceType?: "url" | "id"): FileDataKind;
13
+ declare function getFileHref(data: string, mimeType: string, sourceType?: "url" | "id"): string | null;
14
+ declare function getBase64Size(base64: string): number;
15
+ declare function formatFileSize(bytes: number): string;
16
+ export type FileRootProps = React.ComponentProps<"div"> & VariantProps<typeof fileVariants>;
17
+ declare function FileRoot({ className, variant, size, children, ...props }: FileRootProps): import('react').JSX.Element;
18
+ type FileIconDisplayProps = React.ComponentProps<"span"> & {
19
+ mimeType?: string;
20
+ };
21
+ declare function FileIconDisplay({ mimeType, className, children, ...props }: FileIconDisplayProps): import('react').JSX.Element;
22
+ declare function FileName({ className, children, ...props }: React.ComponentProps<"span">): import('react').JSX.Element;
23
+ type FileSizeProps = React.ComponentProps<"span"> & {
24
+ bytes: number;
25
+ };
26
+ declare function FileSize({ bytes, className, ...props }: FileSizeProps): import('react').JSX.Element;
27
+ type FileDownloadProps = Omit<React.ComponentProps<"a">, "href"> & {
28
+ data: string;
29
+ mimeType: string;
30
+ filename?: string;
31
+ sourceType?: "url" | "id";
32
+ };
33
+ declare function FileDownload({ data, mimeType, filename, sourceType, className, children, ...props }: FileDownloadProps): import('react').JSX.Element;
34
+ export interface FilePlayerProps extends Omit<React.ComponentProps<"div">, "children"> {
35
+ data: string;
36
+ mimeType: string;
37
+ filename?: string | undefined;
38
+ sourceType?: "url" | "id" | undefined;
39
+ }
40
+ declare function FilePlayer({ data, mimeType, filename, sourceType, className, ...props }: FilePlayerProps): import('react').JSX.Element;
41
+ declare const File: FileMessagePartComponent & {
42
+ Root: typeof FileRoot;
43
+ Icon: typeof FileIconDisplay;
44
+ Name: typeof FileName;
45
+ Size: typeof FileSize;
46
+ Download: typeof FileDownload;
47
+ Player: typeof FilePlayer;
48
+ };
49
+ export { File, FileRoot, FileIconDisplay, FileName, FileSize, FileDownload, FilePlayer, fileVariants, getMimeTypeIcon, getFileDataKind, getFileHref, getBase64Size, formatFileSize, };
@@ -0,0 +1,2 @@
1
+ import { FC } from 'react';
2
+ export declare const ThreadFollowupSuggestions: FC;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * `url` when a browser following it runs no script: an `http:`, `https:`, or
3
+ * `mailto:` URL, or one relative to the page. Anything else, including a
4
+ * string that is not a URL at all, is `undefined`.
5
+ */
6
+ export declare function safeHref(url: string | undefined): string | undefined;
7
+ /** The host `url` points at, without a leading `www.`, or `undefined`. */
8
+ export declare function hostOf(url: string | undefined): string | undefined;
@@ -0,0 +1,55 @@
1
+ import { PropsWithChildren } from 'react';
2
+ import { VariantProps } from 'class-variance-authority';
3
+ import { ImageMessagePart, ImageMessagePartComponent } from '@assistant-ui/react';
4
+ declare const imageVariants: (props?: {
5
+ variant?: "outline" | "ghost" | "muted";
6
+ size?: "default" | "sm" | "lg" | "full";
7
+ } & import('class-variance-authority/types').ClassProp) => string;
8
+ export type ImageRootProps = React.ComponentProps<"div"> & VariantProps<typeof imageVariants>;
9
+ declare function ImageRoot({ className, variant, size, children, ...props }: ImageRootProps): import('react').JSX.Element;
10
+ type ImagePreviewProps = Omit<React.ComponentProps<"img">, "children"> & {
11
+ containerClassName?: string | undefined;
12
+ ratio?: "auto" | "1:1" | "4:3" | "16:9" | "9:16" | undefined;
13
+ fit?: "cover" | "contain" | undefined;
14
+ };
15
+ declare function ImagePreview({ className, containerClassName, ratio, fit, onLoad, onError, alt, src, ...props }: ImagePreviewProps): import('react').JSX.Element;
16
+ export type ImageSourceProps = {
17
+ label?: string | undefined;
18
+ url?: string | undefined;
19
+ iconUrl?: string | undefined;
20
+ } & React.ComponentProps<"div">;
21
+ declare function ImageSource({ className, label, url, iconUrl, ...props }: ImageSourceProps): import('react').JSX.Element;
22
+ declare function ImageFilename({ className, children, ...props }: React.ComponentProps<"span">): import('react').JSX.Element;
23
+ type ImageZoomProps = PropsWithChildren<{
24
+ src: string;
25
+ alt?: string;
26
+ }>;
27
+ declare function ImageZoom({ src, alt, children }: ImageZoomProps): import('react').JSX.Element;
28
+ declare function ImageGenerating({ className }: {
29
+ className?: string;
30
+ }): import('react').JSX.Element;
31
+ declare function ImageContentFilterError({ className, reason, }: {
32
+ className?: string;
33
+ reason?: string;
34
+ }): import('react').JSX.Element;
35
+ export type ImageActionsProps = {
36
+ part: ImageMessagePart;
37
+ /**
38
+ * Wire to your own generation call to show a regenerate button. The button
39
+ * renders only when this is set and the part carries a `prompt`.
40
+ */
41
+ onRegenerate?: () => void | Promise<void>;
42
+ className?: string;
43
+ };
44
+ declare function ImageActions({ part, onRegenerate, className }: ImageActionsProps): import('react').JSX.Element;
45
+ declare const Image: ImageMessagePartComponent & {
46
+ Root: typeof ImageRoot;
47
+ Preview: typeof ImagePreview;
48
+ Source: typeof ImageSource;
49
+ Filename: typeof ImageFilename;
50
+ Zoom: typeof ImageZoom;
51
+ Actions: typeof ImageActions;
52
+ Generating: typeof ImageGenerating;
53
+ ContentFilterError: typeof ImageContentFilterError;
54
+ };
55
+ export { Image, ImageRoot, ImagePreview, ImageSource, ImageFilename, ImageZoom, ImageActions, ImageGenerating, ImageContentFilterError, imageVariants, };
@@ -0,0 +1,8 @@
1
+ import { MarkdownTextPrimitiveProps, memoizeMarkdownComponents } from '@assistant-ui/react-markdown';
2
+ import { TextMessagePartProps } from '@assistant-ui/react';
3
+ type MarkdownTextProps = Partial<TextMessagePartProps> & {
4
+ components?: Parameters<typeof memoizeMarkdownComponents>[0];
5
+ componentsByLanguage?: MarkdownTextPrimitiveProps["componentsByLanguage"];
6
+ };
7
+ export declare const MarkdownText: import('react').NamedExoticComponent<MarkdownTextProps>;
8
+ export {};
@@ -0,0 +1,16 @@
1
+ import { ComponentProps } from 'react';
2
+ export interface AudioPlayerProps extends Omit<ComponentProps<"div">, "children"> {
3
+ src: string;
4
+ title?: string | undefined;
5
+ artwork?: string | undefined;
6
+ durationMs?: number | undefined;
7
+ }
8
+ export interface VideoPlayerProps extends Omit<ComponentProps<"div">, "children"> {
9
+ src: string;
10
+ poster?: string | undefined;
11
+ title?: string | undefined;
12
+ ratio?: "16:9" | "4:3" | "1:1" | "9:16" | "auto" | undefined;
13
+ durationMs?: number | undefined;
14
+ }
15
+ export declare function AudioPlayer({ src, title, artwork, durationMs, className, ...props }: AudioPlayerProps): import('react').JSX.Element;
16
+ export declare function VideoPlayer({ src, poster, title, ratio, durationMs, className, ...props }: VideoPlayerProps): import('react').JSX.Element;
@@ -0,0 +1,22 @@
1
+ import { ReasoningMessagePartComponent } from '@assistant-ui/react';
2
+ import { ReasoningTrigger, ReasoningContent, ReasoningText, ReasoningFade, reasoningVariants, ReasoningRootProps } from './reasoning';
3
+ export type { ReasoningRootProps } from './reasoning';
4
+ /** 思考过程组件:在展开和折叠动画期间锁定对话视口滚动。 */
5
+ declare const ReasoningRoot: import('react').ForwardRefExoticComponent<Omit<ReasoningRootProps, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
6
+ declare const Reasoning: ReasoningMessagePartComponent & {
7
+ Root: typeof ReasoningRoot;
8
+ Trigger: typeof ReasoningTrigger;
9
+ Content: typeof ReasoningContent;
10
+ Text: typeof ReasoningText;
11
+ Fade: typeof ReasoningFade;
12
+ };
13
+ /**
14
+ * @deprecated 此组件用于旧版 <MessagePrimitive.Parts> 的
15
+ * components.ReasoningGroup 属性。
16
+ * 建议使用 <MessagePrimitive.GroupedParts>,通过 groupBy 返回
17
+ * "group-reasoning",并直接组合 ReasoningRoot、ReasoningTrigger、
18
+ * ReasoningContent 和 ReasoningText。
19
+ * 具体用法参见 thread.aui.tsx。
20
+ */
21
+ declare const ReasoningGroup: import('react').NamedExoticComponent<import('@assistant-ui/react').ReasoningGroupProps>;
22
+ export { Reasoning, ReasoningGroup, ReasoningRoot, ReasoningTrigger, ReasoningContent, ReasoningText, ReasoningFade, reasoningVariants, };
@@ -0,0 +1,25 @@
1
+ import { VariantProps } from 'class-variance-authority';
2
+ import { CollapsibleRoot as Collapsible, CollapsibleContent, CollapsibleTrigger } from './collapsible-root';
3
+ export declare const ANIMATION_DURATION = 200;
4
+ declare const reasoningVariants: (props?: {
5
+ variant?: "outline" | "ghost" | "muted";
6
+ } & import('class-variance-authority/types').ClassProp) => string;
7
+ export type ReasoningRootProps = Omit<React.ComponentProps<typeof Collapsible>, "open" | "onOpenChange"> & VariantProps<typeof reasoningVariants> & {
8
+ open?: boolean;
9
+ onOpenChange?: (open: boolean) => void;
10
+ defaultOpen?: boolean;
11
+ streaming?: boolean;
12
+ showContent?: boolean;
13
+ onAnimationStart?: () => void;
14
+ };
15
+ declare const ReasoningRoot: import('react').ForwardRefExoticComponent<Omit<ReasoningRootProps, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
16
+ declare function ReasoningFade({ side, className, ...props }: React.ComponentProps<"div"> & {
17
+ side?: "top" | "bottom";
18
+ }): import('react').JSX.Element;
19
+ declare function ReasoningTrigger({ active, duration, className, ...props }: React.ComponentProps<typeof CollapsibleTrigger> & {
20
+ active?: boolean;
21
+ duration?: number;
22
+ }): import('react').JSX.Element;
23
+ declare function ReasoningContent({ className, children, ...props }: React.ComponentProps<typeof CollapsibleContent>): import('react').JSX.Element;
24
+ declare function ReasoningText({ className, children, ...props }: React.ComponentProps<"div">): import('react').JSX.Element;
25
+ export { ReasoningRoot, ReasoningTrigger, ReasoningContent, ReasoningText, ReasoningFade, reasoningVariants, };
@@ -0,0 +1,37 @@
1
+ import { ComponentProps } from 'react';
2
+ export declare const paper = "bg-background border border-border/60 dark:bg-popover";
3
+ export declare const floating = "bg-background border border-border/60 dark:bg-popover";
4
+ export declare const field = "bg-foreground/[0.04] forced-colors:border dark:bg-foreground/[0.06]";
5
+ export declare const fieldInteractive = "bg-foreground/[0.04] transition-colors hover:bg-foreground/[0.07] forced-colors:border dark:bg-foreground/[0.06] dark:hover:bg-foreground/[0.09]";
6
+ export declare const pressable = "transition-transform duration-150 ease-[cubic-bezier(0.23,1,0.32,1)] active:scale-[0.96] motion-reduce:transition-none";
7
+ export declare const ghostButton = "flex items-center justify-center rounded-full text-muted-foreground outline-hidden transition-[background-color,color,scale] duration-150 hover:bg-foreground/[0.06] hover:text-foreground/90 active:scale-[0.96] focus-visible:ring-1 focus-visible:ring-foreground/20 motion-reduce:transition-none dark:hover:bg-foreground/[0.09]";
8
+ export declare const inkButton = "bg-foreground text-background transition-[opacity,scale] duration-150 ease-[cubic-bezier(0.23,1,0.32,1)] hover:opacity-90 active:scale-[0.96] motion-reduce:transition-none forced-colors:border";
9
+ export declare const iconSwap = "[grid-area:1/1] transition-[opacity,scale,filter] duration-200 ease-[cubic-bezier(0.2,0,0,1)] motion-reduce:transition-none";
10
+ export declare const iconSwapIn = "scale-100 opacity-100 blur-none";
11
+ export declare const iconSwapOut = "scale-[0.25] opacity-0 blur-[4px]";
12
+ export declare const labelSwap = "col-start-1 row-start-1 flex w-max items-center gap-1.5 leading-none transition-[opacity,filter] duration-300 ease-[cubic-bezier(0.23,1,0.32,1)] motion-reduce:transition-none";
13
+ export declare const labelSwapIn = "opacity-100 blur-none";
14
+ export declare const labelSwapOut = "pointer-events-none select-none opacity-0 blur-[2px]";
15
+ export declare const collapsePanel = "h-(--collapsible-panel-height) overflow-hidden transition-[height] duration-200 ease-[cubic-bezier(0.32,0.72,0,1)] data-[ending-style]:h-0 data-[starting-style]:h-0 motion-reduce:transition-none";
16
+ export declare const live = "text-blue-500 dark:text-blue-400";
17
+ export declare const mono = "font-mono text-[11px] tracking-tight";
18
+ export declare function ShimmerLabel({ active, className, ...props }: ComponentProps<"span"> & {
19
+ active?: boolean;
20
+ }): import('react').JSX.Element;
21
+ /**
22
+ * Scroll region for content that keeps its own whitespace. `whitespace-pre` in
23
+ * a bounded box clips a long line with no way to reach it, so the rows scroll
24
+ * instead.
25
+ *
26
+ * `codeSurface` wraps all the rows as one block, and the rows are its children.
27
+ * It cannot go on each row: `min-width: 100%` resolves against the scroll
28
+ * container's visible width rather than its scroll width, so a per-row width
29
+ * leaves every row except the longest ending its background at the fold.
30
+ */
31
+ export declare const codeScroll = "overflow-x-auto";
32
+ export declare const codeSurface = "w-max min-w-full";
33
+ export declare function SwapLabel({ active, children, className, }: {
34
+ active: 0 | 1;
35
+ children: [React.ReactNode, React.ReactNode];
36
+ className?: string;
37
+ }): import('react').JSX.Element;
@@ -0,0 +1,34 @@
1
+ import { MessagePrimitive, ToolCallMessagePartComponent } from '@assistant-ui/react';
2
+ import { ComponentType, FC, PropsWithChildren } from 'react';
3
+ export type ThreadGroupPart = MessagePrimitive.GroupedParts.GroupPart;
4
+ /**
5
+ * Optional component overrides for the thread. `AssistantMessage` and
6
+ * `Welcome` replace whole sections; the remaining slots override how the
7
+ * assistant message renders tool calls and part groups. Tool UIs registered
8
+ * by name (toolkit `render`, `useAssistantDataUI`) take precedence over
9
+ * `ToolFallback`. When `TaskGroup` is set, tool calls that carry a nested
10
+ * conversation and have no registered UI render through it instead of the
11
+ * tool group; without it they render like any other tool call.
12
+ * `ComposerExtra` renders in the composer's action row beside the attach
13
+ * button.
14
+ */
15
+ export type ThreadComponents = {
16
+ AssistantMessage?: ComponentType | undefined;
17
+ Welcome?: ComponentType | undefined;
18
+ ToolFallback?: ToolCallMessagePartComponent | undefined;
19
+ ToolGroup?: ComponentType<PropsWithChildren<{
20
+ group: ThreadGroupPart;
21
+ }>> | undefined;
22
+ ReasoningGroup?: ComponentType<PropsWithChildren<{
23
+ group: ThreadGroupPart;
24
+ }>> | undefined;
25
+ TaskGroup?: ComponentType<{
26
+ group: ThreadGroupPart;
27
+ }> | undefined;
28
+ ComposerExtra?: ComponentType | undefined;
29
+ };
30
+ export type ThreadProps = {
31
+ components?: ThreadComponents | undefined;
32
+ autoFocus?: boolean | undefined;
33
+ };
34
+ export declare const Thread: FC<ThreadProps>;
@@ -0,0 +1,46 @@
1
+ import { ToolCallMessagePart, ToolCallMessagePartStatus, ToolCallMessagePartComponent } from '@assistant-ui/react';
2
+ import { CollapsibleRoot as Collapsible, CollapsibleContent, CollapsibleTrigger } from './collapsible-root';
3
+ export type ToolFallbackRootProps = Omit<React.ComponentProps<typeof Collapsible>, "open" | "onOpenChange"> & {
4
+ open?: boolean;
5
+ onOpenChange?: (open: boolean) => void;
6
+ defaultOpen?: boolean;
7
+ };
8
+ declare function ToolFallbackRoot({ className, open: controlledOpen, onOpenChange: controlledOnOpenChange, defaultOpen, children, ...props }: ToolFallbackRootProps): import('react').JSX.Element;
9
+ declare function ToolFallbackTrigger({ toolName, status, responseDeliveryStatus, className, ...props }: React.ComponentProps<typeof CollapsibleTrigger> & {
10
+ toolName: string;
11
+ status?: ToolCallMessagePartStatus;
12
+ responseDeliveryStatus?: ToolCallMessagePart["responseDeliveryStatus"];
13
+ }): import('react').JSX.Element;
14
+ declare function ToolFallbackContent({ className, children, ...props }: React.ComponentProps<typeof CollapsibleContent>): import('react').JSX.Element;
15
+ declare function ToolFallbackArgs({ argsText, className, ...props }: React.ComponentProps<"div"> & {
16
+ argsText?: string;
17
+ }): import('react').JSX.Element;
18
+ declare const formatUnknownValue: (value: unknown, space?: number) => string;
19
+ declare function ToolFallbackResult({ result, className, ...props }: React.ComponentProps<"div"> & {
20
+ result?: unknown;
21
+ }): import('react').JSX.Element;
22
+ declare function ToolFallbackError({ status, className, ...props }: React.ComponentProps<"div"> & {
23
+ status?: ToolCallMessagePartStatus;
24
+ }): import('react').JSX.Element;
25
+ declare const offersInterruptAction: (status: ToolCallMessagePartStatus | undefined, approval: ToolCallMessagePart["approval"], interrupt: ToolCallMessagePart["interrupt"]) => boolean;
26
+ declare const ToolFallbackApproval: import('react').ForwardRefExoticComponent<Omit<import('react').DetailedHTMLProps<import('react').HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & Partial<Pick<ToolCallMessagePart<import('assistant-stream/utils').ReadonlyJSONObject, unknown> & {
27
+ readonly status: import('@assistant-ui/core').MessagePartStatus | ToolCallMessagePartStatus;
28
+ } & ToolCallMessagePart<any, unknown> & {
29
+ addResult: (result: unknown) => void;
30
+ resume: (payload: unknown) => void;
31
+ respondToApproval: (response: import('@assistant-ui/core').ToolApprovalResponse) => Promise<void>;
32
+ unstable_recordInteraction?: ((input: import('@assistant-ui/core').Unstable_ToolInteractionInput) => Promise<void>) | undefined;
33
+ }, "status" | "addResult" | "resume" | "respondToApproval">> & {
34
+ interrupt?: ToolCallMessagePart["interrupt"];
35
+ approval?: ToolCallMessagePart["approval"];
36
+ } & import('react').RefAttributes<HTMLDivElement>>;
37
+ declare const ToolFallback: ToolCallMessagePartComponent & {
38
+ Root: typeof ToolFallbackRoot;
39
+ Trigger: typeof ToolFallbackTrigger;
40
+ Content: typeof ToolFallbackContent;
41
+ Args: typeof ToolFallbackArgs;
42
+ Result: typeof ToolFallbackResult;
43
+ Error: typeof ToolFallbackError;
44
+ Approval: typeof ToolFallbackApproval;
45
+ };
46
+ export { formatUnknownValue, offersInterruptAction, ToolFallback, ToolFallbackRoot, ToolFallbackTrigger, ToolFallbackContent, ToolFallbackArgs, ToolFallbackResult, ToolFallbackError, ToolFallbackApproval, };
@@ -0,0 +1,34 @@
1
+ import { FC, PropsWithChildren } from 'react';
2
+ import { VariantProps } from 'class-variance-authority';
3
+ import { CollapsibleRoot as Collapsible, CollapsibleContent, CollapsibleTrigger } from './collapsible-root';
4
+ declare const toolGroupVariants: (props?: {
5
+ variant?: "outline" | "ghost" | "muted";
6
+ } & import('class-variance-authority/types').ClassProp) => string;
7
+ export type ToolGroupRootProps = Omit<React.ComponentProps<typeof Collapsible>, "open" | "onOpenChange"> & VariantProps<typeof toolGroupVariants> & {
8
+ open?: boolean;
9
+ onOpenChange?: (open: boolean) => void;
10
+ defaultOpen?: boolean;
11
+ };
12
+ declare function ToolGroupRoot({ className, variant, open: controlledOpen, onOpenChange: controlledOnOpenChange, defaultOpen, children, ...props }: ToolGroupRootProps): import('react').JSX.Element;
13
+ declare function ToolGroupTrigger({ count, active, className, ...props }: React.ComponentProps<typeof CollapsibleTrigger> & {
14
+ count: number;
15
+ active?: boolean;
16
+ }): import('react').JSX.Element;
17
+ declare function ToolGroupContent({ className, children, ...props }: React.ComponentProps<typeof CollapsibleContent>): import('react').JSX.Element;
18
+ type ToolGroupComponent = FC<PropsWithChildren<{
19
+ startIndex: number;
20
+ endIndex: number;
21
+ }>> & {
22
+ Root: typeof ToolGroupRoot;
23
+ Trigger: typeof ToolGroupTrigger;
24
+ Content: typeof ToolGroupContent;
25
+ };
26
+ /**
27
+ * @deprecated 此包装组件用于兼容 `<MessagePrimitive.Parts>` 上旧版的
28
+ * `components.ToolGroup` 属性。建议改用 `<MessagePrimitive.GroupedParts>`,
29
+ * 并通过 `groupBy` 返回 `"group-tool"`,然后直接组合
30
+ * `ToolGroupRoot`、`ToolGroupTrigger` 和 `ToolGroupContent`。
31
+ * 具体用法请参考 `thread.tsx`。
32
+ */
33
+ declare const ToolGroup: ToolGroupComponent;
34
+ export { ToolGroup, ToolGroupRoot, ToolGroupTrigger, ToolGroupContent, toolGroupVariants, };
@@ -0,0 +1,7 @@
1
+ import { ComponentPropsWithRef } from 'react';
2
+ import { Button } from './ui/button';
3
+ export type TooltipIconButtonProps = ComponentPropsWithRef<typeof Button> & {
4
+ tooltip: string;
5
+ side?: "top" | "bottom" | "left" | "right";
6
+ };
7
+ export declare const TooltipIconButton: import('react').ForwardRefExoticComponent<Omit<TooltipIconButtonProps, "ref"> & import('react').RefAttributes<HTMLButtonElement>>;
@@ -0,0 +1,11 @@
1
+ import { Avatar as AvatarPrimitive } from '@base-ui/react/avatar';
2
+ import * as React from "react";
3
+ declare function Avatar({ className, size, ...props }: AvatarPrimitive.Root.Props & {
4
+ size?: "default" | "sm" | "lg";
5
+ }): React.JSX.Element;
6
+ declare function AvatarImage({ className, ...props }: AvatarPrimitive.Image.Props): React.JSX.Element;
7
+ declare function AvatarFallback({ className, ...props }: AvatarPrimitive.Fallback.Props): React.JSX.Element;
8
+ declare function AvatarBadge({ className, ...props }: React.ComponentProps<"span">): React.JSX.Element;
9
+ declare function AvatarGroup({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
10
+ declare function AvatarGroupCount({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
11
+ export { Avatar, AvatarImage, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarBadge, };
@@ -0,0 +1,10 @@
1
+ import { Button as ButtonPrimitive } from '@base-ui/react/button';
2
+ import { VariantProps } from 'class-variance-authority';
3
+ import * as React from "react";
4
+ declare const buttonVariants: (props?: {
5
+ variant?: "default" | "link" | "outline" | "secondary" | "ghost" | "destructive";
6
+ size?: "default" | "xs" | "sm" | "lg" | "icon" | "icon-xs" | "icon-sm" | "icon-lg";
7
+ } & import('class-variance-authority/types').ClassProp) => string;
8
+ type ButtonProps = ButtonPrimitive.Props & VariantProps<typeof buttonVariants>;
9
+ declare const Button: React.ForwardRefExoticComponent<Omit<ButtonProps, "ref"> & React.RefAttributes<HTMLButtonElement>>;
10
+ export { Button, buttonVariants };
@@ -0,0 +1,17 @@
1
+ import { Dialog as DialogPrimitive } from '@base-ui/react/dialog';
2
+ import * as React from "react";
3
+ declare function Dialog({ ...props }: DialogPrimitive.Root.Props): React.JSX.Element;
4
+ declare function DialogTrigger({ ...props }: DialogPrimitive.Trigger.Props): React.JSX.Element;
5
+ declare function DialogPortal({ ...props }: DialogPrimitive.Portal.Props): React.JSX.Element;
6
+ declare function DialogClose({ ...props }: DialogPrimitive.Close.Props): React.JSX.Element;
7
+ declare function DialogOverlay({ className, ...props }: DialogPrimitive.Backdrop.Props): React.JSX.Element;
8
+ declare function DialogContent({ className, children, showCloseButton, ...props }: DialogPrimitive.Popup.Props & {
9
+ showCloseButton?: boolean;
10
+ }): React.JSX.Element;
11
+ declare function DialogHeader({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
12
+ declare function DialogFooter({ className, showCloseButton, children, ...props }: React.ComponentProps<"div"> & {
13
+ showCloseButton?: boolean;
14
+ }): React.JSX.Element;
15
+ declare function DialogTitle({ className, ...props }: DialogPrimitive.Title.Props): React.JSX.Element;
16
+ declare function DialogDescription({ className, ...props }: DialogPrimitive.Description.Props): React.JSX.Element;
17
+ export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, };
@@ -0,0 +1,2 @@
1
+ declare function Skeleton({ className, ...props }: React.ComponentProps<"div">): import('react').JSX.Element;
2
+ export { Skeleton };
@@ -0,0 +1,3 @@
1
+ import * as React from "react";
2
+ declare function Textarea({ className, ...props }: React.ComponentProps<"textarea">): React.JSX.Element;
3
+ export { Textarea };
@@ -0,0 +1,6 @@
1
+ import { Tooltip as TooltipPrimitive } from '@base-ui/react/tooltip';
2
+ declare function TooltipProvider({ delay, ...props }: TooltipPrimitive.Provider.Props): import('react').JSX.Element;
3
+ declare function Tooltip({ ...props }: TooltipPrimitive.Root.Props): import('react').JSX.Element;
4
+ declare function TooltipTrigger({ ...props }: TooltipPrimitive.Trigger.Props): import('react').JSX.Element;
5
+ declare function TooltipContent({ className, side, sideOffset, align, alignOffset, children, ...props }: TooltipPrimitive.Popup.Props & Pick<TooltipPrimitive.Positioner.Props, "align" | "alignOffset" | "side" | "sideOffset">): import('react').JSX.Element;
6
+ export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };
@@ -0,0 +1,2 @@
1
+ import { useEffect } from 'react';
2
+ export declare const useIsomorphicLayoutEffect: typeof useEffect;
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="48" height="46" fill="none" viewBox="0 0 48 46"><path fill="#863bff" d="M25.946 44.938c-.664.845-2.021.375-2.021-.698V33.937a2.26 2.26 0 0 0-2.262-2.262H10.287c-.92 0-1.456-1.04-.92-1.788l7.48-10.471c1.07-1.497 0-3.578-1.842-3.578H1.237c-.92 0-1.456-1.04-.92-1.788L10.013.474c.214-.297.556-.474.92-.474h28.894c.92 0 1.456 1.04.92 1.788l-7.48 10.471c-1.07 1.498 0 3.579 1.842 3.579h11.377c.943 0 1.473 1.088.89 1.83L25.947 44.94z" style="fill:#863bff;fill:color(display-p3 .5252 .23 1);fill-opacity:1"/><mask id="a" width="48" height="46" x="0" y="0" maskUnits="userSpaceOnUse" style="mask-type:alpha"><path fill="#000" d="M25.842 44.938c-.664.844-2.021.375-2.021-.698V33.937a2.26 2.26 0 0 0-2.262-2.262H10.183c-.92 0-1.456-1.04-.92-1.788l7.48-10.471c1.07-1.498 0-3.579-1.842-3.579H1.133c-.92 0-1.456-1.04-.92-1.787L9.91.473c.214-.297.556-.474.92-.474h28.894c.92 0 1.456 1.04.92 1.788l-7.48 10.471c-1.07 1.498 0 3.578 1.842 3.578h11.377c.943 0 1.473 1.088.89 1.832L25.843 44.94z" style="fill:#000;fill-opacity:1"/></mask><g mask="url(#a)"><g filter="url(#b)"><ellipse cx="5.508" cy="14.704" fill="#ede6ff" rx="5.508" ry="14.704" style="fill:#ede6ff;fill:color(display-p3 .9275 .9033 1);fill-opacity:1" transform="matrix(.00324 1 1 -.00324 -4.47 31.516)"/></g><g filter="url(#c)"><ellipse cx="10.399" cy="29.851" fill="#ede6ff" rx="10.399" ry="29.851" style="fill:#ede6ff;fill:color(display-p3 .9275 .9033 1);fill-opacity:1" transform="matrix(.00324 1 1 -.00324 -39.328 7.883)"/></g><g filter="url(#d)"><ellipse cx="5.508" cy="30.487" fill="#7e14ff" rx="5.508" ry="30.487" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(89.814 -25.913 -14.639)scale(1 -1)"/></g><g filter="url(#e)"><ellipse cx="5.508" cy="30.599" fill="#7e14ff" rx="5.508" ry="30.599" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(89.814 -32.644 -3.334)scale(1 -1)"/></g><g filter="url(#f)"><ellipse cx="5.508" cy="30.599" fill="#7e14ff" rx="5.508" ry="30.599" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="matrix(.00324 1 1 -.00324 -34.34 30.47)"/></g><g filter="url(#g)"><ellipse cx="14.072" cy="22.078" fill="#ede6ff" rx="14.072" ry="22.078" style="fill:#ede6ff;fill:color(display-p3 .9275 .9033 1);fill-opacity:1" transform="rotate(93.35 24.506 48.493)scale(-1 1)"/></g><g filter="url(#h)"><ellipse cx="3.47" cy="21.501" fill="#7e14ff" rx="3.47" ry="21.501" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(89.009 28.708 47.59)scale(-1 1)"/></g><g filter="url(#i)"><ellipse cx="3.47" cy="21.501" fill="#7e14ff" rx="3.47" ry="21.501" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(89.009 28.708 47.59)scale(-1 1)"/></g><g filter="url(#j)"><ellipse cx=".387" cy="8.972" fill="#7e14ff" rx="4.407" ry="29.108" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(39.51 .387 8.972)"/></g><g filter="url(#k)"><ellipse cx="47.523" cy="-6.092" fill="#7e14ff" rx="4.407" ry="29.108" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(37.892 47.523 -6.092)"/></g><g filter="url(#l)"><ellipse cx="41.412" cy="6.333" fill="#47bfff" rx="5.971" ry="9.665" style="fill:#47bfff;fill:color(display-p3 .2799 .748 1);fill-opacity:1" transform="rotate(37.892 41.412 6.333)"/></g><g filter="url(#m)"><ellipse cx="-1.879" cy="38.332" fill="#7e14ff" rx="4.407" ry="29.108" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(37.892 -1.88 38.332)"/></g><g filter="url(#n)"><ellipse cx="-1.879" cy="38.332" fill="#7e14ff" rx="4.407" ry="29.108" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(37.892 -1.88 38.332)"/></g><g filter="url(#o)"><ellipse cx="35.651" cy="29.907" fill="#7e14ff" rx="4.407" ry="29.108" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(37.892 35.651 29.907)"/></g><g filter="url(#p)"><ellipse cx="38.418" cy="32.4" fill="#47bfff" rx="5.971" ry="15.297" style="fill:#47bfff;fill:color(display-p3 .2799 .748 1);fill-opacity:1" transform="rotate(37.892 38.418 32.4)"/></g></g><defs><filter id="b" width="60.045" height="41.654" x="-19.77" y="16.149" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="7.659"/></filter><filter id="c" width="90.34" height="51.437" x="-54.613" y="-7.533" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="7.659"/></filter><filter id="d" width="79.355" height="29.4" x="-49.64" y="2.03" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="e" width="79.579" height="29.4" x="-45.045" y="20.029" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="f" width="79.579" height="29.4" x="-43.513" y="21.178" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="g" width="74.749" height="58.852" x="15.756" y="-17.901" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="7.659"/></filter><filter id="h" width="61.377" height="25.362" x="23.548" y="2.284" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="i" width="61.377" height="25.362" x="23.548" y="2.284" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="j" width="56.045" height="63.649" x="-27.636" y="-22.853" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="k" width="54.814" height="64.646" x="20.116" y="-38.415" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="l" width="33.541" height="35.313" x="24.641" y="-11.323" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="m" width="54.814" height="64.646" x="-29.286" y="6.009" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="n" width="54.814" height="64.646" x="-29.286" y="6.009" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="o" width="54.814" height="64.646" x="8.244" y="-2.416" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="p" width="39.409" height="43.623" x="18.713" y="10.588" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter></defs></svg>
@@ -0,0 +1 @@
1
+ export declare const useAttachmentSrc: () => string;
@@ -0,0 +1,7 @@
1
+ export type UseCopyToClipboardOptions = {
2
+ copiedDuration?: number;
3
+ };
4
+ export declare const useCopyToClipboard: ({ copiedDuration, }?: UseCopyToClipboardOptions) => {
5
+ isCopied: boolean;
6
+ copyToClipboard: (value: string) => void;
7
+ };