Software empresarial · Novo recurso

Sistema de design ServiceNow Horizon.

Explore as referências exatas de espaçamento, raio e tipografia do Horizon Workspace em um fluxo local completo de revisão de solicitações, com retenção de rascunhos, validação, filtros de status e recuperação.

Guia OpenDesign6 capítulos19 entradas de referênciaGuia de aplicação original
01

Prévia da interface do sistema de design ServiceNow Horizon

Mantenha os rascunhos entre registros, marque uma solicitação como revisada e recupere a seleção após filtrar ou reabrir.

Revise uma pequena fila de solicitaçõesAbrir exemplo completo
HTML/CSS/JavaScript original, com as fontes Cabin e Lato locais; sem conexão com a plataforma ServiceNow. · Referência de implementação
02

Referência de design do sistema de design ServiceNow Horizon

Referências publicadas do Horizon Workspace para espaçamento, raio dos cantos e tipografia. As cores originais do aplicativo foram intencionalmente excluídas desta tabela de referência oficial.

Espaçamentos publicados do Workspace

Fonte
Nome / RegraValor / ConfiguraçãoUso
$now-global-space--xxs2pxNomes exatos das referências publicadas em Sass; não são propriedades personalizadas CSS inventadas.
$now-global-space--xs4pxNomes exatos das referências publicadas em Sass; não são propriedades personalizadas CSS inventadas.
$now-global-space--sm8pxNomes exatos das referências publicadas em Sass; não são propriedades personalizadas CSS inventadas.
$now-global-space--md12pxNomes exatos das referências publicadas em Sass; não são propriedades personalizadas CSS inventadas.
$now-global-space--lg16pxNomes exatos das referências publicadas em Sass; não são propriedades personalizadas CSS inventadas.
$now-global-space--xl24pxNomes exatos das referências publicadas em Sass; não são propriedades personalizadas CSS inventadas.
$now-global-space--xxl32pxNomes exatos das referências publicadas em Sass; não são propriedades personalizadas CSS inventadas.
$now-global-space--3xl40pxNomes exatos das referências publicadas em Sass; não são propriedades personalizadas CSS inventadas.

Raios dos cantos publicados

Fonte
Nome / RegraValor / ConfiguraçãoUso
now-global-border-radius--sm2pxReferência de design publicada. Valores pequenos servem para rótulos compactos, valores médios para controles aninhados e valores grandes para contêineres.
now-global-border-radius--md6pxReferência de design publicada. Valores pequenos servem para rótulos compactos, valores médios para controles aninhados e valores grandes para contêineres.
now-global-border-radius--lg8pxReferência de design publicada. Valores pequenos servem para rótulos compactos, valores médios para controles aninhados e valores grandes para contêineres.

Papéis tipográficos publicados

Fonte
Nome / RegraValor / ConfiguraçãoUso
Heading familyCabinPapéis tipográficos documentados do Workspace. O estudo carrega localmente os arquivos públicos das fontes Cabin e Lato.
Body familyLatoPapéis tipográficos documentados do Workspace. O estudo carrega localmente os arquivos públicos das fontes Cabin e Lato.
header-hero32pxPapéis tipográficos documentados do Workspace. O estudo carrega localmente os arquivos públicos das fontes Cabin e Lato.
header-primary24pxPapéis tipográficos documentados do Workspace. O estudo carrega localmente os arquivos públicos das fontes Cabin e Lato.
header-secondary20pxPapéis tipográficos documentados do Workspace. O estudo carrega localmente os arquivos públicos das fontes Cabin e Lato.
header-tertiary16pxPapéis tipográficos documentados do Workspace. O estudo carrega localmente os arquivos públicos das fontes Cabin e Lato.
title-primary20pxPapéis tipográficos documentados do Workspace. O estudo carrega localmente os arquivos públicos das fontes Cabin e Lato.
title-secondary16pxPapéis tipográficos documentados do Workspace. O estudo carrega localmente os arquivos públicos das fontes Cabin e Lato.
03

Guia completo do sistema de design ServiceNow Horizon

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

DESIGN-servicenow-horizon.md

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

Baixar o guia

Workspace e escopo de implementação do sistema de design ServiceNow Horizon

Comece pela estrutura do aplicativo

O Horizon abrange várias estruturas de aplicativos do ServiceNow. Esta página se concentra no Workspace: a fila e o registro selecionado permanecem visíveis ao mesmo tempo, para que a pessoa responsável pela revisão possa avançar pelo trabalho local sem perder o contexto. Service Portal, Native Mobile e Core UI não são apresentados como temas intercambiáveis. O estudo interativo é um aplicativo HTML original, não uma instância incorporada do ServiceNow.

Com base neste guia de OpenDesign

Separe as bases verificadas das escolhas originais

A referência informa os nomes exatos dos espaçamentos publicados, os valores dos raios e os papéis tipográficos. A cor verde das ações, as superfícies neutras e o azul de foco do estudo são valores originais de OpenDesign, declarados com um prefixo do aplicativo. Eles não são apresentados como exportações oficiais de tokens do Horizon. Para executar o exemplo completo, não é necessário instalar pacotes inventados do ServiceNow nem usar uma API API da plataforma.

Espaçamento, raio e tipografia do Workspace no sistema de design ServiceNow Horizon

Use a sequência de espaçamentos real

A escala documentada é de 2, 4, 8, 12, 16, 24, 32 e 40px. O estudo a utiliza para diferenciar o espaço entre a fila e o registro, o preenchimento interno do registro e as distâncias menores entre os metadados. Esses valores atendem a relações de agrupamento diferentes, mesmo quando a mesma medida se repete. Uma tela com preenchimento uniforme perderia essa hierarquia.

Atribua papéis diferentes a títulos e textos de leitura

A fonte Cabin é usada nos títulos e a Lato, no texto corrido, em conformidade com os papéis tipográficos publicados para essas famílias. Em telas mais largas, o estudo usa um título de página de 32px e um título de registro de 24px. As referências de raio são 2, 6 e 8px, e não uma sequência genérica presumida de 4/8/12. Os rótulos de status arredondados não comunicam o status apenas pela forma ou pela cor: também exibem as palavras Aberto ou Revisado.

Fila, registro selecionado e filtragem no sistema de design ServiceNow Horizon

Mantenha um único registro selecionado

Cada ação na fila identifica uma solicitação de prática e exibe a pessoa responsável e o status. Ao selecioná-la, os detalhes correspondentes são preenchidos ao lado e o novo título recebe o foco. A ação selecionada usa aria-current e um tratamento de borda visível. Esse padrão original de lista e detalhes não é um componente nativo do Horizon API; toda a lógica de estado está disponível para inspeção.

Recupere a seleção quando um filtro a remover

O filtro de status restringe a fila visível. Se a solicitação selecionada deixar de fazer parte dela, o aplicativo seleciona a primeira solicitação correspondente disponível. Se não houver nenhuma, exibe uma mensagem de estado vazio e a ação Mostrar todas as solicitações. A contagem usa a coleção completa de três registros como denominador. A filtragem nunca exclui registros nem altera o status sem aviso.

  • Mantenha o registro selecionado dentro do conjunto filtrado atual.
  • Exiba um estado vazio claro quando esse conjunto não tiver registros.
  • Permita recuperar a fila usando Mostrar todas as solicitações, sem excluir dados.

Rascunhos, notas e validação da revisão no sistema de design ServiceNow Horizon

Mantenha os rascunhos associados ao respectivo registro

À medida que a pessoa responsável pela revisão digita, a área de texto atualiza o rascunho do registro correspondente. Ao abrir outra solicitação e voltar, o rascunho é preservado. Uma nota em branco ou composta apenas por espaços não pode marcar uma solicitação como revisada: uma mensagem de erro em linha é exibida, aria-invalid é definido e o foco retorna à área de texto. O modelo de dados mantém explícitos a nota salva e o rascunho atual.

Torne observável a mudança de estado local

Reabertura e feedback acessível no sistema de design ServiceNow Horizon

Preserve o trabalho útil ao reabrir

A ação Reabrir solicitação retorna um registro revisado ao status Aberto, mantendo a nota salva. Com o filtro Revisado, a lista pode ficar vazia; nesse caso, a ação de recuperação restaura a fila completa. Essa combinação testa a relação entre o estado do registro, a filtragem e os detalhes selecionados, oferecendo uma verificação mais completa do que testar cada botão isoladamente.

Combine texto, foco e status

As cores dos status são acompanhadas por rótulos de texto. A validação move o foco para o campo que precisa de atenção, a navegação entre registros move o foco para o título e as atualizações locais são anunciadas por uma região de status. Em um Workspace de produção, o estudo não dispensa testes com tecnologias assistivas. Ele oferece um fluxo local completo e inspecionável para dar início a esses testes.

Código-fonte local completo e verificações do sistema de design ServiceNow Horizon

Instale as dependências públicas das fontes

O arquivo de entrada fornecido importa os pacotes públicos das fontes Cabin e Lato, além da folha de estilos da composição original. A estrutura HTML fornece o elemento raiz. Este exemplo não inclui ambiente de execução, credenciais nem endpoints do ServiceNow. A integração real com a plataforma deve começar pelos recursos de desenvolvimento e Workspace do Horizon, e não tratando a lista local de registros como um contrato de API API do ServiceNow.

  1. Instale as dependências públicas das fontes em um aplicativo vanilla.
  2. Salve o arquivo de entrada completo, a folha de estilos e a estrutura raiz HTML.
  3. Teste a preservação dos rascunhos antes de salvar uma revisão.
  4. Combine a filtragem por status com a reabertura e a recuperação do estado vazio.

Verifique o fluxo completo

Envie uma nota vazia, escreva um rascunho, abra outra solicitação e volte para confirmar que ele foi preservado. Marque o registro como revisado, filtre por Revisado e reabra-o. Verifique a recuperação do estado vazio e a preservação da nota. Em telas estreitas, a fila fica acima dos detalhes, sem ocultar nenhuma ação. Além dessas mudanças de estado, verifique o carregamento das fontes, os erros de JavaScript e a rolagem horizontal.

Exemplos de componentes do sistema de design ServiceNow Horizon

main.js — lógica completa da fila e das revisões

Todos os registros, rascunhos, filtros, validações e mecanismos de recuperação.

javascript
import '@fontsource/cabin/latin-600.css';
import '@fontsource/lato/latin-400.css';
import '@fontsource/lato/latin-700.css';
import './horizon.css';
const records=[{id:'REQ-104',title:'Review the workshop outline',owner:'Design team',priority:'Normal',detail:'Compare the proposed agenda with the decision the team needs to make. Capture one question that should be resolved before the workshop.'},{id:'REQ-105',title:'Check the shared resource list',owner:'Content team',priority:'High',detail:'Review the resource titles for clear action language and confirm that each summary explains when the resource is useful.'},{id:'REQ-106',title:'Prepare the research readout',owner:'Research team',priority:'Normal',detail:'Group the observations by theme. Keep direct observations separate from the team’s interpretation and include the questions still open.'}].map(x=>({...x,status:'Open',note:''}));let selected=records[0].id;
document.querySelector('#root').innerHTML=`<main><header><p class="eyebrow">OpenDesign · Workflow study</p><h1>Team review workspace</h1><p>Review three original practice requests. Update a local record while keeping the queue and details in context.</p></header><div class="toolbar"><label>Status <select id="filter"><option>All</option><option>Open</option><option>Reviewed</option></select></label><p id="queue-count" role="status"></p></div><div class="workspace"><nav aria-label="Practice request queue"><div id="queue"></div><p id="empty" hidden>No requests match this status.</p><button id="clear" hidden>Show all requests</button></nav><section id="detail" aria-labelledby="record-title"></section></div><p id="feedback" role="status"></p><footer><strong>Original application, documented foundations.</strong> Cabin headings, Lato body text, the published 2–40px spacing scale and 2/6/8px radius references inform this study. The colors and application behavior are original OpenDesign choices. This is not the ServiceNow platform or a connected Workspace.</footer></main>`;
function renderQueue(){let filter=document.querySelector('#filter').value,visible=records.filter(x=>filter==='All'||x.status===filter);if(!visible.some(x=>x.id===selected))selected=visible[0]?.id;const queue=document.querySelector('#queue');queue.replaceChildren(...visible.map(r=>{let b=document.createElement('button');b.className='queue-item';b.dataset.id=r.id;b.setAttribute('aria-current',String(r.id===selected));b.innerHTML=`<span class="record-id">${r.id}</span><strong>${r.title}</strong><span>${r.owner}</span><span class="status ${r.status.toLowerCase()}">${r.status}</span>`;b.onclick=()=>{selected=r.id;renderQueue();renderDetail();document.querySelector('#record-title')?.focus()};return b}));document.querySelector('#queue-count').textContent=`${visible.length} of ${records.length} requests`;document.querySelector('#empty').hidden=visible.length>0;document.querySelector('#clear').hidden=visible.length>0;}
function renderDetail(){const r=records.find(x=>x.id===selected),panel=document.querySelector('#detail');if(!r){panel.innerHTML='<h2 id="record-title">Choose another status</h2><p>All local requests are still available through the status filter.</p>';return}panel.innerHTML=`<p class="eyebrow">${r.id} · ${r.owner}</p><h2 id="record-title" tabindex="-1">${r.title}</h2><p>${r.detail}</p><dl><div><dt>Priority</dt><dd>${r.priority}</dd></div><div><dt>Status</dt><dd>${r.status}</dd></div></dl><form id="review"><label for="note">Review note</label><p class="hint" id="hint">Write one useful observation. This note remains in the page.</p><textarea id="note" rows="4" aria-describedby="hint error"></textarea><p id="error" class="error" hidden>Enter a review note before marking this request reviewed.</p><div class="actions"><button type="submit" class="primary">${r.status==='Open'?'Mark reviewed':'Update review'}</button><button type="button" id="reopen" ${r.status==='Open'?'hidden':''}>Reopen request</button></div></form>`;const note=panel.querySelector('#note');note.value=r.draft??r.note;note.oninput=()=>{r.draft=note.value;document.querySelector('#error').hidden=true;note.removeAttribute('aria-invalid');document.querySelector('#feedback').textContent=''};panel.querySelector('#review').onsubmit=e=>{e.preventDefault();if(!note.value.trim()){document.querySelector('#error').hidden=false;note.setAttribute('aria-invalid','true');note.focus();return}r.note=note.value.trim();r.draft=r.note;r.status='Reviewed';renderQueue();renderDetail();document.querySelector('#feedback').textContent=r.id+' reviewed locally. No record was sent to ServiceNow.';document.querySelector('#record-title')?.focus();};panel.querySelector('#reopen').onclick=()=>{r.status='Open';renderQueue();renderDetail();document.querySelector('#feedback').textContent=r.id+' reopened. The saved review note is retained.';document.querySelector('#record-title')?.focus();};}
document.querySelector('#filter').onchange=()=>{renderQueue();renderDetail();document.querySelector('#feedback').textContent=''};document.querySelector('#clear').onclick=()=>{document.querySelector('#filter').value='All';renderQueue();renderDetail();document.querySelector('#filter').focus()};renderQueue();renderDetail();

Referência de código

  • Todo o comportamento é implementado no código original do aplicativo, não em um componente oficial do Workspace API.

horizon.css — composição original

Referências documentadas de tipografia, espaçamento e raio, com cores originais prefixadas pelo aplicativo.

css
:root{--app-ink:#21342c;--app-action:#285c47;--app-surface:#f2f5f3;--app-border:#c9d3cd;--app-error:#a32424;--app-radius-small:2px;--app-radius-medium:6px;--app-radius-large:8px}*{box-sizing:border-box}body{margin:0;font:16px/1.5 Lato,Arial,sans-serif;color:var(--app-ink);background:var(--app-surface)}main{max-width:1160px;margin:auto;padding:32px}h1,h2,h3{font-family:Cabin,Arial,sans-serif;font-weight:600;line-height:1.25}h1{font-size:32px;margin:8px 0 16px}h2{font-size:24px;margin:8px 0 24px}.eyebrow{font-size:12px;letter-spacing:.08em;font-weight:700}header>p:last-child{max-width:68ch}.toolbar{display:flex;justify-content:space-between;align-items:center;gap:16px;margin:24px 0}.toolbar label{display:flex;gap:12px;align-items:center}select,textarea,button{font:inherit}select{padding:8px;border:1px solid var(--app-border);border-radius:6px;background:white;color:var(--app-ink)}.workspace{display:grid;grid-template-columns:minmax(200px,1fr) minmax(0,2fr);gap:24px}nav{align-self:start}.queue-item{display:grid;gap:8px;width:100%;text-align:left;margin-bottom:12px;background:white;border:1px solid var(--app-border);border-radius:8px;padding:16px;color:var(--app-ink);cursor:pointer}.queue-item[aria-current=true]{border:2px solid var(--app-action);padding:15px;background:#e8f0ea}.queue-item strong{font-size:16px}.record-id,.queue-item>span{font-size:14px}.status{justify-self:start;border-radius:2px;padding:2px 8px;background:#e8eeeb}.status.reviewed{background:#d0ead9}.workspace section{background:white;padding:24px;border:1px solid var(--app-border);border-radius:8px;min-width:0}dl{display:flex;gap:40px;margin:24px 0}dt{font-size:14px;color:#58685f}dd{margin:4px 0;font-weight:700}form>label{font-weight:700}.hint{font-size:14px;margin:8px 0}textarea{width:100%;padding:12px;border:1px solid #6b7f72;border-radius:6px;resize:vertical;color:var(--app-ink)}button{border:1px solid #6b7f72;border-radius:6px;background:white;padding:8px 16px;color:var(--app-ink);cursor:pointer}.primary{background:var(--app-action);color:white;border-color:var(--app-action)}.actions{display:flex;gap:12px;flex-wrap:wrap;margin-top:16px}.error{color:var(--app-error);font-weight:700}.hint,.error{max-width:60ch}#feedback:empty{display:none}#feedback{background:#d0ead9;padding:16px;border-radius:6px}footer{font-size:14px;margin-top:32px;padding-top:24px;border-top:1px solid var(--app-border)}:focus-visible{outline:3px solid #477fd0;outline-offset:3px}[hidden]{display:none!important}@media(max-width:760px){main{padding:20px}.workspace{grid-template-columns:1fr}.toolbar{flex-wrap:wrap}.workspace section{padding:16px}h1{font-size:24px}.eyebrow{overflow-wrap:anywhere}}

Referência de código

  • Não descreva os valores de cores originais como tokens oficiais do Horizon.

index.html — estrutura raiz

O ponto de entrada completo do aplicativo independente.

html
<!doctype html>
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Team review study</title></head><body><div id="root"></div><script type="module" src="/src/main.js"></script></body></html>

Referência de código

  • Substitua o index.html raiz do Vite por este arquivo.
04

Configuração de agente para o sistema de design ServiceNow Horizon

Ponto de partida para implementação

Isso executa apenas o estudo original. Uma implementação nativa no ServiceNow exige o ambiente de desenvolvimento adequado da plataforma.

sh
npm create vite@latest horizon-study -- --template vanilla
cd horizon-study
npm install
npm install @fontsource/[email protected] @fontsource/[email protected]
# Save index.html at root; main.js and horizon.css in src.
npm run dev

Um prompt para seu projeto

Prompt para agente de IA
Crie o estudo original completo de revisão de solicitações usando as referências verificadas do Horizon Workspace para tipografia, espaçamento e raio. Mantenha as cores originais com prefixos do aplicativo. Preserve os rascunhos por registro, valide antes da revisão, atualize a seleção filtrada após mudanças de status, mantenha as notas ao reabrir e ofereça uma opção de recuperação para a lista vazia. Não afirme que há uma conexão ativa com o ServiceNow.
05

Fontes e escopo do sistema de design ServiceNow Horizon

Um estudo original de HTML/CSS OpenDesign, baseado nos fundamentos do Horizon Workspace. Usa os valores documentados de tipografia Cabin/Lato, espaçamento e raio, com cores e lógica de fluxo de trabalho originais. Não é uma instância do ServiceNow nem um ambiente de execução nativo do Workspace.