Skip to content

Commit b9ae2c8

Browse files
committed
feat(sidebar): make footer footer a home affordance
1 parent 7ea8971 commit b9ae2c8

1 file changed

Lines changed: 82 additions & 12 deletions

File tree

apps/web/src/components/Sidebar.tsx

Lines changed: 82 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1584,6 +1584,62 @@ export default function Sidebar() {
15841584
const newThreadShortcutLabel =
15851585
shortcutLabelForCommand(keybindings, "chat.newLocal") ??
15861586
shortcutLabelForCommand(keybindings, "chat.new");
1587+
const isOnHomeRoute = pathname === "/";
1588+
const brandFooterStatus = serverUpdateInfo?.updateAvailable
1589+
? {
1590+
detail: `v${serverUpdateInfo.latestVersion} available`,
1591+
label: "Update",
1592+
pillStyle: {
1593+
backgroundColor: "color-mix(in srgb, var(--warning) 16%, transparent)",
1594+
color: "var(--warning-foreground)",
1595+
} as const,
1596+
surfaceStyle: {
1597+
backgroundColor: "color-mix(in srgb, var(--warning) 10%, transparent)",
1598+
borderColor: "color-mix(in srgb, var(--warning) 22%, var(--border))",
1599+
} as const,
1600+
}
1601+
: desktopUpdateState?.status === "downloaded"
1602+
? {
1603+
detail: "Ready to install",
1604+
label: "Install",
1605+
pillStyle: {
1606+
backgroundColor: "color-mix(in srgb, var(--success) 16%, transparent)",
1607+
color: "var(--success-foreground)",
1608+
} as const,
1609+
surfaceStyle: {
1610+
backgroundColor: "color-mix(in srgb, var(--success) 10%, transparent)",
1611+
borderColor: "color-mix(in srgb, var(--success) 20%, var(--border))",
1612+
} as const,
1613+
}
1614+
: desktopUpdateState?.status === "downloading"
1615+
? {
1616+
detail: "Update downloading",
1617+
label: "Syncing",
1618+
pillStyle: {
1619+
backgroundColor: "color-mix(in srgb, var(--info) 16%, transparent)",
1620+
color: "var(--info-foreground)",
1621+
} as const,
1622+
surfaceStyle: {
1623+
backgroundColor: "color-mix(in srgb, var(--info) 10%, transparent)",
1624+
borderColor: "color-mix(in srgb, var(--info) 20%, var(--border))",
1625+
} as const,
1626+
}
1627+
: {
1628+
detail: isOnHomeRoute ? "Workspace home" : "Open workspace home",
1629+
label: isOnHomeRoute ? "Home" : "Ready",
1630+
pillStyle: {
1631+
backgroundColor: "color-mix(in srgb, var(--primary) 16%, transparent)",
1632+
color: "var(--primary)",
1633+
} as const,
1634+
surfaceStyle: {
1635+
backgroundColor: isOnHomeRoute
1636+
? "color-mix(in srgb, var(--primary) 14%, transparent)"
1637+
: "color-mix(in srgb, var(--primary) 10%, transparent)",
1638+
borderColor: isOnHomeRoute
1639+
? "color-mix(in srgb, var(--primary) 26%, var(--border))"
1640+
: "color-mix(in srgb, var(--primary) 18%, var(--border))",
1641+
} as const,
1642+
};
15871643

15881644
const handleDesktopUpdateButtonClick = useCallback(() => {
15891645
const bridge = window.desktopBridge;
@@ -2122,16 +2178,16 @@ export default function Sidebar() {
21222178
<Tooltip>
21232179
<TooltipTrigger
21242180
render={
2125-
<div
2126-
className="mt-2 rounded-xl border px-3 py-2 shadow-sm transition-colors"
2127-
style={{
2128-
backgroundColor: "color-mix(in srgb, var(--primary) 10%, transparent)",
2129-
borderColor: "color-mix(in srgb, var(--primary) 18%, var(--border))",
2130-
}}
2181+
<button
2182+
type="button"
2183+
aria-label={isOnHomeRoute ? `${APP_BASE_NAME} home` : `Open ${APP_BASE_NAME} home`}
2184+
className="group mt-2 flex w-full rounded-xl border px-3 py-2 text-left shadow-sm transition-[transform,background-color,border-color,box-shadow] hover:-translate-y-0.5 hover:shadow-md active:translate-y-0"
2185+
onClick={() => void navigate({ replace: isOnHomeRoute, to: "/" })}
2186+
style={brandFooterStatus.surfaceStyle}
21312187
>
2132-
<div className="flex items-center gap-2">
2188+
<div className="flex w-full items-center gap-2">
21332189
<div
2134-
className="flex size-7 items-center justify-center rounded-lg"
2190+
className="flex size-7 shrink-0 items-center justify-center rounded-lg transition-transform group-hover:scale-[1.04]"
21352191
style={{
21362192
backgroundColor: "color-mix(in srgb, var(--primary) 18%, transparent)",
21372193
color: "var(--primary)",
@@ -2144,16 +2200,30 @@ export default function Sidebar() {
21442200
<span className="truncate text-sm font-semibold tracking-tight text-foreground">
21452201
{APP_BASE_NAME}
21462202
</span>
2147-
<span className="text-[10px] font-medium uppercase tracking-[0.22em] text-primary/80">
2148-
Version {APP_VERSION}
2203+
<span className="text-[10px] font-medium uppercase tracking-[0.22em] text-muted-foreground/80">
2204+
{brandFooterStatus.detail}
2205+
</span>
2206+
</div>
2207+
<div className="ml-auto flex shrink-0 flex-col items-end gap-1">
2208+
<span
2209+
className="inline-flex items-center gap-1 rounded-full px-2 py-1 text-[10px] font-semibold uppercase tracking-[0.18em]"
2210+
style={brandFooterStatus.pillStyle}
2211+
>
2212+
<CircleDotIcon className="size-2.5" />
2213+
{brandFooterStatus.label}
2214+
</span>
2215+
<span className="text-[10px] font-medium tracking-wide text-muted-foreground/80">
2216+
v{APP_VERSION}
21492217
</span>
21502218
</div>
21512219
</div>
2152-
</div>
2220+
</button>
21532221
}
21542222
/>
21552223
<TooltipPopup side="top" sideOffset={4}>
2156-
{APP_BASE_NAME} {APP_VERSION}
2224+
{isOnHomeRoute
2225+
? `${APP_BASE_NAME} home • v${APP_VERSION}`
2226+
: `Open ${APP_BASE_NAME} home • v${APP_VERSION}`}
21572227
</TooltipPopup>
21582228
</Tooltip>
21592229
</SidebarFooter>

0 commit comments

Comments
 (0)