Software empresarial · Nuevo recurso

Sistema de diseño HPE Grommet.

Modela una reserva de capacidad con las primitivas de diseño de Grommet, campos de formulario controlados e indicadores numéricos. Usa deliberadamente la escala del tema y distingue el tema base de Grommet del tema de HPE, que se instala por separado.

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

Vista previa de la interfaz del sistema de diseño HPE Grommet

Ajusta una asignación propuesta y prepara un plan local validado.

Planificador de reservas de capacidadAbrir ejemplo completo
Interpretación independiente de HTML/CSS de las dimensiones y los colores de Grommet base, con Arial como fuente elegida explícitamente; no es el tema independiente de HPE. · Referencia de implementación
02

Referencia de diseño del sistema de diseño HPE Grommet

Tema base de Grommet v2 generado con baseSpacing=24 y scale=6; estos no son valores de grommet-theme-hpe. El proyecto inicial nativo establece explícitamente Arial y los colores de marca y de foco mostrados como opciones del tema de la aplicación.

Escala predeterminada de tamaños de borde

Fuente
Nombre / ReglaValor / ConfiguraciónUso
global.edgeSize.hair1pxTamaño predeterminado fuera del ajuste adaptable para tamaños pequeños.
global.edgeSize.xxsmall3pxTamaño predeterminado fuera del ajuste adaptable para tamaños pequeños.
global.edgeSize.xsmall6pxTamaño predeterminado fuera del ajuste adaptable para tamaños pequeños.
global.edgeSize.small12pxTamaño predeterminado fuera del ajuste adaptable para tamaños pequeños.
global.edgeSize.medium24pxTamaño predeterminado fuera del ajuste adaptable para tamaños pequeños.
global.edgeSize.large48pxTamaño predeterminado fuera del ajuste adaptable para tamaños pequeños.
global.edgeSize.xlarge96pxTamaño predeterminado fuera del ajuste adaptable para tamaños pequeños.

Ajustes adaptables para tamaños pequeños

Fuente
Nombre / ReglaValor / ConfiguraciónUso
global.breakpoints.small.value768Límite del punto de ruptura small en el tema base.
small.edgeSize.xxsmall2pxEspaciado fino para pantallas pequeñas.
small.edgeSize.xsmall3pxEspaciado xsmall para pantallas pequeñas.
small.edgeSize.small6pxRelleno adaptable pequeño.
small.edgeSize.medium12pxRelleno adaptable mediano.
small.edgeSize.large24pxRelleno grande adaptable.
global.breakpoints.medium.value1536Siguiente límite del punto de ruptura base.

Colores y controles base

Fuente
Nombre / ReglaValor / ConfiguraciónUso
global.colors.brand#7D4CDB Color de marca predeterminado de Grommet, no el verde de HPE.
global.colors.focus#6FFFB0 Color de acento predeterminado para el foco.
global.colors.text.light#444444 Texto del cuerpo para el tema claro.
global.colors.text.dark#f8f8f8 Texto del cuerpo para el tema oscuro.
global.colors.background-front.light#FFFFFF Superficie frontal clara.
global.colors.background-front.dark#444444 Superficie frontal oscura.
global.control.border.radius4pxRadio de esquina del control base.
global.control.border.width1pxBorde del control base.

Contrato de formulario y campos

Fuente
Nombre / ReglaValor / ConfiguraciónUso
Form.valueObject keyed by field nameUsa un único objeto de reserva controlado.
Form.onChange(value) => {}Recibe el objeto actualizado, no un evento del DOM.
Form.onSubmit({ value, touched }) => {}Lee el valor actual aceptado del formulario.
Form.validateblur | submit | changeElige cuándo se ejecuta la validación.
Form.errorsObject keyed like valueAsocia los errores remotos o de la aplicación a los campos.

Integración con Select y el rango

Fuente
Nombre / ReglaValor / ConfiguraciónUso
Select.optionsString array or object arrayEl ejemplo usa cadenas para mantener sencilla la estructura del valor.
Select.onChange({ value, option }) => {}No leas event.target.value para Select.
Select.valueKey{ key, reduce } for object optionsreduce devuelve el valor asociado a la clave en lugar del objeto completo.
Select.labelKeyProperty name or functionEtiqueta visible para las opciones de objeto.
Select.onSearchFunction; enables search inputProporciona el filtrado de la aplicación cuando sea necesario.

Anatomía del medidor

Fuente
Nombre / ReglaValor / ConfiguraciónUso
valuenumberCantidad representada; se ignora si se proporciona values.
maxnumber or numeric stringCapacidad total disponible; no la confundas con un porcentaje.
typebar | circle | pie | semicircleUsa circle para la vista general de utilización.
colorColor identifierVálido con un único valor.
a11yTitlestringDescribe la medida y el denominador.
sizeNamed size or CSS dimensionMantén el anillo dentro del ancho disponible.
03

HPE Grommet 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-hpe-grommet.md

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

Descargar la guía

Sistema de diseño HPE Grommet: Grommet base y el tema HPE

No etiquetes el morado como un token de HPE

Grommet es un framework React asociado a HPE que tiene su propio tema base. El paquete independiente grommet-theme-hpe exporta hpe para las aplicaciones que adoptan el estilo de diseño de HPE. Esta referencia explica el framework base y un ejemplo configurado explícitamente. El morado de marca y el color menta de foco proceden del tema base; no se presentan como la paleta actual de marca de HPE.

De esta guía de OpenDesign

Consulta la especificación complementaria

Un tema de aplicación pequeño y explícito

La configuración establece Arial como fuente elegida para la aplicación y reitera los colores de marca y de foco documentados para el tema base. Todas las demás reglas de los componentes heredan de Grommet. En su lugar, un producto real de HPE puede pasar el tema aprobado hpe; después, debe comprobar el espaciado y la tipografía resultantes, ya que las sobrescrituras del tema pueden modificar los valores base que se indican aquí.

Consulta la especificación complementaria

Sistema de diseño HPE Grommet: las escalas del tema pueden cambiar en un punto de ruptura

Los valores con nombre son decisiones adaptables

El generador base comienza en 24 píxeles. El espaciado medio predeterminado de los bordes es 24px, pero el punto de ruptura pequeño cambia el valor medio a 12px. Por lo tanto, un Box que use relleno adaptable puede reducirse aunque el JSX siga indicando medium. Consulta la escala junto con la sobrescritura del punto de ruptura; no des por sentado que medium siempre equivale a veinticuatro píxeles.

Consulta la especificación complementaria

Usa Box para la distribución real

El planificador usa un Box en columna como página y un Box adaptable en fila o columna para el formulario y el resumen de capacidad. El formulario hijo puede expandirse mientras el resumen mantiene un ancho mínimo útil. En pantallas pequeñas, el gráfico aparece después de los controles, de acuerdo con el orden del documento.

Consulta la especificación complementaria

Sistema de diseño HPE Grommet: una base legible definida deliberadamente

El tamaño de fuente y la altura de línea son valores independientes del tema

El generador base deriva una fuente de dieciocho píxeles y una altura de línea de veinticuatro píxeles a partir de su valor de espaciado. El ejemplo usa explícitamente esa combinación con Arial para no dar a entender que se ha descargado una fuente de marca propietaria. Los encabezados usan Grommet Heading y el texto usa Text, lo que permite que el tema determine sus funciones en lugar de reproducir los detalles internos de los componentes en CSS.

Consulta la especificación complementaria

Sistema de diseño HPE Grommet: un único objeto de reserva controlado

Los nombres vinculan los campos con el formulario

Form se encarga del contrato coordinado del formulario. En el patrón controlado, value y onChange corresponden a quien llama al componente. El name de cada FormField y del elemento de entrada hijo identifica la clave de valor correspondiente. Nuestro objeto de reserva contiene name y pool. El control deslizante de capacidad se mantiene como un número independiente porque actualiza un diagrama en directo antes del envío.

Consulta la especificación complementaria

Validar el nombre de la reserva

Consulta la especificación complementaria

Sistema de diseño HPE Grommet: Select tiene su propio formato de evento

Las cadenas mantienen predecible el caso sencillo

Las opciones de grupo de ejemplo son Production y Development. Por tanto, el valor controlado es una cadena. Si pasas a usar opciones de objeto, configura labelKey y, si quieres, valueKey con reduce; después, mantén el valor almacenado coherente con esa elección. onChange de Select expone un objeto value/option, a diferencia del evento del control de rango nativo.

Consulta la especificación complementaria

La búsqueda y la carga de opciones son tareas de la aplicación

Select puede mostrar un campo de búsqueda cuando se proporciona onSearch. Esa propiedad no significa que todas las opciones se hayan filtrado automáticamente. Mantén por separado la colección de origen sin filtrar para poder restaurarla al cerrar o borrar la búsqueda. En el ejemplo se omite intencionadamente la búsqueda para los dos grupos.

Consulta la especificación complementaria

Sistema de diseño HPE Grommet: un medidor necesita unidades y un denominador

Representa la capacidad, no un porcentaje sin contexto

Meter recibe la cantidad usada proyectada y max=100. En este planificador ilustrativo, el grupo de ejemplo ya tiene 35 unidades en uso y la reserva propuesta oscila entre 5 y 60. El porcentaje coincide por casualidad con la cantidad porque el denominador de la demostración es cien. Aun así, el código pasa max explícitamente para que el contrato de datos siga siendo válido si cambia el total.

Consulta la especificación complementaria

Mantén sincronizados el gráfico y el texto

El círculo, la etiqueta de uso proyectado y las unidades restantes se derivan del mismo valor numérico del control deslizante. RangeInput nativo emite un evento del DOM, así que convierte event.target.value a Number antes de hacer operaciones aritméticas. De lo contrario, al sumar una cadena a treinta y cinco, el total puede parecer correcto, aunque sea incorrecto.

Consulta la especificación complementaria

Sistema de diseño HPE Grommet: desplazamiento del documento y composición para pantallas estrechas

Elige full="min" para esta página

Grommet full=true está pensado para una aplicación que controla su propia ventana gráfica y el desplazamiento interno. Este planificador usa full="min" para que el documento pueda crecer. Así se evita que el formulario y su mensaje de validación queden atrapados en un contenedor de altura fija en un teléfono.

Consulta la especificación complementaria

Lee ResponsiveContext dentro de Grommet

Un componente hijo consume el contexto actual y elige columna para pantallas pequeñas y fila para las demás. El proveedor debe envolver ese componente para que el contexto refleje el tema elegido. Cuando el ancho disponible es reducido, la distribución alternativa sigue siendo una columna natural.

  • Coloca las etiquetas de los campos encima de sus controles.
  • Coloca el resumen de capacidad después de los controles en el orden del código fuente.
  • Permite que la fila de acciones se ajuste a varias líneas sin ocultar el texto de validación.

Consulta la especificación complementaria

Conecta la etiqueta, el error y la medición en el sistema de diseño de HPE Grommet

Indica el significado de cada valor numérico

El control de rango tiene una etiqueta persistente y una unidad visible. El círculo recibe un a11yTitle que incluye el uso previsto y la capacidad total. El texto cercano muestra los mismos números para que la información no dependa de un arco de color. El mensaje de error describe el problema con la reserva y permanece junto a su campo.

Consulta la especificación complementaria

Explicita el resultado local

  1. Envía el formulario con el nombre vacío y comprueba el error del campo obligatorio.
  2. Escribe un nombre, elige un grupo y ajusta la asignación.
  3. Prepara el plan y comprueba que la instantánea local incluya el grupo elegido y las unidades numéricas.

Consulta la especificación complementaria

Monta una composición completa de Grommet en el sistema de diseño de HPE Grommet

Instala el framework y su dependencia de estilos

Instala grommet con styled-components y el entorno de ejecución React en un proyecto de cliente. La configuración monta Grommet y, después, un componente secundario que consume ResponsiveContext, un Form controlado, FormField/TextInput/Select, RangeInput y Meter. Usa la propiedad label de Button en lugar de children para dejar explícito el comportamiento predeterminado del botón con estilo de etiqueta.

Consulta la especificación complementaria

Ejemplos de componentes del sistema de diseño de HPE Grommet

Muestra interactiva independiente completa

Guarda el documento completo como index.html y ábrelo en un navegador. Interpretación independiente de HTML/CSS de las dimensiones y los colores base de Grommet, con Arial como fuente elegida explícitamente; no es el tema HPE independiente.

HTML
<!doctype html><html lang="en"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Capacity reservation — Grommet study</title><style>*{box-sizing:border-box}body{margin:0;background:white;color:#444;font:18px/24px Arial,sans-serif}header{padding:24px 36px;border-bottom:1px solid #ddd;display:flex;gap:12px;align-items:center}.mark{width:22px;height:22px;border:4px solid #7d4cdb;border-radius:50%}main{max-width:1050px;margin:auto;padding:36px}h1{font-size:36px;line-height:42px;margin:12px 0 24px;color:#222}h2{font-size:24px;line-height:30px;margin:0 0 12px}.intro{max-width:650px;margin-bottom:36px}.layout{display:grid;grid-template-columns:minmax(0,1fr) 310px;gap:48px}label{display:block;font-weight:600;margin-bottom:12px}input,select,button{font:inherit;max-width:100%}input[type=text],select{width:100%;border:1px solid #888;border-radius:4px;background:transparent;padding:12px;color:#444}input:focus-visible,select:focus-visible,button:focus-visible{outline:3px solid #6fffb0;outline-offset:3px}.field{margin-bottom:24px}input[type=range]{width:100%;accent-color:#7d4cdb}.limits{display:flex;justify-content:space-between;font-size:14px;color:#666;margin-top:6px}button{border:2px solid #7d4cdb;border-radius:24px;background:#7d4cdb;color:white;padding:10px 24px;font-weight:600;cursor:pointer}button:hover{background:#6839c0}aside{background:#f2f2f2;padding:24px;border-radius:12px;align-self:start;text-align:center}.ring{width:192px;height:192px;border-radius:50%;background:conic-gradient(#7d4cdb var(--used),#dadada 0);margin:24px auto;display:grid;place-items:center;position:relative}.ring:before{content:'';position:absolute;inset:12px;background:#f2f2f2;border-radius:50%}.ring span{position:relative;font-size:36px;font-weight:bold}.ring small{display:block;font-size:14px;font-weight:400;line-height:20px}.legend{text-align:left;border-top:1px solid #ddd;padding-top:12px;font-size:14px}.legend div{display:flex;justify-content:space-between;margin:8px 0}.error{font-size:14px;color:#b30000;margin-top:6px}#result{background:#f2f2f2;border-left:4px solid #7d4cdb;padding:24px;margin-top:36px}footer{font-size:12px;line-height:18px;color:#666;border-top:1px solid #ddd;padding:24px 36px}@media(max-width:700px){main{padding:24px}.layout{grid-template-columns:1fr;gap:24px}h1{font-size:30px;line-height:36px}header,footer{padding:24px}.intro{margin-bottom:24px}}</style><header><span class="mark" aria-hidden="true"></span><strong>Capacity planner</strong></header><main><h1>Plan a reservation</h1><p class="intro">Explore a proposed allocation before preparing a local plan. This model contains 100 capacity units.</p><div class="layout"><form id="form" novalidate><div class="field"><label for="name">Reservation name</label><input id="name" type="text" required aria-describedby="error"><div class="error" id="error" hidden></div></div><div class="field"><label for="pool">Capacity pool</label><select id="pool"><option>Production</option><option>Development</option></select></div><div class="field"><label for="units">Requested allocation: <output id="requested">20</output> units</label><input id="units" type="range" min="5" max="60" step="5" value="20"><div class="limits"><span>5 units</span><span>60 units</span></div></div><button type="submit">Prepare plan</button><p style="font-size:14px;color:#666">No infrastructure will be provisioned.</p></form><aside><h2>Projected usage</h2><div class="ring" id="ring" style="--used:55%" role="img" aria-label="55 of 100 units projected usage"><span><output id="used">55</output><small>of 100 units</small></span></div><div class="legend"><div><span>Already used</span><strong>35</strong></div><div><span>Proposed reservation</span><strong id="proposed">20</strong></div><div><span>Remaining</span><strong id="remaining">45</strong></div></div></aside></div><section id="result" hidden><h2>Prepared local plan</h2><p id="snapshot" role="status"></p><p style="font-size:14px">This snapshot changes only when you prepare the plan again.</p></section></main><footer>Independent base Grommet HTML/CSS interpretation. Base purple/mint palette and spacing; Arial is an application font choice. This is not the separate HPE branded theme.</footer><script>
const $=id=>document.getElementById(id);$('units').oninput=()=>{const units=Number($('units').value),used=35+units;$('requested').textContent=$('proposed').textContent=units;$('used').textContent=used;$('remaining').textContent=100-used;$('ring').style.setProperty('--used',used+'%');$('ring').setAttribute('aria-label',used+' of 100 units projected usage')};$('form').onsubmit=e=>{e.preventDefault();const name=$('name').value.trim();if(name.length<3){$('error').textContent='Use at least three characters for the reservation name.';$('error').hidden=false;$('name').setAttribute('aria-invalid','true');$('name').focus();return}$('error').hidden=true;$('name').removeAttribute('aria-invalid');$('snapshot').textContent=name+' · '+$('pool').value+' · '+$('units').value+' units. Prepared in this local demonstration.';$('result').hidden=false};
</script></html>

Referencia de código

  • Los cálculos de capacidad usan el grupo de muestra que se muestra. La composición independiente es una interpretación de HTML; el ejemplo nativo selecciona el tema base de Grommet, no el tema HPE independiente.

Entrada de implementación nativa completa

La implementación completa de la configuración, reunida aquí junto con las explicaciones específicas de API. Sigue los requisitos documentados de paquetes y compilación en la sección de configuración.

jsx
// npm install react react-dom grommet styled-components
import React, { useContext, useState } from 'react';
import { createRoot } from 'react-dom/client';
import { Grommet, Box, Heading, Text, Form, FormField, TextInput,
 Select, RangeInput, Meter, Button, ResponsiveContext } from 'grommet';
const theme={global:{font:{family:'Arial, sans-serif',size:'18px',height:'24px'},colors:{brand:'#7D4CDB',focus:'#6FFFB0'}}};
function Planner(){
 const size=useContext(ResponsiveContext);
 const [value,setValue]=useState({name:'',pool:'Production'});
 const [units,setUnits]=useState(20),[plan,setPlan]=useState(null);
 const used=35+units;
 return <Box pad="medium" gap="medium" width={{max:'large'}} margin="auto">
 <Heading level={1} margin="none">Plan a reservation</Heading>
 <Text>Local capacity model. No infrastructure is provisioned.</Text>
 <Box direction={size==='small'?'column':'row'} gap="large">
 <Box flex><Form value={value} onChange={setValue} validate="submit" onSubmit={({value:accepted})=>setPlan({...accepted,units})}>
 <FormField name="name" htmlFor="reservation-name" label="Reservation name" required validate={name=>String(name || '').trim().length<3?'Use at least three characters':undefined}>
 <TextInput name="name" id="reservation-name"/></FormField>
 <FormField name="pool" htmlFor="pool" label="Capacity pool"><Select name="pool" id="pool" options={['Production','Development']}/></FormField>
 <Box gap="small" margin={{vertical:'medium'}}><label htmlFor="units">Requested allocation: {units} units</label>
 <RangeInput id="units" min={5} max={60} step={5} value={units} onChange={event=>setUnits(Number(event.target.value))}/></Box>
 <Button type="submit" primary label="Prepare plan"/>
 </Form></Box>
 <Box align="center" gap="small" pad="medium" background="light-2" round="small">
 <Meter type="circle" value={used} max={100} size="small" thickness="small" color="brand" a11yTitle={`${used} of 100 units projected usage`}/>
 <Text weight="bold">{used} / 100 units used</Text><Text>{100-used} units remaining</Text>
 </Box></Box>
 {plan&&<Box background="light-2" pad="medium" role="status"><Text>Local plan: {plan.name} · {plan.pool} · {plan.units} units</Text></Box>}
 </Box>
}
createRoot(document.getElementById('root')).render(<Grommet theme={theme} themeMode="light" full="min"><Planner/></Grommet>);

Referencia de código

  • Archivo main.jsx de cliente para un proyecto con un elemento raíz. Grommet con el tema base y una fuente de aplicación/anulación de marca declarada explícitamente. No se presupone silenciosamente ningún tema HPE. API contrastado con la documentación oficial; aquí no se ha verificado la compilación nativa.

Cambia deliberadamente al tema de marca HPE

Usa el paquete independiente solo si ese es el objetivo de diseño; vuelve a comprobar los valores con la versión instalada.

jsx
// npm install grommet-theme-hpe
import { Grommet } from 'grommet';
import { hpe } from 'grommet-theme-hpe';
// Wrap the Planner from the full setup example:
<Grommet theme={hpe} themeMode="light" full="min"><Planner /></Grommet>

Referencia de código

  • La tabla de referencia anterior describe el tema base, no esta anulación opcional.

Valores de Select como objetos

Guarda el id de un grupo y muestra su etiqueta.

jsx
<Select options={[{id:'prod',label:'Production'},{id:'dev',label:'Development'}]}
 labelKey="label" valueKey={{key:'id',reduce:true}}
 value={poolId} onChange={({value})=>setPoolId(value)} />

Referencia de código

  • Declara poolId/setPoolId con useState en el componente que realiza la llamada.
  • Con reduce activado, el valor guardado es el id, no el objeto.
04

Configuración del agente del sistema de diseño de HPE Grommet

Punto de partida para la implementación

Archivo main.jsx de cliente para un proyecto con un elemento raíz. Grommet con el tema base y una fuente de aplicación/anulación de marca declarada explícitamente. No se presupone silenciosamente ningún tema HPE. API contrastado con la documentación oficial; aquí no se ha verificado la compilación nativa.

jsx
// npm install react react-dom grommet styled-components
import React, { useContext, useState } from 'react';
import { createRoot } from 'react-dom/client';
import { Grommet, Box, Heading, Text, Form, FormField, TextInput,
 Select, RangeInput, Meter, Button, ResponsiveContext } from 'grommet';
const theme={global:{font:{family:'Arial, sans-serif',size:'18px',height:'24px'},colors:{brand:'#7D4CDB',focus:'#6FFFB0'}}};
function Planner(){
 const size=useContext(ResponsiveContext);
 const [value,setValue]=useState({name:'',pool:'Production'});
 const [units,setUnits]=useState(20),[plan,setPlan]=useState(null);
 const used=35+units;
 return <Box pad="medium" gap="medium" width={{max:'large'}} margin="auto">
 <Heading level={1} margin="none">Plan a reservation</Heading>
 <Text>Local capacity model. No infrastructure is provisioned.</Text>
 <Box direction={size==='small'?'column':'row'} gap="large">
 <Box flex><Form value={value} onChange={setValue} validate="submit" onSubmit={({value:accepted})=>setPlan({...accepted,units})}>
 <FormField name="name" htmlFor="reservation-name" label="Reservation name" required validate={name=>String(name || '').trim().length<3?'Use at least three characters':undefined}>
 <TextInput name="name" id="reservation-name"/></FormField>
 <FormField name="pool" htmlFor="pool" label="Capacity pool"><Select name="pool" id="pool" options={['Production','Development']}/></FormField>
 <Box gap="small" margin={{vertical:'medium'}}><label htmlFor="units">Requested allocation: {units} units</label>
 <RangeInput id="units" min={5} max={60} step={5} value={units} onChange={event=>setUnits(Number(event.target.value))}/></Box>
 <Button type="submit" primary label="Prepare plan"/>
 </Form></Box>
 <Box align="center" gap="small" pad="medium" background="light-2" round="small">
 <Meter type="circle" value={used} max={100} size="small" thickness="small" color="brand" a11yTitle={`${used} of 100 units projected usage`}/>
 <Text weight="bold">{used} / 100 units used</Text><Text>{100-used} units remaining</Text>
 </Box></Box>
 {plan&&<Box background="light-2" pad="medium" role="status"><Text>Local plan: {plan.name} · {plan.pool} · {plan.units} units</Text></Box>}
 </Box>
}
createRoot(document.getElementById('root')).render(<Grommet theme={theme} themeMode="light" full="min"><Planner/></Grommet>);

Una instrucción para tu proyecto

Instrucción para el agente
Implementa el planificador de reservas suministrado con Grommet base, un Form controlado, FormFields con nombre, Select, RangeInput y un Meter con max explícito. Mantén separados los valores del tema base y de grommet-theme-hpe. Convierte el valor del control deslizante en un número, muestra las unidades, valida el nombre y genera únicamente una instantánea local del plan.
05

Fuentes y alcance del sistema de diseño de HPE Grommet

Referencia de implementación independiente con Grommet base. La adopción del tema de marca HPE se muestra por separado. Las cifras de capacidad son datos locales ficticios, no métricas de infraestructura ni de aprovisionamiento.