Design de produto empresarial · Novo recurso

Sistema de design Maersk.

Conheça a linguagem de interface operacional da Maersk por meio das funções reais do tema claro, das escalas de títulos e textos, dos raios aninhados e do tratamento de identificadores. Uma consulta de remessa de exemplo demonstra a correspondência exata de referências e um histórico de eventos acessível, sem alegar acesso a dados logísticos em tempo real.

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

Prévia da interface sistema de design Maersk

Consulte duas referências de exemplo originais, confira o histórico de uma rota e diferencie uma consulta malformada de um registro inexistente.

Consulta de remessa de exemploAbrir exemplo completo
Interpretação nativa e offline original de HTML, baseada nas funções e no espaçamento documentados do tema claro da Maersk. Sem ambiente de execução privado do MDS, arquivos de fontes da marca ou conexão com remessas em tempo real. · Referência de implementação
02

Referência de design sistema de design Maersk

Documentação pública sobre os fundamentos do MDS e o uso de componentes. Os pacotes de componentes nativos ficam em registros privados da Maersk; o exemplo executável usa HTML nativo e um conjunto documentado de tokens, não APIs mc-* inventadas.

Funções claras da Maersk

Fonte
Nome / RegraValor / ConfiguraçãoUso
--mds_brand_appearance_primary_default_background-color#141414 Ação principal preenchida.
--mds_brand_appearance_primary_default_on-background-color#FFFFFF Texto sobre o preenchimento principal.
--mds_brand_appearance_primary_default_link-color#0077B2 Texto do link.
--mds_brand_appearance_secondary_default_background-color#42B0D5 Preenchimento secundário da marca.
--mds_brand_appearance_secondary_default_on-background-color#141414 Texto sobre o preenchimento secundário.
--mds_brand_appearance_secondary_weak_background-color#E2F3F9 Superfície secundária sutil.
--mds_brand_appearance_neutral_default_border-color#D4D4D4 Borda padrão.
--mds_brand_appearance_neutral_weakest_text-color#6A6A6A Texto de apoio.
--mds_brand_appearance_neutral_weakest_background-color#F7F7F7 Superfície sutil da página.

Escala de texto

Fonte
Nome / RegraValor / ConfiguraçãoUso
--mds_brand_typography_text_font-familyMaersk TextFonte nativa da marca.
text_large desktop/mobile18px / 28px line heightIgual nas duas plataformas.
text_medium desktop/mobile16px / 24px line heightTamanho padrão para leitura.
text_small desktop/mobile14px / 20px line heightMetadados compactos.
text_x-small desktop/mobile12px / 16px line heightMenor tamanho de referência.
normal / light / medium / semibold / bold400 / 300 / 500 / 600 / 700Pesos de fonte documentados.

Escala de títulos

Fonte
Nome / RegraValor / ConfiguraçãoUso
headline_large desktop50px / 56px, weight 300Título grande de destaque.
headline_large mobile38px / 38px, weight 300Versão equivalente para dispositivos móveis.
headline_medium desktop40px / 40px, weight 300Título da página.
headline_medium mobile26px / 32px, weight 300Título da página em dispositivos móveis.
headline_small desktop26px / 32px, weight 400Título da seção.
headline_small mobile22px / 26px, weight 400Título de seção em dispositivos móveis.
headline_x-small desktop/mobile20px / 24px, weight 400Título pequeno.

Raios dos cantos

Fonte
Nome / RegraValor / ConfiguraçãoUso
radius-xs2pxElementos aninhados pequenos.
radius-sm4pxElementos do tamanho de uma caixa de seleção.
radius-md6pxBotões e campos de entrada.
radius-lg8pxNotificações e tabelas.
radius-xl12pxCartões com controles aninhados.
radius-2xl16pxImagens grandes e diálogos.
radius-full9999pxFormas totalmente arredondadas.

Espaçamento e densidade

Fonte
Nome / RegraValor / ConfiguraçãoUso
Base rhythm4px multiplesPreenchimento interno, margens e intervalos.
Fine component exceptions2px, 6px, 10pxAlinhamento de componentes pequenos.
Responsive dimensionsNot required to be divisible by 4Mantenha o espaçamento entre elementos irmãos alinhado ao ritmo.

Hierarquia de ações

Fonte
Nome / RegraValor / ConfiguraçãoUso
Primary actionPrimary + FilledUma única ação principal.
Secondary actionNeutral + OutlinedAção complementar em um formulário aberto.
Tertiary actionNeutral + PlainLimpar, redefinir ou expandir uma seção repetida.
Secondary in a dialogNeutral + FilledEvite contornos concorrentes.
Brand hero exceptionSecondary + FilledNão é a ação padrão do formulário.
03

Guia completo sistema de design Maersk

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

DESIGN-maersk.md

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

Baixar o guia

Regras públicas e componentes privados são recursos diferentes de sistema de design Maersk

Escolha com transparência o caminho de adoção

O MDS disponibiliza publicamente orientações abrangentes sobre fundamentos e uso, enquanto seu guia para desenvolvedores indica que os pacotes estão em repositórios privados do Maersk Global GitHub Packages e do Nexus. Consultar a página de um componente não concede direitos de acesso aos pacotes nem de distribuição das fontes.

Com base neste guia de OpenDesign

As equipes autorizadas devem usar o pacote e o Storybook associados à configuração corporativa. Esta referência pública oferece, em vez disso, uma implementação nativa completa de HTML com as regras visíveis, permitindo examinar o comportamento sem recorrer a um comando de instalação público fictício.

  1. Confirme o acesso ao registro corporativo antes de optar pelo pacote nativo.
  2. Confira se a documentação do componente corresponde à versão instalada.
  3. Use o exemplo original de HTML para explorar publicamente, sem dependências privadas.

Consulte a especificação de apoio

Entenda a função antes de reconhecer a cor da marca de sistema de design Maersk

A ação principal é escura no tema claro

O azul da Maersk é reconhecível, mas a função de preenchimento principal do tema claro é #141414, com texto branco sobre a cor de fundo. A função de preenchimento secundário é #42B0D5, com texto escuro. Essa distinção evita que todos os controles se tornem detalhes de destaque em cores vivas da marca.

A ação principal de consulta do exemplo usa a função principal escura. Uma superfície secundária clara emoldura o estudo da rota, e bordas neutras organizam os registros complementares. Os nomes dos tokens codificam profundidade, item, variante, plataforma, estado e atributo, mantendo a função compreensível quando o tema muda.

Consulte a especificação de apoio

Separe o caráter dos títulos da legibilidade do texto em sistema de design Maersk

Use os pares específicos para desktop e dispositivos móveis

Maersk Headline e Maersk Text têm propósitos distintos. Um título médio muda de 40/40 no desktop para 26/32 em dispositivos móveis, enquanto o texto corrido médio permanece em 16/24. Aplicar uma única escala percentual a todos os estilos de texto não respeitaria essa diferença intencional.

A prévia original usa Arial, pois não redistribui arquivos de fontes da marca. Ela segue a hierarquia de tamanhos documentada: título de página leve, rótulos de seção claros e metadados de eventos legíveis de 14px. Os identificadores de referência permanecem como texto selecionável para que seja possível conferir os zeros à esquerda e copiar a sequência exata.

Consulte a especificação de apoio

Sistema de design Maersk A densidade vem do espaçamento, não da omissão de informações

Preserve as relações em uma interface operacional compacta

O MDS usa um ritmo de espaçamento de quatro pixels, com exceções de 2, 6 e 10px para o alinhamento detalhado dos componentes. Os tokens de densidade oferecem os modos Padrão, Compacto e Espaçoso, mas não se deve deduzir um valor de densidade específico de um pacote apenas com base nesses nomes.

Os intervalos de 8px e 16px do exemplo agrupam rótulos, eventos e metadados; os de 24px e 32px separam áreas maiores. Em telas estreitas, a rota e o histórico de eventos ficam empilhados. As informações continuam presentes, em vez de desaparecerem para deixar uma captura de tela pequena mais limpa.

Consulte a especificação de apoio

Contêineres externos precisam de espaço para os controles internos em sistema de design Maersk

A escala de raios comunica o aninhamento

Os cartões usam a referência de 12px; botões e campos, 6px; e imagens grandes ou diálogos, 16px. As orientações sobre raio dos cantos indicam explicitamente que o contêiner externo deve ter um raio maior quando contém outro componente.

No exemplo, a ilustração da rota fica dentro de um cartão arredondado, enquanto o campo de consulta tem um formato mais compacto. A borda funciona como separador estrutural, não como contorno decorativo em torno de cada linha de texto. A borda global documentada é uma linha sólida de um pixel.

Consulte a especificação de apoio

Um número de remessa é um identificador, não uma quantidade de sistema de design Maersk

Não deixe que um campo numérico altere a referência

As orientações de entrada do MDS diferenciam quantidades de identificadores, como números de contêiner e números de referência. Um campo numérico pode remover zeros à esquerda ou sofrer alterações por um clique acidental nas setas. Por isso, o exemplo usa type="text" com inputmode="numeric" e chaves de texto exatas.

O formato de seis dígitos é uma restrição original do exemplo, não uma especificação de número de remessa da Maersk. Entradas vazias ou malformadas recebem uma mensagem de correção específica; referências bem formadas, mas desconhecidas, recebem uma mensagem distinta de nenhum resultado. Esses casos nunca devem ser reduzidos a um erro genérico de entrada inválida.

  • Mantenha o rótulo acima do campo.
  • Preserve todos os dígitos do identificador como texto.
  • Associe as instruções de formato e o texto do erro com aria-describedby.
  • Defina aria-invalid apenas para erros de formato, não para registros válidos desconhecidos.

Consulte a especificação de apoio

Mantenha a consulta principal separada dos atalhos de exemplo em sistema de design Maersk

Use verbos no imperativo e em caixa de frase, com resultados concretos

Consultar remessa é a única ação preenchida. Os atalhos de referência de exemplo têm pouco destaque e preenchem a mesma consulta, em vez de concorrerem entre si como vários botões principais. Em um formulário aberto, a ação principal vem antes da ação complementar na ordem de navegação pelo teclado e de leitura.

A prévia mostra o histórico de eventos do exemplo selecionado como uma lista ordenada. Os rótulos dos eventos indicam o status por extenso, de modo que o marcador azul e a linha de conexão são apenas elementos complementares. O registro é explicitamente fictício; nenhum horário estimado de chegada ou trajeto é apresentado como informação operacional em tempo real.

Consulte a especificação de apoio

Um tema escuro precisa de valores semânticos próprios em sistema de design Maersk

Evite inverter uma captura de tela

A tabela pública do tema escuro altera o texto principal para #F0F0F0 e o preenchimento principal para branco, enquanto a superfície neutra passa a ser #141414. São mapeamentos intencionais de funções, não uma instrução para inverter cada valor RGB.

Este exemplo permanece no tema claro documentado. Para estendê-lo ao modo escuro, é necessário substituir o conjunto de funções de cor de forma coerente, incluindo cores de hover, borda e conteúdo sobre fundos. O diagrama de rotas original precisaria então de uma análise de contraste separada, em vez de herdar um filtro global.

Consulte a especificação de apoio

Exemplos de componentes do sistema de design sistema de design Maersk

Exemplo interativo completo e independente

Salve o documento completo como index.html e abra-o em um navegador. Interpretação nativa original e offline de HTML, com as funções de cor claras e os espaçamentos documentados da Maersk. Sem o runtime privado do MDS, arquivos de fontes da marca ou conexão ativa com remessas.

html
<!doctype html><html lang="en"><meta charset="utf-8"><meta name="viewport" content="width=device-width"><title>Sample shipment lookup</title><style>*{box-sizing:border-box}body{font:16px/24px Arial,sans-serif;background:#f7f7f7;color:#141414;margin:0}button,input{font:inherit}button{cursor:pointer}button:focus-visible,input:focus-visible{outline:3px solid #0077b2;outline-offset:3px}header{background:#fff;padding:20px 32px;display:flex;justify-content:space-between;gap:16px;border-bottom:1px solid #d4d4d4}header b{font-weight:500;letter-spacing:1px}header span{font-size:12px;color:#6a6a6a}main{max-width:1120px;margin:auto;padding:32px}h1{font-size:40px;line-height:40px;font-weight:300;margin:8px 0 16px}p{margin:0 0 16px}.subtitle{color:#6a6a6a}.search{background:#fff;border:1px solid #d4d4d4;padding:24px;border-radius:12px;margin:24px 0}.search label{display:block;margin-bottom:8px}.entry{display:flex;gap:8px}.entry input{border:1px solid #8a8a8a;border-radius:6px;padding:12px 16px;max-width:360px;min-width:0;width:100%;background:#fff;color:#141414}.entry button{border:0;background:#141414;color:#fff;border-radius:6px;padding:12px 24px}.hint{font-size:14px;color:#6a6a6a;margin:8px 0 0}.error{color:#b80012;margin:8px 0 0}.error:empty{display:none}.layout{display:grid;grid-template-columns:250px 1fr;gap:24px}aside{background:#fff;border-radius:12px;border:1px solid #d4d4d4;padding:24px}aside h2{font-size:20px;line-height:24px;font-weight:400;margin:0 0 16px}.record{display:block;text-align:left;background:none;border:0;border-top:1px solid #e2e2e2;padding:16px 0;width:100%;color:#141414}.record strong,.record small{display:block}.record strong{font-size:16px;font-weight:500}.record small{color:#6a6a6a;font-size:12px;margin-top:4px}.record[aria-pressed=true]{color:#0077b2}.record[aria-pressed=true] strong:after{content:' →'}.detail{background:#fff;border:1px solid #d4d4d4;border-radius:12px;padding:24px;min-width:0}.detail h2{font-size:26px;line-height:32px;font-weight:400;margin:0}.topline{display:flex;justify-content:space-between;gap:16px;margin-bottom:20px}.tag{font-size:12px;border-radius:4px;background:#e2f3f9;color:#141414;padding:4px 8px;align-self:start;white-space:nowrap}.route{height:148px;border-radius:12px;background:#e2f3f9;display:flex;align-items:center;justify-content:space-between;padding:24px;position:relative;gap:16px}.port{position:relative;z-index:1;font-size:14px;max-width:40%}.port b{display:block;font-size:20px;line-height:24px;font-weight:400}.port:last-child{text-align:right}.route:before{content:'';height:2px;background:#42b0d5;position:absolute;left:24px;right:24px;top:52%}.port{background:#e2f3f9;padding:8px}.history{list-style:none;margin:24px 0 0;padding:0}.history li{position:relative;padding:0 0 24px 28px;border-left:2px solid #d4d4d4;margin-left:5px}.history li:last-child{padding-bottom:0;border-color:transparent}.history li:before{content:'';position:absolute;left:-6px;top:7px;width:10px;height:10px;background:#42b0d5;border-radius:50%}.history b{font-weight:500;display:block}.history small{font-size:14px;line-height:20px;color:#6a6a6a;display:block;margin-top:4px}.notice{padding:32px 0;max-width:430px}footer{font-size:12px;line-height:16px;color:#6a6a6a;margin-top:24px}@media(max-width:650px){header{padding:16px}header span{max-width:115px}main{padding:24px 16px}h1{font-size:26px;line-height:32px}.layout{grid-template-columns:1fr}aside{padding:16px}.record{padding:12px 0}.search,.detail{padding:20px}.entry{flex-wrap:wrap}.entry input{max-width:none}.entry button{width:100%}.topline{flex-wrap:wrap}.route{padding:8px}.port b{font-size:18px}.route:before{left:16px;right:16px}}
</style><header><b>CARGO / WORKSPACE</b><span>Independent MDS interpretation</span></header><main><h1>Follow the next milestone.</h1><p class="subtitle">A reference lookup and event history, using original sample records.</p><form id="lookup" class="search" novalidate><label for="reference">Shipment reference</label><div class="entry"><input id="reference" type="text" inputmode="numeric" value="000042" required aria-describedby="hint error"><button type="submit">Show shipment</button></div><p class="hint" id="hint">Try 000042 or 000108. Keep the leading zeros.</p><p class="error" id="error" role="alert"></p></form><div class="layout"><aside><h2>Sample shipments</h2><button class="record" data-id="000042" aria-pressed="true"><strong>000042</strong><small>Rotterdam → Singapore</small></button><button class="record" data-id="000108" aria-pressed="false"><strong>000108</strong><small>Hamburg → New York</small></button></aside><section class="detail" id="result" aria-live="polite"></section></div><footer>All references, routes and events are fictional. No live tracking, shipment status or transport commitment is represented.</footer></main><script>const data={'000042':{from:'Rotterdam',to:'Singapore',status:'In transit',events:[['Booking received','Sample milestone 1 · Reference created'],['Loaded at origin','Sample milestone 2 · Origin handling complete'],['In transit','Sample milestone 3 · Next event pending']]},'000108':{from:'Hamburg',to:'New York',status:'Awaiting handover',events:[['Booking received','Sample milestone 1 · Reference created'],['Awaiting origin handover','Sample milestone 2 · Cargo handover pending']]}};const input=document.querySelector('#reference'),result=document.querySelector('#result'),error=document.querySelector('#error');function resetError(){error.textContent='';input.setAttribute('aria-invalid','false')}function show(){resetError();const id=input.value.trim();document.querySelectorAll('.record').forEach(x=>x.setAttribute('aria-pressed',String(x.dataset.id===id)));result.replaceChildren();if(!/^\d{6}$/.test(id)){error.textContent='Use a six-digit sample reference, including leading zeros.';input.setAttribute('aria-invalid','true');input.focus();result.innerHTML='<p class="notice">Correct the reference to view a sample event history.</p>';return}const r=data[id];if(!r){result.innerHTML='<h2>No sample shipment found</h2><p class="notice">This reference does not match the two sample records. Try 000042 or 000108.</p>';return}result.innerHTML=`<div class="topline"><h2>Shipment ${id}</h2><span class="tag">${r.status}</span></div><div class="route"><div class="port"><small>ORIGIN</small><b>${r.from}</b></div><div class="port"><small>DESTINATION</small><b>${r.to}</b></div></div><ol class="history">${r.events.map(([a,b])=>`<li><b>${a}</b><small>${b}</small></li>`).join('')}</ol>`}document.querySelector('#lookup').onsubmit=e=>{e.preventDefault();show()};document.querySelectorAll('.record').forEach(x=>x.onclick=()=>{input.value=x.dataset.id;show()});input.oninput=()=>{resetError();document.querySelectorAll('.record').forEach(x=>x.setAttribute('aria-pressed','false'));result.innerHTML='<p class="notice">Select Show shipment to look up the edited reference.</p>'};show();</script></html>

Referência de código

  • Só é possível encontrar as referências de remessa de exemplo incluídas. A correspondência exata de strings preserva os identificadores; o documento não contém componentes privados do Maersk nem acesso ao rastreamento.

Preserve as referências de remessa como texto

Um formulário nativo segue as diretrizes de entrada do MDS e usa funções de cor de tokens públicos. A correspondência exata dos dados de exemplo preserva os zeros à esquerda e distingue um formato inválido de um registro não encontrado.

html
<!doctype html>
<html lang="en"><meta charset="utf-8"><meta name="viewport" content="width=device-width">
<title>Sample shipment lookup</title><style>
/* Local snapshot of documented Maersk light roles; not an MDS package import. */
:root{--mds_brand_appearance_primary_default_background-color:#141414;
--mds_brand_appearance_primary_default_on-background-color:#fff;
--mds_brand_appearance_neutral_default_border-color:#d4d4d4;
--mds_brand_appearance_secondary_weak_background-color:#e2f3f9}
body{font:16px/24px Arial,sans-serif;color:#141414;margin:32px}
main{max-width:48rem;margin:auto}label{display:block;margin-bottom:8px}
input,button{font:inherit;padding:12px 16px;border-radius:6px}
input{border:1px solid var(--mds_brand_appearance_neutral_default_border-color);max-width:100%;box-sizing:border-box}
button{border:0;background:var(--mds_brand_appearance_primary_default_background-color);color:var(--mds_brand_appearance_primary_default_on-background-color)}
.actions{display:flex;gap:8px;flex-wrap:wrap}li{padding:12px 0}#error{color:#b80012}#result{margin-top:24px;padding:24px;border-radius:12px;background:var(--mds_brand_appearance_secondary_weak_background-color)}
</style><main><h1>Find a sample shipment</h1>
<form id="lookup" novalidate><label for="reference">Shipment reference</label>
<p id="hint">Try 000042 or 000108. These are original sample records.</p>
<div class="actions"><input id="reference" type="text" inputmode="numeric" value="000042" aria-describedby="hint error" required>
<button type="submit">Show shipment</button></div><p id="error" role="alert"></p></form>
<section id="result" aria-live="polite"></section></main>
<script>
const shipments={'000042':{route:'Rotterdam → Singapore',events:['Booking received','Loaded at origin','In transit']},'000108':{route:'Hamburg → New York',events:['Booking received','Awaiting origin handover']}};
const input=document.querySelector('#reference'),result=document.querySelector('#result'),error=document.querySelector('#error');
function lookup(e){e.preventDefault();const id=input.value.trim();error.textContent='';input.setAttribute('aria-invalid','false');result.replaceChildren();
 if(!/^\d{6}$/.test(id)){error.textContent='Use a six-digit sample reference, including leading zeros.';input.setAttribute('aria-invalid','true');input.focus();return;}
 const record=shipments[id];if(!record){result.textContent='No sample shipment matches this reference. Try 000042 or 000108.';return;}
 const heading=document.createElement('h2');heading.textContent=id+' · '+record.route;
 const list=document.createElement('ol');record.events.forEach(x=>{const li=document.createElement('li');li.textContent=x;list.append(li)});
 result.append(heading,list);
}
document.querySelector('#lookup').addEventListener('submit',lookup);
input.addEventListener('input',()=>{error.textContent='';input.setAttribute('aria-invalid','false');result.replaceChildren();});
</script></html>

Referência de código

  • type="text" preserva os dígitos do identificador; inputmode apenas sugere um teclado.
  • O rótulo visível, a dica persistente e o erro vinculado têm funções distintas.
  • Este código é uma implementação original, não o componente privado Input do MDS API.
04

Configuração do agente sistema de design Maersk

Ponto de partida para implementação

A página pública para desenvolvedores documenta o acesso ao registro privado. As importações nativas exatas e as assinaturas de eventos não são inventadas a partir de trechos de código indisponíveis. O HTML fornecido é uma interpretação completa e funcional dos fundamentos públicos.

texto
Native MDS adoption (authorized Maersk teams):
1. Obtain access to Maersk Global GitHub Packages or the private Nexus registry.
2. Use the corporate authentication and SSO flow in the official developer guide.
3. Install the approved component or core package and its documented token/font dependencies.
4. Read exact component properties and events in the MDS Storybook for that installed release.

Public reference specimen:
Save the complete HTML example as index.html and open it in a browser.
It requires no registry, external script or private asset.
Its token declarations are a local light-theme snapshot; they do not initialize MDS Web Components.

Um prompt para seu projeto

Prompt para agente de IA
Crie uma consulta operacional inspirada na Maersk, usando funções de cor claras documentadas, uma ação primária escura, intervalos baseados em 4px, cantos de 6px nos campos e cartões de 12px. Preserve os identificadores de remessa como texto, diferencie uma entrada malformada de um registro ausente e apresente o histórico de eventos como uma lista ordenada. Não invente acesso a pacotes públicos nem APIs de componentes privados.
05

Fontes e escopo de sistema de design Maersk

Referência independente de OpenDesign. Os pacotes nativos do MDS exigem acesso corporativo autorizado. Todos os identificadores de remessa, rotas e eventos na prévia são dados fictícios de exemplo; nenhum serviço de rastreamento é chamado.