diff --git a/panel/src/app/(tg)/layout.tsx b/panel/src/app/(tg)/layout.tsx index f746a6e0..0d22e395 100644 --- a/panel/src/app/(tg)/layout.tsx +++ b/panel/src/app/(tg)/layout.tsx @@ -1,6 +1,17 @@ +import type { Viewport } from "next"; import Script from "next/script"; import localFont from "next/font/local"; +// Scoped to the (tg) group: viewport-fit=cover is what makes the +// env(safe-area-inset-*) paddings below resolve to real values on notched +// phones. The dashboard shell has no safe-area handling, so it must NOT +// inherit cover (content would sit under the sensor housing in landscape). +export const viewport: Viewport = { + width: "device-width", + initialScale: 1, + viewportFit: "cover", +}; + // The brand display face — the same vendored Share Tech Mono the motion/ // video compositions use for their headline moments. Exposed as a CSS // variable on the shell so `.tg-display` (globals.css) can reach it; body @@ -45,7 +56,7 @@ export default function TelegramLayout({ src="https://telegram.org/js/telegram-web-app.js" strategy="afterInteractive" /> -
+
{children}
diff --git a/panel/src/app/(tg)/tg/page.tsx b/panel/src/app/(tg)/tg/page.tsx index 1692905b..09749c27 100644 --- a/panel/src/app/(tg)/tg/page.tsx +++ b/panel/src/app/(tg)/tg/page.tsx @@ -187,7 +187,7 @@ function CockpitShell() { aria-label={unread > 0 ? `Inbox, ${unread} unread` : "Inbox"} onClick={() => setInboxOpen(true)} className={cn( - "relative flex h-9 w-9 items-center justify-center rounded-full bg-card text-muted-foreground", + "relative flex h-10 w-10 items-center justify-center rounded-full bg-card text-muted-foreground", TG_PRESS, )} > diff --git a/panel/src/components/tg/approvals/release-detail.tsx b/panel/src/components/tg/approvals/release-detail.tsx index 1c00c05d..44edbcff 100644 --- a/panel/src/components/tg/approvals/release-detail.tsx +++ b/panel/src/components/tg/approvals/release-detail.tsx @@ -110,7 +110,7 @@ export function ReleaseDetail({ )} -
+        
           {report.drafted_changelog}
         
diff --git a/panel/src/components/tg/approvals/video-post-detail.tsx b/panel/src/components/tg/approvals/video-post-detail.tsx index 0f4162bd..1191eefe 100644 --- a/panel/src/components/tg/approvals/video-post-detail.tsx +++ b/panel/src/components/tg/approvals/video-post-detail.tsx @@ -72,7 +72,7 @@ function CutPlayer({ post }: { post: VideoPost }) { {(Object.keys(CUT_LABELS) as VideoCut[]).map((c) => ( diff --git a/panel/src/components/tg/tg-chat-tab.tsx b/panel/src/components/tg/tg-chat-tab.tsx index 9e293c1e..9f8e29d2 100644 --- a/panel/src/components/tg/tg-chat-tab.tsx +++ b/panel/src/components/tg/tg-chat-tab.tsx @@ -254,7 +254,7 @@ function SecretaryView({ onBack }: { onBack: () => void }) { haptics.tap(); void stop().then(onBack); }} - className="rounded-full bg-muted/60 px-3 py-1.5 text-xs font-medium text-muted-foreground" + className="rounded-full bg-muted/60 px-3 py-2 text-xs font-medium text-muted-foreground" > End @@ -399,7 +399,7 @@ function MineList({
- + {getAgentDisplayName(c.other_agent)} {c.last_message_at && ( @@ -411,7 +411,7 @@ function MineList({

0 ? "font-medium text-foreground/80" : "text-muted-foreground", @@ -478,7 +478,7 @@ function FleetList({

- + {getAgentDisplayName(c.agent_a)} {getAgentDisplayName(c.agent_b)} @@ -838,7 +838,7 @@ function ThreadView({ setShowJump(false); }} className={cn( - "absolute bottom-2 right-2 flex h-9 w-9 items-center justify-center rounded-full bg-card text-primary shadow-lg ring-1 ring-white/[0.08]", + "absolute bottom-2 right-2 flex h-10 w-10 items-center justify-center rounded-full bg-card text-primary shadow-lg ring-1 ring-white/[0.08]", TG_PRESS, )} > @@ -863,7 +863,7 @@ function ThreadView({ fleetTarget === threadRef.a ? threadRef.b : threadRef.a, ) } - className="mt-2 inline-flex items-center gap-1 rounded-full bg-muted/60 px-3 py-1 text-xs font-medium text-muted-foreground" + className="mt-2 inline-flex items-center gap-1 rounded-full bg-muted/60 px-3 py-2 text-xs font-medium text-muted-foreground" > To: {getAgentDisplayName(fleetTarget)} · tap to switch diff --git a/panel/src/components/tg/tg-inbox-tab.tsx b/panel/src/components/tg/tg-inbox-tab.tsx index 478b192d..1e3d66ba 100644 --- a/panel/src/components/tg/tg-inbox-tab.tsx +++ b/panel/src/components/tg/tg-inbox-tab.tsx @@ -145,7 +145,7 @@ function NotificationRow({ type="button" disabled={ackPending} onClick={onAck} - className="flex h-7 shrink-0 items-center gap-1 rounded-full bg-primary px-2.5 text-xs font-semibold text-primary-foreground disabled:opacity-60" + className="flex h-9 shrink-0 items-center gap-1 rounded-full bg-primary px-2.5 text-xs font-semibold text-primary-foreground disabled:opacity-60" > Ack diff --git a/panel/src/components/tg/tg-task-sheet.tsx b/panel/src/components/tg/tg-task-sheet.tsx index 7ea4147e..8f279973 100644 --- a/panel/src/components/tg/tg-task-sheet.tsx +++ b/panel/src/components/tg/tg-task-sheet.tsx @@ -268,7 +268,7 @@ export function TgTaskSheet({
{task.description && ( -

+

{task.description}

)} diff --git a/panel/src/components/tg/tg-today-tab.tsx b/panel/src/components/tg/tg-today-tab.tsx index 66c17b9b..224e12d8 100644 --- a/panel/src/components/tg/tg-today-tab.tsx +++ b/panel/src/components/tg/tg-today-tab.tsx @@ -198,7 +198,7 @@ function NeedsYouBanner({ key={key} type="button" onClick={onApprovals} - className="rounded-full bg-violet-500/15 px-2.5 py-1 text-xs font-medium tabular-nums text-violet-300 transition-colors active:bg-violet-500/25" + className="rounded-full bg-violet-500/15 px-2.5 py-2 text-xs font-medium tabular-nums text-violet-300 transition-colors active:bg-violet-500/25" > {DRAFT_LABELS[key] ?? key} · {count} @@ -474,9 +474,14 @@ export function TgTodayTab({ className="w-full space-y-2 text-left" >
- {fleet.working.map((a) => ( + {fleet.working.slice(0, 3).map((a) => ( ))} + {fleet.working.length > 3 && ( + + +{fleet.working.length - 3} + + )}
    {fleet.working.slice(0, 3).map((agent) => ( @@ -488,7 +493,7 @@ export function TgTodayTab({ {agent.name} {agent.task_title && ( - + {agent.task_title} )} diff --git a/panel/src/components/tg/ui.tsx b/panel/src/components/tg/ui.tsx index af945fb7..0dda2462 100644 --- a/panel/src/components/tg/ui.tsx +++ b/panel/src/components/tg/ui.tsx @@ -344,7 +344,7 @@ export function TgSegmented({ onChange(o.value); }} className={cn( - "relative z-10 rounded-full py-1.5 text-center text-[13px] font-medium transition-colors duration-200", + "relative z-10 rounded-full py-2 text-center text-[13px] font-medium transition-colors duration-200", o.value === value ? "text-foreground" : "text-muted-foreground", )} > @@ -385,7 +385,7 @@ export function TgSubPage({ aria-label="Back" onClick={onBack} className={cn( - "flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-card text-muted-foreground", + "flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-card text-muted-foreground", TG_PRESS, )} >