GH GambleHub

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.

Contact

Entrar em contacto

Contacte-nos para qualquer questão ou necessidade de apoio.Estamos sempre prontos para ajudar!

Iniciar integração

O Email é obrigatório. Telegram ou WhatsApp — opcionais.

O seu nome opcional
Email opcional
Assunto opcional
Mensagem opcional
Telegram opcional
@
Se indicar Telegram — responderemos também por lá.
WhatsApp opcional
Formato: +indicativo e número (ex.: +351XXXXXXXXX).

Ao clicar, concorda com o tratamento dos seus dados.