Drag & Drop widgets e presídios
1) Conceito e cenários
Drag & Drop widgets são blocos interativos (cartões de gráficos, tabelas, filtros, botões de ação) que o usuário coloca livremente em uma tela ancorada à grade. Prediais - Layout e estilos salvos (layout + tema + parâmetros) que podem ser rapidamente aplicados, compartilhados e versionizados.
Cenários típicos:- Montagem dashbord de blocos prontos (cartões KPI, gráficos, filtros).
- Alteração rápida do layout através dos presídios Compacto, Analista, Apresentação.
- Edição compartilhada: a venda coloca widgets e o analista configura as fontes.
- Publicar apenas leitura para steakhalders.
2) Princípios arquitetônicos
1. Grid-first: posicionamento em colunas lógicas/linhas (12/24), pixels em derivativos.
2. Snapping & Guias: guias magnéticas, colagens na grade e nos vizinhos, alinhamento.
3. Constraint-aware: limitadores de tamanho/proporção, min/max, lock-aspect.
4. Safe-by-default: armazenamento automático contínuo, publicação transacional, undo/redo.
5. A11y-first: DnD o teclado e editar as alterações.
6. Realtime-ready: CRDT/OT para sessões multiuso.
7. Themable: tokens de design, tópicos de suporte, modos claro/escuro/contraste.
8. Celular: exportação/importação de JSON/YAML; versionagem de circuitos.
3) Modelo de dados (simplificado)
json
{
"id": "layout_01",
"name": "Analytics - Compact,"
"version": "2. 1. 0",
"grid": { "cols": 12, "rowHeight": 8, "gutter": 8, "margin": 16 },
"theme": { "preset": "light-pro", "tokens": { "radius": 12, "elevation": "soft" } },
"widgets": [
{
"id": "w_kpi_1",
"type": "kpi",
"title": "GGR",
"pos": { "x": 0, "y": 0, "w": 3, "h": 4, "z": 1 },
"constraints": { "minW": 2, "minH": 3, "lockAspect": false },
"props": { "format": "currency", "source": "ggr_daily" }
},
{
"id": "w_chart_1",
"type": "lineChart",
"title": "Deposits Trend",
"pos": { "x": 3, "y": 0, "w": 6, "h": 8, "z": 1 },
"props": { "source": "deposits", "legend": true }
},
{
"id": "w_table_1",
"type": "table",
"title": "Top Segments",
"pos": { "x": 9, "y": 0, "w": 3, "h": 12, "z": 2 },
"props": { "source": "segments_top", "pageSize": 12 }
}
],
"meta": { "createdBy": "dima", "updatedAt": "2025-11-03T17:55:00Z" }
}
4) Grid, referências e guias
Grade: 12 colunas para desctop, 6 para tablet, 4 para telefone, «rowHeight» iguais para passo vertical estável.
Snapping: ancoragem em bordas/centros; «ímãs» em 4/8 px; guidas inteligentes quando se aproximam dos vizinhos.
Auto-flow: transferência automática para baixo no conflito; algoritmo de blocos em queda.
Respeitabilidade: breakpoints → alternativas 'pos' sob cada breakpoint.
5) Eventos e estados DnD
События: `dragStart`, `drag`, `dragOver`, `drop`, `resizeStart`, `resize`, `resizeEnd`, `select`, `group`, `ungroup`, `reorder`, `undo`, `redo`.
Estados:- Ghost/Preview: caminho translúcido durante o arrastamento.
- Placeholders: áreas válidas (realce verde), proibidas (vermelho).
- Collision map: cálculo rápido das células ocupadas (bitset/interval tree).
6) Ressaiz, alinhamento, z-index
Canetas de ressalvas nas esquinas + retenção 'Shift' para manter as proporções.
Alinhamento de grupo: «esquerda/direita», «centro», «igual».
Níveis de sobreposição: 'z', com limite de intervalo, botões de frente/traseira.
7) Grupos, contêineres e anexos
Grupos: seleção múltipla, arrastamento compartilhado, alinhamento de grupo.
Contêineres widgets, acordeons, carrossel, podem tomar widgets filiais.
Limitadores de contêiner: grade externa ≠ interna (outras colunas).
8) Presídios (modelos) e versões
Os tipos de precondição são layout, tema (theme), conjunto de widgets, layout + dados.
Versioning: 'semver' esquema e migração (map campos, default).
Preview & Apply: visualização antes da aplicação.
Scoped presets: pessoal, equipe, global; permissões de leitura/edição.
Exportação/importação: JSON/YAML, assinatura de valor de referência, verificação de compatibilidade de versão.
9) Disponibilidade (A11y) e teclado
Keyboard completo DnD:- 'Enter/Space' - iniciar a transferência; seta - movimento para o passo da grade; 'Shift' + seta - passo acelerado;' Esc '- cancelado.
- 'Ctrl/Cmd + G' - Agrupar; 'Ctrl/Cmd + Shift + G' - Desagrupar.
- 'Alt' - desativar temporariamente a ligação à grade.
- Voz SR: "Movido para (x, y). Colar: ativado. Conflito: sim/não".
- Anéis de foco, grandes canetas de ressalvas, áreas de drop com descrição.
10) Bacha e pattern móvel
Long-press (300-500 ms) para início de DnD.
Metas aumentadas (mínimo de 40-48 px).
Painéis de ferramentas adaptáveis (painel de docas inferior).
Modo de edição: Bloqueio de rolagem de tela, scroll automático vertical quando transferido para a borda.
11) Ações de widgets (Actionable Widgets)
CTA embutido (botão), menu contextual, drag-clone (duplicação com "Alt').
«Presetos rápidos» para widget (densidade, lenda, padrão de cores).
Estados: loading/empty/erro, braços seguros («dados atrasados»).
12) Colaborações e publicações
Realtime: CRDT (por exemplo, Yjs) ou OT (Quall-Abordagem) - Cursores de participantes, bloqueios de grupos.
Direitos: «Owner», «Editor», «Viewer»; publicação da imagem (imutável snapshot).
Fluxo: rascunho → ciúmes → publicação; comparação de alterações (diff layout 'ov).
13) Undo/Redo e armazenamento automático
Pneu de comando: cada operação é um comando com 'do/undo'.
Registro do cliente (in-memory + persist periódico), limite de comprimento.
Auto-save: a cada N segundos/por 'idle', com o indicador 'Salvo'.
14) Temização e design de tokens
json
{
"themeId": "light-pro",
"tokens": {
"fontScale": { "h1": 24, "h2": 18, "body": 14 },
"radius": 12,
"elevation": "soft",
"palette": { "primary": "#3366FF", "critical": "#E53935" }
}
}
Alterna os tópicos sem contar o layout (apenas os tocadores visuais).
Contraste AA/AAA, modo High-Contrast, tema escuro com cinza correta.
15) Desempenho
Desenho por camadas (canvas/webgl para gráficos complexos, DOM para cromo).
Virtualizar listas/tabelas, throttle 'drag' (16 ms), requestAnimationFrame.
Diff-render, redescobrir apenas os widgets alterados.
A caixa de contagem de conflitos e haydline.
16) Segurança e proteção de conteúdo
Sanbox para widgets HTML (iframe, CSP, 'sandbox' bandeiras).
Limitação de drop: tipos whitelist (arquivos, links, JSON Presets); verificar o tamanho e o conteúdo.
Direitos dos presídios (RBAC/ABAC), auditoria das exportações/importações.
17) API de widgets (contrato)
ts interface Widget {
id: string;
type: string;
pos: { x:number; y:number; w:number; h:number; z:number };
constraints?: { minW?:number; minH?:number; maxW?:number; maxH?:number; lockAspect?:boolean };
props: Record<string, unknown>;
validate? (props): { ok: boolean; errors?: string[] };
onDrop? (dataTransfer): DropResult ;//support for external drop onAction? (actionId: string, payload?: any): void;
}
Eventos do ciclo de vida: 'mount', 'resize', 'visibilityChange'.
Validação de props antes da publicação.
18) Importar/exportar e migrar
Exporta «grid», «widgets», «theme», «metá».
Importação: verificação de versões do esquema, migração automática (map campos/default), relatório.
Lock-flash com hash para garantir a integridade.
19) Teclas quentes (recomendadas)
Navegação: '←↑→↓' - Mover; 'Shift' + seta - Passo rápido.
Ressaiz: 'Alt' + seta.
Operações: 'Ctrl/Cmd + D' - Duplicado; 'Ctrl/Cmd + G' - Grupo; 'Ctrl/Cmd + Shift + G' - Desinstalação.
Níveis: '['/']' - para trás/para frente no z-index.
Undo/Redo: `Ctrl/Cmd+Z` / `Ctrl/Cmd+Shift+Z` (или `Y`).
Prediais: 'Ctrl/Cmd + 1.. 9' - aplicar rapidamente salvos.
20) Pattern UX
Guias rápidas no primeiro lançamento (micro-linha em 3-5 passos).
Modo de grade: botão Mostrar/Ocultar grade.
Dicas Inline em colisões («não disponível: min de largura de widget = 3»).
Histórico de layout: volta à versão anterior.
21) Plano de teste
Unit: cálculo de conflitos, snapping, validador de construções.
Integração: DnD mouse/carro/teclado; grupos; contêineres.
E2E: montagem dashbord «do zero», aplicação do pré-sal, publicação, exportação/importação.
Caos: atrasos de render, perda de conexão (realtime), conflito de direitos.
A11y: teclado, voz SR, contraste.
22) Folha de cheque de implementação
- Grade/breakpoint e napping configurados
- Os grupos/grupos/alinhamento estão funcionando e testados
- Teclado e dicas de tela estão ativadas
- Sistema automático, undo/redo, histórico de layouts
- Presídios: versões, direitos, exportação/importação
- Tópicos e tocadores de design, modo High-Contrast
- Colaboração realtime e resolução de conflitos
- Limite de drop, validação de arquivos, sandbox HTML
- Métricas: adopção, tempo até a primeira colocação, erros de conflito
23) Mini-FAQ
Por que apenas a grade e não as coordenadas livres?
A malha simplifica o alinhamento, adaptação, portabilidade e desempenho.
Como guardar diferentes layout's sob breakpoint?
Cada widget tem 'pos' para breakpoint (desktop/tablet/mobile) com fall-back automático.
O que escolher para a colaboração é OT ou CRDT?
O CRDT é mais fácil para offline/conflitos; OT - ok para operações de texto linear. Para layout, é mais comum pegar CRDT.
Resultado
Bons Drag & Drop widgets não são apenas «arrastar cartão». Isto é: malha rigorosa e snapping, grupos confortáveis e alinhamento, disponibilidade do teclado, pré-eixos estáveis com versões e exportação, publicações seguras e colaborações. Construa isso em torno de um modelo confiável de dados, um plano de teste X e ux, e o construtor se tornará rápido, compreensível e resistente ao crescimento do conteúdo e dos comandos.