Diseño de productos empresariales · Nuevo recurso

Sistema de diseño Nord.

Examina los tokens del tema Therapy de Nord y los contratos de Web Component mediante un borrador de solicitud de sala: roles de color reales, campos de tamaño adaptable, validación explícita y resultados preparados localmente.

Guía de OpenDesign8 capítulos38 entradas de referenciaGuía de aplicación original
01

Vista previa de la interfaz de sistema de diseño Nord

Elige entre cinco capacidades de sala, valida un título y prepara un resumen local de la solicitud.

Borrador de solicitud de salaAbrir ejemplo completo
Interpretación sin conexión de los tokens de Nord Therapy en HTML/CSS; la integración nativa de Web Component se muestra por separado. · Referencia de implementación
02

Referencia de diseño de sistema de diseño Nord

Tokens de Nord 9.0.4 y documentación actual de los componentes. Los valores siguientes describen el tema predeterminado Therapy, no todas las marcas de Nordhealth. La documentación pública no concede permiso para usar Nord fuera del ámbito previsto de Nordhealth.

Valores de rol de Therapy

Fuente
Nombre / ReglaValor / ConfiguraciónUso
--n-color-accent#3559c7 Acción principal.
--n-color-text#0c1a3d Contenido principal.
--n-color-text-weak#36434a Texto complementario.
--n-color-background#fafbfb Página.
--n-color-surface#ffffff Panel.
--n-color-border#d8dee4 Separador.
--n-color-border-strong#bcc5cc Borde del control.
--n-color-text-error#d24023 Mensaje de error.

Espaciado

Fuente
Nombre / ReglaValor / ConfiguraciónUso
--n-space-xs4pxAjustado.
--n-space-s8pxRelacionado.
--n-space-m16pxGrupo.
--n-space-l24pxSección.
--n-space-xl36pxGrande.
--n-space-xxl72pxPrincipal.

Tipografía y forma

Fuente
Nombre / ReglaValor / ConfiguraciónUso
--n-font-size-m0.875remTexto del cuerpo.
--n-font-size-l1remTexto grande.
--n-font-size-xl1.25remTítulo de sección.
--n-font-size-xxl1.5remTítulo.
--n-line-height1.5Multiplicador del texto del cuerpo.
--n-line-height-form20pxLínea del control.
--n-font-weight-heading600Encabezado.
--n-border-radius-s3pxControl.
--n-border-radius5pxSuperficie.

Contrato de entrada

Fuente
Nombre / ReglaValor / ConfiguraciónUso
label / hint / errorBuilt-in field textLa entrada independiente incluye su propia etiqueta.
expandBoolean, default falseOcupa todo el ancho del elemento contenedor.
sizes / m / lValor predeterminado: medio.
readonly versus disabledSubmitted versus excludedEl modo de solo lectura sigue permitiendo el foco.
--n-input-inline-size240pxAncho fijo predeterminado; para formularios adaptables, es preferible expandir.

Contrato de Select

Fuente
Nombre / ReglaValor / ConfiguraciónUso
Default slotNative option elementsNo inventes nord-option.
valueStringSelección controlada.
requiredBooleanUsa novalidate y gestiona los errores en la aplicación.
changeUser selection eventLee component.value.
focus()Component methodEspera a que se defina antes de llamar al componente.

Contrato de Button

Fuente
Nombre / ReglaValor / ConfiguraciónUso
typesubmit by defaultEspecifica button para las acciones que no envían el formulario.
variantdefault / primary / dashed / plain / dangerUn botón principal por sección.
hrefCreates anchor semanticsPara navegación.
sizes / m / lValor predeterminado: medio.
loadingBusy presentationCombínalo con un estado anunciado.
03

Guía completa de sistema de diseño Nord

Una guía práctica para elegir, aplicar y revisar este sistema en una interfaz real.

DESIGN-nordhealth.md

Orientación completa, un punto de partida para la implementación y enlaces al código fuente.

Descargar la guía

Nord sistema de diseño Nord es un sistema de producto interno con referencias públicas

Deja claro el uso previsto

La documentación de Nord describe un sistema creado para las experiencias de Nordhealth. Sus componentes, que pueden consultarse públicamente, sirven como referencia, pero este ejemplo no afirma que la marca ni las condiciones de uso de los componentes permitan su reutilización comercial sin restricciones. Los nombres de las salas y el flujo de solicitud de este ejemplo son datos originales creados con fines ilustrativos.

De esta guía de OpenDesign

La tabla de tokens predeterminada corresponde a Therapy. Una aplicación veterinaria o sanitaria debe seleccionar el tema previsto para su uso, en lugar de asumir que un acento azul define todos los productos de Nordhealth. Mantén la decisión sobre el tema en el ámbito de la aplicación.

Consulta la especificación complementaria

Los roles de Therapy de sistema de diseño Nord mantienen la interfaz discreta

Separa los roles del texto, los bordes y las superficies

El ejemplo usa el estilo de texto principal para los detalles de la solicitud y el estilo secundario para las explicaciones. Los paneles blancos se sitúan sobre la página de color blanco roto; un borde más marcado identifica los campos editables. El texto de error aparece junto al título no válido, en lugar de teñir de rojo toda la interfaz. La vista previa no contiene información clínica ni de pacientes.

Consulta la especificación complementaria

Sistema de diseño Nord El texto compacto necesita suficiente interlineado

Usa conjuntamente el tamaño y el interlineado documentados

El token combina un tamaño de texto de 0.875rem con un interlineado de cuerpo de 1.5, mientras que el texto de formulario tiene una caja de línea independiente de 20px. Son reglas distintas: aplicar el valor de formulario a párrafos largos los comprime innecesariamente. La referencia activa usa el token de familia Nordhealth Sans; esta interpretación sin conexión utiliza deliberadamente las fuentes del sistema disponibles, sin afirmar que se haya proporcionado una fuente con licencia.

Consulta la especificación complementaria

Sistema de diseño Nord Expande los controles dentro de la cuadrícula de la aplicación

El componente no determina un punto de quiebre de página

Input comienza con una variable de tamaño en línea de 240px. expand es la forma documentada de ocupar la columna disponible del campo. Nuestro ejemplo coloca la lista de salas junto al editor en escritorio y apila ambos elementos en móviles; ese punto de quiebre es una decisión de la aplicación, no un token de Nord. El nombre de la sala, la capacidad y la etiqueta de disponibilidad siguen visibles al seleccionar una fila.

La lista de salas seleccionables de la interpretación sin conexión es un grupo de botones de opción nativos. El ejemplo de la biblioteca proporcionado por separado utiliza un Select de cinco opciones. Ambos permiten elegir una sala, pero muestran diseños distintos y no se presentan como implementaciones de ejecución idénticas del componente.

Consulta la especificación complementaria

Sistema de diseño Nord Elige un único responsable de las etiquetas y los mensajes de error

Los campos independientes bastan para este formulario

Input o Select pueden mostrar por sí mismos una etiqueta, una indicación y un error. Cuando se usa la composición más reciente de Field, esta asume esas responsabilidades, por lo que duplicar ambos conjuntos produciría indicaciones redundantes. Este ejemplo usa la opción independiente y asigna un único error breve cuando el título, tras quitar los espacios sobrantes, está vacío.

Los campos deshabilitados se excluyen del envío, mientras que los de solo lectura conservan un valor pertinente para el foco y el envío. No deshabilites el identificador de una sala solo para impedir que se edite si aún debe acompañar la solicitud.

  • Mantén visible la etiqueta del título de la solicitud.
  • Usa la indicación para explicar el contenido esperado, no como sustituto de la etiqueta.
  • Asocia el mensaje de validación al control no válido.

Consulta la especificación complementaria

Sistema de diseño Nord Select contiene elementos option estándar

Lee el valor del componente contenedor

El slot predeterminado acepta elementos option nativos. Cada sala tiene un valor estable y una etiqueta visible descriptiva que incluye su capacidad. El evento change indica a la aplicación que vuelva a calcular el resumen a partir del valor del componente contenedor. Esta composición no incluye ninguna etiqueta nord-option personalizada.

Nord recomienda Select para conjuntos de opciones más amplios y botones de opción cuando resulta útil mostrar directamente unas pocas opciones. El ejemplo ofrece cinco salas; la presentación con botones de opción sin conexión facilita distinguir visualmente las capacidades.

Consulta la especificación complementaria

Sistema de diseño Nord Los valores predeterminados de Button afectan a la composición del formulario

Define explícitamente la semántica de acción, enlace y carga

Nord Button tiene type="submit" como valor predeterminado. Por eso, si una acción secundaria de vista previa o similar a un restablecimiento dentro de un formulario no debe enviarlo, necesita un type explícito. Al asignar href al componente, su semántica expuesta cambia a la de un enlace; usa esa opción para navegar, en lugar de imitar un ancla con un controlador click.

El estado de carga mantiene el botón enfocable e impide que se active repetidamente. Su indicador giratorio está oculto para las tecnologías de asistencia, por lo que la aplicación debe comunicar el progreso con palabras. No lo sustituyas indiscriminadamente por disabled: una acción no disponible y una acción en curso tienen necesidades distintas de foco y retroalimentación.

El ejemplo de solicitud de sala realiza un cálculo sincrónico del borrador, por lo que no necesita un intervalo de carga. Su botón principal valida el título y lee la sala elegida; al editar cualquiera de los dos, elimina la frase obsoleta del borrador. Las secciones anteriores sobre Field y Select explican qué API de Nord gestiona esas entradas.

Consulta la especificación complementaria

Sistema de diseño Nord Carga el CSS necesario antes de llamar a los métodos del componente

La carga para prototipos y la compilación para producción son distintas

La guía oficial de inicio rápido combina el módulo del componente con el framework CSS. Este último proporciona los tokens compartidos y los estilos fundamentales. Para una aplicación empaquetada, instala @nordhealth/css y @nordhealth/components, importa CSS una sola vez e importa únicamente los módulos de los componentes que uses. Los módulos del paquete registran sus elementos como efectos secundarios.

React 19 puede usar directamente estos elementos personalizados. Las pautas actuales indican que el wrapper antiguo @nordhealth/react está obsoleto. La representación en servidor no incluye el shadow DOM del componente; las importaciones de Next.js necesitan la frontera de cliente. Mantén estas limitaciones de integración separadas de la vista previa HTML sin conexión, cuyas interacciones funcionan sin la biblioteca.

  1. Carga el framework CSS antes que los módulos de los componentes.
  2. Espera a que se resuelva customElements.whenDefined antes de llamar a focus durante la inicialización.
  3. Añade controladores para la validación y el estado local.
  4. Incluye las dependencias de producción en el paquete en lugar de depender de numerosas solicitudes de módulos a CDN.

Consulta la especificación complementaria

Sistema de diseño Nord Ejemplos de componentes del sistema de diseño Nord

Muestra interactiva independiente completa

Guarda el documento completo como index.html y ábrelo en un navegador. Interpretación sin conexión de los tokens del sistema de diseño Nord Therapy mediante HTML/CSS; la integración nativa de Web Components se muestra por separado.

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>

Referencia de código

  • Este ejemplo presenta las opciones de sala como botones de opción; el ejemplo nativo de Nord usa Select con elementos option estándar. Ninguno reserva una sala real.

Una solicitud de sala con etiqueta y validación explícita

nord-input y nord-select independientes muestran etiquetas sin la familia Field opcional. El envío lee los valores de los componentes y asigna la propiedad de error del campo de entrada.

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>

Referencia de código

  • Cinco opciones de sala hacen de Select una opción compacta y práctica.
  • Button envía el formulario de forma predeterminada; este ejemplo especifica type explícitamente.
  • Se espera a que se registren los elementos personalizados antes de usar sus métodos. No se llama a ningún servicio de reservas.
04

Sistema de diseño Nord Configuración del agente

Punto de partida para la implementación

Prototipo completo en CDN público para uso autorizado de Nordhealth. La documentación especifica actualmente CSS 5.2.4 y componentes 5.3.0. En producción, se deben incluir los paquetes npm en el bundle; la interpretación visual sin conexión que aparece a continuación no carga estos paquetes 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>

Una instrucción para tu proyecto

Instrucción para el agente
Usa los roles semánticos de Nord Therapy con controles etiquetados. Muestra los campos dentro de un diseño adaptable para aplicaciones. Valida el título de la solicitud después de quitar los espacios iniciales y finales, conserva una sola sala seleccionada y muestra únicamente el resultado de un borrador local. Para una implementación real de Nordhealth, respeta los permisos documentados para paquetes y temas.
05

Sistema de diseño Nord Fuentes y alcance

Referencia independiente OpenDesign. Nord indica que su uso previsto es en productos de Nordhealth. Esta interpretación original HTML no reserva una sala ni concede derechos de uso de la marca o los componentes.