Design de produto empresarial · Novo recurso

Sistema de design Nord.

Inspecione os tokens do tema Therapy do Nord e os contratos de Web Components por meio de um rascunho de solicitação de sala: funções de cor reais, dimensionamento responsivo de campos, validação explícita e resultados preparados localmente.

Guia OpenDesign8 capítulos38 entradas de referênciaGuia de aplicação original
01

Sistema de design Nord Prévia da interface

Escolha entre cinco capacidades de sala, valide um título e prepare um resumo local da solicitação.

Rascunho de solicitação de salaAbrir exemplo completo
Interpretação offline de tokens de Terapia do Nord HTML/CSS; a integração nativa de Web Component é apresentada separadamente. · Referência de implementação
02

Sistema de design Nord Referência de design

Tokens Nord 9.0.4 e documentação atual dos componentes. Os valores abaixo descrevem o tema padrão Therapy, não todas as marcas Nordhealth. A documentação pública não concede permissão para usar Nord fora do escopo previsto para Nordhealth.

Valores de função do Therapy

Fonte
Nome / RegraValor / ConfiguraçãoUso
--n-color-accent#3559c7 Ação primária.
--n-color-text#0c1a3d Conteúdo principal.
--n-color-text-weak#36434a Texto de apoio.
--n-color-background#fafbfb Página.
--n-color-surface#ffffff Painel.
--n-color-border#d8dee4 Divisor.
--n-color-border-strong#bcc5cc Borda do controle.
--n-color-text-error#d24023 Mensagem de erro.

Espaçamento

Fonte
Nome / RegraValor / ConfiguraçãoUso
--n-space-xs4pxEstreito.
--n-space-s8pxRelacionado.
--n-space-m16pxGrupo.
--n-space-l24pxSeção.
--n-space-xl36pxGrande.
--n-space-xxl72pxMaior.

Tipografia e formas

Fonte
Nome / RegraValor / ConfiguraçãoUso
--n-font-size-m0.875remTexto do corpo.
--n-font-size-l1remTexto grande.
--n-font-size-xl1.25remTítulo da seção.
--n-font-size-xxl1.5remTítulo.
--n-line-height1.5Multiplicador do corpo do texto.
--n-line-height-form20pxEspessura da linha do controle.
--n-font-weight-heading600Cabeçalho.
--n-border-radius-s3pxControle.
--n-border-radius5pxSuperfície.

Contrato do campo de entrada

Fonte
Nome / RegraValor / ConfiguraçãoUso
label / hint / errorBuilt-in field textO campo de entrada independente tem um rótulo próprio.
expandBoolean, default falseOcupar a largura do contêiner.
sizes / m / lMédio por padrão.
readonly versus disabledSubmitted versus excludedO campo somente para leitura continua recebendo foco.
--n-input-inline-size240pxLargura fixa por padrão; prefira expandir para formulários responsivos.

Contrato do seletor

Fonte
Nome / RegraValor / ConfiguraçãoUso
Default slotNative option elementsNão invente nord-option.
valueStringSeleção controlada.
requiredBooleanUse novalidate e mensagens de erro da aplicação.
changeUser selection eventLeia component.value.
focus()Component methodAguarde a definição antes de chamar o método.

Contrato do botão

Fonte
Nome / RegraValor / ConfiguraçãoUso
typesubmit by defaultEspecifique button para ações que não enviam o formulário.
variantdefault / primary / dashed / plain / dangerUse apenas um primário por seção.
hrefCreates anchor semanticsPara navegação.
sizes / m / lMédio por padrão.
loadingBusy presentationAssocie a um status anunciado.
03

Sistema de design Nord Guia completo

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

DESIGN-nordhealth.md

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

Baixar o guia

Sistema de design Nord Nord é um sistema interno de produto com referências públicas

Deixe claro o uso previsto

A documentação do Nord descreve um sistema desenvolvido para as experiências Nordhealth. Seus componentes disponíveis para consulta pública são referências úteis, mas o exemplo não afirma que os termos da marca ou dos componentes permitam reutilização comercial irrestrita. Os nomes das salas e o fluxo de solicitação apresentados aqui são dados originais de demonstração.

Com base neste guia de OpenDesign

A tabela de tokens padrão representa o Therapy. Uma aplicação veterinária ou de saúde deve selecionar o tema previsto para ela, em vez de presumir que um destaque azul define todos os produtos Nordhealth. Mantenha a escolha do tema no nível da aplicação.

Consulte a especificação de apoio

Sistema de design Nord As funções do Therapy mantêm o espaço de trabalho discreto

Separe as funções de texto, borda e superfície

O exemplo usa a função de texto principal para os detalhes da solicitação e uma função mais suave para as explicações. Painéis brancos ficam sobre a página em tom quase branco; uma borda mais forte identifica os campos editáveis. O texto de erro aparece ao lado do título inválido, em vez de tingir toda a interface de vermelho. A prévia não contém informações clínicas nem dados de pacientes.

Consulte a especificação de apoio

Sistema de design Nord Textos compactos precisam de espaço entre linhas suficiente

Use em conjunto o tamanho e o espaçamento entre linhas documentados.

O token combina um tamanho de corpo de 0.875rem com uma altura de linha de 1.5, enquanto o texto de formulário tem uma caixa de linha separada de 20px. São regras diferentes: aplicar o valor do formulário a parágrafos longos os comprime desnecessariamente. A referência em uso utiliza o token da família Nordhealth Sans; esta interpretação offline usa deliberadamente fontes do sistema disponíveis, sem afirmar que uma fonte licenciada foi fornecida.

Consulte a especificação de apoio

Sistema de design Nord Expanda os controles dentro da grade da aplicação

O componente não define o breakpoint da página

O Input começa com uma variável inline-size de 240px. expand é a forma documentada de ocupar a coluna disponível do campo. Nosso exemplo coloca a lista de salas ao lado do editor no desktop e empilha os dois no celular; esse breakpoint é uma decisão da aplicação, não um token Nord. O nome da sala, a capacidade e o rótulo de disponibilidade continuam visíveis quando uma linha é selecionada.

A lista de salas selecionadas nesta interpretação offline é um grupo de opções de rádio nativo. O exemplo de biblioteca fornecido separadamente usa um Select com cinco opções. Ambos permitem escolher uma sala, mas demonstram layouts diferentes e não são apresentados como implementações idênticas em tempo de execução do componente.

Consulte a especificação de apoio

Sistema de design Nord Escolha uma única fonte para rótulos e mensagens de erro

Campos independentes bastam para este formulário

Um Input ou Select pode exibir o próprio rótulo, dica e erro. A composição Field mais recente assume essas responsabilidades quando é usada; duplicar os dois conjuntos geraria instruções redundantes. Este exemplo usa a abordagem independente e atribui um único erro curto quando o título, após remover espaços em branco, está vazio.

Os campos desativados são removidos do envio, enquanto os campos somente leitura preservam um valor relevante para foco e envio. Não desative um identificador de sala apenas para impedir a edição se ele ainda precisar acompanhar a solicitação.

  • Mantenha visível o rótulo do título da solicitação.
  • Use a dica para indicar o conteúdo esperado, não como substituto do rótulo.
  • Associe a mensagem de validação ao controle inválido.

Consulte a especificação de apoio

Sistema de design Nord Select contém elementos option comuns

Leia o valor do componente host

O slot padrão aceita elementos option nativos. Cada sala tem um valor estável e um rótulo descritivo visível que inclui sua capacidade. O evento change informa à aplicação que ela deve recalcular o resumo com base no valor do host. Essa composição não usa uma tag nord-option personalizada.

A Nord recomenda Select para conjuntos maiores de opções e botões de rádio quando é útil exibir algumas opções diretamente. O exemplo oferece cinco salas; a apresentação offline com opções de rádio facilita a comparação visual das capacidades.

Consulte a especificação de apoio

Sistema de design Nord Os valores padrão de Button afetam a composição do formulário

Defina explicitamente a semântica da ação, do link e do carregamento

Por padrão, Nord Button usa type="submit". Portanto, uma ação secundária de pré-visualização ou semelhante a uma redefinição dentro de um formulário precisa de um type explícito quando não deve enviá-lo. Definir href no componente altera sua semântica para a de um link; use essa opção para navegação em vez de um manipulador de clique que imite uma âncora.

O estado de carregamento mantém o botão focalizável e impede ativações repetidas. O indicador de carregamento fica oculto para tecnologias assistivas, portanto a aplicação deve comunicar o progresso por escrito. Não use disabled indiscriminadamente: uma ação indisponível e uma ação em andamento têm necessidades diferentes de foco e feedback.

O exemplo de solicitação de sala calcula um rascunho de forma síncrona, portanto não precisa de um intervalo de carregamento. O botão principal valida o título e lê a sala selecionada; qualquer alteração em um deles remove a frase desatualizada do rascunho. As seções acima sobre campos e Select explicam quais APIs Nord controlam essas entradas.

Consulte a especificação de apoio

Sistema de design Nord Carregue o CSS necessário antes de chamar métodos dos componentes

O carregamento para protótipos e a geração do pacote de produção são diferentes

O início rápido oficial combina o módulo do componente com o framework CSS. Este fornece tokens compartilhados e estilos fundamentais. Em uma aplicação empacotada, instale @nordhealth/css e @nordhealth/components, importe o CSS uma vez e importe apenas os módulos dos componentes usados. Os módulos dos pacotes registram seus elementos como efeitos colaterais.

React 19 pode usar esses elementos personalizados diretamente. O wrapper @nordhealth/react mais antigo está obsoleto nas orientações atuais. A renderização no servidor não inclui o shadow DOM do componente; as importações no Next.js precisam da fronteira de cliente. Mantenha essas limitações de integração separadas da pré-visualização offline HTML, cujas interações funcionam sem a biblioteca.

  1. Carregue o framework CSS antes dos módulos dos componentes.
  2. Aguarde customElements.whenDefined antes de chamar focus durante a inicialização.
  3. Adicione manipuladores de validação e estado local.
  4. Agrupe as dependências de produção em vez de depender de várias solicitações de módulos por CDN.

Consulte a especificação de apoio

Sistema de design Nord Exemplos de componentes do sistema de design

Exemplo interativo completo e independente

Salve o documento completo como index.html e abra-o em um navegador. Interpretação offline HTML/CSS dos tokens Nord Therapy; a integração nativa com Web Components é apresentada separadamente.

html
<!doctype html><html lang="en"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Nord room request interpretation</title><style>*{box-sizing:border-box}body{margin:0;background:#fafbfb;color:#0c1a3d;font:14px/1.5 system-ui,sans-serif}button,input{font:inherit}header{height:52px;background:white;border-bottom:1px solid #d8dee4;padding:0 24px;display:flex;align-items:center;justify-content:space-between}header small{color:#36434a}main{max-width:960px;margin:36px auto;padding:0 24px}h1{font-size:24px;line-height:1.2;margin:0 0 8px}h2{font-size:20px;line-height:1.2;margin:0 0 16px}p{margin:0 0 24px}.muted{color:#36434a}.layout{display:grid;grid-template-columns:310px 1fr;gap:24px}.panel{background:white;border:1px solid #d8dee4;border-radius:5px;padding:24px}fieldset{margin:0;padding:0;border:0;min-width:0}legend{font-weight:600;margin-bottom:16px}.room{display:flex;gap:12px;padding:12px;border:1px solid #d8dee4;border-radius:3px;margin-bottom:8px;cursor:pointer;align-items:center}.room:has(:checked){border-color:#3559c7;background:#f0f4ff}.room input{accent-color:#3559c7}.room span{flex:1}.room small{display:block;color:#36434a}.room b{font-size:12px;font-weight:500}.diagram{height:120px;background:#f6f8f8;display:grid;place-items:center;margin:-24px -24px 24px;border-radius:5px 5px 0 0;border-bottom:1px solid #d8dee4}.table{height:50px;border:2px solid #bcc5cc;border-radius:5px;background:#fff;position:relative;transition:width .2s ease}.chair{position:absolute;width:12px;height:10px;border:1px solid #bcc5cc;background:white;border-radius:3px;top:-16px}.chair.bottom{top:auto;bottom:-16px}label.field{display:block;font-weight:600;margin:16px 0 8px}#title{width:100%;border:1px solid #bcc5cc;border-radius:3px;height:36px;padding:7px 12px;color:inherit;background:white}#title[aria-invalid=true]{border-color:#d24023}.error{color:#d24023;min-height:20px;font-size:12px;margin:4px 0 12px}button{background:#3559c7;color:white;border:1px solid transparent;box-shadow:0 1px 3px #0c0c0c17;border-radius:3px;padding:7px 16px;cursor:pointer}button:focus-visible,input:focus-visible{outline:2px solid #3559c7;outline-offset:3px}.summary{margin-top:24px;background:#f0f4ff;border:1px solid #c6d4f9;padding:16px;border-radius:5px;overflow-wrap:anywhere}.summary:empty{display:none}.boundary{font-size:12px;color:#36434a;margin-top:24px}#selected{font-weight:600}.facts{display:flex;gap:24px;margin-bottom:24px}.facts strong{font-size:20px;display:block}.facts span{font-size:12px;color:#36434a}@media(max-width:650px){main{margin:24px auto;padding:0 16px}.layout{grid-template-columns:1fr;gap:16px}.panel{padding:16px}.diagram{margin:-16px -16px 16px}.room{padding:8px 12px}header{padding:0 16px}header small{display:none}}</style><header><strong>◈ Workplace</strong><small>Room request workspace</small></header><main><h1>A room for your next conversation</h1><p class="muted">Choose a room and prepare a request draft.</p><div class="layout"><section class="panel"><fieldset><legend>Choose a room</legend><div id="rooms"></div></fieldset></section><section class="panel"><div class="diagram" aria-hidden="true"><div class="table" id="table"></div></div><h2 id="selected">Birch</h2><div class="facts"><div><strong id="capacity">4</strong><span>Seats</span></div><div><strong>Draft</strong><span>Request status</span></div></div><form novalidate><label class="field" for="title">Request title</label><input id="title" type="text" aria-describedby="hint error" placeholder="e.g. Design review"><div id="error" class="error" role="alert"></div><p id="hint" class="muted">Use a non-sensitive meeting title. Availability is not checked in this example.</p><button type="submit">Prepare request</button></form><div class="summary" id="result" role="status"></div></section></div><p class="boundary">Independent HTML interpretation of Nord Therapy tokens. Nord is intended for Nordhealth products. This example creates a local draft only; it does not reserve a room.</p></main><script>const rooms=[['Birch',4],['Cedar',6],['Elm',8],['Maple',10],['Pine',12]],field=document.querySelector('#title'),result=document.querySelector('#result');let selected=0;document.querySelector('#rooms').innerHTML=rooms.map(([name,n],i)=>`<label class="room"><input type="radio" name="room" value="${i}" ${i===0?'checked':''}><span>${name}<small>Meeting room</small></span><b>${n} seats</b></label>`).join('');function update(){let [name,n]=rooms[selected];document.querySelector('#selected').textContent=name;document.querySelector('#capacity').textContent=n;let table=document.querySelector('#table');table.style.width=(n*12+44)+'px';table.innerHTML=Array.from({length:n},(_,i)=>`<i class="chair ${i>=n/2?'bottom':''}" style="left:${12+(i%(n/2))*24}px"></i>`).join('');result.textContent=''}document.querySelectorAll('[name=room]').forEach(input=>input.onchange=()=>{selected=Number(input.value);update()});document.querySelector('form').onsubmit=e=>{e.preventDefault();if(!field.value.trim()){document.querySelector('#error').textContent='Enter a request title.';field.setAttribute('aria-invalid','true');field.focus();return}result.textContent='Draft prepared: '+field.value.trim()+' · '+rooms[selected][0]+' · '+rooms[selected][1]+' seats. No room is reserved.'};field.oninput=()=>{field.removeAttribute('aria-invalid');document.querySelector('#error').textContent='';result.textContent=''};update();</script></html>

Referência de código

  • Este exemplo exibe as opções de sala como botões de rádio; o exemplo nativo da Nord usa Select com elementos option comuns. Nenhum deles reserva uma sala de verdade.

Uma solicitação de sala com rótulo e validação explícita

nord-input e nord-select independentes fornecem rótulos sem a família Field opcional. O envio lê os valores dos componentes e define a propriedade de erro do input.

html
<!doctype html>
<html lang="en"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Room request draft</title>
<link rel="stylesheet" href="https://nordcdn.net/ds/css/5.2.4/nord.min.css">
<script type="module" src="https://nordcdn.net/ds/components/5.3.0/index.js"></script>
<style>main{max-width:560px;margin:auto;padding:var(--n-space-l)}form{display:grid;gap:var(--n-space-l)}</style>
<main><h1>Prepare a room request</h1><p>For an authorized Nordhealth product. Local demonstration only.</p>
<form novalidate>
<nord-input id="request" name="request" label="Request title" hint="Use a non-sensitive meeting title." required expand></nord-input>
<nord-select id="room" name="room" label="Room" value="Birch" expand>
<option value="Birch">Birch · 4 seats</option><option value="Cedar">Cedar · 6 seats</option>
<option value="Elm">Elm · 8 seats</option><option value="Maple">Maple · 10 seats</option><option value="Pine">Pine · 12 seats</option>
</nord-select>
<nord-button type="submit" variant="primary">Prepare request</nord-button>
</form><p id="result" role="status"></p></main>
<script type="module">
await Promise.all(['nord-input','nord-select','nord-button'].map(name=>customElements.whenDefined(name)));
const form=document.querySelector('form'), title=document.querySelector('#request'),room=document.querySelector('#room'),result=document.querySelector('#result');
form.addEventListener('submit',event=>{
 event.preventDefault();title.error=title.value.trim()?'':'Enter a request title.';
 if(title.error){title.focus();return;}
 result.textContent=`Draft: ${title.value.trim()} in ${room.value}. No room is reserved.`;
});
form.addEventListener('input',()=>{result.textContent='';title.error='';});
form.addEventListener('change',()=>{result.textContent='';});
</script></html>

Referência de código

  • Cinco opções de sala tornam Select uma escolha compacta útil.
  • Button usa submit por padrão; este exemplo declara o type explicitamente.
  • Os elementos personalizados são aguardados antes do uso de seus métodos. Nenhum serviço de reserva é chamado.
04

Sistema de design Nord Configuração do agente

Ponto de partida para implementação

Protótipo completo usando CDN público para uso autorizado da Nordhealth. A documentação especifica atualmente CSS 5.2.4 e components 5.3.0. Em produção, os pacotes npm devem ser agrupados; a interpretação visual offline abaixo não carrega esses pacotes remotos.

html
<!doctype html>
<html lang="en"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Room request draft</title>
<link rel="stylesheet" href="https://nordcdn.net/ds/css/5.2.4/nord.min.css">
<script type="module" src="https://nordcdn.net/ds/components/5.3.0/index.js"></script>
<style>main{max-width:560px;margin:auto;padding:var(--n-space-l)}form{display:grid;gap:var(--n-space-l)}</style>
<main><h1>Prepare a room request</h1><p>For an authorized Nordhealth product. Local demonstration only.</p>
<form novalidate>
<nord-input id="request" name="request" label="Request title" hint="Use a non-sensitive meeting title." required expand></nord-input>
<nord-select id="room" name="room" label="Room" value="Birch" expand>
<option value="Birch">Birch · 4 seats</option><option value="Cedar">Cedar · 6 seats</option>
<option value="Elm">Elm · 8 seats</option><option value="Maple">Maple · 10 seats</option><option value="Pine">Pine · 12 seats</option>
</nord-select>
<nord-button type="submit" variant="primary">Prepare request</nord-button>
</form><p id="result" role="status"></p></main>
<script type="module">
await Promise.all(['nord-input','nord-select','nord-button'].map(name=>customElements.whenDefined(name)));
const form=document.querySelector('form'), title=document.querySelector('#request'),room=document.querySelector('#room'),result=document.querySelector('#result');
form.addEventListener('submit',event=>{
 event.preventDefault();title.error=title.value.trim()?'':'Enter a request title.';
 if(title.error){title.focus();return;}
 result.textContent=`Draft: ${title.value.trim()} in ${room.value}. No room is reserved.`;
});
form.addEventListener('input',()=>{result.textContent='';title.error='';});
form.addEventListener('change',()=>{result.textContent='';});
</script></html>

Um prompt para seu projeto

Prompt para agente de IA
Use as funções semânticas do Nord Therapy com controles rotulados. Expanda os campos em um layout de aplicação responsivo. Valide o título da solicitação após remover espaços em branco, mantenha uma única sala selecionada e mostre apenas o resultado de um rascunho local. Para uma implementação real da Nordhealth, use as permissões documentadas para pacotes e temas.
05

Sistema de design Nord Fontes e escopo

Referência independente de OpenDesign. A Nord informa que o uso previsto é nos produtos Nordhealth. Esta interpretação original de HTML não reserva uma sala nem concede direitos de uso da marca ou dos componentes.