mirror of
				https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web.git
				synced 2025-11-04 16:23:41 +08:00 
			
		
		
		
	feat: new chat message actions style
This commit is contained in:
		@@ -3,6 +3,7 @@
 | 
				
			|||||||
.chat-input-actions {
 | 
					.chat-input-actions {
 | 
				
			||||||
  display: flex;
 | 
					  display: flex;
 | 
				
			||||||
  flex-wrap: wrap;
 | 
					  flex-wrap: wrap;
 | 
				
			||||||
 | 
					  margin-bottom: 10px;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  .chat-input-action {
 | 
					  .chat-input-action {
 | 
				
			||||||
    display: inline-flex;
 | 
					    display: inline-flex;
 | 
				
			||||||
@@ -15,7 +16,6 @@
 | 
				
			|||||||
    animation: slide-in ease 0.3s;
 | 
					    animation: slide-in ease 0.3s;
 | 
				
			||||||
    box-shadow: var(--card-shadow);
 | 
					    box-shadow: var(--card-shadow);
 | 
				
			||||||
    transition: all ease 0.3s;
 | 
					    transition: all ease 0.3s;
 | 
				
			||||||
    margin-bottom: 10px;
 | 
					 | 
				
			||||||
    align-items: center;
 | 
					    align-items: center;
 | 
				
			||||||
    height: 16px;
 | 
					    height: 16px;
 | 
				
			||||||
    width: var(--icon-width);
 | 
					    width: var(--icon-width);
 | 
				
			||||||
@@ -202,3 +202,224 @@
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.chat {
 | 
				
			||||||
 | 
					  display: flex;
 | 
				
			||||||
 | 
					  flex-direction: column;
 | 
				
			||||||
 | 
					  position: relative;
 | 
				
			||||||
 | 
					  height: 100%;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.chat-body {
 | 
				
			||||||
 | 
					  flex: 1;
 | 
				
			||||||
 | 
					  overflow: auto;
 | 
				
			||||||
 | 
					  padding: 20px;
 | 
				
			||||||
 | 
					  padding-bottom: 40px;
 | 
				
			||||||
 | 
					  position: relative;
 | 
				
			||||||
 | 
					  overscroll-behavior: none;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.chat-body-title {
 | 
				
			||||||
 | 
					  cursor: pointer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  &:hover {
 | 
				
			||||||
 | 
					    text-decoration: underline;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.chat-message {
 | 
				
			||||||
 | 
					  display: flex;
 | 
				
			||||||
 | 
					  flex-direction: row;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  &:last-child {
 | 
				
			||||||
 | 
					    animation: slide-in ease 0.3s;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.chat-message-user {
 | 
				
			||||||
 | 
					  display: flex;
 | 
				
			||||||
 | 
					  flex-direction: row-reverse;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.chat-message-container {
 | 
				
			||||||
 | 
					  max-width: var(--message-max-width);
 | 
				
			||||||
 | 
					  display: flex;
 | 
				
			||||||
 | 
					  flex-direction: column;
 | 
				
			||||||
 | 
					  align-items: flex-start;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.chat-message-user > .chat-message-container {
 | 
				
			||||||
 | 
					  align-items: flex-end;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.chat-message-avatar {
 | 
				
			||||||
 | 
					  margin-top: 20px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.chat-message-status {
 | 
				
			||||||
 | 
					  font-size: 12px;
 | 
				
			||||||
 | 
					  color: #aaa;
 | 
				
			||||||
 | 
					  line-height: 1.5;
 | 
				
			||||||
 | 
					  margin-top: 5px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.chat-message-item {
 | 
				
			||||||
 | 
					  box-sizing: border-box;
 | 
				
			||||||
 | 
					  max-width: 100%;
 | 
				
			||||||
 | 
					  margin-top: 10px;
 | 
				
			||||||
 | 
					  border-radius: 10px;
 | 
				
			||||||
 | 
					  background-color: rgba(0, 0, 0, 0.05);
 | 
				
			||||||
 | 
					  padding: 10px;
 | 
				
			||||||
 | 
					  font-size: 14px;
 | 
				
			||||||
 | 
					  user-select: text;
 | 
				
			||||||
 | 
					  word-break: break-word;
 | 
				
			||||||
 | 
					  border: var(--border-in-light);
 | 
				
			||||||
 | 
					  position: relative;
 | 
				
			||||||
 | 
					  transition: all ease 0.3s;
 | 
				
			||||||
 | 
					  min-width: 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  &:hover {
 | 
				
			||||||
 | 
					    min-width: 300px;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .chat-message-actions {
 | 
				
			||||||
 | 
					      height: 40px;
 | 
				
			||||||
 | 
					      opacity: 1;
 | 
				
			||||||
 | 
					      transform: translateY(0px);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .chat-message-actions {
 | 
				
			||||||
 | 
					    display: flex;
 | 
				
			||||||
 | 
					    width: 100%;
 | 
				
			||||||
 | 
					    padding-top: 5px;
 | 
				
			||||||
 | 
					    box-sizing: border-box;
 | 
				
			||||||
 | 
					    font-size: 12px;
 | 
				
			||||||
 | 
					    align-items: flex-end;
 | 
				
			||||||
 | 
					    justify-content: space-between;
 | 
				
			||||||
 | 
					    transition: all ease 0.3s;
 | 
				
			||||||
 | 
					    transform: translateY(10px);
 | 
				
			||||||
 | 
					    opacity: 0;
 | 
				
			||||||
 | 
					    height: 0;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .chat-message-action-date {
 | 
				
			||||||
 | 
					    color: var(--black);
 | 
				
			||||||
 | 
					    opacity: 0.3;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.chat-message-user > .chat-message-container > .chat-message-item {
 | 
				
			||||||
 | 
					  background-color: var(--second);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  &:hover {
 | 
				
			||||||
 | 
					    min-width: 0;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.chat-input-panel {
 | 
				
			||||||
 | 
					  position: relative;
 | 
				
			||||||
 | 
					  width: 100%;
 | 
				
			||||||
 | 
					  padding: 20px;
 | 
				
			||||||
 | 
					  padding-top: 10px;
 | 
				
			||||||
 | 
					  box-sizing: border-box;
 | 
				
			||||||
 | 
					  flex-direction: column;
 | 
				
			||||||
 | 
					  border-top-left-radius: 10px;
 | 
				
			||||||
 | 
					  border-top-right-radius: 10px;
 | 
				
			||||||
 | 
					  border-top: var(--border-in-light);
 | 
				
			||||||
 | 
					  box-shadow: var(--card-shadow);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@mixin single-line {
 | 
				
			||||||
 | 
					  white-space: nowrap;
 | 
				
			||||||
 | 
					  overflow: hidden;
 | 
				
			||||||
 | 
					  text-overflow: ellipsis;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.prompt-hints {
 | 
				
			||||||
 | 
					  min-height: 20px;
 | 
				
			||||||
 | 
					  width: 100%;
 | 
				
			||||||
 | 
					  max-height: 50vh;
 | 
				
			||||||
 | 
					  overflow: auto;
 | 
				
			||||||
 | 
					  display: flex;
 | 
				
			||||||
 | 
					  flex-direction: column-reverse;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  background-color: var(--white);
 | 
				
			||||||
 | 
					  border: var(--border-in-light);
 | 
				
			||||||
 | 
					  border-radius: 10px;
 | 
				
			||||||
 | 
					  margin-bottom: 10px;
 | 
				
			||||||
 | 
					  box-shadow: var(--shadow);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .prompt-hint {
 | 
				
			||||||
 | 
					    color: var(--black);
 | 
				
			||||||
 | 
					    padding: 6px 10px;
 | 
				
			||||||
 | 
					    animation: slide-in ease 0.3s;
 | 
				
			||||||
 | 
					    cursor: pointer;
 | 
				
			||||||
 | 
					    transition: all ease 0.3s;
 | 
				
			||||||
 | 
					    border: transparent 1px solid;
 | 
				
			||||||
 | 
					    margin: 4px;
 | 
				
			||||||
 | 
					    border-radius: 8px;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    &:not(:last-child) {
 | 
				
			||||||
 | 
					      margin-top: 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .hint-title {
 | 
				
			||||||
 | 
					      font-size: 12px;
 | 
				
			||||||
 | 
					      font-weight: bolder;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @include single-line();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    .hint-content {
 | 
				
			||||||
 | 
					      font-size: 12px;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @include single-line();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    &-selected,
 | 
				
			||||||
 | 
					    &:hover {
 | 
				
			||||||
 | 
					      border-color: var(--primary);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.chat-input-panel-inner {
 | 
				
			||||||
 | 
					  display: flex;
 | 
				
			||||||
 | 
					  flex: 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.chat-input {
 | 
				
			||||||
 | 
					  height: 100%;
 | 
				
			||||||
 | 
					  width: 100%;
 | 
				
			||||||
 | 
					  border-radius: 10px;
 | 
				
			||||||
 | 
					  border: var(--border-in-light);
 | 
				
			||||||
 | 
					  box-shadow: 0 -2px 5px rgba(0, 0, 0, 0.03);
 | 
				
			||||||
 | 
					  background-color: var(--white);
 | 
				
			||||||
 | 
					  color: var(--black);
 | 
				
			||||||
 | 
					  font-family: inherit;
 | 
				
			||||||
 | 
					  padding: 10px 90px 10px 14px;
 | 
				
			||||||
 | 
					  resize: none;
 | 
				
			||||||
 | 
					  outline: none;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.chat-input:focus {
 | 
				
			||||||
 | 
					  border: 1px solid var(--primary);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.chat-input-send {
 | 
				
			||||||
 | 
					  background-color: var(--primary);
 | 
				
			||||||
 | 
					  color: white;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  position: absolute;
 | 
				
			||||||
 | 
					  right: 30px;
 | 
				
			||||||
 | 
					  bottom: 32px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@media only screen and (max-width: 600px) {
 | 
				
			||||||
 | 
					  .chat-input {
 | 
				
			||||||
 | 
					    font-size: 16px;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .chat-input-send {
 | 
				
			||||||
 | 
					    bottom: 30px;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,6 +21,7 @@ import MinIcon from "../icons/min.svg";
 | 
				
			|||||||
import ResetIcon from "../icons/reload.svg";
 | 
					import ResetIcon from "../icons/reload.svg";
 | 
				
			||||||
import BreakIcon from "../icons/break.svg";
 | 
					import BreakIcon from "../icons/break.svg";
 | 
				
			||||||
import SettingsIcon from "../icons/chat-settings.svg";
 | 
					import SettingsIcon from "../icons/chat-settings.svg";
 | 
				
			||||||
 | 
					import DeleteIcon from "../icons/clear.svg";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import LightIcon from "../icons/light.svg";
 | 
					import LightIcon from "../icons/light.svg";
 | 
				
			||||||
import DarkIcon from "../icons/dark.svg";
 | 
					import DarkIcon from "../icons/dark.svg";
 | 
				
			||||||
@@ -57,8 +58,7 @@ import { Prompt, usePromptStore } from "../store/prompt";
 | 
				
			|||||||
import Locale from "../locales";
 | 
					import Locale from "../locales";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { IconButton } from "./button";
 | 
					import { IconButton } from "./button";
 | 
				
			||||||
import styles from "./home.module.scss";
 | 
					import styles from "./chat.module.scss";
 | 
				
			||||||
import chatStyle from "./chat.module.scss";
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { ListItem, Modal } from "./ui-lib";
 | 
					import { ListItem, Modal } from "./ui-lib";
 | 
				
			||||||
import { useLocation, useNavigate } from "react-router-dom";
 | 
					import { useLocation, useNavigate } from "react-router-dom";
 | 
				
			||||||
@@ -148,15 +148,15 @@ function PromptToast(props: {
 | 
				
			|||||||
  const context = session.mask.context;
 | 
					  const context = session.mask.context;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <div className={chatStyle["prompt-toast"]} key="prompt-toast">
 | 
					    <div className={styles["prompt-toast"]} key="prompt-toast">
 | 
				
			||||||
      {props.showToast && (
 | 
					      {props.showToast && (
 | 
				
			||||||
        <div
 | 
					        <div
 | 
				
			||||||
          className={chatStyle["prompt-toast-inner"] + " clickable"}
 | 
					          className={styles["prompt-toast-inner"] + " clickable"}
 | 
				
			||||||
          role="button"
 | 
					          role="button"
 | 
				
			||||||
          onClick={() => props.setShowModal(true)}
 | 
					          onClick={() => props.setShowModal(true)}
 | 
				
			||||||
        >
 | 
					        >
 | 
				
			||||||
          <BrainIcon />
 | 
					          <BrainIcon />
 | 
				
			||||||
          <span className={chatStyle["prompt-toast-content"]}>
 | 
					          <span className={styles["prompt-toast-content"]}>
 | 
				
			||||||
            {Locale.Context.Toast(context.length)}
 | 
					            {Locale.Context.Toast(context.length)}
 | 
				
			||||||
          </span>
 | 
					          </span>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
@@ -270,17 +270,15 @@ function ClearContextDivider() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <div
 | 
					    <div
 | 
				
			||||||
      className={chatStyle["clear-context"]}
 | 
					      className={styles["clear-context"]}
 | 
				
			||||||
      onClick={() =>
 | 
					      onClick={() =>
 | 
				
			||||||
        chatStore.updateCurrentSession(
 | 
					        chatStore.updateCurrentSession(
 | 
				
			||||||
          (session) => (session.clearContextIndex = undefined),
 | 
					          (session) => (session.clearContextIndex = undefined),
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    >
 | 
					    >
 | 
				
			||||||
      <div className={chatStyle["clear-context-tips"]}>
 | 
					      <div className={styles["clear-context-tips"]}>{Locale.Context.Clear}</div>
 | 
				
			||||||
        {Locale.Context.Clear}
 | 
					      <div className={styles["clear-context-revert-btn"]}>
 | 
				
			||||||
      </div>
 | 
					 | 
				
			||||||
      <div className={chatStyle["clear-context-revert-btn"]}>
 | 
					 | 
				
			||||||
        {Locale.Context.Revert}
 | 
					        {Locale.Context.Revert}
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
@@ -316,7 +314,7 @@ function ChatAction(props: {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <div
 | 
					    <div
 | 
				
			||||||
      className={`${chatStyle["chat-input-action"]} clickable`}
 | 
					      className={`${styles["chat-input-action"]} clickable`}
 | 
				
			||||||
      onClick={() => {
 | 
					      onClick={() => {
 | 
				
			||||||
        props.onClick();
 | 
					        props.onClick();
 | 
				
			||||||
        setTimeout(updateWidth, 1);
 | 
					        setTimeout(updateWidth, 1);
 | 
				
			||||||
@@ -328,10 +326,10 @@ function ChatAction(props: {
 | 
				
			|||||||
        } as React.CSSProperties
 | 
					        } as React.CSSProperties
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    >
 | 
					    >
 | 
				
			||||||
      <div ref={iconRef} className={chatStyle["icon"]}>
 | 
					      <div ref={iconRef} className={styles["icon"]}>
 | 
				
			||||||
        {props.icon}
 | 
					        {props.icon}
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
      <div className={chatStyle["text"]} ref={textRef}>
 | 
					      <div className={styles["text"]} ref={textRef}>
 | 
				
			||||||
        {props.text}
 | 
					        {props.text}
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
@@ -400,7 +398,7 @@ export function ChatActions(props: {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <div className={chatStyle["chat-input-actions"]}>
 | 
					    <div className={styles["chat-input-actions"]}>
 | 
				
			||||||
      {couldStop && (
 | 
					      {couldStop && (
 | 
				
			||||||
        <ChatAction
 | 
					        <ChatAction
 | 
				
			||||||
          onClick={stopAll}
 | 
					          onClick={stopAll}
 | 
				
			||||||
@@ -880,40 +878,6 @@ export function Chat() {
 | 
				
			|||||||
                    </div>
 | 
					                    </div>
 | 
				
			||||||
                  )}
 | 
					                  )}
 | 
				
			||||||
                  <div className={styles["chat-message-item"]}>
 | 
					                  <div className={styles["chat-message-item"]}>
 | 
				
			||||||
                    {showActions && (
 | 
					 | 
				
			||||||
                      <div className={styles["chat-message-top-actions"]}>
 | 
					 | 
				
			||||||
                        {message.streaming ? (
 | 
					 | 
				
			||||||
                          <div
 | 
					 | 
				
			||||||
                            className={styles["chat-message-top-action"]}
 | 
					 | 
				
			||||||
                            onClick={() => onUserStop(message.id ?? i)}
 | 
					 | 
				
			||||||
                          >
 | 
					 | 
				
			||||||
                            {Locale.Chat.Actions.Stop}
 | 
					 | 
				
			||||||
                          </div>
 | 
					 | 
				
			||||||
                        ) : (
 | 
					 | 
				
			||||||
                          <>
 | 
					 | 
				
			||||||
                            <div
 | 
					 | 
				
			||||||
                              className={styles["chat-message-top-action"]}
 | 
					 | 
				
			||||||
                              onClick={() => onDelete(message.id ?? i)}
 | 
					 | 
				
			||||||
                            >
 | 
					 | 
				
			||||||
                              {Locale.Chat.Actions.Delete}
 | 
					 | 
				
			||||||
                            </div>
 | 
					 | 
				
			||||||
                            <div
 | 
					 | 
				
			||||||
                              className={styles["chat-message-top-action"]}
 | 
					 | 
				
			||||||
                              onClick={() => onResend(message.id ?? i)}
 | 
					 | 
				
			||||||
                            >
 | 
					 | 
				
			||||||
                              {Locale.Chat.Actions.Retry}
 | 
					 | 
				
			||||||
                            </div>
 | 
					 | 
				
			||||||
                          </>
 | 
					 | 
				
			||||||
                        )}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                        <div
 | 
					 | 
				
			||||||
                          className={styles["chat-message-top-action"]}
 | 
					 | 
				
			||||||
                          onClick={() => copyToClipboard(message.content)}
 | 
					 | 
				
			||||||
                        >
 | 
					 | 
				
			||||||
                          {Locale.Chat.Actions.Copy}
 | 
					 | 
				
			||||||
                        </div>
 | 
					 | 
				
			||||||
                      </div>
 | 
					 | 
				
			||||||
                    )}
 | 
					 | 
				
			||||||
                    <Markdown
 | 
					                    <Markdown
 | 
				
			||||||
                      content={message.content}
 | 
					                      content={message.content}
 | 
				
			||||||
                      loading={
 | 
					                      loading={
 | 
				
			||||||
@@ -929,14 +893,50 @@ export function Chat() {
 | 
				
			|||||||
                      parentRef={scrollRef}
 | 
					                      parentRef={scrollRef}
 | 
				
			||||||
                      defaultShow={i >= messages.length - 10}
 | 
					                      defaultShow={i >= messages.length - 10}
 | 
				
			||||||
                    />
 | 
					                    />
 | 
				
			||||||
                  </div>
 | 
					
 | 
				
			||||||
                  {!isUser && !message.preview && (
 | 
					                    {showActions && (
 | 
				
			||||||
                    <div className={styles["chat-message-actions"]}>
 | 
					                      <div className={styles["chat-message-actions"]}>
 | 
				
			||||||
                      <div className={styles["chat-message-action-date"]}>
 | 
					                        <div
 | 
				
			||||||
                        {message.date.toLocaleString()}
 | 
					                          className={styles["chat-input-actions"]}
 | 
				
			||||||
 | 
					                          style={{
 | 
				
			||||||
 | 
					                            marginTop: 10,
 | 
				
			||||||
 | 
					                            marginBottom: 0,
 | 
				
			||||||
 | 
					                          }}
 | 
				
			||||||
 | 
					                        >
 | 
				
			||||||
 | 
					                          {message.streaming ? (
 | 
				
			||||||
 | 
					                            <ChatAction
 | 
				
			||||||
 | 
					                              text={Locale.Chat.Actions.Stop}
 | 
				
			||||||
 | 
					                              icon={<StopIcon />}
 | 
				
			||||||
 | 
					                              onClick={() => onUserStop(message.id ?? i)}
 | 
				
			||||||
 | 
					                            />
 | 
				
			||||||
 | 
					                          ) : (
 | 
				
			||||||
 | 
					                            <>
 | 
				
			||||||
 | 
					                              <ChatAction
 | 
				
			||||||
 | 
					                                text={Locale.Chat.Actions.Delete}
 | 
				
			||||||
 | 
					                                icon={<DeleteIcon />}
 | 
				
			||||||
 | 
					                                onClick={() => onDelete(message.id ?? i)}
 | 
				
			||||||
 | 
					                              />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                              <ChatAction
 | 
				
			||||||
 | 
					                                text={Locale.Chat.Actions.Retry}
 | 
				
			||||||
 | 
					                                icon={<ResetIcon />}
 | 
				
			||||||
 | 
					                                onClick={() => onResend(message.id ?? i)}
 | 
				
			||||||
 | 
					                              />
 | 
				
			||||||
 | 
					                            </>
 | 
				
			||||||
 | 
					                          )}
 | 
				
			||||||
 | 
					                          <ChatAction
 | 
				
			||||||
 | 
					                            text={Locale.Chat.Actions.Copy}
 | 
				
			||||||
 | 
					                            icon={<CopyIcon />}
 | 
				
			||||||
 | 
					                            onClick={() => copyToClipboard(message.content)}
 | 
				
			||||||
 | 
					                          />
 | 
				
			||||||
 | 
					                        </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        <div className={styles["chat-message-action-date"]}>
 | 
				
			||||||
 | 
					                          {message.date.toLocaleString()}
 | 
				
			||||||
 | 
					                        </div>
 | 
				
			||||||
                      </div>
 | 
					                      </div>
 | 
				
			||||||
                    </div>
 | 
					                    )}
 | 
				
			||||||
                  )}
 | 
					                  </div>
 | 
				
			||||||
                </div>
 | 
					                </div>
 | 
				
			||||||
              </div>
 | 
					              </div>
 | 
				
			||||||
              {shouldShowClearContextDivider && <ClearContextDivider />}
 | 
					              {shouldShowClearContextDivider && <ClearContextDivider />}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -313,243 +313,6 @@
 | 
				
			|||||||
  margin-right: 15px;
 | 
					  margin-right: 15px;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.chat {
 | 
					 | 
				
			||||||
  display: flex;
 | 
					 | 
				
			||||||
  flex-direction: column;
 | 
					 | 
				
			||||||
  position: relative;
 | 
					 | 
				
			||||||
  height: 100%;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.chat-body {
 | 
					 | 
				
			||||||
  flex: 1;
 | 
					 | 
				
			||||||
  overflow: auto;
 | 
					 | 
				
			||||||
  padding: 20px;
 | 
					 | 
				
			||||||
  padding-bottom: 40px;
 | 
					 | 
				
			||||||
  position: relative;
 | 
					 | 
				
			||||||
  overscroll-behavior: none;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.chat-body-title {
 | 
					 | 
				
			||||||
  cursor: pointer;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  &:hover {
 | 
					 | 
				
			||||||
    text-decoration: underline;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.chat-message {
 | 
					 | 
				
			||||||
  display: flex;
 | 
					 | 
				
			||||||
  flex-direction: row;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  &:last-child {
 | 
					 | 
				
			||||||
    animation: slide-in ease 0.3s;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.chat-message-user {
 | 
					 | 
				
			||||||
  display: flex;
 | 
					 | 
				
			||||||
  flex-direction: row-reverse;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.chat-message-container {
 | 
					 | 
				
			||||||
  max-width: var(--message-max-width);
 | 
					 | 
				
			||||||
  display: flex;
 | 
					 | 
				
			||||||
  flex-direction: column;
 | 
					 | 
				
			||||||
  align-items: flex-start;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  &:hover {
 | 
					 | 
				
			||||||
    .chat-message-top-actions {
 | 
					 | 
				
			||||||
      opacity: 1;
 | 
					 | 
				
			||||||
      transform: translateX(10px);
 | 
					 | 
				
			||||||
      pointer-events: all;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.chat-message-user > .chat-message-container {
 | 
					 | 
				
			||||||
  align-items: flex-end;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.chat-message-avatar {
 | 
					 | 
				
			||||||
  margin-top: 20px;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.chat-message-status {
 | 
					 | 
				
			||||||
  font-size: 12px;
 | 
					 | 
				
			||||||
  color: #aaa;
 | 
					 | 
				
			||||||
  line-height: 1.5;
 | 
					 | 
				
			||||||
  margin-top: 5px;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.chat-message-item {
 | 
					 | 
				
			||||||
  box-sizing: border-box;
 | 
					 | 
				
			||||||
  max-width: 100%;
 | 
					 | 
				
			||||||
  margin-top: 10px;
 | 
					 | 
				
			||||||
  border-radius: 10px;
 | 
					 | 
				
			||||||
  background-color: rgba(0, 0, 0, 0.05);
 | 
					 | 
				
			||||||
  padding: 10px;
 | 
					 | 
				
			||||||
  font-size: 14px;
 | 
					 | 
				
			||||||
  user-select: text;
 | 
					 | 
				
			||||||
  word-break: break-word;
 | 
					 | 
				
			||||||
  border: var(--border-in-light);
 | 
					 | 
				
			||||||
  position: relative;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.chat-message-top-actions {
 | 
					 | 
				
			||||||
  min-width: 120px;
 | 
					 | 
				
			||||||
  font-size: 12px;
 | 
					 | 
				
			||||||
  position: absolute;
 | 
					 | 
				
			||||||
  right: 20px;
 | 
					 | 
				
			||||||
  top: -26px;
 | 
					 | 
				
			||||||
  left: 30px;
 | 
					 | 
				
			||||||
  transition: all ease 0.3s;
 | 
					 | 
				
			||||||
  opacity: 0;
 | 
					 | 
				
			||||||
  pointer-events: none;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  display: flex;
 | 
					 | 
				
			||||||
  flex-direction: row-reverse;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .chat-message-top-action {
 | 
					 | 
				
			||||||
    opacity: 0.5;
 | 
					 | 
				
			||||||
    color: var(--black);
 | 
					 | 
				
			||||||
    white-space: nowrap;
 | 
					 | 
				
			||||||
    cursor: pointer;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    &:hover {
 | 
					 | 
				
			||||||
      opacity: 1;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    &:not(:first-child) {
 | 
					 | 
				
			||||||
      margin-right: 10px;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.chat-message-user > .chat-message-container > .chat-message-item {
 | 
					 | 
				
			||||||
  background-color: var(--second);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.chat-message-actions {
 | 
					 | 
				
			||||||
  display: flex;
 | 
					 | 
				
			||||||
  flex-direction: row-reverse;
 | 
					 | 
				
			||||||
  width: 100%;
 | 
					 | 
				
			||||||
  padding-top: 5px;
 | 
					 | 
				
			||||||
  box-sizing: border-box;
 | 
					 | 
				
			||||||
  font-size: 12px;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.chat-message-action-date {
 | 
					 | 
				
			||||||
  color: #aaa;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.chat-input-panel {
 | 
					 | 
				
			||||||
  position: relative;
 | 
					 | 
				
			||||||
  width: 100%;
 | 
					 | 
				
			||||||
  padding: 20px;
 | 
					 | 
				
			||||||
  padding-top: 10px;
 | 
					 | 
				
			||||||
  box-sizing: border-box;
 | 
					 | 
				
			||||||
  flex-direction: column;
 | 
					 | 
				
			||||||
  border-top-left-radius: 10px;
 | 
					 | 
				
			||||||
  border-top-right-radius: 10px;
 | 
					 | 
				
			||||||
  border-top: var(--border-in-light);
 | 
					 | 
				
			||||||
  box-shadow: var(--card-shadow);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@mixin single-line {
 | 
					 | 
				
			||||||
  white-space: nowrap;
 | 
					 | 
				
			||||||
  overflow: hidden;
 | 
					 | 
				
			||||||
  text-overflow: ellipsis;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.prompt-hints {
 | 
					 | 
				
			||||||
  min-height: 20px;
 | 
					 | 
				
			||||||
  width: 100%;
 | 
					 | 
				
			||||||
  max-height: 50vh;
 | 
					 | 
				
			||||||
  overflow: auto;
 | 
					 | 
				
			||||||
  display: flex;
 | 
					 | 
				
			||||||
  flex-direction: column-reverse;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  background-color: var(--white);
 | 
					 | 
				
			||||||
  border: var(--border-in-light);
 | 
					 | 
				
			||||||
  border-radius: 10px;
 | 
					 | 
				
			||||||
  margin-bottom: 10px;
 | 
					 | 
				
			||||||
  box-shadow: var(--shadow);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .prompt-hint {
 | 
					 | 
				
			||||||
    color: var(--black);
 | 
					 | 
				
			||||||
    padding: 6px 10px;
 | 
					 | 
				
			||||||
    animation: slide-in ease 0.3s;
 | 
					 | 
				
			||||||
    cursor: pointer;
 | 
					 | 
				
			||||||
    transition: all ease 0.3s;
 | 
					 | 
				
			||||||
    border: transparent 1px solid;
 | 
					 | 
				
			||||||
    margin: 4px;
 | 
					 | 
				
			||||||
    border-radius: 8px;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    &:not(:last-child) {
 | 
					 | 
				
			||||||
      margin-top: 0;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    .hint-title {
 | 
					 | 
				
			||||||
      font-size: 12px;
 | 
					 | 
				
			||||||
      font-weight: bolder;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      @include single-line();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    .hint-content {
 | 
					 | 
				
			||||||
      font-size: 12px;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      @include single-line();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    &-selected,
 | 
					 | 
				
			||||||
    &:hover {
 | 
					 | 
				
			||||||
      border-color: var(--primary);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.chat-input-panel-inner {
 | 
					 | 
				
			||||||
  display: flex;
 | 
					 | 
				
			||||||
  flex: 1;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.chat-input {
 | 
					 | 
				
			||||||
  height: 100%;
 | 
					 | 
				
			||||||
  width: 100%;
 | 
					 | 
				
			||||||
  border-radius: 10px;
 | 
					 | 
				
			||||||
  border: var(--border-in-light);
 | 
					 | 
				
			||||||
  box-shadow: 0 -2px 5px rgba(0, 0, 0, 0.03);
 | 
					 | 
				
			||||||
  background-color: var(--white);
 | 
					 | 
				
			||||||
  color: var(--black);
 | 
					 | 
				
			||||||
  font-family: inherit;
 | 
					 | 
				
			||||||
  padding: 10px 90px 10px 14px;
 | 
					 | 
				
			||||||
  resize: none;
 | 
					 | 
				
			||||||
  outline: none;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.chat-input:focus {
 | 
					 | 
				
			||||||
  border: 1px solid var(--primary);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.chat-input-send {
 | 
					 | 
				
			||||||
  background-color: var(--primary);
 | 
					 | 
				
			||||||
  color: white;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  position: absolute;
 | 
					 | 
				
			||||||
  right: 30px;
 | 
					 | 
				
			||||||
  bottom: 32px;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@media only screen and (max-width: 600px) {
 | 
					 | 
				
			||||||
  .chat-input {
 | 
					 | 
				
			||||||
    font-size: 16px;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .chat-input-send {
 | 
					 | 
				
			||||||
    bottom: 30px;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.loading-content {
 | 
					.loading-content {
 | 
				
			||||||
  display: flex;
 | 
					  display: flex;
 | 
				
			||||||
  flex-direction: column;
 | 
					  flex-direction: column;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user