diff --git a/app/components/chat.module.scss b/app/components/chat.module.scss
index 644c917a1..822e0fb78 100644
--- a/app/components/chat.module.scss
+++ b/app/components/chat.module.scss
@@ -3,6 +3,7 @@
.chat-input-actions {
display: flex;
flex-wrap: wrap;
+ margin-bottom: 10px;
.chat-input-action {
display: inline-flex;
@@ -15,7 +16,6 @@
animation: slide-in ease 0.3s;
box-shadow: var(--card-shadow);
transition: all ease 0.3s;
- margin-bottom: 10px;
align-items: center;
height: 16px;
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;
+ }
+}
diff --git a/app/components/chat.tsx b/app/components/chat.tsx
index e1011e422..b959585a4 100644
--- a/app/components/chat.tsx
+++ b/app/components/chat.tsx
@@ -21,6 +21,7 @@ import MinIcon from "../icons/min.svg";
import ResetIcon from "../icons/reload.svg";
import BreakIcon from "../icons/break.svg";
import SettingsIcon from "../icons/chat-settings.svg";
+import DeleteIcon from "../icons/clear.svg";
import LightIcon from "../icons/light.svg";
import DarkIcon from "../icons/dark.svg";
@@ -57,8 +58,7 @@ import { Prompt, usePromptStore } from "../store/prompt";
import Locale from "../locales";
import { IconButton } from "./button";
-import styles from "./home.module.scss";
-import chatStyle from "./chat.module.scss";
+import styles from "./chat.module.scss";
import { ListItem, Modal } from "./ui-lib";
import { useLocation, useNavigate } from "react-router-dom";
@@ -148,15 +148,15 @@ function PromptToast(props: {
const context = session.mask.context;
return (
-
+
{props.showToast && (
props.setShowModal(true)}
>
-
+
{Locale.Context.Toast(context.length)}
@@ -270,17 +270,15 @@ function ClearContextDivider() {
return (
chatStore.updateCurrentSession(
(session) => (session.clearContextIndex = undefined),
)
}
>
-
- {Locale.Context.Clear}
-
-
+
{Locale.Context.Clear}
+
{Locale.Context.Revert}
@@ -316,7 +314,7 @@ function ChatAction(props: {
return (
{
props.onClick();
setTimeout(updateWidth, 1);
@@ -328,10 +326,10 @@ function ChatAction(props: {
} as React.CSSProperties
}
>
-
+
{props.icon}
-
@@ -400,7 +398,7 @@ export function ChatActions(props: {
}
return (
-
+
{couldStop && (
)}
- {showActions && (
-
- {message.streaming ? (
-
onUserStop(message.id ?? i)}
- >
- {Locale.Chat.Actions.Stop}
-
- ) : (
- <>
-
onDelete(message.id ?? i)}
- >
- {Locale.Chat.Actions.Delete}
-
-
onResend(message.id ?? i)}
- >
- {Locale.Chat.Actions.Retry}
-
- >
- )}
-
-
copyToClipboard(message.content)}
- >
- {Locale.Chat.Actions.Copy}
-
-
- )}
= messages.length - 10}
/>
-
- {!isUser && !message.preview && (
-
-
- {message.date.toLocaleString()}
+
+ {showActions && (
+
+
+ {message.streaming ? (
+ }
+ onClick={() => onUserStop(message.id ?? i)}
+ />
+ ) : (
+ <>
+ }
+ onClick={() => onDelete(message.id ?? i)}
+ />
+
+ }
+ onClick={() => onResend(message.id ?? i)}
+ />
+ >
+ )}
+ }
+ onClick={() => copyToClipboard(message.content)}
+ />
+
+
+
+ {message.date.toLocaleString()}
+
-
- )}
+ )}
+
{shouldShowClearContextDivider &&
}
diff --git a/app/components/home.module.scss b/app/components/home.module.scss
index 81916d71b..49ad2bd22 100644
--- a/app/components/home.module.scss
+++ b/app/components/home.module.scss
@@ -313,243 +313,6 @@
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 {
display: flex;
flex-direction: column;