Análisis de datos · Nuevo recurso

Sistema de diseño Elastic UI.

Crea un explorador de registros de Elastic UI con las escalas verificadas de Borealis, controles nativos de tabla y búsqueda, filtros de gravedad, eventos guardados localmente y el código fuente completo de React.

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

Elastic UI Vista previa de la interfaz del sistema de diseño

Filtra el flujo de eventos por mensaje o nivel de gravedad, guarda eventos individuales, borra los resultados y alterna entre la apariencia clara y la oscura.

Buscar y guardar eventos de registro de ejemploAbrir ejemplo completo
Elastic UI nativo 123.0.0 / Borealis 8.1.0 con React 18.3.1. Datos de registro y estado de la aplicación locales y originales. · Referencia de implementación
02

Elastic UI Referencia de diseño del sistema de diseño

Elastic UI 123.0.0 con el tema Borealis 8.1.0 y React 18.3.1. Las tablas usan los nombres del JSON publicado del tema; son claves de exportación, no rutas literales del objeto useEuiTheme. La vista previa real usa el tema nativo de React API.

Colores semánticos de Borealis

Fuente
Nombre / ReglaValor / ConfiguraciónUso
euiColorPrimarylight: #0B64DD; dark: #61A2FFNombres publicados en la exportación del tema. En React, utiliza useEuiTheme para aplicar el rol semántico correspondiente en lugar de codificar estos valores directamente.
euiColorSuccesslight: #008A5E; dark: #24C292Nombres publicados en la exportación del tema. En React, utiliza useEuiTheme para aplicar el rol semántico correspondiente en lugar de codificar estos valores directamente.
euiColorWarninglight: #FACB3D; dark: #FACB3DNombres publicados en la exportación del tema. En React, utiliza useEuiTheme para aplicar el rol semántico correspondiente en lugar de codificar estos valores directamente.
euiColorDangerlight: #C61E25; dark: #F6726ANombres publicados en la exportación del tema. En React, utiliza useEuiTheme para aplicar el rol semántico correspondiente en lugar de codificar estos valores directamente.
euiColorEmptyShadelight: #FFFFFF; dark: #111C2CNombres publicados en la exportación del tema. En React, utiliza useEuiTheme para aplicar el rol semántico correspondiente en lugar de codificar estos valores directamente.
euiColorFullShadelight: #07101F; dark: #FFFFFFNombres publicados en la exportación del tema. En React, utiliza useEuiTheme para aplicar el rol semántico correspondiente en lugar de codificar estos valores directamente.
euiPageBackgroundColorlight: #ECF1F9; dark: #07101FNombres publicados en la exportación del tema. En React, utiliza useEuiTheme para aplicar el rol semántico correspondiente en lugar de codificar estos valores directamente.
euiTextColorlight: #384861; dark: #B4C1D5Nombres publicados en la exportación del tema. En React, utiliza useEuiTheme para aplicar el rol semántico correspondiente en lugar de codificar estos valores directamente.
euiTextSubduedColorlight: #516381; dark: #98A8C3Nombres publicados en la exportación del tema. En React, utiliza useEuiTheme para aplicar el rol semántico correspondiente en lugar de codificar estos valores directamente.

Escala de espaciado

Fuente
Nombre / ReglaValor / ConfiguraciónUso
euiSizeXS4pxUsa tamaños equivalentes de EuiSpacer/FlexGroup para mantener el ritmo de la composición; la unidad base es 16px en esta exportación del tema.
euiSizeS8pxUsa tamaños equivalentes de EuiSpacer/FlexGroup para mantener el ritmo de la composición; la unidad base es 16px en esta exportación del tema.
euiSizeM12pxUsa tamaños equivalentes de EuiSpacer/FlexGroup para mantener el ritmo de la composición; la unidad base es 16px en esta exportación del tema.
euiSize16pxUsa tamaños equivalentes de EuiSpacer/FlexGroup para mantener el ritmo de la composición; la unidad base es 16px en esta exportación del tema.
euiSizeL24pxUsa tamaños equivalentes de EuiSpacer/FlexGroup para mantener el ritmo de la composición; la unidad base es 16px en esta exportación del tema.
euiSizeXL32pxUsa tamaños equivalentes de EuiSpacer/FlexGroup para mantener el ritmo de la composición; la unidad base es 16px en esta exportación del tema.
euiSizeXXL40pxUsa tamaños equivalentes de EuiSpacer/FlexGroup para mantener el ritmo de la composición; la unidad base es 16px en esta exportación del tema.

Tipografía

Fuente
Nombre / ReglaValor / ConfiguraciónUso
euiFontSizeXS12pxReferencia tipográfica publicada. Usa las variantes de EuiText/EuiTitle para establecer la jerarquía de componentes.
euiFontSizeS14pxReferencia tipográfica publicada. Usa las variantes de EuiText/EuiTitle para establecer la jerarquía de componentes.
euiFontSize14pxReferencia tipográfica publicada. Usa las variantes de EuiText/EuiTitle para establecer la jerarquía de componentes.
euiFontSizeM16pxReferencia tipográfica publicada. Usa las variantes de EuiText/EuiTitle para establecer la jerarquía de componentes.
euiFontSizeL20pxReferencia tipográfica publicada. Usa las variantes de EuiText/EuiTitle para establecer la jerarquía de componentes.
euiFontSizeXL24pxReferencia tipográfica publicada. Usa las variantes de EuiText/EuiTitle para establecer la jerarquía de componentes.
euiFontSizeXXL30pxReferencia tipográfica publicada. Usa las variantes de EuiText/EuiTitle para establecer la jerarquía de componentes.
euiLineHeight1.5Referencia tipográfica publicada. Usa las variantes de EuiText/EuiTitle para establecer la jerarquía de componentes.

Bordes y formas

Fuente
Nombre / ReglaValor / ConfiguraciónUso
euiBorderWidthThin1pxDistingue entre formas en línea, de controles, paneles y marcos; un único radio de esquina universal borraría la jerarquía.
euiBorderWidthThick2pxDistingue entre formas en línea, de controles, paneles y marcos; un único radio de esquina universal borraría la jerarquía.
euiBorderColor#E3E8F2 Distingue entre formas en línea, de controles, paneles y marcos; un único radio de esquina universal borraría la jerarquía.
euiBorderRadiusInline4pxDistingue entre formas en línea, de controles, paneles y marcos; un único radio de esquina universal borraría la jerarquía.
euiBorderRadiusControl8pxDistingue entre formas en línea, de controles, paneles y marcos; un único radio de esquina universal borraría la jerarquía.
euiBorderRadiusPanel12pxDistingue entre formas en línea, de controles, paneles y marcos; un único radio de esquina universal borraría la jerarquía.
euiBorderRadiusFrame16pxDistingue entre formas en línea, de controles, paneles y marcos; un único radio de esquina universal borraría la jerarquía.

Foco y movimiento

Fuente
Nombre / ReglaValor / ConfiguraciónUso
euiFocusRingSize2pxMantén el comportamiento nativo del foco y del movimiento en lugar de sobrescribir los selectores internos .eui.
euiFocusBackgroundColor#ECF1F9 Mantén el comportamiento nativo del foco y del movimiento en lugar de sobrescribir los selectores internos .eui.
euiAnimSpeedExtraFast90msMantén el comportamiento nativo del foco y del movimiento en lugar de sobrescribir los selectores internos .eui.
euiAnimSpeedFast150msMantén el comportamiento nativo del foco y del movimiento en lugar de sobrescribir los selectores internos .eui.
euiAnimSpeedNormal250msMantén el comportamiento nativo del foco y del movimiento en lugar de sobrescribir los selectores internos .eui.
euiAnimSpeedSlow350msMantén el comportamiento nativo del foco y del movimiento en lugar de sobrescribir los selectores internos .eui.

Contrato nativo de API en este explorador

Fuente
Nombre / ReglaValor / ConfiguraciónUso
EuiProvidercolorMode="light" | "dark"Proporciona el contexto del tema y los estilos de Emotion.
useEuiTheme{ euiTheme }Resuelve los colores semánticos de los elementos personalizados y EuiHealth.
EuiBasicTableitems · itemId · columnsRepresenta la colección visible controlada mediante ID estables.
EuiFieldSearchvalue · onChange · incrementalLa aplicación filtra una colección local de seis eventos.
EuiButtonGroupoptions · idSelected · onChangeFiltro de gravedad controlado con una leyenda visible.
EuiHealthcolor + readable child labelUn punto de estado complementa la palabra que indica la gravedad, no la sustituye.
03

Elastic UI Guía completa del sistema de diseño

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

DESIGN-elastic-ui.md

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

Descargar la guía

Elastic UI Estructura del explorador del sistema de diseño

Un espacio de trabajo de investigación, no un panel genérico

El ejemplo incluye tres estadísticas resumidas compactas y un único flujo de eventos. Un campo de búsqueda y un grupo de niveles de gravedad permiten acotar el flujo; cada fila ofrece una acción para guardar el evento de forma independiente. Colocar la acción junto a su evento permite recopilar información sin salir del contexto filtrado. El resumen cuenta explícitamente eventos de ejemplo y no afirma mostrar tráfico en tiempo real.

De esta guía de OpenDesign

Usa el límite del tema actual

Este ejemplo combina EUI 123.0.0 con Borealis 8.1.0. Los valores de referencia proceden de ese tema publicado, no de una captura de pantalla antigua de Amsterdam. EuiProvider controla el modo visual y el contexto de estilos. El estado de la aplicación no forma parte de ningún cálculo del tema, así que cambiar la apariencia no restablece los eventos guardados ni la consulta actual.

Elastic UI Roles semánticos de color del sistema de diseño

Aplica la gravedad como una relación con significado

En esta aplicación, Info usa el rol primario, Warning el rol de advertencia y Error el rol de peligro. EuiHealth muestra la palabra que indica la gravedad junto al punto. Esta correspondencia es una política de la aplicación; no implica que todos los elementos de color primario representen una gravedad informativa. Los recuentos de errores y las etiquetas de eventos siguen necesitando texto legible.

Obtener los colores del tema activo

La pantalla usa useEuiTheme y los colores resueltos para el lienzo, el texto del cuerpo y los indicadores de estado. Las tablas de exportación incluyen valores emparejados para los modos claro y oscuro, de modo que la diferencia sea visible. No copies un único valor hexadecimal en ambos modos ni apuntes a los nombres de clase de Emotion generados para forzar una coincidencia.

Elastic UI Tipografía y jerarquía numérica del sistema de diseño

Da contexto a las estadísticas antes de destacar las cifras

EuiStat acompaña los 6 eventos de muestra, el 1 evento de error y el recuento de elementos guardados con descripciones. La cifra por sí sola sería ambigua. EuiTitle introduce la investigación, mientras que EuiText indica el intervalo de tiempo y aclara que se trata de datos de muestra. El encabezado del flujo es un título de menor nivel, no un segundo título de página.

Mantén legible el texto de los registros en una disposición compacta

Borealis usa una base de 14px y una referencia de interlineado de 1.5, además de los tamaños tipográficos de 12/16/20/24/30px. Las marcas de tiempo y los nombres de los servicios tienen columnas predecibles, mientras que el mensaje del evento dispone de un ancho flexible. El ejemplo usa las fuentes del sistema disponibles mediante la pila nativa y no afirma que cargue de forma remota un recurso de Inter.

Elastic UI Tabla básica y filtros controlados del sistema de diseño

Separa la presentación del filtrado

EuiBasicTable recibe los elementos ya filtrados. Las columnas definen un campo o un renderizador personalizado, e itemId usa el ID estable del evento. EuiFieldSearch actualiza el estado de la consulta; EuiButtonGroup actualiza el ID de gravedad seleccionado. La aplicación combina ambos predicados antes de pasar la colección visible a la tabla.

  1. Escribe el nombre de un servicio o un fragmento del mensaje.
  2. Elige Error o Warning para combinarlo con un predicado de gravedad.
  3. Guarda un evento coincidente con la acción de su fila.
  4. Borra los filtros y comprueba que el evento guardado siga marcado.

Guarda por identidad del evento, no por posición de fila

Elastic UI Espaciado y datos adaptables del sistema de diseño

Usa la escala de espaciado nativa en todos los grupos

Los tamaños publicados son 4, 8, 12, 16, 24, 32 y 40px. EuiSpacer y EuiFlexGroup proporcionan el espacio entre las estadísticas resumidas, los filtros y la tabla de eventos. EuiPanel aporta la forma del contenedor; el tema distingue su radio de panel de 12px de los radios de 8px de los controles y de 16px del marco.

Mantén la página dentro del área visible en dispositivos móviles

Los grupos de resumen y filtros se reorganizan mediante el comportamiento nativo de FlexGroup. La tabla se encuentra dentro de una región de desplazamiento horizontal acotada, con un ancho mínimo de aplicación de 640px, lo que conserva las relaciones entre la marca de tiempo, el mensaje y la acción sin desbordar toda la página. En una tabla de producción se pueden elegir las opciones documentadas de tablas adaptables según sus columnas reales.

Elastic UI Búsqueda y estados vacíos y de elementos guardados del sistema de diseño

Una búsqueda sin resultados ofrece una acción directa para recuperarse

Una consulta sin coincidencias muestra No hay eventos que coincidan con los filtros actuales y una acción Borrar filtros. Al restablecer la consulta y la gravedad, se recuperan los seis eventos de muestra sin alterar los ID guardados. El recuento encima de la tabla comunica el total de eventos coincidentes mediante una región activa cortés.

Un guardado local no equivale a un flujo de trabajo de incidentes

Guardar un evento cambia la etiqueta visible de la fila y la estadística de elementos guardados. No se conecta a Elasticsearch, no crea un incidente ni persiste tras actualizar la página. Un producto real de investigación debería añadir un endpoint de persistencia documentado e informar de las respuestas pendientes o fallidas antes de afirmar que la colección guardada es duradera.

Elastic UI Acciones accesibles de tabla del sistema de diseño

Asigna a los filtros nombres independientes de los textos de marcador

La búsqueda tiene un nombre accesible y el grupo de botones incluye una leyenda de gravedad. Las columnas de la tabla tienen encabezados descriptivos; la acción de cada fila es un EuiButtonEmpty nativo. EuiHealth incluye texto, por lo que el color del estado nunca es la única fuente de información. Conserva estos contratos al sustituir los datos de muestra.

  • Usa palabras visibles para indicar la gravedad.
  • Conserva el título de la tabla y los nombres de las columnas.
  • Asocia el estado guardado con el ID estable del evento.

Mantén juntos el estado visual y el del teclado

Los usuarios pueden enfocar la búsqueda, seleccionar un filtro de gravedad, acceder a las acciones de las filas y alternar la configuración de apariencia. El anillo de foco de 2px forma parte de la referencia del tema. Prueba un conjunto filtrado después de guardar una fila y de borrar el filtro; la etiqueta de la acción y la estadística de elementos guardados deben seguir coincidiendo.

Elastic UI Configuración e integración del tema del sistema de diseño

Instala las dependencias entre pares documentadas

La guía de configuración oficial usa Yarn e incluye Borealis, Emotion, datemath y moment junto con EUI. Este ejemplo ejecuta React 18 y no envuelve el árbol en StrictMode. La configuración siguiente explicita esas restricciones en lugar de heredar en silencio React 19 de una aplicación recién generada.

Considera el archivo de entrada completo como la implementación

Elastic UI Ejemplos de componentes del sistema de diseño

main.jsx — explorador de registros nativo completo

EuiProvider y Borealis permiten usar una tabla de eventos controlada con filtros de gravedad y búsqueda, y el estado local de los eventos guardados.

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 />);

Referencia de código

  • Guárdalo como src/main.jsx en el entorno de React. Esta entrada no activa StrictMode de forma intencionada.
  • El ancho acotado de la tabla de 640px es propio de la aplicación CSS; todos los elementos visuales de los componentes proceden de EUI.

Nota personalizada adaptada al tema

Usa el tema activo dentro de un proveedor en lugar de vincular el marcado personalizado a las clases generadas de los 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>;
}

Referencia de código

  • Renderiza InvestigationNote dentro de EuiProvider. La nota hereda el modo visual seleccionado.
04

Configuración del agente de diseño sistema de diseño Elastic UI

Punto de partida para la implementación

La guía oficial de EUI documenta la instalación con Yarn y la compatibilidad con React 18. Los empaquetadores que no son Webpack tienen limitaciones documentadas; este ejemplo nativo en concreto se empaquetó con esbuild y se probó en el navegador. Usa una versión de Node.js compatible con tu 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

Una instrucción para tu proyecto

Instrucción para el agente
Crea una pantalla para investigar registros con Elastic UI 123.0.0, Borealis 8.1.0 y React 18. Lee la exportación del tema y el código fuente nativo proporcionados. Usa EuiProvider, un EuiBasicTable controlado y filtros accesibles de búsqueda y gravedad. Guarda por ID de evento estable, conserva los marcadores al filtrar y distingue el estado local de la interfaz de una consulta real a Elasticsearch o de una respuesta de persistencia. Mantén la tabla dentro de los límites de la pantalla en dispositivos móviles.
05

Fuentes y alcance del sistema de diseño Elastic UI

Guía creada con OpenDesign y explorador de registros local ficticio que ejecuta Elastic UI 123.0.0 nativo con Borealis 8.1.0. Los eventos de ejemplo no son telemetría en tiempo real y la acción de guardar solo se mantiene en memoria. EUI tiene sus propias condiciones de licencia Elastic/SSPL; consulta la licencia oficial del paquete para tu distribución.