@factorialco/f0-react 4.14.0 → 4.15.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.
- package/dist/{F0AiProcessingOverlay-BbAadqE5.js → F0AiProcessingOverlay-B63Lnn9t.js} +2462 -2596
- package/dist/{F0CanvasPanel-CsVpTFqp.js → F0CanvasPanel-kwJ0WQmR.js} +16200 -15909
- package/dist/ai.d.ts +199 -4
- package/dist/ai.js +34 -30
- package/dist/experimental.d.ts +614 -18
- package/dist/experimental.js +6854 -3761
- package/dist/f0.d.ts +216 -5
- package/dist/f0.js +5206 -5193
- package/dist/i18n-provider-defaults.d.ts +80 -0
- package/dist/i18n-provider-defaults.js +94 -2
- package/dist/styles.css +1 -1
- package/dist/{useDataCollectionSource-C257Ssnk.js → useDataCollectionSource-BGrPZA46.js} +5294 -5278
- package/package.json +1 -1
package/dist/experimental.d.ts
CHANGED
|
@@ -512,6 +512,12 @@ declare type AiChatFileAttachmentConfig = {
|
|
|
512
512
|
*/
|
|
513
513
|
declare type AiChatProviderProps = {
|
|
514
514
|
enabled?: boolean;
|
|
515
|
+
/**
|
|
516
|
+
* Edge the whole side panel docks to (AI chat, hosted content and canvas).
|
|
517
|
+
* Hosts set "left" for a chat-first experience (e.g. communications).
|
|
518
|
+
* @default "right"
|
|
519
|
+
*/
|
|
520
|
+
side?: "left" | "right";
|
|
515
521
|
/**
|
|
516
522
|
* Greeting phrase(s) shown by the welcome screen when the chat is empty.
|
|
517
523
|
* A single string renders once; an array rotates through phrases. Purely
|
|
@@ -3028,7 +3034,7 @@ declare type DateValue = {
|
|
|
3028
3034
|
*/
|
|
3029
3035
|
export declare const DaytimePage: WithDataTestIdReturnType_5<typeof _DaytimePage>;
|
|
3030
3036
|
|
|
3031
|
-
declare function _DaytimePage({ children, header, period, embedded, }: DaytimePageProps): JSX_2.Element;
|
|
3037
|
+
declare function _DaytimePage({ children, header, period, embedded, hideOneSwitch, }: DaytimePageProps): JSX_2.Element;
|
|
3032
3038
|
|
|
3033
3039
|
declare namespace _DaytimePage {
|
|
3034
3040
|
var displayName: string;
|
|
@@ -3046,6 +3052,11 @@ export declare interface DaytimePageProps extends VariantProps<typeof daytimePag
|
|
|
3046
3052
|
onPulseClick?: ComponentProps<typeof F0AvatarPulse>["onPulseClick"];
|
|
3047
3053
|
};
|
|
3048
3054
|
embedded?: boolean;
|
|
3055
|
+
/**
|
|
3056
|
+
* Hides the One AI toggle in the header. Use when One is reached elsewhere
|
|
3057
|
+
* (e.g. a sidebar tab) so the home header doesn't show a redundant switch.
|
|
3058
|
+
*/
|
|
3059
|
+
hideOneSwitch?: boolean;
|
|
3049
3060
|
}
|
|
3050
3061
|
|
|
3051
3062
|
declare const daytimePageVariants: (props?: ({
|
|
@@ -3627,6 +3638,86 @@ declare const defaultTranslations: {
|
|
|
3627
3638
|
};
|
|
3628
3639
|
};
|
|
3629
3640
|
};
|
|
3641
|
+
readonly chat: {
|
|
3642
|
+
readonly placeholder: "Write something here..";
|
|
3643
|
+
readonly searchPlaceholder: "Search messages";
|
|
3644
|
+
readonly closeSearch: "Close search";
|
|
3645
|
+
readonly noResults: "No chats found";
|
|
3646
|
+
readonly backToLatest: "Jump to latest";
|
|
3647
|
+
readonly muted: "Muted";
|
|
3648
|
+
readonly attachFile: "Attach file";
|
|
3649
|
+
readonly addEmoji: "Add emoji";
|
|
3650
|
+
readonly recordAudio: "Record audio";
|
|
3651
|
+
readonly listening: "Listening…";
|
|
3652
|
+
readonly stopRecording: "Stop and transcribe";
|
|
3653
|
+
readonly cancelRecording: "Cancel recording";
|
|
3654
|
+
readonly dropFilesHere: "Drop your files here";
|
|
3655
|
+
readonly removeFile: "Remove";
|
|
3656
|
+
readonly tooManyFilesError: "You can attach up to {{maxFiles}} files at once";
|
|
3657
|
+
readonly fileUploadError: "Upload failed";
|
|
3658
|
+
readonly micPermissionDenied: "Microphone access is blocked. Allow it in your browser settings to dictate.";
|
|
3659
|
+
readonly micError: "Couldn't access the microphone.";
|
|
3660
|
+
readonly transcriptionError: "Couldn't transcribe the audio. Try again.";
|
|
3661
|
+
readonly sent: "Sent";
|
|
3662
|
+
readonly read: "Read";
|
|
3663
|
+
readonly readBy: {
|
|
3664
|
+
readonly one: "Read by {{count}}";
|
|
3665
|
+
readonly other: "Read by {{count}}";
|
|
3666
|
+
};
|
|
3667
|
+
readonly delivered: "Delivered";
|
|
3668
|
+
readonly back: "Back";
|
|
3669
|
+
readonly writing: "Writing…";
|
|
3670
|
+
readonly isTyping: "{{name}} is writing…";
|
|
3671
|
+
readonly twoTyping: "{{first}} and {{second}} are writing…";
|
|
3672
|
+
readonly severalTyping: "Several people are writing…";
|
|
3673
|
+
readonly deletedMessage: "Message deleted";
|
|
3674
|
+
readonly moreActions: "Message actions";
|
|
3675
|
+
readonly options: "Options";
|
|
3676
|
+
readonly pin: "Pin";
|
|
3677
|
+
readonly unpin: "Unpin";
|
|
3678
|
+
readonly info: "Info";
|
|
3679
|
+
readonly viewProfile: "View profile";
|
|
3680
|
+
readonly mentionEveryone: "here";
|
|
3681
|
+
readonly mentionEveryoneDescription: "Notify everyone in this group";
|
|
3682
|
+
readonly reply: "Reply";
|
|
3683
|
+
readonly react: "Add reaction";
|
|
3684
|
+
readonly download: "Download";
|
|
3685
|
+
readonly removeQuote: "Remove quote";
|
|
3686
|
+
readonly edit: "Edit";
|
|
3687
|
+
readonly editing: "Editing";
|
|
3688
|
+
readonly edited: "edited";
|
|
3689
|
+
readonly cancelEdit: "Cancel edit";
|
|
3690
|
+
readonly saveEdit: "Save";
|
|
3691
|
+
readonly you: "You";
|
|
3692
|
+
readonly openImage: "Open image";
|
|
3693
|
+
readonly imagePreview: "Image preview";
|
|
3694
|
+
readonly closePreview: "Close";
|
|
3695
|
+
readonly previousImage: "Previous image";
|
|
3696
|
+
readonly nextImage: "Next image";
|
|
3697
|
+
readonly photo: "Photo";
|
|
3698
|
+
readonly photoCount: {
|
|
3699
|
+
readonly one: "{{count}} photo";
|
|
3700
|
+
readonly other: "{{count}} photos";
|
|
3701
|
+
};
|
|
3702
|
+
readonly fileCount: {
|
|
3703
|
+
readonly one: "{{count}} file";
|
|
3704
|
+
readonly other: "{{count}} files";
|
|
3705
|
+
};
|
|
3706
|
+
readonly attachmentCount: {
|
|
3707
|
+
readonly one: "{{count}} attachment";
|
|
3708
|
+
readonly other: "{{count}} attachments";
|
|
3709
|
+
};
|
|
3710
|
+
readonly scrollToBottom: "Scroll to bottom";
|
|
3711
|
+
readonly newMessages: "New messages";
|
|
3712
|
+
readonly unreadCount: {
|
|
3713
|
+
readonly one: "{{count}} unread";
|
|
3714
|
+
readonly other: "{{count}} unread";
|
|
3715
|
+
};
|
|
3716
|
+
readonly emptyConversation: "No messages yet";
|
|
3717
|
+
readonly emptyConversationDescription: "Send a message to start the conversation.";
|
|
3718
|
+
readonly error: "Couldn't load this conversation";
|
|
3719
|
+
readonly loadingOlder: "Loading earlier messages…";
|
|
3720
|
+
};
|
|
3630
3721
|
readonly dataChart: {
|
|
3631
3722
|
readonly heatmapNotSupported: "Heatmap not supported at this size";
|
|
3632
3723
|
readonly barChartVertical: "Bar (vertical)";
|
|
@@ -4700,9 +4791,11 @@ export declare type F0CalloutProps = CalloutInternalProps;
|
|
|
4700
4791
|
/**
|
|
4701
4792
|
* @experimental This is an experimental component, use it at your own risk.
|
|
4702
4793
|
*/
|
|
4703
|
-
|
|
4794
|
+
declare const F0CardHorizontal: WithDataTestIdReturnType_2<ForwardRefExoticComponent<F0CardHorizontalProps & RefAttributes<HTMLDivElement>> & {
|
|
4704
4795
|
Skeleton: () => JSX_2.Element;
|
|
4705
4796
|
}>;
|
|
4797
|
+
export { F0CardHorizontal }
|
|
4798
|
+
export { F0CardHorizontal as F0CardRow }
|
|
4706
4799
|
|
|
4707
4800
|
export declare interface F0CardHorizontalProps {
|
|
4708
4801
|
/**
|
|
@@ -4792,6 +4885,310 @@ export declare interface F0CardHorizontalProps {
|
|
|
4792
4885
|
disableOverlayLink?: boolean;
|
|
4793
4886
|
}
|
|
4794
4887
|
|
|
4888
|
+
/**
|
|
4889
|
+
* Headless chat surface — header, transcript and composer — driven entirely by
|
|
4890
|
+
* the {@link F0ChatRuntime} from a surrounding `F0ChatProvider`. Panel controls
|
|
4891
|
+
* (fullscreen / close) are wired by the host so F0Chat stays transport-agnostic.
|
|
4892
|
+
*/
|
|
4893
|
+
export declare const F0Chat: (props: F0ChatProps) => ReactNode;
|
|
4894
|
+
|
|
4895
|
+
export declare type F0ChatAttachment = F0ChatImageAttachment | F0ChatFileAttachment;
|
|
4896
|
+
|
|
4897
|
+
/** The conversation currently shown in the panel (header + behaviour differs by type). */
|
|
4898
|
+
export declare type F0ChatChannel = {
|
|
4899
|
+
id: string;
|
|
4900
|
+
type: F0ChatChannelType;
|
|
4901
|
+
title: string;
|
|
4902
|
+
avatar: AvatarVariant;
|
|
4903
|
+
/** DM only — the other person's presence. */
|
|
4904
|
+
presence?: "online" | "offline";
|
|
4905
|
+
muted?: boolean;
|
|
4906
|
+
/**
|
|
4907
|
+
* Whether the conversation is pinned (favourited) by the current user. Drives
|
|
4908
|
+
* the header pin toggle and lets the host surface a "Pinned" group in the
|
|
4909
|
+
* sidebar. factorial → Stream's per-member pin (`member.pinned_at`).
|
|
4910
|
+
*/
|
|
4911
|
+
pinned?: boolean;
|
|
4912
|
+
/**
|
|
4913
|
+
* Extra status badges shown in the header (e.g. on vacation). Host-provided
|
|
4914
|
+
* metadata — not necessarily transport-backed: Stream has no such concept, so
|
|
4915
|
+
* factorial sources these from its own data (e.g. HR vacation status).
|
|
4916
|
+
*/
|
|
4917
|
+
statuses?: F0ChatChannelStatus[];
|
|
4918
|
+
/** Group only. */
|
|
4919
|
+
memberCount?: number;
|
|
4920
|
+
/** DM only — the counterpart, used for the header identity hover card. */
|
|
4921
|
+
user?: F0ChatUser;
|
|
4922
|
+
};
|
|
4923
|
+
|
|
4924
|
+
/** A status badge shown in the header next to the title (e.g. on vacation, away).
|
|
4925
|
+
* The host decides the icon + label; the UI just renders it like the mute icon. */
|
|
4926
|
+
export declare type F0ChatChannelStatus = {
|
|
4927
|
+
icon: IconType;
|
|
4928
|
+
label: string;
|
|
4929
|
+
};
|
|
4930
|
+
|
|
4931
|
+
export declare type F0ChatChannelType = "dm" | "group";
|
|
4932
|
+
|
|
4933
|
+
/**
|
|
4934
|
+
* Edits applied to an existing message. Text, mentions and attachments are all
|
|
4935
|
+
* editable; the host maps this to the transport's partial-update (factorial →
|
|
4936
|
+
* Stream `partialUpdateMessage`).
|
|
4937
|
+
*/
|
|
4938
|
+
export declare type F0ChatEditInput = {
|
|
4939
|
+
body: string;
|
|
4940
|
+
attachments?: F0ChatAttachment[];
|
|
4941
|
+
/** People mentioned in the edited body (groups only). */
|
|
4942
|
+
mentions?: F0ChatMention[];
|
|
4943
|
+
/** Whether the edited message mentions the whole group (`@here`). */
|
|
4944
|
+
mentionedEveryone?: boolean;
|
|
4945
|
+
};
|
|
4946
|
+
|
|
4947
|
+
export declare type F0ChatFileAttachment = {
|
|
4948
|
+
kind: "file";
|
|
4949
|
+
url: string;
|
|
4950
|
+
name: string;
|
|
4951
|
+
size?: number;
|
|
4952
|
+
mimeType?: string;
|
|
4953
|
+
/** 0–100 while uploading; undefined once done. */
|
|
4954
|
+
progress?: number;
|
|
4955
|
+
};
|
|
4956
|
+
|
|
4957
|
+
export declare type F0ChatImageAttachment = {
|
|
4958
|
+
kind: "image";
|
|
4959
|
+
url: string;
|
|
4960
|
+
thumbnailUrl?: string;
|
|
4961
|
+
name: string;
|
|
4962
|
+
mimeType?: string;
|
|
4963
|
+
width?: number;
|
|
4964
|
+
height?: number;
|
|
4965
|
+
};
|
|
4966
|
+
|
|
4967
|
+
/**
|
|
4968
|
+
* A person mentioned in a message. `id` matches an {@link F0ChatUser.id}; `name`
|
|
4969
|
+
* is the display name as it appears in the body (e.g. "Ana García"), used to
|
|
4970
|
+
* locate and highlight the `@name` token. "Everyone" (`@here`) is tracked
|
|
4971
|
+
* separately via `mentionedEveryone`, not as an entry here.
|
|
4972
|
+
*/
|
|
4973
|
+
export declare type F0ChatMention = {
|
|
4974
|
+
id: string;
|
|
4975
|
+
name: string;
|
|
4976
|
+
/** Optional display data so the `@name` chip can show the same profile hover
|
|
4977
|
+
* card as the avatar (avatar, role line, "View profile" link). Omit for a
|
|
4978
|
+
* name-only card. */
|
|
4979
|
+
avatar?: AvatarVariant;
|
|
4980
|
+
subtitle?: string;
|
|
4981
|
+
profileHref?: string;
|
|
4982
|
+
};
|
|
4983
|
+
|
|
4984
|
+
export declare type F0ChatMessage = {
|
|
4985
|
+
id: string;
|
|
4986
|
+
author: F0ChatUser;
|
|
4987
|
+
body: string;
|
|
4988
|
+
/** ISO timestamp. */
|
|
4989
|
+
createdAt: string;
|
|
4990
|
+
isMine: boolean;
|
|
4991
|
+
status?: F0ChatMessageStatus;
|
|
4992
|
+
/**
|
|
4993
|
+
* When the message was read (DM read receipt), ISO. Approximated from the
|
|
4994
|
+
* counterpart's per-channel last-read pointer — Stream has no per-message
|
|
4995
|
+
* read time — so it's "read at or before this", not an exact per-message stamp.
|
|
4996
|
+
*/
|
|
4997
|
+
readAt?: string;
|
|
4998
|
+
reactions?: F0ChatReaction[];
|
|
4999
|
+
attachments?: F0ChatAttachment[];
|
|
5000
|
+
replyTo?: F0ChatMessageReply;
|
|
5001
|
+
/**
|
|
5002
|
+
* People mentioned in this message (groups only). Drives the `@name` chip
|
|
5003
|
+
* highlighting in the bubble; a chip whose id is the current user gets the
|
|
5004
|
+
* self-mention emphasis.
|
|
5005
|
+
*/
|
|
5006
|
+
mentions?: F0ChatMention[];
|
|
5007
|
+
/**
|
|
5008
|
+
* Whether this message mentions the whole group (`@here`). Renders the
|
|
5009
|
+
* `@here` token with the self-mention emphasis for every member.
|
|
5010
|
+
*/
|
|
5011
|
+
mentionedEveryone?: boolean;
|
|
5012
|
+
/**
|
|
5013
|
+
* Group read receipts — how many other members have read this message.
|
|
5014
|
+
* Approximated by counting members whose last-read pointer is at/after this
|
|
5015
|
+
* message (Stream exposes no per-message reader list).
|
|
5016
|
+
*/
|
|
5017
|
+
readByCount?: number;
|
|
5018
|
+
/**
|
|
5019
|
+
* Soft-deleted tombstone — render an italic "[Message deleted]" placeholder
|
|
5020
|
+
* instead of the body (Stream keeps these when a message is deleted after the
|
|
5021
|
+
* unsend window). Hard-deleted messages are removed from `messages` entirely.
|
|
5022
|
+
*/
|
|
5023
|
+
deleted?: boolean;
|
|
5024
|
+
/**
|
|
5025
|
+
* When the message text was last edited (ISO). Presence drives the muted
|
|
5026
|
+
* "edited" label after the body (WhatsApp-style). factorial → Stream's
|
|
5027
|
+
* `message_text_updated_at`, which is set only on a text edit (not on
|
|
5028
|
+
* reactions/read updates), so it never false-positives the label.
|
|
5029
|
+
*/
|
|
5030
|
+
editedAt?: string;
|
|
5031
|
+
};
|
|
5032
|
+
|
|
5033
|
+
export declare type F0ChatMessageReply = {
|
|
5034
|
+
id: string;
|
|
5035
|
+
author: F0ChatUser;
|
|
5036
|
+
body: string;
|
|
5037
|
+
/** Attachments of the quoted message (preview thumbnail / file name). */
|
|
5038
|
+
attachments?: F0ChatAttachment[];
|
|
5039
|
+
};
|
|
5040
|
+
|
|
5041
|
+
/** iMessage-style delivery state — only meaningful for messages I sent. */
|
|
5042
|
+
export declare type F0ChatMessageStatus = "sending" | "sent" | "read" | "failed";
|
|
5043
|
+
|
|
5044
|
+
export declare type F0ChatProps = {
|
|
5045
|
+
/** Whether the hosting panel is in fullscreen (controls the header toggle icon). */
|
|
5046
|
+
isFullscreen?: boolean;
|
|
5047
|
+
/** Toggle the hosting panel's fullscreen. Hidden when omitted. */
|
|
5048
|
+
onToggleFullscreen?: () => void;
|
|
5049
|
+
/** Close the hosting panel. Hidden when omitted. */
|
|
5050
|
+
onClose?: () => void;
|
|
5051
|
+
};
|
|
5052
|
+
|
|
5053
|
+
/**
|
|
5054
|
+
* Makes a chat {@link F0ChatRuntime} available to the F0Chat UI. The host owns
|
|
5055
|
+
* the runtime (mock in stories, GetStream adapter in factorial); F0 only reads it.
|
|
5056
|
+
*/
|
|
5057
|
+
export declare const F0ChatProvider: ({ runtime, children, }: {
|
|
5058
|
+
runtime: F0ChatRuntime;
|
|
5059
|
+
children: ReactNode;
|
|
5060
|
+
}) => ReactNode;
|
|
5061
|
+
|
|
5062
|
+
export declare type F0ChatReaction = {
|
|
5063
|
+
emoji: string;
|
|
5064
|
+
count: number;
|
|
5065
|
+
reactedByMe: boolean;
|
|
5066
|
+
users?: F0ChatUser[];
|
|
5067
|
+
};
|
|
5068
|
+
|
|
5069
|
+
/**
|
|
5070
|
+
* The data + actions a host provides to drive the chat UI. F0 is headless: it
|
|
5071
|
+
* never touches the transport (GetStream, websockets, …). A mock runtime powers
|
|
5072
|
+
* Storybook; factorial implements this against GetStream after the bump.
|
|
5073
|
+
*/
|
|
5074
|
+
export declare type F0ChatRuntime = {
|
|
5075
|
+
currentUserId: string;
|
|
5076
|
+
channel: F0ChatChannel;
|
|
5077
|
+
status: F0ChatStatus;
|
|
5078
|
+
/** Oldest → newest. */
|
|
5079
|
+
messages: F0ChatMessage[];
|
|
5080
|
+
/** Users currently typing (excluding me). */
|
|
5081
|
+
typingUsers: F0ChatUser[];
|
|
5082
|
+
hasMoreOlder: boolean;
|
|
5083
|
+
loadingOlder: boolean;
|
|
5084
|
+
/**
|
|
5085
|
+
* Whether there are newer messages than the loaded window — true after jumping
|
|
5086
|
+
* to an old message (e.g. a search hit), so the transcript isn't anchored to
|
|
5087
|
+
* the live tail. Omit (→ false) when the newest messages are always loaded.
|
|
5088
|
+
* factorial → `channel.state.messagePagination.hasNext`.
|
|
5089
|
+
*/
|
|
5090
|
+
hasMoreNewer?: boolean;
|
|
5091
|
+
loadingNewer?: boolean;
|
|
5092
|
+
/** Load the next page of newer messages (mirror of `loadOlder`). */
|
|
5093
|
+
loadNewer?: () => void;
|
|
5094
|
+
/** Count of incoming messages below the user's last-read position. */
|
|
5095
|
+
unreadCount: number;
|
|
5096
|
+
/** Id of the first unread message — where the "new messages" divider goes. */
|
|
5097
|
+
firstUnreadId: string | null;
|
|
5098
|
+
sendMessage: (input: F0ChatSendInput) => void;
|
|
5099
|
+
retryMessage: (id: string) => void;
|
|
5100
|
+
loadOlder: () => void;
|
|
5101
|
+
toggleReaction: (messageId: string, emoji: string) => void;
|
|
5102
|
+
deleteMessage: (id: string) => void;
|
|
5103
|
+
/**
|
|
5104
|
+
* Edit an existing message (text, mentions, attachments). Omit to disable
|
|
5105
|
+
* editing — the "Edit" action then never shows. factorial →
|
|
5106
|
+
* `client.partialUpdateMessage`.
|
|
5107
|
+
*/
|
|
5108
|
+
editMessage?: (id: string, input: F0ChatEditInput) => void;
|
|
5109
|
+
/**
|
|
5110
|
+
* How long after sending a message stays editable (ms). The "Edit" action is
|
|
5111
|
+
* hidden once a message is older than this. Omit for no limit (editable
|
|
5112
|
+
* anytime). factorial sets a fixed window (e.g. 15 min).
|
|
5113
|
+
*/
|
|
5114
|
+
editWindowMs?: number;
|
|
5115
|
+
/** Called as the user types so the runtime can emit typing.start/stop. */
|
|
5116
|
+
onInputActivity: () => void;
|
|
5117
|
+
uploadFiles?: (files: File[]) => Promise<F0ChatAttachment[]>;
|
|
5118
|
+
/**
|
|
5119
|
+
* Max files attachable at once. When a selection/drop would exceed it, the
|
|
5120
|
+
* composer rejects the whole batch and flashes a transient error in the
|
|
5121
|
+
* textarea (mirrors the AI chat). Omit for no limit.
|
|
5122
|
+
*/
|
|
5123
|
+
maxFiles?: number;
|
|
5124
|
+
/**
|
|
5125
|
+
* Optional voice dictation — same signature as the AI chat (streams partials).
|
|
5126
|
+
* Not part of the Stream transport; a host wires it to its own speech service
|
|
5127
|
+
* (the Stream adapter omits it, so the mic button stays hidden there).
|
|
5128
|
+
*/
|
|
5129
|
+
transcribe?: TranscribeFn;
|
|
5130
|
+
markRead?: () => void;
|
|
5131
|
+
/**
|
|
5132
|
+
* Search the conversation's members for the `@`-mention popover, returning
|
|
5133
|
+
* matches for `query` (empty string → the full member list). Provide it
|
|
5134
|
+
* wherever mentions should work — DMs (both people) and groups alike; omit it
|
|
5135
|
+
* to disable mentions for the conversation. The `@here` everyone option is a
|
|
5136
|
+
* group-only concept and is gated separately by the composer.
|
|
5137
|
+
* factorial → `channel.state.members`.
|
|
5138
|
+
*/
|
|
5139
|
+
searchMembers?: (query: string) => Promise<F0ChatUser[]>;
|
|
5140
|
+
/**
|
|
5141
|
+
* Toggle the conversation's pinned (favourite) state for the current user.
|
|
5142
|
+
* Drives the header "Pin / Unpin" action; omit to hide it. factorial →
|
|
5143
|
+
* `channel.pin()` / `channel.unpin()`.
|
|
5144
|
+
*/
|
|
5145
|
+
togglePin?: () => void;
|
|
5146
|
+
/**
|
|
5147
|
+
* Full-text search within this conversation, returning matches oldest→newest.
|
|
5148
|
+
* Omit to fall back to a client-side substring search over the loaded
|
|
5149
|
+
* `messages`. factorial → `channel.search`.
|
|
5150
|
+
*/
|
|
5151
|
+
searchMessages?: (query: string) => Promise<F0ChatSearchResult[]>;
|
|
5152
|
+
/**
|
|
5153
|
+
* Ensure a message is in `messages` so the UI can jump to it: pass a message
|
|
5154
|
+
* id (e.g. a search hit outside the loaded window) to load it + its context,
|
|
5155
|
+
* or {@link LATEST} to return to the live tail. After it resolves, `messages`
|
|
5156
|
+
* (and `hasMoreNewer`) reflect the new window. factorial →
|
|
5157
|
+
* `channel.state.loadMessageIntoState(id | "latest")`.
|
|
5158
|
+
*/
|
|
5159
|
+
loadMessageContext?: (idOrLatest: string) => Promise<void>;
|
|
5160
|
+
};
|
|
5161
|
+
|
|
5162
|
+
/** A message that matched an in-conversation search (room to grow: preview, author…). */
|
|
5163
|
+
export declare type F0ChatSearchResult = {
|
|
5164
|
+
id: string;
|
|
5165
|
+
};
|
|
5166
|
+
|
|
5167
|
+
export declare type F0ChatSendInput = {
|
|
5168
|
+
body: string;
|
|
5169
|
+
attachments?: F0ChatAttachment[];
|
|
5170
|
+
replyToId?: string;
|
|
5171
|
+
/** People mentioned in the body (groups only). The host maps these to the
|
|
5172
|
+
* transport's mention field (factorial → Stream `mentioned_users`). */
|
|
5173
|
+
mentions?: F0ChatMention[];
|
|
5174
|
+
/** Whether the message mentions the whole group (`@here`). The host fans this
|
|
5175
|
+
* out to every member so they all get notified. */
|
|
5176
|
+
mentionedEveryone?: boolean;
|
|
5177
|
+
};
|
|
5178
|
+
|
|
5179
|
+
export declare type F0ChatStatus = "connecting" | "ready" | "error";
|
|
5180
|
+
|
|
5181
|
+
/** A participant in a conversation. */
|
|
5182
|
+
export declare type F0ChatUser = {
|
|
5183
|
+
id: string;
|
|
5184
|
+
name: string;
|
|
5185
|
+
avatar?: AvatarVariant;
|
|
5186
|
+
/** Secondary line for the hover card (e.g. job title). */
|
|
5187
|
+
subtitle?: string;
|
|
5188
|
+
/** Link to the person's profile, shown as "View profile" in the hover card. */
|
|
5189
|
+
profileHref?: string;
|
|
5190
|
+
};
|
|
5191
|
+
|
|
4795
5192
|
export declare type F0FileAction = {
|
|
4796
5193
|
icon?: IconType;
|
|
4797
5194
|
label: string;
|
|
@@ -5862,6 +6259,11 @@ declare type HeaderProps_2 = {
|
|
|
5862
6259
|
whenEnabled?: string;
|
|
5863
6260
|
};
|
|
5864
6261
|
oneSwitchAutoOpen?: boolean;
|
|
6262
|
+
/**
|
|
6263
|
+
* Hide the per-page One switch. Use when One is reachable from elsewhere
|
|
6264
|
+
* (e.g. a sidebar tab) so the page header doesn't duplicate the entry point.
|
|
6265
|
+
*/
|
|
6266
|
+
hideOneSwitch?: boolean;
|
|
5865
6267
|
};
|
|
5866
6268
|
|
|
5867
6269
|
export declare type HeaderSecondaryAction = HeaderSecondaryButtonAction | HeaderSecondaryDropdownAction;
|
|
@@ -6310,6 +6712,9 @@ export declare type lastIntentType = {
|
|
|
6310
6712
|
customIntent?: string;
|
|
6311
6713
|
} | null;
|
|
6312
6714
|
|
|
6715
|
+
/** Sentinel for {@link F0ChatRuntime.loadMessageContext} meaning "the live tail". */
|
|
6716
|
+
export declare const LATEST: "latest";
|
|
6717
|
+
|
|
6313
6718
|
declare type Level = (typeof levels)[number];
|
|
6314
6719
|
|
|
6315
6720
|
declare const levels: readonly ["info", "warning", "critical", "positive"];
|
|
@@ -7381,7 +7786,7 @@ export declare type PageBasedPaginatedResponse<TRecord> = BasePaginatedResponse<
|
|
|
7381
7786
|
pagesCount: number;
|
|
7382
7787
|
};
|
|
7383
7788
|
|
|
7384
|
-
export declare function PageHeader({ module, statusTag, breadcrumbs, actions, embedded, navigation, productUpdates, favorites, oneSwitchTooltip, oneSwitchAutoOpen, }: HeaderProps_2): JSX_2.Element;
|
|
7789
|
+
export declare function PageHeader({ module, statusTag, breadcrumbs, actions, embedded, navigation, productUpdates, favorites, oneSwitchTooltip, oneSwitchAutoOpen, hideOneSwitch, }: HeaderProps_2): JSX_2.Element;
|
|
7385
7790
|
|
|
7386
7791
|
export declare type PageHeaderItemNavigationInput<R extends RecordType> = Pick<UseDataSourceItemNavigationReturn<R>, "previousItem" | "nextItem" | "previousItemUrl" | "nextItemUrl" | "absoluteIndex" | "totalItems" | "activeIndex" | "hasPrevious" | "hasNext" | "goToPrevious" | "goToNext">;
|
|
7387
7792
|
|
|
@@ -7865,6 +8270,7 @@ declare interface ReactionProps {
|
|
|
7865
8270
|
hasReacted?: boolean;
|
|
7866
8271
|
users?: User_2[];
|
|
7867
8272
|
onInteraction?: (emoji: string) => void;
|
|
8273
|
+
size?: "sm" | "md" | "lg";
|
|
7868
8274
|
}
|
|
7869
8275
|
|
|
7870
8276
|
/**
|
|
@@ -8224,16 +8630,48 @@ declare function _Sidebar({ header, body, footer, onFooterDropdownClick, }: Side
|
|
|
8224
8630
|
export declare type SidebarChat = {
|
|
8225
8631
|
id: string;
|
|
8226
8632
|
label: string;
|
|
8227
|
-
/**
|
|
8228
|
-
|
|
8633
|
+
/**
|
|
8634
|
+
* Person / team / company avatar (F0Avatar variant). Optional: omit it for
|
|
8635
|
+
* avatar-less rows (e.g. an AI chat history that shows titles only).
|
|
8636
|
+
*/
|
|
8637
|
+
avatar?: AvatarVariant;
|
|
8638
|
+
/**
|
|
8639
|
+
* When true, the row renders as a skeleton (avatar + name placeholders) but
|
|
8640
|
+
* keeps its position. Use it for the "cascade" case: the conversation is
|
|
8641
|
+
* known (id, group, order) but its name/avatar haven't resolved yet. As each
|
|
8642
|
+
* chat resolves, flip this to false and pass the real `label`/`avatar`.
|
|
8643
|
+
*/
|
|
8644
|
+
loading?: boolean;
|
|
8229
8645
|
onClick?: () => void;
|
|
8230
8646
|
/** When > 0, the chat is rendered as unread (darker, bolder name). */
|
|
8231
8647
|
unreadCount?: number;
|
|
8648
|
+
/**
|
|
8649
|
+
* When > 0, the unread badge is prefixed with an `@` (groups only) — the
|
|
8650
|
+
* unread run includes a message that mentions you, Slack-style. Just a marker
|
|
8651
|
+
* on the existing badge, not a separate count; cleared on read.
|
|
8652
|
+
*/
|
|
8653
|
+
mentionCount?: number;
|
|
8654
|
+
/** When true, the name is replaced by a live "Writing…" label. */
|
|
8655
|
+
typing?: boolean;
|
|
8232
8656
|
presence?: SidebarChatPresence;
|
|
8233
8657
|
/** Status icon shown to the right of the name. People only. */
|
|
8234
8658
|
status?: SidebarChatStatus;
|
|
8235
8659
|
/** Epoch ms of the last activity; used for ordering. */
|
|
8236
8660
|
lastActivityAt?: number;
|
|
8661
|
+
/** Whether the chat is pinned (favourited) — selects the solid pin icon. */
|
|
8662
|
+
pinned?: boolean;
|
|
8663
|
+
/**
|
|
8664
|
+
* Toggle the pinned state. When set, a pin/unpin button appears on row hover
|
|
8665
|
+
* in place of the unread badge / status icon. Omit to hide the affordance.
|
|
8666
|
+
*/
|
|
8667
|
+
onTogglePin?: () => void;
|
|
8668
|
+
/**
|
|
8669
|
+
* A pin/unpin request for this chat is in flight (e.g. waiting on the
|
|
8670
|
+
* backend). Replaces the pin button with a spinner, kept visible off-hover,
|
|
8671
|
+
* so the row reads as "saving". The move between groups can still be applied
|
|
8672
|
+
* optimistically — this only reflects that persistence is pending.
|
|
8673
|
+
*/
|
|
8674
|
+
pinPending?: boolean;
|
|
8237
8675
|
};
|
|
8238
8676
|
|
|
8239
8677
|
/**
|
|
@@ -8248,6 +8686,45 @@ export declare type SidebarChatAction = {
|
|
|
8248
8686
|
|
|
8249
8687
|
export declare type SidebarChatActions = Omit<SidebarChatStore, "groups" | "activeChatId" | "unreadChatsCount">;
|
|
8250
8688
|
|
|
8689
|
+
export declare const SidebarChatBlankState: WithDataTestIdReturnType_3<typeof _SidebarChatBlankState>;
|
|
8690
|
+
|
|
8691
|
+
/**
|
|
8692
|
+
* Compact blank state for a sidebar conversation list. Shared by the people
|
|
8693
|
+
* chat (`SidebarChatList`) and the AI history list so the two read identically.
|
|
8694
|
+
* Deliberately lighter than `OneEmptyState` — no emoji/avatar and tight
|
|
8695
|
+
* paddings — because it lives in a narrow sidebar column. The host (factorial)
|
|
8696
|
+
* supplies the copy + actions.
|
|
8697
|
+
*/
|
|
8698
|
+
declare function _SidebarChatBlankState({ title, description, actions, ...rest }: SidebarChatBlankStateProps): ReactNode;
|
|
8699
|
+
|
|
8700
|
+
/** A CTA shown under the blank-state copy — e.g. "Start a conversation". */
|
|
8701
|
+
export declare type SidebarChatBlankStateAction = {
|
|
8702
|
+
label: string;
|
|
8703
|
+
onClick?: () => void;
|
|
8704
|
+
icon?: IconType;
|
|
8705
|
+
/** Button variant — supports the gradient "ai" variant. @default "outline" */
|
|
8706
|
+
variant?: ActionButtonVariant;
|
|
8707
|
+
};
|
|
8708
|
+
|
|
8709
|
+
export declare type SidebarChatBlankStateProps = {
|
|
8710
|
+
title: string;
|
|
8711
|
+
description?: string;
|
|
8712
|
+
/** Optional CTA(s) shown under the copy — e.g. "Start a conversation". */
|
|
8713
|
+
actions?: SidebarChatBlankStateAction[];
|
|
8714
|
+
};
|
|
8715
|
+
|
|
8716
|
+
/**
|
|
8717
|
+
* Copy shown when there are no chats at all. Override via the `emptyState` prop.
|
|
8718
|
+
* Rendered through the shared `OneEmptyState`, so the AI history list and this
|
|
8719
|
+
* one read identically — the host (factorial) just supplies the copy + actions.
|
|
8720
|
+
*/
|
|
8721
|
+
export declare type SidebarChatEmptyState = {
|
|
8722
|
+
title: string;
|
|
8723
|
+
description?: string;
|
|
8724
|
+
/** Optional CTA(s) shown under the copy — e.g. "Start a conversation". */
|
|
8725
|
+
actions?: SidebarChatBlankStateAction[];
|
|
8726
|
+
};
|
|
8727
|
+
|
|
8251
8728
|
export declare type SidebarChatGroup = {
|
|
8252
8729
|
id: string;
|
|
8253
8730
|
title: string;
|
|
@@ -8263,14 +8740,45 @@ export declare const SidebarChatItem: ({ chat, isActive, onClick, }: {
|
|
|
8263
8740
|
}) => JSX_2.Element;
|
|
8264
8741
|
|
|
8265
8742
|
/**
|
|
8266
|
-
*
|
|
8267
|
-
*
|
|
8268
|
-
*
|
|
8269
|
-
*
|
|
8743
|
+
* A single chat row rendered as a skeleton. Matches `SidebarChatItem`'s layout
|
|
8744
|
+
* and height (36px: a 24px avatar + the row's vertical padding) so the row
|
|
8745
|
+
* doesn't shift when the real data resolves. Used for the "cascade" case — a
|
|
8746
|
+
* known conversation whose name/avatar is still loading (`SidebarChat.loading`).
|
|
8270
8747
|
*/
|
|
8271
|
-
export declare const
|
|
8748
|
+
export declare const SidebarChatItemSkeleton: ({ className, }: {
|
|
8749
|
+
className?: string;
|
|
8750
|
+
}) => JSX_2.Element;
|
|
8751
|
+
|
|
8752
|
+
/**
|
|
8753
|
+
* Body of the "Messages" tab: chat groups read from `SidebarChatProvider`,
|
|
8754
|
+
* rendered through the shared `SidebarTabPanel` (search + actions + collapsible
|
|
8755
|
+
* groups). This stays a thin adapter — it maps the chat store onto the panel
|
|
8756
|
+
* and owns only chat-specific bits (unread badges, the blank state copy).
|
|
8757
|
+
*/
|
|
8758
|
+
export declare const SidebarChatList: ({ actions, emptyState, loading, }: {
|
|
8272
8759
|
/** Ghost actions rendered at the very top (e.g. New chat, New group). */
|
|
8273
8760
|
actions?: SidebarChatAction[];
|
|
8761
|
+
/** Copy for the blank state shown when there are no chats. */
|
|
8762
|
+
emptyState: SidebarChatEmptyState;
|
|
8763
|
+
/**
|
|
8764
|
+
* Whole-list loading: the conversations aren't known yet. Renders a generic
|
|
8765
|
+
* skeleton instead of the blank state. Once any chats are known, pass them
|
|
8766
|
+
* (with `loading` on the individual chats whose name is still resolving) and
|
|
8767
|
+
* set this back to false — the per-chat skeletons take over (cascade).
|
|
8768
|
+
*/
|
|
8769
|
+
loading?: boolean;
|
|
8770
|
+
}) => JSX_2.Element;
|
|
8771
|
+
|
|
8772
|
+
/**
|
|
8773
|
+
* Full-list skeleton shown while the conversations are still loading and the
|
|
8774
|
+
* groups aren't known yet. A few placeholder groups, each with a 32px title row
|
|
8775
|
+
* and some 36px chat rows.
|
|
8776
|
+
*/
|
|
8777
|
+
export declare const SidebarChatListSkeleton: ({ groups, rowsPerGroup, }: {
|
|
8778
|
+
/** Number of placeholder groups. @default 2 */
|
|
8779
|
+
groups?: number;
|
|
8780
|
+
/** Placeholder rows per group. @default 4 */
|
|
8781
|
+
rowsPerGroup?: number;
|
|
8274
8782
|
}) => JSX_2.Element;
|
|
8275
8783
|
|
|
8276
8784
|
export declare type SidebarChatPresence = "online" | "offline";
|
|
@@ -8330,7 +8838,7 @@ export declare type SidebarChatStore = {
|
|
|
8330
8838
|
* Collapsible titled section used across the Sidebar (navigation categories,
|
|
8331
8839
|
* chat groups). Title + rotating chevron + animated height.
|
|
8332
8840
|
*/
|
|
8333
|
-
export declare const SidebarCollapsibleSection: ({ title, isOpen: initialIsOpen, isRoot, onCollapse, children, highlightWhenCollapsed, isDragging, wasDragging, }: SidebarCollapsibleSectionProps) => JSX_2.Element;
|
|
8841
|
+
export declare const SidebarCollapsibleSection: ({ title, isOpen: initialIsOpen, isRoot, onCollapse, children, highlightWhenCollapsed, collapsedBadge, isDragging, wasDragging, }: SidebarCollapsibleSectionProps) => JSX_2.Element;
|
|
8334
8842
|
|
|
8335
8843
|
export declare interface SidebarCollapsibleSectionProps {
|
|
8336
8844
|
title: string;
|
|
@@ -8345,6 +8853,11 @@ export declare interface SidebarCollapsibleSectionProps {
|
|
|
8345
8853
|
* Slack-style hint that hidden items need attention (e.g. unread chats).
|
|
8346
8854
|
*/
|
|
8347
8855
|
highlightWhenCollapsed?: boolean;
|
|
8856
|
+
/**
|
|
8857
|
+
* Content shown at the end of the header only while collapsed (e.g. a total
|
|
8858
|
+
* unread badge) — surfaces what's hidden inside without expanding.
|
|
8859
|
+
*/
|
|
8860
|
+
collapsedBadge?: ReactNode;
|
|
8348
8861
|
/** Drag-aware guards used by the sortable Menu; safe to omit elsewhere. */
|
|
8349
8862
|
isDragging?: boolean;
|
|
8350
8863
|
wasDragging?: RefObject<boolean>;
|
|
@@ -8390,6 +8903,91 @@ export declare type SidebarTab = {
|
|
|
8390
8903
|
icon: IconType;
|
|
8391
8904
|
/** Unread counter shown next to the tab. */
|
|
8392
8905
|
badge?: number;
|
|
8906
|
+
/**
|
|
8907
|
+
* Visual variant. "ai" renders the tab as an AI-variant button — the animated
|
|
8908
|
+
* gradient shimmer on hover — e.g. the "One" tab. Defaults to the plain ghost
|
|
8909
|
+
* tab (transparent background; the icon darkens on hover).
|
|
8910
|
+
*/
|
|
8911
|
+
variant?: "default" | "ai";
|
|
8912
|
+
};
|
|
8913
|
+
|
|
8914
|
+
/**
|
|
8915
|
+
* Shared skeleton for a sidebar tab body: an optional search box pinned at the
|
|
8916
|
+
* top, optional actions, and collapsible groups of arbitrary item rows.
|
|
8917
|
+
*
|
|
8918
|
+
* The panel is agnostic about what a row is — it renders `item.content` — so it
|
|
8919
|
+
* backs the Messages (chats) and One (AI history) tabs from one place, keeping
|
|
8920
|
+
* paddings, search behaviour and the empty / no-results states consistent.
|
|
8921
|
+
*/
|
|
8922
|
+
export declare const SidebarTabPanel: ({ groups, actions, searchPlaceholder, loading, skeleton, emptyState, noResultsLabel, animateItems, className, }: SidebarTabPanelProps) => JSX_2.Element;
|
|
8923
|
+
|
|
8924
|
+
/**
|
|
8925
|
+
* A top-of-panel action (e.g. "New chat", "New group"). The panel renders one
|
|
8926
|
+
* ghost button per action, so they all share the same design. For an action
|
|
8927
|
+
* that needs custom chrome (e.g. a popover trigger), pass `render` to wrap the
|
|
8928
|
+
* default button while keeping its look.
|
|
8929
|
+
*/
|
|
8930
|
+
export declare type SidebarTabPanelAction = {
|
|
8931
|
+
label: string;
|
|
8932
|
+
icon?: IconType;
|
|
8933
|
+
onClick?: () => void;
|
|
8934
|
+
/**
|
|
8935
|
+
* Wrap the default ghost button (received as `button`) in custom chrome —
|
|
8936
|
+
* e.g. a popover/credits trigger. Return the wrapped node. The button keeps
|
|
8937
|
+
* the standard action design; only its surroundings change.
|
|
8938
|
+
*/
|
|
8939
|
+
render?: (button: ReactNode) => ReactNode;
|
|
8940
|
+
};
|
|
8941
|
+
|
|
8942
|
+
export declare type SidebarTabPanelGroup = {
|
|
8943
|
+
id: string;
|
|
8944
|
+
/** Omit to render the items without a collapsible header (root group). */
|
|
8945
|
+
title?: string;
|
|
8946
|
+
/** Initial open state of the collapsible group. @default true */
|
|
8947
|
+
isOpen?: boolean;
|
|
8948
|
+
/** Emphasise the title (darker, bolder) while collapsed. */
|
|
8949
|
+
highlightWhenCollapsed?: boolean;
|
|
8950
|
+
/** Content shown at the end of the header only while collapsed. */
|
|
8951
|
+
collapsedBadge?: ReactNode;
|
|
8952
|
+
items: SidebarTabPanelItem[];
|
|
8953
|
+
};
|
|
8954
|
+
|
|
8955
|
+
/**
|
|
8956
|
+
* A single row in a group. The panel is agnostic about what a row looks like:
|
|
8957
|
+
* it renders `content` opaquely. `searchText` is what the search box matches
|
|
8958
|
+
* against (omit it to keep the item out of search results while filtering).
|
|
8959
|
+
*/
|
|
8960
|
+
export declare type SidebarTabPanelItem = {
|
|
8961
|
+
id: string;
|
|
8962
|
+
searchText?: string;
|
|
8963
|
+
content: ReactNode;
|
|
8964
|
+
};
|
|
8965
|
+
|
|
8966
|
+
export declare type SidebarTabPanelProps = {
|
|
8967
|
+
groups: SidebarTabPanelGroup[];
|
|
8968
|
+
/** Top-of-panel actions, rendered as a stack of ghost buttons. */
|
|
8969
|
+
actions?: SidebarTabPanelAction[];
|
|
8970
|
+
/**
|
|
8971
|
+
* When set, renders a search box pinned at the very top of the panel that
|
|
8972
|
+
* fuzzy-filters items by their `searchText`. Omit for no search.
|
|
8973
|
+
*/
|
|
8974
|
+
searchPlaceholder?: string;
|
|
8975
|
+
/** Whole-panel loading: renders `skeleton` instead of the groups. */
|
|
8976
|
+
loading?: boolean;
|
|
8977
|
+
/** Shown while `loading` and there are no items yet. */
|
|
8978
|
+
skeleton?: ReactNode;
|
|
8979
|
+
/** Shown when there are no items at all (not while searching). */
|
|
8980
|
+
emptyState?: ReactNode;
|
|
8981
|
+
/** Shown when a search yields no matches. */
|
|
8982
|
+
noResultsLabel?: ReactNode;
|
|
8983
|
+
/**
|
|
8984
|
+
* Animate rows as they appear/disappear/move between groups — a pin/unpin
|
|
8985
|
+
* glides a row across, search reflows smoothly (reduced-motion aware).
|
|
8986
|
+
* On by default; pass `false` to render rows statically.
|
|
8987
|
+
*/
|
|
8988
|
+
animateItems?: boolean;
|
|
8989
|
+
/** Override the outer container className. */
|
|
8990
|
+
className?: string;
|
|
8393
8991
|
};
|
|
8394
8992
|
|
|
8395
8993
|
/**
|
|
@@ -8400,17 +8998,12 @@ export declare type SidebarTab = {
|
|
|
8400
8998
|
* When no tabs are needed, keep composing the Sidebar header with `SearchBar`
|
|
8401
8999
|
* instead — that path is unchanged.
|
|
8402
9000
|
*/
|
|
8403
|
-
export declare const SidebarTabs: ({ tabs, activeTab, onTabChange,
|
|
9001
|
+
export declare const SidebarTabs: ({ tabs, activeTab, onTabChange, }: SidebarTabsProps) => JSX_2.Element;
|
|
8404
9002
|
|
|
8405
9003
|
export declare type SidebarTabsProps = {
|
|
8406
9004
|
tabs: SidebarTab[];
|
|
8407
9005
|
activeTab: string;
|
|
8408
9006
|
onTabChange: (id: string) => void;
|
|
8409
|
-
search: {
|
|
8410
|
-
/** Accessible label / tooltip for the search icon button. */
|
|
8411
|
-
placeholder?: string;
|
|
8412
|
-
onClick?: () => void;
|
|
8413
|
-
};
|
|
8414
9007
|
};
|
|
8415
9008
|
|
|
8416
9009
|
/**
|
|
@@ -9078,7 +9671,7 @@ export declare interface TopLevelPrependNotesTextEditorPageDocumentPatch {
|
|
|
9078
9671
|
* intermediate results for live textarea fill. When omitted from the chat
|
|
9079
9672
|
* config, the microphone button is not rendered.
|
|
9080
9673
|
*/
|
|
9081
|
-
declare type TranscribeFn = (audio: Blob, options: TranscribeOptions) => Promise<string>;
|
|
9674
|
+
export declare type TranscribeFn = (audio: Blob, options: TranscribeOptions) => Promise<string>;
|
|
9082
9675
|
|
|
9083
9676
|
declare type TranscribeOptions = {
|
|
9084
9677
|
/**
|
|
@@ -9380,6 +9973,9 @@ declare interface UseExportActionProps<R extends RecordType, Filters extends Fil
|
|
|
9380
9973
|
enabled?: boolean;
|
|
9381
9974
|
}
|
|
9382
9975
|
|
|
9976
|
+
/** Read the chat runtime. Throws when used outside an {@link F0ChatProvider}. */
|
|
9977
|
+
export declare function useF0Chat(): F0ChatRuntime;
|
|
9978
|
+
|
|
9383
9979
|
export declare const useInfiniteScrollPagination: (paginationInfo: PaginationInfo | null, isLoading: boolean, isLoadingMore: boolean, loadMore: () => void) => {
|
|
9384
9980
|
loadingIndicatorRef: RefObject<HTMLTableCellElement>;
|
|
9385
9981
|
};
|