feat(avatar): dress up any Oo in the Atelier on web and mobile (#143)

The Atelier replaces Avatar Studio: pick a species, colour, eyes,
glasses, hats, neckwear, arms and temperament, with every option drawn
as your own Oo wearing it. Onboarding's "Design your Oo" now offers
species looks per vibe and opens the Atelier for the rest; mobile bot
settings carry the same editor instead of a bare colour row, so picking
a colour there no longer throws away the rest of the look.


Claude-Session: https://claude.ai/code/session_01EKuME5CgL1ddGGN7LGvtBj

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
This commit is contained in:
cynarAI 2026-10-05 03:20:05 +02:00 committed by GitHub
parent 6fd136e944
commit 63578bb645
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
29 changed files with 4130 additions and 608 deletions

View File

@ -12,6 +12,7 @@ import { useEffect, useMemo, useState } from "react";
import { Pressable, ScrollView, Text, TextInput, View } from "react-native";
import { BotAvatar } from "../components/bot-avatar";
import { ComputerModePicker } from "../components/computer-mode-picker";
import { OoAtelier } from "../components/oo-atelier";
import {
type MobileBot,
type MobileMe,
@ -348,33 +349,9 @@ export default function BotSettingsScreen() {
textAlignVertical: "top",
}}
/>
<Text style={{ color: tokens.mutedForeground, marginTop: 16, fontSize: 14 }}>
{t("Color")}
</Text>
<ScrollView
horizontal
showsHorizontalScrollIndicator={false}
contentContainerStyle={{ gap: 10, marginTop: 8 }}
accessibilityRole="radiogroup"
>
{BOT_COLORS.map((option, index) => (
<Pressable
key={option}
accessibilityRole="radio"
accessibilityLabel={t("Color {number}", { number: index + 1 })}
accessibilityState={{ checked: color === option }}
onPress={() => setColor(option)}
style={{
width: 36,
height: 36,
borderRadius: 18,
backgroundColor: option,
borderWidth: 3,
borderColor: color === option ? tokens.foreground : "transparent",
}}
/>
))}
</ScrollView>
<View style={{ marginTop: 4 }}>
<OoAtelier value={color} identity={bot?.id ?? ""} onChange={setColor} />
</View>
<ComputerModePicker value={computerMode} onChange={setComputerMode} />
<Pressable
accessibilityRole="button"

View File

@ -0,0 +1,410 @@
import type { OoAvatar } from "@rakazo/core";
import {
encodeOoAvatar,
OO_ARMS,
OO_BROWS,
OO_CHEEKS,
OO_CLASSIC_SHAPE_COUNT,
OO_EYESHADOWS,
OO_EYEWEAR,
OO_HEADWEAR,
OO_IRISES,
OO_LASHES,
OO_LINERS,
OO_NECKWEAR,
OO_PALETTE_HEXES,
OO_SPARKLES,
OO_SPECIES,
ooLookForEditing,
ooRandomAvatar,
} from "@rakazo/core";
import { useState } from "react";
import { Pressable, ScrollView, Text, View } from "react-native";
import { useI18n } from "../lib/i18n";
import { useMobileTokens } from "../lib/native";
import { OoFigure } from "./oo-figure";
const THUMB = 52;
/** Temperament in three taps; web offers the same range as sliders. */
const ENERGY_STEPS = [0.75, 1, 1.35] as const;
const PLAYFUL_STEPS = [0.2, 0.5, 0.85] as const;
function nearest(steps: readonly number[], value: number): number {
return steps.reduce((best, step) =>
Math.abs(step - value) < Math.abs(best - value) ? step : best,
);
}
function useLabels() {
const { t } = useI18n();
const none = t("None");
return {
species: {
classic: t("Classic"),
cat: t("Cat"),
dog: t("Dog"),
bunny: t("Bunny"),
bear: t("Bear"),
robot: t("Robot"),
ghost: t("Ghost"),
frog: t("Frog"),
penguin: t("Penguin"),
},
lashes: { none, soft: t("Soft"), full: t("Full"), flick: t("Flick") },
liner: { none, wing: t("Winged") },
eyeshadow: { none, rose: t("Rose"), lilac: t("Lilac"), gold: t("Gold"), mint: t("Mint") },
iris: {
classic: t("Classic"),
brown: t("Brown"),
blue: t("Blue"),
green: t("Green"),
violet: t("Violet"),
},
sparkle: { dot: t("Dot"), star: t("Star"), heart: t("Heart") },
brows: { auto: t("When needed"), fine: t("Fine"), bushy: t("Bushy") },
cheeks: { none, pink: t("Pink"), peach: t("Peach"), freckles: t("Freckles") },
eyewear: {
none,
round: t("Round"),
nerd: t("Nerd"),
sun: t("Sunglasses"),
heart: t("Heart"),
monocle: t("Monocle"),
reading: t("Reading glasses"),
},
head: {
none,
chef: t("Chef's hat"),
crown: t("Crown"),
headphones: t("Headphones"),
bow: t("Bow"),
beanie: t("Beanie"),
flower: t("Flower"),
party: t("Party hat"),
},
neck: { none, bowtie: t("Bow tie"), scarf: t("Scarf"), bell: t("Bell") },
arms: { glass: t("Glass"), stub: t("Stub"), paw: t("Paw"), robot: t("Robot"), none },
energy: [t("Calm"), t("Steady"), t("Lively")],
} as const;
}
function Row<T extends string | number>({
title,
values,
selected,
label,
look,
patch,
focus = "body",
onSelect,
}: {
title: string;
values: readonly T[];
selected: T;
label: (value: T) => string;
look: OoAvatar;
patch: (value: T) => Partial<OoAvatar>;
focus?: "body" | "face";
onSelect: (value: T) => void;
}) {
const tokens = useMobileTokens();
return (
<View style={{ marginTop: 14 }}>
<Text style={{ color: tokens.mutedForeground, fontSize: 13 }}>{title}</Text>
<ScrollView
horizontal
showsHorizontalScrollIndicator={false}
contentContainerStyle={{ gap: 8, marginTop: 6 }}
accessibilityRole="radiogroup"
accessibilityLabel={title}
>
{values.map((value) => {
const next = { ...look, ...patch(value) };
const active = value === selected;
return (
<Pressable
key={value}
accessibilityRole="radio"
accessibilityLabel={label(value)}
accessibilityState={{ checked: active }}
onPress={() => onSelect(value)}
style={{
width: THUMB + 8,
height: THUMB + 8,
borderRadius: 14,
alignItems: "center",
justifyContent: "center",
overflow: "hidden",
backgroundColor: tokens.muted,
borderWidth: 2,
borderColor: active ? tokens.foreground : "transparent",
}}
>
<OoFigure
avatar={next}
color={next.color}
fallbackShape={next.shape ?? 0}
moment="idle"
size={THUMB}
focus={focus}
still
/>
</Pressable>
);
})}
</ScrollView>
</View>
);
}
/** The Oo look editor: species and colour first, everything else one tap further. */
export function OoAtelier({
value,
identity,
onChange,
}: {
value: string;
identity: string;
onChange: (value: string) => void;
}) {
const { t } = useI18n();
const tokens = useMobileTokens();
const labels = useLabels();
const [moreOpen, setMoreOpen] = useState(false);
const look = ooLookForEditing(value, identity);
const set = <K extends keyof OoAvatar>(field: K, next: OoAvatar[K]) =>
onChange(encodeOoAvatar({ ...look, [field]: next }));
const chip = (active: boolean) => ({
minHeight: 36,
paddingHorizontal: 14,
borderRadius: 18,
justifyContent: "center" as const,
backgroundColor: active ? tokens.foreground : tokens.muted,
});
const chipText = (active: boolean) => ({
color: active ? tokens.background : tokens.foreground,
fontSize: 14,
});
return (
<View>
<Row
title={t("Species")}
values={OO_SPECIES}
selected={look.species}
label={(species) => labels.species[species]}
look={look}
patch={(species) => ({ species, arms: species === "robot" ? "robot" : look.arms })}
onSelect={(species) =>
onChange(
encodeOoAvatar({
...look,
species,
arms: species === "robot" ? "robot" : look.arms === "robot" ? "glass" : look.arms,
}),
)
}
/>
{look.species === "classic" ? (
<Row
title={t("Shape")}
values={Array.from({ length: OO_CLASSIC_SHAPE_COUNT }, (_, index) => index)}
selected={look.shape ?? -1}
label={(shape) => t("Shape {number}", { number: shape + 1 })}
look={look}
patch={(shape) => ({ shape })}
onSelect={(shape) => set("shape", shape)}
/>
) : null}
<Text style={{ color: tokens.mutedForeground, marginTop: 14, fontSize: 13 }}>
{t("Color")}
</Text>
<ScrollView
horizontal
showsHorizontalScrollIndicator={false}
contentContainerStyle={{ gap: 10, marginTop: 6 }}
accessibilityRole="radiogroup"
>
{OO_PALETTE_HEXES.map((option, index) => {
const checked = look.color.toLowerCase() === option.toLowerCase();
return (
<Pressable
key={option}
accessibilityRole="radio"
accessibilityLabel={t("Color {number}", { number: index + 1 })}
accessibilityState={{ checked }}
onPress={() => set("color", option)}
style={{
width: 36,
height: 36,
borderRadius: 18,
backgroundColor: option,
borderWidth: 3,
borderColor: checked ? tokens.foreground : tokens.border,
}}
/>
);
})}
</ScrollView>
<View style={{ flexDirection: "row", gap: 8, marginTop: 14 }}>
<Pressable
accessibilityRole="button"
accessibilityState={{ expanded: moreOpen }}
onPress={() => setMoreOpen((open) => !open)}
style={chip(moreOpen)}
>
<Text style={chipText(moreOpen)}>{t("Customize")}</Text>
</Pressable>
<Pressable
accessibilityRole="button"
onPress={() => onChange(encodeOoAvatar(ooRandomAvatar()))}
style={chip(false)}
>
<Text style={chipText(false)}>{t("Surprise me")}</Text>
</Pressable>
</View>
{moreOpen ? (
<View>
<Row
title={t("Lashes")}
values={OO_LASHES}
selected={look.lashes}
label={(lashes) => labels.lashes[lashes]}
look={look}
patch={(lashes) => ({ lashes })}
focus="face"
onSelect={(lashes) => set("lashes", lashes)}
/>
<Row
title={t("Eyeliner")}
values={OO_LINERS}
selected={look.liner}
label={(liner) => labels.liner[liner]}
look={look}
patch={(liner) => ({ liner })}
focus="face"
onSelect={(liner) => set("liner", liner)}
/>
<Row
title={t("Eyeshadow")}
values={OO_EYESHADOWS}
selected={look.eyeshadow}
label={(eyeshadow) => labels.eyeshadow[eyeshadow]}
look={look}
patch={(eyeshadow) => ({ eyeshadow })}
focus="face"
onSelect={(eyeshadow) => set("eyeshadow", eyeshadow)}
/>
<Row
title={t("Iris")}
values={OO_IRISES}
selected={look.iris}
label={(iris) => labels.iris[iris]}
look={look}
patch={(iris) => ({ iris })}
focus="face"
onSelect={(iris) => set("iris", iris)}
/>
<Row
title={t("Sparkle")}
values={OO_SPARKLES}
selected={look.sparkle}
label={(sparkle) => labels.sparkle[sparkle]}
look={look}
patch={(sparkle) => ({ sparkle })}
focus="face"
onSelect={(sparkle) => set("sparkle", sparkle)}
/>
<Row
title={t("Brows")}
values={OO_BROWS}
selected={look.brows}
label={(brows) => labels.brows[brows]}
look={look}
patch={(brows) => ({ brows })}
focus="face"
onSelect={(brows) => set("brows", brows)}
/>
<Row
title={t("Cheeks")}
values={OO_CHEEKS}
selected={look.cheeks}
label={(cheeks) => labels.cheeks[cheeks]}
look={look}
patch={(cheeks) => ({ cheeks })}
focus="face"
onSelect={(cheeks) => set("cheeks", cheeks)}
/>
<Row
title={t("Glasses")}
values={OO_EYEWEAR}
selected={look.eyewear}
label={(eyewear) => labels.eyewear[eyewear]}
look={look}
patch={(eyewear) => ({ eyewear })}
focus="face"
onSelect={(eyewear) => set("eyewear", eyewear)}
/>
<Row
title={t("Hat")}
values={OO_HEADWEAR}
selected={look.head}
label={(head) => labels.head[head]}
look={look}
patch={(head) => ({ head })}
onSelect={(head) => set("head", head)}
/>
<Row
title={t("Neck")}
values={OO_NECKWEAR}
selected={look.neck}
label={(neck) => labels.neck[neck]}
look={look}
patch={(neck) => ({ neck })}
onSelect={(neck) => set("neck", neck)}
/>
<Row
title={t("Arms")}
values={OO_ARMS}
selected={look.arms}
label={(arms) => labels.arms[arms]}
look={look}
patch={(arms) => ({ arms })}
onSelect={(arms) => set("arms", arms)}
/>
{(
[
["energy", t("Energy"), ENERGY_STEPS],
["playful", t("Playful"), PLAYFUL_STEPS],
] as const
).map(([field, title, steps]) => {
const current = nearest(steps, look[field]);
return (
<View key={field} style={{ marginTop: 14 }}>
<Text style={{ color: tokens.mutedForeground, fontSize: 13 }}>{title}</Text>
<View
accessibilityRole="radiogroup"
accessibilityLabel={title}
style={{ flexDirection: "row", gap: 8, marginTop: 6 }}
>
{steps.map((step, index) => (
<Pressable
key={step}
accessibilityRole="radio"
accessibilityState={{ checked: step === current }}
onPress={() => set(field, step)}
style={chip(step === current)}
>
<Text style={chipText(step === current)}>{labels.energy[index]}</Text>
</Pressable>
))}
</View>
</View>
);
})}
</View>
) : null}
</View>
);
}

View File

@ -26,6 +26,7 @@ import Svg, {
} from "react-native-svg";
const VIEWBOX = `${OO_RIG_INSET} ${OO_RIG_INSET + 4} ${OO_RIG_SIZE - 2 * OO_RIG_INSET} ${OO_RIG_SIZE - 2 * OO_RIG_INSET}`;
const FACE_VIEWBOX = "47 62 112 112";
/** Native frames redraw the SVG tree, so they run at half the display rate. */
const FRAME_SECONDS = 1 / 30;
/** Above this size an Oo always moves; smaller ones only for list moments. */
@ -151,6 +152,7 @@ export function OoFigure({
moment,
size,
still = false,
focus = "body",
}: {
avatar: OoAvatar;
color: string;
@ -158,6 +160,8 @@ export function OoFigure({
moment: OoMoment;
size: number;
still?: boolean;
/** `face` crops to the eyes, for pickers of eye styles and eyewear. */
focus?: "body" | "face";
}) {
const gradient = `oo${useId().replace(/[^a-zA-Z0-9-_]/g, "")}`;
const lod = ooLodForSize(size);
@ -200,7 +204,7 @@ export function OoFigure({
const shown = frame ?? stillFrame;
const { colors } = rig;
return (
<Svg width={size} height={size} viewBox={VIEWBOX}>
<Svg width={size} height={size} viewBox={focus === "face" ? FACE_VIEWBOX : VIEWBOX}>
<Defs>
<LinearGradient id={`${gradient}-body`} x1="0" y1="0" x2="1" y2="1">
<Stop offset="0" stopColor={colors.light} />

View File

@ -616,6 +616,76 @@ export const RU_MESSAGES: Record<string, string> = {
"Start timer": "Запустить таймер",
"Step {position} of {total}": "Шаг {position} из {total}",
"Stop timer": "Остановить таймер",
Arms: "Руки",
Beanie: "Шапка",
Bear: "Медведь",
Bell: "Колокольчик",
Blue: "Синий",
Bow: "Бантик",
"Bow tie": "Бабочка",
Brown: "Карий",
Brows: "Брови",
Bunny: "Зайчик",
Bushy: "Густые",
Calm: "Спокойный",
Cat: "Кошка",
Cheeks: "Щёки",
"Chef's hat": "Колпак повара",
Classic: "Классика",
Crown: "Корона",
Customize: "Настроить",
Dog: "Собака",
Dot: "Точка",
Energy: "Энергия",
Eyeliner: "Подводка",
Eyeshadow: "Тени",
Fine: "Тонкие",
Flick: "Взмах",
Flower: "Цветок",
Freckles: "Веснушки",
Frog: "Лягушка",
Full: "Пышные",
Ghost: "Призрак",
Glass: "Стекло",
Glasses: "Очки",
Gold: "Золото",
Green: "Зелёный",
Hat: "Голова",
Headphones: "Наушники",
Heart: "Сердце",
Iris: "Радужка",
Lashes: "Ресницы",
Lilac: "Сирень",
Lively: "Живой",
Mint: "Мята",
Monocle: "Монокль",
Neck: "Шея",
Nerd: "Ботаник",
None: "Нет",
"Party hat": "Колпак",
Paw: "Лапка",
Peach: "Персик",
Penguin: "Пингвин",
Pink: "Розовый",
Playful: "Игривость",
"Reading glasses": "Очки для чтения",
Robot: "Робот",
Rose: "Роза",
Round: "Круглые",
Scarf: "Шарф",
Shape: "Форма",
"Shape {number}": "Форма {number}",
Soft: "Мягкие",
Sparkle: "Блик",
Species: "Существо",
Star: "Звезда",
Steady: "Ровный",
Stub: "Коротышки",
Sunglasses: "Солнечные очки",
"Surprise me": "Удиви меня",
Violet: "Фиолетовый",
"When needed": "По ситуации",
Winged: "Стрелка",
Accept: "Принять",
Dismissed: "Отклонено",
Expired: "Истекло",

View File

@ -600,6 +600,76 @@ export const ZH_MESSAGES: Record<string, string> = {
"Start timer": "开始计时",
"Step {position} of {total}": "第 {position} 步,共 {total} 步",
"Stop timer": "停止计时",
Arms: "手臂",
Beanie: "毛线帽",
Bear: "熊",
Bell: "铃铛",
Blue: "蓝色",
Bow: "蝴蝶结",
"Bow tie": "领结",
Brown: "棕色",
Brows: "眉毛",
Bunny: "兔子",
Bushy: "浓密",
Calm: "安静",
Cat: "猫",
Cheeks: "脸颊",
"Chef's hat": "厨师帽",
Classic: "经典",
Crown: "皇冠",
Customize: "自定义",
Dog: "狗",
Dot: "圆点",
Energy: "活力",
Eyeliner: "眼线",
Eyeshadow: "眼影",
Fine: "细",
Flick: "上挑",
Flower: "花朵",
Freckles: "雀斑",
Frog: "青蛙",
Full: "浓密",
Ghost: "幽灵",
Glass: "玻璃",
Glasses: "眼镜",
Gold: "金色",
Green: "绿色",
Hat: "头饰",
Headphones: "耳机",
Heart: "爱心",
Iris: "虹膜",
Lashes: "睫毛",
Lilac: "丁香",
Lively: "活泼",
Mint: "薄荷",
Monocle: "单片眼镜",
Neck: "颈部",
Nerd: "书呆子",
None: "无",
"Party hat": "派对帽",
Paw: "爪子",
Peach: "桃色",
Penguin: "企鹅",
Pink: "粉色",
Playful: "俏皮",
"Reading glasses": "老花镜",
Robot: "机器人",
Rose: "玫瑰",
Round: "圆形",
Scarf: "围巾",
Shape: "形状",
"Shape {number}": "形状 {number}",
Soft: "柔和",
Sparkle: "高光",
Species: "物种",
Star: "星星",
Steady: "平稳",
Stub: "短短",
Sunglasses: "墨镜",
"Surprise me": "给我惊喜",
Violet: "紫色",
"When needed": "需要时",
Winged: "上扬",
Accept: "接受",
Dismissed: "已忽略",
Expired: "已过期",

View File

@ -1,27 +0,0 @@
import { expect, test } from "@playwright/test";
import { captureScreenshot, completeOnboarding, signup } from "./helpers";
test("bot settings open Avatar Studio on the Bot tab", async ({ page }, testInfo) => {
const stamp = Date.now();
await signup(page, `avatar-studio-${stamp}@rakazo.test`, "password12", "Avatar Studio");
await completeOnboarding(page);
await page.goto("/app");
await page.waitForURL(/\/app\/[^/]+$/);
await page.getByTestId("bot-settings-trigger").click();
const settings = page.getByTestId("bot-settings");
await expect(settings).toBeVisible();
await settings.getByTestId("avatar-studio-trigger").click();
const studio = page.getByTestId("avatar-studio");
await expect(studio).toBeVisible();
await expect(studio.getByText("Avatar Studio", { exact: true })).toBeVisible();
await expect(studio.getByRole("button", { name: "Bot", exact: true })).toBeVisible();
await expect(studio.getByRole("button", { name: "Upload", exact: true })).toBeVisible();
await expect(studio.getByRole("button", { name: "Generate" })).toHaveCount(0);
await expect(studio.getByTestId("avatar-studio-bot-tab")).toBeVisible();
await expect(studio.getByText("Shape", { exact: true })).toBeVisible();
await expect(studio.getByText("Color", { exact: true })).toBeVisible();
await captureScreenshot(page, testInfo, "avatar-studio-bot-tab");
});

View File

@ -73,10 +73,10 @@ test("bot creation, editing, and deletion persist", async ({ page }, testInfo) =
await nameInput.fill("Researcher");
await titleInput.fill(longTitle);
await descriptionInput.fill("Finds reliable sources and turns them into concise briefs.");
await page.getByTestId("avatar-studio-trigger").click();
const studio = page.getByTestId("avatar-studio");
await page.getByTestId("oo-atelier-trigger").click();
const studio = page.getByTestId("oo-atelier");
await expect(studio).toBeVisible();
await expect(studio.getByTestId("avatar-studio-bot-tab")).toBeVisible();
await expect(studio.getByTestId("oo-atelier-body")).toBeVisible();
await studio.getByRole("button", { name: "Color #EAB308" }).click();
await studio.getByRole("button", { name: "Done", exact: true }).click();
await expect(studio).toBeHidden();
@ -91,7 +91,7 @@ test("bot creation, editing, and deletion persist", async ({ page }, testInfo) =
"Finds reliable sources and turns them into concise briefs.",
);
const settings = page.getByTestId("bot-settings");
await settings.getByTestId("avatar-studio-trigger").click();
await settings.getByTestId("oo-atelier-trigger").click();
await expect(studio).toBeVisible();
await expect(studio.getByRole("button", { name: "Color #EAB308" })).toHaveClass(/ring-2/);
await studio.getByRole("button", { name: "Done", exact: true }).click();

View File

@ -0,0 +1,12 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Oo atelier</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/e2e/fixtures/oo-atelier.tsx"></script>
</body>
</html>

View File

@ -0,0 +1,32 @@
import { setupI18n } from "@lingui/core";
import { I18nProvider } from "@lingui/react";
import { useState } from "react";
import { createRoot } from "react-dom/client";
import { OoAtelierDialog } from "../../src/components/OoAtelier";
import "../../src/styles.css";
const params = new URLSearchParams(location.search);
document.documentElement.dataset.theme = params.get("theme") === "dark" ? "dark" : "light";
const i18n = setupI18n({ locale: "en", messages: { en: {} } });
function Atelier() {
const [value, setValue] = useState("oo1:c=FF781C;sp=cat;la=soft;ir=green;ew=round;hd=chef");
return (
<OoAtelierDialog
open
onOpenChange={() => undefined}
value={value}
identity="fixture"
onChange={setValue}
allowUpload
/>
);
}
createRoot(document.getElementById("root")!).render(
<I18nProvider i18n={i18n}>
<main className="min-h-screen bg-background text-foreground">
<Atelier />
</main>
</I18nProvider>,
);

View File

@ -0,0 +1,59 @@
import { expect, test } from "@playwright/test";
import { captureScreenshot, completeOnboarding, signup } from "./helpers";
test("bot settings open the Atelier and dress the Oo", async ({ page }, testInfo) => {
const stamp = Date.now();
await signup(page, `oo-atelier-${stamp}@rakazo.test`, "password12", "Atelier");
await completeOnboarding(page);
await page.goto("/app");
await page.waitForURL(/\/app\/[^/]+$/);
await page.getByTestId("bot-settings-trigger").click();
const settings = page.getByTestId("bot-settings");
await expect(settings).toBeVisible();
await settings.getByTestId("oo-atelier-trigger").click();
const atelier = page.getByTestId("oo-atelier");
await expect(atelier).toBeVisible();
await expect(atelier.getByTestId("oo-atelier-body")).toBeVisible();
await atelier.getByRole("button", { name: "Cat", exact: true }).click();
await expect(
atelier.locator('[data-testid="oo-atelier-preview"] svg[data-oo-species="cat"]'),
).toBeVisible();
await captureScreenshot(page, testInfo, "oo-atelier-body");
await atelier.getByRole("tab", { name: "Eyes" }).click();
await atelier.getByRole("button", { name: "Full", exact: true }).click();
await atelier.getByRole("button", { name: "Green", exact: true }).click();
await captureScreenshot(page, testInfo, "oo-atelier-eyes");
await atelier.getByRole("tab", { name: "Extras" }).click();
await atelier.getByRole("button", { name: "Round", exact: true }).click();
await atelier.getByRole("button", { name: "Chef's hat", exact: true }).click();
await captureScreenshot(page, testInfo, "oo-atelier-extras");
await atelier.getByRole("button", { name: "Done", exact: true }).click();
await expect(atelier).toBeHidden();
const avatar = settings.locator('[data-testid="oo-atelier-trigger"] svg[data-oo-species="cat"]');
await expect(avatar).toBeVisible();
await page.reload();
await page.getByTestId("bot-settings-trigger").click();
await expect(
page.locator(
'[data-testid="bot-settings"] [data-testid="oo-atelier-trigger"] svg[data-oo-species="cat"]',
),
).toBeVisible();
});
for (const theme of ["light", "dark"] as const) {
test(`Atelier reads well in ${theme} mode`, async ({ page }, testInfo) => {
await page.emulateMedia({ colorScheme: theme });
await page.goto(`/e2e/fixtures/oo-atelier.html?theme=${theme}`);
const atelier = page.getByTestId("oo-atelier");
await expect(atelier).toBeVisible();
await expect(atelier.locator("svg[data-oo-species]").first()).toBeVisible();
await captureScreenshot(page, testInfo, `oo-atelier-${theme}`);
});
}

View File

@ -0,0 +1,616 @@
import { Trans, useLingui } from "@lingui/react/macro";
import type { OoAvatar, OoMoment } from "@rakazo/core";
import {
DEFAULT_OO_AVATAR,
encodeOoAvatar,
OO_ARMS,
OO_BROWS,
OO_CHEEKS,
OO_CLASSIC_SHAPE_COUNT,
OO_ENERGY_RANGE,
OO_EYESHADOWS,
OO_EYEWEAR,
OO_HEADWEAR,
OO_IRISES,
OO_LASHES,
OO_LINERS,
OO_NECKWEAR,
OO_PALETTE_HEXES,
OO_SPARKLES,
OO_SPECIES,
ooLookForEditing,
ooRandomAvatar,
} from "@rakazo/core";
import {
BotAvatar,
Dialog,
DialogContent,
DialogDescription,
DialogFooter,
DialogHeader,
DialogTitle,
OoFigure,
Tabs,
TabsContent,
TabsList,
TabsTrigger,
} from "@rakazo/ui-web";
import { Check, Dices, Pencil, Upload, X } from "lucide-react";
import type { ClipboardEvent, DragEvent, ReactNode } from "react";
import { useRef, useState } from "react";
type Field = keyof OoAvatar;
/** Option rows of the Atelier; every value is drawn as the Oo wearing it. */
function useOptionLabels() {
const { t } = useLingui();
const none = t`None`;
return {
species: {
classic: t`Classic`,
cat: t`Cat`,
dog: t`Dog`,
bunny: t`Bunny`,
bear: t`Bear`,
robot: t`Robot`,
ghost: t`Ghost`,
frog: t`Frog`,
penguin: t`Penguin`,
},
lashes: { none, soft: t`Soft`, full: t`Full`, flick: t`Flick` },
liner: { none, wing: t`Winged` },
eyeshadow: { none, rose: t`Rose`, lilac: t`Lilac`, gold: t`Gold`, mint: t`Mint` },
iris: {
classic: t`Classic`,
brown: t`Brown`,
blue: t`Blue`,
green: t`Green`,
violet: t`Violet`,
},
sparkle: { dot: t`Dot`, star: t`Star`, heart: t`Heart` },
brows: { auto: t`When needed`, fine: t`Fine`, bushy: t`Bushy` },
cheeks: { none, pink: t`Pink`, peach: t`Peach`, freckles: t`Freckles` },
eyewear: {
none,
round: t`Round`,
nerd: t`Nerd`,
sun: t`Sunglasses`,
heart: t`Heart`,
monocle: t`Monocle`,
reading: t`Reading glasses`,
},
head: {
none,
chef: t`Chef's hat`,
crown: t`Crown`,
headphones: t`Headphones`,
bow: t`Bow`,
beanie: t`Beanie`,
flower: t`Flower`,
party: t`Party hat`,
},
neck: { none, bowtie: t`Bow tie`, scarf: t`Scarf`, bell: t`Bell` },
arms: { glass: t`Glass`, stub: t`Stub`, paw: t`Paw`, robot: t`Robot`, none },
} as const;
}
function OptionGroup<T extends string | number>({
title,
values,
selected,
label,
render,
onSelect,
}: {
title: string;
values: readonly T[];
selected: T;
label: (value: T) => string;
render: (value: T) => ReactNode;
onSelect: (value: T) => void;
}) {
return (
<fieldset>
<legend className="mb-1.5 text-ui-label font-medium text-muted-foreground">{title}</legend>
<div className="flex flex-wrap gap-1.5">
{values.map((value) => {
const active = value === selected;
return (
<button
key={value}
type="button"
aria-label={label(value)}
title={label(value)}
aria-pressed={active}
onClick={() => onSelect(value)}
className={`grid size-12 place-items-center overflow-hidden rounded-xl transition-transform hover:scale-105 active:scale-95 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring ${
active ? "bg-foreground/10 ring-2 ring-primary" : "bg-muted/60 hover:bg-muted"
}`}
>
{render(value)}
</button>
);
})}
</div>
</fieldset>
);
}
export interface OoAtelierDialogProps {
open: boolean;
onOpenChange: (open: boolean) => void;
value: string;
identity: string;
status?: string;
onChange: (value: string) => void;
/** Bots may wear an uploaded picture instead of an Oo. */
allowUpload?: boolean;
}
export function OoAtelierDialog({
open,
onOpenChange,
value,
identity,
status,
onChange,
allowUpload = false,
}: OoAtelierDialogProps) {
const { t } = useLingui();
const labels = useOptionLabels();
const [draft, setDraft] = useState<OoAvatar | null>(null);
const [preview, setPreview] = useState<OoMoment | undefined>(undefined);
const [dragOver, setDragOver] = useState(false);
const fileInputRef = useRef<HTMLInputElement>(null);
const isPicture = value.startsWith("data:image/");
const look = draft ?? ooLookForEditing(value, identity);
const encoded = encodeOoAvatar(look);
function commit(next: OoAvatar) {
setDraft(null);
onChange(encodeOoAvatar(next));
}
function set<K extends Field>(field: K, next: OoAvatar[K]) {
commit({ ...look, [field]: next });
}
function slide(field: "energy" | "playful", next: number) {
setDraft({ ...look, [field]: next });
setPreview(field === "energy" ? "working" : "greeting");
}
function settle() {
if (draft) commit(draft);
setPreview(undefined);
}
function thumb(next: Partial<OoAvatar>, focus: "body" | "face" = "body") {
return (
<OoFigure
avatar={{ ...look, ...next }}
color={next.color ?? look.color}
fallbackShape={next.shape ?? look.shape ?? 0}
moment="idle"
size={44}
focus={focus}
still
/>
);
}
function processImageFile(file: File) {
if (!file.type.startsWith("image/")) return;
const reader = new FileReader();
reader.onload = (event) => {
const src = event.target?.result as string;
if (!src) return;
const img = new Image();
img.onload = () => {
const canvas = document.createElement("canvas");
const ctx = canvas.getContext("2d");
const targetSize = 256;
canvas.width = targetSize;
canvas.height = targetSize;
if (!ctx) return;
ctx.beginPath();
ctx.arc(targetSize / 2, targetSize / 2, targetSize / 2, 0, Math.PI * 2);
ctx.clip();
const minDim = Math.min(img.width, img.height);
const sx = (img.width - minDim) / 2;
const sy = (img.height - minDim) / 2;
ctx.drawImage(img, sx, sy, minDim, minDim, 0, 0, targetSize, targetSize);
onChange(canvas.toDataURL("image/webp", 0.9));
onOpenChange(false);
};
img.src = src;
};
reader.readAsDataURL(file);
}
function handleDrop(event: DragEvent<HTMLButtonElement>) {
event.preventDefault();
setDragOver(false);
const file = event.dataTransfer.files?.[0];
if (file) processImageFile(file);
}
function handlePaste(event: ClipboardEvent<HTMLButtonElement>) {
const items = event.clipboardData?.items;
if (!items) return;
for (let index = 0; index < items.length; index += 1) {
const item = items[index];
if (!item?.type.startsWith("image/")) continue;
const file = item.getAsFile();
if (file) {
processImageFile(file);
break;
}
}
}
const sliderClass = "w-full accent-primary";
return (
<Dialog open={open} onOpenChange={onOpenChange}>
<DialogContent
showCloseButton={false}
className="max-h-[92vh] w-[420px] max-w-full gap-3 overflow-y-auto rounded-3xl p-5 sm:max-w-[420px]"
data-testid="oo-atelier"
>
<DialogHeader className="flex-row items-center justify-between space-y-0">
<DialogTitle className="text-ui-body font-semibold tracking-tight">
<Trans>Atelier</Trans>
</DialogTitle>
<DialogDescription className="sr-only">
<Trans>Choose how your Oo looks and moves</Trans>
</DialogDescription>
<button
type="button"
onClick={() => onOpenChange(false)}
className="flex size-7 items-center justify-center rounded-full text-muted-foreground transition-colors hover:bg-muted hover:text-foreground"
aria-label={t`Close`}
>
<X className="size-icon-md" />
</button>
</DialogHeader>
<div className="flex justify-center py-1" data-testid="oo-atelier-preview">
<BotAvatar
color={isPicture && !draft ? value : encoded}
identity={identity}
status={status}
size={128}
moment={preview}
interactive
/>
</div>
<Tabs defaultValue="body">
<TabsList className="w-full">
<TabsTrigger value="body">
<Trans>Body</Trans>
</TabsTrigger>
<TabsTrigger value="eyes">
<Trans>Eyes</Trans>
</TabsTrigger>
<TabsTrigger value="extras">
<Trans>Extras</Trans>
</TabsTrigger>
{allowUpload ? (
<TabsTrigger value="upload">
<Trans>Upload</Trans>
</TabsTrigger>
) : null}
</TabsList>
<TabsContent value="body" className="space-y-4 pt-2" data-testid="oo-atelier-body">
<OptionGroup
title={t`Species`}
values={OO_SPECIES}
selected={look.species}
label={(species) => labels.species[species]}
render={(species) =>
thumb({ species, arms: species === "robot" ? "robot" : look.arms })
}
onSelect={(species) =>
commit({
...look,
species,
arms: species === "robot" ? "robot" : look.arms === "robot" ? "glass" : look.arms,
})
}
/>
{look.species === "classic" ? (
<OptionGroup
title={t`Shape`}
values={Array.from({ length: OO_CLASSIC_SHAPE_COUNT }, (_, index) => index)}
selected={look.shape ?? -1}
label={(shape) => t`Shape ${shape + 1}`}
render={(shape) => thumb({ shape })}
onSelect={(shape) => set("shape", shape)}
/>
) : null}
<fieldset>
<legend className="mb-1.5 text-ui-label font-medium text-muted-foreground">
<Trans>Color</Trans>
</legend>
<div className="flex flex-wrap items-center gap-2">
{OO_PALETTE_HEXES.map((color) => {
const selected = !isPicture && look.color.toLowerCase() === color.toLowerCase();
return (
<button
key={color}
type="button"
onClick={() => set("color", color)}
aria-label={t`Color ${color}`}
aria-pressed={selected}
className={`size-7 rounded-full border transition-transform hover:scale-110 active:scale-95 focus-visible:ring-2 focus-visible:ring-ring ${
selected
? "scale-105 border-transparent ring-2 ring-foreground ring-offset-2 ring-offset-popover"
: "border-border"
}`}
style={{ backgroundColor: color }}
/>
);
})}
<input
type="color"
aria-label={t`Custom color`}
value={look.color.length === 7 ? look.color : DEFAULT_OO_AVATAR.color}
onChange={(event) => setDraft({ ...look, color: event.target.value })}
onBlur={settle}
className="size-7 cursor-pointer rounded-full border border-border bg-transparent p-0"
/>
</div>
</fieldset>
<div className="grid grid-cols-2 gap-4">
<label className="text-ui-label font-medium text-muted-foreground">
<Trans>Energy</Trans>
<input
type="range"
min={OO_ENERGY_RANGE.min}
max={OO_ENERGY_RANGE.max}
step={0.05}
value={look.energy}
onChange={(event) => slide("energy", Number(event.target.value))}
onPointerUp={settle}
onKeyUp={settle}
onBlur={settle}
className={sliderClass}
/>
</label>
<label className="text-ui-label font-medium text-muted-foreground">
<Trans>Playful</Trans>
<input
type="range"
min={0}
max={1}
step={0.05}
value={look.playful}
onChange={(event) => slide("playful", Number(event.target.value))}
onPointerUp={settle}
onKeyUp={settle}
onBlur={settle}
className={sliderClass}
/>
</label>
</div>
</TabsContent>
<TabsContent value="eyes" className="space-y-4 pt-2" data-testid="oo-atelier-eyes">
<OptionGroup
title={t`Lashes`}
values={OO_LASHES}
selected={look.lashes}
label={(lashes) => labels.lashes[lashes]}
render={(lashes) => thumb({ lashes }, "face")}
onSelect={(lashes) => set("lashes", lashes)}
/>
<OptionGroup
title={t`Eyeliner`}
values={OO_LINERS}
selected={look.liner}
label={(liner) => labels.liner[liner]}
render={(liner) => thumb({ liner }, "face")}
onSelect={(liner) => set("liner", liner)}
/>
<OptionGroup
title={t`Eyeshadow`}
values={OO_EYESHADOWS}
selected={look.eyeshadow}
label={(eyeshadow) => labels.eyeshadow[eyeshadow]}
render={(eyeshadow) => thumb({ eyeshadow }, "face")}
onSelect={(eyeshadow) => set("eyeshadow", eyeshadow)}
/>
<OptionGroup
title={t`Iris`}
values={OO_IRISES}
selected={look.iris}
label={(iris) => labels.iris[iris]}
render={(iris) => thumb({ iris }, "face")}
onSelect={(iris) => set("iris", iris)}
/>
<OptionGroup
title={t`Sparkle`}
values={OO_SPARKLES}
selected={look.sparkle}
label={(sparkle) => labels.sparkle[sparkle]}
render={(sparkle) => thumb({ sparkle }, "face")}
onSelect={(sparkle) => set("sparkle", sparkle)}
/>
<OptionGroup
title={t`Brows`}
values={OO_BROWS}
selected={look.brows}
label={(brows) => labels.brows[brows]}
render={(brows) => thumb({ brows }, "face")}
onSelect={(brows) => set("brows", brows)}
/>
<OptionGroup
title={t`Cheeks`}
values={OO_CHEEKS}
selected={look.cheeks}
label={(cheeks) => labels.cheeks[cheeks]}
render={(cheeks) => thumb({ cheeks }, "face")}
onSelect={(cheeks) => set("cheeks", cheeks)}
/>
</TabsContent>
<TabsContent value="extras" className="space-y-4 pt-2" data-testid="oo-atelier-extras">
<OptionGroup
title={t`Glasses`}
values={OO_EYEWEAR}
selected={look.eyewear}
label={(eyewear) => labels.eyewear[eyewear]}
render={(eyewear) => thumb({ eyewear }, "face")}
onSelect={(eyewear) => set("eyewear", eyewear)}
/>
<OptionGroup
title={t`Hat`}
values={OO_HEADWEAR}
selected={look.head}
label={(head) => labels.head[head]}
render={(head) => thumb({ head })}
onSelect={(head) => set("head", head)}
/>
<OptionGroup
title={t`Neck`}
values={OO_NECKWEAR}
selected={look.neck}
label={(neck) => labels.neck[neck]}
render={(neck) => thumb({ neck })}
onSelect={(neck) => set("neck", neck)}
/>
<OptionGroup
title={t`Arms`}
values={OO_ARMS}
selected={look.arms}
label={(arms) => labels.arms[arms]}
render={(arms) => thumb({ arms })}
onSelect={(arms) => set("arms", arms)}
/>
</TabsContent>
{allowUpload ? (
<TabsContent value="upload" className="pt-2">
<button
type="button"
aria-label={t`Image upload area`}
onDragOver={(event) => {
event.preventDefault();
setDragOver(true);
}}
onDragLeave={() => setDragOver(false)}
onDrop={handleDrop}
onPaste={handlePaste}
onClick={() => fileInputRef.current?.click()}
className={`flex w-full flex-col items-center justify-center rounded-xl border border-dashed p-6 text-center transition-colors ${
dragOver
? "border-primary bg-primary/10"
: "border-border bg-muted hover:border-foreground/30"
}`}
>
<input
ref={fileInputRef}
type="file"
accept="image/*"
className="hidden"
onChange={(event) => {
const file = event.target.files?.[0];
if (file) processImageFile(file);
}}
/>
<div className="mb-2 grid size-10 place-items-center rounded-full bg-secondary text-muted-foreground">
<Upload strokeWidth={1.8} className="size-icon-lg" />
</div>
<p className="text-ui-body-sm font-medium text-muted-foreground">
<Trans>Drag, drop, or paste an image</Trans>
</p>
<span className="mt-3 rounded-lg bg-secondary px-3 py-1.5 text-ui-label font-medium text-foreground">
<Trans>Choose file</Trans>
</span>
</button>
</TabsContent>
) : null}
</Tabs>
<DialogFooter className="flex-row items-center justify-between border-border sm:justify-between">
<div className="flex items-center gap-1">
<button
type="button"
onClick={() => commit(ooRandomAvatar())}
aria-label={t`Surprise me`}
title={t`Surprise me`}
className="flex size-8 items-center justify-center rounded-full text-muted-foreground transition-colors hover:bg-muted hover:text-foreground"
>
<Dices className="size-icon-md" />
</button>
<button
type="button"
onClick={() => commit({ ...DEFAULT_OO_AVATAR, color: look.color })}
className="px-2 py-1 text-ui-label font-medium text-muted-foreground transition-colors hover:text-foreground"
>
<Trans>Reset</Trans>
</button>
</div>
<button
type="button"
onClick={() => onOpenChange(false)}
className="flex items-center gap-1.5 rounded-xl bg-secondary px-4 py-1.5 text-ui-body-sm font-medium text-foreground transition-colors hover:bg-accent"
>
<Check className="size-icon-md" />
<Trans>Done</Trans>
</button>
</DialogFooter>
</DialogContent>
</Dialog>
);
}
export interface OoAtelierProps {
value: string;
identity?: string;
status?: string;
size?: number;
onChange: (value: string) => void;
disabled?: boolean;
}
/** The bot's avatar; tapping it opens the Atelier. */
export function OoAtelier({
value,
identity = "",
status,
size = 72,
onChange,
disabled = false,
}: OoAtelierProps) {
const { t } = useLingui();
const [open, setOpen] = useState(false);
return (
<>
<button
type="button"
disabled={disabled}
onClick={() => setOpen(true)}
className="group relative cursor-pointer rounded-2xl outline-none transition-transform hover:scale-[1.03] focus-visible:ring-2 focus-visible:ring-ring"
aria-label={t`Customize bot avatar`}
data-testid="oo-atelier-trigger"
>
<BotAvatar color={value} identity={identity} size={size} status={status} />
<div className="absolute -right-1 -bottom-1 flex size-6 items-center justify-center rounded-full border-2 border-background bg-secondary text-foreground shadow-md transition-transform group-hover:scale-110">
<Pencil strokeWidth={2.2} className="size-icon-sm" />
</div>
</button>
<OoAtelierDialog
open={open}
onOpenChange={setOpen}
value={value}
identity={identity}
status={status}
onChange={onChange}
allowUpload
/>
</>
);
}

View File

@ -1,4 +1,5 @@
import { Trans, useLingui } from "@lingui/react/macro";
import type { EvooPose } from "@rakazo/ui-web";
import { BotAvatar, Button } from "@rakazo/ui-web";
import { type ReactNode, useCallback, useEffect, useMemo, useState } from "react";
import {
@ -8,12 +9,10 @@ import {
type LookPreset,
lookPresetToAvatarValue,
} from "../../lib/onboarding-look-categories";
import { OoAtelierDialog } from "../OoAtelier";
import { LookPreviewCarousel } from "./LookPreviewCarousel";
export interface OnboardingEmojiConfig {
color: string;
shapeIndex: number;
accessory: string;
pose: string;
avatarValue: string;
}
@ -43,23 +42,8 @@ function categoryLabel(id: LookCategoryId): ReactNode {
}
}
function presetFromConfig(config: OnboardingEmojiConfig): LookPreset {
return {
id: "custom",
color: config.color,
shapeIndex: config.shapeIndex,
pose: config.pose as LookPreset["pose"],
};
}
function configFromPreset(preset: LookPreset): OnboardingEmojiConfig {
return {
color: preset.color,
shapeIndex: preset.shapeIndex,
accessory: "none",
pose: preset.pose,
avatarValue: lookPresetToAvatarValue(preset),
};
return { pose: preset.pose, avatarValue: lookPresetToAvatarValue(preset) };
}
export function OnboardingOoDesigner({ config, onChange, onContinue }: OnboardingOoDesignerProps) {
@ -80,29 +64,19 @@ export function OnboardingOoDesigner({ config, onChange, onContinue }: Onboardin
[onChange],
);
const [atelierOpen, setAtelierOpen] = useState(false);
useEffect(() => {
const match = LOOK_CATEGORIES.find((entry) =>
entry.looks.some(
(look) =>
look.color.toLowerCase() === config.color.toLowerCase() &&
look.shapeIndex === config.shapeIndex &&
look.pose === config.pose,
),
entry.looks.some((look) => look.avatar === config.avatarValue),
);
if (match) {
const index = match.looks.findIndex(
(look) =>
look.color.toLowerCase() === config.color.toLowerCase() &&
look.shapeIndex === config.shapeIndex &&
look.pose === config.pose,
);
const index = match.looks.findIndex((look) => look.avatar === config.avatarValue);
setCategoryId(match.id);
setLookIndex(index >= 0 ? index : 0);
}
}, []);
const activeLook = category.looks[lookIndex] ?? presetFromConfig(config);
const handleLookIndexChange = useCallback(
(index: number) => {
const preset = category.looks[index];
@ -132,10 +106,11 @@ export function OnboardingOoDesigner({ config, onChange, onContinue }: Onboardin
onIndexChange={handleLookIndexChange}
preview={
<BotAvatar
color={lookPresetToAvatarValue(activeLook)}
color={config.avatarValue}
size={168}
identity="onboarding-preview"
pose={activeLook.pose}
pose={config.pose as EvooPose}
interactive
/>
}
/>
@ -174,13 +149,30 @@ export function OnboardingOoDesigner({ config, onChange, onContinue }: Onboardin
</div>
<div className="mt-8 flex items-center justify-between">
<div className="flex items-center gap-1">
<Button variant="ghost" size="sm" onClick={resetLook}>
<Trans>Reset</Trans>
</Button>
<Button
variant="outline"
size="sm"
onClick={() => setAtelierOpen(true)}
data-testid="onboarding-oo-customize"
>
<Trans>Customize</Trans>
</Button>
</div>
<Button onClick={onContinue}>
<Trans>Continue</Trans>
</Button>
</div>
<OoAtelierDialog
open={atelierOpen}
onOpenChange={setAtelierOpen}
value={config.avatarValue}
identity="onboarding-preview"
onChange={(avatarValue) => onChange({ ...config, avatarValue })}
/>
</div>
);
}

View File

@ -1,6 +1,6 @@
import { isValidAvatarValue } from "@rakazo/core";
import { describe, expect, it } from "vitest";
import {
buildAvatarValue,
findLookCategory,
LOOK_CATEGORIES,
lookPresetToAvatarValue,
@ -14,10 +14,13 @@ describe("onboarding-look-categories", () => {
}
});
it("builds avatar values in color::shape format", () => {
const look = findLookCategory("coder").looks[0]!;
expect(lookPresetToAvatarValue(look)).toBe(buildAvatarValue(look.color, look.shapeIndex));
expect(buildAvatarValue("#8B5CF6", 2)).toBe("#8B5CF6::shape_2");
it("stores every look as a valid avatar value", () => {
for (const category of LOOK_CATEGORIES) {
for (const look of category.looks) {
expect(isValidAvatarValue(lookPresetToAvatarValue(look)), look.id).toBe(true);
expect(look.avatar.startsWith("oo1:"), look.id).toBe(true);
}
}
});
it("falls back to the first category for unknown ids", () => {

View File

@ -4,8 +4,8 @@ export type LookCategoryId = "work" | "hobby" | "scene" | "coder" | "calm";
export interface LookPreset {
id: string;
color: string;
shapeIndex: number;
/** Encoded `oo1:` look. */
avatar: string;
pose: EvooPose;
}
@ -14,51 +14,59 @@ export interface LookCategory {
looks: LookPreset[];
}
/** Curated look families built from existing shape, color, and pose taxonomies. */
/** Curated looks per vibe; each starts a different species so the first swipe shows the range. */
export const LOOK_CATEGORIES: LookCategory[] = [
{
id: "work",
looks: [
{ id: "work-violet-hex", color: "#8B5CF6", shapeIndex: 0, pose: "working" },
{ id: "work-blue-tablet", color: "#3B82F6", shapeIndex: 3, pose: "analyzing" },
{ id: "work-white-squircle", color: "#FFFFFF", shapeIndex: 2, pose: "listening" },
{ id: "work-green-wedge", color: "#10B981", shapeIndex: 1, pose: "reading" },
{ id: "work-violet", avatar: "oo1:c=8B5CF6;ew=round;nk=bowtie", pose: "working" },
{ id: "work-penguin", avatar: "oo1:c=3B82F6;sp=penguin;ew=reading", pose: "analyzing" },
{
id: "work-robot",
avatar: "oo1:c=FFFFFF;sp=robot;ar=robot;hd=headphones",
pose: "listening",
},
{ id: "work-bear", avatar: "oo1:c=8D6E63;sp=bear;ar=paw;ew=nerd", pose: "reading" },
],
},
{
id: "hobby",
looks: [
{ id: "hobby-orange-blob", color: "#F97316", shapeIndex: 5, pose: "delighted" },
{ id: "hobby-yellow-pebble", color: "#EAB308", shapeIndex: 4, pose: "curious" },
{ id: "hobby-red-teardrop", color: "#EF4444", shapeIndex: 6, pose: "greeting" },
{ id: "hobby-cyan-cloud", color: "#06B6D4", shapeIndex: 7, pose: "speaking" },
{ id: "hobby-dog", avatar: "oo1:c=F97316;sp=dog;ar=paw;nk=scarf", pose: "delighted" },
{ id: "hobby-frog", avatar: "oo1:c=10B981;sp=frog;hd=flower", pose: "curious" },
{ id: "hobby-cat", avatar: "oo1:c=EAB308;sp=cat;ar=paw;hd=beanie", pose: "greeting" },
{ id: "hobby-chef", avatar: "oo1:c=EF4444;sh=6;hd=chef", pose: "speaking" },
],
},
{
id: "scene",
looks: [
{ id: "scene-red-wedge", color: "#EF4444", shapeIndex: 1, pose: "speaking" },
{ id: "scene-violet-teardrop", color: "#8B5CF6", shapeIndex: 6, pose: "delighted" },
{ id: "scene-cyan-hex", color: "#06B6D4", shapeIndex: 0, pose: "collaborating" },
{ id: "scene-orange-squircle", color: "#F97316", shapeIndex: 2, pose: "success" },
{ id: "scene-cat", avatar: "oo1:c=EC4899;sp=cat;la=full;li=wing;ew=sun", pose: "speaking" },
{
id: "scene-bunny",
avatar: "oo1:c=FFFFFF;sp=bunny;la=full;es=rose;sk=heart;ew=heart",
pose: "delighted",
},
{ id: "scene-ghost", avatar: "oo1:c=8B5CF6;sp=ghost;hd=party", pose: "collaborating" },
{ id: "scene-crown", avatar: "oo1:c=06B6D4;sh=2;hd=crown;sk=star", pose: "success" },
],
},
{
id: "coder",
looks: [
{ id: "coder-cyan-hex", color: "#06B6D4", shapeIndex: 0, pose: "working" },
{ id: "coder-green-squircle", color: "#10B981", shapeIndex: 2, pose: "analyzing" },
{ id: "coder-blue-tablet", color: "#3B82F6", shapeIndex: 3, pose: "thinking" },
{ id: "coder-violet-pebble", color: "#8B5CF6", shapeIndex: 4, pose: "collaborating" },
{ id: "coder-robot", avatar: "oo1:c=06B6D4;sp=robot;ar=robot;sk=star", pose: "working" },
{ id: "coder-cat", avatar: "oo1:c=10B981;sp=cat;ew=nerd;hd=headphones", pose: "analyzing" },
{ id: "coder-hex", avatar: "oo1:c=3B82F6;sh=0;ew=round;hd=beanie", pose: "thinking" },
{ id: "coder-ghost", avatar: "oo1:c=8B5CF6;sp=ghost;ew=reading", pose: "collaborating" },
],
},
{
id: "calm",
looks: [
{ id: "calm-green-cloud", color: "#10B981", shapeIndex: 7, pose: "greeting" },
{ id: "calm-violet-blob", color: "#8B5CF6", shapeIndex: 5, pose: "listening" },
{ id: "calm-white-pebble", color: "#FFFFFF", shapeIndex: 4, pose: "idle" },
{ id: "calm-cyan-squircle", color: "#06B6D4", shapeIndex: 2, pose: "curious" },
{ id: "calm-cloud", avatar: "oo1:c=10B981;sh=7;ck=pink", pose: "greeting" },
{ id: "calm-bear", avatar: "oo1:c=8B5CF6;sp=bear;ar=paw;nk=scarf", pose: "listening" },
{ id: "calm-bunny", avatar: "oo1:c=FFFFFF;sp=bunny;la=soft;ck=peach", pose: "idle" },
{ id: "calm-penguin", avatar: "oo1:c=06B6D4;sp=penguin;nk=bell", pose: "curious" },
],
},
];
@ -73,10 +81,6 @@ export function findLookCategory(id: LookCategoryId): LookCategory {
return category;
}
export function buildAvatarValue(color: string, shapeIndex: number): string {
return `${color}::shape_${shapeIndex}`;
}
export function lookPresetToAvatarValue(look: LookPreset): string {
return buildAvatarValue(look.color, look.shapeIndex);
return look.avatar;
}

View File

@ -668,6 +668,10 @@ msgstr "Möchtest du dein Konto wirklich löschen? Das kann nicht rückgängig g
msgid "Arguments"
msgstr "Argumente"
#: src/components/OoAtelier.tsx
msgid "Arms"
msgstr "Arme"
#. placeholder {0}: rule.matchValue
#: src/components/ApprovalRulesSettings.tsx
msgid "Ask before {0}"
@ -716,6 +720,10 @@ msgstr "um {0}"
msgid "at {timeSelect}"
msgstr "um {timeSelect}"
#: src/components/OoAtelier.tsx
msgid "Atelier"
msgstr "Atelier"
#: src/pages/shell/composer.tsx
msgid "Attach file"
msgstr "Datei anhängen"
@ -756,10 +764,6 @@ msgstr "Automatische Absender erscheinen, sobald sie hier etwas posten."
msgid "Available after the routine is saved"
msgstr "Verfügbar, sobald die Routine gespeichert ist"
#: src/pages/shell/avatar-studio-popover.tsx
msgid "Avatar Studio"
msgstr "Avatar-Studio"
#: src/components/browser/InAppBrowser.tsx
#: src/components/CookingMode.tsx
#: src/components/onboarding/OnboardingVoiceStep.tsx
@ -781,15 +785,35 @@ msgstr "Zurück zur Zeitleiste"
msgid "Base URL"
msgstr "Basis-URL"
#: src/components/OoAtelier.tsx
msgid "Beanie"
msgstr "Mütze"
#: src/components/OoAtelier.tsx
msgid "Bear"
msgstr "Bär"
#: src/pages/memory-providers/SerenitySettingsForm.tsx
#: src/pages/PluginsOverlay.tsx
msgid "Bearer token"
msgstr "Bearer-Token"
#: src/components/OoAtelier.tsx
msgid "Bell"
msgstr "Glöckchen"
#: src/components/NotificationSettingsPanel.tsx
msgid "Blocked in your browser settings"
msgstr "In deinen Browser-Einstellungen blockiert"
#: src/components/OoAtelier.tsx
msgid "Blue"
msgstr "Blau"
#: src/components/OoAtelier.tsx
msgid "Body"
msgstr "Körper"
#: src/pages/shell/computer-screen.tsx
msgid "Booting live desktop…"
msgstr "Live-Desktop wird gestartet…"
@ -810,7 +834,6 @@ msgstr "Bot"
#: src/pages/IntegrationSetup.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/avatar-studio-popover.tsx
msgid "Bot"
msgstr "Bot"
@ -834,10 +857,26 @@ msgstr "Bots handeln standardmäßig ohne Nachfrage. Füge nur dann eine Ausnahm
msgid "Bots are working"
msgstr "Bots arbeiten"
#: src/components/OoAtelier.tsx
msgid "Bow"
msgstr "Schleife"
#: src/components/OoAtelier.tsx
msgid "Bow tie"
msgstr "Fliege"
#: src/pages/memory-providers/SerenitySettingsForm.tsx
msgid "Brain label"
msgstr "Brain-Bezeichnung"
#: src/components/OoAtelier.tsx
msgid "Brown"
msgstr "Braun"
#: src/components/OoAtelier.tsx
msgid "Brows"
msgstr "Brauen"
#: src/pages/PluginsOverlay.tsx
msgid "Browse MCP servers"
msgstr "MCP-Server durchsuchen"
@ -846,6 +885,14 @@ msgstr "MCP-Server durchsuchen"
msgid "Browser"
msgstr "Browser"
#: src/components/OoAtelier.tsx
msgid "Bunny"
msgstr "Hase"
#: src/components/OoAtelier.tsx
msgid "Bushy"
msgstr "Buschig"
#: src/pages/Shell.tsx
msgid "Busy"
msgstr "Beschäftigt"
@ -911,6 +958,10 @@ msgstr "Abgebrochen"
msgid "Cancelled"
msgstr "Abgebrochen"
#: src/components/OoAtelier.tsx
msgid "Cat"
msgstr "Katze"
#: src/components/UserFactEditor.tsx
msgid "Category"
msgstr "Kategorie"
@ -1006,9 +1057,13 @@ msgstr "Wird geprüft…"
msgid "Checkout has local changes. Clean it before updating."
msgstr "Der Checkout hat lokale Änderungen. Bereinige ihn vor dem Update."
#: src/pages/shell/avatar-studio-popover.tsx
msgid "Choose a bot shape, color, or upload an image"
msgstr "Wähle eine Bot-Form und Farbe oder lade ein Bild hoch"
#: src/components/OoAtelier.tsx
msgid "Cheeks"
msgstr "Wangen"
#: src/components/OoAtelier.tsx
msgid "Chef's hat"
msgstr "Kochmütze"
#: src/pages/MessagingSettingsOverlay.tsx
msgid "Choose a bot…"
@ -1026,7 +1081,7 @@ msgstr "Wähle ein neues Passwort"
msgid "Choose an existing folder on this computer. Git remotes are linked automatically when a repository is present."
msgstr "Wähle einen vorhandenen Ordner auf diesem Computer. Git-Remotes werden automatisch verknüpft, wenn ein Repository vorhanden ist."
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Choose file"
msgstr "Datei wählen"
@ -1034,6 +1089,10 @@ msgstr "Datei wählen"
msgid "Choose folder"
msgstr "Ordner wählen"
#: src/components/OoAtelier.tsx
msgid "Choose how your Oo looks and moves"
msgstr "Wähle, wie dein Oo aussieht und sich bewegt"
#: src/pages/ModelSettingsOverlay.tsx
msgid "Choose which connected model Rakazo uses."
msgstr "Wähle das verbundene Modell aus, das Rakazo verwendet."
@ -1046,6 +1105,10 @@ msgstr "Wähle deine Sprache"
msgid "Choosing the right shape…"
msgstr "Wähle die richtige Form…"
#: src/components/OoAtelier.tsx
msgid "Classic"
msgstr "Klassisch"
#: src/pages/shell/dialogs.tsx
msgid "Clear"
msgstr "Leeren"
@ -1076,12 +1139,12 @@ msgstr "Client-ID"
msgid "Client secret"
msgstr "Client-Secret"
#: src/components/OoAtelier.tsx
#: src/pages/KnowledgeSection.tsx
#: src/pages/MessagingSettingsOverlay.tsx
#: src/pages/PeerMessagesOverlay.tsx
#: src/pages/RoutineEditor.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/avatar-studio-popover.tsx
#: src/pages/WindowChrome.tsx
msgid "Close"
msgstr "Schließen"
@ -1165,11 +1228,11 @@ msgstr "Coder"
msgid "Collapse {0}"
msgstr "{0} einklappen"
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Color"
msgstr "Farbe"
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Color {color}"
msgstr "Farbe {color}"
@ -1846,15 +1909,27 @@ msgstr "Cron"
msgid "Cron expression"
msgstr "Cron-Ausdruck"
#: src/components/OoAtelier.tsx
msgid "Crown"
msgstr "Krone"
#: src/pages/AccountSettingsOverlay.tsx
msgid "Current password"
msgstr "Aktuelles Passwort"
#: src/components/OoAtelier.tsx
msgid "Custom color"
msgstr "Eigene Farbe"
#: src/pages/shell/dialogs.tsx
msgid "Customer support"
msgstr "Kundensupport"
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/onboarding/OnboardingOoDesigner.tsx
msgid "Customize"
msgstr "Anpassen"
#: src/components/OoAtelier.tsx
msgid "Customize bot avatar"
msgstr "Bot-Avatar anpassen"
@ -2056,6 +2131,10 @@ msgstr "Docker begrenzt für mehr Sicherheit den Zugriff auf deinen Computer. We
msgid "Does not speak"
msgstr "Spricht nicht"
#: src/components/OoAtelier.tsx
msgid "Dog"
msgstr "Hund"
#: src/pages/HeuteBrief.tsx
msgid "Doing"
msgstr "In Arbeit"
@ -2071,10 +2150,10 @@ msgstr "Kein Stress — wir sind jetzt da."
#: src/components/ai/DelegatedTaskCard.tsx
#: src/components/CookingMode.tsx
#: src/components/media/MediaCard.tsx
#: src/components/OoAtelier.tsx
#: src/components/ThreadCard.tsx
#: src/pages/HeuteBrief.tsx
#: src/pages/ProjectSessionTimeline.tsx
#: src/pages/shell/avatar-studio-popover.tsx
msgid "Done"
msgstr "Fertig"
@ -2083,6 +2162,10 @@ msgstr "Fertig"
msgid "Done"
msgstr "Erledigt"
#: src/components/OoAtelier.tsx
msgid "Dot"
msgstr "Punkt"
#. placeholder {0}: props.name
#: src/components/ArtifactFileCard.tsx
msgid "Download {0}"
@ -2120,7 +2203,7 @@ msgstr "Entwerfe die Spezifikation…"
msgid "Drag to reorder"
msgstr "Ziehen zum Umsortieren"
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Drag, drop, or paste an image"
msgstr "Bild ziehen, ablegen oder einfügen"
@ -2161,6 +2244,10 @@ msgstr "E-Mail"
msgid "Embeddings URL"
msgstr "Embeddings-URL"
#: src/components/OoAtelier.tsx
msgid "Energy"
msgstr "Energie"
#: src/pages/ExternalConversationSettings.tsx
msgid "Engage when... Ignore..."
msgstr "Reagieren, wenn ... Ignorieren ..."
@ -2288,6 +2375,22 @@ msgstr "Externe Unterhaltung"
msgid "Extra high"
msgstr "Sehr hoch"
#: src/components/OoAtelier.tsx
msgid "Extras"
msgstr "Extras"
#: src/components/OoAtelier.tsx
msgid "Eyeliner"
msgstr "Lidstrich"
#: src/components/OoAtelier.tsx
msgid "Eyes"
msgstr "Augen"
#: src/components/OoAtelier.tsx
msgid "Eyeshadow"
msgstr "Lidschatten"
#: src/components/UserFactEditor.tsx
msgid "Fact"
msgstr "Fakt"
@ -2345,6 +2448,10 @@ msgstr "Suche den richtigen Ton…"
msgid "Finding…"
msgstr "Suche läuft…"
#: src/components/OoAtelier.tsx
msgid "Fine"
msgstr "Fein"
#. placeholder {0}: new URL(oauth.verificationUri).hostname
#: src/pages/ModelSettingsOverlay.tsx
msgid "Finish signing in at <0>{0}</0>. The final page may not load; paste its URL or code here."
@ -2371,6 +2478,14 @@ msgstr "Erste {shownRows} Zeilen"
msgid "Flag unexpected actions"
msgstr "Unerwartete Aktionen markieren"
#: src/components/OoAtelier.tsx
msgid "Flick"
msgstr "Schwung"
#: src/components/OoAtelier.tsx
msgid "Flower"
msgstr "Blume"
#: src/pages/PrivacySettingsOverlay.tsx
msgid "Fonts loaded locally"
msgstr "Schriften lokal geladen"
@ -2395,10 +2510,22 @@ msgstr "Passwort vergessen?"
msgid "Forward"
msgstr "Vorwärts"
#: src/components/OoAtelier.tsx
msgid "Freckles"
msgstr "Sommersprossen"
#: src/pages/ModelSettingsOverlay.tsx
msgid "Free"
msgstr "Kostenlos"
#: src/components/OoAtelier.tsx
msgid "Frog"
msgstr "Frosch"
#: src/components/OoAtelier.tsx
msgid "Full"
msgstr "Voll"
#: src/pages/WindowChrome.tsx
msgid "Fullscreen"
msgstr "Vollbild"
@ -2427,10 +2554,22 @@ msgstr "Wird vorbereitet"
msgid "Getting ready…"
msgstr "Wird vorbereitet…"
#: src/components/OoAtelier.tsx
msgid "Ghost"
msgstr "Geist"
#: src/pages/RoutineEditor.tsx
msgid "Git event"
msgstr "Git-Ereignis"
#: src/components/OoAtelier.tsx
msgid "Glass"
msgstr "Glas"
#: src/components/OoAtelier.tsx
msgid "Glasses"
msgstr "Brille"
#: src/pages/ProjectSessionTimeline.tsx
msgid "Goal"
msgstr "Ziel"
@ -2445,6 +2584,14 @@ msgstr "Ziele"
msgid "Goals for this project, separate from chat messages. Conversations are below."
msgstr "Ziele für dieses Projekt, unabhängig von Chat-Nachrichten. Unterhaltungen findest du weiter unten."
#: src/components/OoAtelier.tsx
msgid "Gold"
msgstr "Gold"
#: src/components/OoAtelier.tsx
msgid "Green"
msgstr "Grün"
#: src/components/stage/OoStage.tsx
#: src/pages/MessagingSettingsOverlay.tsx
#: src/pages/Shell.tsx
@ -2490,6 +2637,10 @@ msgstr "Lege zuerst auf und gib dann den Code auf dem Bildschirm ein."
msgid "Hang up, then enter the code on screen."
msgstr "Lege auf und gib dann den Code auf dem Bildschirm ein."
#: src/components/OoAtelier.tsx
msgid "Hat"
msgstr "Kopf"
#: src/pages/RoutineEditor.tsx
msgid "header"
msgstr "Header"
@ -2503,6 +2654,10 @@ msgstr "Header-Name"
msgid "Header value"
msgstr "Header-Wert"
#: src/components/OoAtelier.tsx
msgid "Headphones"
msgstr "Kopfhörer"
#: src/components/UserProfileSettings.tsx
msgid "Health"
msgstr "Gesundheit"
@ -2511,6 +2666,10 @@ msgstr "Gesundheit"
msgid "Hear a sample"
msgstr "Beispiel anhören"
#: src/components/OoAtelier.tsx
msgid "Heart"
msgstr "Herz"
#: src/lib/voice-persona-copy.ts
msgid "Here's the read…"
msgstr "Meine Einschätzung…"
@ -2597,7 +2756,7 @@ msgstr "Ignorieren"
msgid "Image model"
msgstr "Bildmodell"
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Image upload area"
msgstr "Bild-Upload-Bereich"
@ -2671,6 +2830,10 @@ msgstr "Intervallwert"
msgid "Interval unit"
msgstr "Intervalleinheit"
#: src/components/OoAtelier.tsx
msgid "Iris"
msgstr "Iris"
#: src/pages/MemorySettingsOverlay.tsx
#: src/pages/shell/bot-panel.tsx
msgid "Isolated"
@ -2710,6 +2873,10 @@ msgstr "Wissen"
msgid "Language"
msgstr "Sprache"
#: src/components/OoAtelier.tsx
msgid "Lashes"
msgstr "Wimpern"
#: src/components/DesktopUpdates.tsx
msgid "Later"
msgstr "Später"
@ -2726,6 +2893,10 @@ msgstr "Privatkanal — ich bin da."
msgid "Light"
msgstr "Hell"
#: src/components/OoAtelier.tsx
msgid "Lilac"
msgstr "Flieder"
#: src/pages/shell/bot-capabilities.tsx
msgid "Limit built-in tools"
msgstr "Integrierte Tools einschränken"
@ -3031,6 +3202,10 @@ msgstr "Minimieren"
msgid "Minimize bots"
msgstr "Bots minimieren"
#: src/components/OoAtelier.tsx
msgid "Mint"
msgstr "Mint"
#: src/pages/RoutineSchedule.tsx
msgid "minute"
msgstr "Minute"
@ -3080,6 +3255,10 @@ msgstr "Modelle für den Standard-Space des Serverbesitzers."
msgid "Models from server"
msgstr "Modelle vom Server"
#: src/components/OoAtelier.tsx
msgid "Monocle"
msgstr "Monokel"
#: src/pages/RoutineSchedule.tsx
msgid "Monthly"
msgstr "Monatlich"
@ -3145,6 +3324,10 @@ msgstr "Gruppe benennen"
msgid "Name this routine"
msgstr "Routine benennen"
#: src/components/OoAtelier.tsx
msgid "Neck"
msgstr "Hals"
#: src/components/stage/OoStage.tsx
msgid "Needs attention"
msgstr "Braucht Aufmerksamkeit"
@ -3168,6 +3351,10 @@ msgstr "Braucht dich"
msgid "Needs your reply"
msgstr "Braucht deine Antwort"
#: src/components/OoAtelier.tsx
msgid "Nerd"
msgstr "Nerd"
#: src/pages/shell/bot-panel.tsx
msgid "New bot"
msgstr "Neuer Bot"
@ -3359,6 +3546,10 @@ msgstr "Kein Trigger"
msgid "No usage data is sent to third parties"
msgstr "Es werden keine Nutzungsdaten an Dritte gesendet"
#: src/components/OoAtelier.tsx
msgid "None"
msgstr "Keine"
#: src/pages/ScratchpadSection.tsx
msgid "None yet"
msgstr "Noch keine"
@ -3555,6 +3746,10 @@ msgstr "PagerDuty-Vorfall"
msgid "Park"
msgstr "Zurückstellen"
#: src/components/OoAtelier.tsx
msgid "Party hat"
msgstr "Partyhut"
#: src/components/AskCard.tsx
#: src/pages/AccountSettingsOverlay.tsx
#: src/pages/Auth.tsx
@ -3591,6 +3786,18 @@ msgstr "Füge deinen API-Schlüssel ein"
msgid "Paused"
msgstr "Pausiert"
#: src/components/OoAtelier.tsx
msgid "Paw"
msgstr "Pfote"
#: src/components/OoAtelier.tsx
msgid "Peach"
msgstr "Pfirsich"
#: src/components/OoAtelier.tsx
msgid "Penguin"
msgstr "Pinguin"
#: src/components/UserProfileSettings.tsx
msgid "People"
msgstr "Menschen"
@ -3615,6 +3822,14 @@ msgstr "Wähle eine Stimme"
msgid "Pin"
msgstr "Anheften"
#: src/components/OoAtelier.tsx
msgid "Pink"
msgstr "Rosa"
#: src/components/OoAtelier.tsx
msgid "Playful"
msgstr "Verspielt"
#: src/pages/VoiceSettingsOverlay.tsx
msgid "Playing…"
msgstr "Wiedergabe…"
@ -3762,6 +3977,10 @@ msgstr "Antworten vorlesen"
msgid "read-only"
msgstr "schreibgeschützt"
#: src/components/OoAtelier.tsx
msgid "Reading glasses"
msgstr "Lesebrille"
#: src/lib/voice-persona-copy.ts
msgid "Reading the stack trace…"
msgstr "Lese den Stacktrace…"
@ -3976,7 +4195,7 @@ msgstr "Recherche, Schreiben"
#: src/components/ComputerMaintenanceActions.tsx
#: src/components/onboarding/OnboardingOoDesigner.tsx
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Reset"
msgstr "Zurücksetzen"
@ -4042,14 +4261,26 @@ msgstr "Widerrufen"
msgid "Riffing"
msgstr "Am Riffen"
#: src/components/OoAtelier.tsx
msgid "Robot"
msgstr "Roboter"
#: src/pages/ExternalConversationSettings.tsx
msgid "Room guidance"
msgstr "Hinweise für diesen Raum"
#: src/components/OoAtelier.tsx
msgid "Rose"
msgstr "Rosé"
#: src/pages/RoutineEditor.tsx
msgid "Rotate key"
msgstr "Schlüssel erneuern"
#: src/components/OoAtelier.tsx
msgid "Round"
msgstr "Rund"
#: src/pages/RoutineEditor.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/routine-event-line.tsx
@ -4164,6 +4395,10 @@ msgstr "Antworte mit Ja oder Nein oder in einem Satz."
msgid "Scanning exposure…"
msgstr "Prüfe das Risiko…"
#: src/components/OoAtelier.tsx
msgid "Scarf"
msgstr "Schal"
#: src/components/onboarding/OnboardingOoDesigner.tsx
msgid "Scene"
msgstr "Szene"
@ -4294,10 +4529,15 @@ msgstr "Einrichtungshilfe"
msgid "Setup progress"
msgstr "Einrichtungsfortschritt"
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Shape"
msgstr "Form"
#. placeholder {0}: shape + 1
#: src/components/OoAtelier.tsx
msgid "Shape {0}"
msgstr "Form {0}"
#: src/lib/voice-persona-copy.ts
msgid "Share what you're imagining — or tell me one thing to refine."
msgstr "Erzähl, was dir vorschwebt — oder nenn mir eine Sache, die ich verfeinern soll."
@ -4415,6 +4655,10 @@ msgstr "Slack-Nachricht"
msgid "Slack not enabled"
msgstr "Slack nicht aktiviert"
#: src/components/OoAtelier.tsx
msgid "Soft"
msgstr "Zart"
#: src/components/SoftwareUpdateSection.tsx
msgid "Software update"
msgstr "Software-Update"
@ -4444,6 +4688,10 @@ msgstr "Space-Standard"
msgid "Spaces"
msgstr "Spaces"
#: src/components/OoAtelier.tsx
msgid "Sparkle"
msgstr "Glanz"
#: src/pages/shell/transcript.tsx
msgid "Speak"
msgstr "Vorlesen"
@ -4478,10 +4726,18 @@ msgstr "Spreche mit Bedacht…"
msgid "Specialist crew"
msgstr "Spezialisten-Team"
#: src/components/OoAtelier.tsx
msgid "Species"
msgstr "Wesen"
#: src/lib/model-tier-label.ts
msgid "Standard"
msgstr "Standard"
#: src/components/OoAtelier.tsx
msgid "Star"
msgstr "Stern"
#: src/pages/Shell.tsx
msgid "Start"
msgstr "Starten"
@ -4585,6 +4841,10 @@ msgstr "Stresstest fürs Portfolio…"
msgid "Stronger together — {0} specialists"
msgstr "Stärker zusammen — {0} Spezialisten"
#: src/components/OoAtelier.tsx
msgid "Stub"
msgstr "Stummel"
#: src/pages/shell/transcript.tsx
msgid "subagent"
msgstr "Subagent"
@ -4597,6 +4857,10 @@ msgstr "Absenden"
msgid "Summary"
msgstr "Zusammenfassung"
#: src/components/OoAtelier.tsx
msgid "Sunglasses"
msgstr "Sonnenbrille"
#: src/pages/ModelSettingsOverlay.tsx
msgid "Supports images"
msgstr "Unterstützt Bilder"
@ -4605,6 +4869,10 @@ msgstr "Unterstützt Bilder"
msgid "Supports thinking"
msgstr "Unterstützt Denkmodus"
#: src/components/OoAtelier.tsx
msgid "Surprise me"
msgstr "Überrasch mich"
#: src/components/onboarding/LookPreviewCarousel.tsx
msgid "Swipe for more looks"
msgstr "Wische für weitere Looks"
@ -4921,7 +5189,7 @@ msgstr "Team-Computer wird aktualisiert"
msgid "Updating…"
msgstr "Wird aktualisiert…"
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Upload"
msgstr "Hochladen"
@ -4967,6 +5235,10 @@ msgstr "Wird geprüft…"
msgid "Video workflow"
msgstr "Video-Workflow"
#: src/components/OoAtelier.tsx
msgid "Violet"
msgstr "Violett"
#: src/pages/SettingsOverlay.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/composer.tsx
@ -5113,6 +5385,10 @@ msgstr "Um welche Aufgabe geht es?"
msgid "When a webhook fires"
msgstr "Wenn ein Webhook auslöst"
#: src/components/OoAtelier.tsx
msgid "When needed"
msgstr "Bei Bedarf"
#: src/lib/onboarding-copy.ts
msgid "When should I check in with you?"
msgstr "Wann soll ich mich bei dir melden?"
@ -5133,6 +5409,10 @@ msgstr "Einsatzzeitpunkt"
msgid "Where should bots run?"
msgstr "Wo sollen Bots ausgeführt werden?"
#: src/components/OoAtelier.tsx
msgid "Winged"
msgstr "Geschwungen"
#: src/pages/shell/bot-picker.tsx
msgid "With:"
msgstr "Mit:"

View File

@ -668,6 +668,10 @@ msgstr "Are you sure you want to delete your account? This cannot be undone."
msgid "Arguments"
msgstr "Arguments"
#: src/components/OoAtelier.tsx
msgid "Arms"
msgstr "Arms"
#. placeholder {0}: rule.matchValue
#: src/components/ApprovalRulesSettings.tsx
msgid "Ask before {0}"
@ -716,6 +720,10 @@ msgstr "at {0}"
msgid "at {timeSelect}"
msgstr "at {timeSelect}"
#: src/components/OoAtelier.tsx
msgid "Atelier"
msgstr "Atelier"
#: src/pages/shell/composer.tsx
msgid "Attach file"
msgstr "Attach file"
@ -756,10 +764,6 @@ msgstr "Automated senders will appear after they post here."
msgid "Available after the routine is saved"
msgstr "Available after the routine is saved"
#: src/pages/shell/avatar-studio-popover.tsx
msgid "Avatar Studio"
msgstr "Avatar Studio"
#: src/components/browser/InAppBrowser.tsx
#: src/components/CookingMode.tsx
#: src/components/onboarding/OnboardingVoiceStep.tsx
@ -781,15 +785,35 @@ msgstr "Back to timeline"
msgid "Base URL"
msgstr "Base URL"
#: src/components/OoAtelier.tsx
msgid "Beanie"
msgstr "Beanie"
#: src/components/OoAtelier.tsx
msgid "Bear"
msgstr "Bear"
#: src/pages/memory-providers/SerenitySettingsForm.tsx
#: src/pages/PluginsOverlay.tsx
msgid "Bearer token"
msgstr "Bearer token"
#: src/components/OoAtelier.tsx
msgid "Bell"
msgstr "Bell"
#: src/components/NotificationSettingsPanel.tsx
msgid "Blocked in your browser settings"
msgstr "Blocked in your browser settings"
#: src/components/OoAtelier.tsx
msgid "Blue"
msgstr "Blue"
#: src/components/OoAtelier.tsx
msgid "Body"
msgstr "Body"
#: src/pages/shell/computer-screen.tsx
msgid "Booting live desktop…"
msgstr "Booting live desktop…"
@ -810,7 +834,6 @@ msgstr "Bot"
#: src/pages/IntegrationSetup.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/avatar-studio-popover.tsx
msgid "Bot"
msgstr "Bot"
@ -834,10 +857,26 @@ msgstr "Bots act without asking by default. Add an exception only when you want
msgid "Bots are working"
msgstr "Bots are working"
#: src/components/OoAtelier.tsx
msgid "Bow"
msgstr "Bow"
#: src/components/OoAtelier.tsx
msgid "Bow tie"
msgstr "Bow tie"
#: src/pages/memory-providers/SerenitySettingsForm.tsx
msgid "Brain label"
msgstr "Brain label"
#: src/components/OoAtelier.tsx
msgid "Brown"
msgstr "Brown"
#: src/components/OoAtelier.tsx
msgid "Brows"
msgstr "Brows"
#: src/pages/PluginsOverlay.tsx
msgid "Browse MCP servers"
msgstr "Browse MCP servers"
@ -846,6 +885,14 @@ msgstr "Browse MCP servers"
msgid "Browser"
msgstr "Browser"
#: src/components/OoAtelier.tsx
msgid "Bunny"
msgstr "Bunny"
#: src/components/OoAtelier.tsx
msgid "Bushy"
msgstr "Bushy"
#: src/pages/Shell.tsx
msgid "Busy"
msgstr "Busy"
@ -911,6 +958,10 @@ msgstr "Cancelled"
msgid "Cancelled"
msgstr "Cancelled"
#: src/components/OoAtelier.tsx
msgid "Cat"
msgstr "Cat"
#: src/components/UserFactEditor.tsx
msgid "Category"
msgstr "Category"
@ -1006,9 +1057,13 @@ msgstr "Checking…"
msgid "Checkout has local changes. Clean it before updating."
msgstr "Checkout has local changes. Clean it before updating."
#: src/pages/shell/avatar-studio-popover.tsx
msgid "Choose a bot shape, color, or upload an image"
msgstr "Choose a bot shape, color, or upload an image"
#: src/components/OoAtelier.tsx
msgid "Cheeks"
msgstr "Cheeks"
#: src/components/OoAtelier.tsx
msgid "Chef's hat"
msgstr "Chef's hat"
#: src/pages/MessagingSettingsOverlay.tsx
msgid "Choose a bot…"
@ -1026,7 +1081,7 @@ msgstr "Choose a new password"
msgid "Choose an existing folder on this computer. Git remotes are linked automatically when a repository is present."
msgstr "Choose an existing folder on this computer. Git remotes are linked automatically when a repository is present."
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Choose file"
msgstr "Choose file"
@ -1034,6 +1089,10 @@ msgstr "Choose file"
msgid "Choose folder"
msgstr "Choose folder"
#: src/components/OoAtelier.tsx
msgid "Choose how your Oo looks and moves"
msgstr "Choose how your Oo looks and moves"
#: src/pages/ModelSettingsOverlay.tsx
msgid "Choose which connected model Rakazo uses."
msgstr "Choose which connected model Rakazo uses."
@ -1046,6 +1105,10 @@ msgstr "Choose your language"
msgid "Choosing the right shape…"
msgstr "Choosing the right shape…"
#: src/components/OoAtelier.tsx
msgid "Classic"
msgstr "Classic"
#: src/pages/shell/dialogs.tsx
msgid "Clear"
msgstr "Clear"
@ -1076,12 +1139,12 @@ msgstr "Client ID"
msgid "Client secret"
msgstr "Client secret"
#: src/components/OoAtelier.tsx
#: src/pages/KnowledgeSection.tsx
#: src/pages/MessagingSettingsOverlay.tsx
#: src/pages/PeerMessagesOverlay.tsx
#: src/pages/RoutineEditor.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/avatar-studio-popover.tsx
#: src/pages/WindowChrome.tsx
msgid "Close"
msgstr "Close"
@ -1165,11 +1228,11 @@ msgstr "Coder"
msgid "Collapse {0}"
msgstr "Collapse {0}"
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Color"
msgstr "Color"
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Color {color}"
msgstr "Color {color}"
@ -1846,15 +1909,27 @@ msgstr "Cron"
msgid "Cron expression"
msgstr "Cron expression"
#: src/components/OoAtelier.tsx
msgid "Crown"
msgstr "Crown"
#: src/pages/AccountSettingsOverlay.tsx
msgid "Current password"
msgstr "Current password"
#: src/components/OoAtelier.tsx
msgid "Custom color"
msgstr "Custom color"
#: src/pages/shell/dialogs.tsx
msgid "Customer support"
msgstr "Customer support"
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/onboarding/OnboardingOoDesigner.tsx
msgid "Customize"
msgstr "Customize"
#: src/components/OoAtelier.tsx
msgid "Customize bot avatar"
msgstr "Customize bot avatar"
@ -2056,6 +2131,10 @@ msgstr "Docker limits access to your computer for added security. Using {hostLab
msgid "Does not speak"
msgstr "Does not speak"
#: src/components/OoAtelier.tsx
msgid "Dog"
msgstr "Dog"
#: src/pages/HeuteBrief.tsx
msgid "Doing"
msgstr "Doing"
@ -2071,10 +2150,10 @@ msgstr "Don't stress — we're here now."
#: src/components/ai/DelegatedTaskCard.tsx
#: src/components/CookingMode.tsx
#: src/components/media/MediaCard.tsx
#: src/components/OoAtelier.tsx
#: src/components/ThreadCard.tsx
#: src/pages/HeuteBrief.tsx
#: src/pages/ProjectSessionTimeline.tsx
#: src/pages/shell/avatar-studio-popover.tsx
msgid "Done"
msgstr "Done"
@ -2083,6 +2162,10 @@ msgstr "Done"
msgid "Done"
msgstr "Done"
#: src/components/OoAtelier.tsx
msgid "Dot"
msgstr "Dot"
#. placeholder {0}: props.name
#: src/components/ArtifactFileCard.tsx
msgid "Download {0}"
@ -2120,7 +2203,7 @@ msgstr "Drafting the spec…"
msgid "Drag to reorder"
msgstr "Drag to reorder"
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Drag, drop, or paste an image"
msgstr "Drag, drop, or paste an image"
@ -2161,6 +2244,10 @@ msgstr "Email"
msgid "Embeddings URL"
msgstr "Embeddings URL"
#: src/components/OoAtelier.tsx
msgid "Energy"
msgstr "Energy"
#: src/pages/ExternalConversationSettings.tsx
msgid "Engage when... Ignore..."
msgstr "Engage when... Ignore..."
@ -2288,6 +2375,22 @@ msgstr "External conversation"
msgid "Extra high"
msgstr "Extra high"
#: src/components/OoAtelier.tsx
msgid "Extras"
msgstr "Extras"
#: src/components/OoAtelier.tsx
msgid "Eyeliner"
msgstr "Eyeliner"
#: src/components/OoAtelier.tsx
msgid "Eyes"
msgstr "Eyes"
#: src/components/OoAtelier.tsx
msgid "Eyeshadow"
msgstr "Eyeshadow"
#: src/components/UserFactEditor.tsx
msgid "Fact"
msgstr "Fact"
@ -2345,6 +2448,10 @@ msgstr "Finding the right tone…"
msgid "Finding…"
msgstr "Finding…"
#: src/components/OoAtelier.tsx
msgid "Fine"
msgstr "Fine"
#. placeholder {0}: new URL(oauth.verificationUri).hostname
#: src/pages/ModelSettingsOverlay.tsx
msgid "Finish signing in at <0>{0}</0>. The final page may not load; paste its URL or code here."
@ -2371,6 +2478,14 @@ msgstr "First {shownRows} rows"
msgid "Flag unexpected actions"
msgstr "Flag unexpected actions"
#: src/components/OoAtelier.tsx
msgid "Flick"
msgstr "Flick"
#: src/components/OoAtelier.tsx
msgid "Flower"
msgstr "Flower"
#: src/pages/PrivacySettingsOverlay.tsx
msgid "Fonts loaded locally"
msgstr "Fonts loaded locally"
@ -2395,10 +2510,22 @@ msgstr "Forgot password?"
msgid "Forward"
msgstr "Forward"
#: src/components/OoAtelier.tsx
msgid "Freckles"
msgstr "Freckles"
#: src/pages/ModelSettingsOverlay.tsx
msgid "Free"
msgstr "Free"
#: src/components/OoAtelier.tsx
msgid "Frog"
msgstr "Frog"
#: src/components/OoAtelier.tsx
msgid "Full"
msgstr "Full"
#: src/pages/WindowChrome.tsx
msgid "Fullscreen"
msgstr "Fullscreen"
@ -2427,10 +2554,22 @@ msgstr "Getting ready"
msgid "Getting ready…"
msgstr "Getting ready…"
#: src/components/OoAtelier.tsx
msgid "Ghost"
msgstr "Ghost"
#: src/pages/RoutineEditor.tsx
msgid "Git event"
msgstr "Git event"
#: src/components/OoAtelier.tsx
msgid "Glass"
msgstr "Glass"
#: src/components/OoAtelier.tsx
msgid "Glasses"
msgstr "Glasses"
#: src/pages/ProjectSessionTimeline.tsx
msgid "Goal"
msgstr "Goal"
@ -2445,6 +2584,14 @@ msgstr "Goals"
msgid "Goals for this project, separate from chat messages. Conversations are below."
msgstr "Goals for this project, separate from chat messages. Conversations are below."
#: src/components/OoAtelier.tsx
msgid "Gold"
msgstr "Gold"
#: src/components/OoAtelier.tsx
msgid "Green"
msgstr "Green"
#: src/components/stage/OoStage.tsx
#: src/pages/MessagingSettingsOverlay.tsx
#: src/pages/Shell.tsx
@ -2490,6 +2637,10 @@ msgstr "Hang up first, then enter the code on screen."
msgid "Hang up, then enter the code on screen."
msgstr "Hang up, then enter the code on screen."
#: src/components/OoAtelier.tsx
msgid "Hat"
msgstr "Hat"
#: src/pages/RoutineEditor.tsx
msgid "header"
msgstr "header"
@ -2503,6 +2654,10 @@ msgstr "Header name"
msgid "Header value"
msgstr "Header value"
#: src/components/OoAtelier.tsx
msgid "Headphones"
msgstr "Headphones"
#: src/components/UserProfileSettings.tsx
msgid "Health"
msgstr "Health"
@ -2511,6 +2666,10 @@ msgstr "Health"
msgid "Hear a sample"
msgstr "Hear a sample"
#: src/components/OoAtelier.tsx
msgid "Heart"
msgstr "Heart"
#: src/lib/voice-persona-copy.ts
msgid "Here's the read…"
msgstr "Here's the read…"
@ -2597,7 +2756,7 @@ msgstr "Ignore"
msgid "Image model"
msgstr "Image model"
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Image upload area"
msgstr "Image upload area"
@ -2671,6 +2830,10 @@ msgstr "Interval amount"
msgid "Interval unit"
msgstr "Interval unit"
#: src/components/OoAtelier.tsx
msgid "Iris"
msgstr "Iris"
#: src/pages/MemorySettingsOverlay.tsx
#: src/pages/shell/bot-panel.tsx
msgid "Isolated"
@ -2710,6 +2873,10 @@ msgstr "Knowledge"
msgid "Language"
msgstr "Language"
#: src/components/OoAtelier.tsx
msgid "Lashes"
msgstr "Lashes"
#: src/components/DesktopUpdates.tsx
msgid "Later"
msgstr "Later"
@ -2726,6 +2893,10 @@ msgstr "Life channel — I'm here."
msgid "Light"
msgstr "Light"
#: src/components/OoAtelier.tsx
msgid "Lilac"
msgstr "Lilac"
#: src/pages/shell/bot-capabilities.tsx
msgid "Limit built-in tools"
msgstr "Limit built-in tools"
@ -3031,6 +3202,10 @@ msgstr "Minimize"
msgid "Minimize bots"
msgstr "Minimize bots"
#: src/components/OoAtelier.tsx
msgid "Mint"
msgstr "Mint"
#: src/pages/RoutineSchedule.tsx
msgid "minute"
msgstr "minute"
@ -3080,6 +3255,10 @@ msgstr "Models for the server owner’s default space."
msgid "Models from server"
msgstr "Models from server"
#: src/components/OoAtelier.tsx
msgid "Monocle"
msgstr "Monocle"
#: src/pages/RoutineSchedule.tsx
msgid "Monthly"
msgstr "Monthly"
@ -3145,6 +3324,10 @@ msgstr "Name this group"
msgid "Name this routine"
msgstr "Name this routine"
#: src/components/OoAtelier.tsx
msgid "Neck"
msgstr "Neck"
#: src/components/stage/OoStage.tsx
msgid "Needs attention"
msgstr "Needs attention"
@ -3168,6 +3351,10 @@ msgstr "Needs you"
msgid "Needs your reply"
msgstr "Needs your reply"
#: src/components/OoAtelier.tsx
msgid "Nerd"
msgstr "Nerd"
#: src/pages/shell/bot-panel.tsx
msgid "New bot"
msgstr "New bot"
@ -3359,6 +3546,10 @@ msgstr "No trigger"
msgid "No usage data is sent to third parties"
msgstr "No usage data is sent to third parties"
#: src/components/OoAtelier.tsx
msgid "None"
msgstr "None"
#: src/pages/ScratchpadSection.tsx
msgid "None yet"
msgstr "None yet"
@ -3555,6 +3746,10 @@ msgstr "PagerDuty incident"
msgid "Park"
msgstr "Park"
#: src/components/OoAtelier.tsx
msgid "Party hat"
msgstr "Party hat"
#: src/components/AskCard.tsx
#: src/pages/AccountSettingsOverlay.tsx
#: src/pages/Auth.tsx
@ -3591,6 +3786,18 @@ msgstr "Paste your API key"
msgid "Paused"
msgstr "Paused"
#: src/components/OoAtelier.tsx
msgid "Paw"
msgstr "Paw"
#: src/components/OoAtelier.tsx
msgid "Peach"
msgstr "Peach"
#: src/components/OoAtelier.tsx
msgid "Penguin"
msgstr "Penguin"
#: src/components/UserProfileSettings.tsx
msgid "People"
msgstr "People"
@ -3615,6 +3822,14 @@ msgstr "Pick a voice"
msgid "Pin"
msgstr "Pin"
#: src/components/OoAtelier.tsx
msgid "Pink"
msgstr "Pink"
#: src/components/OoAtelier.tsx
msgid "Playful"
msgstr "Playful"
#: src/pages/VoiceSettingsOverlay.tsx
msgid "Playing…"
msgstr "Playing…"
@ -3762,6 +3977,10 @@ msgstr "Read replies aloud"
msgid "read-only"
msgstr "read-only"
#: src/components/OoAtelier.tsx
msgid "Reading glasses"
msgstr "Reading glasses"
#: src/lib/voice-persona-copy.ts
msgid "Reading the stack trace…"
msgstr "Reading the stack trace…"
@ -3976,7 +4195,7 @@ msgstr "research, writing"
#: src/components/ComputerMaintenanceActions.tsx
#: src/components/onboarding/OnboardingOoDesigner.tsx
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Reset"
msgstr "Reset"
@ -4042,14 +4261,26 @@ msgstr "Revoke"
msgid "Riffing"
msgstr "Riffing"
#: src/components/OoAtelier.tsx
msgid "Robot"
msgstr "Robot"
#: src/pages/ExternalConversationSettings.tsx
msgid "Room guidance"
msgstr "Room guidance"
#: src/components/OoAtelier.tsx
msgid "Rose"
msgstr "Rose"
#: src/pages/RoutineEditor.tsx
msgid "Rotate key"
msgstr "Rotate key"
#: src/components/OoAtelier.tsx
msgid "Round"
msgstr "Round"
#: src/pages/RoutineEditor.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/routine-event-line.tsx
@ -4164,6 +4395,10 @@ msgstr "Say yes or no, or answer in a sentence."
msgid "Scanning exposure…"
msgstr "Scanning exposure…"
#: src/components/OoAtelier.tsx
msgid "Scarf"
msgstr "Scarf"
#: src/components/onboarding/OnboardingOoDesigner.tsx
msgid "Scene"
msgstr "Scene"
@ -4294,10 +4529,15 @@ msgstr "Setup help"
msgid "Setup progress"
msgstr "Setup progress"
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Shape"
msgstr "Shape"
#. placeholder {0}: shape + 1
#: src/components/OoAtelier.tsx
msgid "Shape {0}"
msgstr "Shape {0}"
#: src/lib/voice-persona-copy.ts
msgid "Share what you're imagining — or tell me one thing to refine."
msgstr "Share what you're imagining — or tell me one thing to refine."
@ -4415,6 +4655,10 @@ msgstr "Slack message"
msgid "Slack not enabled"
msgstr "Slack not enabled"
#: src/components/OoAtelier.tsx
msgid "Soft"
msgstr "Soft"
#: src/components/SoftwareUpdateSection.tsx
msgid "Software update"
msgstr "Software update"
@ -4444,6 +4688,10 @@ msgstr "Space default"
msgid "Spaces"
msgstr "Spaces"
#: src/components/OoAtelier.tsx
msgid "Sparkle"
msgstr "Sparkle"
#: src/pages/shell/transcript.tsx
msgid "Speak"
msgstr "Speak"
@ -4478,10 +4726,18 @@ msgstr "Speaking with intent…"
msgid "Specialist crew"
msgstr "Specialist crew"
#: src/components/OoAtelier.tsx
msgid "Species"
msgstr "Species"
#: src/lib/model-tier-label.ts
msgid "Standard"
msgstr "Standard"
#: src/components/OoAtelier.tsx
msgid "Star"
msgstr "Star"
#: src/pages/Shell.tsx
msgid "Start"
msgstr "Start"
@ -4585,6 +4841,10 @@ msgstr "Stress-testing the book…"
msgid "Stronger together — {0} specialists"
msgstr "Stronger together — {0} specialists"
#: src/components/OoAtelier.tsx
msgid "Stub"
msgstr "Stub"
#: src/pages/shell/transcript.tsx
msgid "subagent"
msgstr "subagent"
@ -4597,6 +4857,10 @@ msgstr "Submit"
msgid "Summary"
msgstr "Summary"
#: src/components/OoAtelier.tsx
msgid "Sunglasses"
msgstr "Sunglasses"
#: src/pages/ModelSettingsOverlay.tsx
msgid "Supports images"
msgstr "Supports images"
@ -4605,6 +4869,10 @@ msgstr "Supports images"
msgid "Supports thinking"
msgstr "Supports thinking"
#: src/components/OoAtelier.tsx
msgid "Surprise me"
msgstr "Surprise me"
#: src/components/onboarding/LookPreviewCarousel.tsx
msgid "Swipe for more looks"
msgstr "Swipe for more looks"
@ -4921,7 +5189,7 @@ msgstr "Updating Team Computer"
msgid "Updating…"
msgstr "Updating…"
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Upload"
msgstr "Upload"
@ -4967,6 +5235,10 @@ msgstr "Verifying…"
msgid "Video workflow"
msgstr "Video workflow"
#: src/components/OoAtelier.tsx
msgid "Violet"
msgstr "Violet"
#: src/pages/SettingsOverlay.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/composer.tsx
@ -5113,6 +5385,10 @@ msgstr "What's the work item?"
msgid "When a webhook fires"
msgstr "When a webhook fires"
#: src/components/OoAtelier.tsx
msgid "When needed"
msgstr "When needed"
#: src/lib/onboarding-copy.ts
msgid "When should I check in with you?"
msgstr "When should I check in with you?"
@ -5133,6 +5409,10 @@ msgstr "When to use"
msgid "Where should bots run?"
msgstr "Where should bots run?"
#: src/components/OoAtelier.tsx
msgid "Winged"
msgstr "Winged"
#: src/pages/shell/bot-picker.tsx
msgid "With:"
msgstr "With:"

View File

@ -668,6 +668,10 @@ msgstr ""
msgid "Arguments"
msgstr "Argumentos"
#: src/components/OoAtelier.tsx
msgid "Arms"
msgstr ""
#. placeholder {0}: rule.matchValue
#: src/components/ApprovalRulesSettings.tsx
msgid "Ask before {0}"
@ -716,6 +720,10 @@ msgstr "a las {0}"
msgid "at {timeSelect}"
msgstr "a las {timeSelect}"
#: src/components/OoAtelier.tsx
msgid "Atelier"
msgstr ""
#: src/pages/shell/composer.tsx
msgid "Attach file"
msgstr "Adjuntar archivo"
@ -756,10 +764,6 @@ msgstr ""
msgid "Available after the routine is saved"
msgstr "Disponible después de guardar la rutina"
#: src/pages/shell/avatar-studio-popover.tsx
msgid "Avatar Studio"
msgstr "Estudio de avatares"
#: src/components/browser/InAppBrowser.tsx
#: src/components/CookingMode.tsx
#: src/components/onboarding/OnboardingVoiceStep.tsx
@ -781,15 +785,35 @@ msgstr ""
msgid "Base URL"
msgstr "URL base"
#: src/components/OoAtelier.tsx
msgid "Beanie"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Bear"
msgstr ""
#: src/pages/memory-providers/SerenitySettingsForm.tsx
#: src/pages/PluginsOverlay.tsx
msgid "Bearer token"
msgstr "Token Bearer"
#: src/components/OoAtelier.tsx
msgid "Bell"
msgstr ""
#: src/components/NotificationSettingsPanel.tsx
msgid "Blocked in your browser settings"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Blue"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Body"
msgstr ""
#: src/pages/shell/computer-screen.tsx
msgid "Booting live desktop…"
msgstr "Iniciando escritorio en vivo…"
@ -810,7 +834,6 @@ msgstr "Bot"
#: src/pages/IntegrationSetup.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/avatar-studio-popover.tsx
msgid "Bot"
msgstr "Bot"
@ -834,10 +857,26 @@ msgstr "Los bots actúan sin preguntar de forma predeterminada. Agrega una excep
msgid "Bots are working"
msgstr "Los bots están trabajando"
#: src/components/OoAtelier.tsx
msgid "Bow"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Bow tie"
msgstr ""
#: src/pages/memory-providers/SerenitySettingsForm.tsx
msgid "Brain label"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Brown"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Brows"
msgstr ""
#: src/pages/PluginsOverlay.tsx
msgid "Browse MCP servers"
msgstr ""
@ -846,6 +885,14 @@ msgstr ""
msgid "Browser"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Bunny"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Bushy"
msgstr ""
#: src/pages/Shell.tsx
msgid "Busy"
msgstr ""
@ -911,6 +958,10 @@ msgstr "Cancelado"
msgid "Cancelled"
msgstr "Cancelado"
#: src/components/OoAtelier.tsx
msgid "Cat"
msgstr ""
#: src/components/UserFactEditor.tsx
msgid "Category"
msgstr ""
@ -1006,9 +1057,13 @@ msgstr "Comprobando…"
msgid "Checkout has local changes. Clean it before updating."
msgstr "El checkout tiene cambios locales. Límpialo antes de actualizar."
#: src/pages/shell/avatar-studio-popover.tsx
msgid "Choose a bot shape, color, or upload an image"
msgstr "Elige una forma y color del bot, o sube una imagen"
#: src/components/OoAtelier.tsx
msgid "Cheeks"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Chef's hat"
msgstr ""
#: src/pages/MessagingSettingsOverlay.tsx
msgid "Choose a bot…"
@ -1026,7 +1081,7 @@ msgstr "Elige una contraseña nueva"
msgid "Choose an existing folder on this computer. Git remotes are linked automatically when a repository is present."
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Choose file"
msgstr "Elegir archivo"
@ -1034,6 +1089,10 @@ msgstr "Elegir archivo"
msgid "Choose folder"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Choose how your Oo looks and moves"
msgstr ""
#: src/pages/ModelSettingsOverlay.tsx
msgid "Choose which connected model Rakazo uses."
msgstr "Elige qué modelo conectado usa Rakazo."
@ -1046,6 +1105,10 @@ msgstr ""
msgid "Choosing the right shape…"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Classic"
msgstr ""
#: src/pages/shell/dialogs.tsx
msgid "Clear"
msgstr "Borrar"
@ -1076,12 +1139,12 @@ msgstr ""
msgid "Client secret"
msgstr ""
#: src/components/OoAtelier.tsx
#: src/pages/KnowledgeSection.tsx
#: src/pages/MessagingSettingsOverlay.tsx
#: src/pages/PeerMessagesOverlay.tsx
#: src/pages/RoutineEditor.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/avatar-studio-popover.tsx
#: src/pages/WindowChrome.tsx
msgid "Close"
msgstr "Cerrar"
@ -1165,11 +1228,11 @@ msgstr ""
msgid "Collapse {0}"
msgstr "Contraer {0}"
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Color"
msgstr "Color"
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Color {color}"
msgstr "Color {color}"
@ -1846,15 +1909,27 @@ msgstr "Cron"
msgid "Cron expression"
msgstr "Expresión cron"
#: src/components/OoAtelier.tsx
msgid "Crown"
msgstr ""
#: src/pages/AccountSettingsOverlay.tsx
msgid "Current password"
msgstr "Contraseña actual"
#: src/components/OoAtelier.tsx
msgid "Custom color"
msgstr ""
#: src/pages/shell/dialogs.tsx
msgid "Customer support"
msgstr "Atención al cliente"
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/onboarding/OnboardingOoDesigner.tsx
msgid "Customize"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Customize bot avatar"
msgstr "Personalizar avatar del bot"
@ -2056,6 +2131,10 @@ msgstr "Docker limita el acceso a tu computadora para mayor seguridad. Usar {hos
msgid "Does not speak"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Dog"
msgstr ""
#: src/pages/HeuteBrief.tsx
msgid "Doing"
msgstr ""
@ -2071,10 +2150,10 @@ msgstr ""
#: src/components/ai/DelegatedTaskCard.tsx
#: src/components/CookingMode.tsx
#: src/components/media/MediaCard.tsx
#: src/components/OoAtelier.tsx
#: src/components/ThreadCard.tsx
#: src/pages/HeuteBrief.tsx
#: src/pages/ProjectSessionTimeline.tsx
#: src/pages/shell/avatar-studio-popover.tsx
msgid "Done"
msgstr "Listo"
@ -2083,6 +2162,10 @@ msgstr "Listo"
msgid "Done"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Dot"
msgstr ""
#. placeholder {0}: props.name
#: src/components/ArtifactFileCard.tsx
msgid "Download {0}"
@ -2120,7 +2203,7 @@ msgstr ""
msgid "Drag to reorder"
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Drag, drop, or paste an image"
msgstr "Arrastra, suelta o pega una imagen"
@ -2161,6 +2244,10 @@ msgstr "Correo"
msgid "Embeddings URL"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Energy"
msgstr ""
#: src/pages/ExternalConversationSettings.tsx
msgid "Engage when... Ignore..."
msgstr ""
@ -2288,6 +2375,22 @@ msgstr ""
msgid "Extra high"
msgstr "Extra alto"
#: src/components/OoAtelier.tsx
msgid "Extras"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Eyeliner"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Eyes"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Eyeshadow"
msgstr ""
#: src/components/UserFactEditor.tsx
msgid "Fact"
msgstr ""
@ -2345,6 +2448,10 @@ msgstr ""
msgid "Finding…"
msgstr "Buscando…"
#: src/components/OoAtelier.tsx
msgid "Fine"
msgstr ""
#. placeholder {0}: new URL(oauth.verificationUri).hostname
#: src/pages/ModelSettingsOverlay.tsx
msgid "Finish signing in at <0>{0}</0>. The final page may not load; paste its URL or code here."
@ -2371,6 +2478,14 @@ msgstr ""
msgid "Flag unexpected actions"
msgstr "Marcar acciones inesperadas"
#: src/components/OoAtelier.tsx
msgid "Flick"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Flower"
msgstr ""
#: src/pages/PrivacySettingsOverlay.tsx
msgid "Fonts loaded locally"
msgstr ""
@ -2395,10 +2510,22 @@ msgstr "¿Olvidaste la contraseña?"
msgid "Forward"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Freckles"
msgstr ""
#: src/pages/ModelSettingsOverlay.tsx
msgid "Free"
msgstr "Gratis"
#: src/components/OoAtelier.tsx
msgid "Frog"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Full"
msgstr ""
#: src/pages/WindowChrome.tsx
msgid "Fullscreen"
msgstr "Pantalla completa"
@ -2427,10 +2554,22 @@ msgstr ""
msgid "Getting ready…"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Ghost"
msgstr ""
#: src/pages/RoutineEditor.tsx
msgid "Git event"
msgstr "Evento de Git"
#: src/components/OoAtelier.tsx
msgid "Glass"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Glasses"
msgstr ""
#: src/pages/ProjectSessionTimeline.tsx
msgid "Goal"
msgstr ""
@ -2445,6 +2584,14 @@ msgstr ""
msgid "Goals for this project, separate from chat messages. Conversations are below."
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Gold"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Green"
msgstr ""
#: src/components/stage/OoStage.tsx
#: src/pages/MessagingSettingsOverlay.tsx
#: src/pages/Shell.tsx
@ -2490,6 +2637,10 @@ msgstr "Cuelga primero y luego ingresa el código en pantalla."
msgid "Hang up, then enter the code on screen."
msgstr "Cuelga y luego ingresa el código en pantalla."
#: src/components/OoAtelier.tsx
msgid "Hat"
msgstr ""
#: src/pages/RoutineEditor.tsx
msgid "header"
msgstr "Encabezado"
@ -2503,6 +2654,10 @@ msgstr "Nombre del encabezado"
msgid "Header value"
msgstr "Valor del encabezado"
#: src/components/OoAtelier.tsx
msgid "Headphones"
msgstr ""
#: src/components/UserProfileSettings.tsx
msgid "Health"
msgstr ""
@ -2511,6 +2666,10 @@ msgstr ""
msgid "Hear a sample"
msgstr "Escuchar una muestra"
#: src/components/OoAtelier.tsx
msgid "Heart"
msgstr ""
#: src/lib/voice-persona-copy.ts
msgid "Here's the read…"
msgstr ""
@ -2597,7 +2756,7 @@ msgstr ""
msgid "Image model"
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Image upload area"
msgstr "Área de carga de imagen"
@ -2671,6 +2830,10 @@ msgstr "Cantidad del intervalo"
msgid "Interval unit"
msgstr "Unidad del intervalo"
#: src/components/OoAtelier.tsx
msgid "Iris"
msgstr ""
#: src/pages/MemorySettingsOverlay.tsx
#: src/pages/shell/bot-panel.tsx
msgid "Isolated"
@ -2710,6 +2873,10 @@ msgstr "Conocimientos"
msgid "Language"
msgstr "Idioma"
#: src/components/OoAtelier.tsx
msgid "Lashes"
msgstr ""
#: src/components/DesktopUpdates.tsx
msgid "Later"
msgstr ""
@ -2726,6 +2893,10 @@ msgstr ""
msgid "Light"
msgstr "Claro"
#: src/components/OoAtelier.tsx
msgid "Lilac"
msgstr ""
#: src/pages/shell/bot-capabilities.tsx
msgid "Limit built-in tools"
msgstr ""
@ -3031,6 +3202,10 @@ msgstr "Minimizar"
msgid "Minimize bots"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Mint"
msgstr ""
#: src/pages/RoutineSchedule.tsx
msgid "minute"
msgstr "minuto"
@ -3080,6 +3255,10 @@ msgstr ""
msgid "Models from server"
msgstr "Modelos del servidor"
#: src/components/OoAtelier.tsx
msgid "Monocle"
msgstr ""
#: src/pages/RoutineSchedule.tsx
msgid "Monthly"
msgstr "Mensual"
@ -3145,6 +3324,10 @@ msgstr "Nombra este grupo"
msgid "Name this routine"
msgstr "Nombra esta rutina"
#: src/components/OoAtelier.tsx
msgid "Neck"
msgstr ""
#: src/components/stage/OoStage.tsx
msgid "Needs attention"
msgstr ""
@ -3168,6 +3351,10 @@ msgstr ""
msgid "Needs your reply"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Nerd"
msgstr ""
#: src/pages/shell/bot-panel.tsx
msgid "New bot"
msgstr "Nuevo bot"
@ -3359,6 +3546,10 @@ msgstr "Sin disparador"
msgid "No usage data is sent to third parties"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "None"
msgstr ""
#: src/pages/ScratchpadSection.tsx
msgid "None yet"
msgstr "Ninguno aún"
@ -3555,6 +3746,10 @@ msgstr "Incidente de PagerDuty"
msgid "Park"
msgstr "Aparcar"
#: src/components/OoAtelier.tsx
msgid "Party hat"
msgstr ""
#: src/components/AskCard.tsx
#: src/pages/AccountSettingsOverlay.tsx
#: src/pages/Auth.tsx
@ -3591,6 +3786,18 @@ msgstr "Pega tu clave de API"
msgid "Paused"
msgstr "En pausa"
#: src/components/OoAtelier.tsx
msgid "Paw"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Peach"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Penguin"
msgstr ""
#: src/components/UserProfileSettings.tsx
msgid "People"
msgstr ""
@ -3615,6 +3822,14 @@ msgstr ""
msgid "Pin"
msgstr "Fijar"
#: src/components/OoAtelier.tsx
msgid "Pink"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Playful"
msgstr ""
#: src/pages/VoiceSettingsOverlay.tsx
msgid "Playing…"
msgstr "Reproduciendo…"
@ -3762,6 +3977,10 @@ msgstr "Leer respuestas en voz alta"
msgid "read-only"
msgstr "Solo lectura"
#: src/components/OoAtelier.tsx
msgid "Reading glasses"
msgstr ""
#: src/lib/voice-persona-copy.ts
msgid "Reading the stack trace…"
msgstr ""
@ -3976,7 +4195,7 @@ msgstr ""
#: src/components/ComputerMaintenanceActions.tsx
#: src/components/onboarding/OnboardingOoDesigner.tsx
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Reset"
msgstr "Restablecer"
@ -4042,14 +4261,26 @@ msgstr "Revocar"
msgid "Riffing"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Robot"
msgstr ""
#: src/pages/ExternalConversationSettings.tsx
msgid "Room guidance"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Rose"
msgstr ""
#: src/pages/RoutineEditor.tsx
msgid "Rotate key"
msgstr "Rotar clave"
#: src/components/OoAtelier.tsx
msgid "Round"
msgstr ""
#: src/pages/RoutineEditor.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/routine-event-line.tsx
@ -4164,6 +4395,10 @@ msgstr "Di sí o no, o responde en una frase."
msgid "Scanning exposure…"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Scarf"
msgstr ""
#: src/components/onboarding/OnboardingOoDesigner.tsx
msgid "Scene"
msgstr ""
@ -4294,10 +4529,15 @@ msgstr "Ayuda de configuración"
msgid "Setup progress"
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Shape"
msgstr "Forma"
#. placeholder {0}: shape + 1
#: src/components/OoAtelier.tsx
msgid "Shape {0}"
msgstr ""
#: src/lib/voice-persona-copy.ts
msgid "Share what you're imagining — or tell me one thing to refine."
msgstr ""
@ -4415,6 +4655,10 @@ msgstr "Mensaje de Slack"
msgid "Slack not enabled"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Soft"
msgstr ""
#: src/components/SoftwareUpdateSection.tsx
msgid "Software update"
msgstr "Actualización de software"
@ -4444,6 +4688,10 @@ msgstr "Predeterminado del Space"
msgid "Spaces"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Sparkle"
msgstr ""
#: src/pages/shell/transcript.tsx
msgid "Speak"
msgstr "Hablar"
@ -4478,10 +4726,18 @@ msgstr ""
msgid "Specialist crew"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Species"
msgstr ""
#: src/lib/model-tier-label.ts
msgid "Standard"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Star"
msgstr ""
#: src/pages/Shell.tsx
msgid "Start"
msgstr ""
@ -4585,6 +4841,10 @@ msgstr ""
msgid "Stronger together — {0} specialists"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Stub"
msgstr ""
#: src/pages/shell/transcript.tsx
msgid "subagent"
msgstr "subagente"
@ -4597,6 +4857,10 @@ msgstr "Enviar"
msgid "Summary"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Sunglasses"
msgstr ""
#: src/pages/ModelSettingsOverlay.tsx
msgid "Supports images"
msgstr "Admite imágenes"
@ -4605,6 +4869,10 @@ msgstr "Admite imágenes"
msgid "Supports thinking"
msgstr "Admite razonamiento"
#: src/components/OoAtelier.tsx
msgid "Surprise me"
msgstr ""
#: src/components/onboarding/LookPreviewCarousel.tsx
msgid "Swipe for more looks"
msgstr ""
@ -4921,7 +5189,7 @@ msgstr ""
msgid "Updating…"
msgstr "Actualizando…"
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Upload"
msgstr "Subir"
@ -4967,6 +5235,10 @@ msgstr "Verificando…"
msgid "Video workflow"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Violet"
msgstr ""
#: src/pages/SettingsOverlay.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/composer.tsx
@ -5113,6 +5385,10 @@ msgstr ""
msgid "When a webhook fires"
msgstr "Cuando se dispara un webhook"
#: src/components/OoAtelier.tsx
msgid "When needed"
msgstr ""
#: src/lib/onboarding-copy.ts
msgid "When should I check in with you?"
msgstr ""
@ -5133,6 +5409,10 @@ msgstr "Cuándo usar"
msgid "Where should bots run?"
msgstr "¿Dónde deben ejecutarse los bots?"
#: src/components/OoAtelier.tsx
msgid "Winged"
msgstr ""
#: src/pages/shell/bot-picker.tsx
msgid "With:"
msgstr ""

View File

@ -668,6 +668,10 @@ msgstr ""
msgid "Arguments"
msgstr "आर्ग्युमेंट"
#: src/components/OoAtelier.tsx
msgid "Arms"
msgstr ""
#. placeholder {0}: rule.matchValue
#: src/components/ApprovalRulesSettings.tsx
msgid "Ask before {0}"
@ -716,6 +720,10 @@ msgstr "{0} बजे"
msgid "at {timeSelect}"
msgstr "{timeSelect} बजे"
#: src/components/OoAtelier.tsx
msgid "Atelier"
msgstr ""
#: src/pages/shell/composer.tsx
msgid "Attach file"
msgstr "फ़ाइल संलग्न करें"
@ -756,10 +764,6 @@ msgstr ""
msgid "Available after the routine is saved"
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
msgid "Avatar Studio"
msgstr "अवतार स्टूडियो"
#: src/components/browser/InAppBrowser.tsx
#: src/components/CookingMode.tsx
#: src/components/onboarding/OnboardingVoiceStep.tsx
@ -781,15 +785,35 @@ msgstr ""
msgid "Base URL"
msgstr "बेस URL"
#: src/components/OoAtelier.tsx
msgid "Beanie"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Bear"
msgstr ""
#: src/pages/memory-providers/SerenitySettingsForm.tsx
#: src/pages/PluginsOverlay.tsx
msgid "Bearer token"
msgstr "बियरर टोकन"
#: src/components/OoAtelier.tsx
msgid "Bell"
msgstr ""
#: src/components/NotificationSettingsPanel.tsx
msgid "Blocked in your browser settings"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Blue"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Body"
msgstr ""
#: src/pages/shell/computer-screen.tsx
msgid "Booting live desktop…"
msgstr "लाइव डेस्कटॉप शुरू हो रहा है…"
@ -810,7 +834,6 @@ msgstr "बॉट"
#: src/pages/IntegrationSetup.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/avatar-studio-popover.tsx
msgid "Bot"
msgstr "बॉट"
@ -834,10 +857,26 @@ msgstr "बॉट डिफ़ॉल्ट रूप से बिना पू
msgid "Bots are working"
msgstr "बॉट काम कर रहे हैं"
#: src/components/OoAtelier.tsx
msgid "Bow"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Bow tie"
msgstr ""
#: src/pages/memory-providers/SerenitySettingsForm.tsx
msgid "Brain label"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Brown"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Brows"
msgstr ""
#: src/pages/PluginsOverlay.tsx
msgid "Browse MCP servers"
msgstr ""
@ -846,6 +885,14 @@ msgstr ""
msgid "Browser"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Bunny"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Bushy"
msgstr ""
#: src/pages/Shell.tsx
msgid "Busy"
msgstr ""
@ -911,6 +958,10 @@ msgstr "रद्द किया गया"
msgid "Cancelled"
msgstr "रद्द किया गया"
#: src/components/OoAtelier.tsx
msgid "Cat"
msgstr ""
#: src/components/UserFactEditor.tsx
msgid "Category"
msgstr ""
@ -1006,9 +1057,13 @@ msgstr ""
msgid "Checkout has local changes. Clean it before updating."
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
msgid "Choose a bot shape, color, or upload an image"
msgstr "बॉट का आकार और रंग चुनें, या छवि अपलोड करें"
#: src/components/OoAtelier.tsx
msgid "Cheeks"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Chef's hat"
msgstr ""
#: src/pages/MessagingSettingsOverlay.tsx
msgid "Choose a bot…"
@ -1026,7 +1081,7 @@ msgstr "नया पासवर्ड चुनें"
msgid "Choose an existing folder on this computer. Git remotes are linked automatically when a repository is present."
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Choose file"
msgstr "फ़ाइल चुनें"
@ -1034,6 +1089,10 @@ msgstr "फ़ाइल चुनें"
msgid "Choose folder"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Choose how your Oo looks and moves"
msgstr ""
#: src/pages/ModelSettingsOverlay.tsx
msgid "Choose which connected model Rakazo uses."
msgstr "चुनें कि Rakazo किस कनेक्टेड मॉडल का उपयोग करे।"
@ -1046,6 +1105,10 @@ msgstr ""
msgid "Choosing the right shape…"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Classic"
msgstr ""
#: src/pages/shell/dialogs.tsx
msgid "Clear"
msgstr "साफ़ करें"
@ -1076,12 +1139,12 @@ msgstr ""
msgid "Client secret"
msgstr ""
#: src/components/OoAtelier.tsx
#: src/pages/KnowledgeSection.tsx
#: src/pages/MessagingSettingsOverlay.tsx
#: src/pages/PeerMessagesOverlay.tsx
#: src/pages/RoutineEditor.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/avatar-studio-popover.tsx
#: src/pages/WindowChrome.tsx
msgid "Close"
msgstr "बंद करें"
@ -1165,11 +1228,11 @@ msgstr ""
msgid "Collapse {0}"
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Color"
msgstr "रंग"
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Color {color}"
msgstr "रंग {color}"
@ -1846,15 +1909,27 @@ msgstr "Cron"
msgid "Cron expression"
msgstr "Cron एक्सप्रेशन"
#: src/components/OoAtelier.tsx
msgid "Crown"
msgstr ""
#: src/pages/AccountSettingsOverlay.tsx
msgid "Current password"
msgstr "वर्तमान पासवर्ड"
#: src/components/OoAtelier.tsx
msgid "Custom color"
msgstr ""
#: src/pages/shell/dialogs.tsx
msgid "Customer support"
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/onboarding/OnboardingOoDesigner.tsx
msgid "Customize"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Customize bot avatar"
msgstr "बॉट अवतार अनुकूलित करें"
@ -2056,6 +2131,10 @@ msgstr "Docker अतिरिक्त सुरक्षा के लिए
msgid "Does not speak"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Dog"
msgstr ""
#: src/pages/HeuteBrief.tsx
msgid "Doing"
msgstr ""
@ -2071,10 +2150,10 @@ msgstr ""
#: src/components/ai/DelegatedTaskCard.tsx
#: src/components/CookingMode.tsx
#: src/components/media/MediaCard.tsx
#: src/components/OoAtelier.tsx
#: src/components/ThreadCard.tsx
#: src/pages/HeuteBrief.tsx
#: src/pages/ProjectSessionTimeline.tsx
#: src/pages/shell/avatar-studio-popover.tsx
msgid "Done"
msgstr "पूर्ण"
@ -2083,6 +2162,10 @@ msgstr "पूर्ण"
msgid "Done"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Dot"
msgstr ""
#. placeholder {0}: props.name
#: src/components/ArtifactFileCard.tsx
msgid "Download {0}"
@ -2120,7 +2203,7 @@ msgstr ""
msgid "Drag to reorder"
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Drag, drop, or paste an image"
msgstr "छवि खींचें, छोड़ें या पेस्ट करें"
@ -2161,6 +2244,10 @@ msgstr "ईमेल"
msgid "Embeddings URL"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Energy"
msgstr ""
#: src/pages/ExternalConversationSettings.tsx
msgid "Engage when... Ignore..."
msgstr ""
@ -2288,6 +2375,22 @@ msgstr ""
msgid "Extra high"
msgstr "अतिरिक्त उच्च"
#: src/components/OoAtelier.tsx
msgid "Extras"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Eyeliner"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Eyes"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Eyeshadow"
msgstr ""
#: src/components/UserFactEditor.tsx
msgid "Fact"
msgstr ""
@ -2345,6 +2448,10 @@ msgstr ""
msgid "Finding…"
msgstr "खोजा जा रहा है…"
#: src/components/OoAtelier.tsx
msgid "Fine"
msgstr ""
#. placeholder {0}: new URL(oauth.verificationUri).hostname
#: src/pages/ModelSettingsOverlay.tsx
msgid "Finish signing in at <0>{0}</0>. The final page may not load; paste its URL or code here."
@ -2371,6 +2478,14 @@ msgstr ""
msgid "Flag unexpected actions"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Flick"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Flower"
msgstr ""
#: src/pages/PrivacySettingsOverlay.tsx
msgid "Fonts loaded locally"
msgstr ""
@ -2395,10 +2510,22 @@ msgstr "पासवर्ड भूल गए?"
msgid "Forward"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Freckles"
msgstr ""
#: src/pages/ModelSettingsOverlay.tsx
msgid "Free"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Frog"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Full"
msgstr ""
#: src/pages/WindowChrome.tsx
msgid "Fullscreen"
msgstr "फ़ुलस्क्रीन"
@ -2427,10 +2554,22 @@ msgstr ""
msgid "Getting ready…"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Ghost"
msgstr ""
#: src/pages/RoutineEditor.tsx
msgid "Git event"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Glass"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Glasses"
msgstr ""
#: src/pages/ProjectSessionTimeline.tsx
msgid "Goal"
msgstr ""
@ -2445,6 +2584,14 @@ msgstr ""
msgid "Goals for this project, separate from chat messages. Conversations are below."
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Gold"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Green"
msgstr ""
#: src/components/stage/OoStage.tsx
#: src/pages/MessagingSettingsOverlay.tsx
#: src/pages/Shell.tsx
@ -2490,6 +2637,10 @@ msgstr ""
msgid "Hang up, then enter the code on screen."
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Hat"
msgstr ""
#: src/pages/RoutineEditor.tsx
msgid "header"
msgstr ""
@ -2503,6 +2654,10 @@ msgstr "हेडर नाम"
msgid "Header value"
msgstr "हेडर मान"
#: src/components/OoAtelier.tsx
msgid "Headphones"
msgstr ""
#: src/components/UserProfileSettings.tsx
msgid "Health"
msgstr ""
@ -2511,6 +2666,10 @@ msgstr ""
msgid "Hear a sample"
msgstr "एक नमूना सुनें"
#: src/components/OoAtelier.tsx
msgid "Heart"
msgstr ""
#: src/lib/voice-persona-copy.ts
msgid "Here's the read…"
msgstr ""
@ -2597,7 +2756,7 @@ msgstr ""
msgid "Image model"
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Image upload area"
msgstr "छवि अपलोड क्षेत्र"
@ -2671,6 +2830,10 @@ msgstr "अंतराल मात्रा"
msgid "Interval unit"
msgstr "अंतराल इकाई"
#: src/components/OoAtelier.tsx
msgid "Iris"
msgstr ""
#: src/pages/MemorySettingsOverlay.tsx
#: src/pages/shell/bot-panel.tsx
msgid "Isolated"
@ -2710,6 +2873,10 @@ msgstr "ज्ञान"
msgid "Language"
msgstr "भाषा"
#: src/components/OoAtelier.tsx
msgid "Lashes"
msgstr ""
#: src/components/DesktopUpdates.tsx
msgid "Later"
msgstr ""
@ -2726,6 +2893,10 @@ msgstr ""
msgid "Light"
msgstr "लाइट"
#: src/components/OoAtelier.tsx
msgid "Lilac"
msgstr ""
#: src/pages/shell/bot-capabilities.tsx
msgid "Limit built-in tools"
msgstr ""
@ -3031,6 +3202,10 @@ msgstr "छोटा करें"
msgid "Minimize bots"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Mint"
msgstr ""
#: src/pages/RoutineSchedule.tsx
msgid "minute"
msgstr "मिनट"
@ -3080,6 +3255,10 @@ msgstr ""
msgid "Models from server"
msgstr "सर्वर से मॉडल"
#: src/components/OoAtelier.tsx
msgid "Monocle"
msgstr ""
#: src/pages/RoutineSchedule.tsx
msgid "Monthly"
msgstr "मासिक"
@ -3145,6 +3324,10 @@ msgstr "इस समूह को नाम दें"
msgid "Name this routine"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Neck"
msgstr ""
#: src/components/stage/OoStage.tsx
msgid "Needs attention"
msgstr ""
@ -3168,6 +3351,10 @@ msgstr ""
msgid "Needs your reply"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Nerd"
msgstr ""
#: src/pages/shell/bot-panel.tsx
msgid "New bot"
msgstr "नया बॉट"
@ -3359,6 +3546,10 @@ msgstr ""
msgid "No usage data is sent to third parties"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "None"
msgstr ""
#: src/pages/ScratchpadSection.tsx
msgid "None yet"
msgstr "अभी तक कोई नहीं"
@ -3555,6 +3746,10 @@ msgstr ""
msgid "Park"
msgstr "पार्क करें"
#: src/components/OoAtelier.tsx
msgid "Party hat"
msgstr ""
#: src/components/AskCard.tsx
#: src/pages/AccountSettingsOverlay.tsx
#: src/pages/Auth.tsx
@ -3591,6 +3786,18 @@ msgstr "अपनी API कुंजी पेस्ट करें"
msgid "Paused"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Paw"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Peach"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Penguin"
msgstr ""
#: src/components/UserProfileSettings.tsx
msgid "People"
msgstr ""
@ -3615,6 +3822,14 @@ msgstr ""
msgid "Pin"
msgstr "पिन करें"
#: src/components/OoAtelier.tsx
msgid "Pink"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Playful"
msgstr ""
#: src/pages/VoiceSettingsOverlay.tsx
msgid "Playing…"
msgstr "प्ले हो रहा है…"
@ -3762,6 +3977,10 @@ msgstr "उत्तर पढ़कर सुनाएं"
msgid "read-only"
msgstr "केवल पढ़ने योग्य"
#: src/components/OoAtelier.tsx
msgid "Reading glasses"
msgstr ""
#: src/lib/voice-persona-copy.ts
msgid "Reading the stack trace…"
msgstr ""
@ -3976,7 +4195,7 @@ msgstr ""
#: src/components/ComputerMaintenanceActions.tsx
#: src/components/onboarding/OnboardingOoDesigner.tsx
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Reset"
msgstr "रीसेट करें"
@ -4042,14 +4261,26 @@ msgstr ""
msgid "Riffing"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Robot"
msgstr ""
#: src/pages/ExternalConversationSettings.tsx
msgid "Room guidance"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Rose"
msgstr ""
#: src/pages/RoutineEditor.tsx
msgid "Rotate key"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Round"
msgstr ""
#: src/pages/RoutineEditor.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/routine-event-line.tsx
@ -4164,6 +4395,10 @@ msgstr "हां या ना कहें, या एक वाक्य म
msgid "Scanning exposure…"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Scarf"
msgstr ""
#: src/components/onboarding/OnboardingOoDesigner.tsx
msgid "Scene"
msgstr ""
@ -4294,10 +4529,15 @@ msgstr "सेटअप सहायता"
msgid "Setup progress"
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Shape"
msgstr "आकार"
#. placeholder {0}: shape + 1
#: src/components/OoAtelier.tsx
msgid "Shape {0}"
msgstr ""
#: src/lib/voice-persona-copy.ts
msgid "Share what you're imagining — or tell me one thing to refine."
msgstr ""
@ -4415,6 +4655,10 @@ msgstr ""
msgid "Slack not enabled"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Soft"
msgstr ""
#: src/components/SoftwareUpdateSection.tsx
msgid "Software update"
msgstr ""
@ -4444,6 +4688,10 @@ msgstr "स्पेस डिफ़ॉल्ट"
msgid "Spaces"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Sparkle"
msgstr ""
#: src/pages/shell/transcript.tsx
msgid "Speak"
msgstr "बोलें"
@ -4478,10 +4726,18 @@ msgstr ""
msgid "Specialist crew"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Species"
msgstr ""
#: src/lib/model-tier-label.ts
msgid "Standard"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Star"
msgstr ""
#: src/pages/Shell.tsx
msgid "Start"
msgstr ""
@ -4585,6 +4841,10 @@ msgstr ""
msgid "Stronger together — {0} specialists"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Stub"
msgstr ""
#: src/pages/shell/transcript.tsx
msgid "subagent"
msgstr "सबएजेंट"
@ -4597,6 +4857,10 @@ msgstr "सबमिट करें"
msgid "Summary"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Sunglasses"
msgstr ""
#: src/pages/ModelSettingsOverlay.tsx
msgid "Supports images"
msgstr "छवियों का समर्थन"
@ -4605,6 +4869,10 @@ msgstr "छवियों का समर्थन"
msgid "Supports thinking"
msgstr "सोचने की क्षमता का समर्थन करता है"
#: src/components/OoAtelier.tsx
msgid "Surprise me"
msgstr ""
#: src/components/onboarding/LookPreviewCarousel.tsx
msgid "Swipe for more looks"
msgstr ""
@ -4921,7 +5189,7 @@ msgstr ""
msgid "Updating…"
msgstr "अपडेट हो रहा है…"
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Upload"
msgstr "अपलोड"
@ -4967,6 +5235,10 @@ msgstr "पुष्टि की जा रही है…"
msgid "Video workflow"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Violet"
msgstr ""
#: src/pages/SettingsOverlay.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/composer.tsx
@ -5113,6 +5385,10 @@ msgstr ""
msgid "When a webhook fires"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "When needed"
msgstr ""
#: src/lib/onboarding-copy.ts
msgid "When should I check in with you?"
msgstr ""
@ -5133,6 +5409,10 @@ msgstr "कब उपयोग करें"
msgid "Where should bots run?"
msgstr "बॉट कहां चलने चाहिए?"
#: src/components/OoAtelier.tsx
msgid "Winged"
msgstr ""
#: src/pages/shell/bot-picker.tsx
msgid "With:"
msgstr ""

View File

@ -668,6 +668,10 @@ msgstr ""
msgid "Arguments"
msgstr "인자"
#: src/components/OoAtelier.tsx
msgid "Arms"
msgstr ""
#. placeholder {0}: rule.matchValue
#: src/components/ApprovalRulesSettings.tsx
msgid "Ask before {0}"
@ -716,6 +720,10 @@ msgstr "{0}에"
msgid "at {timeSelect}"
msgstr "{timeSelect}에"
#: src/components/OoAtelier.tsx
msgid "Atelier"
msgstr ""
#: src/pages/shell/composer.tsx
msgid "Attach file"
msgstr "파일 첨부"
@ -756,10 +764,6 @@ msgstr ""
msgid "Available after the routine is saved"
msgstr "루틴을 저장한 후 사용할 수 있습니다"
#: src/pages/shell/avatar-studio-popover.tsx
msgid "Avatar Studio"
msgstr "아바타 스튜디오"
#: src/components/browser/InAppBrowser.tsx
#: src/components/CookingMode.tsx
#: src/components/onboarding/OnboardingVoiceStep.tsx
@ -781,15 +785,35 @@ msgstr ""
msgid "Base URL"
msgstr "서버 주소"
#: src/components/OoAtelier.tsx
msgid "Beanie"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Bear"
msgstr ""
#: src/pages/memory-providers/SerenitySettingsForm.tsx
#: src/pages/PluginsOverlay.tsx
msgid "Bearer token"
msgstr "Bearer 토큰"
#: src/components/OoAtelier.tsx
msgid "Bell"
msgstr ""
#: src/components/NotificationSettingsPanel.tsx
msgid "Blocked in your browser settings"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Blue"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Body"
msgstr ""
#: src/pages/shell/computer-screen.tsx
msgid "Booting live desktop…"
msgstr "라이브 데스크톱 시작 중…"
@ -810,7 +834,6 @@ msgstr "Bot"
#: src/pages/IntegrationSetup.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/avatar-studio-popover.tsx
msgid "Bot"
msgstr "봇"
@ -834,10 +857,26 @@ msgstr "Bot은 기본적으로 묻지 않고 작업합니다. 먼저 확인하
msgid "Bots are working"
msgstr "봇 작업 중"
#: src/components/OoAtelier.tsx
msgid "Bow"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Bow tie"
msgstr ""
#: src/pages/memory-providers/SerenitySettingsForm.tsx
msgid "Brain label"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Brown"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Brows"
msgstr ""
#: src/pages/PluginsOverlay.tsx
msgid "Browse MCP servers"
msgstr ""
@ -846,6 +885,14 @@ msgstr ""
msgid "Browser"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Bunny"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Bushy"
msgstr ""
#: src/pages/Shell.tsx
msgid "Busy"
msgstr ""
@ -911,6 +958,10 @@ msgstr "취소됨"
msgid "Cancelled"
msgstr "취소됨"
#: src/components/OoAtelier.tsx
msgid "Cat"
msgstr ""
#: src/components/UserFactEditor.tsx
msgid "Category"
msgstr ""
@ -1006,9 +1057,13 @@ msgstr "확인 중…"
msgid "Checkout has local changes. Clean it before updating."
msgstr "체크아웃에 로컬 변경 사항이 있습니다. 업데이트하기 전에 정리하세요."
#: src/pages/shell/avatar-studio-popover.tsx
msgid "Choose a bot shape, color, or upload an image"
msgstr "봇 모양과 색을 고르거나 이미지를 업로드하세요"
#: src/components/OoAtelier.tsx
msgid "Cheeks"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Chef's hat"
msgstr ""
#: src/pages/MessagingSettingsOverlay.tsx
msgid "Choose a bot…"
@ -1026,7 +1081,7 @@ msgstr "새 비밀번호 선택"
msgid "Choose an existing folder on this computer. Git remotes are linked automatically when a repository is present."
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Choose file"
msgstr "파일 선택"
@ -1034,6 +1089,10 @@ msgstr "파일 선택"
msgid "Choose folder"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Choose how your Oo looks and moves"
msgstr ""
#: src/pages/ModelSettingsOverlay.tsx
msgid "Choose which connected model Rakazo uses."
msgstr "Rakazo에서 기본으로 사용할 연결된 모델을 선택하세요."
@ -1046,6 +1105,10 @@ msgstr ""
msgid "Choosing the right shape…"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Classic"
msgstr ""
#: src/pages/shell/dialogs.tsx
msgid "Clear"
msgstr "비우기"
@ -1076,12 +1139,12 @@ msgstr ""
msgid "Client secret"
msgstr ""
#: src/components/OoAtelier.tsx
#: src/pages/KnowledgeSection.tsx
#: src/pages/MessagingSettingsOverlay.tsx
#: src/pages/PeerMessagesOverlay.tsx
#: src/pages/RoutineEditor.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/avatar-studio-popover.tsx
#: src/pages/WindowChrome.tsx
msgid "Close"
msgstr "닫기"
@ -1165,11 +1228,11 @@ msgstr ""
msgid "Collapse {0}"
msgstr "{0} 접기"
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Color"
msgstr "색상"
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Color {color}"
msgstr "색상 {color}"
@ -1846,15 +1909,27 @@ msgstr "Cron"
msgid "Cron expression"
msgstr "Cron 표현식"
#: src/components/OoAtelier.tsx
msgid "Crown"
msgstr ""
#: src/pages/AccountSettingsOverlay.tsx
msgid "Current password"
msgstr "현재 비밀번호"
#: src/components/OoAtelier.tsx
msgid "Custom color"
msgstr ""
#: src/pages/shell/dialogs.tsx
msgid "Customer support"
msgstr "고객 지원"
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/onboarding/OnboardingOoDesigner.tsx
msgid "Customize"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Customize bot avatar"
msgstr "봇 아바타 맞춤설정"
@ -2056,6 +2131,10 @@ msgstr "Docker는 보안을 위해 컴퓨터 접근을 제한합니다. {hostLab
msgid "Does not speak"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Dog"
msgstr ""
#: src/pages/HeuteBrief.tsx
msgid "Doing"
msgstr ""
@ -2071,10 +2150,10 @@ msgstr ""
#: src/components/ai/DelegatedTaskCard.tsx
#: src/components/CookingMode.tsx
#: src/components/media/MediaCard.tsx
#: src/components/OoAtelier.tsx
#: src/components/ThreadCard.tsx
#: src/pages/HeuteBrief.tsx
#: src/pages/ProjectSessionTimeline.tsx
#: src/pages/shell/avatar-studio-popover.tsx
msgid "Done"
msgstr "완료"
@ -2083,6 +2162,10 @@ msgstr "완료"
msgid "Done"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Dot"
msgstr ""
#. placeholder {0}: props.name
#: src/components/ArtifactFileCard.tsx
msgid "Download {0}"
@ -2120,7 +2203,7 @@ msgstr ""
msgid "Drag to reorder"
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Drag, drop, or paste an image"
msgstr "이미지를 끌어다 놓거나 붙여넣으세요"
@ -2161,6 +2244,10 @@ msgstr "이메일"
msgid "Embeddings URL"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Energy"
msgstr ""
#: src/pages/ExternalConversationSettings.tsx
msgid "Engage when... Ignore..."
msgstr ""
@ -2288,6 +2375,22 @@ msgstr ""
msgid "Extra high"
msgstr "매우 높음"
#: src/components/OoAtelier.tsx
msgid "Extras"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Eyeliner"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Eyes"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Eyeshadow"
msgstr ""
#: src/components/UserFactEditor.tsx
msgid "Fact"
msgstr ""
@ -2345,6 +2448,10 @@ msgstr ""
msgid "Finding…"
msgstr "찾는 중…"
#: src/components/OoAtelier.tsx
msgid "Fine"
msgstr ""
#. placeholder {0}: new URL(oauth.verificationUri).hostname
#: src/pages/ModelSettingsOverlay.tsx
msgid "Finish signing in at <0>{0}</0>. The final page may not load; paste its URL or code here."
@ -2371,6 +2478,14 @@ msgstr ""
msgid "Flag unexpected actions"
msgstr "예상하지 못한 작업 표시"
#: src/components/OoAtelier.tsx
msgid "Flick"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Flower"
msgstr ""
#: src/pages/PrivacySettingsOverlay.tsx
msgid "Fonts loaded locally"
msgstr ""
@ -2395,10 +2510,22 @@ msgstr "비밀번호를 잊으셨나요?"
msgid "Forward"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Freckles"
msgstr ""
#: src/pages/ModelSettingsOverlay.tsx
msgid "Free"
msgstr "무료"
#: src/components/OoAtelier.tsx
msgid "Frog"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Full"
msgstr ""
#: src/pages/WindowChrome.tsx
msgid "Fullscreen"
msgstr "전체 화면"
@ -2427,10 +2554,22 @@ msgstr ""
msgid "Getting ready…"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Ghost"
msgstr ""
#: src/pages/RoutineEditor.tsx
msgid "Git event"
msgstr "Git 이벤트"
#: src/components/OoAtelier.tsx
msgid "Glass"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Glasses"
msgstr ""
#: src/pages/ProjectSessionTimeline.tsx
msgid "Goal"
msgstr ""
@ -2445,6 +2584,14 @@ msgstr ""
msgid "Goals for this project, separate from chat messages. Conversations are below."
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Gold"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Green"
msgstr ""
#: src/components/stage/OoStage.tsx
#: src/pages/MessagingSettingsOverlay.tsx
#: src/pages/Shell.tsx
@ -2490,6 +2637,10 @@ msgstr "먼저 전화를 끊은 다음 화면에 표시된 코드를 입력하
msgid "Hang up, then enter the code on screen."
msgstr "전화를 끊은 다음 화면에 표시된 코드를 입력하세요."
#: src/components/OoAtelier.tsx
msgid "Hat"
msgstr ""
#: src/pages/RoutineEditor.tsx
msgid "header"
msgstr "header"
@ -2503,6 +2654,10 @@ msgstr "헤더 이름"
msgid "Header value"
msgstr "헤더 값"
#: src/components/OoAtelier.tsx
msgid "Headphones"
msgstr ""
#: src/components/UserProfileSettings.tsx
msgid "Health"
msgstr ""
@ -2511,6 +2666,10 @@ msgstr ""
msgid "Hear a sample"
msgstr "샘플 듣기"
#: src/components/OoAtelier.tsx
msgid "Heart"
msgstr ""
#: src/lib/voice-persona-copy.ts
msgid "Here's the read…"
msgstr ""
@ -2597,7 +2756,7 @@ msgstr ""
msgid "Image model"
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Image upload area"
msgstr "이미지 업로드 영역"
@ -2671,6 +2830,10 @@ msgstr "간격 숫자"
msgid "Interval unit"
msgstr "간격 단위"
#: src/components/OoAtelier.tsx
msgid "Iris"
msgstr ""
#: src/pages/MemorySettingsOverlay.tsx
#: src/pages/shell/bot-panel.tsx
msgid "Isolated"
@ -2710,6 +2873,10 @@ msgstr "지식"
msgid "Language"
msgstr "언어"
#: src/components/OoAtelier.tsx
msgid "Lashes"
msgstr ""
#: src/components/DesktopUpdates.tsx
msgid "Later"
msgstr ""
@ -2726,6 +2893,10 @@ msgstr ""
msgid "Light"
msgstr "라이트"
#: src/components/OoAtelier.tsx
msgid "Lilac"
msgstr ""
#: src/pages/shell/bot-capabilities.tsx
msgid "Limit built-in tools"
msgstr ""
@ -3031,6 +3202,10 @@ msgstr "최소화"
msgid "Minimize bots"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Mint"
msgstr ""
#: src/pages/RoutineSchedule.tsx
msgid "minute"
msgstr "분"
@ -3080,6 +3255,10 @@ msgstr ""
msgid "Models from server"
msgstr "서버에서 찾은 모델"
#: src/components/OoAtelier.tsx
msgid "Monocle"
msgstr ""
#: src/pages/RoutineSchedule.tsx
msgid "Monthly"
msgstr "매월"
@ -3145,6 +3324,10 @@ msgstr "그룹 이름"
msgid "Name this routine"
msgstr "이 루틴의 이름을 정하세요"
#: src/components/OoAtelier.tsx
msgid "Neck"
msgstr ""
#: src/components/stage/OoStage.tsx
msgid "Needs attention"
msgstr ""
@ -3168,6 +3351,10 @@ msgstr ""
msgid "Needs your reply"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Nerd"
msgstr ""
#: src/pages/shell/bot-panel.tsx
msgid "New bot"
msgstr "새 Bot 만들기"
@ -3359,6 +3546,10 @@ msgstr "트리거 없음"
msgid "No usage data is sent to third parties"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "None"
msgstr ""
#: src/pages/ScratchpadSection.tsx
msgid "None yet"
msgstr "아직 없음"
@ -3555,6 +3746,10 @@ msgstr "PagerDuty 인시던트"
msgid "Park"
msgstr "보류"
#: src/components/OoAtelier.tsx
msgid "Party hat"
msgstr ""
#: src/components/AskCard.tsx
#: src/pages/AccountSettingsOverlay.tsx
#: src/pages/Auth.tsx
@ -3591,6 +3786,18 @@ msgstr "API 키를 붙여넣으세요"
msgid "Paused"
msgstr "일시 중지됨"
#: src/components/OoAtelier.tsx
msgid "Paw"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Peach"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Penguin"
msgstr ""
#: src/components/UserProfileSettings.tsx
msgid "People"
msgstr ""
@ -3615,6 +3822,14 @@ msgstr ""
msgid "Pin"
msgstr "고정"
#: src/components/OoAtelier.tsx
msgid "Pink"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Playful"
msgstr ""
#: src/pages/VoiceSettingsOverlay.tsx
msgid "Playing…"
msgstr "재생 중…"
@ -3762,6 +3977,10 @@ msgstr "답변을 자동으로 읽기"
msgid "read-only"
msgstr "읽기 전용"
#: src/components/OoAtelier.tsx
msgid "Reading glasses"
msgstr ""
#: src/lib/voice-persona-copy.ts
msgid "Reading the stack trace…"
msgstr ""
@ -3976,7 +4195,7 @@ msgstr ""
#: src/components/ComputerMaintenanceActions.tsx
#: src/components/onboarding/OnboardingOoDesigner.tsx
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Reset"
msgstr "재설정"
@ -4042,14 +4261,26 @@ msgstr "연결 해제"
msgid "Riffing"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Robot"
msgstr ""
#: src/pages/ExternalConversationSettings.tsx
msgid "Room guidance"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Rose"
msgstr ""
#: src/pages/RoutineEditor.tsx
msgid "Rotate key"
msgstr "key 교체"
#: src/components/OoAtelier.tsx
msgid "Round"
msgstr ""
#: src/pages/RoutineEditor.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/routine-event-line.tsx
@ -4164,6 +4395,10 @@ msgstr "예 또는 아니요로 답하거나 문장으로 답해 주세요."
msgid "Scanning exposure…"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Scarf"
msgstr ""
#: src/components/onboarding/OnboardingOoDesigner.tsx
msgid "Scene"
msgstr ""
@ -4294,10 +4529,15 @@ msgstr "설정 도움말"
msgid "Setup progress"
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Shape"
msgstr "모양"
#. placeholder {0}: shape + 1
#: src/components/OoAtelier.tsx
msgid "Shape {0}"
msgstr ""
#: src/lib/voice-persona-copy.ts
msgid "Share what you're imagining — or tell me one thing to refine."
msgstr ""
@ -4415,6 +4655,10 @@ msgstr "Slack 메시지"
msgid "Slack not enabled"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Soft"
msgstr ""
#: src/components/SoftwareUpdateSection.tsx
msgid "Software update"
msgstr "소프트웨어 업데이트"
@ -4444,6 +4688,10 @@ msgstr "스페이스 기본값"
msgid "Spaces"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Sparkle"
msgstr ""
#: src/pages/shell/transcript.tsx
msgid "Speak"
msgstr "읽기"
@ -4478,10 +4726,18 @@ msgstr ""
msgid "Specialist crew"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Species"
msgstr ""
#: src/lib/model-tier-label.ts
msgid "Standard"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Star"
msgstr ""
#: src/pages/Shell.tsx
msgid "Start"
msgstr ""
@ -4585,6 +4841,10 @@ msgstr ""
msgid "Stronger together — {0} specialists"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Stub"
msgstr ""
#: src/pages/shell/transcript.tsx
msgid "subagent"
msgstr "보조 에이전트"
@ -4597,6 +4857,10 @@ msgstr "확인"
msgid "Summary"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Sunglasses"
msgstr ""
#: src/pages/ModelSettingsOverlay.tsx
msgid "Supports images"
msgstr "이미지 지원"
@ -4605,6 +4869,10 @@ msgstr "이미지 지원"
msgid "Supports thinking"
msgstr "사고 모드 지원"
#: src/components/OoAtelier.tsx
msgid "Surprise me"
msgstr ""
#: src/components/onboarding/LookPreviewCarousel.tsx
msgid "Swipe for more looks"
msgstr ""
@ -4921,7 +5189,7 @@ msgstr ""
msgid "Updating…"
msgstr "업데이트 중…"
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Upload"
msgstr "업로드"
@ -4967,6 +5235,10 @@ msgstr "확인 중…"
msgid "Video workflow"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Violet"
msgstr ""
#: src/pages/SettingsOverlay.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/composer.tsx
@ -5113,6 +5385,10 @@ msgstr ""
msgid "When a webhook fires"
msgstr "웹훅이 실행될 때"
#: src/components/OoAtelier.tsx
msgid "When needed"
msgstr ""
#: src/lib/onboarding-copy.ts
msgid "When should I check in with you?"
msgstr ""
@ -5133,6 +5409,10 @@ msgstr "언제 사용할지"
msgid "Where should bots run?"
msgstr "Bot을 어디에서 실행할까요?"
#: src/components/OoAtelier.tsx
msgid "Winged"
msgstr ""
#: src/pages/shell/bot-picker.tsx
msgid "With:"
msgstr ""

View File

@ -668,6 +668,10 @@ msgstr ""
msgid "Arguments"
msgstr "Argumentos:"
#: src/components/OoAtelier.tsx
msgid "Arms"
msgstr ""
#. placeholder {0}: rule.matchValue
#: src/components/ApprovalRulesSettings.tsx
msgid "Ask before {0}"
@ -716,6 +720,10 @@ msgstr "em {0}"
msgid "at {timeSelect}"
msgstr "em {timeSelect}"
#: src/components/OoAtelier.tsx
msgid "Atelier"
msgstr ""
#: src/pages/shell/composer.tsx
msgid "Attach file"
msgstr "Escolher arquivo"
@ -756,10 +764,6 @@ msgstr ""
msgid "Available after the routine is saved"
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
msgid "Avatar Studio"
msgstr "Estúdio de avatar"
#: src/components/browser/InAppBrowser.tsx
#: src/components/CookingMode.tsx
#: src/components/onboarding/OnboardingVoiceStep.tsx
@ -781,15 +785,35 @@ msgstr ""
msgid "Base URL"
msgstr "URL Base"
#: src/components/OoAtelier.tsx
msgid "Beanie"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Bear"
msgstr ""
#: src/pages/memory-providers/SerenitySettingsForm.tsx
#: src/pages/PluginsOverlay.tsx
msgid "Bearer token"
msgstr "Token portador"
#: src/components/OoAtelier.tsx
msgid "Bell"
msgstr ""
#: src/components/NotificationSettingsPanel.tsx
msgid "Blocked in your browser settings"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Blue"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Body"
msgstr ""
#: src/pages/shell/computer-screen.tsx
msgid "Booting live desktop…"
msgstr "Iniciando a área de trabalho ao vivo..."
@ -810,7 +834,6 @@ msgstr "Bot"
#: src/pages/IntegrationSetup.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/avatar-studio-popover.tsx
msgid "Bot"
msgstr "Bot"
@ -834,10 +857,26 @@ msgstr "Os bots agem sem perguntar por padrão. Adicione uma exceção apenas qu
msgid "Bots are working"
msgstr "Bots estão trabalhando"
#: src/components/OoAtelier.tsx
msgid "Bow"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Bow tie"
msgstr ""
#: src/pages/memory-providers/SerenitySettingsForm.tsx
msgid "Brain label"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Brown"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Brows"
msgstr ""
#: src/pages/PluginsOverlay.tsx
msgid "Browse MCP servers"
msgstr ""
@ -846,6 +885,14 @@ msgstr ""
msgid "Browser"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Bunny"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Bushy"
msgstr ""
#: src/pages/Shell.tsx
msgid "Busy"
msgstr ""
@ -911,6 +958,10 @@ msgstr "Cancelado"
msgid "Cancelled"
msgstr "Cancelado"
#: src/components/OoAtelier.tsx
msgid "Cat"
msgstr ""
#: src/components/UserFactEditor.tsx
msgid "Category"
msgstr ""
@ -1006,9 +1057,13 @@ msgstr ""
msgid "Checkout has local changes. Clean it before updating."
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
msgid "Choose a bot shape, color, or upload an image"
msgstr "Escolha uma forma e cor do bot, ou envie uma imagem"
#: src/components/OoAtelier.tsx
msgid "Cheeks"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Chef's hat"
msgstr ""
#: src/pages/MessagingSettingsOverlay.tsx
msgid "Choose a bot…"
@ -1026,7 +1081,7 @@ msgstr "Escolha uma nova senha"
msgid "Choose an existing folder on this computer. Git remotes are linked automatically when a repository is present."
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Choose file"
msgstr "Escolher arquivo"
@ -1034,6 +1089,10 @@ msgstr "Escolher arquivo"
msgid "Choose folder"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Choose how your Oo looks and moves"
msgstr ""
#: src/pages/ModelSettingsOverlay.tsx
msgid "Choose which connected model Rakazo uses."
msgstr "Escolha qual modelo conectado a Rakazo usa."
@ -1046,6 +1105,10 @@ msgstr ""
msgid "Choosing the right shape…"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Classic"
msgstr ""
#: src/pages/shell/dialogs.tsx
msgid "Clear"
msgstr "Limpar"
@ -1076,12 +1139,12 @@ msgstr ""
msgid "Client secret"
msgstr ""
#: src/components/OoAtelier.tsx
#: src/pages/KnowledgeSection.tsx
#: src/pages/MessagingSettingsOverlay.tsx
#: src/pages/PeerMessagesOverlay.tsx
#: src/pages/RoutineEditor.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/avatar-studio-popover.tsx
#: src/pages/WindowChrome.tsx
msgid "Close"
msgstr "Fechar"
@ -1165,11 +1228,11 @@ msgstr ""
msgid "Collapse {0}"
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Color"
msgstr "Cor"
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Color {color}"
msgstr "Cor {color}"
@ -1846,15 +1909,27 @@ msgstr "Cron"
msgid "Cron expression"
msgstr "Expressão cron"
#: src/components/OoAtelier.tsx
msgid "Crown"
msgstr ""
#: src/pages/AccountSettingsOverlay.tsx
msgid "Current password"
msgstr "Senha atual"
#: src/components/OoAtelier.tsx
msgid "Custom color"
msgstr ""
#: src/pages/shell/dialogs.tsx
msgid "Customer support"
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/onboarding/OnboardingOoDesigner.tsx
msgid "Customize"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Customize bot avatar"
msgstr "Personalizar avatar do bot"
@ -2056,6 +2131,10 @@ msgstr "O Docker limita o acesso ao seu computador para maior segurança. Usar {
msgid "Does not speak"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Dog"
msgstr ""
#: src/pages/HeuteBrief.tsx
msgid "Doing"
msgstr ""
@ -2071,10 +2150,10 @@ msgstr ""
#: src/components/ai/DelegatedTaskCard.tsx
#: src/components/CookingMode.tsx
#: src/components/media/MediaCard.tsx
#: src/components/OoAtelier.tsx
#: src/components/ThreadCard.tsx
#: src/pages/HeuteBrief.tsx
#: src/pages/ProjectSessionTimeline.tsx
#: src/pages/shell/avatar-studio-popover.tsx
msgid "Done"
msgstr "Concluído"
@ -2083,6 +2162,10 @@ msgstr "Concluído"
msgid "Done"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Dot"
msgstr ""
#. placeholder {0}: props.name
#: src/components/ArtifactFileCard.tsx
msgid "Download {0}"
@ -2120,7 +2203,7 @@ msgstr ""
msgid "Drag to reorder"
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Drag, drop, or paste an image"
msgstr "Arraste, solte ou cole uma imagem"
@ -2161,6 +2244,10 @@ msgstr "E-mail"
msgid "Embeddings URL"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Energy"
msgstr ""
#: src/pages/ExternalConversationSettings.tsx
msgid "Engage when... Ignore..."
msgstr ""
@ -2288,6 +2375,22 @@ msgstr ""
msgid "Extra high"
msgstr "Extra alta"
#: src/components/OoAtelier.tsx
msgid "Extras"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Eyeliner"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Eyes"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Eyeshadow"
msgstr ""
#: src/components/UserFactEditor.tsx
msgid "Fact"
msgstr ""
@ -2345,6 +2448,10 @@ msgstr ""
msgid "Finding…"
msgstr "Localizando…"
#: src/components/OoAtelier.tsx
msgid "Fine"
msgstr ""
#. placeholder {0}: new URL(oauth.verificationUri).hostname
#: src/pages/ModelSettingsOverlay.tsx
msgid "Finish signing in at <0>{0}</0>. The final page may not load; paste its URL or code here."
@ -2371,6 +2478,14 @@ msgstr ""
msgid "Flag unexpected actions"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Flick"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Flower"
msgstr ""
#: src/pages/PrivacySettingsOverlay.tsx
msgid "Fonts loaded locally"
msgstr ""
@ -2395,10 +2510,22 @@ msgstr "Esqueceu a senha?"
msgid "Forward"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Freckles"
msgstr ""
#: src/pages/ModelSettingsOverlay.tsx
msgid "Free"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Frog"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Full"
msgstr ""
#: src/pages/WindowChrome.tsx
msgid "Fullscreen"
msgstr "Tela Cheia"
@ -2427,10 +2554,22 @@ msgstr ""
msgid "Getting ready…"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Ghost"
msgstr ""
#: src/pages/RoutineEditor.tsx
msgid "Git event"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Glass"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Glasses"
msgstr ""
#: src/pages/ProjectSessionTimeline.tsx
msgid "Goal"
msgstr ""
@ -2445,6 +2584,14 @@ msgstr ""
msgid "Goals for this project, separate from chat messages. Conversations are below."
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Gold"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Green"
msgstr ""
#: src/components/stage/OoStage.tsx
#: src/pages/MessagingSettingsOverlay.tsx
#: src/pages/Shell.tsx
@ -2490,6 +2637,10 @@ msgstr ""
msgid "Hang up, then enter the code on screen."
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Hat"
msgstr ""
#: src/pages/RoutineEditor.tsx
msgid "header"
msgstr ""
@ -2503,6 +2654,10 @@ msgstr "Nome do Cabeçalho"
msgid "Header value"
msgstr "Valor do cabeçalho"
#: src/components/OoAtelier.tsx
msgid "Headphones"
msgstr ""
#: src/components/UserProfileSettings.tsx
msgid "Health"
msgstr ""
@ -2511,6 +2666,10 @@ msgstr ""
msgid "Hear a sample"
msgstr "Ouvir uma amostra"
#: src/components/OoAtelier.tsx
msgid "Heart"
msgstr ""
#: src/lib/voice-persona-copy.ts
msgid "Here's the read…"
msgstr ""
@ -2597,7 +2756,7 @@ msgstr ""
msgid "Image model"
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Image upload area"
msgstr "Área de envio de imagem"
@ -2671,6 +2830,10 @@ msgstr "Quantidade Intervalo"
msgid "Interval unit"
msgstr "Unidade do intervalo:"
#: src/components/OoAtelier.tsx
msgid "Iris"
msgstr ""
#: src/pages/MemorySettingsOverlay.tsx
#: src/pages/shell/bot-panel.tsx
msgid "Isolated"
@ -2710,6 +2873,10 @@ msgstr "Conhecimento"
msgid "Language"
msgstr "Idioma"
#: src/components/OoAtelier.tsx
msgid "Lashes"
msgstr ""
#: src/components/DesktopUpdates.tsx
msgid "Later"
msgstr ""
@ -2726,6 +2893,10 @@ msgstr ""
msgid "Light"
msgstr "Claro"
#: src/components/OoAtelier.tsx
msgid "Lilac"
msgstr ""
#: src/pages/shell/bot-capabilities.tsx
msgid "Limit built-in tools"
msgstr ""
@ -3031,6 +3202,10 @@ msgstr "Minimizar"
msgid "Minimize bots"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Mint"
msgstr ""
#: src/pages/RoutineSchedule.tsx
msgid "minute"
msgstr "minuto"
@ -3080,6 +3255,10 @@ msgstr ""
msgid "Models from server"
msgstr "Modelos do servidor"
#: src/components/OoAtelier.tsx
msgid "Monocle"
msgstr ""
#: src/pages/RoutineSchedule.tsx
msgid "Monthly"
msgstr "Mensalmente"
@ -3145,6 +3324,10 @@ msgstr "Dar nome ao grupo"
msgid "Name this routine"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Neck"
msgstr ""
#: src/components/stage/OoStage.tsx
msgid "Needs attention"
msgstr ""
@ -3168,6 +3351,10 @@ msgstr ""
msgid "Needs your reply"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Nerd"
msgstr ""
#: src/pages/shell/bot-panel.tsx
msgid "New bot"
msgstr "Novo bot"
@ -3359,6 +3546,10 @@ msgstr ""
msgid "No usage data is sent to third parties"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "None"
msgstr ""
#: src/pages/ScratchpadSection.tsx
msgid "None yet"
msgstr "Nenhuma ainda"
@ -3555,6 +3746,10 @@ msgstr ""
msgid "Park"
msgstr "Suspender"
#: src/components/OoAtelier.tsx
msgid "Party hat"
msgstr ""
#: src/components/AskCard.tsx
#: src/pages/AccountSettingsOverlay.tsx
#: src/pages/Auth.tsx
@ -3591,6 +3786,18 @@ msgstr "Cole sua chave API"
msgid "Paused"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Paw"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Peach"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Penguin"
msgstr ""
#: src/components/UserProfileSettings.tsx
msgid "People"
msgstr ""
@ -3615,6 +3822,14 @@ msgstr ""
msgid "Pin"
msgstr "Fixar"
#: src/components/OoAtelier.tsx
msgid "Pink"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Playful"
msgstr ""
#: src/pages/VoiceSettingsOverlay.tsx
msgid "Playing…"
msgstr "Reproduzindo"
@ -3762,6 +3977,10 @@ msgstr "Leia as respostas em voz alta"
msgid "read-only"
msgstr "somente leitura"
#: src/components/OoAtelier.tsx
msgid "Reading glasses"
msgstr ""
#: src/lib/voice-persona-copy.ts
msgid "Reading the stack trace…"
msgstr ""
@ -3976,7 +4195,7 @@ msgstr ""
#: src/components/ComputerMaintenanceActions.tsx
#: src/components/onboarding/OnboardingOoDesigner.tsx
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Reset"
msgstr "Redefinir"
@ -4042,14 +4261,26 @@ msgstr ""
msgid "Riffing"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Robot"
msgstr ""
#: src/pages/ExternalConversationSettings.tsx
msgid "Room guidance"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Rose"
msgstr ""
#: src/pages/RoutineEditor.tsx
msgid "Rotate key"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Round"
msgstr ""
#: src/pages/RoutineEditor.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/routine-event-line.tsx
@ -4164,6 +4395,10 @@ msgstr "Diga sim ou não, ou responda em uma frase."
msgid "Scanning exposure…"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Scarf"
msgstr ""
#: src/components/onboarding/OnboardingOoDesigner.tsx
msgid "Scene"
msgstr ""
@ -4294,10 +4529,15 @@ msgstr "Ajuda"
msgid "Setup progress"
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Shape"
msgstr "Forma"
#. placeholder {0}: shape + 1
#: src/components/OoAtelier.tsx
msgid "Shape {0}"
msgstr ""
#: src/lib/voice-persona-copy.ts
msgid "Share what you're imagining — or tell me one thing to refine."
msgstr ""
@ -4415,6 +4655,10 @@ msgstr ""
msgid "Slack not enabled"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Soft"
msgstr ""
#: src/components/SoftwareUpdateSection.tsx
msgid "Software update"
msgstr ""
@ -4444,6 +4688,10 @@ msgstr "Padrão do espaço"
msgid "Spaces"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Sparkle"
msgstr ""
#: src/pages/shell/transcript.tsx
msgid "Speak"
msgstr "Falar"
@ -4478,10 +4726,18 @@ msgstr ""
msgid "Specialist crew"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Species"
msgstr ""
#: src/lib/model-tier-label.ts
msgid "Standard"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Star"
msgstr ""
#: src/pages/Shell.tsx
msgid "Start"
msgstr ""
@ -4585,6 +4841,10 @@ msgstr ""
msgid "Stronger together — {0} specialists"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Stub"
msgstr ""
#: src/pages/shell/transcript.tsx
msgid "subagent"
msgstr "subagente"
@ -4597,6 +4857,10 @@ msgstr "Enviar"
msgid "Summary"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Sunglasses"
msgstr ""
#: src/pages/ModelSettingsOverlay.tsx
msgid "Supports images"
msgstr "Suporta imagens"
@ -4605,6 +4869,10 @@ msgstr "Suporta imagens"
msgid "Supports thinking"
msgstr "Suporta raciocínio"
#: src/components/OoAtelier.tsx
msgid "Surprise me"
msgstr ""
#: src/components/onboarding/LookPreviewCarousel.tsx
msgid "Swipe for more looks"
msgstr ""
@ -4921,7 +5189,7 @@ msgstr ""
msgid "Updating…"
msgstr "Atualizando…"
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Upload"
msgstr "Enviar"
@ -4967,6 +5235,10 @@ msgstr "Verificando…"
msgid "Video workflow"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Violet"
msgstr ""
#: src/pages/SettingsOverlay.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/composer.tsx
@ -5113,6 +5385,10 @@ msgstr ""
msgid "When a webhook fires"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "When needed"
msgstr ""
#: src/lib/onboarding-copy.ts
msgid "When should I check in with you?"
msgstr ""
@ -5133,6 +5409,10 @@ msgstr "Quando usar"
msgid "Where should bots run?"
msgstr "Onde os bots devem ser executados?"
#: src/components/OoAtelier.tsx
msgid "Winged"
msgstr ""
#: src/pages/shell/bot-picker.tsx
msgid "With:"
msgstr ""

View File

@ -668,6 +668,10 @@ msgstr ""
msgid "Arguments"
msgstr "Аргументы"
#: src/components/OoAtelier.tsx
msgid "Arms"
msgstr ""
#. placeholder {0}: rule.matchValue
#: src/components/ApprovalRulesSettings.tsx
msgid "Ask before {0}"
@ -716,6 +720,10 @@ msgstr "в {0}"
msgid "at {timeSelect}"
msgstr "в {timeSelect}"
#: src/components/OoAtelier.tsx
msgid "Atelier"
msgstr ""
#: src/pages/shell/composer.tsx
msgid "Attach file"
msgstr "Прикрепить файл"
@ -756,10 +764,6 @@ msgstr "Автоматические отправители появятся п
msgid "Available after the routine is saved"
msgstr "Доступно после сохранения задачи"
#: src/pages/shell/avatar-studio-popover.tsx
msgid "Avatar Studio"
msgstr "Студия аватаров"
#: src/components/browser/InAppBrowser.tsx
#: src/components/CookingMode.tsx
#: src/components/onboarding/OnboardingVoiceStep.tsx
@ -781,15 +785,35 @@ msgstr ""
msgid "Base URL"
msgstr "Базовый URL"
#: src/components/OoAtelier.tsx
msgid "Beanie"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Bear"
msgstr ""
#: src/pages/memory-providers/SerenitySettingsForm.tsx
#: src/pages/PluginsOverlay.tsx
msgid "Bearer token"
msgstr "Bearer-токен"
#: src/components/OoAtelier.tsx
msgid "Bell"
msgstr ""
#: src/components/NotificationSettingsPanel.tsx
msgid "Blocked in your browser settings"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Blue"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Body"
msgstr ""
#: src/pages/shell/computer-screen.tsx
msgid "Booting live desktop…"
msgstr "Загрузка рабочего стола…"
@ -810,7 +834,6 @@ msgstr "Бот"
#: src/pages/IntegrationSetup.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/avatar-studio-popover.tsx
msgid "Bot"
msgstr "Бот"
@ -834,10 +857,26 @@ msgstr "По умолчанию боты действуют, не спрашив
msgid "Bots are working"
msgstr "Боты работают"
#: src/components/OoAtelier.tsx
msgid "Bow"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Bow tie"
msgstr ""
#: src/pages/memory-providers/SerenitySettingsForm.tsx
msgid "Brain label"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Brown"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Brows"
msgstr ""
#: src/pages/PluginsOverlay.tsx
msgid "Browse MCP servers"
msgstr "Просмотреть MCP-серверы"
@ -846,6 +885,14 @@ msgstr "Просмотреть MCP-серверы"
msgid "Browser"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Bunny"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Bushy"
msgstr ""
#: src/pages/Shell.tsx
msgid "Busy"
msgstr ""
@ -911,6 +958,10 @@ msgstr "Отменено"
msgid "Cancelled"
msgstr "Отменено"
#: src/components/OoAtelier.tsx
msgid "Cat"
msgstr ""
#: src/components/UserFactEditor.tsx
msgid "Category"
msgstr ""
@ -1006,9 +1057,13 @@ msgstr "Проверка…"
msgid "Checkout has local changes. Clean it before updating."
msgstr "В checkout есть локальные изменения. Очистите его перед обновлением."
#: src/pages/shell/avatar-studio-popover.tsx
msgid "Choose a bot shape, color, or upload an image"
msgstr "Выберите форму и цвет бота или загрузите изображение"
#: src/components/OoAtelier.tsx
msgid "Cheeks"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Chef's hat"
msgstr ""
#: src/pages/MessagingSettingsOverlay.tsx
msgid "Choose a bot…"
@ -1026,7 +1081,7 @@ msgstr "Выберите новый пароль"
msgid "Choose an existing folder on this computer. Git remotes are linked automatically when a repository is present."
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Choose file"
msgstr "Выбрать файл"
@ -1034,6 +1089,10 @@ msgstr "Выбрать файл"
msgid "Choose folder"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Choose how your Oo looks and moves"
msgstr ""
#: src/pages/ModelSettingsOverlay.tsx
msgid "Choose which connected model Rakazo uses."
msgstr "Выберите, какую подключенную модель использует Rakazo."
@ -1046,6 +1105,10 @@ msgstr ""
msgid "Choosing the right shape…"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Classic"
msgstr ""
#: src/pages/shell/dialogs.tsx
msgid "Clear"
msgstr "Очистить"
@ -1076,12 +1139,12 @@ msgstr "ID клиента"
msgid "Client secret"
msgstr "Секрет клиента"
#: src/components/OoAtelier.tsx
#: src/pages/KnowledgeSection.tsx
#: src/pages/MessagingSettingsOverlay.tsx
#: src/pages/PeerMessagesOverlay.tsx
#: src/pages/RoutineEditor.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/avatar-studio-popover.tsx
#: src/pages/WindowChrome.tsx
msgid "Close"
msgstr "Закрыть"
@ -1165,11 +1228,11 @@ msgstr ""
msgid "Collapse {0}"
msgstr "Свернуть {0}"
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Color"
msgstr "Цвет"
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Color {color}"
msgstr "Цвет {color}"
@ -1846,15 +1909,27 @@ msgstr "Крон"
msgid "Cron expression"
msgstr "Выражение Cron"
#: src/components/OoAtelier.tsx
msgid "Crown"
msgstr ""
#: src/pages/AccountSettingsOverlay.tsx
msgid "Current password"
msgstr "Текущий пароль"
#: src/components/OoAtelier.tsx
msgid "Custom color"
msgstr ""
#: src/pages/shell/dialogs.tsx
msgid "Customer support"
msgstr "Поддержка клиентов"
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/onboarding/OnboardingOoDesigner.tsx
msgid "Customize"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Customize bot avatar"
msgstr "Настроить аватар бота"
@ -2056,6 +2131,10 @@ msgstr "Docker ограничивает доступ к вашему компь
msgid "Does not speak"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Dog"
msgstr ""
#: src/pages/HeuteBrief.tsx
msgid "Doing"
msgstr ""
@ -2071,10 +2150,10 @@ msgstr ""
#: src/components/ai/DelegatedTaskCard.tsx
#: src/components/CookingMode.tsx
#: src/components/media/MediaCard.tsx
#: src/components/OoAtelier.tsx
#: src/components/ThreadCard.tsx
#: src/pages/HeuteBrief.tsx
#: src/pages/ProjectSessionTimeline.tsx
#: src/pages/shell/avatar-studio-popover.tsx
msgid "Done"
msgstr "Готово"
@ -2083,6 +2162,10 @@ msgstr "Готово"
msgid "Done"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Dot"
msgstr ""
#. placeholder {0}: props.name
#: src/components/ArtifactFileCard.tsx
msgid "Download {0}"
@ -2120,7 +2203,7 @@ msgstr ""
msgid "Drag to reorder"
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Drag, drop, or paste an image"
msgstr "Перетащите или вставьте изображение"
@ -2161,6 +2244,10 @@ msgstr "Электронная почта"
msgid "Embeddings URL"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Energy"
msgstr ""
#: src/pages/ExternalConversationSettings.tsx
msgid "Engage when... Ignore..."
msgstr "Включайтесь, когда... Игнорируйте..."
@ -2288,6 +2375,22 @@ msgstr "Внешний диалог"
msgid "Extra high"
msgstr "Очень высокий"
#: src/components/OoAtelier.tsx
msgid "Extras"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Eyeliner"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Eyes"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Eyeshadow"
msgstr ""
#: src/components/UserFactEditor.tsx
msgid "Fact"
msgstr ""
@ -2345,6 +2448,10 @@ msgstr ""
msgid "Finding…"
msgstr "Поиск…"
#: src/components/OoAtelier.tsx
msgid "Fine"
msgstr ""
#. placeholder {0}: new URL(oauth.verificationUri).hostname
#: src/pages/ModelSettingsOverlay.tsx
msgid "Finish signing in at <0>{0}</0>. The final page may not load; paste its URL or code here."
@ -2371,6 +2478,14 @@ msgstr ""
msgid "Flag unexpected actions"
msgstr "Пометить неожиданные действия"
#: src/components/OoAtelier.tsx
msgid "Flick"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Flower"
msgstr ""
#: src/pages/PrivacySettingsOverlay.tsx
msgid "Fonts loaded locally"
msgstr ""
@ -2395,10 +2510,22 @@ msgstr "Забыли пароль?"
msgid "Forward"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Freckles"
msgstr ""
#: src/pages/ModelSettingsOverlay.tsx
msgid "Free"
msgstr "Бесплатно"
#: src/components/OoAtelier.tsx
msgid "Frog"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Full"
msgstr ""
#: src/pages/WindowChrome.tsx
msgid "Fullscreen"
msgstr "Полноэкранный"
@ -2427,10 +2554,22 @@ msgstr "Подготовка"
msgid "Getting ready…"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Ghost"
msgstr ""
#: src/pages/RoutineEditor.tsx
msgid "Git event"
msgstr "Git-событие"
#: src/components/OoAtelier.tsx
msgid "Glass"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Glasses"
msgstr ""
#: src/pages/ProjectSessionTimeline.tsx
msgid "Goal"
msgstr ""
@ -2445,6 +2584,14 @@ msgstr ""
msgid "Goals for this project, separate from chat messages. Conversations are below."
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Gold"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Green"
msgstr ""
#: src/components/stage/OoStage.tsx
#: src/pages/MessagingSettingsOverlay.tsx
#: src/pages/Shell.tsx
@ -2490,6 +2637,10 @@ msgstr "Сначала повесьте трубку, затем введите
msgid "Hang up, then enter the code on screen."
msgstr "Повесьте трубку, затем введите код на экране."
#: src/components/OoAtelier.tsx
msgid "Hat"
msgstr ""
#: src/pages/RoutineEditor.tsx
msgid "header"
msgstr "заголовок"
@ -2503,6 +2654,10 @@ msgstr "Название заголовка"
msgid "Header value"
msgstr "Значение заголовка"
#: src/components/OoAtelier.tsx
msgid "Headphones"
msgstr ""
#: src/components/UserProfileSettings.tsx
msgid "Health"
msgstr ""
@ -2511,6 +2666,10 @@ msgstr ""
msgid "Hear a sample"
msgstr "Прослушать образец"
#: src/components/OoAtelier.tsx
msgid "Heart"
msgstr ""
#: src/lib/voice-persona-copy.ts
msgid "Here's the read…"
msgstr ""
@ -2597,7 +2756,7 @@ msgstr "игнорировать"
msgid "Image model"
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Image upload area"
msgstr "Область загрузки изображения"
@ -2671,6 +2830,10 @@ msgstr "Значение интервала"
msgid "Interval unit"
msgstr "Единица интервала"
#: src/components/OoAtelier.tsx
msgid "Iris"
msgstr ""
#: src/pages/MemorySettingsOverlay.tsx
#: src/pages/shell/bot-panel.tsx
msgid "Isolated"
@ -2710,6 +2873,10 @@ msgstr "Знание"
msgid "Language"
msgstr "Язык"
#: src/components/OoAtelier.tsx
msgid "Lashes"
msgstr ""
#: src/components/DesktopUpdates.tsx
msgid "Later"
msgstr "Позже"
@ -2726,6 +2893,10 @@ msgstr ""
msgid "Light"
msgstr "Светлая"
#: src/components/OoAtelier.tsx
msgid "Lilac"
msgstr ""
#: src/pages/shell/bot-capabilities.tsx
msgid "Limit built-in tools"
msgstr ""
@ -3031,6 +3202,10 @@ msgstr "Свернуть"
msgid "Minimize bots"
msgstr "Свернуть ботов"
#: src/components/OoAtelier.tsx
msgid "Mint"
msgstr ""
#: src/pages/RoutineSchedule.tsx
msgid "minute"
msgstr "минута"
@ -3080,6 +3255,10 @@ msgstr "Модели для пространства владельца серв
msgid "Models from server"
msgstr "Модели с сервера"
#: src/components/OoAtelier.tsx
msgid "Monocle"
msgstr ""
#: src/pages/RoutineSchedule.tsx
msgid "Monthly"
msgstr "Ежемесячно"
@ -3145,6 +3324,10 @@ msgstr "Назовите эту группу"
msgid "Name this routine"
msgstr "Назовите эту задачу"
#: src/components/OoAtelier.tsx
msgid "Neck"
msgstr ""
#: src/components/stage/OoStage.tsx
msgid "Needs attention"
msgstr ""
@ -3168,6 +3351,10 @@ msgstr "Требуется ваше участие"
msgid "Needs your reply"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Nerd"
msgstr ""
#: src/pages/shell/bot-panel.tsx
msgid "New bot"
msgstr "Новый бот"
@ -3359,6 +3546,10 @@ msgstr "Нет триггера"
msgid "No usage data is sent to third parties"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "None"
msgstr ""
#: src/pages/ScratchpadSection.tsx
msgid "None yet"
msgstr "Пока нет"
@ -3555,6 +3746,10 @@ msgstr "Инцидент PagerDuty"
msgid "Park"
msgstr "Приостановить"
#: src/components/OoAtelier.tsx
msgid "Party hat"
msgstr ""
#: src/components/AskCard.tsx
#: src/pages/AccountSettingsOverlay.tsx
#: src/pages/Auth.tsx
@ -3591,6 +3786,18 @@ msgstr "Вставьте свой ключ API"
msgid "Paused"
msgstr "Приостановлено"
#: src/components/OoAtelier.tsx
msgid "Paw"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Peach"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Penguin"
msgstr ""
#: src/components/UserProfileSettings.tsx
msgid "People"
msgstr ""
@ -3615,6 +3822,14 @@ msgstr ""
msgid "Pin"
msgstr "Закрепить"
#: src/components/OoAtelier.tsx
msgid "Pink"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Playful"
msgstr ""
#: src/pages/VoiceSettingsOverlay.tsx
msgid "Playing…"
msgstr "Воспроизведение…"
@ -3762,6 +3977,10 @@ msgstr "Читать ответы вслух"
msgid "read-only"
msgstr "только для чтения"
#: src/components/OoAtelier.tsx
msgid "Reading glasses"
msgstr ""
#: src/lib/voice-persona-copy.ts
msgid "Reading the stack trace…"
msgstr ""
@ -3976,7 +4195,7 @@ msgstr ""
#: src/components/ComputerMaintenanceActions.tsx
#: src/components/onboarding/OnboardingOoDesigner.tsx
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Reset"
msgstr "Сбросить"
@ -4042,14 +4261,26 @@ msgstr "Отозвать"
msgid "Riffing"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Robot"
msgstr ""
#: src/pages/ExternalConversationSettings.tsx
msgid "Room guidance"
msgstr "Инструкции для комнаты"
#: src/components/OoAtelier.tsx
msgid "Rose"
msgstr ""
#: src/pages/RoutineEditor.tsx
msgid "Rotate key"
msgstr "Сменить ключ"
#: src/components/OoAtelier.tsx
msgid "Round"
msgstr ""
#: src/pages/RoutineEditor.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/routine-event-line.tsx
@ -4164,6 +4395,10 @@ msgstr "Скажите «да» или «нет» или ответьте пре
msgid "Scanning exposure…"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Scarf"
msgstr ""
#: src/components/onboarding/OnboardingOoDesigner.tsx
msgid "Scene"
msgstr ""
@ -4294,10 +4529,15 @@ msgstr "Помощь по настройке"
msgid "Setup progress"
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Shape"
msgstr "Форма"
#. placeholder {0}: shape + 1
#: src/components/OoAtelier.tsx
msgid "Shape {0}"
msgstr ""
#: src/lib/voice-persona-copy.ts
msgid "Share what you're imagining — or tell me one thing to refine."
msgstr ""
@ -4415,6 +4655,10 @@ msgstr "Сообщение Slack"
msgid "Slack not enabled"
msgstr "Slack не включен"
#: src/components/OoAtelier.tsx
msgid "Soft"
msgstr ""
#: src/components/SoftwareUpdateSection.tsx
msgid "Software update"
msgstr "Обновление программного обеспечения"
@ -4444,6 +4688,10 @@ msgstr "Пространство по умолчанию"
msgid "Spaces"
msgstr "Пространства"
#: src/components/OoAtelier.tsx
msgid "Sparkle"
msgstr ""
#: src/pages/shell/transcript.tsx
msgid "Speak"
msgstr "Озвучить"
@ -4478,10 +4726,18 @@ msgstr ""
msgid "Specialist crew"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Species"
msgstr ""
#: src/lib/model-tier-label.ts
msgid "Standard"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Star"
msgstr ""
#: src/pages/Shell.tsx
msgid "Start"
msgstr ""
@ -4585,6 +4841,10 @@ msgstr ""
msgid "Stronger together — {0} specialists"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Stub"
msgstr ""
#: src/pages/shell/transcript.tsx
msgid "subagent"
msgstr "субагент"
@ -4597,6 +4857,10 @@ msgstr "Отправить"
msgid "Summary"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Sunglasses"
msgstr ""
#: src/pages/ModelSettingsOverlay.tsx
msgid "Supports images"
msgstr ""
@ -4605,6 +4869,10 @@ msgstr ""
msgid "Supports thinking"
msgstr "Поддерживает рассуждения"
#: src/components/OoAtelier.tsx
msgid "Surprise me"
msgstr ""
#: src/components/onboarding/LookPreviewCarousel.tsx
msgid "Swipe for more looks"
msgstr ""
@ -4921,7 +5189,7 @@ msgstr "Обновление компьютера команды"
msgid "Updating…"
msgstr "Обновление…"
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Upload"
msgstr "Загрузить"
@ -4967,6 +5235,10 @@ msgstr "Проверка…"
msgid "Video workflow"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Violet"
msgstr ""
#: src/pages/SettingsOverlay.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/composer.tsx
@ -5113,6 +5385,10 @@ msgstr ""
msgid "When a webhook fires"
msgstr "Когда срабатывает вебхук"
#: src/components/OoAtelier.tsx
msgid "When needed"
msgstr ""
#: src/lib/onboarding-copy.ts
msgid "When should I check in with you?"
msgstr ""
@ -5133,6 +5409,10 @@ msgstr "Когда использовать"
msgid "Where should bots run?"
msgstr "Где должны работать боты?"
#: src/components/OoAtelier.tsx
msgid "Winged"
msgstr ""
#: src/pages/shell/bot-picker.tsx
msgid "With:"
msgstr ""

View File

@ -668,6 +668,10 @@ msgstr ""
msgid "Arguments"
msgstr "Argümanlar"
#: src/components/OoAtelier.tsx
msgid "Arms"
msgstr ""
#. placeholder {0}: rule.matchValue
#: src/components/ApprovalRulesSettings.tsx
msgid "Ask before {0}"
@ -716,6 +720,10 @@ msgstr "saat {0}"
msgid "at {timeSelect}"
msgstr "saat {timeSelect}"
#: src/components/OoAtelier.tsx
msgid "Atelier"
msgstr ""
#: src/pages/shell/composer.tsx
msgid "Attach file"
msgstr "Dosya ekle"
@ -756,10 +764,6 @@ msgstr ""
msgid "Available after the routine is saved"
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
msgid "Avatar Studio"
msgstr "Avatar Stüdyosu"
#: src/components/browser/InAppBrowser.tsx
#: src/components/CookingMode.tsx
#: src/components/onboarding/OnboardingVoiceStep.tsx
@ -781,15 +785,35 @@ msgstr ""
msgid "Base URL"
msgstr "Temel URL"
#: src/components/OoAtelier.tsx
msgid "Beanie"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Bear"
msgstr ""
#: src/pages/memory-providers/SerenitySettingsForm.tsx
#: src/pages/PluginsOverlay.tsx
msgid "Bearer token"
msgstr "Bearer token"
#: src/components/OoAtelier.tsx
msgid "Bell"
msgstr ""
#: src/components/NotificationSettingsPanel.tsx
msgid "Blocked in your browser settings"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Blue"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Body"
msgstr ""
#: src/pages/shell/computer-screen.tsx
msgid "Booting live desktop…"
msgstr "Canlı masaüstü başlatılıyor…"
@ -810,7 +834,6 @@ msgstr "Bot"
#: src/pages/IntegrationSetup.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/avatar-studio-popover.tsx
msgid "Bot"
msgstr "Bot"
@ -834,10 +857,26 @@ msgstr "Botlar varsayılan olarak sormadan hareket eder. Yalnızca belirli bir i
msgid "Bots are working"
msgstr "Botlar çalışıyor"
#: src/components/OoAtelier.tsx
msgid "Bow"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Bow tie"
msgstr ""
#: src/pages/memory-providers/SerenitySettingsForm.tsx
msgid "Brain label"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Brown"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Brows"
msgstr ""
#: src/pages/PluginsOverlay.tsx
msgid "Browse MCP servers"
msgstr ""
@ -846,6 +885,14 @@ msgstr ""
msgid "Browser"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Bunny"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Bushy"
msgstr ""
#: src/pages/Shell.tsx
msgid "Busy"
msgstr ""
@ -911,6 +958,10 @@ msgstr "İptal edildi"
msgid "Cancelled"
msgstr "İptal edildi"
#: src/components/OoAtelier.tsx
msgid "Cat"
msgstr ""
#: src/components/UserFactEditor.tsx
msgid "Category"
msgstr ""
@ -1006,9 +1057,13 @@ msgstr ""
msgid "Checkout has local changes. Clean it before updating."
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
msgid "Choose a bot shape, color, or upload an image"
msgstr "Bir bot şekli ve rengi seçin veya görüntü yükleyin"
#: src/components/OoAtelier.tsx
msgid "Cheeks"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Chef's hat"
msgstr ""
#: src/pages/MessagingSettingsOverlay.tsx
msgid "Choose a bot…"
@ -1026,7 +1081,7 @@ msgstr "Yeni bir parola seçin"
msgid "Choose an existing folder on this computer. Git remotes are linked automatically when a repository is present."
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Choose file"
msgstr "Dosya seç"
@ -1034,6 +1089,10 @@ msgstr "Dosya seç"
msgid "Choose folder"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Choose how your Oo looks and moves"
msgstr ""
#: src/pages/ModelSettingsOverlay.tsx
msgid "Choose which connected model Rakazo uses."
msgstr "Rakazo'nun hangi bağlı modeli kullanacağını seç."
@ -1046,6 +1105,10 @@ msgstr ""
msgid "Choosing the right shape…"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Classic"
msgstr ""
#: src/pages/shell/dialogs.tsx
msgid "Clear"
msgstr "Temizle"
@ -1076,12 +1139,12 @@ msgstr ""
msgid "Client secret"
msgstr ""
#: src/components/OoAtelier.tsx
#: src/pages/KnowledgeSection.tsx
#: src/pages/MessagingSettingsOverlay.tsx
#: src/pages/PeerMessagesOverlay.tsx
#: src/pages/RoutineEditor.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/avatar-studio-popover.tsx
#: src/pages/WindowChrome.tsx
msgid "Close"
msgstr "Kapat"
@ -1165,11 +1228,11 @@ msgstr ""
msgid "Collapse {0}"
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Color"
msgstr "Renk"
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Color {color}"
msgstr "Renk {color}"
@ -1846,15 +1909,27 @@ msgstr "Cron"
msgid "Cron expression"
msgstr "Cron ifadesi"
#: src/components/OoAtelier.tsx
msgid "Crown"
msgstr ""
#: src/pages/AccountSettingsOverlay.tsx
msgid "Current password"
msgstr "Mevcut parola"
#: src/components/OoAtelier.tsx
msgid "Custom color"
msgstr ""
#: src/pages/shell/dialogs.tsx
msgid "Customer support"
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/onboarding/OnboardingOoDesigner.tsx
msgid "Customize"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Customize bot avatar"
msgstr "Bot avatarını özelleştir"
@ -2056,6 +2131,10 @@ msgstr "Docker, ek güvenlik için bilgisayarına erişimi sınırlar. {hostLabe
msgid "Does not speak"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Dog"
msgstr ""
#: src/pages/HeuteBrief.tsx
msgid "Doing"
msgstr ""
@ -2071,10 +2150,10 @@ msgstr ""
#: src/components/ai/DelegatedTaskCard.tsx
#: src/components/CookingMode.tsx
#: src/components/media/MediaCard.tsx
#: src/components/OoAtelier.tsx
#: src/components/ThreadCard.tsx
#: src/pages/HeuteBrief.tsx
#: src/pages/ProjectSessionTimeline.tsx
#: src/pages/shell/avatar-studio-popover.tsx
msgid "Done"
msgstr "Bitti"
@ -2083,6 +2162,10 @@ msgstr "Bitti"
msgid "Done"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Dot"
msgstr ""
#. placeholder {0}: props.name
#: src/components/ArtifactFileCard.tsx
msgid "Download {0}"
@ -2120,7 +2203,7 @@ msgstr ""
msgid "Drag to reorder"
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Drag, drop, or paste an image"
msgstr "Görüntüyü sürükleyip bırakın veya yapıştırın"
@ -2161,6 +2244,10 @@ msgstr "E-posta"
msgid "Embeddings URL"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Energy"
msgstr ""
#: src/pages/ExternalConversationSettings.tsx
msgid "Engage when... Ignore..."
msgstr ""
@ -2288,6 +2375,22 @@ msgstr ""
msgid "Extra high"
msgstr "Çok yüksek"
#: src/components/OoAtelier.tsx
msgid "Extras"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Eyeliner"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Eyes"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Eyeshadow"
msgstr ""
#: src/components/UserFactEditor.tsx
msgid "Fact"
msgstr ""
@ -2345,6 +2448,10 @@ msgstr ""
msgid "Finding…"
msgstr "Aranıyor…"
#: src/components/OoAtelier.tsx
msgid "Fine"
msgstr ""
#. placeholder {0}: new URL(oauth.verificationUri).hostname
#: src/pages/ModelSettingsOverlay.tsx
msgid "Finish signing in at <0>{0}</0>. The final page may not load; paste its URL or code here."
@ -2371,6 +2478,14 @@ msgstr ""
msgid "Flag unexpected actions"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Flick"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Flower"
msgstr ""
#: src/pages/PrivacySettingsOverlay.tsx
msgid "Fonts loaded locally"
msgstr ""
@ -2395,10 +2510,22 @@ msgstr "Parolanızı mı unuttunuz?"
msgid "Forward"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Freckles"
msgstr ""
#: src/pages/ModelSettingsOverlay.tsx
msgid "Free"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Frog"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Full"
msgstr ""
#: src/pages/WindowChrome.tsx
msgid "Fullscreen"
msgstr "Tam ekran"
@ -2427,10 +2554,22 @@ msgstr ""
msgid "Getting ready…"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Ghost"
msgstr ""
#: src/pages/RoutineEditor.tsx
msgid "Git event"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Glass"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Glasses"
msgstr ""
#: src/pages/ProjectSessionTimeline.tsx
msgid "Goal"
msgstr ""
@ -2445,6 +2584,14 @@ msgstr ""
msgid "Goals for this project, separate from chat messages. Conversations are below."
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Gold"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Green"
msgstr ""
#: src/components/stage/OoStage.tsx
#: src/pages/MessagingSettingsOverlay.tsx
#: src/pages/Shell.tsx
@ -2490,6 +2637,10 @@ msgstr ""
msgid "Hang up, then enter the code on screen."
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Hat"
msgstr ""
#: src/pages/RoutineEditor.tsx
msgid "header"
msgstr ""
@ -2503,6 +2654,10 @@ msgstr "Üstbilgi adı"
msgid "Header value"
msgstr "Üstbilgi değeri"
#: src/components/OoAtelier.tsx
msgid "Headphones"
msgstr ""
#: src/components/UserProfileSettings.tsx
msgid "Health"
msgstr ""
@ -2511,6 +2666,10 @@ msgstr ""
msgid "Hear a sample"
msgstr "Örnek dinle"
#: src/components/OoAtelier.tsx
msgid "Heart"
msgstr ""
#: src/lib/voice-persona-copy.ts
msgid "Here's the read…"
msgstr ""
@ -2597,7 +2756,7 @@ msgstr ""
msgid "Image model"
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Image upload area"
msgstr "Görüntü yükleme alanı"
@ -2671,6 +2830,10 @@ msgstr "Aralık miktarı"
msgid "Interval unit"
msgstr "Aralık birimi"
#: src/components/OoAtelier.tsx
msgid "Iris"
msgstr ""
#: src/pages/MemorySettingsOverlay.tsx
#: src/pages/shell/bot-panel.tsx
msgid "Isolated"
@ -2710,6 +2873,10 @@ msgstr "Bilgi"
msgid "Language"
msgstr "Dil"
#: src/components/OoAtelier.tsx
msgid "Lashes"
msgstr ""
#: src/components/DesktopUpdates.tsx
msgid "Later"
msgstr ""
@ -2726,6 +2893,10 @@ msgstr ""
msgid "Light"
msgstr "Açık"
#: src/components/OoAtelier.tsx
msgid "Lilac"
msgstr ""
#: src/pages/shell/bot-capabilities.tsx
msgid "Limit built-in tools"
msgstr ""
@ -3031,6 +3202,10 @@ msgstr "Küçült"
msgid "Minimize bots"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Mint"
msgstr ""
#: src/pages/RoutineSchedule.tsx
msgid "minute"
msgstr "dakika"
@ -3080,6 +3255,10 @@ msgstr ""
msgid "Models from server"
msgstr "Sunucudan gelen modeller"
#: src/components/OoAtelier.tsx
msgid "Monocle"
msgstr ""
#: src/pages/RoutineSchedule.tsx
msgid "Monthly"
msgstr "Aylık"
@ -3145,6 +3324,10 @@ msgstr "Gruba bir ad ver"
msgid "Name this routine"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Neck"
msgstr ""
#: src/components/stage/OoStage.tsx
msgid "Needs attention"
msgstr ""
@ -3168,6 +3351,10 @@ msgstr ""
msgid "Needs your reply"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Nerd"
msgstr ""
#: src/pages/shell/bot-panel.tsx
msgid "New bot"
msgstr "Yeni bot"
@ -3359,6 +3546,10 @@ msgstr ""
msgid "No usage data is sent to third parties"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "None"
msgstr ""
#: src/pages/ScratchpadSection.tsx
msgid "None yet"
msgstr "Henüz yok"
@ -3555,6 +3746,10 @@ msgstr ""
msgid "Park"
msgstr "Beklet"
#: src/components/OoAtelier.tsx
msgid "Party hat"
msgstr ""
#: src/components/AskCard.tsx
#: src/pages/AccountSettingsOverlay.tsx
#: src/pages/Auth.tsx
@ -3591,6 +3786,18 @@ msgstr "API anahtarını yapıştır"
msgid "Paused"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Paw"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Peach"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Penguin"
msgstr ""
#: src/components/UserProfileSettings.tsx
msgid "People"
msgstr ""
@ -3615,6 +3822,14 @@ msgstr ""
msgid "Pin"
msgstr "Sabitle"
#: src/components/OoAtelier.tsx
msgid "Pink"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Playful"
msgstr ""
#: src/pages/VoiceSettingsOverlay.tsx
msgid "Playing…"
msgstr "Çalınıyor…"
@ -3762,6 +3977,10 @@ msgstr "Yanıtları sesli oku"
msgid "read-only"
msgstr "salt okunur"
#: src/components/OoAtelier.tsx
msgid "Reading glasses"
msgstr ""
#: src/lib/voice-persona-copy.ts
msgid "Reading the stack trace…"
msgstr ""
@ -3976,7 +4195,7 @@ msgstr ""
#: src/components/ComputerMaintenanceActions.tsx
#: src/components/onboarding/OnboardingOoDesigner.tsx
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Reset"
msgstr ""
@ -4042,14 +4261,26 @@ msgstr "İptal et"
msgid "Riffing"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Robot"
msgstr ""
#: src/pages/ExternalConversationSettings.tsx
msgid "Room guidance"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Rose"
msgstr ""
#: src/pages/RoutineEditor.tsx
msgid "Rotate key"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Round"
msgstr ""
#: src/pages/RoutineEditor.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/routine-event-line.tsx
@ -4164,6 +4395,10 @@ msgstr "Evet ya da hayır de veya bir cümleyle yanıtla."
msgid "Scanning exposure…"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Scarf"
msgstr ""
#: src/components/onboarding/OnboardingOoDesigner.tsx
msgid "Scene"
msgstr ""
@ -4294,10 +4529,15 @@ msgstr "Kurulum yardımı"
msgid "Setup progress"
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Shape"
msgstr "Şekil"
#. placeholder {0}: shape + 1
#: src/components/OoAtelier.tsx
msgid "Shape {0}"
msgstr ""
#: src/lib/voice-persona-copy.ts
msgid "Share what you're imagining — or tell me one thing to refine."
msgstr ""
@ -4415,6 +4655,10 @@ msgstr ""
msgid "Slack not enabled"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Soft"
msgstr ""
#: src/components/SoftwareUpdateSection.tsx
msgid "Software update"
msgstr ""
@ -4444,6 +4688,10 @@ msgstr "Alan varsayılanı"
msgid "Spaces"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Sparkle"
msgstr ""
#: src/pages/shell/transcript.tsx
msgid "Speak"
msgstr "Seslendir"
@ -4478,10 +4726,18 @@ msgstr ""
msgid "Specialist crew"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Species"
msgstr ""
#: src/lib/model-tier-label.ts
msgid "Standard"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Star"
msgstr ""
#: src/pages/Shell.tsx
msgid "Start"
msgstr ""
@ -4585,6 +4841,10 @@ msgstr ""
msgid "Stronger together — {0} specialists"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Stub"
msgstr ""
#: src/pages/shell/transcript.tsx
msgid "subagent"
msgstr "alt ajan"
@ -4597,6 +4857,10 @@ msgstr "Gönder"
msgid "Summary"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Sunglasses"
msgstr ""
#: src/pages/ModelSettingsOverlay.tsx
msgid "Supports images"
msgstr "Görüntüleri destekler"
@ -4605,6 +4869,10 @@ msgstr "Görüntüleri destekler"
msgid "Supports thinking"
msgstr "Düşünmeyi destekler"
#: src/components/OoAtelier.tsx
msgid "Surprise me"
msgstr ""
#: src/components/onboarding/LookPreviewCarousel.tsx
msgid "Swipe for more looks"
msgstr ""
@ -4921,7 +5189,7 @@ msgstr ""
msgid "Updating…"
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Upload"
msgstr "Yükle"
@ -4967,6 +5235,10 @@ msgstr "Doğrulanıyor…"
msgid "Video workflow"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Violet"
msgstr ""
#: src/pages/SettingsOverlay.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/composer.tsx
@ -5113,6 +5385,10 @@ msgstr ""
msgid "When a webhook fires"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "When needed"
msgstr ""
#: src/lib/onboarding-copy.ts
msgid "When should I check in with you?"
msgstr ""
@ -5133,6 +5409,10 @@ msgstr "Ne zaman kullanılır"
msgid "Where should bots run?"
msgstr "Botlar nerede çalışsın?"
#: src/components/OoAtelier.tsx
msgid "Winged"
msgstr ""
#: src/pages/shell/bot-picker.tsx
msgid "With:"
msgstr ""

View File

@ -668,6 +668,10 @@ msgstr ""
msgid "Arguments"
msgstr "参数"
#: src/components/OoAtelier.tsx
msgid "Arms"
msgstr ""
#. placeholder {0}: rule.matchValue
#: src/components/ApprovalRulesSettings.tsx
msgid "Ask before {0}"
@ -716,6 +720,10 @@ msgstr "{0}"
msgid "at {timeSelect}"
msgstr "{timeSelect}"
#: src/components/OoAtelier.tsx
msgid "Atelier"
msgstr ""
#: src/pages/shell/composer.tsx
msgid "Attach file"
msgstr "附加文件"
@ -756,10 +764,6 @@ msgstr ""
msgid "Available after the routine is saved"
msgstr "保存例行任务后可用"
#: src/pages/shell/avatar-studio-popover.tsx
msgid "Avatar Studio"
msgstr "头像工作室"
#: src/components/browser/InAppBrowser.tsx
#: src/components/CookingMode.tsx
#: src/components/onboarding/OnboardingVoiceStep.tsx
@ -781,15 +785,35 @@ msgstr ""
msgid "Base URL"
msgstr "Base URL"
#: src/components/OoAtelier.tsx
msgid "Beanie"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Bear"
msgstr ""
#: src/pages/memory-providers/SerenitySettingsForm.tsx
#: src/pages/PluginsOverlay.tsx
msgid "Bearer token"
msgstr "Bearer token"
#: src/components/OoAtelier.tsx
msgid "Bell"
msgstr ""
#: src/components/NotificationSettingsPanel.tsx
msgid "Blocked in your browser settings"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Blue"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Body"
msgstr ""
#: src/pages/shell/computer-screen.tsx
msgid "Booting live desktop…"
msgstr "正在启动实时桌面…"
@ -810,7 +834,6 @@ msgstr "Bot"
#: src/pages/IntegrationSetup.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/avatar-studio-popover.tsx
msgid "Bot"
msgstr "Bot"
@ -834,10 +857,26 @@ msgstr "默认情况下 Bot 会直接执行。只有当你想先审核某类操
msgid "Bots are working"
msgstr "Bot 正在工作"
#: src/components/OoAtelier.tsx
msgid "Bow"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Bow tie"
msgstr ""
#: src/pages/memory-providers/SerenitySettingsForm.tsx
msgid "Brain label"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Brown"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Brows"
msgstr ""
#: src/pages/PluginsOverlay.tsx
msgid "Browse MCP servers"
msgstr ""
@ -846,6 +885,14 @@ msgstr ""
msgid "Browser"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Bunny"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Bushy"
msgstr ""
#: src/pages/Shell.tsx
msgid "Busy"
msgstr ""
@ -911,6 +958,10 @@ msgstr "已取消"
msgid "Cancelled"
msgstr "已取消"
#: src/components/OoAtelier.tsx
msgid "Cat"
msgstr ""
#: src/components/UserFactEditor.tsx
msgid "Category"
msgstr ""
@ -1006,9 +1057,13 @@ msgstr "正在检查…"
msgid "Checkout has local changes. Clean it before updating."
msgstr "工作副本有本地更改。请先清理再更新。"
#: src/pages/shell/avatar-studio-popover.tsx
msgid "Choose a bot shape, color, or upload an image"
msgstr "选择机器人形状和颜色,或上传图片"
#: src/components/OoAtelier.tsx
msgid "Cheeks"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Chef's hat"
msgstr ""
#: src/pages/MessagingSettingsOverlay.tsx
msgid "Choose a bot…"
@ -1026,7 +1081,7 @@ msgstr "设置新密码"
msgid "Choose an existing folder on this computer. Git remotes are linked automatically when a repository is present."
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Choose file"
msgstr "选择文件"
@ -1034,6 +1089,10 @@ msgstr "选择文件"
msgid "Choose folder"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Choose how your Oo looks and moves"
msgstr ""
#: src/pages/ModelSettingsOverlay.tsx
msgid "Choose which connected model Rakazo uses."
msgstr "选择 Rakazo 使用的已连接模型。"
@ -1046,6 +1105,10 @@ msgstr ""
msgid "Choosing the right shape…"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Classic"
msgstr ""
#: src/pages/shell/dialogs.tsx
msgid "Clear"
msgstr "清空"
@ -1076,12 +1139,12 @@ msgstr ""
msgid "Client secret"
msgstr ""
#: src/components/OoAtelier.tsx
#: src/pages/KnowledgeSection.tsx
#: src/pages/MessagingSettingsOverlay.tsx
#: src/pages/PeerMessagesOverlay.tsx
#: src/pages/RoutineEditor.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/avatar-studio-popover.tsx
#: src/pages/WindowChrome.tsx
msgid "Close"
msgstr "关闭"
@ -1165,11 +1228,11 @@ msgstr ""
msgid "Collapse {0}"
msgstr "折叠 {0}"
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Color"
msgstr "颜色"
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Color {color}"
msgstr "颜色 {color}"
@ -1846,15 +1909,27 @@ msgstr "Cron"
msgid "Cron expression"
msgstr "Cron 表达式"
#: src/components/OoAtelier.tsx
msgid "Crown"
msgstr ""
#: src/pages/AccountSettingsOverlay.tsx
msgid "Current password"
msgstr "当前密码"
#: src/components/OoAtelier.tsx
msgid "Custom color"
msgstr ""
#: src/pages/shell/dialogs.tsx
msgid "Customer support"
msgstr "客户支持"
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/onboarding/OnboardingOoDesigner.tsx
msgid "Customize"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Customize bot avatar"
msgstr "自定义机器人头像"
@ -2056,6 +2131,10 @@ msgstr "Docker 限制对你电脑的访问,以提高安全性。使用{hostLab
msgid "Does not speak"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Dog"
msgstr ""
#: src/pages/HeuteBrief.tsx
msgid "Doing"
msgstr ""
@ -2071,10 +2150,10 @@ msgstr ""
#: src/components/ai/DelegatedTaskCard.tsx
#: src/components/CookingMode.tsx
#: src/components/media/MediaCard.tsx
#: src/components/OoAtelier.tsx
#: src/components/ThreadCard.tsx
#: src/pages/HeuteBrief.tsx
#: src/pages/ProjectSessionTimeline.tsx
#: src/pages/shell/avatar-studio-popover.tsx
msgid "Done"
msgstr "完成"
@ -2083,6 +2162,10 @@ msgstr "完成"
msgid "Done"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Dot"
msgstr ""
#. placeholder {0}: props.name
#: src/components/ArtifactFileCard.tsx
msgid "Download {0}"
@ -2120,7 +2203,7 @@ msgstr ""
msgid "Drag to reorder"
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Drag, drop, or paste an image"
msgstr "拖放或粘贴图片"
@ -2161,6 +2244,10 @@ msgstr "邮箱"
msgid "Embeddings URL"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Energy"
msgstr ""
#: src/pages/ExternalConversationSettings.tsx
msgid "Engage when... Ignore..."
msgstr ""
@ -2288,6 +2375,22 @@ msgstr ""
msgid "Extra high"
msgstr "极高"
#: src/components/OoAtelier.tsx
msgid "Extras"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Eyeliner"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Eyes"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Eyeshadow"
msgstr ""
#: src/components/UserFactEditor.tsx
msgid "Fact"
msgstr ""
@ -2345,6 +2448,10 @@ msgstr ""
msgid "Finding…"
msgstr "正在查找…"
#: src/components/OoAtelier.tsx
msgid "Fine"
msgstr ""
#. placeholder {0}: new URL(oauth.verificationUri).hostname
#: src/pages/ModelSettingsOverlay.tsx
msgid "Finish signing in at <0>{0}</0>. The final page may not load; paste its URL or code here."
@ -2371,6 +2478,14 @@ msgstr ""
msgid "Flag unexpected actions"
msgstr "标记异常操作"
#: src/components/OoAtelier.tsx
msgid "Flick"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Flower"
msgstr ""
#: src/pages/PrivacySettingsOverlay.tsx
msgid "Fonts loaded locally"
msgstr ""
@ -2395,10 +2510,22 @@ msgstr "忘记密码?"
msgid "Forward"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Freckles"
msgstr ""
#: src/pages/ModelSettingsOverlay.tsx
msgid "Free"
msgstr "免费"
#: src/components/OoAtelier.tsx
msgid "Frog"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Full"
msgstr ""
#: src/pages/WindowChrome.tsx
msgid "Fullscreen"
msgstr "全屏"
@ -2427,10 +2554,22 @@ msgstr ""
msgid "Getting ready…"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Ghost"
msgstr ""
#: src/pages/RoutineEditor.tsx
msgid "Git event"
msgstr "Git 事件"
#: src/components/OoAtelier.tsx
msgid "Glass"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Glasses"
msgstr ""
#: src/pages/ProjectSessionTimeline.tsx
msgid "Goal"
msgstr ""
@ -2445,6 +2584,14 @@ msgstr ""
msgid "Goals for this project, separate from chat messages. Conversations are below."
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Gold"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Green"
msgstr ""
#: src/components/stage/OoStage.tsx
#: src/pages/MessagingSettingsOverlay.tsx
#: src/pages/Shell.tsx
@ -2490,6 +2637,10 @@ msgstr "请先挂断,然后输入屏幕上的代码。"
msgid "Hang up, then enter the code on screen."
msgstr "请挂断,然后输入屏幕上的代码。"
#: src/components/OoAtelier.tsx
msgid "Hat"
msgstr ""
#: src/pages/RoutineEditor.tsx
msgid "header"
msgstr "请求头"
@ -2503,6 +2654,10 @@ msgstr "请求头名称"
msgid "Header value"
msgstr "请求头值"
#: src/components/OoAtelier.tsx
msgid "Headphones"
msgstr ""
#: src/components/UserProfileSettings.tsx
msgid "Health"
msgstr ""
@ -2511,6 +2666,10 @@ msgstr ""
msgid "Hear a sample"
msgstr "试听"
#: src/components/OoAtelier.tsx
msgid "Heart"
msgstr ""
#: src/lib/voice-persona-copy.ts
msgid "Here's the read…"
msgstr ""
@ -2597,7 +2756,7 @@ msgstr ""
msgid "Image model"
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Image upload area"
msgstr "图片上传区域"
@ -2671,6 +2830,10 @@ msgstr "间隔数量"
msgid "Interval unit"
msgstr "间隔单位"
#: src/components/OoAtelier.tsx
msgid "Iris"
msgstr ""
#: src/pages/MemorySettingsOverlay.tsx
#: src/pages/shell/bot-panel.tsx
msgid "Isolated"
@ -2710,6 +2873,10 @@ msgstr "知识"
msgid "Language"
msgstr "语言"
#: src/components/OoAtelier.tsx
msgid "Lashes"
msgstr ""
#: src/components/DesktopUpdates.tsx
msgid "Later"
msgstr ""
@ -2726,6 +2893,10 @@ msgstr ""
msgid "Light"
msgstr "浅色"
#: src/components/OoAtelier.tsx
msgid "Lilac"
msgstr ""
#: src/pages/shell/bot-capabilities.tsx
msgid "Limit built-in tools"
msgstr ""
@ -3031,6 +3202,10 @@ msgstr "最小化"
msgid "Minimize bots"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Mint"
msgstr ""
#: src/pages/RoutineSchedule.tsx
msgid "minute"
msgstr "分钟"
@ -3080,6 +3255,10 @@ msgstr ""
msgid "Models from server"
msgstr "来自服务器的模型"
#: src/components/OoAtelier.tsx
msgid "Monocle"
msgstr ""
#: src/pages/RoutineSchedule.tsx
msgid "Monthly"
msgstr "每月"
@ -3145,6 +3324,10 @@ msgstr "给这个群组命名"
msgid "Name this routine"
msgstr "给这个例行任务命名"
#: src/components/OoAtelier.tsx
msgid "Neck"
msgstr ""
#: src/components/stage/OoStage.tsx
msgid "Needs attention"
msgstr ""
@ -3168,6 +3351,10 @@ msgstr ""
msgid "Needs your reply"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Nerd"
msgstr ""
#: src/pages/shell/bot-panel.tsx
msgid "New bot"
msgstr "新建 Bot"
@ -3359,6 +3546,10 @@ msgstr "无触发器"
msgid "No usage data is sent to third parties"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "None"
msgstr ""
#: src/pages/ScratchpadSection.tsx
msgid "None yet"
msgstr "暂无"
@ -3555,6 +3746,10 @@ msgstr "PagerDuty 事件"
msgid "Park"
msgstr "搁置"
#: src/components/OoAtelier.tsx
msgid "Party hat"
msgstr ""
#: src/components/AskCard.tsx
#: src/pages/AccountSettingsOverlay.tsx
#: src/pages/Auth.tsx
@ -3591,6 +3786,18 @@ msgstr "粘贴你的 API 密钥"
msgid "Paused"
msgstr "已暂停"
#: src/components/OoAtelier.tsx
msgid "Paw"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Peach"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Penguin"
msgstr ""
#: src/components/UserProfileSettings.tsx
msgid "People"
msgstr ""
@ -3615,6 +3822,14 @@ msgstr ""
msgid "Pin"
msgstr "置顶"
#: src/components/OoAtelier.tsx
msgid "Pink"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Playful"
msgstr ""
#: src/pages/VoiceSettingsOverlay.tsx
msgid "Playing…"
msgstr "播放中…"
@ -3762,6 +3977,10 @@ msgstr "朗读回复"
msgid "read-only"
msgstr "只读"
#: src/components/OoAtelier.tsx
msgid "Reading glasses"
msgstr ""
#: src/lib/voice-persona-copy.ts
msgid "Reading the stack trace…"
msgstr ""
@ -3976,7 +4195,7 @@ msgstr ""
#: src/components/ComputerMaintenanceActions.tsx
#: src/components/onboarding/OnboardingOoDesigner.tsx
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Reset"
msgstr "重置"
@ -4042,14 +4261,26 @@ msgstr "撤销"
msgid "Riffing"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Robot"
msgstr ""
#: src/pages/ExternalConversationSettings.tsx
msgid "Room guidance"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Rose"
msgstr ""
#: src/pages/RoutineEditor.tsx
msgid "Rotate key"
msgstr "轮换密钥"
#: src/components/OoAtelier.tsx
msgid "Round"
msgstr ""
#: src/pages/RoutineEditor.tsx
#: src/pages/Shell.tsx
#: src/pages/shell/routine-event-line.tsx
@ -4164,6 +4395,10 @@ msgstr "回答是或否,或一句话说明。"
msgid "Scanning exposure…"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Scarf"
msgstr ""
#: src/components/onboarding/OnboardingOoDesigner.tsx
msgid "Scene"
msgstr ""
@ -4294,10 +4529,15 @@ msgstr "设置帮助"
msgid "Setup progress"
msgstr ""
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Shape"
msgstr "形状"
#. placeholder {0}: shape + 1
#: src/components/OoAtelier.tsx
msgid "Shape {0}"
msgstr ""
#: src/lib/voice-persona-copy.ts
msgid "Share what you're imagining — or tell me one thing to refine."
msgstr ""
@ -4415,6 +4655,10 @@ msgstr "Slack 消息"
msgid "Slack not enabled"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Soft"
msgstr ""
#: src/components/SoftwareUpdateSection.tsx
msgid "Software update"
msgstr "软件更新"
@ -4444,6 +4688,10 @@ msgstr "工作区默认"
msgid "Spaces"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Sparkle"
msgstr ""
#: src/pages/shell/transcript.tsx
msgid "Speak"
msgstr "朗读"
@ -4478,10 +4726,18 @@ msgstr ""
msgid "Specialist crew"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Species"
msgstr ""
#: src/lib/model-tier-label.ts
msgid "Standard"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Star"
msgstr ""
#: src/pages/Shell.tsx
msgid "Start"
msgstr ""
@ -4585,6 +4841,10 @@ msgstr ""
msgid "Stronger together — {0} specialists"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Stub"
msgstr ""
#: src/pages/shell/transcript.tsx
msgid "subagent"
msgstr "子 Agent"
@ -4597,6 +4857,10 @@ msgstr "提交"
msgid "Summary"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Sunglasses"
msgstr ""
#: src/pages/ModelSettingsOverlay.tsx
msgid "Supports images"
msgstr "支持图片"
@ -4605,6 +4869,10 @@ msgstr "支持图片"
msgid "Supports thinking"
msgstr "支持思考"
#: src/components/OoAtelier.tsx
msgid "Surprise me"
msgstr ""
#: src/components/onboarding/LookPreviewCarousel.tsx
msgid "Swipe for more looks"
msgstr ""
@ -4921,7 +5189,7 @@ msgstr ""
msgid "Updating…"
msgstr "正在更新…"
#: src/pages/shell/avatar-studio-popover.tsx
#: src/components/OoAtelier.tsx
msgid "Upload"
msgstr "上传"
@ -4967,6 +5235,10 @@ msgstr "正在校验…"
msgid "Video workflow"
msgstr ""
#: src/components/OoAtelier.tsx
msgid "Violet"
msgstr ""
#: src/pages/SettingsOverlay.tsx
#: src/pages/shell/bot-panel.tsx
#: src/pages/shell/composer.tsx
@ -5113,6 +5385,10 @@ msgstr ""
msgid "When a webhook fires"
msgstr "当 Webhook 触发时"
#: src/components/OoAtelier.tsx
msgid "When needed"
msgstr ""
#: src/lib/onboarding-copy.ts
msgid "When should I check in with you?"
msgstr ""
@ -5133,6 +5409,10 @@ msgstr "何时使用"
msgid "Where should bots run?"
msgstr "Bot 应在哪里运行?"
#: src/components/OoAtelier.tsx
msgid "Winged"
msgstr ""
#: src/pages/shell/bot-picker.tsx
msgid "With:"
msgstr ""

View File

@ -34,21 +34,9 @@ function enterMainConversation(main: MainConversationRef): string {
function defaultEmojiConfig(): OnboardingEmojiConfig {
const preset = findLookCategory("calm").looks[0];
if (!preset) {
return {
color: "#8B5CF6",
shapeIndex: 0,
accessory: "none",
pose: "idle",
avatarValue: "#8B5CF6::shape_0",
};
}
return {
color: preset.color,
shapeIndex: preset.shapeIndex,
accessory: "none",
pose: preset.pose,
avatarValue: lookPresetToAvatarValue(preset),
pose: preset?.pose ?? "idle",
avatarValue: preset ? lookPresetToAvatarValue(preset) : "oo1:c=8B5CF6",
};
}

View File

@ -1,289 +0,0 @@
import { t } from "@lingui/core/macro";
import { Trans } from "@lingui/react/macro";
import { OO_DEFAULT_COLOR, OO_PALETTE_HEXES } from "@rakazo/core";
import {
BotAvatar,
Dialog,
DialogContent,
DialogDescription,
DialogFooter,
DialogHeader,
DialogTitle,
OoShapePreview,
parseBotAvatar,
} from "@rakazo/ui-web";
import { Check, Pencil, Upload, X } from "lucide-react";
import { type ClipboardEvent, type DragEvent, useRef, useState } from "react";
export interface AvatarStudioPopoverProps {
value: string;
identity?: string;
status?: string;
size?: number;
onChange: (value: string) => void;
disabled?: boolean;
}
export function AvatarStudioPopover({
value,
identity,
status,
size = 72,
onChange,
disabled = false,
}: AvatarStudioPopoverProps) {
const [open, setOpen] = useState(false);
const [activeTab, setActiveTab] = useState<"bot" | "upload">("bot");
const [dragOver, setDragOver] = useState(false);
const fileInputRef = useRef<HTMLInputElement>(null);
const parsed = parseBotAvatar(value, identity);
const currentColor = parsed.color || OO_DEFAULT_COLOR;
const currentShape = parsed.shapeIndex ?? 0;
function selectShape(shapeIndex: number) {
onChange(`${currentColor}::shape_${shapeIndex}`);
}
function selectColor(color: string) {
onChange(`${color}::shape_${currentShape}`);
}
function resetAvatar() {
onChange(`${OO_DEFAULT_COLOR}::shape_0`);
}
function processImageFile(file: File) {
if (!file.type.startsWith("image/")) return;
const reader = new FileReader();
reader.onload = (event) => {
const src = event.target?.result as string;
if (!src) return;
const img = new Image();
img.onload = () => {
const canvas = document.createElement("canvas");
const ctx = canvas.getContext("2d");
const targetSize = 256;
canvas.width = targetSize;
canvas.height = targetSize;
if (!ctx) return;
ctx.beginPath();
ctx.arc(targetSize / 2, targetSize / 2, targetSize / 2, 0, Math.PI * 2);
ctx.clip();
const minDim = Math.min(img.width, img.height);
const sx = (img.width - minDim) / 2;
const sy = (img.height - minDim) / 2;
ctx.drawImage(img, sx, sy, minDim, minDim, 0, 0, targetSize, targetSize);
onChange(canvas.toDataURL("image/webp", 0.9));
setOpen(false);
};
img.src = src;
};
reader.readAsDataURL(file);
}
function handleDrop(event: DragEvent<HTMLButtonElement>) {
event.preventDefault();
setDragOver(false);
const file = event.dataTransfer.files?.[0];
if (file) processImageFile(file);
}
function handlePaste(event: ClipboardEvent<HTMLButtonElement>) {
const items = event.clipboardData?.items;
if (!items) return;
for (let index = 0; index < items.length; index += 1) {
const item = items[index];
if (!item?.type.startsWith("image/")) continue;
const file = item.getAsFile();
if (file) {
processImageFile(file);
break;
}
}
}
return (
<>
<button
type="button"
disabled={disabled}
onClick={() => setOpen(true)}
className="group relative cursor-pointer rounded-2xl outline-none transition-transform hover:scale-[1.03] focus-visible:ring-2 focus-visible:ring-ring"
aria-label={t`Customize bot avatar`}
data-testid="avatar-studio-trigger"
>
<BotAvatar color={value} identity={identity} size={size} status={status} />
<div className="absolute -right-1 -bottom-1 flex size-6 items-center justify-center rounded-full border-2 border-background bg-secondary text-foreground shadow-md transition-transform group-hover:scale-110">
<Pencil strokeWidth={2.2} className="size-icon-sm" />
</div>
</button>
<Dialog open={open} onOpenChange={setOpen}>
<DialogContent
showCloseButton={false}
className="w-[360px] max-w-full gap-4 rounded-3xl p-5 sm:max-w-[360px]"
data-testid="avatar-studio"
>
<DialogHeader className="flex-row items-center justify-between space-y-0">
<DialogTitle className="text-ui-body font-semibold tracking-tight">
<Trans>Avatar Studio</Trans>
</DialogTitle>
<DialogDescription className="sr-only">
<Trans>Choose a bot shape, color, or upload an image</Trans>
</DialogDescription>
<button
type="button"
onClick={() => setOpen(false)}
className="flex size-7 items-center justify-center rounded-full text-muted-foreground transition-colors hover:bg-muted hover:text-foreground"
aria-label={t`Close`}
>
<X className="size-icon-md" />
</button>
</DialogHeader>
<div className="flex flex-col items-center justify-center py-2">
<BotAvatar color={value} identity={identity} size={78} status={status} />
</div>
<div className="flex items-center justify-between border-b border-border pb-1">
<div className="flex items-center rounded-full bg-muted p-1 text-ui-label">
<button
type="button"
onClick={() => setActiveTab("bot")}
aria-pressed={activeTab === "bot"}
className={`rounded-full px-3 py-1 font-medium transition-colors ${
activeTab === "bot"
? "bg-card text-foreground shadow-sm"
: "text-muted-foreground hover:text-foreground"
}`}
>
<Trans>Bot</Trans>
</button>
<button
type="button"
onClick={() => setActiveTab("upload")}
aria-pressed={activeTab === "upload"}
className={`rounded-full px-3 py-1 font-medium transition-colors ${
activeTab === "upload"
? "bg-card text-foreground shadow-sm"
: "text-muted-foreground hover:text-foreground"
}`}
>
<Trans>Upload</Trans>
</button>
</div>
<button
type="button"
onClick={resetAvatar}
className="px-2 py-1 text-ui-label font-medium text-muted-foreground transition-colors hover:text-foreground"
>
<Trans>Reset</Trans>
</button>
</div>
{activeTab === "bot" ? (
<div className="space-y-4 pt-1" data-testid="avatar-studio-bot-tab">
<div>
<div className="mb-2 text-ui-label font-medium tracking-wider text-muted-foreground uppercase">
<Trans>Shape</Trans>
</div>
<div className="grid grid-cols-4 place-items-center gap-2">
{[0, 1, 2, 3, 4, 5, 6, 7].map((shapeIndex) => (
<OoShapePreview
key={shapeIndex}
shapeIndex={shapeIndex}
color={currentColor}
selected={!parsed.isImage && currentShape === shapeIndex}
onClick={() => selectShape(shapeIndex)}
/>
))}
</div>
</div>
<div className="border-t border-border pt-2">
<div className="mb-2 text-ui-label font-medium tracking-wider text-muted-foreground uppercase">
<Trans>Color</Trans>
</div>
<div className="grid grid-cols-6 place-items-center gap-2">
{OO_PALETTE_HEXES.map((color) => {
const selected =
currentColor.toLowerCase() === color.toLowerCase() && !parsed.isImage;
return (
<button
key={color}
type="button"
onClick={() => selectColor(color)}
aria-label={t`Color ${color}`}
aria-pressed={selected}
className={`size-6 rounded-full border transition-transform hover:scale-110 active:scale-95 focus-visible:ring-2 focus-visible:ring-ring ${
selected
? "scale-105 border-transparent ring-2 ring-foreground ring-offset-2 ring-offset-popover"
: "border-border"
}`}
style={{ backgroundColor: color }}
/>
);
})}
</div>
</div>
</div>
) : (
<button
type="button"
aria-label={t`Image upload area`}
onDragOver={(event) => {
event.preventDefault();
setDragOver(true);
}}
onDragLeave={() => setDragOver(false)}
onDrop={handleDrop}
onPaste={handlePaste}
onClick={() => fileInputRef.current?.click()}
className={`flex w-full flex-col items-center justify-center rounded-xl border border-dashed p-6 text-center transition-colors ${
dragOver
? "border-primary bg-primary/10"
: "border-border bg-muted hover:border-foreground/30"
}`}
>
<input
ref={fileInputRef}
type="file"
accept="image/*"
className="hidden"
onChange={(event) => {
const file = event.target.files?.[0];
if (file) processImageFile(file);
}}
/>
<div className="mb-2 grid size-10 place-items-center rounded-full bg-secondary text-muted-foreground">
<Upload strokeWidth={1.8} className="size-icon-lg" />
</div>
<p className="text-ui-body-sm font-medium text-muted-foreground">
<Trans>Drag, drop, or paste an image</Trans>
</p>
<span className="mt-3 rounded-lg bg-secondary px-3 py-1.5 text-ui-label font-medium text-foreground">
<Trans>Choose file</Trans>
</span>
</button>
)}
<DialogFooter className="border-border sm:justify-end">
<button
type="button"
onClick={() => setOpen(false)}
className="flex items-center gap-1.5 rounded-xl bg-secondary px-4 py-1.5 text-ui-body-sm font-medium text-foreground transition-colors hover:bg-accent"
>
<Check className="size-icon-md" />
<Trans>Done</Trans>
</button>
</DialogFooter>
</DialogContent>
</Dialog>
</>
);
}

View File

@ -32,11 +32,11 @@ import {
} from "@rakazo/ui-web";
import { Upload, X } from "lucide-react";
import { Suspense, useEffect, useId, useRef, useState } from "react";
import { OoAtelier } from "../../components/OoAtelier";
import { connectedModelOptions } from "../../lib/connected-models";
import { lazyWithRecovery } from "../../lib/lazy-recovery";
import { modelTierLabel } from "../../lib/model-tier-label";
import { rpc } from "../../lib/rpc";
import { AvatarStudioPopover } from "./avatar-studio-popover";
import { BotCapabilitiesFields } from "./bot-capabilities";
const ScratchpadSection = lazyWithRecovery("ScratchpadSection", () =>
@ -470,7 +470,7 @@ export function BotSettings({
return (
<div data-testid="bot-settings">
<div className="flex justify-center py-4">
<AvatarStudioPopover
<OoAtelier
value={color}
identity={bot.id}
status={bot.status}

View File

@ -3,6 +3,21 @@
* every avatar renderer. Bots without an explicit colour or shape get one from a hash
* of their identity, so they look the same on web and mobile.
*/
import type { OoAvatar } from "./oo-avatar.js";
import {
DEFAULT_OO_AVATAR,
decodeOoAvatar,
OO_CHEEKS,
OO_CLASSIC_SHAPE_COUNT,
OO_EYESHADOWS,
OO_EYEWEAR,
OO_HEADWEAR,
OO_IRISES,
OO_LASHES,
OO_NECKWEAR,
OO_SPARKLES,
OO_SPECIES,
} from "./oo-avatar.js";
export const OO_CLASSIC_SHAPES: Record<string, string> = {
blob: "M228.541 114.228C228.541 130.133 225.184 145.994 218.738 160.534C212.674 174.217 203.904 186.669 193.065 196.988C155.933 232.34 99.497 238.596 55.5255 212.24C45.097 205.99 35.6851 198.072 27.7451 188.866C19.1926 178.953 12.3686 167.569 7.65781 155.351C2.60712 142.264 0 128.257 0 114.228C0 98.3219 3.35751 82.4611 9.80315 67.9215C15.8672 54.2382 24.6377 41.7862 35.4767 31.4668C72.6081 -3.88483 129.044 -10.1413 173.016 16.2153C183.444 22.4653 192.856 30.3829 200.796 39.5896C209.349 49.5018 216.173 60.8859 220.883 73.1037C225.934 86.1906 228.541 100.198 228.541 114.228Z",
@ -231,3 +246,41 @@ function darkenHex(hex: string, percent: number): string {
const b = Math.max(0, Math.floor((num & 255) * factor));
return `#${((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1)}`;
}
/** The look an avatar value shows, with a plain hex colour, ready to edit and re-encode. */
export function ooLookForEditing(value: string, identity: string): OoAvatar {
const look = decodeOoAvatar(value) ?? DEFAULT_OO_AVATAR;
return { ...look, color: resolveOoColor(identity, look.color || null).hex };
}
function pick<T>(values: readonly T[], random: () => number): T {
return values[Math.floor(random() * values.length) % values.length] as T;
}
/** Half the time an optional extra stays off, so random looks are not overloaded. */
function maybe<T>(values: readonly T[], random: () => number): T {
return random() < 0.5 ? (values[0] as T) : pick(values.slice(1), random);
}
/** A random but tidy look for “surprise me”. */
export function ooRandomAvatar(random: () => number = Math.random): OoAvatar {
const species = pick(OO_SPECIES, random);
return {
species,
color: pick(OO_PALETTE_HEXES, random),
shape: species === "classic" ? Math.floor(random() * OO_CLASSIC_SHAPE_COUNT) : null,
arms: species === "robot" ? "robot" : pick(["glass", "stub", "paw"] as const, random),
lashes: maybe(OO_LASHES, random),
liner: random() < 0.2 ? "wing" : "none",
eyeshadow: random() < 0.25 ? pick(OO_EYESHADOWS.slice(1), random) : "none",
iris: maybe(OO_IRISES, random),
sparkle: pick(OO_SPARKLES, random),
brows: "auto",
cheeks: maybe(OO_CHEEKS, random),
eyewear: random() < 0.35 ? pick(OO_EYEWEAR.slice(1), random) : "none",
head: random() < 0.35 ? pick(OO_HEADWEAR.slice(1), random) : "none",
neck: random() < 0.25 ? pick(OO_NECKWEAR.slice(1), random) : "none",
energy: Number((0.7 + random() * 0.7).toFixed(2)),
playful: Number(random().toFixed(2)),
};
}

View File

@ -2,6 +2,8 @@ import { describe, expect, it } from "vitest";
import type { OoAvatar } from "./oo-avatar.js";
import {
DEFAULT_OO_AVATAR,
decodeOoAvatar,
encodeOoAvatar,
OO_EYE_ASYMMETRY_MIN_RATIO,
OO_EYEWEAR,
OO_RIG_EYES,
@ -18,6 +20,8 @@ import {
OO_DEFAULT_COLOR,
OO_PALETTE_HEXES,
ooIdentityShapeIndex,
ooLookForEditing,
ooRandomAvatar,
resolveOoClassicShape,
resolveOoColor,
} from "./oo-palette.js";
@ -218,3 +222,22 @@ describe("oo moments after a status change", () => {
expect(ooMomentAfterStatus(undefined, "idle")).toBeNull();
});
});
describe("oo atelier helpers", () => {
it("edits legacy values with a hex colour", () => {
expect(ooLookForEditing("violet", "bot").color).toBe(resolveOoColor("bot", "violet").hex);
expect(ooLookForEditing("#8B5CF6::shape_2", "bot")).toMatchObject({
color: "#8B5CF6",
shape: 2,
});
expect(ooLookForEditing("data:image/png;base64,AAAA", "bot").species).toBe("classic");
});
it("surprises with looks that always encode", () => {
const random = ooSeededRandom(5);
for (let i = 0; i < 50; i++) {
const look = ooRandomAvatar(random);
expect(decodeOoAvatar(encodeOoAvatar(look))).not.toBeNull();
}
});
});

View File

@ -26,12 +26,16 @@ export interface OoFigureProps {
still?: boolean;
/** Eyes follow the pointer and a tap boops the Oo. */
interactive?: boolean;
/** `face` crops to the eyes, for pickers of eye styles and eyewear. */
focus?: "body" | "face";
className?: string;
}
/** The body fills the avatar box; ears, hats and effects may reach past it. */
const OO_VIEWBOX = `${OO_RIG_INSET} ${OO_RIG_INSET + 4} ${OO_RIG_SIZE - 2 * OO_RIG_INSET} ${OO_RIG_SIZE - 2 * OO_RIG_INSET}`;
const OO_FACE_VIEWBOX = "47 62 112 112";
/** Above this size an Oo always moves; smaller ones only for list moments. */
const LIVELY_SIZE = 56;
@ -208,6 +212,7 @@ export function OoFigure({
size,
still = false,
interactive = false,
focus = "body",
className,
}: OoFigureProps) {
const gradient = `oo${useId().replace(/[^a-zA-Z0-9-_]/g, "")}`;
@ -289,14 +294,14 @@ export function OoFigure({
return (
<svg
ref={svgRef}
viewBox={OO_VIEWBOX}
viewBox={focus === "face" ? OO_FACE_VIEWBOX : OO_VIEWBOX}
width={size}
height={size}
aria-hidden="true"
className={className}
data-oo-species={avatar.species}
data-oo-moment={moment}
overflow="visible"
overflow={focus === "face" ? "hidden" : "visible"}
{...pointerHandlers}
>
<defs>