Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
485 changes: 485 additions & 0 deletions docs/mobile-navigation-plan.md

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions frontend/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@
/>
</head>
<body>
<div id="maple-native-ios-safe-area-boundary" aria-hidden="true"></div>
<div id="root" class="h-full"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
Expand Down
23 changes: 18 additions & 5 deletions frontend/src/components/AccountMenu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,11 @@ import { CreditUsage } from "@/components/CreditUsage";
import { useCompactSettingsLayout } from "@/components/settings/useCompactSettingsLayout";
import { useBillingState } from "@/state/useLocalState";
import type { TeamStatus } from "@/types/team";
import { SETTINGS_HOME_PARENT_STATE_KEY } from "@/utils/settingsNavigation";
import { getTeamSeatMismatch } from "@/utils/teamSeats";
import { cn } from "@/utils/utils";

export function AccountMenu() {
export function AccountMenu({ pagePresentation = false }: { pagePresentation?: boolean }) {
const os = useOpenSecret();
const { billingStatus, setBillingStatus } = useBillingState();
const isCompactSettingsLayout = useCompactSettingsLayout();
Expand Down Expand Up @@ -45,11 +47,19 @@ export function AccountMenu() {
<div className="flex w-full max-w-full items-end gap-2">
<Link
to={isCompactSettingsLayout ? "/settings" : "/settings/account"}
state={
isCompactSettingsLayout && pagePresentation
? (previous) => ({ ...previous, [SETTINGS_HOME_PARENT_STATE_KEY]: true })
: undefined
}
aria-label={attentionLabel ? `Open settings, ${attentionLabel}` : "Open settings"}
title="Settings"
className="relative flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-[hsl(var(--sidebar-chrome))] text-[hsl(var(--on-sidebar-chrome))] shadow-none ring-0 transition-colors hover:bg-[hsl(var(--sidebar-chrome-hover))] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
className={cn(
"relative flex shrink-0 items-center justify-center rounded-full bg-[hsl(var(--sidebar-chrome))] text-[hsl(var(--on-sidebar-chrome))] shadow-none ring-0 transition-colors hover:bg-[hsl(var(--sidebar-chrome-hover))] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
pagePresentation ? "h-11 w-11" : "h-9 w-9"
)}
>
<Settings className="h-4 w-4" />
<Settings className={pagePresentation ? "h-5 w-5" : "h-4 w-4"} />
{(teamSeatMismatch || needsTeamSetup) && (
<AlertCircle
className={`absolute -right-1 -top-1 h-4 w-4 rounded-full bg-background ${
Expand All @@ -60,10 +70,13 @@ export function AccountMenu() {
</Link>
<Link
to="/pricing"
className="group/credit-link min-w-0 flex-1 rounded-xl outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"
className={cn(
"group/credit-link min-w-0 flex-1 rounded-xl outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
pagePresentation && "flex min-h-11"
)}
aria-label={billingStatus ? `${billingStatus.product_name} plan` : "Billing status"}
>
<CreditUsage />
<CreditUsage pagePresentation={pagePresentation} />
</Link>
</div>
);
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/components/AgentMode.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2743,7 +2743,7 @@ export function AgentMode({ userId }: { userId: string }) {

if (!isTauriDesktop()) {
return (
<div className="flex h-dvh items-center justify-center bg-background p-6 text-center">
<div className="maple-native-ios-agent-safe-page flex h-dvh items-center justify-center bg-background p-6 text-center">
<div className="max-w-sm space-y-3">
<MapleWordmark className="mx-auto h-4 w-auto" />
<p className="text-sm text-muted-foreground">Agent Mode is available in Maple Desktop.</p>
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/components/AppEntryPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { Button } from "@/components/ui/button";

export function AppEntryPage() {
return (
<div className="flex min-h-dvh flex-col bg-[#e2e2e2] text-[#221a18] dark:bg-background dark:text-foreground">
<div className="maple-native-ios-static-safe-page flex min-h-dvh flex-col bg-[#e2e2e2] text-[#221a18] dark:bg-background dark:text-foreground">
<AuthHeader />

<main className="flex flex-1 items-center justify-center px-4 pb-16 pt-8 sm:px-6">
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/components/AuthMain.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ type AuthMainProps = {

export function AuthMain({ children, title, description }: AuthMainProps) {
return (
<div className="flex min-h-dvh flex-col bg-[#e2e2e2] text-[#221a18] dark:bg-background dark:text-foreground">
<div className="maple-native-ios-static-safe-page flex min-h-dvh flex-col bg-[#e2e2e2] text-[#221a18] dark:bg-background dark:text-foreground">
<AuthHeader />

<main className="flex flex-1 items-center justify-center px-4 py-10 sm:px-6">
Expand Down
15 changes: 14 additions & 1 deletion frontend/src/components/AuthenticatedHomeContent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,13 @@ import { useLocation, useRouter } from "@tanstack/react-router";
import { useOpenSecret } from "@opensecret/react";
import { ProjectDetailView } from "@/components/ProjectDetailView";
import { UnifiedChat } from "@/components/UnifiedChat";
import { MobileNavigationStack } from "@/components/MobileNavigationStack";
import {
PersistentHomeNavigationContext,
useAccountSidebarOpenState
} from "@/contexts/PersistentHomeNavigationContext";
import { AgentSessionSelectionMemory } from "@/services/agentSessionSelection";
import { useIsLandscapeMobile, useIsMobile } from "@/utils/utils";

const TRANSIENT_HOME_SEARCH_PARAMS = ["team_setup", "credits_success", "api_settings"];

Expand Down Expand Up @@ -138,10 +140,15 @@ export function PersistentHomeNavigationProvider({ children }: { children: React
}

export function AuthenticatedHomeContent({
homeLocationHref
homeLocationHref,
suspendChats = false
}: {
homeLocationHref: string | null;
suspendChats?: boolean;
}) {
const isMobile = useIsMobile();
const isLandscapeMobile = useIsLandscapeMobile();
const isCompactLayout = isMobile || isLandscapeMobile;
const [selection, setSelection] = useState<HomeSelection>(readHomeSelection);

const syncFromHomeLocation = useCallback(() => {
Expand Down Expand Up @@ -176,6 +183,12 @@ export function AuthenticatedHomeContent({
};
}, [syncFromHomeLocation]);

if (isCompactLayout) {
return (
<MobileNavigationStack homeLocationHref={homeLocationHref} suspendChats={suspendChats} />
);
}

if (selection.projectId && !selection.hasConversationId) {
return <ProjectDetailView projectId={selection.projectId} />;
}
Expand Down
Loading
Loading