diff --git a/src/renderer/src/Routes.tsx b/src/renderer/src/Routes.tsx index 71b1c163e..e0b274044 100644 --- a/src/renderer/src/Routes.tsx +++ b/src/renderer/src/Routes.tsx @@ -95,7 +95,7 @@ const PageContainer = styled(motion.div)` const pageTransition = { type: 'tween', - duration: 0.2, + duration: 0.25, ease: [0.4, 0.0, 0.2, 1] } diff --git a/src/renderer/src/i18n/locales/en-us.json b/src/renderer/src/i18n/locales/en-us.json index 4a246547a..16b4ec569 100644 --- a/src/renderer/src/i18n/locales/en-us.json +++ b/src/renderer/src/i18n/locales/en-us.json @@ -201,7 +201,6 @@ "message.quote": "Quote", "message.regenerate.model": "Switch Model", "message.useful": "Helpful", - "message.settings": "Settings", "multiple.select": "Multiple Select", "multiple.select.empty": "No Messages Selected", "navigation": { @@ -216,7 +215,7 @@ }, "resend": "Resend", "save": "Save", - "settings.code.title": "Code Settings", + "settings.code.title": "Code Block Settings", "settings.code_editor": { "title": "Code Editor", "highlight_active_line": "Highlight active line", @@ -424,7 +423,8 @@ "pinyin.desc": "Sort by Pinyin (Z-A)" }, "no_results": "No results", - "apps": "Apps" + "apps": "Apps", + "settings": "Settings" }, "docs": { "title": "Docs" @@ -1062,6 +1062,7 @@ "about.updateNotAvailable": "You are using the latest version", "about.website.button": "Website", "about.website.title": "Official Website", + "advanced.auto_switch_to_topics": "Auto switch to topic", "advanced.title": "Advanced Settings", "assistant": "Default Assistant", "assistant.model_params": "Model Parameters", @@ -1275,6 +1276,7 @@ "message_title.use_topic_naming.title": "Use topic naming model to create titles for exported messages", "message_title.use_topic_naming.help": "When enabled, use topic naming model to create titles for exported messages. This will also affect all Markdown export methods." }, + "display.assistant.title": "Assistant Settings", "display.custom.css": "Custom CSS", "display.custom.css.cherrycss": "Get from cherrycss.com", "display.custom.css.placeholder": "/* Put custom CSS here */", @@ -1517,7 +1519,9 @@ "advancedSettings": "Advanced Settings" }, "messages.prompt": "Show prompt", + "messages.tokens": "Show token usage", "messages.divider": "Show divider between messages", + "messages.divider.tooltip": "Not applicable to bubble-style message", "messages.grid_columns": "Message grid display columns", "messages.grid_popover_trigger": "Grid detail trigger", "messages.grid_popover_trigger.click": "Click to display", @@ -1730,6 +1734,9 @@ "theme.window.style.title": "Window Style", "theme.window.style.transparent": "Transparent Window", "title": "Settings", + "topic.position": "Topic position", + "topic.position.left": "Left", + "topic.position.right": "Right", "topic.show.time": "Show topic time", "topic.pin_to_top": "Pin Topics to Top", "tray.onclose": "Minimize to Tray on Close", diff --git a/src/renderer/src/i18n/locales/ja-jp.json b/src/renderer/src/i18n/locales/ja-jp.json index 45bae14e7..b3e61ad0c 100644 --- a/src/renderer/src/i18n/locales/ja-jp.json +++ b/src/renderer/src/i18n/locales/ja-jp.json @@ -201,7 +201,6 @@ "message.quote": "引用", "message.regenerate.model": "モデルを切り替え", "message.useful": "役立つ", - "message.settings": "設定", "multiple.select": "選択", "multiple.select.empty": "メッセージが選択されていません", "navigation": { @@ -424,7 +423,8 @@ "pinyin.desc": "ピンインで降順ソート" }, "no_results": "検索結果なし", - "apps": "アプリ" + "apps": "アプリ", + "settings": "設定" }, "docs": { "title": "ドキュメント" @@ -1060,6 +1060,7 @@ "about.updateNotAvailable": "最新バージョンを使用しています", "about.website.button": "ウェブサイト", "about.website.title": "公式ウェブサイト", + "advanced.auto_switch_to_topics": "トピックに自動的に切り替える", "advanced.title": "詳細設定", "assistant": "デフォルトアシスタント", "assistant.model_params": "モデルパラメータ", @@ -1273,6 +1274,7 @@ "notion.export_reasoning.title": "エクスポート時に思考チェーンを含める", "notion.export_reasoning.help": "有効にすると、Notionにエクスポートする際に思考チェーンの内容が含まれます。" }, + "display.assistant.title": "アシスタント設定", "display.custom.css": "カスタムCSS", "display.custom.css.cherrycss": "cherrycss.comから取得", "display.custom.css.placeholder": "/* ここにカスタムCSSを入力 */", @@ -1511,7 +1513,9 @@ "advancedSettings": "詳細設定" }, "messages.prompt": "プロンプト表示", + "messages.tokens": "トークン使用量を表示", "messages.divider": "メッセージ間に区切り線を表示", + "messages.divider.tooltip": "バブルスタイルのメッセージには適用されません", "messages.grid_columns": "メッセージグリッドの表示列数", "messages.grid_popover_trigger": "グリッド詳細トリガー", "messages.grid_popover_trigger.click": "クリックで表示", @@ -1718,6 +1722,9 @@ "theme.window.style.title": "ウィンドウスタイル", "theme.window.style.transparent": "透明ウィンドウ", "title": "設定", + "topic.position": "トピックの位置", + "topic.position.left": "左", + "topic.position.right": "右", "topic.show.time": "トピックの時間を表示", "topic.pin_to_top": "固定トピックを上部に表示", "tray.onclose": "閉じるときにトレイに最小化", diff --git a/src/renderer/src/i18n/locales/ru-ru.json b/src/renderer/src/i18n/locales/ru-ru.json index 19caafa5b..615df6478 100644 --- a/src/renderer/src/i18n/locales/ru-ru.json +++ b/src/renderer/src/i18n/locales/ru-ru.json @@ -201,7 +201,6 @@ "message.quote": "Цитата", "message.regenerate.model": "Переключить модель", "message.useful": "Полезно", - "message.settings": "Настройки", "multiple.select": "Множественный выбор", "multiple.select.empty": "Ничего не выбрано", "navigation": { @@ -424,7 +423,8 @@ "pinyin.desc": "Сортировать по пиньинь (Я-А)" }, "no_results": "Результатов не найдено", - "apps": "Приложения" + "apps": "Приложения", + "settings": "Настройки" }, "docs": { "title": "Документация" @@ -1060,6 +1060,7 @@ "about.updateNotAvailable": "Вы используете последнюю версию", "about.website.button": "Сайт", "about.website.title": "Официальный сайт", + "advanced.auto_switch_to_topics": "Автоматически переключаться на топик", "advanced.title": "Расширенные настройки", "assistant": "Ассистент по умолчанию", "assistant.model_params": "Параметры модели", @@ -1273,6 +1274,7 @@ "message_title.use_topic_naming.title": "Использовать модель именования тем для создания заголовков сообщений", "message_title.use_topic_naming.help": "Этот параметр влияет на все методы экспорта в Markdown, такие как Notion, Yuque и т.д." }, + "display.assistant.title": "Настройки ассистентов", "display.custom.css": "Пользовательский CSS", "display.custom.css.cherrycss": "Получить из cherrycss.com", "display.custom.css.placeholder": "/* Здесь введите пользовательский CSS */", @@ -1511,7 +1513,9 @@ "advancedSettings": "Расширенные настройки" }, "messages.prompt": "Показывать подсказки", + "messages.tokens": "Показать использование токенов", "messages.divider": "Показывать разделитель между сообщениями", + "messages.divider.tooltip": "Не применимо к сообщениям в стиле пузырей", "messages.grid_columns": "Количество столбцов сетки сообщений", "messages.grid_popover_trigger": "Триггер для отображения подробной информации в сетке", "messages.grid_popover_trigger.click": "Нажатие для отображения", @@ -1718,6 +1722,9 @@ "theme.window.style.title": "Стиль окна", "theme.window.style.transparent": "Прозрачное окно", "title": "Настройки", + "topic.position": "Позиция топиков", + "topic.position.left": "Слева", + "topic.position.right": "Справа", "topic.show.time": "Показывать время топика", "topic.pin_to_top": "Закрепленные топики сверху", "tray.onclose": "Свернуть в трей при закрытии", diff --git a/src/renderer/src/i18n/locales/zh-cn.json b/src/renderer/src/i18n/locales/zh-cn.json index 64dd191d0..f7e0248dd 100644 --- a/src/renderer/src/i18n/locales/zh-cn.json +++ b/src/renderer/src/i18n/locales/zh-cn.json @@ -218,7 +218,6 @@ "message.new.context": "清除上下文", "message.quote": "引用", "message.regenerate.model": "切换模型", - "message.settings": "设置", "message.useful": "有用", "multiple.select": "多选", "multiple.select.empty": "未选中任何消息", @@ -234,7 +233,7 @@ }, "resend": "重新发送", "save": "保存", - "settings.code.title": "代码设置", + "settings.code.title": "代码块设置", "settings.code_editor": { "title": "代码编辑器", "highlight_active_line": "高亮当前行", @@ -424,7 +423,8 @@ "pinyin.desc": "按拼音降序" }, "no_results": "无结果", - "apps": "应用" + "apps": "应用", + "settings": "设置" }, "docs": { "title": "帮助文档" @@ -1062,6 +1062,7 @@ "about.updateNotAvailable": "你的软件已是最新版本", "about.website.button": "查看", "about.website.title": "官方网站", + "advanced.auto_switch_to_topics": "自动切换到话题", "advanced.title": "高级设置", "assistant": "默认助手", "assistant.model_params": "模型参数", @@ -1275,6 +1276,7 @@ "new_folder.button": "新建文件夹" } }, + "display.assistant.title": "助手设置", "display.custom.css": "自定义 CSS", "display.custom.css.cherrycss": "从 cherrycss.com 获取", "display.custom.css.placeholder": "/* 这里写自定义CSS */", @@ -1517,7 +1519,9 @@ "advancedSettings": "高级设置" }, "messages.prompt": "显示提示词", + "messages.tokens": "显示Token用量", "messages.divider": "消息分割线", + "messages.divider.tooltip": "不适用于气泡样式消息", "messages.grid_columns": "消息网格展示列数", "messages.grid_popover_trigger": "网格详情触发", "messages.grid_popover_trigger.click": "点击显示", @@ -1730,6 +1734,9 @@ "theme.window.style.title": "窗口样式", "theme.window.style.transparent": "透明窗口", "title": "设置", + "topic.position": "话题位置", + "topic.position.left": "左侧", + "topic.position.right": "右侧", "topic.show.time": "显示话题时间", "topic.pin_to_top": "固定话题置顶", "tray.onclose": "关闭时最小化到托盘", diff --git a/src/renderer/src/i18n/locales/zh-tw.json b/src/renderer/src/i18n/locales/zh-tw.json index 42cb03ebb..4b8b02767 100644 --- a/src/renderer/src/i18n/locales/zh-tw.json +++ b/src/renderer/src/i18n/locales/zh-tw.json @@ -201,7 +201,6 @@ "message.quote": "引用", "message.regenerate.model": "切換模型", "message.useful": "有用", - "message.settings": "設定", "multiple.select": "多選", "multiple.select.empty": "未選中任何訊息", "navigation": { @@ -216,7 +215,7 @@ }, "resend": "重新傳送", "save": "儲存", - "settings.code.title": "程式碼設定", + "settings.code.title": "程式碼區塊", "settings.code_editor": { "title": "程式碼編輯器", "highlight_active_line": "高亮當前行", @@ -424,7 +423,8 @@ "pinyin.desc": "按拼音降序" }, "no_results": "沒有結果", - "apps": "應用" + "apps": "應用", + "settings": "設定" }, "docs": { "title": "說明文件" @@ -1062,6 +1062,7 @@ "about.updateNotAvailable": "您正在使用最新版本", "about.website.button": "網站", "about.website.title": "官方網站", + "advanced.auto_switch_to_topics": "自動切換到話題", "advanced.title": "進階設定", "assistant": "預設助手", "assistant.model_params": "模型參數", @@ -1275,6 +1276,7 @@ "message_title.use_topic_naming.title": "使用話題命名模型為導出的消息創建標題", "message_title.use_topic_naming.help": "此設定會影響所有通過Markdown導出的方式,如Notion、語雀等" }, + "display.assistant.title": "助手設定", "display.custom.css": "自訂 CSS", "display.custom.css.cherrycss": "從 cherrycss.com 取得", "display.custom.css.placeholder": "/* 這裡寫自訂 CSS */", @@ -1514,7 +1516,9 @@ "advancedSettings": "高級設定" }, "messages.prompt": "提示詞顯示", + "messages.tokens": "Token用量顯示", "messages.divider": "訊息間顯示分隔線", + "messages.divider.tooltip": "不適用於氣泡樣式消息", "messages.grid_columns": "訊息網格展示列數", "messages.grid_popover_trigger": "網格詳細資訊觸發", "messages.grid_popover_trigger.click": "點選顯示", @@ -1721,6 +1725,9 @@ "theme.window.style.title": "視窗樣式", "theme.window.style.transparent": "透明視窗", "title": "設定", + "topic.position": "話題位置", + "topic.position.left": "左側", + "topic.position.right": "右側", "topic.show.time": "顯示話題時間", "topic.pin_to_top": "固定話題置頂", "tray.onclose": "關閉時最小化到系统匣", diff --git a/src/renderer/src/i18n/translate/el-gr.json b/src/renderer/src/i18n/translate/el-gr.json index 4362777ee..7d60a58e3 100644 --- a/src/renderer/src/i18n/translate/el-gr.json +++ b/src/renderer/src/i18n/translate/el-gr.json @@ -918,6 +918,7 @@ "about.updateNotAvailable": "Το λογισμικό σας είναι ήδη στην πιο πρόσφατη έκδοση", "about.website.button": "Προβολή", "about.website.title": "Ιστοσελίδα", + "advanced.auto_switch_to_topics": "Αυτόματη μετάβαση σε θέματα", "advanced.title": "Ρυθμίσεις Ανώτερου Νiveau", "assistant": "Πρόεδρος Υπηρεσίας", "assistant.model_params": "Παράμετροι Μοντέλου", @@ -1124,6 +1125,7 @@ "message_title.use_topic_naming.title": "Δημιουργία τίτλων μηνυμάτων χρησιμοποιώντας μοντέλο ονομασίας θεμάτων", "message_title.use_topic_naming.help": "Όταν είναι ενεργό, δημιουργεί τίτλους για τα μηνύματα που εξάγονται χρησιμοποιώντας μοντέλο ονομασίας θεμάτων. Αυτό επηρεάζει επίσης όλες τις μεθόδους εξαγωγής μέσω Markdown." }, + "display.assistant.title": "Ρυθμίσεις Υπηρεσίας", "display.custom.css": "Προσαρμοστική CSS", "display.custom.css.cherrycss": "Λήψη από cherrycss.com", "display.custom.css.placeholder": "/* Γράψτε εδώ την προσαρμοστική CSS */", @@ -1303,6 +1305,7 @@ "advancedSettings": "Προχωρημένες Ρυθμίσεις" }, "messages.divider": "Διαχωριστική γραμμή μηνυμάτων", + "messages.divider.tooltip": "Δεν ισχύει για μηνύματα με στυλ φυσαλίδας", "messages.grid_columns": "Αριθμός στήλων γριλ μηνυμάτων", "messages.grid_popover_trigger": "Καταγραφή στοιχείων στο grid", "messages.grid_popover_trigger.click": "Εμφάνιση κλικ", @@ -1484,6 +1487,9 @@ "theme.window.style.title": "Στυλ παραθύρων", "theme.window.style.transparent": "Διαφανή παράθυρα", "title": "Ρυθμίσεις", + "topic.position": "Θέση θεμάτων", + "topic.position.left": "Αριστερά", + "topic.position.right": "Δεξιά", "topic.show.time": "Εμφάνιση ώρας θέματος", "tray.onclose": "Μειωμένο στη συνδρομή κατά την κλεισιά", "tray.show": "Εμφάνιση εικονιδίου συνδρομής", @@ -1606,6 +1612,7 @@ "assistant.icon.type.none": "Κανένα", "general.auto_check_update.title": "Αυτόματη ενημέρωση", "input.show_translate_confirm": "Εμφάνιση παραθύρου επιβεβαίωσης μετάφρασης", + "messages.prompt": "Λήμμα προτροπής", "messages.input.enable_quick_triggers": "Ενεργοποίηση των '/' και '@' για γρήγορη πρόσβαση σε μενού", "messages.input.enable_delete_model": "Ενεργοποίηση διαγραφής μοντέλων/επισυναπτόμενων αρχείων με το πλήκτρο διαγραφής", "messages.math_engine.none": "Κανένα", diff --git a/src/renderer/src/i18n/translate/es-es.json b/src/renderer/src/i18n/translate/es-es.json index f6323c749..b3083a93b 100644 --- a/src/renderer/src/i18n/translate/es-es.json +++ b/src/renderer/src/i18n/translate/es-es.json @@ -919,6 +919,7 @@ "about.updateNotAvailable": "Tu software ya está actualizado", "about.website.button": "Ver", "about.website.title": "Sitio web oficial", + "advanced.auto_switch_to_topics": "Cambiar automáticamente a temas", "advanced.title": "Configuración avanzada", "assistant": "Asistente predeterminado", "assistant.model_params": "Parámetros del modelo", @@ -1123,6 +1124,7 @@ "message_title.use_topic_naming.title": "Usar el modelo de nombramiento temático para crear títulos de mensajes exportados", "message_title.use_topic_naming.help": "Al activarlo, se utilizará el modelo de nombramiento temático para generar títulos de mensajes exportados. Esta opción también afectará a todos los métodos de exportación mediante Markdown." }, + "display.assistant.title": "Configuración del asistente", "display.custom.css": "CSS personalizado", "display.custom.css.cherrycss": "Obtener desde cherrycss.com", "display.custom.css.placeholder": "/* Escribe tu CSS personalizado aquí */", @@ -1302,6 +1304,7 @@ "advancedSettings": "Configuración avanzada" }, "messages.divider": "Separador de mensajes", + "messages.divider.tooltip": "No aplicable para mensajes de estilo burbuja", "messages.grid_columns": "Número de columnas en la cuadrícula de mensajes", "messages.grid_popover_trigger": "Desencadenante de detalles de cuadrícula", "messages.grid_popover_trigger.click": "Mostrar al hacer clic", @@ -1483,6 +1486,9 @@ "theme.window.style.title": "Estilo de ventana", "theme.window.style.transparent": "Ventana transparente", "title": "Configuración", + "topic.position": "Posición del tema", + "topic.position.left": "Izquierda", + "topic.position.right": "Derecha", "topic.show.time": "Mostrar tiempo del tema", "tray.onclose": "Minimizar a la bandeja al cerrar", "tray.show": "Mostrar bandera del sistema", @@ -1605,6 +1611,7 @@ "assistant.icon.type.none": "No mostrar", "general.auto_check_update.title": "Actualización automática", "input.show_translate_confirm": "Mostrar diálogo de confirmación de traducción", + "messages.prompt": "Palabra de indicación", "messages.input.enable_quick_triggers": "Habilitar menú rápido con '/' y '@'", "messages.input.enable_delete_model": "Habilitar la eliminación con la tecla de borrado para modelos/archivos adjuntos introducidos", "messages.math_engine.none": "Ninguno", diff --git a/src/renderer/src/i18n/translate/fr-fr.json b/src/renderer/src/i18n/translate/fr-fr.json index 0289043f5..0718050d0 100644 --- a/src/renderer/src/i18n/translate/fr-fr.json +++ b/src/renderer/src/i18n/translate/fr-fr.json @@ -918,6 +918,7 @@ "about.updateNotAvailable": "Votre logiciel est déjà à jour", "about.website.button": "Visiter le site web", "about.website.title": "Site web officiel", + "advanced.auto_switch_to_topics": "Basculer automatiquement vers les sujets", "advanced.title": "Paramètres avancés", "assistant": "Assistant par défaut", "assistant.model_params": "Paramètres du modèle", @@ -1124,6 +1125,7 @@ "message_title.use_topic_naming.title": "Utiliser le modèle de dénomination thématique pour créer les titres des messages exportés", "message_title.use_topic_naming.help": "Lorsque cette option est activée, le modèle de dénomination thématique sera utilisé pour créer les titres des messages exportés. Cette option affectera également toutes les méthodes d'exportation au format Markdown." }, + "display.assistant.title": "Paramètres de l'assistant", "display.custom.css": "CSS personnalisé", "display.custom.css.cherrycss": "Obtenir depuis cherrycss.com", "display.custom.css.placeholder": "/* Écrire votre CSS personnalisé ici */", @@ -1303,6 +1305,7 @@ "advancedSettings": "Расширенные настройки" }, "messages.divider": "Séparateur de messages", + "messages.divider.tooltip": "Non applicable aux messages de style bulle", "messages.grid_columns": "Nombre de colonnes de la grille de messages", "messages.grid_popover_trigger": "Déclencheur de popover de la grille", "messages.grid_popover_trigger.click": "Afficher au clic", @@ -1484,6 +1487,9 @@ "theme.window.style.title": "Style de fenêtre", "theme.window.style.transparent": "Fenêtre transparente", "title": "Paramètres", + "topic.position": "Position du sujet", + "topic.position.left": "Gauche", + "topic.position.right": "Droite", "topic.show.time": "Afficher l'heure du sujet", "tray.onclose": "Minimiser dans la barre d'état système lors de la fermeture", "tray.show": "Afficher l'icône dans la barre d'état système", @@ -1606,6 +1612,7 @@ "assistant.icon.type.none": "Ne pas afficher", "general.auto_check_update.title": "Mise à jour automatique", "input.show_translate_confirm": "Afficher la boîte de dialogue de confirmation de traduction", + "messages.prompt": "Mot-clé d'affichage", "messages.input.enable_quick_triggers": "Activer les menus rapides avec '/' et '@'", "messages.input.enable_delete_model": "Activer la touche Supprimer pour effacer le modèle/pièce jointe saisie", "messages.math_engine.none": "Aucun", diff --git a/src/renderer/src/i18n/translate/pt-pt.json b/src/renderer/src/i18n/translate/pt-pt.json index bf491168d..146e8d305 100644 --- a/src/renderer/src/i18n/translate/pt-pt.json +++ b/src/renderer/src/i18n/translate/pt-pt.json @@ -919,6 +919,7 @@ "about.updateNotAvailable": "Seu software já está atualizado", "about.website.button": "Ver", "about.website.title": "Site oficial", + "advanced.auto_switch_to_topics": "Alternar automaticamente para tópicos", "advanced.title": "Configurações avançadas", "assistant": "Assistente padrão", "assistant.model_params": "Parâmetros do modelo", @@ -1125,6 +1126,7 @@ "message_title.use_topic_naming.title": "Usar modelo de nomeação por tópico para criar títulos das mensagens exportadas", "message_title.use_topic_naming.help": "Ativando esta opção, será usado um modelo de nomeação por tópico para criar os títulos das mensagens exportadas. Esta configuração também afetará todas as formas de exportação feitas por meio de Markdown." }, + "display.assistant.title": "Configurações do assistente", "display.custom.css": "CSS personalizado", "display.custom.css.cherrycss": "Obter do cherrycss.com", "display.custom.css.placeholder": "/* Escreva seu CSS personalizado aqui */", @@ -1304,6 +1306,7 @@ "advancedSettings": "Configurações Avançadas" }, "messages.divider": "Divisor de mensagens", + "messages.divider.tooltip": "Não aplicável a mensagens de estilo bolha", "messages.grid_columns": "Número de colunas da grade de mensagens", "messages.grid_popover_trigger": "Disparador de detalhes da grade", "messages.grid_popover_trigger.click": "Clique para mostrar", @@ -1485,6 +1488,9 @@ "theme.window.style.title": "Estilo de janela", "theme.window.style.transparent": "Janela transparente", "title": "Configurações", + "topic.position": "Posição do tópico", + "topic.position.left": "Esquerda", + "topic.position.right": "Direita", "topic.show.time": "Mostrar tempo do tópico", "tray.onclose": "Minimizar para bandeja ao fechar", "tray.show": "Mostrar ícone de bandeja", @@ -1607,6 +1613,7 @@ "assistant.icon.type.none": "Não mostrar", "general.auto_check_update.title": "Atualização automática", "input.show_translate_confirm": "Mostrar diálogo de confirmação de tradução", + "messages.prompt": "Exibir palavra-chave", "messages.input.enable_quick_triggers": "Ativar menu rápido com '/' e '@'", "messages.input.enable_delete_model": "Ativar tecla de exclusão para remover modelos/anexos inseridos", "messages.math_engine.none": "Nenhum", diff --git a/src/renderer/src/pages/home/ChatNavbar.tsx b/src/renderer/src/pages/home/ChatNavbar.tsx index 169881b2f..0abba62d7 100644 --- a/src/renderer/src/pages/home/ChatNavbar.tsx +++ b/src/renderer/src/pages/home/ChatNavbar.tsx @@ -10,12 +10,11 @@ import { modelGenerating } from '@renderer/hooks/useRuntime' import { useSettings } from '@renderer/hooks/useSettings' import { useShortcut } from '@renderer/hooks/useShortcuts' import { useShowAssistants } from '@renderer/hooks/useStore' -import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' import { useAppDispatch } from '@renderer/store' import { setNarrowMode } from '@renderer/store/settings' import { Tooltip } from 'antd' import { t } from 'i18next' -import { LayoutGrid, MessageSquareDiff, PanelLeft, PanelRight, Search } from 'lucide-react' +import { LayoutGrid, PanelLeft, PanelRight, Search } from 'lucide-react' import { FC } from 'react' import { useNavigate } from 'react-router' import styled from 'styled-components' @@ -43,11 +42,6 @@ const ChatNavbar: FC = () => { - - EventEmitter.emit(EVENT_NAMES.ADD_NEW_TOPIC)}> - - - toggleShowAssistants()}> {showAssistants ? : } @@ -89,12 +83,11 @@ const NavbarContainer = styled.div<{ $isFullscreen: boolean; $showSidebar: boole max-height: var(--navbar-height); min-height: var(--navbar-height); justify-content: space-between; - margin-left: ${({ $showSidebar }) => ($showSidebar ? '-37px' : isMac ? '75px' : '10px')}; + margin-left: ${({ $showSidebar }) => ($showSidebar ? '15px' : isMac ? '75px' : '15px')}; font-weight: bold; color: var(--color-text-1); - padding-right: ${({ $isFullscreen }) => ($isFullscreen ? '12px' : isWindows ? '140px' : isLinux ? '120px' : '12px')}; + padding-right: ${({ $isFullscreen }) => ($isFullscreen ? '15px' : isWindows ? '140px' : isLinux ? '120px' : '15px')}; -webkit-app-region: drag; - transition: margin-left 0.3s; ` export const NavbarIcon = styled.div` diff --git a/src/renderer/src/pages/home/HomePage.tsx b/src/renderer/src/pages/home/HomePage.tsx index 146898b74..5ca3b07f0 100644 --- a/src/renderer/src/pages/home/HomePage.tsx +++ b/src/renderer/src/pages/home/HomePage.tsx @@ -40,6 +40,9 @@ const Container = styled.div` const ContentContainer = styled.div` overflow: hidden; + display: flex; + flex: 1; + flex-direction: row; ` export default HomePage diff --git a/src/renderer/src/pages/home/MainSidebar/MainNavbar.tsx b/src/renderer/src/pages/home/MainSidebar/MainNavbar.tsx index 693e813df..68797d580 100644 --- a/src/renderer/src/pages/home/MainSidebar/MainNavbar.tsx +++ b/src/renderer/src/pages/home/MainSidebar/MainNavbar.tsx @@ -1,8 +1,9 @@ import SearchPopup from '@renderer/components/Popups/SearchPopup' import { isMac } from '@renderer/config/constant' +import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' import { Tooltip } from 'antd' import { t } from 'i18next' -import { Search } from 'lucide-react' +import { MessageSquareDiff, Search } from 'lucide-react' import { FC } from 'react' import styled from 'styled-components' @@ -20,6 +21,11 @@ const HeaderNavbar: FC = () => { )} + + EventEmitter.emit(EVENT_NAMES.ADD_NEW_TOPIC)}> + + + ) } @@ -35,8 +41,8 @@ const Container = styled.div` min-height: var(--navbar-height); background-color: transparent; -webkit-app-region: drag; - padding: 0 8px; - padding-left: ${isMac ? '75px' : '10px'}; + padding: 0 15px; + padding-left: ${isMac ? '75px' : '15px'}; ` export const NavbarIcon = styled.div` @@ -52,7 +58,7 @@ export const NavbarIcon = styled.div` -webkit-app-region: no-drag; cursor: pointer; &:hover { - background-color: var(--color-background-mute); + background-color: var(--color-list-item); color: var(--color-icon-white); } ` diff --git a/src/renderer/src/pages/home/MainSidebar/MainSidebar.tsx b/src/renderer/src/pages/home/MainSidebar/MainSidebar.tsx index 4fd201cc6..9e737d7a9 100644 --- a/src/renderer/src/pages/home/MainSidebar/MainSidebar.tsx +++ b/src/renderer/src/pages/home/MainSidebar/MainSidebar.tsx @@ -9,13 +9,12 @@ import { useSettings } from '@renderer/hooks/useSettings' import { useShortcut } from '@renderer/hooks/useShortcuts' import { useShowAssistants } from '@renderer/hooks/useStore' import i18n from '@renderer/i18n' -import AssistantItem from '@renderer/pages/home/Tabs/components/AssistantItem' import { getAssistantById } from '@renderer/services/AssistantService' import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' import { ThemeMode } from '@renderer/types' import { isEmoji } from '@renderer/utils' import { Avatar, Dropdown } from 'antd' -import { AnimatePresence, motion } from 'framer-motion' +import { AnimatePresence } from 'framer-motion' import { Blocks, ChevronDown, @@ -39,7 +38,9 @@ import { useTranslation } from 'react-i18next' import { useLocation, useNavigate } from 'react-router-dom' import styled from 'styled-components' -import Tabs from '../../../pages/home/Tabs' +import AssistantsTab from '../Tabs/AssistantsTab' +import AssistantItem from '../Tabs/components/AssistantItem' +import TopicsTab from '../Tabs/TopicsTab' import MainNavbar from './MainNavbar' import { Container, @@ -69,7 +70,7 @@ const MainSidebar: FC = () => { const location = useLocation() const { pathname } = location - const { activeAssistant, activeTopic, setActiveAssistant, setActiveTopic } = useChat() + const { activeAssistant, activeTopic, setActiveAssistant } = useChat() const { showTopics } = useSettings() const { openMinapp } = useMinappPopup() @@ -145,6 +146,10 @@ const MainSidebar: FC = () => { }) } + if (!showAssistants) { + return null + } + return ( { {isAppMenuExpanded && ( - - - {appMenuItems.map((item) => ( - navigate(item.path)}> - - {item.icon} - {item.text} - - - ))} - - - + + {appMenuItems.map((item) => ( + navigate(item.path)}> + + {item.icon} + {item.text} + + + ))} + + )} @@ -211,13 +210,22 @@ const MainSidebar: FC = () => { )} - + + {/* + setTab('assistants')}> + {t('assistants.title')} + + setTab('topic')}> + {t('common.topics')} + + */} + {tab === 'assistants' && } + {tab === 'topic' && } + + UserPopup.show()}> {isEmoji(avatar) ? ( @@ -283,11 +291,53 @@ const ThemeIcon = () => { ) } +const MainContainer = styled.div` + display: flex; + flex: 1; + flex-direction: column; + overflow: hidden; + height: 0; + min-height: 0; +` + const AssistantContainer = styled.div` margin: 0 10px; margin-top: 4px; + margin-bottom: 4px; + display: flex; ` +// const TabContainer = styled.div` +// display: flex; +// flex: 1; +// flex-direction: row; +// height: 32px; +// max-height: 32px; +// min-height: 32px; +// border-radius: 8px; +// border: 0.5px solid var(--color-border); +// margin: 5px 10px 8px 10px; +// overflow: hidden; +// ` + +// const TabItem = styled.div<{ active: boolean }>` +// display: flex; +// flex: 1; +// flex-direction: column; +// justify-content: center; +// align-items: center; +// cursor: pointer; +// background-color: ${({ active }) => (active ? 'var(--color-list-item)' : 'transparent')}; +// &:hover { +// background-color: var(--color-list-item); +// } +// ` + +// const TabItemText = styled.div` +// font-size: 14px; +// font-weight: 500; +// ` + const UserMenu = styled.div` display: flex; flex-direction: row; diff --git a/src/renderer/src/pages/home/MainSidebar/MainSidebarStyles.tsx b/src/renderer/src/pages/home/MainSidebar/MainSidebarStyles.tsx index 7bc38f32d..2c8e97e42 100644 --- a/src/renderer/src/pages/home/MainSidebar/MainSidebarStyles.tsx +++ b/src/renderer/src/pages/home/MainSidebar/MainSidebarStyles.tsx @@ -48,11 +48,11 @@ export const MainMenuItemText = styled.div` export const Container = styled.div` display: flex; flex-direction: column; + flex: 1; width: var(--assistants-width); max-width: var(--assistants-width); border-right: 0.5px solid var(--color-border); height: 100vh; - transition: all 0.3s; ` export const MainMenu = styled.div` diff --git a/src/renderer/src/pages/home/Messages/MessageMenubar.tsx b/src/renderer/src/pages/home/Messages/MessageMenubar.tsx index 4512a7bb3..e27193912 100644 --- a/src/renderer/src/pages/home/Messages/MessageMenubar.tsx +++ b/src/renderer/src/pages/home/Messages/MessageMenubar.tsx @@ -195,10 +195,10 @@ const MessageMenubar: FC = (props) => { } }, { - label: t('chat.message.settings'), + label: t('common.settings'), key: 'message-settings', icon: , - onClick: () => MessageSettingsPopup.show({ title: t('chat.message.settings') }) + onClick: () => MessageSettingsPopup.show({ title: t('common.settings') }) }, { label: t('chat.topics.export.title'), diff --git a/src/renderer/src/pages/home/Tabs/AssistantsTab.tsx b/src/renderer/src/pages/home/Tabs/AssistantsTab.tsx index 812acfab6..9c7aa42f0 100644 --- a/src/renderer/src/pages/home/Tabs/AssistantsTab.tsx +++ b/src/renderer/src/pages/home/Tabs/AssistantsTab.tsx @@ -1,11 +1,14 @@ import { DownOutlined, PlusOutlined, RightOutlined } from '@ant-design/icons' import { Draggable, Droppable, DropResult } from '@hello-pangea/dnd' import DragableList from '@renderer/components/DragableList' +import AddAssistantPopup from '@renderer/components/Popups/AddAssistantPopup' import Scrollbar from '@renderer/components/Scrollbar' -import { useAssistants } from '@renderer/hooks/useAssistant' +import { useAssistants, useDefaultAssistant } from '@renderer/hooks/useAssistant' +import { useChat } from '@renderer/hooks/useChat' import { useAssistantsTabSortType } from '@renderer/hooks/useStore' import { useTags } from '@renderer/hooks/useTags' import { Assistant, AssistantsSortType } from '@renderer/types' +import { uuid } from '@renderer/utils' import { Tooltip } from 'antd' import { FC, useCallback, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -13,18 +16,8 @@ import styled from 'styled-components' import AssistantItem from './components/AssistantItem' -interface AssistantsTabProps { - activeAssistant: Assistant - setActiveAssistant: (assistant: Assistant) => void - onCreateAssistant: () => void - onCreateDefaultAssistant: () => void -} -const Assistants: FC = ({ - activeAssistant, - setActiveAssistant, - onCreateAssistant, - onCreateDefaultAssistant -}) => { +const Assistants: FC = () => { + const { activeAssistant, setActiveAssistant } = useChat() const { assistants, removeAssistant, addAssistant, updateAssistants } = useAssistants() const [dragging, setDragging] = useState(false) const [collapsedTags, setCollapsedTags] = useState>({}) @@ -32,6 +25,18 @@ const Assistants: FC = ({ const { getGroupedAssistants, allTags, updateTagsOrder } = useTags() const { assistantsTabSortType = 'list', setAssistantsTabSortType } = useAssistantsTabSortType() const containerRef = useRef(null) + const { defaultAssistant } = useDefaultAssistant() + + const onCreateAssistant = async () => { + const assistant = await AddAssistantPopup.show() + assistant && setActiveAssistant(assistant) + } + + const onCreateDefaultAssistant = useCallback(() => { + const assistant = { ...defaultAssistant, id: uuid() } + addAssistant(assistant) + setActiveAssistant(assistant) + }, [addAssistant, defaultAssistant, setActiveAssistant]) const onDelete = useCallback( (assistant: Assistant) => { diff --git a/src/renderer/src/pages/home/Tabs/TopicsTab.tsx b/src/renderer/src/pages/home/Tabs/TopicsTab.tsx index f39b834b0..2a95d3090 100644 --- a/src/renderer/src/pages/home/Tabs/TopicsTab.tsx +++ b/src/renderer/src/pages/home/Tabs/TopicsTab.tsx @@ -15,6 +15,7 @@ import PromptPopup from '@renderer/components/Popups/PromptPopup' import Scrollbar from '@renderer/components/Scrollbar' import { isMac } from '@renderer/config/constant' import { useAssistant, useAssistants, useTopicsForAssistant } from '@renderer/hooks/useAssistant' +import { useChat } from '@renderer/hooks/useChat' import { modelGenerating } from '@renderer/hooks/useRuntime' import { useSettings } from '@renderer/hooks/useSettings' import { finishTopicRenaming, startTopicRenaming, TopicManager } from '@renderer/hooks/useTopic' @@ -24,7 +25,7 @@ import store from '@renderer/store' import { RootState } from '@renderer/store' import { setGenerating } from '@renderer/store/runtime' import { Assistant, Topic } from '@renderer/types' -import { removeSpecialCharactersForFileName } from '@renderer/utils' +import { classNames, removeSpecialCharactersForFileName } from '@renderer/utils' import { copyTopicAsMarkdown, copyTopicAsPlainText } from '@renderer/utils/copy' import { exportMarkdownToJoplin, @@ -44,19 +45,18 @@ import { useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' import styled from 'styled-components' -interface Props { - assistant: Assistant - activeTopic: Topic - setActiveTopic: (topic: Topic) => void +interface TopicsTabProps { + style?: React.CSSProperties } -const Topics: FC = ({ assistant: _assistant, activeTopic, setActiveTopic }) => { +const Topics: FC = ({ style }) => { + const { activeAssistant, activeTopic, setActiveTopic } = useChat() const { assistants } = useAssistants() - const { assistant, removeTopic, moveTopic, updateTopic, updateTopics } = useAssistant(_assistant.id) + const { assistant, removeTopic, moveTopic, updateTopic, updateTopics } = useAssistant(activeAssistant.id) const { t } = useTranslation() - const { showTopicTime, pinTopicsToTop } = useSettings() + const { showTopicTime, pinTopicsToTop, topicPosition } = useSettings() - const topics = useTopicsForAssistant(_assistant.id) + const topics = useTopicsForAssistant(activeAssistant.id) const renamingTopics = useSelector((state: RootState) => state.runtime.chat.renamingTopics) const newlyRenamedTopics = useSelector((state: RootState) => state.runtime.chat.newlyRenamedTopics) @@ -69,6 +69,7 @@ const Topics: FC = ({ assistant: _assistant, activeTopic, setActiveTopic const pendingTopics = useMemo(() => { return new Set() }, []) + const isPending = useCallback( (topicId: string) => { const hasPending = hasTopicPendingRequests(topicId) @@ -432,7 +433,7 @@ const Topics: FC = ({ assistant: _assistant, activeTopic, setActiveTopic return ( - + {(topic) => { const isActive = topic.id === activeTopic?.id @@ -449,7 +450,7 @@ const Topics: FC = ({ assistant: _assistant, activeTopic, setActiveTopic return ( setTargetTopic(topic)} - className={isActive ? 'active' : ''} + className={classNames('topic-item', { active: isActive })} onClick={() => onSwitchTopic(topic)} style={{ borderRadius }}> {isPending(topic.id) && !isActive && } @@ -513,6 +514,17 @@ const Container = styled(Scrollbar)` display: flex; flex-direction: column; padding: 10px; + max-height: calc(100vh - var(--navbar-height)); + min-width: var(--assistant-width); + &.right { + border-right: 0.5px solid var(--color-border); + .topic-item:hover { + background-color: var(--color-background-soft); + } + .topic-item.active { + background-color: var(--color-background-mute); + } + } ` const TopicListItem = styled.div` diff --git a/src/renderer/src/pages/home/Tabs/components/AssistantItem.tsx b/src/renderer/src/pages/home/Tabs/components/AssistantItem.tsx index 512f8e092..0d22443f1 100644 --- a/src/renderer/src/pages/home/Tabs/components/AssistantItem.tsx +++ b/src/renderer/src/pages/home/Tabs/components/AssistantItem.tsx @@ -60,7 +60,7 @@ const AssistantItem: FC = ({ const { t } = useTranslation() const { allTags } = useTags() const { removeAllTopics } = useAssistant(assistant.id) - const { assistantIconType, setAssistantIconType } = useSettings() + const { assistantIconType, setAssistantIconType, topicPosition } = useSettings() const defaultModel = getDefaultModel() const { assistants, updateAssistants } = useAssistants() @@ -128,9 +128,16 @@ const AssistantItem: FC = ({ return } - EventEmitter.emit(EVENT_NAMES.SWITCH_TOPIC_SIDEBAR) + if (topicPosition === 'left') { + EventEmitter.emit(EVENT_NAMES.SHOW_TOPIC_SIDEBAR) + } + + if (singleLine) { + EventEmitter.emit(EVENT_NAMES.SWITCH_TOPIC_SIDEBAR) + } + onSwitch(assistant) - }, [isMenuOpen, onSwitch, assistant]) + }, [isMenuOpen, topicPosition, singleLine, onSwitch, assistant]) const assistantName = useMemo(() => assistant.name || t('chat.default.name'), [assistant.name, t]) const fullAssistantName = useMemo( diff --git a/src/renderer/src/pages/home/Tabs/index.tsx b/src/renderer/src/pages/home/Tabs/index.tsx deleted file mode 100644 index 3eef50981..000000000 --- a/src/renderer/src/pages/home/Tabs/index.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import AddAssistantPopup from '@renderer/components/Popups/AddAssistantPopup' -import { useAssistants, useDefaultAssistant } from '@renderer/hooks/useAssistant' -import { Assistant, Topic } from '@renderer/types' -import { uuid } from '@renderer/utils' -import { FC } from 'react' -import styled from 'styled-components' - -import Assistants from './AssistantsTab' -import Topics from './TopicsTab' - -interface Props { - tab: Tab - activeAssistant: Assistant - activeTopic: Topic - setActiveAssistant: (assistant: Assistant) => void - setActiveTopic: (topic: Topic) => void - style?: React.CSSProperties -} - -type Tab = 'assistants' | 'topic' - -const HomeTabs: FC = ({ tab, activeAssistant, activeTopic, setActiveAssistant, setActiveTopic, style }) => { - const { addAssistant } = useAssistants() - const { defaultAssistant } = useDefaultAssistant() - - const onCreateAssistant = async () => { - const assistant = await AddAssistantPopup.show() - assistant && setActiveAssistant(assistant) - } - - const onCreateDefaultAssistant = () => { - const assistant = { ...defaultAssistant, id: uuid() } - addAssistant(assistant) - setActiveAssistant(assistant) - } - - return ( - - - {tab === 'assistants' && ( - - )} - {tab === 'topic' && ( - - )} - - - ) -} - -const Container = styled.div` - display: flex; - flex: 1; - flex-direction: column; - max-width: var(--assistants-width); - min-width: var(--assistants-width); - background-color: transparent; - overflow: hidden; - .collapsed { - width: 0; - border-left: none; - } -` - -const TabContent = styled.div` - display: flex; - flex: 1; - flex-direction: column; - overflow-y: auto; - overflow-x: hidden; -` - -export default HomeTabs diff --git a/src/renderer/src/pages/settings/DisplaySettings/DisplaySettings.tsx b/src/renderer/src/pages/settings/DisplaySettings/DisplaySettings.tsx index 0a26c03c1..48c8dcbe9 100644 --- a/src/renderer/src/pages/settings/DisplaySettings/DisplaySettings.tsx +++ b/src/renderer/src/pages/settings/DisplaySettings/DisplaySettings.tsx @@ -1,13 +1,16 @@ import { SyncOutlined } from '@ant-design/icons' import CodeEditor from '@renderer/components/CodeEditor' import { HStack } from '@renderer/components/Layout' -import { THEME_COLOR_PRESETS } from '@renderer/config/constant' +import { isMac, THEME_COLOR_PRESETS } from '@renderer/config/constant' import { useTheme } from '@renderer/context/ThemeProvider' import { useSettings } from '@renderer/hooks/useSettings' import useUserTheme from '@renderer/hooks/useUserTheme' import { useAppDispatch } from '@renderer/store' import { + AssistantIconType, DEFAULT_SIDEBAR_ICONS, + setAssistantIconType, + setClickAssistantToShowTopic, setCustomCss, setPinTopicsToTop, setShowTopicTime, @@ -51,7 +54,20 @@ const ColorCircle = styled.div<{ color: string; isActive?: boolean }>` ` const DisplaySettings: FC = () => { - const { showTopicTime, pinTopicsToTop, customCss, sidebarIcons, setTheme, userTheme } = useSettings() + const { + windowStyle, + setWindowStyle, + topicPosition, + setTopicPosition, + clickAssistantToShowTopic, + showTopicTime, + pinTopicsToTop, + customCss, + sidebarIcons, + setTheme, + assistantIconType, + userTheme + } = useSettings() const { theme, settedTheme } = useTheme() const { t } = useTranslation() const dispatch = useAppDispatch() @@ -61,6 +77,13 @@ const DisplaySettings: FC = () => { const [visibleIcons, setVisibleIcons] = useState(sidebarIcons?.visible || DEFAULT_SIDEBAR_ICONS) const [disabledIcons, setDisabledIcons] = useState(sidebarIcons?.disabled || []) + const handleWindowStyleChange = useCallback( + (checked: boolean) => { + setWindowStyle(checked ? 'transparent' : 'opaque') + }, + [setWindowStyle] + ) + const handleColorPrimaryChange = useCallback( (colorHex: string) => { setUserTheme({ @@ -135,6 +158,15 @@ const DisplaySettings: FC = () => { setCurrentZoom(zoomFactor) } + const assistantIconTypeOptions = useMemo( + () => [ + { value: 'model', label: t('settings.assistant.icon.type.model') }, + { value: 'emoji', label: t('settings.assistant.icon.type.emoji') }, + { value: 'none', label: t('settings.assistant.icon.type.none') } + ], + [t] + ) + return ( @@ -164,7 +196,7 @@ const DisplaySettings: FC = () => { value={userTheme.colorPrimary} onChange={(color) => handleColorPrimaryChange(color.toHexString())} showText - size="small" + style={{ width: '110px' }} presets={[ { label: 'Presets', @@ -174,6 +206,15 @@ const DisplaySettings: FC = () => { /> + {isMac && ( + <> + + + {t('settings.theme.window.style.transparent')} + + + + )} {t('settings.display.zoom.title')} @@ -181,15 +222,13 @@ const DisplaySettings: FC = () => { {t('settings.zoom.title')} -