chore: restyle modal with model select (#202)
chore: set normal font size for sidebar chore: set normal gradient for `ChatInput`
This commit is contained in:
		
							parent
							
								
									5d9bc10cf4
								
							
						
					
					
						commit
						6d5d09d69f
					
				|  | @ -126,12 +126,12 @@ export const Chat: FC<Props> = ({ | ||||||
|             {conversation.messages.length === 0 ? ( |             {conversation.messages.length === 0 ? ( | ||||||
|               <> |               <> | ||||||
|                 <div className="mx-auto flex w-[350px] flex-col space-y-10 pt-12 sm:w-[600px]"> |                 <div className="mx-auto flex w-[350px] flex-col space-y-10 pt-12 sm:w-[600px]"> | ||||||
|                   <div className="text-center text-4xl font-semibold text-gray-800 dark:text-gray-100"> |                   <div className="text-center text-3xl font-semibold text-gray-800 dark:text-gray-100"> | ||||||
|                     {models.length === 0 ? t('Loading...') : 'Chatbot UI'} |                     {models.length === 0 ? t('Loading...') : 'Chatbot UI'} | ||||||
|                   </div> |                   </div> | ||||||
| 
 | 
 | ||||||
|                   {models.length > 0 && ( |                   {models.length > 0 && ( | ||||||
|                     <div className="flex h-full flex-col space-y-4 rounded border border-neutral-500 p-4"> |                     <div className="flex h-full flex-col space-y-4 rounded border border-neutral-200 dark:border-neutral-600 p-4"> | ||||||
|                       <ModelSelect |                       <ModelSelect | ||||||
|                         model={conversation.model} |                         model={conversation.model} | ||||||
|                         models={models} |                         models={models} | ||||||
|  |  | ||||||
|  | @ -102,11 +102,11 @@ export const ChatInput: FC<Props> = ({ | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   return ( |   return ( | ||||||
|     <div className="dark:bg-vert-dark-gradient absolute bottom-0 left-0 w-full border-transparent bg-white from-[#343541] via-[#343541] to-[#343541]/0 pt-6 dark:border-white/20 dark:bg-[#444654] dark:!bg-transparent dark:bg-gradient-to-t md:pt-2"> |     <div className="absolute bottom-0 left-0 w-full border-transparent pt-6 dark:border-white/20 bg-gradient-to-b from-transparent via-white to-white dark:via-[#343541] dark:to-[#343541] md:pt-2"> | ||||||
|       <div className="stretch mx-2 mt-4 flex flex-row gap-3 last:mb-2 md:mx-4 md:mt-[52px] md:last:mb-6 lg:mx-auto lg:max-w-3xl"> |       <div className="stretch mx-2 mt-4 flex flex-row gap-3 last:mb-2 md:mx-4 md:mt-[52px] md:last:mb-6 lg:mx-auto lg:max-w-3xl"> | ||||||
|         {messageIsStreaming && ( |         {messageIsStreaming && ( | ||||||
|           <button |           <button | ||||||
|             className="absolute -top-2 left-0 right-0 mx-auto w-fit rounded border border-gray-500 py-2 px-4 text-black hover:opacity-50 dark:bg-[#343541] dark:text-white md:top-0" |             className="absolute -top-2 left-0 right-0 mx-auto w-fit rounded border border-neutral-200 dark:border-neutral-600 py-2 px-4 text-black bg-white dark:bg-[#343541] dark:text-white md:top-0" | ||||||
|             onClick={handleStopConversation} |             onClick={handleStopConversation} | ||||||
|           > |           > | ||||||
|             <IconPlayerStop size={16} className="mb-[2px] inline-block" />{' '} |             <IconPlayerStop size={16} className="mb-[2px] inline-block" />{' '} | ||||||
|  | @ -116,7 +116,7 @@ export const ChatInput: FC<Props> = ({ | ||||||
| 
 | 
 | ||||||
|         {!messageIsStreaming && messages.length > 0 && ( |         {!messageIsStreaming && messages.length > 0 && ( | ||||||
|           <button |           <button | ||||||
|             className="absolute -top-2 left-0 right-0 mx-auto w-fit rounded border border-gray-500 py-2 px-4 text-black hover:opacity-50 dark:bg-[#343541] dark:text-white md:top-0" |             className="absolute -top-2 left-0 right-0 mx-auto w-fit rounded border border-neutral-200 dark:border-neutral-600 py-2 px-4 text-black bg-white dark:bg-[#343541] dark:text-white md:top-0" | ||||||
|             onClick={onRegenerate} |             onClick={onRegenerate} | ||||||
|           > |           > | ||||||
|             <IconRepeat size={16} className="mb-[2px] inline-block" />{' '} |             <IconRepeat size={16} className="mb-[2px] inline-block" />{' '} | ||||||
|  | @ -148,7 +148,7 @@ export const ChatInput: FC<Props> = ({ | ||||||
|           /> |           /> | ||||||
| 
 | 
 | ||||||
|           <button |           <button | ||||||
|             className="absolute right-5 rounded-sm p-1 text-neutral-800 hover:bg-neutral-200 hover:text-neutral-900 focus:outline-none dark:bg-opacity-50 dark:text-neutral-100 dark:hover:text-neutral-200" |             className="absolute right-3 rounded-sm p-1 text-neutral-800 hover:bg-neutral-200 hover:text-neutral-900 focus:outline-none dark:bg-opacity-50 dark:text-neutral-100 dark:hover:text-neutral-200" | ||||||
|             onClick={handleSend} |             onClick={handleSend} | ||||||
|           > |           > | ||||||
|             <IconSend size={16} className="opacity-60" /> |             <IconSend size={16} className="opacity-60" /> | ||||||
|  |  | ||||||
|  | @ -15,13 +15,16 @@ export const ModelSelect: FC<Props> = ({ model, models, onModelChange }) => { | ||||||
|       <label className="mb-2 text-left text-neutral-700 dark:text-neutral-400"> |       <label className="mb-2 text-left text-neutral-700 dark:text-neutral-400"> | ||||||
|         {t('Model')} |         {t('Model')} | ||||||
|       </label> |       </label> | ||||||
|  |       <div className="w-full rounded-lg border border-neutral-200 pr-2 bg-transparent text-neutral-900 dark:border-neutral-600 dark:text-white"> | ||||||
|         <select |         <select | ||||||
|         className="focus:shadow-outline w-full cursor-pointer appearance-none rounded-lg border border-neutral-500 p-3 text-neutral-900 dark:bg-[#343541] dark:text-white" |           className="bg-transparent w-full outline-0 p-2" | ||||||
|           placeholder={t('Select a model') || ''} |           placeholder={t('Select a model') || ''} | ||||||
|           value={model.id} |           value={model.id} | ||||||
|           onChange={(e) => { |           onChange={(e) => { | ||||||
|             onModelChange( |             onModelChange( | ||||||
|             models.find((model) => model.id === e.target.value) as OpenAIModel, |               models.find( | ||||||
|  |                 (model) => model.id === e.target.value, | ||||||
|  |               ) as OpenAIModel, | ||||||
|             ); |             ); | ||||||
|           }} |           }} | ||||||
|         > |         > | ||||||
|  | @ -32,5 +35,6 @@ export const ModelSelect: FC<Props> = ({ model, models, onModelChange }) => { | ||||||
|           ))} |           ))} | ||||||
|         </select> |         </select> | ||||||
|       </div> |       </div> | ||||||
|  |     </div> | ||||||
|   ); |   ); | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | @ -52,7 +52,7 @@ export const SystemPrompt: FC<Props> = ({ conversation, onChangePrompt }) => { | ||||||
|       </label> |       </label> | ||||||
|       <textarea |       <textarea | ||||||
|         ref={textareaRef} |         ref={textareaRef} | ||||||
|         className="w-full rounded-lg border border-neutral-500 px-4 py-2 text-neutral-900 shadow focus:outline-none dark:border-neutral-800 dark:border-opacity-50 dark:bg-[#40414F] dark:text-neutral-100" |         className="w-full rounded-lg border border-neutral-200 px-4 py-3 text-neutral-900 focus:outline-none bg-transparent dark:border-neutral-600 dark:text-neutral-100" | ||||||
|         style={{ |         style={{ | ||||||
|           resize: 'none', |           resize: 'none', | ||||||
|           bottom: `${textareaRef?.current?.scrollHeight}px`, |           bottom: `${textareaRef?.current?.scrollHeight}px`, | ||||||
|  |  | ||||||
|  | @ -21,13 +21,13 @@ export const ClearConversations: FC<Props> = ({ onClearConversations }) => { | ||||||
|     <div className="flex w-full cursor-pointer items-center rounded-md py-3 px-3 hover:bg-[#343541]"> |     <div className="flex w-full cursor-pointer items-center rounded-md py-3 px-3 hover:bg-[#343541]"> | ||||||
|       <IconTrash size={18} /> |       <IconTrash size={18} /> | ||||||
| 
 | 
 | ||||||
|       <div className="ml-3 flex-1 text-left text-white"> |       <div className="ml-3 flex-1 text-left text-[12.5px] leading-3 text-white"> | ||||||
|         {t('Are you sure?')} |         {t('Are you sure?')} | ||||||
|       </div> |       </div> | ||||||
| 
 | 
 | ||||||
|       <div className="flex w-[40px]"> |       <div className="flex w-[40px]"> | ||||||
|         <IconCheck |         <IconCheck | ||||||
|           className="ml-auto min-w-[20px] text-neutral-400 hover:text-neutral-100" |           className="ml-auto min-w-[20px] mr-1 text-neutral-400 hover:text-neutral-100" | ||||||
|           size={18} |           size={18} | ||||||
|           onClick={(e) => { |           onClick={(e) => { | ||||||
|             e.stopPropagation(); |             e.stopPropagation(); | ||||||
|  |  | ||||||
|  | @ -64,7 +64,7 @@ export const ConversationComponent: FC<Props> = ({ | ||||||
| 
 | 
 | ||||||
|   return ( |   return ( | ||||||
|     <button |     <button | ||||||
|       className={`flex w-full cursor-pointer items-center gap-3 rounded-lg p-3 text-[12px] leading-normal transition-colors duration-200 hover:bg-[#343541]/90 ${ |       className={`flex w-full cursor-pointer items-center gap-3 rounded-lg p-3 text-[12.5px] leading-3 transition-colors duration-200 hover:bg-[#343541]/90 ${ | ||||||
|         loading ? 'disabled:cursor-not-allowed' : '' |         loading ? 'disabled:cursor-not-allowed' : '' | ||||||
|       } ${ |       } ${ | ||||||
|         selectedConversation.id === conversation.id ? 'bg-[#343541]/90' : '' |         selectedConversation.id === conversation.id ? 'bg-[#343541]/90' : '' | ||||||
|  |  | ||||||
|  | @ -21,7 +21,7 @@ export const Search: FC<Props> = ({ searchTerm, onSearch }) => { | ||||||
|   return ( |   return ( | ||||||
|     <div className="relative flex items-center"> |     <div className="relative flex items-center"> | ||||||
|       <input |       <input | ||||||
|         className="w-full flex-1 rounded-md border border-neutral-600 bg-[#202123] px-4 py-3 pr-10 text-[12px] leading-normal text-white" |         className="w-full flex-1 rounded-md border border-neutral-600 bg-[#202123] px-4 py-3 pr-10 text-[12px] leading-3 text-white" | ||||||
|         type="text" |         type="text" | ||||||
|         placeholder={t('Search conversations...') || ''} |         placeholder={t('Search conversations...') || ''} | ||||||
|         value={searchTerm} |         value={searchTerm} | ||||||
|  |  | ||||||
|  | @ -122,7 +122,7 @@ export const Sidebar: FC<Props> = ({ | ||||||
|     > |     > | ||||||
|       <header className="flex items-center"> |       <header className="flex items-center"> | ||||||
|         <button |         <button | ||||||
|           className="flex w-[190px] flex-shrink-0 cursor-pointer items-center gap-3 rounded-md border border-white/20 p-3 text-[12px] leading-normal text-white transition-colors duration-200 select-none hover:bg-gray-500/10" |           className="flex w-[190px] flex-shrink-0 cursor-pointer items-center gap-3 rounded-md border border-white/20 p-3 text-[12.5px] leading-3 text-white transition-colors duration-200 select-none hover:bg-gray-500/10" | ||||||
|           onClick={() => { |           onClick={() => { | ||||||
|             onNewConversation(); |             onNewConversation(); | ||||||
|             setSearchTerm(''); |             setSearchTerm(''); | ||||||
|  | @ -133,7 +133,7 @@ export const Sidebar: FC<Props> = ({ | ||||||
|         </button> |         </button> | ||||||
| 
 | 
 | ||||||
|         <button |         <button | ||||||
|           className="ml-2 flex flex-shrink-0 cursor-pointer items-center gap-3 rounded-md border border-white/20 p-3 text-[12px] leading-normal text-white transition-colors duration-200 hover:bg-gray-500/10" |           className="ml-2 flex flex-shrink-0 cursor-pointer items-center gap-3 rounded-md border border-white/20 p-3 text-[12.5px] leading-3 text-white transition-colors duration-200 hover:bg-gray-500/10" | ||||||
|           onClick={() => onCreateFolder(t('New folder'))} |           onClick={() => onCreateFolder(t('New folder'))} | ||||||
|         > |         > | ||||||
|           <IconFolderPlus size={18} /> |           <IconFolderPlus size={18} /> | ||||||
|  | @ -194,7 +194,7 @@ export const Sidebar: FC<Props> = ({ | ||||||
|         ) : ( |         ) : ( | ||||||
|           <div className="mt-8 text-white text-center opacity-50 select-none"> |           <div className="mt-8 text-white text-center opacity-50 select-none"> | ||||||
|             <IconMessagesOff className='mx-auto mb-3'/> |             <IconMessagesOff className='mx-auto mb-3'/> | ||||||
|             <span className='text-[12px] leading-normal'>{t('No conversations.')}</span> |             <span className='text-[12.5px] leading-3'>{t('No conversations.')}</span> | ||||||
|           </div> |           </div> | ||||||
|         )} |         )} | ||||||
|       </div> |       </div> | ||||||
|  |  | ||||||
|  | @ -9,11 +9,11 @@ interface Props { | ||||||
| export const SidebarButton: FC<Props> = ({ text, icon, onClick }) => { | export const SidebarButton: FC<Props> = ({ text, icon, onClick }) => { | ||||||
|   return ( |   return ( | ||||||
|     <button |     <button | ||||||
|       className="flex w-full cursor-pointer items-center gap-3 rounded-md py-3 px-3 text-white text-[12px] leading-normal transition-colors duration-200 hover:bg-gray-500/10 select-none" |       className="flex w-full cursor-pointer select-none items-center gap-3 rounded-md py-3 px-3 text-[12.5px] leading-3 text-white transition-colors duration-200 hover:bg-gray-500/10" | ||||||
|       onClick={onClick} |       onClick={onClick} | ||||||
|     > |     > | ||||||
|       <div>{icon}</div> |       <div>{icon}</div> | ||||||
|       <div>{text}</div> |       <span>{text}</span> | ||||||
|     </button> |     </button> | ||||||
|   ); |   ); | ||||||
| }; | }; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue