Studio: reorder sidebar, rename Hub to Models (#7327)

* Studio: put Hub above Projects in the sidebar

Swap the two nav rows so Hub sits directly under New Chat, ahead of
Projects. Order only, no behavior change.

* Studio: rename Hub to Models, lowercase New chat

Rename the Hub nav row and its page heading to Models (localized in all
locales). Use sentence case 'New chat' in the English label.

* Studio: fix dataset title and stale Hub tab hints after rename

Show 'Datasets' as the catalog heading in dataset mode, not 'Models'.
Update the download-conflict toasts to point at the Models tab.
This commit is contained in:
Michael Han 2026-07-22 06:34:02 -07:00 committed by GitHub
commit fdf2df4edf
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
14 changed files with 29 additions and 29 deletions

View file

@ -1357,6 +1357,18 @@ export function AppSidebar() {
<SidebarGroup className="group-data-[collapsible=icon]:px-0 pl-1.5 pr-2 py-0 shrink-0">
<SidebarGroupContent>
<SidebarMenu>
<NavItem
icon={DashboardCircleIcon}
label={t("shell.navigation.hub")}
active={pathname === "/hub" || pathname.startsWith("/hub/")}
onClick={() => {
navigate({ to: "/hub" });
closeMobileIfOpen();
}}
onIntent={() => {
preloadSilently(router.preloadRoute({ to: "/hub" }));
}}
/>
<NavItem
icon={Folder01Icon}
label="Projects"
@ -1392,18 +1404,6 @@ export function AppSidebar() {
</span>
</button>
</NavItem>
<NavItem
icon={DashboardCircleIcon}
label={t("shell.navigation.hub")}
active={pathname === "/hub" || pathname.startsWith("/hub/")}
onClick={() => {
navigate({ to: "/hub" });
closeMobileIfOpen();
}}
onIntent={() => {
preloadSilently(router.preloadRoute({ to: "/hub" }));
}}
/>
{/* Train has a labelled section when expanded; plain icon here only when collapsed. */}
<NavItem
icon={TestTubeOutlineIcon}

View file

@ -2268,9 +2268,9 @@ export function ChatPage({
"It'll be ready to load once the current model finishes.",
});
} else if (outcome === "conflict") {
toast.info("Resume this download from the Hub", {
toast.info("Resume this download from Models", {
description:
"An earlier partial download used a different transport. Open the Hub tab to resume or restart it.",
"An earlier partial download used a different transport. Open the Models tab to resume or restart it.",
});
} else if (outcome === "busy") {
toast.info("Download already in progress", {
@ -2389,9 +2389,9 @@ export function ChatPage({
// the conflict just recorded by requestStart (which the toast points the
// user to); resolving it from the Hub completes the download and this
// surface's onComplete auto-loads, mirroring the "started" branch.
toast.info("Resume this download from the Hub", {
toast.info("Resume this download from Models", {
description:
"An earlier partial download used a different transport. Open the Hub tab to resume or restart it.",
"An earlier partial download used a different transport. Open the Models tab to resume or restart it.",
});
return;
}

View file

@ -64,7 +64,7 @@ export function ModelsHeader({
return (
<header className="font-heading flex flex-col gap-3 sm:flex-row sm:flex-wrap sm:items-center sm:justify-between">
<PageHeading
title="Hub"
title={isDataset ? "Datasets" : "Models"}
onTitleClick={onTitleClick}
subtitle={
isDataset

View file

@ -39,7 +39,7 @@ export const ar = {
returnToChat: "العودة إلى المحادثة",
compare: "مقارنة",
search: "بحث",
hub: "Hub",
hub: "النماذج",
train: "تدريب",
recipes: "الوصفات",
export: "تصدير",

View file

@ -39,7 +39,7 @@ export const de = {
returnToChat: "Zurück zum Chat",
compare: "Vergleichen",
search: "Suchen",
hub: "Hub",
hub: "Modelle",
train: "Trainieren",
recipes: "Rezepte",
export: "Exportieren",

View file

@ -32,11 +32,11 @@ export const en = {
runOptions: "Run options",
},
navigation: {
newChat: "New Chat",
newChat: "New chat",
returnToChat: "Return to Chat",
compare: "Compare",
search: "Search",
hub: "Hub",
hub: "Models",
train: "Train",
recipes: "Recipes",
export: "Export",

View file

@ -39,7 +39,7 @@ export const es = {
returnToChat: "Volver al chat",
compare: "Comparar",
search: "Buscar",
hub: "Hub",
hub: "Modelos",
train: "Entrenar",
recipes: "Recetas",
export: "Exportar",

View file

@ -39,7 +39,7 @@ export const fr = {
returnToChat: "Retour à la discussion",
compare: "Comparer",
search: "Rechercher",
hub: "Hub",
hub: "Modèles",
train: "Entraîner",
recipes: "Recettes",
export: "Exporter",

View file

@ -39,7 +39,7 @@ export const hi = {
returnToChat: "चैट पर लौटें",
compare: "तुलना करें",
search: "खोजें",
hub: "Hub",
hub: "मॉडल",
train: "ट्रेनिंग",
recipes: "रेसिपी",
export: "एक्सपोर्ट",

View file

@ -40,7 +40,7 @@ export const ja = {
returnToChat: "チャットに戻る",
compare: "比較",
search: "検索",
hub: "ハブ",
hub: "モデル",
train: "トレーニング",
recipes: "レシピ",
export: "エクスポート",

View file

@ -39,7 +39,7 @@ export const ko = {
returnToChat: "채팅으로 돌아가기",
compare: "비교",
search: "검색",
hub: "Hub",
hub: "모델",
train: "학습",
recipes: "레시피",
export: "내보내기",

View file

@ -39,7 +39,7 @@ export const ptBR = {
returnToChat: "Retornar ao Chat",
compare: "Comparar",
search: "Buscar",
hub: "Hub",
hub: "Modelos",
train: "Treinar",
recipes: "Receitas",
export: "Exportar",

View file

@ -39,7 +39,7 @@ export const ru = {
returnToChat: "Вернуться к чату",
compare: "Сравнить",
search: "Поиск",
hub: "Hub",
hub: "Модели",
train: "Обучение",
recipes: "Рецепты",
export: "Экспорт",

View file

@ -39,7 +39,7 @@ export const zhCN = {
returnToChat: "返回聊天",
compare: "对比",
search: "搜索",
hub: "Hub",
hub: "模型",
train: "训练",
recipes: "配方",
export: "导出",