Controls
Controles de canto com tema para um Canvas. Zoom in, zoom out, fit view e travar interação, tudo skinado com tokens da Gremorie.
Visão geral
Controls é uma skin da Gremorie sobre o Controls de @xyflow/react. Ele fica ancorado no canto inferior esquerdo de um Canvas por padrão e expõe os botões de interação padrão: zoom in, zoom out, fit view e um toggle de trava que desabilita o pan e a interação com nós.
O chrome da Gremorie remove as bordas e sombras pesadas do xyflow em favor de uma única borda arredondada, um fundo bg-card e botões estilo ghost que assumem bg-secondary no hover. Isso mantém os controles visualmente discretos para que não compitam com o conteúdo do workflow.
Use sempre que um canvas precisar de controles de zoom (qualquer editor de grafo com leitura e escrita) ou auxílios de navegação read-only (traces de agente, visualizações de fluxo grandes).
Preview
'use client';import '@xyflow/react/dist/style.css';import { Canvas, Controls } from '@gremorie/rx-ai';import { type Edge as FlowEdge, type Node as FlowNode, ReactFlowProvider,} from '@xyflow/react';const gridNodes: FlowNode[] = [ { id: '1', position: { x: 0, y: 0 }, data: { label: 'A' } }, { id: '2', position: { x: 200, y: 80 }, data: { label: 'B' } },];const gridEdges: FlowEdge[] = [{ id: 'e1-2', source: '1', target: '2' }];export function ControlsPreview() { return ( <div className="h-[360px] w-full"> <ReactFlowProvider> <Canvas edges={gridEdges} nodes={gridNodes}> <Controls /> </Canvas> </ReactFlowProvider> </div> );}Anatomia
Controls zoom · fit-view · interactivity cluster — leaf (inside Canvas)Instalação
bash npx gremorie@latest add rx-controls bash pnpm dlx gremorie@latest add rx-controls bash yarn dlx gremorie@latest add rx-controls bash bunx --bun gremorie@latest add rx-controls Requer @xyflow/react.
Uso
import { Canvas, Controls } from "@gremorie/rx-ai";
export function Workflow() {
return (
<Canvas nodes={nodes} edges={edges}>
<Controls />
</Canvas>
);
}A edição Angular deste componente está planejada; a edição React está production-ready hoje.
API
<Controls>
Encaminha todas as ControlProps de @xyflow/react. O wrapper da Gremorie apenas reestiliza - nunca sobrescreve props de comportamento.
| Prop | Type | Default | Description |
|---|---|---|---|
position | "top-left" | "top-right" | "bottom-left" | "bottom-right" | "bottom-left" | Canto ao qual os controles ancoram. Default do xyflow. |
showZoom | boolean | true | Mostra os botões de zoom in / out. |
showFitView | boolean | true | Mostra o botão de fit-view. |
showInteractive | boolean | true | Mostra o toggle de trava. Defina como false para canvases read-only. |
fitViewOptions | FitViewOptions | - | Encaminhado para a ação de fit-view (padding, duração, etc.). |
onZoomIn / onZoomOut / onFitView / onInteractiveChange | callbacks | - | Ganchos para cada controle. |
children | ReactNode | - | Botões de controle extras anexados à barra. Cada child deve seguir a API ControlButton do xyflow. |
className | string | - | Classes extras. |
Chrome padrão adicionado pela Gremorie: gap-px overflow-hidden rounded-md border bg-card p-1 shadow-none!. Os botões filhos são reestilizados para rounded-md, fundo transparente, estado de hover bg-secondary.
Composição
<Canvas>é o pai.Controlsdeve ser renderizado como child para que a maquinaria interna dePaneldo xyflow possa posicioná-lo em relação à viewport.- Botões embutidos (zoom in, zoom out, fit view, trava) renderizam automaticamente com base nas props
showZoom/showFitView/showInteractive. - Botões custom podem ser anexados via
children. UseControlButtonde@xyflow/reactpara manter o estilo consistente.
Variações
Padrão
Inferior esquerdo, todos os quatro botões.
<Canvas nodes={nodes} edges={edges}>
<Controls />
</Canvas>Canvas read-only
Esconda o toggle de trava quando o canvas já é não interativo.
<Canvas nodes={nodes} edges={edges} nodesDraggable={false}>
<Controls showInteractive={false} />
</Canvas>Botão de controle custom
Anexe um botão de "reset" ou "auto-layout" usando o ControlButton do xyflow.
import { ControlButton } from '@xyflow/react';
import { LayoutGridIcon } from 'lucide-react';
<Canvas nodes={nodes} edges={edges}>
<Controls>
<ControlButton onClick={autoLayout} title="Auto-layout">
<LayoutGridIcon className="size-4" />
</ControlButton>
</Controls>
</Canvas>;Ancorado no canto superior direito
Para canvases onde o canto inferior esquerdo é reservado para outra coisa (barra de status, widget de raciocínio do agente), mova os controles.
<Canvas nodes={nodes} edges={edges}>
<Controls position="top-right" />
</Canvas>Acessibilidade
- Keyboard: cada controle embutido é um botão de verdade. Tab foca cada um em ordem; Enter ou Space ativa.
- Labels: o xyflow traz atributos
titlenos botões embutidos ("zoom in","zoom out","fit view","toggle interactivity"). Para botões custom, forneçatitle(e idealmentearia-label) para que o chrome só com ícones seja anunciado. - Focus visible: o estilo de hover da Gremorie (
bg-secondary) não interfere no focus ring padrão do xyflow. Não remova ooutline. - Reduced motion: as animações de zoom e pan são governadas pelo xyflow e respeitam
prefers-reduced-motion.