"use client" /** * FocusWorkflowTemplate — centered full-page shell for single-task workflows. * * Hides primary sidebar + secondary panel (via `isFocusWorkflowPath` + `SidebarAutoCollapse`). * Compose with `PageHeader` + `actions` for hub-style identity rows, or pass a custom `header`. * * Reference: `components/focus-workflow-showcase-client.tsx` (Design OS), `new-library-item-form.tsx`. */ import * as React from "react" import { PageHeader } from "@/components/page-header" import { SidebarAutoCollapse } from "@/components/sidebar" import { PrimaryPageTemplate, type PrimaryPageTemplateProps, } from "@/components/templates/primary-page-template" import { cn } from "@/lib/utils" interface BackLink { href: string label?: string ariaLabel?: string } export interface FocusWorkflowTemplateProps { /** Page `

` when using the built-in `PageHeader`. */ title: string /** Descriptor below the title. */ subtitle?: React.ReactNode /** Back target — rendered in `SiteHeader` when `useSiteHeaderBack`. */ back: BackLink /** Parent trail back icon in `SiteHeader` (no inline back link). Default `true`. */ useSiteHeaderBack?: boolean /** Right-aligned header actions (primary + outline). Pair with custom `header` or built-in `PageHeader`. */ actions?: React.ReactNode /** Replace the default `PageHeader` (e.g. collaboration variant). */ header?: React.ReactNode siteHeader?: PrimaryPageTemplateProps["siteHeader"] /** Centered content max width. Default `max-w-3xl`. */ maxWidthClassName?: string bodyClassName?: string contentClassName?: string containScroll?: boolean pageCanvas?: React.ReactNode children: React.ReactNode } export function FocusWorkflowTemplate({ title, subtitle, back, useSiteHeaderBack = true, actions, header, siteHeader, maxWidthClassName = "max-w-3xl", bodyClassName, contentClassName, containScroll, pageCanvas, children, }: FocusWorkflowTemplateProps) { const computedSiteHeader = useSiteHeaderBack ? { back: { href: back.href, label: back.label ?? "Back", ariaLabel: back.ariaLabel, } as const, ...(siteHeader ?? {}), } : siteHeader const headerNode = header ?? (title ? ( ) : null) return ( } siteHeader={computedSiteHeader} maxWidthClassName={maxWidthClassName} bodyClassName={cn("overflow-y-auto", bodyClassName)} contentClassName={cn("mx-auto w-full", contentClassName)} containScroll={containScroll} pageCanvas={pageCanvas} > {headerNode ?
{headerNode}
: null} {children}
) }