Software de colaboração · Novo recurso

Sistema de Design Monday Vibe.

Monte um painel de entregas funcional com tokens do Vibe 4 e controles de React. Entenda a diferença entre cores semânticas de ação e rótulos do painel, os níveis de espaçamento nomeados, as formas abreviadas de fonte e a configuração explícita de CSS necessária para uma nova aplicação.

Guia OpenDesign9 capítulos49 entradas de referênciaGuia de aplicação original
01

Prévia da interface do sistema de design Monday Vibe

Edite o status das linhas e conclua os itens selecionados; as contagens do resumo são atualizadas localmente.

Quadro de entregas semanalAbrir exemplo completo
Interpretação independente de HTML/CSS, com paleta, espaçamentos e dimensões tipográficas do tema claro do Vibe verificados; fonte substituta do sistema. · Referência de implementação
02

Referência de design do sistema de design Monday Vibe

Integração com o Vibe 4, suas fontes públicas e @vibe/core. Os valores abaixo correspondem às definições verificadas do tema claro e dos estilos; as cores dos rótulos do quadro são distintas das cores semânticas de sucesso/erro. O exemplo nativo usa controles Button reais do Vibe dentro de uma tabela HTML pertencente à aplicação.

Variáveis de espaçamento atuais

Fonte
Nome / RegraValor / ConfiguraçãoUso
--space-22pxUse no espaçamento da aplicação; o nome numérico do token corresponde à grafia atual na fonte.
--space-44pxUse no espaçamento da aplicação; o nome numérico do token corresponde à grafia atual na fonte.
--space-88pxUse no espaçamento da aplicação; o nome numérico do token corresponde à grafia atual na fonte.
--space-1212pxUse no espaçamento da aplicação; o nome numérico do token corresponde à grafia atual na fonte.
--space-1616pxUse no espaçamento da aplicação; o nome numérico do token corresponde à grafia atual na fonte.
--space-2020pxUse no espaçamento da aplicação; o nome numérico do token corresponde à grafia atual na fonte.
--space-2424pxUse no espaçamento da aplicação; o nome numérico do token corresponde à grafia atual na fonte.
--space-3232pxUse no espaçamento da aplicação; o nome numérico do token corresponde à grafia atual na fonte.
--space-4040pxUse no espaçamento da aplicação; o nome numérico do token corresponde à grafia atual na fonte.
--space-4848pxUse no espaçamento da aplicação; o nome numérico do token corresponde à grafia atual na fonte.
--space-6464pxUse no espaçamento da aplicação; o nome numérico do token corresponde à grafia atual na fonte.
--space-8080pxUse no espaçamento da aplicação; o nome numérico do token corresponde à grafia atual na fonte.

Cores de ações e superfícies

Fonte
Nome / RegraValor / ConfiguraçãoUso
--primary-color#0073ea Ações primárias.
--primary-hover-color#0060b9 Ação primária ao passar o cursor.
--primary-selected-color#cce5ff Plano de fundo do conteúdo selecionado.
--primary-text-color#323338 Texto padrão legível.
--secondary-text-color#676879 Rótulos secundários.
--primary-background-color#ffffff Superfície principal.
--allgrey-background-color#f6f7fb Plano de fundo da aplicação.
--ui-border-color#c3c6d4 Limite do controle.
--positive-color#00854d Ação semanticamente positiva.
--negative-color#d83a52 Ação semanticamente negativa.

Paleta de rótulos do quadro

Fonte
Nome / RegraValor / ConfiguraçãoUso
--color-done-green#00c875 Rótulo categórico Done, não a cor semanticamente positiva.
--color-working_orange#fdab3d Rótulo categórico Working; o nome exato na fonte inclui sublinhado.
--color-stuck-red#df2f4a Rótulo categórico Stuck.
--color-dark_purple#784bd1 Exemplo de identidade de grupo.

Atalhos tipográficos

Fonte
Nome / RegraValor / ConfiguraçãoUso
--font-familyFigtree, Roboto, Noto script fallbacks, sans-serifFamília tipográfica do corpo; os arquivos de fontes são instalados separadamente.
--title-font-familyPoppins, Roboto, Noto script fallbacks, sans-serifFamília tipográfica dos títulos.
--font-h1-medium600 32px/40px; title familyTítulo do quadro.
--font-h2-medium600 24px/30px; title familyCabeçalho do grupo.
--font-h3-medium600 18px/24px; title familySubseção compacta.
--font-text1-normal400 16px/22px; body familyConteúdo regular.
--font-text2-normal400 14px/20px; body familyConteúdo denso das linhas.
--font-text3-normal400 12px/16px; body familyDetalhes complementares.

Cantos

Fonte
Nome / RegraValor / ConfiguraçãoUso
--border-radius-44pxControles pequenos.
--border-radius-88pxContêineres médios.
--border-radius-1212pxEtapa numérica de canto disponível.
--border-radius-1616pxContêineres grandes.
--border-radius-smallvar(--border-radius-4)Alias nomeado para pequeno.
--border-radius-mediumvar(--border-radius-8)Alias nomeado para médio.
--border-radius-bigvar(--border-radius-16)Alias nomeado para grande.

Botão API

Fonte
Nome / RegraValor / ConfiguraçãoUso
kindDefault: primaryÊnfase visual, incluindo as ações terciárias usadas neste exemplo.
sizeDefault: mediumUse o tamanho pequeno para ações compactas nas linhas.
typeDefault: buttonDefina explicitamente submit para enviar o formulário.
disabledbooleanDesativa a ação em lote quando nenhuma linha está selecionada.
loadingbooleanExibe um indicador de carregamento durante uma operação real pendente.
activebooleanEstado ativo visual; para um controle de alternância, exponha também aria-pressed.
onClickReact mouse-event callbackAtualize o estado da aplicação aqui.
aria-pressedARIA pressed stateComunique a seleção de alternância da linha se usar botões de alternância.
03

Guia completo do sistema de design Monday Vibe

Um guia prático para escolher, aplicar e avaliar este sistema em uma interface real.

DESIGN-monday-vibe.md

Orientações completas, um ponto de partida para a implementação e links para o código-fonte.

Baixar o guia

Desenvolva com os pontos de entrada atuais do Vibe no sistema de design Monday Vibe

Os componentes principais e os tokens CSS são importados separadamente

O Vibe 4 disponibiliza componentes React nomeados por meio de @vibe/core e as variáveis CSS por meio de @vibe/core/tokens. Importe ambos em uma nova aplicação cliente. Um componente pode injetar seus próprios estilos e ainda depender de variáveis fornecidas pelo arquivo de tokens. O exemplo do quadro usa a estrutura nativa de tabela e controles Button reais do Vibe, com dados de linhas e seleção pertencentes à aplicação.

Com base neste guia de OpenDesign

Consulte a especificação de apoio

Evite misturar gerações anteriores do pacote

O pacote antigo monday-ui-react-core pertence ao Vibe 2. O Vibe 3 recebe manutenção para correções críticas, não para novos recursos. Este guia usa a interface atual do Vibe 4 e as variáveis de espaçamento numeradas. A integração não é um cliente do SDK do monday.com e não tem conexão com conta, espaço de trabalho ou item API.

Consulte a especificação de apoio

No sistema de design Monday Vibe, as cores de ação e os rótulos do quadro têm funções diferentes

Use funções semânticas nos controles

As ações primárias usam a função primária e sua cor correspondente ao passar o cursor. A seleção usa o plano de fundo de selecionado, enquanto a leitura normal usa as funções de texto primário e secundário. Use os valores do tema como um conjunto integrado, em vez de alterar apenas o plano de fundo do corpo. Este estudo local permanece no tema claro verificado.

Consulte a especificação de apoio

Uma célula Done não é um botão de sucesso

A fonte inclui cores categóricas do quadro, além das cores semânticas de feedback. O verde de Done é #00c875, enquanto a cor semanticamente positiva é #00854d. As células de status das linhas usam as cores do quadro com texto contrastante e legível, mantêm as palavras Working, Stuck e Done e nunca dependem apenas da cor para descrever o estado.

Consulte a especificação de apoio

Use o atalho tipográfico completo no sistema de design Monday Vibe

Títulos e linhas de trabalho têm estilos próprios

A fonte define Poppins para títulos e Figtree para o conteúdo do corpo, com alternativas compatíveis com diferentes sistemas de escrita. O atalho atual h1-medium é 600 32px/40px, enquanto text2-normal é 400 14px/20px. Aplique o atalho com a propriedade CSS font para manter peso, tamanho, altura da linha e família tipográfica integrados. A fonte também contém aliases de cabeçalho mais antigos; não os substitua silenciosamente por opções de escala diferente.

Consulte a especificação de apoio

Carregue os arquivos de fontes de forma deliberada

O Vibe não importa os arquivos de fontes recomendados por você. Adicione o link documentado da folha de estilos de Figtree/Poppins à aplicação HTML ou hospede arquivos licenciados adequadamente. O exemplo offline usa explicitamente fontes substitutas do sistema; portanto, sua renderização é uma interpretação, não uma alegação de reproduzir exatamente a tipografia do monday.com.

Consulte a especificação de apoio

Um quadro compacto sem controles comprimidos no sistema de design Monday Vibe

Os espaçamentos numerados definem o ritmo

Use --space-8 entre ações adjacentes da barra de ferramentas, --space-16 no preenchimento interno do painel e --space-24 entre as regiões do quadro. Todos são nomes exatos da fonte atual. Essas disposições são escolhas feitas para esta aplicação. A escala também inclui uma etapa de dois pixels para alinhamentos finos e valores maiores, de até oitenta pixels, para a composição.

Consulte a especificação de apoio

Os cantos definem o contorno dos contêineres

Consulte a especificação de apoio

Uma tabela editável com barra de ferramentas para ações em lote no sistema de design Monday Vibe

Mantenha explícita a estrutura dos dados

Cada item de trabalho tem um id estável, um título, um responsável e um status. Os cabeçalhos nativos das colunas explicam esses valores. A caixa de seleção de uma linha adiciona o id a um Set; ao alterar o status, o objeto correspondente é substituído, em vez de mutar o array. A ação Concluir selecionados lê o mesmo Set e atualiza apenas as linhas selecionadas. O resumo de conclusão é derivado das linhas.

  • O botão primário para ações em lote fica desativado quando o Set de seleção está vazio.
  • A ação terciária de cada linha percorre os status locais para fins de demonstração.
  • A ação de redefinição restaura as linhas iniciais e limpa a seleção.

Consulte a especificação de apoio

Exponha o estado por meio do componente Button API real no sistema de design Monday Vibe

Desativado, carregando e pressionado são estados diferentes

O exemplo nativo usa disabled para uma ação em lote indisponível. Não exibe carregamento nem sucesso porque não há operação remota. Se conectar uma camada de persistência real, associe loading ao ciclo de vida da solicitação e atualize o estado de sucesso somente após a confirmação. A fonte do Button também expõe active para a aparência e aria-pressed para a semântica de alternância; um não substitui o outro.

Consulte a especificação de apoio

Não transforme edições locais em alegações sobre um serviço

A mensagem dinâmica informa quantos itens locais foram alterados. Ela não diz que um quadro do monday.com foi atualizado. Ao recarregar a página, os dados de exemplo iniciais são restaurados. Uma integração de produção exigiria permissões explícitas do espaço de trabalho, tratamento de erros e sincronização fora da camada do sistema de design.

Consulte a especificação de apoio

Preserve o significado das linhas em diferentes larguras no sistema de design Monday Vibe

Adapte a demonstração de forma cuidadosa

No quadro offline, cada linha se transforma em um cartão de item identificado em telas estreitas. Os nomes das colunas são repetidos como rótulos visíveis para manter claros o responsável e o status. Essa é uma escolha de layout da aplicação, não uma alegação de que o Vibe transforma automaticamente todas as tabelas. Como alternativa para dados mais densos, o exemplo inicial nativo mantém uma tabela semântica em uma região identificada com rolagem horizontal.

Consulte a especificação de apoio

O box sizing global é um pré-requisito

Aplique border-box a elementos e pseudoelementos antes de usar a biblioteca. Sem isso, uma célula de largura fixa com preenchimento interno pode ultrapassar o tamanho previsto, especialmente quando há um botão dentro de uma coluna densa. Mantenha flexível o contêiner externo e permita que as ações da barra de ferramentas quebrem para a linha seguinte.

Consulte a especificação de apoio

Seleção e status precisam de nomes independentes no sistema de design Monday Vibe

Identifique cada controle de linha

Uma caixa de seleção inclui o título do item de trabalho em seu nome acessível. Cada ação de status inclui o nome do item e o status atual. Uma mensagem de status cortês informa o resultado do lote. Usuários de teclado podem selecionar linhas, ativar o comando em lote e redefinir o quadro usando controles nativos; a página não inventa o comportamento das teclas de seta de planilhas.

  1. Selecione Design e confirme que a ação em lote fica disponível.
  2. Conclua a seleção e verifique se o texto do status e a contagem derivada estão de acordo.
  3. Redefina e verifique se os dados e a seleção das caixas de seleção voltam ao estado inicial.

Consulte a especificação de apoio

Uma entrada completa do lado do cliente no sistema de design Monday Vibe

Instale, importe e monte

A configuração abaixo é uma entrada main.jsx para um projeto cliente React que contém um elemento raiz. Instale react, react-dom e @vibe/core@4, carregue os tokens CSS uma vez e aplique a folha de estilos global indicada. O pacote atual usa exportações de módulos ES. A extração de estilos no servidor está documentada como experimental; este exemplo inicial usa renderização no cliente deliberadamente.

Consulte a especificação de apoio

Exemplos de componentes do sistema de design Monday Vibe

Exemplo interativo completo e independente

Salve o documento completo como index.html e abra-o em um navegador. Interpretação independente de HTML/CSS, com paleta, espaçamentos e dimensões tipográficas do tema claro do Vibe verificados; fonte substituta do sistema.

html
<!doctype html><html lang="en"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Weekly delivery — Vibe study</title><style>*{box-sizing:border-box}body{margin:0;background:#f6f7fb;color:#323338;font:14px/20px Arial,sans-serif}button,input{font:inherit}button{cursor:pointer;border:0;border-radius:4px;padding:8px 16px;background:white;color:#323338}button:hover{background:#e7e9ef}button:disabled{opacity:.45;cursor:not-allowed}button:focus-visible,input:focus-visible{outline:3px solid #0073ea;outline-offset:2px}.shell{display:grid;grid-template-columns:180px minmax(0,1fr);min-height:600px}aside{padding:24px 16px;border-right:1px solid #d0d4e4;background:#fff}.brand{font-size:20px;font-weight:bold;margin-bottom:40px}.brand span{color:#0073ea}aside p{font-size:12px;color:#676879}aside strong{display:block;background:#cce5ff;padding:12px;border-radius:4px;color:#323338}main{padding:32px;min-width:0}h1{font-size:32px;line-height:40px;font-weight:600;margin:0 0 8px}.sub{color:#676879}.overview{margin:24px 0;display:grid;grid-template-columns:1fr 2fr;gap:24px;align-items:center}.count{font-size:32px;line-height:40px}.count small{font-size:14px;color:#676879}.bar{display:flex;border-radius:8px;overflow:hidden;height:16px;background:#e7e9ef}.bar span{transition:width .15s}.legend{display:flex;gap:16px;font-size:12px;margin-top:8px}.legend span:before{content:'●';color:var(--c);margin-right:4px}.tools{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:24px}.primary{background:#0073ea;color:white}.primary:hover{background:#0060b9}h2{font-size:18px;line-height:24px;color:#784bd1;font-weight:600}.board{border-left:6px solid #784bd1;border-radius:8px;background:white;overflow:hidden}.row,.head{display:grid;grid-template-columns:36px minmax(180px,1fr) 90px 130px;align-items:center;min-height:52px;border-bottom:1px solid #d0d4e4}.head{color:#676879;min-height:36px;font-size:12px}.row>*{padding:12px}.head>*{padding:8px}.row label{display:flex;align-items:center;justify-content:center}.row input{accent-color:#0073ea}.row .status{border-radius:0;height:100%;font-weight:500}.status[data-status=Working]{background:#fdab3d}.status[data-status=Stuck]{background:#df2f4a;color:white}.status[data-status=Done]{background:#00c875}.person{display:inline-flex;align-items:center;gap:8px}.avatar{width:24px;height:24px;border-radius:50%;background:#eceff8;display:inline-grid;place-items:center;font-size:11px}.row.selected{background:#f0f7ff}#message{min-height:24px;margin-top:16px;color:#676879}.mobile-label{display:none}footer{padding:16px 24px;color:#676879;font-size:11px;border-top:1px solid #d0d4e4}@media(max-width:800px){.shell{grid-template-columns:1fr}aside{display:none}main{padding:24px}}@media(max-width:560px){main{padding:16px}.overview{grid-template-columns:1fr;gap:12px}.head{display:none}.row{grid-template-columns:36px 1fr}.row .person,.row .status{grid-column:2}.row .status{margin:0 12px 12px;width:calc(100% - 24px);border-radius:4px}.mobile-label{display:inline;color:#676879;margin-right:8px}.row{padding:8px 0}.legend{flex-wrap:wrap}}</style><div class="shell"><aside><div class="brand"><span>▰</span> workroom</div><p>TEAM WORKSPACE</p><strong>Weekly delivery</strong><p>Sample project<br>No external account</p></aside><main><h1>Weekly delivery</h1><div class="sub">A shared view of the work moving this week.</div><section class="overview" aria-label="Completion summary"><div class="count"><span id="done">1</span><small> / 3 completed</small></div><div><div class="bar" aria-hidden="true"><span id="working-bar" style="background:#fdab3d"></span><span id="stuck-bar" style="background:#df2f4a"></span><span id="done-bar" style="background:#00c875"></span></div><div class="legend"><span style="--c:#fdab3d">Working</span><span style="--c:#df2f4a">Stuck</span><span style="--c:#00c875">Done</span></div></div></section><div class="tools"><button class="primary" id="complete" disabled>Complete selected</button><button id="reset">Reset board</button><span id="selection" style="padding:8px;color:#676879">0 selected</span></div><h2>▼ This week</h2><div class="board"><div class="head" aria-hidden="true"><span></span><span>Item</span><span>Owner</span><span>Status</span></div><div id="rows"></div></div><p id="message" role="status">Select items or click a status to change it locally.</p></main></div><footer>Independent Vibe 4 HTML/CSS study. Published light-theme and board-label colors; system fallback fonts. No monday.com workspace connection.</footer><script>
const initial=[{id:1,title:'Design handoff',owner:'Maya',status:'Working'},{id:2,title:'Accessibility review',owner:'Theo',status:'Stuck'},{id:3,title:'Release notes',owner:'Sam',status:'Done'}],states=['Working','Stuck','Done'];let items=structuredClone(initial),selection=new Set();const $=id=>document.getElementById(id);function totals(){$('done').textContent=items.filter(x=>x.status==='Done').length;for(const state of states)$(state.toLowerCase()+'-bar').style.width=items.filter(x=>x.status===state).length/items.length*100+'%';$('complete').disabled=!selection.size;$('selection').textContent=selection.size+' selected'}function render(){$('rows').replaceChildren();for(const item of items){const row=document.createElement('div');row.className='row'+(selection.has(item.id)?' selected':'');const label=document.createElement('label'),check=document.createElement('input');check.type='checkbox';check.checked=selection.has(item.id);check.setAttribute('aria-label','Select '+item.title);check.onchange=()=>{check.checked?selection.add(item.id):selection.delete(item.id);row.classList.toggle('selected',check.checked);totals()};label.append(check);const name=document.createElement('span');name.textContent=item.title;const person=document.createElement('span');person.className='person';const av=document.createElement('span');av.className='avatar';av.setAttribute('aria-hidden','true');av.textContent=item.owner[0];const pl=document.createElement('span');pl.className='mobile-label';pl.textContent='Owner';person.append(pl,av,document.createTextNode(item.owner));const status=document.createElement('button');status.className='status';status.dataset.status=item.status;status.textContent=item.status;status.setAttribute('aria-label',item.title+': '+item.status+'. Change status');status.onclick=()=>{item.status=states[(states.indexOf(item.status)+1)%states.length];status.dataset.status=item.status;status.textContent=item.status;status.setAttribute('aria-label',item.title+': '+item.status+'. Change status');totals();$('message').textContent=item.title+' is now '+item.status+' locally.'};row.append(label,name,person,status);$('rows').append(row)}totals()}
$('complete').onclick=()=>{let n=selection.size;items.forEach(x=>{if(selection.has(x.id))x.status='Done'});selection.clear();render();$('message').textContent=n+' local items completed.'};$('reset').onclick=()=>{items=structuredClone(initial);selection.clear();render();$('message').textContent='Board reset.'};render();
</script></html>

Referência de código

  • A barra de ferramentas para ações em lote altera os status das tarefas de exemplo. As cores dos rótulos descrevem o fluxo de trabalho deste quadro e não substituem os tokens semânticos de ação do Vibe.

Entrada da implementação nativa completa

A implementação completa, desde a configuração, reunida aqui com as explicações específicas de API. Siga os pré-requisitos documentados de pacote e compilação na configuração.

jsx
// npm install react react-dom @vibe/core@4
// main.jsx in a client React project with <div id="root"></div>
import React, { useState } from 'react';
import { createRoot } from 'react-dom/client';
import { Button } from '@vibe/core';
import '@vibe/core/tokens';
import './board.css';
const initial=[{id:1,title:'Design handoff',owner:'Maya',status:'Working'},
{id:2,title:'Accessibility review',owner:'Theo',status:'Stuck'},
{id:3,title:'Release notes',owner:'Sam',status:'Done'}];
const states=['Working','Stuck','Done'];
function Board(){
 const [items,setItems]=useState(initial),[selected,setSelected]=useState(new Set()),[message,setMessage]=useState('');
 const toggle=id=>setSelected(old=>{const next=new Set(old);next.has(id)?next.delete(id):next.add(id);return next});
 const complete=()=>{setItems(old=>old.map(item=>selected.has(item.id)?{...item,status:'Done'}:item));setMessage(selected.size+' local items completed');setSelected(new Set())};
 return <main className="board"><h1>Weekly delivery</h1>
 <p>{items.filter(x=>x.status==='Done').length} of {items.length} items completed</p>
 <div className="toolbar"><Button disabled={!selected.size} onClick={complete}>Complete selected</Button>
 <Button kind="tertiary" onClick={()=>{setItems(initial);setSelected(new Set());setMessage('Board reset')}}>Reset</Button></div>
 <div className="table-scroll" role="region" aria-label="Delivery items" tabIndex={0}>
 <table><thead><tr><th>Select</th><th>Item</th><th>Owner</th><th>Status</th></tr></thead><tbody>
 {items.map(item=><tr key={item.id}><td><input type="checkbox" aria-label={'Select '+item.title} checked={selected.has(item.id)} onChange={()=>toggle(item.id)}/></td>
 <th scope="row">{item.title}</th><td>{item.owner}</td><td><Button kind="tertiary" size="small" aria-label={item.title+': '+item.status+'. Change status'} onClick={()=>setItems(old=>old.map(x=>x.id===item.id?{...x,status:states[(states.indexOf(x.status)+1)%states.length]}:x))}>{item.status}</Button></td></tr>)}
 </tbody></table></div><p role="status">{message}</p></main>
}
createRoot(document.getElementById('root')).render(<Board/>);

Referência de código

  • Entrada completa para o board local; adicione board.css do exemplo do componente. As fontes não são incluídas automaticamente. O pacote nativo API foi conferido com a fonte oficial; este ambiente não compilou o exemplo do pacote.

Folha de estilos do board baseada em tokens

Use a exportação de tokens para layout e tipografia. A região pai mantém a tabela semântica utilizável em larguras estreitas.

css
*,*::before,*::after{box-sizing:border-box}
body{margin:0;background:var(--allgrey-background-color);color:var(--primary-text-color);font:var(--font-text2-normal)}
.board{max-width:960px;margin:auto;padding:var(--space-24)}
h1{font:var(--font-h1-medium)}
.toolbar{display:flex;flex-wrap:wrap;gap:var(--space-8);margin-bottom:var(--space-16)}
.table-scroll{overflow:auto;border:1px solid var(--layout-border-color);border-radius:var(--border-radius-medium)}
table{width:100%;min-width:560px;border-collapse:collapse;background:var(--primary-background-color)}
th,td{text-align:left;padding:var(--space-12);border-bottom:1px solid var(--layout-border-color)}

Referência de código

  • Esta é uma aplicação CSS que usa variáveis Vibe reais.
  • A prévia incorporada usa uma interpretação HTML independente e responsiva.

Carregamento de fontes na aplicação HTML

Carregue explicitamente as duas famílias recomendadas; a importação de tokens CSS não faz o download delas.

html
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Figtree:wght@400;500;600;700&family=Poppins:wght@400;500;600;700&display=swap">

Referência de código

  • Uma configuração de fontes licenciadas e hospedadas localmente pode substituir esta folha de estilos externa.
04

Configuração do agente de IA do sistema de design Monday Vibe

Ponto de partida para implementação

Entrada completa para o board local; adicione board.css do exemplo do componente. As fontes não são incluídas automaticamente. O pacote nativo API foi conferido com a fonte oficial; este ambiente não compilou o exemplo do pacote.

jsx
// npm install react react-dom @vibe/core@4
// main.jsx in a client React project with <div id="root"></div>
import React, { useState } from 'react';
import { createRoot } from 'react-dom/client';
import { Button } from '@vibe/core';
import '@vibe/core/tokens';
import './board.css';
const initial=[{id:1,title:'Design handoff',owner:'Maya',status:'Working'},
{id:2,title:'Accessibility review',owner:'Theo',status:'Stuck'},
{id:3,title:'Release notes',owner:'Sam',status:'Done'}];
const states=['Working','Stuck','Done'];
function Board(){
 const [items,setItems]=useState(initial),[selected,setSelected]=useState(new Set()),[message,setMessage]=useState('');
 const toggle=id=>setSelected(old=>{const next=new Set(old);next.has(id)?next.delete(id):next.add(id);return next});
 const complete=()=>{setItems(old=>old.map(item=>selected.has(item.id)?{...item,status:'Done'}:item));setMessage(selected.size+' local items completed');setSelected(new Set())};
 return <main className="board"><h1>Weekly delivery</h1>
 <p>{items.filter(x=>x.status==='Done').length} of {items.length} items completed</p>
 <div className="toolbar"><Button disabled={!selected.size} onClick={complete}>Complete selected</Button>
 <Button kind="tertiary" onClick={()=>{setItems(initial);setSelected(new Set());setMessage('Board reset')}}>Reset</Button></div>
 <div className="table-scroll" role="region" aria-label="Delivery items" tabIndex={0}>
 <table><thead><tr><th>Select</th><th>Item</th><th>Owner</th><th>Status</th></tr></thead><tbody>
 {items.map(item=><tr key={item.id}><td><input type="checkbox" aria-label={'Select '+item.title} checked={selected.has(item.id)} onChange={()=>toggle(item.id)}/></td>
 <th scope="row">{item.title}</th><td>{item.owner}</td><td><Button kind="tertiary" size="small" aria-label={item.title+': '+item.status+'. Change status'} onClick={()=>setItems(old=>old.map(x=>x.id===item.id?{...x,status:states[(states.indexOf(x.status)+1)%states.length]}:x))}>{item.status}</Button></td></tr>)}
 </tbody></table></div><p role="status">{message}</p></main>
}
createRoot(document.getElementById('root')).render(<Board/>);

Um prompt para seu projeto

Prompt para agente de IA
Crie o board de entregas Vibe 4 fornecido. Importe @vibe/core/tokens, use as variáveis de espaçamento numeradas atuais e as declarações abreviadas completas de fonte, e mantenha as cores semânticas de feedback distintas das cores dos rótulos do board. Implemente a seleção local de linhas, a edição de status e uma contagem derivada de conclusão. Use disabled no botão de ação em lote; não simule salvamento remoto.
05

Fontes e escopo do sistema de design Monday Vibe

Referência independente do Vibe 4 e demonstração de um board local. Sem conta monday.com, dados de workspace ou conexão com SDK. O starter nativo usa controles Button reais do Vibe e marcação de tabela mantida pela aplicação.