@eloquentai/chat-sdk 0.33.2 → 0.33.4-dev

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.
@@ -9,14 +9,29 @@ export interface UseChatProps {
9
9
  theme?: Partial<ThemeContextType>;
10
10
  chatProps?: Partial<ChatInterfaceProps>;
11
11
  isMobile?: boolean;
12
+ /** Show the close (X) button in the chat header. */
13
+ hasCloseButton?: boolean;
14
+ /** Show the clear-conversation button in the chat header. */
15
+ hasCleanChatButton?: boolean;
16
+ /** Open the chat window on load (desktop only). */
17
+ isInitiallyOpen?: boolean;
18
+ /** @deprecated Use `hasCloseButton` instead. Ignored when `hasCloseButton` is set. */
12
19
  closeButton?: boolean;
20
+ /** @deprecated Use `hasCleanChatButton` instead. Ignored when `hasCleanChatButton` is set. */
13
21
  cleanChatButton?: boolean;
22
+ /** @deprecated Use `isInitiallyOpen` instead. Ignored when `isInitiallyOpen` is set. */
14
23
  initialOpen?: boolean;
15
24
  proactiveMessageHideDelay?: number;
16
25
  }
17
26
  export interface UseChatReturn {
18
27
  isReady: boolean;
19
28
  isChatActive: boolean;
29
+ /** Effective initial-open (boot chat_settings.initial_open ?? prop). */
30
+ isInitiallyOpen: boolean;
31
+ /** Effective close-button visibility (boot chat_settings.close_button ?? prop). */
32
+ hasCloseButton: boolean;
33
+ /** Effective clear-chat-button visibility (boot chat_settings.clean_chat_button ?? prop). */
34
+ hasCleanChatButton: boolean;
20
35
  isMobile: boolean;
21
36
  chatInterfaceProps: Partial<ChatInterfaceProps>;
22
37
  chatOpen: boolean;
@@ -41,7 +56,7 @@ export interface UseChatReturn {
41
56
  * @param options The hook parameters
42
57
  * @returns The chat hook return type
43
58
  */
44
- export declare function useChat({ environment, apiUrl, appId, userId: initialUserId, userName, userData, chatProps, isMobile: propIsMobile, initialOpen: propInitialOpen, proactiveMessageHideDelay, }: Readonly<Partial<UseChatProps> & {
59
+ export declare function useChat({ environment, apiUrl, appId, userId: initialUserId, userName, userData, chatProps, isMobile: propIsMobile, isInitiallyOpen: propIsInitiallyOpen, hasCloseButton: propHasCloseButton, hasCleanChatButton: propHasCleanChatButton, initialOpen: deprecatedInitialOpen, closeButton: deprecatedCloseButton, cleanChatButton: deprecatedCleanChatButton, proactiveMessageHideDelay: propProactiveMessageHideDelay, }: Readonly<Partial<UseChatProps> & {
45
60
  environment: "test" | "live";
46
61
  apiUrl?: string;
47
62
  appId: string;
@@ -11,7 +11,6 @@ type InternalChatProps = {
11
11
  INTERNAL_ONLY_FEATURE_MESSAGE_CLICK?: (message: Message) => void;
12
12
  INTERNAL_ONLY_FEATURE_CLEAR_CHAT_CLICK?: () => void;
13
13
  INTERNAL_ONLY_FEATURE_HIDE_COPY_BUTTON?: boolean;
14
- INTERNAL_ONLY_DISABLE_INITIAL_OPEN_ANIMATION?: boolean;
15
14
  };
16
15
  export type ChatProps = UseChatProps & InternalChatProps;
17
16
  export declare function Chat(props: Readonly<ChatProps>): import("react/jsx-runtime").JSX.Element;
@@ -1,4 +1,4 @@
1
- import { default as React } from 'react';
1
+ import { Dispatch, SetStateAction } from 'react';
2
2
  import { Message, MessageData } from '../../type';
3
3
  import { BootResponse, EloquentAiApiClient } from '../../lib/eloquent-ai-api-client';
4
4
  export interface UseMessageEventsProps {
@@ -11,11 +11,11 @@ export interface UseMessageEventsProps {
11
11
  apiClient: EloquentAiApiClient | null;
12
12
  chatSettings: BootResponse["chat_settings"] | null;
13
13
  messages: Message[];
14
- setMessages: React.Dispatch<React.SetStateAction<Message[]>>;
14
+ setMessages: Dispatch<SetStateAction<Message[]>>;
15
15
  currentChat: {
16
16
  id: string;
17
17
  } | null;
18
- setCurrentChat: React.Dispatch<React.SetStateAction<{
18
+ setCurrentChat: Dispatch<SetStateAction<{
19
19
  id: string;
20
20
  } | null>>;
21
21
  onChatClosed?: () => void;
@@ -103,32 +103,6 @@ export type AgentSummaryNotification = {
103
103
  type: "agent_summary";
104
104
  }>;
105
105
  };
106
- export type ChatClosedExpiredNotification = {
107
- message_id: string | null;
108
- created_at: string;
109
- data: Extract<NotificationData, {
110
- type: "chat_closed_expired";
111
- }>;
112
- };
113
- export type ChatRatingNotification = {
114
- created_at: string;
115
- data: Extract<NotificationData, {
116
- type: "chat_rating";
117
- }>;
118
- };
119
- export type BreadcrumbNotification = {
120
- created_at: string;
121
- data: Extract<NotificationData, {
122
- type: "breadcrumb";
123
- }>;
124
- };
125
- export type ChatEscalatedNotification = {
126
- message_id: string | null;
127
- created_at: string;
128
- data: Extract<NotificationData, {
129
- type: "chat_escalated";
130
- }>;
131
- };
132
106
  export declare const chatResponseSchema: z.ZodObject<{
133
107
  message_id: z.ZodString;
134
108
  response: z.ZodObject<{
@@ -1,4 +1,6 @@
1
- export declare function ChatBubble({ toggleBubble, }: {
1
+ export declare function ChatBubble({ toggleBubble, isDarkMode, }: {
2
2
  isOpen: boolean;
3
3
  toggleBubble: () => void;
4
+ /** Renders in its own iframe (no `.dark` ancestor), so the mode arrives as a prop. */
5
+ isDarkMode?: boolean;
4
6
  }): import("react/jsx-runtime").JSX.Element;
@@ -11,11 +11,23 @@ export interface ChatInterfaceProps {
11
11
  assistantName?: string;
12
12
  assistantLogo?: string;
13
13
  legalText?: string;
14
- closeButton: boolean;
15
- cleanChatButton: boolean;
14
+ /** Show the close (X) button in the chat header. Defaults to true. */
15
+ hasCloseButton?: boolean;
16
+ /** Show the clear-conversation button in the chat header. Defaults to true. */
17
+ hasCleanChatButton?: boolean;
18
+ /** @deprecated Use `hasCloseButton` instead. Ignored when `hasCloseButton` is set. */
19
+ closeButton?: boolean;
20
+ /** @deprecated Use `hasCleanChatButton` instead. Ignored when `hasCleanChatButton` is set. */
21
+ cleanChatButton?: boolean;
16
22
  hideCopyButton?: boolean;
17
23
  collectUserFeedback?: boolean;
18
24
  suggestedMessages?: boolean;
25
+ /** Custom quick-reply texts; falls back to the default examples when empty. */
26
+ suggestedMessageTexts?: string[];
27
+ /** Rotating conic-gradient frame around the first suggestion pill, colored from the pill/user-bubble background. */
28
+ hasSuggestedMessageAura?: boolean;
29
+ /** Banner-style light streak flashing across the first suggestion pill at random intervals. */
30
+ hasSuggestedMessageShine?: boolean;
19
31
  title?: string;
20
32
  subtitle?: string;
21
33
  onSendMessage?: (message: MessageData) => Promise<void>;
@@ -25,7 +37,5 @@ export interface ChatInterfaceProps {
25
37
  isChatClosed?: boolean;
26
38
  onStartNewChat?: () => void;
27
39
  onRateChat?: (rating: number) => void;
28
- /** @internal Skips the open/close animation for the initial render when the chat starts open. */
29
- disableInitialOpenAnimation?: boolean;
30
40
  }
31
41
  export declare function ChatInterface(props: ChatInterfaceProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,19 @@
1
+ export interface SuggestedMessagesProps {
2
+ /** Called with the pill's text; the footer fills and focuses the input. */
3
+ onSelect: (message: string) => void;
4
+ }
5
+ /**
6
+ * The quick-reply pill row shown above the composer. Renders nothing unless
7
+ * `suggestedMessages` is enabled in the chat-interface context, and only
8
+ * until the conversation starts: the pills disappear the moment the user
9
+ * sends their first message (they reappear when the chat is cleared, since
10
+ * the message list resets). Clicking a pill only fills the composer — the
11
+ * pills stay until the message is actually sent. Two independently
12
+ * toggleable effects highlight the first (primary) pill:
13
+ * - `hasSuggestedMessageAura` — a rotating conic-gradient frame in a
14
+ * saturated/soft pair derived from the pill background (or the user-bubble
15
+ * colour when the pills use the default muted background);
16
+ * - `hasSuggestedMessageShine` — a banner-style light streak flashing across
17
+ * the pill at random 4–9 second intervals.
18
+ */
19
+ export declare function SuggestedMessages({ onSelect }: SuggestedMessagesProps): import("react/jsx-runtime").JSX.Element | null;
@@ -1,5 +1,6 @@
1
+ import { ReactNode } from 'react';
1
2
  interface PortalProps {
2
- children: React.ReactNode;
3
+ children: ReactNode;
3
4
  container: HTMLElement;
4
5
  }
5
6
  export declare function Portal({ children, container }: PortalProps): import('react').ReactPortal;
@@ -1,6 +1,5 @@
1
- import * as React from "react";
2
1
  import * as AvatarPrimitive from "@radix-ui/react-avatar";
3
- declare const Avatar: React.ForwardRefExoticComponent<Omit<AvatarPrimitive.AvatarProps & React.RefAttributes<HTMLSpanElement>, "ref"> & React.RefAttributes<HTMLSpanElement>>;
4
- declare const AvatarImage: React.ForwardRefExoticComponent<Omit<AvatarPrimitive.AvatarImageProps & React.RefAttributes<HTMLImageElement>, "ref"> & React.RefAttributes<HTMLImageElement>>;
5
- declare const AvatarFallback: React.ForwardRefExoticComponent<Omit<AvatarPrimitive.AvatarFallbackProps & React.RefAttributes<HTMLSpanElement>, "ref"> & React.RefAttributes<HTMLSpanElement>>;
2
+ declare const Avatar: import('react').ForwardRefExoticComponent<Omit<AvatarPrimitive.AvatarProps & import('react').RefAttributes<HTMLSpanElement>, "ref"> & import('react').RefAttributes<HTMLSpanElement>>;
3
+ declare const AvatarImage: import('react').ForwardRefExoticComponent<Omit<AvatarPrimitive.AvatarImageProps & import('react').RefAttributes<HTMLImageElement>, "ref"> & import('react').RefAttributes<HTMLImageElement>>;
4
+ declare const AvatarFallback: import('react').ForwardRefExoticComponent<Omit<AvatarPrimitive.AvatarFallbackProps & import('react').RefAttributes<HTMLSpanElement>, "ref"> & import('react').RefAttributes<HTMLSpanElement>>;
6
5
  export { Avatar, AvatarImage, AvatarFallback };
@@ -1,8 +1,8 @@
1
- import * as React from "react";
2
- declare const Card: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
3
- declare const CardHeader: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
4
- declare const CardTitle: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
5
- declare const CardDescription: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
6
- declare const CardContent: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
7
- declare const CardFooter: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
1
+ import { HTMLAttributes } from 'react';
2
+ declare const Card: import('react').ForwardRefExoticComponent<HTMLAttributes<HTMLDivElement> & import('react').RefAttributes<HTMLDivElement>>;
3
+ declare const CardHeader: import('react').ForwardRefExoticComponent<HTMLAttributes<HTMLDivElement> & import('react').RefAttributes<HTMLDivElement>>;
4
+ declare const CardTitle: import('react').ForwardRefExoticComponent<HTMLAttributes<HTMLDivElement> & import('react').RefAttributes<HTMLDivElement>>;
5
+ declare const CardDescription: import('react').ForwardRefExoticComponent<HTMLAttributes<HTMLDivElement> & import('react').RefAttributes<HTMLDivElement>>;
6
+ declare const CardContent: import('react').ForwardRefExoticComponent<HTMLAttributes<HTMLDivElement> & import('react').RefAttributes<HTMLDivElement>>;
7
+ declare const CardFooter: import('react').ForwardRefExoticComponent<HTMLAttributes<HTMLDivElement> & import('react').RefAttributes<HTMLDivElement>>;
8
8
  export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent, };
@@ -1,19 +1,18 @@
1
- import * as React from "react";
1
+ import { HTMLAttributes } from 'react';
2
2
  import * as DialogPrimitive from "@radix-ui/react-dialog";
3
- declare const Dialog: React.FC<DialogPrimitive.DialogProps>;
4
- declare const DialogTrigger: React.ForwardRefExoticComponent<DialogPrimitive.DialogTriggerProps & React.RefAttributes<HTMLButtonElement>>;
5
- declare const DialogPortal: React.FC<DialogPrimitive.DialogPortalProps>;
6
- declare const DialogClose: React.ForwardRefExoticComponent<DialogPrimitive.DialogCloseProps & React.RefAttributes<HTMLButtonElement>>;
7
- declare const DialogOverlay: React.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogOverlayProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
8
- declare const DialogContent: React.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
3
+ declare const Dialog: import('react').FC<DialogPrimitive.DialogProps>;
4
+ declare const DialogTrigger: import('react').ForwardRefExoticComponent<DialogPrimitive.DialogTriggerProps & import('react').RefAttributes<HTMLButtonElement>>;
5
+ declare const DialogPortal: import('react').FC<DialogPrimitive.DialogPortalProps>;
6
+ declare const DialogOverlay: import('react').ForwardRefExoticComponent<Omit<DialogPrimitive.DialogOverlayProps & import('react').RefAttributes<HTMLDivElement>, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
7
+ declare const DialogContent: import('react').ForwardRefExoticComponent<Omit<DialogPrimitive.DialogContentProps & import('react').RefAttributes<HTMLDivElement>, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
9
8
  declare const DialogHeader: {
10
- ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): import("react/jsx-runtime").JSX.Element;
9
+ ({ className, ...props }: HTMLAttributes<HTMLDivElement>): import("react/jsx-runtime").JSX.Element;
11
10
  displayName: string;
12
11
  };
13
12
  declare const DialogFooter: {
14
- ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): import("react/jsx-runtime").JSX.Element;
13
+ ({ className, ...props }: HTMLAttributes<HTMLDivElement>): import("react/jsx-runtime").JSX.Element;
15
14
  displayName: string;
16
15
  };
17
- declare const DialogTitle: React.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogTitleProps & React.RefAttributes<HTMLHeadingElement>, "ref"> & React.RefAttributes<HTMLHeadingElement>>;
18
- declare const DialogDescription: React.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogDescriptionProps & React.RefAttributes<HTMLParagraphElement>, "ref"> & React.RefAttributes<HTMLParagraphElement>>;
19
- export { Dialog, DialogPortal, DialogOverlay, DialogClose, DialogTrigger, DialogContent, DialogHeader, DialogFooter, DialogTitle, DialogDescription, };
16
+ declare const DialogTitle: import('react').ForwardRefExoticComponent<Omit<DialogPrimitive.DialogTitleProps & import('react').RefAttributes<HTMLHeadingElement>, "ref"> & import('react').RefAttributes<HTMLHeadingElement>>;
17
+ declare const DialogDescription: import('react').ForwardRefExoticComponent<Omit<DialogPrimitive.DialogDescriptionProps & import('react').RefAttributes<HTMLParagraphElement>, "ref"> & import('react').RefAttributes<HTMLParagraphElement>>;
18
+ export { Dialog, DialogPortal, DialogOverlay, DialogTrigger, DialogContent, DialogHeader, DialogFooter, DialogTitle, DialogDescription, };
@@ -1,3 +1,2 @@
1
- import * as React from "react";
2
- declare const Input: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>, "ref"> & React.RefAttributes<HTMLInputElement>>;
1
+ declare const Input: import('react').ForwardRefExoticComponent<Omit<import('react').DetailedHTMLProps<import('react').InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>, "ref"> & import('react').RefAttributes<HTMLInputElement>>;
3
2
  export { Input };
@@ -1,6 +1,5 @@
1
- import * as React from "react";
2
1
  import * as PopoverPrimitive from "@radix-ui/react-popover";
3
- declare const Popover: React.FC<PopoverPrimitive.PopoverProps>;
4
- declare const PopoverTrigger: React.ForwardRefExoticComponent<PopoverPrimitive.PopoverTriggerProps & React.RefAttributes<HTMLButtonElement>>;
5
- declare const PopoverContent: React.ForwardRefExoticComponent<Omit<PopoverPrimitive.PopoverContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
2
+ declare const Popover: import('react').FC<PopoverPrimitive.PopoverProps>;
3
+ declare const PopoverTrigger: import('react').ForwardRefExoticComponent<PopoverPrimitive.PopoverTriggerProps & import('react').RefAttributes<HTMLButtonElement>>;
4
+ declare const PopoverContent: import('react').ForwardRefExoticComponent<Omit<PopoverPrimitive.PopoverContentProps & import('react').RefAttributes<HTMLDivElement>, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
6
5
  export { Popover, PopoverTrigger, PopoverContent };
@@ -1,7 +1,7 @@
1
- import * as React from "react";
1
+ import { UIEvent } from 'react';
2
2
  import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area";
3
- declare const ScrollArea: React.ForwardRefExoticComponent<Omit<ScrollAreaPrimitive.ScrollAreaProps & React.RefAttributes<HTMLDivElement>, "ref"> & {
4
- onViewportScroll?: (event: React.UIEvent<HTMLDivElement>) => void;
5
- } & React.RefAttributes<HTMLDivElement>>;
6
- declare const ScrollBar: React.ForwardRefExoticComponent<Omit<ScrollAreaPrimitive.ScrollAreaScrollbarProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
3
+ declare const ScrollArea: import('react').ForwardRefExoticComponent<Omit<ScrollAreaPrimitive.ScrollAreaProps & import('react').RefAttributes<HTMLDivElement>, "ref"> & {
4
+ onViewportScroll?: (event: UIEvent<HTMLDivElement>) => void;
5
+ } & import('react').RefAttributes<HTMLDivElement>>;
6
+ declare const ScrollBar: import('react').ForwardRefExoticComponent<Omit<ScrollAreaPrimitive.ScrollAreaScrollbarProps & import('react').RefAttributes<HTMLDivElement>, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
7
7
  export { ScrollArea, ScrollBar };
@@ -1,2 +1,3 @@
1
- declare function Skeleton({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): import("react/jsx-runtime").JSX.Element;
1
+ import { HTMLAttributes } from 'react';
2
+ declare function Skeleton({ className, ...props }: HTMLAttributes<HTMLDivElement>): import("react/jsx-runtime").JSX.Element;
2
3
  export { Skeleton };
@@ -1,3 +1,2 @@
1
- import * as React from "react";
2
- declare const Textarea: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.TextareaHTMLAttributes<HTMLTextAreaElement>, HTMLTextAreaElement>, "ref"> & React.RefAttributes<HTMLTextAreaElement>>;
1
+ declare const Textarea: import('react').ForwardRefExoticComponent<Omit<import('react').DetailedHTMLProps<import('react').TextareaHTMLAttributes<HTMLTextAreaElement>, HTMLTextAreaElement>, "ref"> & import('react').RefAttributes<HTMLTextAreaElement>>;
3
2
  export { Textarea };
@@ -1,4 +1,4 @@
1
- import { default as React, ReactNode } from 'react';
2
- export declare const ErrorProvider: React.FC<{
1
+ import { ReactNode } from 'react';
2
+ export declare const ErrorProvider: ({ children }: {
3
3
  children: ReactNode;
4
- }>;
4
+ }) => import("react/jsx-runtime").JSX.Element;
@@ -3,11 +3,24 @@ export interface ThemeContextType {
3
3
  mode: string;
4
4
  botBubbleColor: string;
5
5
  userBubbleColor: string;
6
+ /** Background of the suggested-message quick-reply pills. Empty string falls back to the default muted style. */
7
+ suggestedMessageBubbleColor: string;
8
+ /** Explicit text color for user bubbles. Empty string = auto (black/white by contrast). */
9
+ userBubbleTextColor: string;
10
+ /** Explicit text color for bot bubbles. Empty string = auto (black/white by contrast). */
11
+ botBubbleTextColor: string;
12
+ /** Explicit text color for the suggested-message pills. Empty string = auto (black/white by contrast). */
13
+ suggestedMessageBubbleTextColor: string;
6
14
  legalText: string;
7
15
  }
8
16
  export declare function ThemeProvider(props: PropsWithChildren<{
9
17
  mode?: string;
18
+ botBubbleColor?: string | undefined;
10
19
  userBubbleColor?: string | undefined;
20
+ suggestedMessageBubbleColor?: string | undefined;
21
+ userBubbleTextColor?: string | undefined;
22
+ botBubbleTextColor?: string | undefined;
23
+ suggestedMessageBubbleTextColor?: string | undefined;
11
24
  legalText?: string;
12
25
  }>): import("react/jsx-runtime").JSX.Element;
13
26
  export declare const useTheme: () => ThemeContextType;
@@ -1,6 +1,7 @@
1
+ import { MouseEvent } from 'react';
1
2
  export declare function useDragScroll(): {
2
- onMouseDown: (e: React.MouseEvent<HTMLDivElement>) => void;
3
- onMouseUp: (e: React.MouseEvent<HTMLDivElement>) => void;
4
- onMouseLeave: (e: React.MouseEvent<HTMLDivElement>) => void;
5
- onMouseMove: (e: React.MouseEvent<HTMLDivElement>) => void;
3
+ onMouseDown: (e: MouseEvent<HTMLDivElement>) => void;
4
+ onMouseUp: (e: MouseEvent<HTMLDivElement>) => void;
5
+ onMouseLeave: (e: MouseEvent<HTMLDivElement>) => void;
6
+ onMouseMove: (e: MouseEvent<HTMLDivElement>) => void;
6
7
  };