mirror of
https://github.com/GitbookIO/gitbook.git
synced 2026-09-12 05:48:57 +00:00
Make the AI Assistant panel resizable (#4330)
This commit is contained in:
@@ -31,9 +31,11 @@ import { ScrollContainer } from '../primitives/ScrollContainer';
|
||||
import { SideSheet } from '../primitives/SideSheet';
|
||||
import { AIChatControl } from './AIChatControl';
|
||||
import { AIChatControlButton } from './AIChatControlButton';
|
||||
import { AIChatExpandButton } from './AIChatExpandButton';
|
||||
import { AIChatIcon } from './AIChatIcon';
|
||||
import { AIChatInput } from './AIChatInput';
|
||||
import { AIChatMessages } from './AIChatMessages';
|
||||
import { AIChatResizeHandle } from './AIChatResizeHandle';
|
||||
import AIChatSuggestedQuestions from './AIChatSuggestedQuestions';
|
||||
|
||||
export function AIChat() {
|
||||
@@ -85,9 +87,10 @@ export function AIChat() {
|
||||
withOverlay={true}
|
||||
data-ai-chat
|
||||
className={tcls(
|
||||
'ai-chat mx-auto ml-8 not-hydrated:hidden w-96 transition-[width] duration-300 ease-quint lg:max-xl:w-80'
|
||||
'ai-chat mx-auto ml-8 not-hydrated:hidden w-96 transition-[width] duration-300 ease-quint lg:w-(--ai-chat-width)'
|
||||
)}
|
||||
>
|
||||
<AIChatResizeHandle />
|
||||
<EmbeddableFrame className="relative w-full shrink-0 border-tint-subtle border-l to-tint-base">
|
||||
<EmbeddableFrameMain data-testid="ai-chat" aria-busy={chat.loading}>
|
||||
<EmbeddableFrameHeader className="not-embed:px-4">
|
||||
@@ -100,6 +103,7 @@ export function AIChat() {
|
||||
</EmbeddableFrameHeaderMain>
|
||||
<EmbeddableFrameButtons>
|
||||
<AIChatControlButton />
|
||||
<AIChatExpandButton />
|
||||
<Button
|
||||
onClick={() => chatController.close()}
|
||||
iconOnly
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
'use client';
|
||||
|
||||
import { tString, useLanguage } from '@/intl/client';
|
||||
import { Icon } from '@gitbook/icons';
|
||||
import { Button } from '../primitives';
|
||||
import { useAIChatWidthStore, useIsAIChatMaxWidth } from './useAIChatWidthStore';
|
||||
|
||||
export function AIChatExpandButton() {
|
||||
const language = useLanguage();
|
||||
const toggleWidth = useAIChatWidthStore((state) => state.toggleWidth);
|
||||
const isMaxWidth = useIsAIChatMaxWidth();
|
||||
|
||||
return (
|
||||
<Button
|
||||
onClick={toggleWidth}
|
||||
iconOnly
|
||||
icon={
|
||||
<Icon
|
||||
icon={
|
||||
isMaxWidth
|
||||
? 'arrow-down-left-and-arrow-up-right-to-center'
|
||||
: 'arrow-up-right-and-arrow-down-left-from-center'
|
||||
}
|
||||
className="scale-90"
|
||||
/>
|
||||
}
|
||||
label={tString(
|
||||
language,
|
||||
isMaxWidth ? 'ai_chat_collapse_panel' : 'ai_chat_expand_panel'
|
||||
)}
|
||||
variant="blank"
|
||||
className="max-lg:hidden"
|
||||
/>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
'use client';
|
||||
|
||||
import { tcls } from '@/lib/tailwind';
|
||||
import React from 'react';
|
||||
import { useAIChatWidthStore } from './useAIChatWidthStore';
|
||||
|
||||
function setResizing(active: boolean) {
|
||||
document.documentElement.dataset.aiChatResizing = String(active);
|
||||
}
|
||||
|
||||
export function AIChatResizeHandle() {
|
||||
const setWidth = useAIChatWidthStore((state) => state.setWidth);
|
||||
const frameRef = React.useRef<number | null>(null);
|
||||
const widthRef = React.useRef(0);
|
||||
|
||||
React.useEffect(() => {
|
||||
const onResize = () => useAIChatWidthStore.getState().syncWidth();
|
||||
window.addEventListener('resize', onResize);
|
||||
return () => {
|
||||
window.removeEventListener('resize', onResize);
|
||||
if (frameRef.current !== null) {
|
||||
cancelAnimationFrame(frameRef.current);
|
||||
}
|
||||
setResizing(false);
|
||||
};
|
||||
}, []);
|
||||
|
||||
const stopResizing = (event: React.PointerEvent<HTMLDivElement>) => {
|
||||
if (event.currentTarget.hasPointerCapture(event.pointerId)) {
|
||||
event.currentTarget.releasePointerCapture(event.pointerId);
|
||||
}
|
||||
if (frameRef.current !== null) {
|
||||
cancelAnimationFrame(frameRef.current);
|
||||
frameRef.current = null;
|
||||
}
|
||||
setResizing(false);
|
||||
};
|
||||
|
||||
const handlePointerDown = (event: React.PointerEvent<HTMLDivElement>) => {
|
||||
event.preventDefault();
|
||||
event.currentTarget.setPointerCapture(event.pointerId);
|
||||
widthRef.current = useAIChatWidthStore.getState().width;
|
||||
setResizing(true);
|
||||
};
|
||||
|
||||
const handlePointerMove = (event: React.PointerEvent<HTMLDivElement>) => {
|
||||
if (!event.currentTarget.hasPointerCapture(event.pointerId)) {
|
||||
return;
|
||||
}
|
||||
// Panel is right-anchored, so its width is the distance from the cursor to the right edge.
|
||||
widthRef.current = window.innerWidth - event.clientX;
|
||||
if (frameRef.current === null) {
|
||||
frameRef.current = requestAnimationFrame(() => {
|
||||
frameRef.current = null;
|
||||
widthRef.current = setWidth(widthRef.current);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
const handlePointerUp = (event: React.PointerEvent<HTMLDivElement>) => {
|
||||
if (!event.currentTarget.hasPointerCapture(event.pointerId)) {
|
||||
return;
|
||||
}
|
||||
setWidth(widthRef.current);
|
||||
stopResizing(event);
|
||||
};
|
||||
|
||||
return (
|
||||
<div
|
||||
aria-hidden="true"
|
||||
onPointerDown={handlePointerDown}
|
||||
onPointerMove={handlePointerMove}
|
||||
onPointerUp={handlePointerUp}
|
||||
onPointerCancel={stopResizing}
|
||||
className={tcls(
|
||||
'group -translate-x-1/2 absolute inset-y-0 left-0 z-10 hidden w-3 cursor-col-resize touch-none lg:flex',
|
||||
'items-stretch justify-center'
|
||||
)}
|
||||
>
|
||||
<span className="h-full w-px rounded-full bg-transparent transition-all duration-150 ease-out group-hover:w-0.5 group-hover:bg-primary-solid/40 group-active:w-0.5 group-active:bg-primary-solid" />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
'use client';
|
||||
|
||||
import {
|
||||
getLocalStorageItem,
|
||||
removeLocalStorageItem,
|
||||
setLocalStorageItem,
|
||||
} from '@/lib/browser/local-storage';
|
||||
import { create } from 'zustand';
|
||||
import { type StorageValue, persist } from 'zustand/middleware';
|
||||
|
||||
const AI_CHAT_MIN_WIDTH = 384;
|
||||
const AI_CHAT_MAX_WIDTH = 640;
|
||||
const MIN_CONTENT_WIDTH = 720;
|
||||
|
||||
type AIChatWidthStore = {
|
||||
width: number;
|
||||
toggleWidth: () => void;
|
||||
setWidth: (width: number) => number;
|
||||
syncWidth: () => void;
|
||||
};
|
||||
|
||||
type PersistedState = Pick<AIChatWidthStore, 'width'>;
|
||||
|
||||
export const useAIChatWidthStore = create<AIChatWidthStore>()(
|
||||
persist(
|
||||
(set, get) => ({
|
||||
width: AI_CHAT_MIN_WIDTH,
|
||||
toggleWidth: () =>
|
||||
get().setWidth(
|
||||
get().width >= AI_CHAT_MAX_WIDTH ? AI_CHAT_MIN_WIDTH : AI_CHAT_MAX_WIDTH
|
||||
),
|
||||
setWidth: (width) => {
|
||||
const clamped = clampWidth(width);
|
||||
if (get().width !== clamped) {
|
||||
set({ width: clamped });
|
||||
}
|
||||
setWidthOnViewport(clamped);
|
||||
return clamped;
|
||||
},
|
||||
syncWidth: () => setWidthOnViewport(get().width),
|
||||
}),
|
||||
{
|
||||
name: '@gitbook/ai-chat-width',
|
||||
storage: {
|
||||
getItem: (name) =>
|
||||
getLocalStorageItem<StorageValue<PersistedState> | null>(name, null),
|
||||
setItem: (name, value) => setLocalStorageItem(name, value),
|
||||
removeItem: (name) => removeLocalStorageItem(name),
|
||||
},
|
||||
partialize: (state) => ({ width: state.width }),
|
||||
onRehydrateStorage: () => (state) => state?.syncWidth(),
|
||||
}
|
||||
)
|
||||
);
|
||||
|
||||
/**
|
||||
* Whether the panel is at its maximum width.
|
||||
*/
|
||||
export const useIsAIChatMaxWidth = () =>
|
||||
useAIChatWidthStore((state) => state.width >= AI_CHAT_MAX_WIDTH);
|
||||
|
||||
// Hoisted so the synchronous persist rehydrate (during create() above) can call them before this point.
|
||||
function setWidthOnViewport(width: number) {
|
||||
if (typeof document !== 'undefined') {
|
||||
document.documentElement.style.setProperty('--ai-chat-width', `${capToViewport(width)}px`);
|
||||
}
|
||||
}
|
||||
|
||||
function clampWidth(width: number) {
|
||||
return Math.min(AI_CHAT_MAX_WIDTH, Math.max(AI_CHAT_MIN_WIDTH, Math.round(width)));
|
||||
}
|
||||
|
||||
// Cap a width so the remaining content keeps a usable minimum at the current viewport.
|
||||
function capToViewport(width: number) {
|
||||
return typeof window === 'undefined'
|
||||
? width
|
||||
: Math.min(width, Math.max(AI_CHAT_MIN_WIDTH, window.innerWidth - MIN_CONTENT_WIDTH));
|
||||
}
|
||||
@@ -42,7 +42,7 @@ export function AnnouncementBanner(props: {
|
||||
className="theme-bold:bg-header-background pt-4 pb-2"
|
||||
data-nosnippet=""
|
||||
>
|
||||
<div className="transition-all duration-300 motion-reduce:transition-none lg:chat-open:pr-80 xl:chat-open:pr-96">
|
||||
<div className="transition-all duration-300 motion-reduce:transition-none lg:chat-open:pr-(--ai-chat-width)">
|
||||
<div className={tcls('relative', CONTAINER_STYLE)}>
|
||||
<Tag
|
||||
href={contentRef?.href ?? ''}
|
||||
|
||||
@@ -80,8 +80,7 @@ export function CookiesToast(props: { privacyPolicy?: string }) {
|
||||
'max-w-md',
|
||||
'text-balance',
|
||||
'sm:left-auto',
|
||||
'lg:chat-open:mr-80',
|
||||
'xl:chat-open:mr-100',
|
||||
'lg:chat-open:mr-(--ai-chat-width)',
|
||||
'transition-all',
|
||||
'motion-reduce:transition-none',
|
||||
'duration-300',
|
||||
|
||||
@@ -35,7 +35,7 @@ export function Footer(props: { context: GitBookSiteContext }) {
|
||||
mobileOnly ? 'xl:hidden' : null
|
||||
)}
|
||||
>
|
||||
<div className="transition-[padding] duration-300 motion-reduce:transition-none lg:chat-open:pr-80 xl:chat-open:pr-96">
|
||||
<div className="transition-[padding] duration-300 motion-reduce:transition-none lg:chat-open:pr-(--ai-chat-width)">
|
||||
<div
|
||||
className={tcls(
|
||||
CONTAINER_STYLE,
|
||||
|
||||
@@ -75,7 +75,7 @@ export async function Header(props: {
|
||||
'site-header:theme-bold:shadow-tint-12/2'
|
||||
)}
|
||||
>
|
||||
<div className="transition-all duration-300 motion-reduce:transition-none lg:chat-open:pr-80 xl:chat-open:pr-96">
|
||||
<div className="transition-all duration-300 motion-reduce:transition-none lg:chat-open:pr-(--ai-chat-width)">
|
||||
<div
|
||||
data-gb-header-content
|
||||
className={tcls(
|
||||
@@ -206,7 +206,7 @@ export async function Header(props: {
|
||||
</div>
|
||||
|
||||
{visibleSections && withSections ? (
|
||||
<div className="transition-[padding] duration-300 motion-reduce:transition-none lg:chat-open:pr-80 xl:chat-open:pr-96">
|
||||
<div className="transition-[padding] duration-300 motion-reduce:transition-none lg:chat-open:pr-(--ai-chat-width)">
|
||||
<SiteSectionTabs sections={encodeClientSiteSections(context, visibleSections)}>
|
||||
{variants.translations.length > 1 ? (
|
||||
<TranslationsDropdown
|
||||
|
||||
@@ -211,6 +211,7 @@
|
||||
@apply leading-relaxed;
|
||||
interpolate-size: allow-keywords; /* Opt-in for modern browsers to interpolate "auto" values in transitions/animations. */
|
||||
overflow-x: hidden; /* We never want horizontal scroll of the whole page, it looks buggy and we should never have overflow anyway */
|
||||
--ai-chat-width: 24rem; /* Default AI chat panel width (= AI_CHAT_DEFAULT_WIDTH 384px); overridden client-side from local storage. */
|
||||
}
|
||||
|
||||
/* Modern browsers with `scrollbar-*` support */
|
||||
@@ -305,6 +306,15 @@ html.dark {
|
||||
color-scheme: dark light;
|
||||
}
|
||||
|
||||
/** While the AI chat panel is being resized, suppress transitions */
|
||||
html[data-ai-chat-resizing="true"] {
|
||||
cursor: col-resize;
|
||||
user-select: none;
|
||||
}
|
||||
html[data-ai-chat-resizing="true"] * {
|
||||
transition-duration: 0s !important;
|
||||
}
|
||||
|
||||
html.announcement-hidden [data-gb-announcement-banner] {
|
||||
@apply hidden;
|
||||
}
|
||||
|
||||
@@ -135,7 +135,7 @@ export function SpaceLayout(props: SpaceLayoutProps) {
|
||||
) : null}
|
||||
|
||||
{/* Chat panel shifts content left when open */}
|
||||
<div className="motion-safe:transition-all motion-safe:duration-300 lg:chat-open:mr-80 xl:chat-open:mr-96">
|
||||
<div className="motion-safe:transition-all motion-safe:duration-300 lg:chat-open:mr-(--ai-chat-width)">
|
||||
<div
|
||||
className={tcls(
|
||||
'flex',
|
||||
|
||||
@@ -105,6 +105,8 @@ export const ar: TranslationLanguage = {
|
||||
ai_chat_assistant_greeting_evening: 'مساء الخير',
|
||||
ai_chat_assistant_greeting_night: 'تصبح على خير',
|
||||
ai_chat_clear_conversation: 'مسح المحادثة',
|
||||
ai_chat_expand_panel: 'توسيع اللوحة',
|
||||
ai_chat_collapse_panel: 'طي اللوحة',
|
||||
ai_chat_thinking: 'جار التفكير...',
|
||||
ai_chat_working: 'جار العمل...',
|
||||
ai_chat_exploring: 'جار الاستكشاف...',
|
||||
|
||||
@@ -107,6 +107,8 @@ export const bg: TranslationLanguage = {
|
||||
ai_chat_assistant_greeting_evening: 'Добър вечер',
|
||||
ai_chat_assistant_greeting_night: 'Лека нощ',
|
||||
ai_chat_clear_conversation: 'Изчистване на разговора',
|
||||
ai_chat_expand_panel: 'Разгъване на панела',
|
||||
ai_chat_collapse_panel: 'Свиване на панела',
|
||||
ai_chat_thinking: 'Мисля...',
|
||||
ai_chat_working: 'Работя...',
|
||||
ai_chat_exploring: 'Проучвам...',
|
||||
|
||||
@@ -107,6 +107,8 @@ export const cs: TranslationLanguage = {
|
||||
ai_chat_assistant_greeting_evening: 'Dobrý večer',
|
||||
ai_chat_assistant_greeting_night: 'Dobrou noc',
|
||||
ai_chat_clear_conversation: 'Vymazat konverzaci',
|
||||
ai_chat_expand_panel: 'Rozbalit panel',
|
||||
ai_chat_collapse_panel: 'Sbalit panel',
|
||||
ai_chat_thinking: 'Přemýšlím...',
|
||||
ai_chat_working: 'Pracuji...',
|
||||
ai_chat_exploring: 'Prozkoumávám...',
|
||||
|
||||
@@ -106,6 +106,8 @@ export const da: TranslationLanguage = {
|
||||
ai_chat_assistant_greeting_evening: 'Godaften',
|
||||
ai_chat_assistant_greeting_night: 'Godnat',
|
||||
ai_chat_clear_conversation: 'Ryd samtale',
|
||||
ai_chat_expand_panel: 'Udvid panel',
|
||||
ai_chat_collapse_panel: 'Formindsk panel',
|
||||
ai_chat_thinking: 'Tænker...',
|
||||
ai_chat_working: 'Arbejder...',
|
||||
ai_chat_exploring: 'Udforsker...',
|
||||
|
||||
@@ -108,6 +108,8 @@ export const de = {
|
||||
ai_chat_assistant_greeting_evening: 'Guten Abend',
|
||||
ai_chat_assistant_greeting_night: 'Gute Nacht',
|
||||
ai_chat_clear_conversation: 'Unterhaltung löschen',
|
||||
ai_chat_expand_panel: 'Panel erweitern',
|
||||
ai_chat_collapse_panel: 'Panel reduzieren',
|
||||
ai_chat_thinking: 'Denke nach...',
|
||||
ai_chat_working: 'Arbeite...',
|
||||
ai_chat_exploring: 'Erkunde...',
|
||||
|
||||
@@ -108,6 +108,8 @@ export const el: TranslationLanguage = {
|
||||
ai_chat_assistant_greeting_evening: 'Καλό βράδυ',
|
||||
ai_chat_assistant_greeting_night: 'Καληνύχτα',
|
||||
ai_chat_clear_conversation: 'Εκκαθάριση συνομιλίας',
|
||||
ai_chat_expand_panel: 'Ανάπτυξη πίνακα',
|
||||
ai_chat_collapse_panel: 'Σύμπτυξη πίνακα',
|
||||
ai_chat_thinking: 'Σκέφτομαι...',
|
||||
ai_chat_working: 'Εργάζομαι...',
|
||||
ai_chat_exploring: 'Εξερευνώ...',
|
||||
|
||||
@@ -103,6 +103,8 @@ export const en = {
|
||||
ai_chat_assistant_greeting_evening: 'Good evening',
|
||||
ai_chat_assistant_greeting_night: 'Good night',
|
||||
ai_chat_clear_conversation: 'Clear conversation',
|
||||
ai_chat_expand_panel: 'Expand panel',
|
||||
ai_chat_collapse_panel: 'Collapse panel',
|
||||
ai_chat_thinking: 'Thinking…',
|
||||
ai_chat_working: 'Working…',
|
||||
ai_chat_exploring: 'Exploring…',
|
||||
|
||||
@@ -109,6 +109,8 @@ export const es: TranslationLanguage = {
|
||||
ai_chat_assistant_greeting_evening: 'Buenas tardes',
|
||||
ai_chat_assistant_greeting_night: 'Buenas noches',
|
||||
ai_chat_clear_conversation: 'Limpiar conversación',
|
||||
ai_chat_expand_panel: 'Expandir panel',
|
||||
ai_chat_collapse_panel: 'Contraer panel',
|
||||
ai_chat_thinking: 'Pensando...',
|
||||
ai_chat_working: 'Trabajando...',
|
||||
ai_chat_exploring: 'Explorando...',
|
||||
|
||||
@@ -105,6 +105,8 @@ export const et: TranslationLanguage = {
|
||||
ai_chat_assistant_greeting_evening: 'Tere õhtust',
|
||||
ai_chat_assistant_greeting_night: 'Head ööd',
|
||||
ai_chat_clear_conversation: 'Tühjenda vestlus',
|
||||
ai_chat_expand_panel: 'Laienda paneeli',
|
||||
ai_chat_collapse_panel: 'Ahenda paneeli',
|
||||
ai_chat_thinking: 'Mõtlen...',
|
||||
ai_chat_working: 'Töötan...',
|
||||
ai_chat_exploring: 'Uurin...',
|
||||
|
||||
@@ -106,6 +106,8 @@ export const fi: TranslationLanguage = {
|
||||
ai_chat_assistant_greeting_evening: 'Hyvää iltaa',
|
||||
ai_chat_assistant_greeting_night: 'Hyvää yötä',
|
||||
ai_chat_clear_conversation: 'Tyhjennä keskustelu',
|
||||
ai_chat_expand_panel: 'Laajenna paneeli',
|
||||
ai_chat_collapse_panel: 'Pienennä paneeli',
|
||||
ai_chat_thinking: 'Ajatellaan...',
|
||||
ai_chat_working: 'Työskennellään...',
|
||||
ai_chat_exploring: 'Tutkitaan...',
|
||||
|
||||
@@ -104,6 +104,8 @@ export const fr = {
|
||||
ai_chat_assistant_greeting_evening: 'Bonsoir',
|
||||
ai_chat_assistant_greeting_night: 'Bonne nuit',
|
||||
ai_chat_clear_conversation: 'Réinitialiser la conversation',
|
||||
ai_chat_expand_panel: 'Agrandir le panneau',
|
||||
ai_chat_collapse_panel: 'Réduire le panneau',
|
||||
ai_chat_thinking: 'Réflexion en cours…',
|
||||
ai_chat_working: 'Traitement en cours…',
|
||||
ai_chat_exploring: 'Exploration en cours…',
|
||||
|
||||
@@ -105,6 +105,8 @@ export const he: TranslationLanguage = {
|
||||
ai_chat_assistant_greeting_evening: 'ערב טוב',
|
||||
ai_chat_assistant_greeting_night: 'לילה טוב',
|
||||
ai_chat_clear_conversation: 'ניקוי השיחה',
|
||||
ai_chat_expand_panel: 'הרחב פאנל',
|
||||
ai_chat_collapse_panel: 'כווץ פאנל',
|
||||
ai_chat_thinking: 'חושב...',
|
||||
ai_chat_working: 'עובד...',
|
||||
ai_chat_exploring: 'בודק...',
|
||||
|
||||
@@ -105,6 +105,8 @@ export const hi: TranslationLanguage = {
|
||||
ai_chat_assistant_greeting_evening: 'शुभ संध्या',
|
||||
ai_chat_assistant_greeting_night: 'शुभ रात्रि',
|
||||
ai_chat_clear_conversation: 'बातचीत साफ करें',
|
||||
ai_chat_expand_panel: 'पैनल का विस्तार करें',
|
||||
ai_chat_collapse_panel: 'पैनल को छोटा करें',
|
||||
ai_chat_thinking: 'सोच रहा है...',
|
||||
ai_chat_working: 'काम कर रहा है...',
|
||||
ai_chat_exploring: 'खोज रहा है...',
|
||||
|
||||
@@ -107,6 +107,8 @@ export const hr: TranslationLanguage = {
|
||||
ai_chat_assistant_greeting_evening: 'Dobra večer',
|
||||
ai_chat_assistant_greeting_night: 'Laku noć',
|
||||
ai_chat_clear_conversation: 'Očisti razgovor',
|
||||
ai_chat_expand_panel: 'Proširi ploču',
|
||||
ai_chat_collapse_panel: 'Sažmi ploču',
|
||||
ai_chat_thinking: 'Razmišljam...',
|
||||
ai_chat_working: 'Radim...',
|
||||
ai_chat_exploring: 'Istražujem...',
|
||||
|
||||
@@ -106,6 +106,8 @@ export const hu: TranslationLanguage = {
|
||||
ai_chat_assistant_greeting_evening: 'Jó estét',
|
||||
ai_chat_assistant_greeting_night: 'Jó éjszakát',
|
||||
ai_chat_clear_conversation: 'Beszélgetés törlése',
|
||||
ai_chat_expand_panel: 'Panel kibontása',
|
||||
ai_chat_collapse_panel: 'Panel összecsukása',
|
||||
ai_chat_thinking: 'Gondolkodom...',
|
||||
ai_chat_working: 'Dolgozom...',
|
||||
ai_chat_exploring: 'Felfedezés...',
|
||||
|
||||
@@ -106,6 +106,8 @@ export const id: TranslationLanguage = {
|
||||
ai_chat_assistant_greeting_evening: 'Selamat malam',
|
||||
ai_chat_assistant_greeting_night: 'Selamat malam',
|
||||
ai_chat_clear_conversation: 'Bersihkan percakapan',
|
||||
ai_chat_expand_panel: 'Perluas panel',
|
||||
ai_chat_collapse_panel: 'Ciutkan panel',
|
||||
ai_chat_thinking: 'Berpikir...',
|
||||
ai_chat_working: 'Bekerja...',
|
||||
ai_chat_exploring: 'Menjelajahi...',
|
||||
|
||||
@@ -108,6 +108,8 @@ export const it: TranslationLanguage = {
|
||||
ai_chat_assistant_greeting_evening: 'Buonasera',
|
||||
ai_chat_assistant_greeting_night: 'Buonanotte',
|
||||
ai_chat_clear_conversation: 'Cancella conversazione',
|
||||
ai_chat_expand_panel: 'Espandi pannello',
|
||||
ai_chat_collapse_panel: 'Comprimi pannello',
|
||||
ai_chat_thinking: 'Sto pensando...',
|
||||
ai_chat_working: 'Sto lavorando...',
|
||||
ai_chat_exploring: 'Esplorando...',
|
||||
|
||||
@@ -107,6 +107,8 @@ export const ja: TranslationLanguage = {
|
||||
ai_chat_assistant_greeting_evening: 'こんばんは',
|
||||
ai_chat_assistant_greeting_night: 'おやすみなさい',
|
||||
ai_chat_clear_conversation: '会話をクリア',
|
||||
ai_chat_expand_panel: 'パネルを広げる',
|
||||
ai_chat_collapse_panel: 'パネルを狭める',
|
||||
ai_chat_thinking: '考え中...',
|
||||
ai_chat_working: '作業中...',
|
||||
ai_chat_exploring: '探索中...',
|
||||
|
||||
@@ -106,6 +106,8 @@ export const ko: TranslationLanguage = {
|
||||
ai_chat_assistant_greeting_evening: '좋은 저녁입니다',
|
||||
ai_chat_assistant_greeting_night: '안녕히 주무세요',
|
||||
ai_chat_clear_conversation: '대화 지우기',
|
||||
ai_chat_expand_panel: '패널 확장',
|
||||
ai_chat_collapse_panel: '패널 축소',
|
||||
ai_chat_thinking: '생각 중...',
|
||||
ai_chat_working: '작업 중...',
|
||||
ai_chat_exploring: '탐색 중...',
|
||||
|
||||
@@ -106,6 +106,8 @@ export const lt: TranslationLanguage = {
|
||||
ai_chat_assistant_greeting_evening: 'Labas vakaras',
|
||||
ai_chat_assistant_greeting_night: 'Labanakt',
|
||||
ai_chat_clear_conversation: 'Išvalyti pokalbį',
|
||||
ai_chat_expand_panel: 'Išskleisti skydelį',
|
||||
ai_chat_collapse_panel: 'Sutraukti skydelį',
|
||||
ai_chat_thinking: 'Galvoju...',
|
||||
ai_chat_working: 'Dirbu...',
|
||||
ai_chat_exploring: 'Tyrinėju...',
|
||||
|
||||
@@ -105,6 +105,8 @@ export const lv: TranslationLanguage = {
|
||||
ai_chat_assistant_greeting_evening: 'Labvakar',
|
||||
ai_chat_assistant_greeting_night: 'Ar labu nakti',
|
||||
ai_chat_clear_conversation: 'Notīrīt sarunu',
|
||||
ai_chat_expand_panel: 'Izvērst paneli',
|
||||
ai_chat_collapse_panel: 'Sakļaut paneli',
|
||||
ai_chat_thinking: 'Domāju...',
|
||||
ai_chat_working: 'Strādāju...',
|
||||
ai_chat_exploring: 'Izpētu...',
|
||||
|
||||
@@ -106,6 +106,8 @@ export const ms: TranslationLanguage = {
|
||||
ai_chat_assistant_greeting_evening: 'Selamat petang',
|
||||
ai_chat_assistant_greeting_night: 'Selamat malam',
|
||||
ai_chat_clear_conversation: 'Kosongkan perbualan',
|
||||
ai_chat_expand_panel: 'Kembangkan panel',
|
||||
ai_chat_collapse_panel: 'Kecilkan panel',
|
||||
ai_chat_thinking: 'Berfikir...',
|
||||
ai_chat_working: 'Bekerja...',
|
||||
ai_chat_exploring: 'Meneroka...',
|
||||
|
||||
@@ -107,6 +107,8 @@ export const nl: TranslationLanguage = {
|
||||
ai_chat_assistant_greeting_evening: 'Goedenavond',
|
||||
ai_chat_assistant_greeting_night: 'Goedenacht',
|
||||
ai_chat_clear_conversation: 'Gesprek wissen',
|
||||
ai_chat_expand_panel: 'Paneel uitvouwen',
|
||||
ai_chat_collapse_panel: 'Paneel samenvouwen',
|
||||
ai_chat_thinking: 'Denkt na...',
|
||||
ai_chat_working: 'Werkt...',
|
||||
ai_chat_exploring: 'Verkent...',
|
||||
|
||||
@@ -107,6 +107,8 @@ export const no: TranslationLanguage = {
|
||||
ai_chat_assistant_greeting_evening: 'God kveld',
|
||||
ai_chat_assistant_greeting_night: 'God natt',
|
||||
ai_chat_clear_conversation: 'Tøm samtale',
|
||||
ai_chat_expand_panel: 'Utvid panel',
|
||||
ai_chat_collapse_panel: 'Reduser panel',
|
||||
ai_chat_thinking: 'Tenker...',
|
||||
ai_chat_working: 'Arbeider...',
|
||||
ai_chat_exploring: 'Utforsker...',
|
||||
|
||||
@@ -106,6 +106,8 @@ export const pl: TranslationLanguage = {
|
||||
ai_chat_assistant_greeting_evening: 'Dobry wieczór',
|
||||
ai_chat_assistant_greeting_night: 'Dobranoc',
|
||||
ai_chat_clear_conversation: 'Wyczyść rozmowę',
|
||||
ai_chat_expand_panel: 'Rozwiń panel',
|
||||
ai_chat_collapse_panel: 'Zwiń panel',
|
||||
ai_chat_thinking: 'Myślę...',
|
||||
ai_chat_working: 'Pracuję...',
|
||||
ai_chat_exploring: 'Sprawdzam...',
|
||||
|
||||
@@ -107,6 +107,8 @@ export const pt_br = {
|
||||
ai_chat_assistant_greeting_evening: 'Boa tarde',
|
||||
ai_chat_assistant_greeting_night: 'Boa noite',
|
||||
ai_chat_clear_conversation: 'Limpar conversa',
|
||||
ai_chat_expand_panel: 'Expandir painel',
|
||||
ai_chat_collapse_panel: 'Recolher painel',
|
||||
ai_chat_thinking: 'Pensando...',
|
||||
ai_chat_working: 'Trabalhando...',
|
||||
ai_chat_exploring: 'Explorando...',
|
||||
|
||||
@@ -106,6 +106,8 @@ export const pt: TranslationLanguage = {
|
||||
ai_chat_assistant_greeting_evening: 'Boa noite',
|
||||
ai_chat_assistant_greeting_night: 'Boa noite',
|
||||
ai_chat_clear_conversation: 'Limpar conversa',
|
||||
ai_chat_expand_panel: 'Expandir painel',
|
||||
ai_chat_collapse_panel: 'Recolher painel',
|
||||
ai_chat_thinking: 'A pensar...',
|
||||
ai_chat_working: 'A trabalhar...',
|
||||
ai_chat_exploring: 'A explorar...',
|
||||
|
||||
@@ -108,6 +108,8 @@ export const ro: TranslationLanguage = {
|
||||
ai_chat_assistant_greeting_evening: 'Bună seara',
|
||||
ai_chat_assistant_greeting_night: 'Noapte bună',
|
||||
ai_chat_clear_conversation: 'Șterge conversația',
|
||||
ai_chat_expand_panel: 'Extinde panoul',
|
||||
ai_chat_collapse_panel: 'Restrânge panoul',
|
||||
ai_chat_thinking: 'Se gândește...',
|
||||
ai_chat_working: 'Lucrează...',
|
||||
ai_chat_exploring: 'Explorează...',
|
||||
|
||||
@@ -106,6 +106,8 @@ export const ru = {
|
||||
ai_chat_assistant_greeting_evening: 'Добрый вечер',
|
||||
ai_chat_assistant_greeting_night: 'Доброй ночи',
|
||||
ai_chat_clear_conversation: 'Очистить диалог',
|
||||
ai_chat_expand_panel: 'Развернуть панель',
|
||||
ai_chat_collapse_panel: 'Свернуть панель',
|
||||
ai_chat_thinking: 'Думает…',
|
||||
ai_chat_working: 'Работает…',
|
||||
ai_chat_exploring: 'Изучает…',
|
||||
|
||||
@@ -107,6 +107,8 @@ export const sk: TranslationLanguage = {
|
||||
ai_chat_assistant_greeting_evening: 'Dobrý večer',
|
||||
ai_chat_assistant_greeting_night: 'Dobrú noc',
|
||||
ai_chat_clear_conversation: 'Vymazať konverzáciu',
|
||||
ai_chat_expand_panel: 'Rozbaliť panel',
|
||||
ai_chat_collapse_panel: 'Zbaliť panel',
|
||||
ai_chat_thinking: 'Premýšľam...',
|
||||
ai_chat_working: 'Pracujem...',
|
||||
ai_chat_exploring: 'Skúmam...',
|
||||
|
||||
@@ -106,6 +106,8 @@ export const sl: TranslationLanguage = {
|
||||
ai_chat_assistant_greeting_evening: 'Dober večer',
|
||||
ai_chat_assistant_greeting_night: 'Lahko noč',
|
||||
ai_chat_clear_conversation: 'Počisti pogovor',
|
||||
ai_chat_expand_panel: 'Razširi ploščo',
|
||||
ai_chat_collapse_panel: 'Skrči ploščo',
|
||||
ai_chat_thinking: 'Razmišljam...',
|
||||
ai_chat_working: 'Delam...',
|
||||
ai_chat_exploring: 'Raziskujem...',
|
||||
|
||||
@@ -106,6 +106,8 @@ export const sv: TranslationLanguage = {
|
||||
ai_chat_assistant_greeting_evening: 'God kväll',
|
||||
ai_chat_assistant_greeting_night: 'God natt',
|
||||
ai_chat_clear_conversation: 'Rensa konversation',
|
||||
ai_chat_expand_panel: 'Expandera panel',
|
||||
ai_chat_collapse_panel: 'Förminska panel',
|
||||
ai_chat_thinking: 'Tänker...',
|
||||
ai_chat_working: 'Arbetar...',
|
||||
ai_chat_exploring: 'Utforskar...',
|
||||
|
||||
@@ -104,6 +104,8 @@ export const th: TranslationLanguage = {
|
||||
ai_chat_assistant_greeting_evening: 'สวัสดีตอนเย็น',
|
||||
ai_chat_assistant_greeting_night: 'ราตรีสวัสดิ์',
|
||||
ai_chat_clear_conversation: 'ล้างการสนทนา',
|
||||
ai_chat_expand_panel: 'ขยายแผง',
|
||||
ai_chat_collapse_panel: 'ย่อแผง',
|
||||
ai_chat_thinking: 'กำลังคิด...',
|
||||
ai_chat_working: 'กำลังทำงาน...',
|
||||
ai_chat_exploring: 'กำลังสำรวจ...',
|
||||
|
||||
@@ -105,6 +105,8 @@ export const tr: TranslationLanguage = {
|
||||
ai_chat_assistant_greeting_evening: 'İyi akşamlar',
|
||||
ai_chat_assistant_greeting_night: 'İyi geceler',
|
||||
ai_chat_clear_conversation: 'Konuşmayı temizle',
|
||||
ai_chat_expand_panel: 'Paneli genişlet',
|
||||
ai_chat_collapse_panel: 'Paneli daralt',
|
||||
ai_chat_thinking: 'Düşünüyor...',
|
||||
ai_chat_working: 'Çalışıyor...',
|
||||
ai_chat_exploring: 'İnceliyor...',
|
||||
|
||||
@@ -105,6 +105,8 @@ export const uk: TranslationLanguage = {
|
||||
ai_chat_assistant_greeting_evening: 'Добрий вечір',
|
||||
ai_chat_assistant_greeting_night: 'Добраніч',
|
||||
ai_chat_clear_conversation: 'Очистити розмову',
|
||||
ai_chat_expand_panel: 'Розгорнути панель',
|
||||
ai_chat_collapse_panel: 'Згорнути панель',
|
||||
ai_chat_thinking: 'Думаю...',
|
||||
ai_chat_working: 'Працюю...',
|
||||
ai_chat_exploring: 'Досліджую...',
|
||||
|
||||
@@ -105,6 +105,8 @@ export const vi: TranslationLanguage = {
|
||||
ai_chat_assistant_greeting_evening: 'Chào buổi tối',
|
||||
ai_chat_assistant_greeting_night: 'Chúc ngủ ngon',
|
||||
ai_chat_clear_conversation: 'Xóa cuộc trò chuyện',
|
||||
ai_chat_expand_panel: 'Mở rộng bảng',
|
||||
ai_chat_collapse_panel: 'Thu gọn bảng',
|
||||
ai_chat_thinking: 'Đang suy nghĩ...',
|
||||
ai_chat_working: 'Đang làm việc...',
|
||||
ai_chat_exploring: 'Đang khám phá...',
|
||||
|
||||
@@ -103,6 +103,8 @@ export const yue: TranslationLanguage = {
|
||||
ai_chat_assistant_greeting_evening: '晚上好',
|
||||
ai_chat_assistant_greeting_night: '晚安',
|
||||
ai_chat_clear_conversation: '清除對話',
|
||||
ai_chat_expand_panel: '展開面板',
|
||||
ai_chat_collapse_panel: '收合面板',
|
||||
ai_chat_thinking: '諗緊...',
|
||||
ai_chat_working: '處理緊...',
|
||||
ai_chat_exploring: '探索緊...',
|
||||
|
||||
@@ -103,6 +103,8 @@ export const zh_tw: TranslationLanguage = {
|
||||
ai_chat_assistant_greeting_evening: '晚安',
|
||||
ai_chat_assistant_greeting_night: '晚安',
|
||||
ai_chat_clear_conversation: '清除對話',
|
||||
ai_chat_expand_panel: '展開面板',
|
||||
ai_chat_collapse_panel: '收合面板',
|
||||
ai_chat_thinking: '思考中...',
|
||||
ai_chat_working: '處理中...',
|
||||
ai_chat_exploring: '探索中...',
|
||||
|
||||
@@ -104,6 +104,8 @@ export const zh: TranslationLanguage = {
|
||||
ai_chat_assistant_greeting_evening: '晚上好',
|
||||
ai_chat_assistant_greeting_night: '晚安',
|
||||
ai_chat_clear_conversation: '清空对话',
|
||||
ai_chat_expand_panel: '展开面板',
|
||||
ai_chat_collapse_panel: '收起面板',
|
||||
ai_chat_thinking: '思考中...',
|
||||
ai_chat_working: '工作中...',
|
||||
ai_chat_exploring: '探索中...',
|
||||
|
||||
Reference in New Issue
Block a user