Análise de dados · Novo recurso

Sistema de design Elastic UI.

Crie um explorador de registros do Elastic UI com escalas Borealis verificadas, controles nativos de tabela e busca, filtragem por gravidade, eventos salvos localmente e código-fonte completo de React.

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

Elastic UI Prévia da interface do sistema de design

Filtre o fluxo de eventos por mensagem ou gravidade, salve eventos individuais, limpe um resultado vazio e alterne entre a aparência clara e a escura.

Pesquisar e salvar eventos de registro de exemploAbrir exemplo completo
Elastic UI nativo 123.0.0 / Borealis 8.1.0 com React 18.3.1. Dados de registro e estado da aplicação locais e originais. · Referência de implementação
02

Elastic UI Referência de design do sistema de design

Elastic UI 123.0.0 com tema Borealis 8.1.0 e React 18.3.1. As tabelas usam nomes do JSON do tema publicado; são chaves de exportação, não caminhos literais de objetos useEuiTheme. A prévia usa o tema nativo de React API.

Cores semânticas do Borealis

Fonte
Nome / RegraValor / ConfiguraçãoUso
euiColorPrimarylight: #0B64DD; dark: #61A2FFNomes publicados na exportação do tema. Em React, use a função semântica correspondente por meio de useEuiTheme, em vez de fixar esses valores no código.
euiColorSuccesslight: #008A5E; dark: #24C292Nomes publicados na exportação do tema. Em React, use a função semântica correspondente por meio de useEuiTheme, em vez de fixar esses valores no código.
euiColorWarninglight: #FACB3D; dark: #FACB3DNomes publicados na exportação do tema. Em React, use a função semântica correspondente por meio de useEuiTheme, em vez de fixar esses valores no código.
euiColorDangerlight: #C61E25; dark: #F6726ANomes publicados na exportação do tema. Em React, use a função semântica correspondente por meio de useEuiTheme, em vez de fixar esses valores no código.
euiColorEmptyShadelight: #FFFFFF; dark: #111C2CNomes publicados na exportação do tema. Em React, use a função semântica correspondente por meio de useEuiTheme, em vez de fixar esses valores no código.
euiColorFullShadelight: #07101F; dark: #FFFFFFNomes publicados na exportação do tema. Em React, use a função semântica correspondente por meio de useEuiTheme, em vez de fixar esses valores no código.
euiPageBackgroundColorlight: #ECF1F9; dark: #07101FNomes publicados na exportação do tema. Em React, use a função semântica correspondente por meio de useEuiTheme, em vez de fixar esses valores no código.
euiTextColorlight: #384861; dark: #B4C1D5Nomes publicados na exportação do tema. Em React, use a função semântica correspondente por meio de useEuiTheme, em vez de fixar esses valores no código.
euiTextSubduedColorlight: #516381; dark: #98A8C3Nomes publicados na exportação do tema. Em React, use a função semântica correspondente por meio de useEuiTheme, em vez de fixar esses valores no código.

Escala de espaçamento

Fonte
Nome / RegraValor / ConfiguraçãoUso
euiSizeXS4pxUse tamanhos correspondentes de EuiSpacer/FlexGroup para manter o ritmo do layout; na exportação deste tema, a base é 16px.
euiSizeS8pxUse tamanhos correspondentes de EuiSpacer/FlexGroup para manter o ritmo do layout; na exportação deste tema, a base é 16px.
euiSizeM12pxUse tamanhos correspondentes de EuiSpacer/FlexGroup para manter o ritmo do layout; na exportação deste tema, a base é 16px.
euiSize16pxUse tamanhos correspondentes de EuiSpacer/FlexGroup para manter o ritmo do layout; na exportação deste tema, a base é 16px.
euiSizeL24pxUse tamanhos correspondentes de EuiSpacer/FlexGroup para manter o ritmo do layout; na exportação deste tema, a base é 16px.
euiSizeXL32pxUse tamanhos correspondentes de EuiSpacer/FlexGroup para manter o ritmo do layout; na exportação deste tema, a base é 16px.
euiSizeXXL40pxUse tamanhos correspondentes de EuiSpacer/FlexGroup para manter o ritmo do layout; na exportação deste tema, a base é 16px.

Tipografia

Fonte
Nome / RegraValor / ConfiguraçãoUso
euiFontSizeXS12pxReferência tipográfica publicada. Use as variantes de EuiText/EuiTitle para estabelecer a hierarquia dos componentes.
euiFontSizeS14pxReferência tipográfica publicada. Use as variantes de EuiText/EuiTitle para estabelecer a hierarquia dos componentes.
euiFontSize14pxReferência tipográfica publicada. Use as variantes de EuiText/EuiTitle para estabelecer a hierarquia dos componentes.
euiFontSizeM16pxReferência tipográfica publicada. Use as variantes de EuiText/EuiTitle para estabelecer a hierarquia dos componentes.
euiFontSizeL20pxReferência tipográfica publicada. Use as variantes de EuiText/EuiTitle para estabelecer a hierarquia dos componentes.
euiFontSizeXL24pxReferência tipográfica publicada. Use as variantes de EuiText/EuiTitle para estabelecer a hierarquia dos componentes.
euiFontSizeXXL30pxReferência tipográfica publicada. Use as variantes de EuiText/EuiTitle para estabelecer a hierarquia dos componentes.
euiLineHeight1.5Referência tipográfica publicada. Use as variantes de EuiText/EuiTitle para estabelecer a hierarquia dos componentes.

Bordas e formas

Fonte
Nome / RegraValor / ConfiguraçãoUso
euiBorderWidthThin1pxDiferencie formas em linha, de controles, de painéis e de molduras; um único raio de canto universal apagaria essa hierarquia.
euiBorderWidthThick2pxDiferencie formas em linha, de controles, de painéis e de molduras; um único raio de canto universal apagaria essa hierarquia.
euiBorderColor#E3E8F2 Diferencie formas em linha, de controles, de painéis e de molduras; um único raio de canto universal apagaria essa hierarquia.
euiBorderRadiusInline4pxDiferencie formas em linha, de controles, de painéis e de molduras; um único raio de canto universal apagaria essa hierarquia.
euiBorderRadiusControl8pxDiferencie formas em linha, de controles, de painéis e de molduras; um único raio de canto universal apagaria essa hierarquia.
euiBorderRadiusPanel12pxDiferencie formas em linha, de controles, de painéis e de molduras; um único raio de canto universal apagaria essa hierarquia.
euiBorderRadiusFrame16pxDiferencie formas em linha, de controles, de painéis e de molduras; um único raio de canto universal apagaria essa hierarquia.

Foco e movimento

Fonte
Nome / RegraValor / ConfiguraçãoUso
euiFocusRingSize2pxMantenha o comportamento nativo de foco e movimento, sem substituir os seletores internos .eui.
euiFocusBackgroundColor#ECF1F9 Mantenha o comportamento nativo de foco e movimento, sem substituir os seletores internos .eui.
euiAnimSpeedExtraFast90msMantenha o comportamento nativo de foco e movimento, sem substituir os seletores internos .eui.
euiAnimSpeedFast150msMantenha o comportamento nativo de foco e movimento, sem substituir os seletores internos .eui.
euiAnimSpeedNormal250msMantenha o comportamento nativo de foco e movimento, sem substituir os seletores internos .eui.
euiAnimSpeedSlow350msMantenha o comportamento nativo de foco e movimento, sem substituir os seletores internos .eui.

Contrato nativo de API neste explorador

Fonte
Nome / RegraValor / ConfiguraçãoUso
EuiProvidercolorMode="light" | "dark"Fornece o contexto do tema e os estilos Emotion.
useEuiTheme{ euiTheme }Resolve cores semânticas para elementos personalizados e EuiHealth.
EuiBasicTableitems · itemId · columnsRenderiza a coleção visível controlada usando IDs estáveis.
EuiFieldSearchvalue · onChange · incrementalA aplicação filtra uma coleção local de seis eventos.
EuiButtonGroupoptions · idSelected · onChangeFiltro de gravidade controlado com legenda visível.
EuiHealthcolor + readable child labelUm ponto de status complementa a indicação textual da gravidade, mas não a substitui.
03

Elastic UI Guia completo do sistema de design

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

DESIGN-elastic-ui.md

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

Baixar o guia

Elastic UI Estrutura do explorador do sistema de design

Um espaço de investigação, não um painel genérico

O exemplo contém três estatísticas compactas de resumo e um único fluxo de eventos. Um campo de pesquisa e um grupo de gravidade filtram esse fluxo; cada linha oferece uma ação independente para salvar. Manter a ação junto ao evento permite que o leitor reúna evidências sem sair do contexto filtrado. O resumo informa explicitamente a contagem de eventos de exemplo, sem alegar que se trate de tráfego em tempo real.

Com base neste guia de OpenDesign

Use o limite atual do tema

Este exemplo combina EUI 123.0.0 com Borealis 8.1.0. Os valores de referência vêm desse tema publicado, não de uma captura de tela antiga de Amsterdam. EuiProvider gerencia o modo visual e o contexto de estilos. O estado da aplicação permanece fora de qualquer cálculo do tema; assim, mudar a aparência não redefine os eventos salvos nem a consulta atual.

Elastic UI Funções semânticas de cor do sistema de design

Use a gravidade como uma relação significativa

Neste aplicativo, Info usa a função primária, Warning usa a função de aviso e Error usa a função de perigo. EuiHealth exibe a palavra que indica a gravidade ao lado do ponto. Esse mapeamento é uma política do aplicativo; isso não significa que todo elemento com a cor primária represente uma gravidade informativa. As contagens de erros e os rótulos de eventos ainda precisam de texto legível.

Resolva as cores a partir do tema ativo

Screen chama useEuiTheme e usa as cores resolvidas no plano de fundo, no texto do corpo e nos indicadores de status. As tabelas de exportação incluem valores correspondentes para os temas claro e escuro, para que a diferença fique visível. Não copie um valor hexadecimal para os dois modos nem direcione os nomes de classes Emotion gerados para forçar uma correspondência.

Elastic UI Hierarquia tipográfica e numérica do sistema de design

Dê contexto às estatísticas antes de destacar os números

EuiStat associa os 6 eventos de amostra, o 1 evento de erro e a contagem de itens salvos a descrições. Sem contexto, os números seriam ambíguos. EuiTitle apresenta a investigação, enquanto EuiText informa o período e esclarece que os dados são de amostra. O cabeçalho do fluxo usa um título menor, em vez de um segundo título de página.

Mantenha o texto dos registros legível em uma apresentação compacta

Borealis usa uma fonte base de 14px para exportação, com uma referência de entrelinha de 1.5 e tamanhos tipográficos de 12/16/20/24/30px. Os carimbos de data e hora e os nomes dos serviços ficam em colunas previsíveis, enquanto a mensagem do evento recebe largura flexível. O exemplo usa fontes de sistema disponíveis por meio da pilha nativa e não afirma carregar um recurso Inter remotamente.

Elastic UI Tabela básica e filtros controlados do sistema de design

Separe a apresentação da filtragem

EuiBasicTable recebe os itens já filtrados. As colunas definem um campo ou um renderizador personalizado, e itemId usa o ID estável do evento. EuiFieldSearch atualiza o estado da consulta; EuiButtonGroup atualiza o ID da gravidade selecionada. O aplicativo combina os dois critérios antes de fornecer a coleção visível à tabela.

  1. Digite o nome de um serviço ou um trecho da mensagem.
  2. Selecione Error ou Warning para combinar um critério de gravidade.
  3. Salve um evento correspondente usando a ação da linha.
  4. Limpe os filtros e confirme que o evento salvo continua marcado.

Salve usando a identidade do evento, não a posição da linha

Elastic UI Espaçamento e dados responsivos do sistema de design

Use a escala nativa de espaçamento entre os grupos

Os tamanhos publicados são 4, 8, 12, 16, 24, 32 e 40px. EuiSpacer e EuiFlexGroup definem o espaço entre as estatísticas resumidas, os filtros e a tabela de eventos. EuiPanel fornece o formato do contêiner; o tema diferencia o raio de 12px do painel dos raios de 8px dos controles e 16px do quadro.

Mantenha a página dentro da largura da tela móvel

Os grupos de resumo e de filtros se reorganizam usando o comportamento nativo de FlexGroup. A tabela fica em uma área delimitada com rolagem horizontal e largura mínima de 640px para o aplicativo, preservando a relação entre o carimbo de data e hora, a mensagem e a ação, sem causar rolagem horizontal na página inteira. Em produção, uma tabela pode usar as opções documentadas de tabela responsiva adequadas ao conjunto real de colunas.

Elastic UI Pesquisa e estados vazio e salvo do sistema de design

Uma pesquisa sem resultados oferece uma ação direta para retomar

Uma consulta sem resultados exibe No events match the current filters e a ação Clear filters. A redefinição da consulta e da gravidade restaura os seis eventos de amostra sem alterar os IDs salvos. A contagem acima da tabela anuncia o total de eventos correspondentes por meio de uma região dinâmica não intrusiva.

Salvar localmente não é um fluxo de trabalho de incidentes

Salvar um evento altera o rótulo visível da linha e a estatística de itens salvos. A ação não se comunica com Elasticsearch, não cria um incidente nem persiste após a atualização da página. Um produto de investigação real deve adicionar um endpoint de persistência documentado e informar respostas pendentes ou com falha antes de afirmar que a coleção salva é permanente.

Elastic UI Ações acessíveis da tabela do sistema de design

Dê nomes aos filtros sem depender dos textos de placeholder

A pesquisa tem um nome acessível, e o grupo de botões fornece uma legenda para a gravidade. As colunas da tabela têm cabeçalhos descritivos; a ação de cada linha é um EuiButtonEmpty nativo. EuiHealth inclui texto, para que a cor do status nunca seja a única informação. Preserve esses requisitos ao substituir os dados de amostra.

  • Use palavras visíveis para indicar a gravidade.
  • Mantenha a legenda da tabela e os nomes das colunas.
  • Mantenha o estado salvo associado ao ID estável do evento.

Mantenha os estados de teclado e visuais sincronizados

Os usuários podem focar a pesquisa, selecionar um filtro de gravidade, acessar as ações das linhas e alternar a configuração de aparência. O anel de foco de 2px faz parte da referência do tema. Teste um conjunto filtrado após salvar uma linha e depois de limpar o filtro; o rótulo da ação e a estatística de itens salvos devem continuar correspondendo.

Elastic UI Configuração e integração do tema do sistema de design

Instale as dependências peer documentadas

O guia oficial de configuração usa Yarn e lista Borealis, Emotion, datemath e moment junto com EUI. Este exemplo usa React 18 e não envolve a árvore em StrictMode. As instruções abaixo deixam essas restrições explícitas, em vez de herdarem silenciosamente React 19 de um aplicativo recém-gerado.

Considere o arquivo de entrada completo como a implementação

Elastic UI Exemplos de componentes do sistema de design

main.jsx — explorador de registros nativo completo

EuiProvider e Borealis dão suporte a uma tabela de eventos controlada, com filtros de gravidade e pesquisa, além do estado local dos eventos salvos.

jsx
import React, { useState } from "react";
import { createRoot } from "react-dom/client";
import {
  EuiProvider,
  EuiPanel,
  EuiTitle,
  EuiText,
  EuiSpacer,
  EuiFlexGroup,
  EuiFlexItem,
  EuiFieldSearch,
  EuiButtonGroup,
  EuiButtonEmpty,
  EuiBasicTable,
  EuiHealth,
  EuiStat,
  EuiSwitch,
  EuiCallOut,
  useEuiTheme,
} from "@elastic/eui";
const logs = [
  {
    id: 1,
    time: "09:42:18",
    service: "gateway",
    message: "Request completed",
    level: "Info",
    duration: 42,
  },
  {
    id: 2,
    time: "09:42:21",
    service: "worker",
    message: "Retry queued after timeout",
    level: "Warning",
    duration: 1200,
  },
  {
    id: 3,
    time: "09:42:24",
    service: "gateway",
    message: "Upstream connection refused",
    level: "Error",
    duration: 800,
  },
  {
    id: 4,
    time: "09:42:29",
    service: "indexer",
    message: "Batch indexed",
    level: "Info",
    duration: 180,
  },
  {
    id: 5,
    time: "09:42:32",
    service: "worker",
    message: "Job completed",
    level: "Info",
    duration: 94,
  },
  {
    id: 6,
    time: "09:42:36",
    service: "gateway",
    message: "Upstream connection restored",
    level: "Info",
    duration: 51,
  },
];
function Screen({ dark, setDark }) {
  const { euiTheme } = useEuiTheme();
  const [query, setQuery] = useState(""),
    [level, setLevel] = useState("all"),
    [saved, setSaved] = useState([]);
  const visible = logs.filter(
    (x) =>
      (level === "all" || x.level === level) &&
      (x.service + " " + x.message).toLowerCase().includes(query.toLowerCase()),
  );
  const colors = {
    Info: euiTheme.colors.primary,
    Warning: euiTheme.colors.warning,
    Error: euiTheme.colors.danger,
  };
  const columns = [
    { field: "time", name: "Time", width: "105px" },
    { field: "service", name: "Service", width: "105px" },
    {
      field: "message",
      name: "Event",
      render: (value, item) => (
        <span>
          {value}
          {saved.includes(item.id) ? " · Saved locally" : ""}
        </span>
      ),
    },
    {
      field: "level",
      name: "Level",
      width: "110px",
      render: (value) => <EuiHealth color={colors[value]}>{value}</EuiHealth>,
    },
    {
      name: "Action",
      width: "110px",
      render: (item) => (
        <EuiButtonEmpty
          size="xs"
          onClick={() =>
            setSaved((v) =>
              v.includes(item.id)
                ? v.filter((id) => id !== item.id)
                : [...v, item.id],
            )
          }
        >
          {saved.includes(item.id) ? "Unsave" : "Save event"}
        </EuiButtonEmpty>
      ),
    },
  ];
  return (
    <main
      style={{
        padding: 24,
        background: euiTheme.colors.backgroundBasePlain,
        color: euiTheme.colors.textParagraph,
      }}
    >
      <EuiFlexGroup justifyContent="spaceBetween" alignItems="center">
        <EuiFlexItem>
          <EuiText size="xs">
            <p>ELASTIC UI · LOG EXPLORER</p>
          </EuiText>
          <EuiTitle size="m">
            <h1>Investigate gateway events</h1>
          </EuiTitle>
        </EuiFlexItem>
        <EuiFlexItem grow={false}>
          <EuiSwitch
            label="Dark mode"
            checked={dark}
            onChange={(e) => setDark(e.target.checked)}
          />
        </EuiFlexItem>
      </EuiFlexGroup>
      <EuiSpacer size="l" />
      <EuiFlexGroup>
        <EuiFlexItem>
          <EuiPanel>
            <EuiStat title="6" description="Sample events" titleSize="m" />
          </EuiPanel>
        </EuiFlexItem>
        <EuiFlexItem>
          <EuiPanel>
            <EuiStat
              title="1"
              description="Error event"
              titleSize="m"
              titleColor="danger"
            />
          </EuiPanel>
        </EuiFlexItem>
        <EuiFlexItem>
          <EuiPanel>
            <EuiStat
              title={String(saved.length)}
              description="Saved in this preview"
              titleSize="m"
            />
          </EuiPanel>
        </EuiFlexItem>
      </EuiFlexGroup>
      <EuiSpacer size="l" />
      <EuiPanel>
        <EuiTitle size="xs">
          <h2>Event stream</h2>
        </EuiTitle>
        <EuiText size="s">
          <p>09:42:18–09:42:36 · fictional data · no live telemetry</p>
        </EuiText>
        <EuiSpacer size="m" />
        <EuiFlexGroup alignItems="center">
          <EuiFlexItem>
            <EuiFieldSearch
              fullWidth
              aria-label="Search log events"
              placeholder="Search service or message"
              value={query}
              onChange={(e) => setQuery(e.target.value)}
              incremental
            />
          </EuiFlexItem>
          <EuiFlexItem grow={false}>
            <EuiButtonGroup
              legend="Filter severity"
              options={[
                { id: "all", label: "All" },
                { id: "Warning", label: "Warning" },
                { id: "Error", label: "Error" },
              ]}
              idSelected={level}
              onChange={(id) => setLevel(id)}
            />
          </EuiFlexItem>
        </EuiFlexGroup>
        <EuiSpacer size="m" />
        <EuiText size="xs">
          <p aria-live="polite">{visible.length} matching events</p>
        </EuiText>
        <div style={{ overflowX: "auto", maxWidth: "100%" }}>
          <div style={{ minWidth: 640 }}>
            <EuiBasicTable
                  responsiveBreakpoint={false}
              items={visible}
              itemId="id"
              columns={columns}
              tableCaption="Fictional application events"
              noItemsMessage="No events match the current filters."
            />
          </div>
        </div>
        {!visible.length && (
          <EuiButtonEmpty
            onClick={() => {
              setLevel("all");
              setQuery("");
            }}
          >
            Clear filters
          </EuiButtonEmpty>
        )}
      </EuiPanel>
      <EuiSpacer size="l" />
      <EuiCallOut size="s" title="Local investigation workspace">
        Saving an event only changes this preview. No query is sent to
        Elasticsearch and no incident is created.
      </EuiCallOut>
      <EuiSpacer size="m" />
      <EuiText size="xs">
        <p>
          Native Elastic UI 123.0.0 · Borealis 8.1.0 theme · controlled filters
          and table actions.
        </p>
      </EuiText>
    </main>
  );
}
function App() {
  const [dark, setDark] = useState(false);
  return (
    <EuiProvider colorMode={dark ? "dark" : "light"}>
      <Screen dark={dark} setDark={setDark} />
    </EuiProvider>
  );
}
createRoot(document.getElementById("root")).render(<App />);

Referência de código

  • Salve como src/main.jsx no scaffold React. Esta entrada não ativa StrictMode intencionalmente.
  • A largura delimitada de 640px da tabela é definida pelo aplicativo CSS; todos os elementos visuais dos componentes vêm de EUI.

Nota personalizada que respeita o tema

Use o tema ativo dentro de um provider, em vez de vincular a marcação personalizada às classes geradas pelos componentes.

jsx
import React from 'react';
import { useEuiTheme } from '@elastic/eui';
export function InvestigationNote({ children }) {
  const { euiTheme } = useEuiTheme();
  return <aside style={{ padding: euiTheme.size.m, color: euiTheme.colors.textParagraph, borderLeft: `2px solid ${euiTheme.colors.primary}` }}>{children}</aside>;
}

Referência de código

  • Renderize InvestigationNote dentro de EuiProvider. A nota herda o modo visual selecionado.
04

Configuração do agente do sistema de design Elastic UI

Ponto de partida para implementação

O guia oficial do EUI documenta a instalação com Yarn e o suporte à versão React 18. Há ressalvas documentadas para bundlers que não sejam Webpack; este exemplo nativo específico foi empacotado com esbuild e testado no navegador. Use uma versão do Node.js compatível com seu scaffold.

sh
yarn create vite elastic-investigation --template react
cd elastic-investigation
yarn add [email protected] [email protected] @elastic/[email protected] @elastic/[email protected] @elastic/datemath @emotion/react @emotion/css moment
# Replace src/main.jsx with the complete example above.
yarn dev

Um prompt para seu projeto

Prompt para agente de IA
Crie uma tela para investigar logs com Elastic UI 123.0.0, Borealis 8.1.0 e React 18. Leia a exportação de tema e o código-fonte nativo fornecidos. Use EuiProvider, um EuiBasicTable controlado e filtros acessíveis para pesquisa e gravidade. Salve usando o ID estável do evento, preserve os favoritos ao filtrar e diferencie o estado local da interface de uma consulta real ao Elasticsearch ou de uma resposta de persistência. Mantenha a tabela contida em dispositivos móveis.
05

Fontes e escopo do sistema de design Elastic UI

Guia criado com OpenDesign e explorador de logs local fictício, executado nativamente com Elastic UI 123.0.0 e Borealis 8.1.0. Os eventos de exemplo não são dados de telemetria em tempo real, e a ação de salvar mantém os dados apenas na memória. O EUI tem suas próprias opções de licenciamento Elastic/SSPL; consulte a licença oficial do pacote para saber como distribuí-lo.