Workspace
import { Workspace, Views, ProjectChip, VIEWS, CHAT, DEVICES, CONTROL } from '@hanzo/ui/agents'
Builder
The whole frame: the bar, the chat beside the work, the preview, and the console under it.
MEGA Shop is loaded. Tell me what to change and I will build it.
export function Builder() {const [view, setView] = useState('preview')const [device, setDevice] = useState('desktop')const [collapsed, setCollapsed] = useState(false)const [dock, setDock] = useState(36)return (<YStack width="100%" height={560} borderWidth={1} borderColor="$borderColor" rounded="$4" overflow="hidden"><Workspace collapsed={collapsed} pane={view === 'chat' ? 'chat' : 'view'} start={ <> <ProjectChip name="MEGA Shop" /> <Button variant="ghost" size="icon-sm" aria-label="History"> <History size={16} /> </Button> <Button variant="ghost" size="icon-sm" aria-label="Chat panel" aria-expanded={!collapsed} onClick={() => setCollapsed((c) => !c)} > <PanelLeft size={16} /> </Button> </> } middle={ <> <Views views={[...VIEWS, CHAT]} value={view} onChange={setView} label="Editor view" /> <Views views={DEVICES} value={device} onChange={setDevice} label="Device" labels="none" /> <Button variant="ghost" size="icon-sm" aria-label="Reload preview"> <RefreshCw size={15} /> </Button> <PageSelect pages={[{ id: '/', label: 'Homepage' }, { id: '/about', label: 'About' }]} value="/" onChange={() => {}} /> </> } end={ <> <Button variant="secondary" size="sm"> <Share2 size={14} /> Share </Button> <Button variant="primary" size="sm"> Publish </Button> </> } chat={ <YStack flex={1} gap="$2" p="$3"> <Thread maxWidth={0}> <Message role="assistant">MEGA Shop is loaded. Tell me what to change and I will build it.</Message> </Thread> <Suggestions items={SUGGESTIONS} onPick={() => {}} /> </YStack> } dock={<Console lines={[{ id: 1, level: 'log', text: 'ready on :3000', source: 'run' }]} height={dock} onHeight={setDock} />} ><PreviewFrame src="https://hanzo.ai/" device={device === 'mobile' ? 'mobile' : 'desktop'} /></Workspace></YStack>)}
Views
The segmented control the bar switches with: only the chosen view wears its label.
export function ViewTabs() {const [view, setView] = useState('preview')return <Views views={VIEWS} value={view} onChange={setView} label="Editor view" />}
Project chip
The switcher's trigger; the square is the name's initial unless a mark is given.
export function Project() {return <ProjectChip name="MEGA Shop" />}
Types
export interface WorkspaceProps extends Col {/** The bar's left cluster: the mark, the project, history, the chat toggle. */start?: ReactNode/** The bar's middle: view tabs, device, reload, page, open. Yields first. */middle?: ReactNode/** The bar's right cluster: Share, Publish. Never shrinks. */end?: ReactNode/** The chat column — thread, suggestions, composer. */chat?: ReactNode/** The chosen view: preview, files, code, layers. */children?: ReactNode/** Under the view: the console. */dock?: ReactNode/** The chat column is hidden on a wide screen. Controlled; the host persists it. */collapsed?: boolean/** Below `md`, which pane shows. */pane?: 'chat' | 'view'/** The chat column's width on a wide screen, px. */width?: number}
export interface View {id: stringlabel: stringicon?: ComponentType<{ size?: number }>/** Drawn only below `md` — the phone's Chat entry. */narrow?: boolean}
export interface ViewsProps extends Omit<ComponentProps<typeof XStack>, 'children' | 'onChange'> {views: readonly View[]value: stringonChange: (id: string) => void/** The group's accessible name: "Editor view", "Device". */label: string/** Which segments carry their words: only the chosen one (v2), all, or none. */labels?: 'active' | 'all' | 'none'}
export interface ProjectChipProps extends Omit<ComponentProps<typeof XStack>, 'children'> {/** The project's name. */name: string/** The square before the name; the name's initial when absent. */mark?: ReactNodeonPress?: () => void/** The button, for a menu or popover to anchor to. A plain prop (React 19). */ref?: Ref<HTMLElement>}
Exports
WorkspaceViewsProjectChipVIEWSCHATDEVICESCONTROLtype WorkspacePropstype Viewtype ViewsPropstype ProjectChipProps