@anvia/react-ui 0.2.0 → 0.4.0

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 (48) hide show
  1. package/README.md +14 -1
  2. package/dist/attachment/index.js +2 -2
  3. package/dist/chat/index.d.ts +39 -3
  4. package/dist/chat/index.js +4 -4
  5. package/dist/{chunk-RRINF6FN.js → chunk-32QFNRXR.js} +2 -2
  6. package/dist/chunk-657E5BPN.js +291 -0
  7. package/dist/chunk-657E5BPN.js.map +1 -0
  8. package/dist/{chunk-7AS6R7BB.js → chunk-BCCU3VT5.js} +93 -16
  9. package/dist/chunk-BCCU3VT5.js.map +1 -0
  10. package/dist/{chunk-AOZN3SWB.js → chunk-FZANAMWH.js} +4 -3
  11. package/dist/{chunk-AOZN3SWB.js.map → chunk-FZANAMWH.js.map} +1 -1
  12. package/dist/chunk-GXB4VINL.js +236 -0
  13. package/dist/chunk-GXB4VINL.js.map +1 -0
  14. package/dist/{chunk-WK33ER4Q.js → chunk-JUNV3MUR.js} +2 -2
  15. package/dist/chunk-KO36TK2O.js +1549 -0
  16. package/dist/chunk-KO36TK2O.js.map +1 -0
  17. package/dist/chunk-SE7I6ZXJ.js +432 -0
  18. package/dist/chunk-SE7I6ZXJ.js.map +1 -0
  19. package/dist/{chunk-LSHD67YK.js → chunk-TOBAQM2G.js} +2 -2
  20. package/dist/completion/index.js +2 -2
  21. package/dist/human-input/index.js +2 -2
  22. package/dist/image/index.d.ts +40 -0
  23. package/dist/image/index.js +12 -0
  24. package/dist/image/index.js.map +1 -0
  25. package/dist/image-DanUxcl2.d.ts +14 -0
  26. package/dist/index.d.ts +7 -1
  27. package/dist/index.js +32 -8
  28. package/dist/message/index.js +3 -3
  29. package/dist/selection-toolbar/index.d.ts +21 -0
  30. package/dist/selection-toolbar/index.js +12 -0
  31. package/dist/selection-toolbar/index.js.map +1 -0
  32. package/dist/selection-toolbar-Cwjbuv5S.d.ts +14 -0
  33. package/dist/shared.d.ts +4 -1
  34. package/dist/shared.js +13 -3
  35. package/dist/styles.css +42 -0
  36. package/dist/thread-C2-Xo08o.d.ts +102 -0
  37. package/dist/thread-list/index.d.ts +47 -0
  38. package/dist/thread-list/index.js +18 -0
  39. package/dist/thread-list/index.js.map +1 -0
  40. package/dist/thread-list-On8db4XL.d.ts +34 -0
  41. package/package.json +27 -4
  42. package/dist/chunk-7AS6R7BB.js.map +0 -1
  43. package/dist/chunk-AXZB6JSE.js +0 -813
  44. package/dist/chunk-AXZB6JSE.js.map +0 -1
  45. package/dist/thread-CluT3m5k.d.ts +0 -31
  46. /package/dist/{chunk-RRINF6FN.js.map → chunk-32QFNRXR.js.map} +0 -0
  47. /package/dist/{chunk-WK33ER4Q.js.map → chunk-JUNV3MUR.js.map} +0 -0
  48. /package/dist/{chunk-LSHD67YK.js.map → chunk-TOBAQM2G.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/image/parts.tsx","../src/image/index.ts"],"sourcesContent":["import type { UIAttachment } from \"@anvia/react\";\nimport {\n forwardRef,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport {\n type ImageContextValue,\n InternalImageProvider,\n useImage,\n useOptionalAttachment,\n} from \"../contexts\";\nimport { composeRefs, type PrimitiveProps, renderPrimitive } from \"../primitives\";\n\ntype ImageRootChildren = ReactNode | ((image: ImageContextValue) => ReactNode);\ntype ImageRenderWhen = \"image\" | \"always\";\n\ntype ImageRootProps = Omit<PrimitiveProps<\"figure\">, \"children\"> & {\n attachment?: UIAttachment;\n children?: ImageRootChildren;\n renderWhen?: ImageRenderWhen;\n};\n\nconst ImageRoot = forwardRef<HTMLElement, ImageRootProps>(function ImageRoot(\n { attachment: attachmentProp, children, renderWhen = \"image\", ...props },\n ref,\n) {\n const attachmentContext = useOptionalAttachment();\n const attachment = attachmentProp ?? attachmentContext?.attachment;\n const [zoomOpen, setZoomOpen] = useState(false);\n\n if (attachment === undefined) {\n throw new Error(\"Image.Root requires an attachment prop or Attachment context.\");\n }\n\n const src = imageSource(attachment);\n const isImage = isImageAttachment(attachment);\n const value = useMemo<ImageContextValue>(\n () => ({\n attachment,\n ...(src === undefined ? {} : { src }),\n ...(attachment.name === undefined ? {} : { name: attachment.name }),\n ...(attachment.mediaType === undefined ? {} : { mediaType: attachment.mediaType }),\n isImage,\n zoomOpen,\n setZoomOpen,\n }),\n [attachment, attachment.mediaType, attachment.name, isImage, src, zoomOpen],\n );\n if (!isImage && renderWhen !== \"always\") {\n return null;\n }\n\n const renderedChildren = typeof children === \"function\" ? children(value) : children;\n\n return (\n <InternalImageProvider value={value}>\n {renderPrimitive(\n \"figure\",\n {\n ...props,\n children: renderedChildren ?? (\n <>\n <ImagePreview />\n <ImageName />\n </>\n ),\n \"data-anvia-image\": \"\",\n \"data-state\": src === undefined ? \"unavailable\" : \"ready\",\n \"data-type\": attachment.type,\n } as PrimitiveProps<\"figure\">,\n ref,\n )}\n </InternalImageProvider>\n );\n});\n\ntype ImagePreviewProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n alt?: string;\n errorFallback?: ReactNode;\n loadingFallback?: ReactNode;\n};\n\nconst ImagePreview = forwardRef<HTMLDivElement, ImagePreviewProps>(function ImagePreview(\n { alt, errorFallback, loadingFallback, ...props },\n ref,\n) {\n const image = useImage();\n const [state, setState] = useState<\"loading\" | \"ready\" | \"error\">(\n image.src === undefined ? \"error\" : \"loading\",\n );\n\n useEffect(() => {\n setState(image.src === undefined ? \"error\" : \"loading\");\n }, [image.src]);\n\n const fallback =\n state === \"loading\"\n ? (loadingFallback ?? \"Loading image\")\n : state === \"error\"\n ? (errorFallback ?? \"Image unavailable\")\n : null;\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children:\n image.src === undefined ? (\n fallback\n ) : (\n <>\n {state === \"ready\" ? null : <span data-anvia-image-fallback=\"\">{fallback}</span>}\n <img\n alt={alt ?? image.name ?? \"Image\"}\n data-anvia-image-img=\"\"\n hidden={state !== \"ready\"}\n onError={() => setState(\"error\")}\n onLoad={() => setState(\"ready\")}\n src={image.src}\n />\n </>\n ),\n \"data-anvia-image-preview\": \"\",\n \"data-state\": state,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\nconst ImageName = forwardRef<HTMLElement, PrimitiveProps<\"figcaption\">>(\n function ImageName(props, ref) {\n const image = useImage();\n\n return renderPrimitive(\n \"figcaption\",\n {\n ...props,\n children: props.children ?? image.name ?? image.mediaType ?? image.attachment.type,\n \"data-anvia-image-name\": \"\",\n } as PrimitiveProps<\"figcaption\">,\n ref,\n );\n },\n);\n\nconst ImageActions = forwardRef<HTMLDivElement, PrimitiveProps<\"div\">>(\n function ImageActions(props, ref) {\n return renderPrimitive(\n \"div\",\n {\n ...props,\n \"data-anvia-image-actions\": \"\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\ntype ImageActionState = \"idle\" | \"done\" | \"error\";\n\nconst ImageCopy = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(function ImageCopy(\n { onClick, ...props },\n ref,\n) {\n const image = useImage();\n const [copyState, setCopyState] = useState<ImageActionState>(\"idle\");\n const disabled = props.disabled ?? image.src === undefined;\n\n const handleClick = useCallback(\n async (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled || image.src === undefined) {\n return;\n }\n try {\n await copyImage(image);\n setCopyState(\"done\");\n } catch {\n setCopyState(\"error\");\n }\n },\n [disabled, image, onClick],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Copy image\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-anvia-image-copy\": \"\",\n \"data-state\": copyState,\n } as PrimitiveProps<\"button\">,\n ref,\n );\n});\n\ntype ImageDownloadProps = PrimitiveProps<\"button\"> & {\n filename?: string;\n};\n\nconst ImageDownload = forwardRef<HTMLButtonElement, ImageDownloadProps>(function ImageDownload(\n { filename, onClick, ...props },\n ref,\n) {\n const image = useImage();\n const disabled = props.disabled ?? image.src === undefined;\n\n const handleClick = useCallback(\n async (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled || image.src === undefined) {\n return;\n }\n try {\n await downloadImage(image, filename);\n } catch {\n return;\n }\n },\n [disabled, filename, image, onClick],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Download\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-anvia-image-download\": \"\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n});\n\nconst ImageZoomTrigger = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function ImageZoomTrigger({ onClick, ...props }, ref) {\n const image = useImage();\n const disabled = props.disabled ?? image.src === undefined;\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n image.setZoomOpen(true);\n },\n [disabled, image, onClick],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Open image\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-anvia-image-zoom-trigger\": \"\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\ntype ImageZoomOverlayProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n container?: Element | DocumentFragment;\n};\n\nconst ImageZoomOverlay = forwardRef<HTMLDivElement, ImageZoomOverlayProps>(\n function ImageZoomOverlay({ container, onClick, onKeyDown, ...props }, ref) {\n const image = useImage();\n const portalContainer = container ?? globalThis.document?.body;\n const overlayRef = useRef<HTMLDivElement | null>(null);\n const composedRef = useMemo(() => composeRefs(overlayRef, ref), [ref]);\n\n useEffect(() => {\n if (!image.zoomOpen) {\n return;\n }\n const document = globalThis.document;\n if (document === undefined) {\n return;\n }\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key === \"Escape\") {\n image.setZoomOpen(false);\n }\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [image.setZoomOpen, image.zoomOpen]);\n\n useEffect(() => {\n if (!image.zoomOpen) {\n return;\n }\n const activeElement = globalThis.document?.activeElement;\n const previousFocus = activeElement instanceof HTMLElement ? activeElement : undefined;\n focusOverlay(overlayRef.current);\n return () => {\n if (previousFocus?.isConnected === true) {\n previousFocus.focus();\n }\n };\n }, [image.zoomOpen]);\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLDivElement>) => {\n onClick?.(event);\n if (!event.defaultPrevented) {\n image.setZoomOpen(false);\n }\n },\n [image, onClick],\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n if (event.defaultPrevented) {\n return;\n }\n if (event.key === \"Escape\") {\n image.setZoomOpen(false);\n return;\n }\n if (event.key === \"Tab\") {\n trapOverlayFocus(event, overlayRef.current);\n }\n },\n [image, onKeyDown],\n );\n\n if (!image.zoomOpen || image.src === undefined || portalContainer === undefined) {\n return null;\n }\n\n const overlay = renderPrimitive(\n \"div\",\n {\n ...props,\n children: <img alt={image.name ?? \"Image\"} data-anvia-image-zoom-img=\"\" src={image.src} />,\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n \"aria-modal\": props[\"aria-modal\"] ?? true,\n role: props.role ?? \"dialog\",\n tabIndex: props.tabIndex ?? -1,\n \"data-anvia-image-zoom-overlay\": \"\",\n } as PrimitiveProps<\"div\">,\n composedRef,\n );\n\n return createPortal(overlay, portalContainer);\n },\n);\n\nfunction isImageAttachment(attachment: UIAttachment): boolean {\n return attachment.type === \"image\" || attachment.mediaType?.startsWith(\"image/\") === true;\n}\n\nfunction imageSource(attachment: UIAttachment): string | undefined {\n if (!isImageAttachment(attachment)) {\n return attachment.url;\n }\n if (attachment.url !== undefined) {\n return attachment.url;\n }\n if (attachment.data !== undefined && attachment.mediaType !== undefined) {\n return `data:${attachment.mediaType};base64,${attachment.data}`;\n }\n return undefined;\n}\n\nasync function copyImage(image: ImageContextValue): Promise<void> {\n if (image.src === undefined) {\n throw new Error(\"Image source is unavailable.\");\n }\n const clipboard = globalThis.navigator?.clipboard as\n | (Clipboard & { write?: (items: ClipboardItem[]) => Promise<void> })\n | undefined;\n const ClipboardItemConstructor = globalThis.ClipboardItem;\n if (clipboard?.write === undefined || ClipboardItemConstructor === undefined) {\n throw new Error(\"Clipboard image copy is unavailable.\");\n }\n const blob = await imageBlob(image);\n await clipboard.write([new ClipboardItemConstructor({ [blob.type]: blob })]);\n}\n\nasync function imageBlob(image: ImageContextValue): Promise<Blob> {\n if (image.attachment.data !== undefined) {\n return base64ToBlob(\n image.attachment.data,\n image.attachment.mediaType ?? image.mediaType ?? \"image/png\",\n );\n }\n if (image.src === undefined || globalThis.fetch === undefined) {\n throw new Error(\"Image source is unavailable.\");\n }\n const response = await fetch(image.src);\n return response.blob();\n}\n\nfunction base64ToBlob(data: string, mediaType: string): Blob {\n const binary = globalThis.atob(data);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) {\n bytes[index] = binary.charCodeAt(index);\n }\n return new Blob([bytes], { type: mediaType });\n}\n\nasync function downloadImage(\n image: ImageContextValue,\n filename: string | undefined,\n): Promise<void> {\n const document = globalThis.document;\n const url = globalThis.URL;\n if (image.src === undefined || document === undefined || url?.createObjectURL === undefined) {\n return;\n }\n const blobUrl = url.createObjectURL(await imageBlob(image));\n const link = document.createElement(\"a\");\n try {\n link.href = blobUrl;\n link.download = filename ?? image.name ?? defaultImageFilename(image);\n link.rel = \"noopener\";\n document.body.append(link);\n link.click();\n } finally {\n link.remove();\n url.revokeObjectURL(blobUrl);\n }\n}\n\nfunction defaultImageFilename(image: ImageContextValue): string {\n const extension = image.mediaType?.split(\"/\")[1]?.split(\";\")[0] ?? \"png\";\n return `image.${extension}`;\n}\n\nfunction focusOverlay(overlay: HTMLDivElement | null): void {\n if (overlay === null) {\n return;\n }\n const [firstFocusable] = focusableElements(overlay);\n (firstFocusable ?? overlay).focus();\n}\n\nfunction trapOverlayFocus(\n event: KeyboardEvent<HTMLDivElement>,\n overlay: HTMLDivElement | null,\n): void {\n if (overlay === null) {\n return;\n }\n const focusable = focusableElements(overlay);\n if (focusable.length === 0) {\n event.preventDefault();\n overlay.focus();\n return;\n }\n\n const firstFocusable = focusable[0];\n const lastFocusable = focusable[focusable.length - 1];\n const activeElement = globalThis.document?.activeElement;\n if (event.shiftKey && activeElement === firstFocusable) {\n event.preventDefault();\n lastFocusable?.focus();\n return;\n }\n if (!event.shiftKey && activeElement === lastFocusable) {\n event.preventDefault();\n firstFocusable?.focus();\n return;\n }\n if (activeElement instanceof Node && !overlay.contains(activeElement)) {\n event.preventDefault();\n (event.shiftKey ? lastFocusable : firstFocusable)?.focus();\n }\n}\n\nfunction focusableElements(container: HTMLElement): HTMLElement[] {\n return Array.from(\n container.querySelectorAll<HTMLElement>(\n [\n \"a[href]\",\n \"button:not(:disabled)\",\n \"input:not(:disabled)\",\n \"select:not(:disabled)\",\n \"textarea:not(:disabled)\",\n \"[tabindex]\",\n ].join(\",\"),\n ),\n ).filter((element) => element.tabIndex >= 0 && element.getAttribute(\"aria-hidden\") !== \"true\");\n}\n\nexport {\n ImageActions,\n ImageCopy,\n ImageDownload,\n ImageName,\n ImagePreview,\n ImageRoot,\n ImageZoomOverlay,\n ImageZoomTrigger,\n};\n","import {\n ImageActions,\n ImageCopy,\n ImageDownload,\n ImageName,\n ImagePreview,\n ImageRoot,\n ImageZoomOverlay,\n ImageZoomTrigger,\n} from \"./parts\";\n\nexport const Image = {\n Root: ImageRoot,\n Preview: ImagePreview,\n Name: ImageName,\n Actions: ImageActions,\n Copy: ImageCopy,\n Download: ImageDownload,\n ZoomTrigger: ImageZoomTrigger,\n ZoomOverlay: ImageZoomOverlay,\n} as const;\n\nexport type { ImageContextValue } from \"../contexts\";\nexport { useImage } from \"../contexts\";\n"],"mappings":"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","names":["ImageRoot","ImagePreview","ImageName","ImageActions","ImageCopy","ImageDownload","ImageZoomTrigger","ImageZoomOverlay","handleKeyDown"]}
@@ -5,7 +5,7 @@ import {
5
5
  InternalCompletionInputProvider,
6
6
  useCompletionContext,
7
7
  useCompletionInput
8
- } from "./chunk-7AS6R7BB.js";
8
+ } from "./chunk-BCCU3VT5.js";
9
9
 
10
10
  // src/completion/form.tsx
11
11
  import {
@@ -197,4 +197,4 @@ var Completion = {
197
197
  export {
198
198
  Completion
199
199
  };
200
- //# sourceMappingURL=chunk-LSHD67YK.js.map
200
+ //# sourceMappingURL=chunk-TOBAQM2G.js.map
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  Completion
3
- } from "../chunk-LSHD67YK.js";
3
+ } from "../chunk-TOBAQM2G.js";
4
4
  import "../chunk-T3ZFZ3NP.js";
5
5
  import {
6
6
  CompletionProvider,
7
7
  useCompletionContext,
8
8
  useCompletionInput
9
- } from "../chunk-7AS6R7BB.js";
9
+ } from "../chunk-BCCU3VT5.js";
10
10
  export {
11
11
  Completion,
12
12
  CompletionProvider,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  HumanInput
3
- } from "../chunk-WK33ER4Q.js";
3
+ } from "../chunk-JUNV3MUR.js";
4
4
  import "../chunk-T3ZFZ3NP.js";
5
5
  import {
6
6
  useApproval,
@@ -8,7 +8,7 @@ import {
8
8
  useHumanInput,
9
9
  useQuestion,
10
10
  useQuestionPrompt
11
- } from "../chunk-7AS6R7BB.js";
11
+ } from "../chunk-BCCU3VT5.js";
12
12
  export {
13
13
  HumanInput,
14
14
  useApproval,
@@ -0,0 +1,40 @@
1
+ import * as react from 'react';
2
+ import * as _anvia_react from '@anvia/react';
3
+ import { I as ImageContextValue } from '../image-DanUxcl2.js';
4
+ export { u as useImage } from '../image-DanUxcl2.js';
5
+ import { P as PrimitiveProps } from '../render-CRKWam2v.js';
6
+
7
+ declare const Image: {
8
+ readonly Root: react.ForwardRefExoticComponent<Omit<PrimitiveProps<"figure">, "children"> & {
9
+ attachment?: _anvia_react.UIAttachment;
10
+ children?: react.ReactNode | ((image: ImageContextValue) => react.ReactNode);
11
+ renderWhen?: "image" | "always";
12
+ } & react.RefAttributes<HTMLElement>>;
13
+ readonly Preview: react.ForwardRefExoticComponent<Omit<PrimitiveProps<"div">, "children"> & {
14
+ alt?: string;
15
+ errorFallback?: react.ReactNode;
16
+ loadingFallback?: react.ReactNode;
17
+ } & react.RefAttributes<HTMLDivElement>>;
18
+ readonly Name: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.HTMLAttributes<HTMLElement>, HTMLElement>, "ref">, "asChild"> & {
19
+ asChild?: boolean;
20
+ } & react.RefAttributes<HTMLElement>>;
21
+ readonly Actions: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, "asChild"> & {
22
+ asChild?: boolean;
23
+ } & react.RefAttributes<HTMLDivElement>>;
24
+ readonly Copy: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref">, "asChild"> & {
25
+ asChild?: boolean;
26
+ } & react.RefAttributes<HTMLButtonElement>>;
27
+ readonly Download: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref">, "asChild"> & {
28
+ asChild?: boolean;
29
+ } & {
30
+ filename?: string;
31
+ } & react.RefAttributes<HTMLButtonElement>>;
32
+ readonly ZoomTrigger: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref">, "asChild"> & {
33
+ asChild?: boolean;
34
+ } & react.RefAttributes<HTMLButtonElement>>;
35
+ readonly ZoomOverlay: react.ForwardRefExoticComponent<Omit<PrimitiveProps<"div">, "children"> & {
36
+ container?: Element | DocumentFragment;
37
+ } & react.RefAttributes<HTMLDivElement>>;
38
+ };
39
+
40
+ export { Image, ImageContextValue };
@@ -0,0 +1,12 @@
1
+ import {
2
+ Image
3
+ } from "../chunk-SE7I6ZXJ.js";
4
+ import "../chunk-T3ZFZ3NP.js";
5
+ import {
6
+ useImage
7
+ } from "../chunk-BCCU3VT5.js";
8
+ export {
9
+ Image,
10
+ useImage
11
+ };
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,14 @@
1
+ import { UIAttachment } from '@anvia/react';
2
+
3
+ type ImageContextValue = {
4
+ attachment: UIAttachment;
5
+ src?: string;
6
+ name?: string;
7
+ mediaType?: string;
8
+ isImage: boolean;
9
+ zoomOpen: boolean;
10
+ setZoomOpen(open: boolean): void;
11
+ };
12
+ declare function useImage(): ImageContextValue;
13
+
14
+ export { type ImageContextValue as I, useImage as u };
package/dist/index.d.ts CHANGED
@@ -2,14 +2,20 @@ export { Attachment } from './attachment/index.js';
2
2
  export { A as AttachmentContextValue, u as useAttachment } from './attachment-BP597fV3.js';
3
3
  export { C as ChatController, a as ChatProvider, b as ChatProviderProps, u as useChatContext, c as useHumanInput } from './chat-B3kucz1w.js';
4
4
  export { C as CompletionController, a as CompletionInputContextValue, b as CompletionProvider, c as CompletionProviderProps, u as useCompletionContext, d as useCompletionInput } from './completion-input-WjK6kUyG.js';
5
- export { C as ComposerAttachmentInput, a as ComposerAttachmentsUpdate, b as ComposerContextValue, T as ThreadContextValue, u as useComposer, c as useThread } from './thread-CluT3m5k.js';
5
+ export { C as ComposerAttachmentInput, a as ComposerAttachmentsUpdate, b as ComposerContextValue, c as ComposerEntitiesUpdate, d as ComposerEntity, e as ComposerEntityData, f as ComposerQuote, g as ComposerTriggerDefinition, h as ComposerTriggerItem, i as ComposerTriggerItems, j as ComposerTriggerItemsArgs, k as ComposerTriggerState, l as ComposerTriggerStateUpdate, T as ThreadContextValue, u as useComposer, m as useThread } from './thread-C2-Xo08o.js';
6
6
  export { A as ApprovalContextValue, Q as QuestionContextValue, a as QuestionPromptContextValue, u as useApproval, b as useQuestion, c as useQuestionPrompt } from './human-input-CydeYm_7.js';
7
+ export { I as ImageContextValue, u as useImage } from './image-DanUxcl2.js';
7
8
  export { M as MessageContextValue, a as MessagePartContextValue, u as useMessage, b as useMessagePart } from './message-Beb4ZLNU.js';
9
+ export { S as SelectionToolbarContextValue, a as SelectionToolbarSelection, u as useSelectionToolbar } from './selection-toolbar-Cwjbuv5S.js';
10
+ export { T as ThreadListController, a as ThreadListItemContextValue, b as ThreadListProvider, c as ThreadListProviderProps, d as ThreadListRecord, u as useThreadList, e as useThreadListItem } from './thread-list-On8db4XL.js';
8
11
  export { Composer, ComposerSubmitMessage, ComposerSubmitMessageArgs, Thread } from './chat/index.js';
9
12
  export { Completion } from './completion/index.js';
10
13
  export { HumanInput } from './human-input/index.js';
14
+ export { Image } from './image/index.js';
11
15
  export { Message, MessageAttachmentPart, MessagePartsFilter, MessageToolPart, MessageToolRenderWhen } from './message/index.js';
16
+ export { SelectionToolbar } from './selection-toolbar/index.js';
12
17
  export { P as PrimitiveProps, a as PrimitiveRef } from './render-CRKWam2v.js';
18
+ export { ThreadList, ThreadListItem } from './thread-list/index.js';
13
19
  import '@anvia/react';
14
20
  import 'react';
15
21
  import 'react-markdown';
package/dist/index.js CHANGED
@@ -1,23 +1,34 @@
1
+ import {
2
+ SelectionToolbar
3
+ } from "./chunk-GXB4VINL.js";
4
+ import {
5
+ ThreadList,
6
+ ThreadListItem
7
+ } from "./chunk-657E5BPN.js";
1
8
  import {
2
9
  Composer,
3
10
  Thread
4
- } from "./chunk-AXZB6JSE.js";
11
+ } from "./chunk-KO36TK2O.js";
5
12
  import {
6
13
  Completion
7
- } from "./chunk-LSHD67YK.js";
14
+ } from "./chunk-TOBAQM2G.js";
8
15
  import {
9
16
  HumanInput
10
- } from "./chunk-WK33ER4Q.js";
17
+ } from "./chunk-JUNV3MUR.js";
18
+ import {
19
+ Image
20
+ } from "./chunk-SE7I6ZXJ.js";
11
21
  import {
12
22
  Message
13
- } from "./chunk-AOZN3SWB.js";
23
+ } from "./chunk-FZANAMWH.js";
14
24
  import {
15
25
  Attachment
16
- } from "./chunk-RRINF6FN.js";
26
+ } from "./chunk-32QFNRXR.js";
17
27
  import "./chunk-T3ZFZ3NP.js";
18
28
  import {
19
29
  ChatProvider,
20
30
  CompletionProvider,
31
+ ThreadListProvider,
21
32
  useApproval,
22
33
  useAttachment,
23
34
  useChatContext,
@@ -25,12 +36,16 @@ import {
25
36
  useCompletionInput,
26
37
  useComposer,
27
38
  useHumanInput,
39
+ useImage,
28
40
  useMessage,
29
41
  useMessagePart,
30
42
  useQuestion,
31
43
  useQuestionPrompt,
32
- useThread
33
- } from "./chunk-7AS6R7BB.js";
44
+ useSelectionToolbar,
45
+ useThread,
46
+ useThreadList,
47
+ useThreadListItem
48
+ } from "./chunk-BCCU3VT5.js";
34
49
  export {
35
50
  Attachment,
36
51
  ChatProvider,
@@ -38,8 +53,13 @@ export {
38
53
  CompletionProvider,
39
54
  Composer,
40
55
  HumanInput,
56
+ Image,
41
57
  Message,
58
+ SelectionToolbar,
42
59
  Thread,
60
+ ThreadList,
61
+ ThreadListItem,
62
+ ThreadListProvider,
43
63
  useApproval,
44
64
  useAttachment,
45
65
  useChatContext,
@@ -47,10 +67,14 @@ export {
47
67
  useCompletionInput,
48
68
  useComposer,
49
69
  useHumanInput,
70
+ useImage,
50
71
  useMessage,
51
72
  useMessagePart,
52
73
  useQuestion,
53
74
  useQuestionPrompt,
54
- useThread
75
+ useSelectionToolbar,
76
+ useThread,
77
+ useThreadList,
78
+ useThreadListItem
55
79
  };
56
80
  //# sourceMappingURL=index.js.map
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  Message
3
- } from "../chunk-AOZN3SWB.js";
4
- import "../chunk-RRINF6FN.js";
3
+ } from "../chunk-FZANAMWH.js";
4
+ import "../chunk-32QFNRXR.js";
5
5
  import "../chunk-T3ZFZ3NP.js";
6
6
  import {
7
7
  useChatContext,
8
8
  useMessage,
9
9
  useMessagePart
10
- } from "../chunk-7AS6R7BB.js";
10
+ } from "../chunk-BCCU3VT5.js";
11
11
  export {
12
12
  Message,
13
13
  useChatContext,
@@ -0,0 +1,21 @@
1
+ import * as react from 'react';
2
+ import { a as SelectionToolbarSelection } from '../selection-toolbar-Cwjbuv5S.js';
3
+ export { S as SelectionToolbarContextValue, u as useSelectionToolbar } from '../selection-toolbar-Cwjbuv5S.js';
4
+ import { P as PrimitiveProps } from '../render-CRKWam2v.js';
5
+
6
+ declare const SelectionToolbar: {
7
+ readonly Root: react.ForwardRefExoticComponent<Omit<PrimitiveProps<"div">, "children"> & {
8
+ children?: react.ReactNode;
9
+ container?: Element | DocumentFragment;
10
+ onQuote?: (selection: SelectionToolbarSelection) => void;
11
+ onSelectionChange?: (selection: SelectionToolbarSelection | undefined) => void;
12
+ } & react.RefAttributes<HTMLDivElement>>;
13
+ readonly Quote: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref">, "asChild"> & {
14
+ asChild?: boolean;
15
+ } & react.RefAttributes<HTMLButtonElement>>;
16
+ readonly Copy: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref">, "asChild"> & {
17
+ asChild?: boolean;
18
+ } & react.RefAttributes<HTMLButtonElement>>;
19
+ };
20
+
21
+ export { SelectionToolbar, SelectionToolbarSelection };
@@ -0,0 +1,12 @@
1
+ import {
2
+ SelectionToolbar
3
+ } from "../chunk-GXB4VINL.js";
4
+ import "../chunk-T3ZFZ3NP.js";
5
+ import {
6
+ useSelectionToolbar
7
+ } from "../chunk-BCCU3VT5.js";
8
+ export {
9
+ SelectionToolbar,
10
+ useSelectionToolbar
11
+ };
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,14 @@
1
+ type SelectionToolbarSelection = {
2
+ text: string;
3
+ messageId: string;
4
+ rect: DOMRect;
5
+ };
6
+ type SelectionToolbarContextValue = {
7
+ selection?: SelectionToolbarSelection;
8
+ quote(): void;
9
+ copy(): Promise<void>;
10
+ clear(): void;
11
+ };
12
+ declare function useSelectionToolbar(): SelectionToolbarContextValue;
13
+
14
+ export { type SelectionToolbarContextValue as S, type SelectionToolbarSelection as a, useSelectionToolbar as u };
package/dist/shared.d.ts CHANGED
@@ -1,9 +1,12 @@
1
1
  export { A as AttachmentContextValue, u as useAttachment } from './attachment-BP597fV3.js';
2
2
  export { C as ChatController, a as ChatProvider, b as ChatProviderProps, u as useChatContext, c as useHumanInput } from './chat-B3kucz1w.js';
3
3
  export { C as CompletionController, a as CompletionInputContextValue, b as CompletionProvider, c as CompletionProviderProps, u as useCompletionContext, d as useCompletionInput } from './completion-input-WjK6kUyG.js';
4
- export { C as ComposerAttachmentInput, a as ComposerAttachmentsUpdate, b as ComposerContextValue, T as ThreadContextValue, u as useComposer, c as useThread } from './thread-CluT3m5k.js';
4
+ export { C as ComposerAttachmentInput, a as ComposerAttachmentsUpdate, b as ComposerContextValue, c as ComposerEntitiesUpdate, d as ComposerEntity, e as ComposerEntityData, f as ComposerQuote, g as ComposerTriggerDefinition, h as ComposerTriggerItem, i as ComposerTriggerItems, j as ComposerTriggerItemsArgs, k as ComposerTriggerState, l as ComposerTriggerStateUpdate, T as ThreadContextValue, u as useComposer, m as useThread } from './thread-C2-Xo08o.js';
5
5
  export { A as ApprovalContextValue, Q as QuestionContextValue, a as QuestionPromptContextValue, u as useApproval, b as useQuestion, c as useQuestionPrompt } from './human-input-CydeYm_7.js';
6
+ export { I as ImageContextValue, u as useImage } from './image-DanUxcl2.js';
6
7
  export { M as MessageContextValue, a as MessagePartContextValue, u as useMessage, b as useMessagePart } from './message-Beb4ZLNU.js';
8
+ export { S as SelectionToolbarContextValue, a as SelectionToolbarSelection, u as useSelectionToolbar } from './selection-toolbar-Cwjbuv5S.js';
9
+ export { T as ThreadListController, a as ThreadListItemContextValue, b as ThreadListProvider, c as ThreadListProviderProps, d as ThreadListRecord, u as useThreadList, e as useThreadListItem } from './thread-list-On8db4XL.js';
7
10
  export { P as PrimitiveProps, a as PrimitiveRef } from './render-CRKWam2v.js';
8
11
  import '@anvia/react';
9
12
  import 'react';
package/dist/shared.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  ChatProvider,
3
3
  CompletionProvider,
4
+ ThreadListProvider,
4
5
  useApproval,
5
6
  useAttachment,
6
7
  useChatContext,
@@ -8,15 +9,20 @@ import {
8
9
  useCompletionInput,
9
10
  useComposer,
10
11
  useHumanInput,
12
+ useImage,
11
13
  useMessage,
12
14
  useMessagePart,
13
15
  useQuestion,
14
16
  useQuestionPrompt,
15
- useThread
16
- } from "./chunk-7AS6R7BB.js";
17
+ useSelectionToolbar,
18
+ useThread,
19
+ useThreadList,
20
+ useThreadListItem
21
+ } from "./chunk-BCCU3VT5.js";
17
22
  export {
18
23
  ChatProvider,
19
24
  CompletionProvider,
25
+ ThreadListProvider,
20
26
  useApproval,
21
27
  useAttachment,
22
28
  useChatContext,
@@ -24,10 +30,14 @@ export {
24
30
  useCompletionInput,
25
31
  useComposer,
26
32
  useHumanInput,
33
+ useImage,
27
34
  useMessage,
28
35
  useMessagePart,
29
36
  useQuestion,
30
37
  useQuestionPrompt,
31
- useThread
38
+ useSelectionToolbar,
39
+ useThread,
40
+ useThreadList,
41
+ useThreadListItem
32
42
  };
33
43
  //# sourceMappingURL=shared.js.map
package/dist/styles.css CHANGED
@@ -17,6 +17,7 @@
17
17
  }
18
18
 
19
19
  [data-anvia-composer-input],
20
+ [data-anvia-composer-textarea-input],
20
21
  [data-anvia-completion-input],
21
22
  [data-anvia-approval-reason],
22
23
  [data-anvia-question-text-answer] {
@@ -24,6 +25,25 @@
24
25
  }
25
26
 
26
27
  [data-anvia-composer-input] {
28
+ min-width: 0;
29
+ overflow-y: auto;
30
+ }
31
+
32
+ [data-anvia-composer-editor] {
33
+ outline: none;
34
+ white-space: pre-wrap;
35
+ }
36
+
37
+ [data-anvia-composer-editor]:focus-visible {
38
+ outline: 2px solid currentColor;
39
+ outline-offset: 2px;
40
+ }
41
+
42
+ [data-anvia-composer-input][data-auto-resize] {
43
+ max-height: calc(var(--anvia-composer-max-rows, 6) * 1.5em + 1rem);
44
+ }
45
+
46
+ [data-anvia-composer-textarea-input] {
27
47
  min-width: 0;
28
48
  overflow-y: hidden;
29
49
  resize: none;
@@ -42,6 +62,28 @@
42
62
  object-fit: contain;
43
63
  }
44
64
 
65
+ [data-anvia-image-preview] img,
66
+ [data-anvia-image-zoom-img] {
67
+ display: block;
68
+ max-width: 100%;
69
+ max-height: 100%;
70
+ object-fit: contain;
71
+ }
72
+
73
+ [data-anvia-image-zoom-overlay] {
74
+ position: fixed;
75
+ inset: 0;
76
+ z-index: 50;
77
+ display: grid;
78
+ place-items: center;
79
+ padding: 2rem;
80
+ background: rgb(0 0 0 / 72%);
81
+ }
82
+
83
+ [data-anvia-selection-toolbar] {
84
+ z-index: 60;
85
+ }
86
+
45
87
  [data-state="disabled"] {
46
88
  opacity: 0.55;
47
89
  }
@@ -0,0 +1,102 @@
1
+ import { CreateUIAttachment, UIAttachment } from '@anvia/react';
2
+ import { ReactNode, MutableRefObject } from 'react';
3
+ import { C as ChatController } from './chat-B3kucz1w.js';
4
+
5
+ type ComposerEntityData = string | number | boolean | null | ComposerEntityData[] | {
6
+ [key: string]: ComposerEntityData | undefined;
7
+ };
8
+ type ComposerAttachmentInput = File | CreateUIAttachment;
9
+ type ComposerAttachmentsUpdate = UIAttachment[] | ((attachments: UIAttachment[]) => UIAttachment[]);
10
+ type ComposerEntitiesUpdate = ComposerEntity[] | ((entities: ComposerEntity[]) => ComposerEntity[]);
11
+ type ComposerQuote = {
12
+ text: string;
13
+ messageId: string;
14
+ };
15
+ type ComposerTriggerItem = {
16
+ id: string;
17
+ label: string;
18
+ text?: string | undefined;
19
+ detail?: ReactNode | undefined;
20
+ data?: ComposerEntityData | undefined;
21
+ disabled?: boolean | undefined;
22
+ };
23
+ type ComposerTriggerItemsArgs = {
24
+ trigger: ComposerTriggerDefinition;
25
+ query: string;
26
+ input: string;
27
+ entities: ComposerEntity[];
28
+ signal: AbortSignal;
29
+ };
30
+ type ComposerTriggerItems = ComposerTriggerItem[] | ((args: ComposerTriggerItemsArgs) => ComposerTriggerItem[] | Promise<ComposerTriggerItem[]>);
31
+ type ComposerTriggerDefinition = {
32
+ id: string;
33
+ char: string;
34
+ items: ComposerTriggerItems;
35
+ minQueryLength?: number | undefined;
36
+ allowedPrefixes?: string[] | null | undefined;
37
+ startOfLine?: boolean | undefined;
38
+ allowSpaces?: boolean | undefined;
39
+ };
40
+ type ComposerEntity = {
41
+ id: string;
42
+ triggerId: string;
43
+ trigger: string;
44
+ label: string;
45
+ text: string;
46
+ range: {
47
+ from: number;
48
+ to: number;
49
+ };
50
+ data?: ComposerEntityData | undefined;
51
+ };
52
+ type ComposerTriggerState = {
53
+ trigger: ComposerTriggerDefinition;
54
+ query: string;
55
+ items: ComposerTriggerItem[];
56
+ loading: boolean;
57
+ selectedIndex: number;
58
+ rect?: {
59
+ top: number;
60
+ right: number;
61
+ bottom: number;
62
+ left: number;
63
+ width: number;
64
+ height: number;
65
+ };
66
+ selectItem(item: ComposerTriggerItem): void;
67
+ setSelectedIndex(index: number): void;
68
+ };
69
+ type ComposerTriggerStateUpdate = ComposerTriggerState | undefined | ((state: ComposerTriggerState | undefined) => ComposerTriggerState | undefined);
70
+ type ComposerContextValue = {
71
+ input: string;
72
+ setInput(input: string): void;
73
+ attachments: UIAttachment[];
74
+ setAttachments(update: ComposerAttachmentsUpdate): void;
75
+ addAttachment(attachment: ComposerAttachmentInput): Promise<void>;
76
+ removeAttachment(id: string): void;
77
+ clearAttachments(): void;
78
+ entities: ComposerEntity[];
79
+ setEntities(update: ComposerEntitiesUpdate): void;
80
+ quote?: ComposerQuote | undefined;
81
+ setQuote(quote: ComposerQuote | undefined): void;
82
+ clearQuote(): void;
83
+ triggers: ComposerTriggerDefinition[];
84
+ activeTrigger?: ComposerTriggerState | undefined;
85
+ setActiveTrigger(update: ComposerTriggerStateUpdate): void;
86
+ submit(): Promise<void>;
87
+ stop(): void;
88
+ status: ChatController["status"];
89
+ canSubmit: boolean;
90
+ canStop: boolean;
91
+ };
92
+ declare function useComposer(): ComposerContextValue;
93
+
94
+ type ThreadContextValue = {
95
+ viewportRef: MutableRefObject<HTMLElement | null>;
96
+ atBottom: boolean;
97
+ setAtBottom(atBottom: boolean): void;
98
+ scrollToBottom(behavior?: ScrollBehavior): void;
99
+ };
100
+ declare function useThread(): ThreadContextValue;
101
+
102
+ export { type ComposerAttachmentInput as C, type ThreadContextValue as T, type ComposerAttachmentsUpdate as a, type ComposerContextValue as b, type ComposerEntitiesUpdate as c, type ComposerEntity as d, type ComposerEntityData as e, type ComposerQuote as f, type ComposerTriggerDefinition as g, type ComposerTriggerItem as h, type ComposerTriggerItems as i, type ComposerTriggerItemsArgs as j, type ComposerTriggerState as k, type ComposerTriggerStateUpdate as l, useThread as m, useComposer as u };
@@ -0,0 +1,47 @@
1
+ import * as react from 'react';
2
+ import { d as ThreadListRecord } from '../thread-list-On8db4XL.js';
3
+ export { T as ThreadListController, a as ThreadListItemContextValue, b as ThreadListProvider, c as ThreadListProviderProps, u as useThreadList, e as useThreadListItem } from '../thread-list-On8db4XL.js';
4
+ import { P as PrimitiveProps } from '../render-CRKWam2v.js';
5
+
6
+ declare const ThreadList: {
7
+ readonly Root: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, "asChild"> & {
8
+ asChild?: boolean;
9
+ } & react.RefAttributes<HTMLDivElement>>;
10
+ readonly New: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref">, "asChild"> & {
11
+ asChild?: boolean;
12
+ } & react.RefAttributes<HTMLButtonElement>>;
13
+ readonly Items: react.ForwardRefExoticComponent<Omit<PrimitiveProps<"div">, "children"> & {
14
+ archived?: boolean;
15
+ children?: react.ReactNode | ((thread: ThreadListRecord) => react.ReactNode);
16
+ keepMounted?: boolean;
17
+ } & react.RefAttributes<HTMLDivElement>>;
18
+ readonly Empty: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, "asChild"> & {
19
+ asChild?: boolean;
20
+ } & {
21
+ archived?: boolean;
22
+ } & react.RefAttributes<HTMLDivElement>>;
23
+ };
24
+ declare const ThreadListItem: {
25
+ readonly Root: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, "asChild"> & {
26
+ asChild?: boolean;
27
+ } & react.RefAttributes<HTMLDivElement>>;
28
+ readonly Trigger: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref">, "asChild"> & {
29
+ asChild?: boolean;
30
+ } & react.RefAttributes<HTMLButtonElement>>;
31
+ readonly Title: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, "ref">, "asChild"> & {
32
+ asChild?: boolean;
33
+ } & {
34
+ fallback?: react.ReactNode;
35
+ } & react.RefAttributes<HTMLSpanElement>>;
36
+ readonly Archive: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref">, "asChild"> & {
37
+ asChild?: boolean;
38
+ } & react.RefAttributes<HTMLButtonElement>>;
39
+ readonly Unarchive: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref">, "asChild"> & {
40
+ asChild?: boolean;
41
+ } & react.RefAttributes<HTMLButtonElement>>;
42
+ readonly Delete: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref">, "asChild"> & {
43
+ asChild?: boolean;
44
+ } & react.RefAttributes<HTMLButtonElement>>;
45
+ };
46
+
47
+ export { ThreadList, ThreadListItem, ThreadListRecord };