diff --git a/packages/embeds/js/package.json b/packages/embeds/js/package.json index d6fcb8691..cde9da2d0 100644 --- a/packages/embeds/js/package.json +++ b/packages/embeds/js/package.json @@ -1,6 +1,6 @@ { "name": "@typebot.io/js", - "version": "0.2.41", + "version": "0.2.42", "description": "Javascript library to display typebots on your website", "type": "module", "main": "dist/index.js", diff --git a/packages/embeds/js/src/features/bubble/components/Bubble.tsx b/packages/embeds/js/src/features/bubble/components/Bubble.tsx index fe5f55133..575ec91a8 100644 --- a/packages/embeds/js/src/features/bubble/components/Bubble.tsx +++ b/packages/embeds/js/src/features/bubble/components/Bubble.tsx @@ -47,6 +47,13 @@ export const Bubble = (props: BubbleProps) => { const [isBotOpened, setIsBotOpened] = createSignal(false) const [isBotStarted, setIsBotStarted] = createSignal(false) + const [buttonSize, setButtonSize] = createSignal( + // eslint-disable-next-line solid/reactivity + parseButtonSize(bubbleProps.theme?.button?.size ?? 'medium') + ) + createEffect(() => { + setButtonSize(parseButtonSize(bubbleProps.theme?.button?.size ?? 'medium')) + }) onMount(() => { window.addEventListener('message', processIncomingEvent) @@ -145,7 +152,7 @@ export const Bubble = (props: BubbleProps) => { {...previewMessage()} placement={bubbleProps.theme?.placement} previewMessageTheme={bubbleProps.theme?.previewMessage} - buttonSize={bubbleProps.theme?.button?.size} + buttonSize={buttonSize()} onClick={handlePreviewMessageClick} onCloseClick={hideMessage} /> @@ -155,6 +162,7 @@ export const Bubble = (props: BubbleProps) => { placement={bubbleProps.theme?.placement} toggleBot={toggleBot} isBotOpened={isBotOpened()} + buttonSize={buttonSize()} />
{ 'box-shadow': 'rgb(0 0 0 / 16%) 0px 5px 40px', 'background-color': bubbleProps.theme?.chatWindow?.backgroundColor, 'z-index': 42424242, + bottom: `calc(${buttonSize()} + 32px)`, }} class={ 'fixed rounded-lg w-full' + (isBotOpened() ? ' opacity-1' : ' opacity-0 pointer-events-none') + - (props.theme?.button?.size === 'large' - ? ' bottom-24' - : ' bottom-20') + (props.theme?.placement === 'left' ? ' left-5' : ' right-5') } > @@ -194,3 +200,8 @@ export const Bubble = (props: BubbleProps) => { ) } + +const parseButtonSize = ( + size: NonNullable['button']>['size'] +): `${number}px` => + size === 'medium' ? '48px' : size === 'large' ? '64px' : size ? size : '48px' diff --git a/packages/embeds/js/src/features/bubble/components/BubbleButton.tsx b/packages/embeds/js/src/features/bubble/components/BubbleButton.tsx index 5dbfaf84d..27f9573ae 100644 --- a/packages/embeds/js/src/features/bubble/components/BubbleButton.tsx +++ b/packages/embeds/js/src/features/bubble/components/BubbleButton.tsx @@ -8,6 +8,7 @@ type Props = Pick & ButtonTheme & { isBotOpened: boolean toggleBot: () => void + buttonSize: `${number}px` } const defaultButtonColor = '#0042DA' @@ -22,13 +23,14 @@ export const BubbleButton = (props: Props) => ( part="button" onClick={() => props.toggleBot()} class={clsx( - 'fixed bottom-5 shadow-md rounded-full hover:scale-110 active:scale-95 transition-transform duration-200 flex justify-center items-center animate-fade-in', - props.size === 'large' ? ' w-16 h-16' : ' w-12 h-12', + `fixed bottom-5 shadow-md rounded-full hover:scale-110 active:scale-95 transition-transform duration-200 flex justify-center items-center animate-fade-in`, props.placement === 'left' ? ' left-5' : ' right-5' )} style={{ 'background-color': props.backgroundColor ?? defaultButtonColor, 'z-index': 42424242, + width: props.buttonSize, + height: props.buttonSize, }} aria-label="Open chatbot" > @@ -45,9 +47,8 @@ export const BubbleButton = (props: Props) => ( : defaultLightIconColor), }} class={clsx( - 'stroke-2 fill-transparent absolute duration-200 transition', - props.isBotOpened ? 'scale-0 opacity-0' : 'scale-100 opacity-100', - props.size === 'large' ? 'w-9' : 'w-7' + 'stroke-2 fill-transparent absolute duration-200 transition w-[60%]', + props.isBotOpened ? 'scale-0 opacity-0' : 'scale-100 opacity-100' )} > @@ -60,11 +61,7 @@ export const BubbleButton = (props: Props) => ( class={clsx( 'duration-200 transition', props.isBotOpened ? 'scale-0 opacity-0' : 'scale-100 opacity-100', - isSvgSrc(props.customIconSrc) - ? props.size === 'large' - ? 'w-9 h-9' - : 'w-7 h-7' - : 'w-[90%] h-[90%]', + isSvgSrc(props.customIconSrc) ? 'w-[60%]' : 'w-full h-full', isSvgSrc(props.customIconSrc) ? '' : 'object-cover rounded-full' )} alt="Bubble button icon" @@ -98,11 +95,10 @@ export const BubbleButton = (props: Props) => ( : defaultLightIconColor), }} class={clsx( - 'absolute duration-200 transition', + 'absolute duration-200 transition w-[60%]', props.isBotOpened ? 'scale-100 rotate-0 opacity-100' - : 'scale-0 -rotate-180 opacity-0', - props.size === 'large' ? ' w-9' : ' w-7' + : 'scale-0 -rotate-180 opacity-0' )} > ( props.isBotOpened ? 'scale-100 rotate-0 opacity-100' : 'scale-0 -rotate-180 opacity-0', - isSvgSrc(props.customCloseIconSrc) - ? props.size === 'large' - ? 'w-9 h-9' - : 'w-7 h-7' - : 'w-[90%] h-[90%]', + isSvgSrc(props.customCloseIconSrc) ? 'w-[60%]' : 'w-full h-full', isSvgSrc(props.customCloseIconSrc) ? '' : 'object-cover rounded-full' )} alt="Bubble button close icon" diff --git a/packages/embeds/js/src/features/bubble/components/PreviewMessage.tsx b/packages/embeds/js/src/features/bubble/components/PreviewMessage.tsx index 9d79cde58..41ec845bd 100644 --- a/packages/embeds/js/src/features/bubble/components/PreviewMessage.tsx +++ b/packages/embeds/js/src/features/bubble/components/PreviewMessage.tsx @@ -27,7 +27,6 @@ export const PreviewMessage = (props: PreviewMessageProps) => { onClick={() => props.onClick()} class={ 'fixed max-w-[256px] rounded-md duration-200 flex items-center gap-4 shadow-md animate-fade-in cursor-pointer hover:shadow-lg p-4' + - (props.buttonSize === 'large' ? ' bottom-24' : ' bottom-20') + (props.placement === 'left' ? ' left-5' : ' right-5') } style={{ @@ -35,6 +34,7 @@ export const PreviewMessage = (props: PreviewMessageProps) => { props.previewMessageTheme?.backgroundColor ?? defaultBackgroundColor, color: props.previewMessageTheme?.textColor ?? defaultTextColor, 'z-index': 42424242, + bottom: `calc(${props.buttonSize} + 32px)`, }} onMouseEnter={() => setIsPreviewMessageHovered(true)} onMouseLeave={() => setIsPreviewMessageHovered(false)} diff --git a/packages/embeds/js/src/features/bubble/types.ts b/packages/embeds/js/src/features/bubble/types.ts index ebd37c206..979a5ced3 100644 --- a/packages/embeds/js/src/features/bubble/types.ts +++ b/packages/embeds/js/src/features/bubble/types.ts @@ -18,7 +18,7 @@ export type ChatWindowTheme = { } export type ButtonTheme = { - size?: 'medium' | 'large' + size?: 'medium' | 'large' | `${number}px` backgroundColor?: string iconColor?: string customIconSrc?: string diff --git a/packages/embeds/nextjs/package.json b/packages/embeds/nextjs/package.json index bbe3b1f90..dc72b3027 100644 --- a/packages/embeds/nextjs/package.json +++ b/packages/embeds/nextjs/package.json @@ -1,6 +1,6 @@ { "name": "@typebot.io/nextjs", - "version": "0.2.41", + "version": "0.2.42", "description": "Convenient library to display typebots on your Next.js website", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/embeds/react/package.json b/packages/embeds/react/package.json index dc74e62e0..13c1fbe96 100644 --- a/packages/embeds/react/package.json +++ b/packages/embeds/react/package.json @@ -1,6 +1,6 @@ { "name": "@typebot.io/react", - "version": "0.2.41", + "version": "0.2.42", "description": "Convenient library to display typebots on your React app", "main": "dist/index.js", "types": "dist/index.d.ts",