# Sistema de diseño HPE Grommet

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

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

## 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

| Nombre / Regla | Valor / Configuración | Uso |
| --- | --- | --- |
| global.edgeSize.hair | 1px | Tamaño predeterminado fuera del ajuste adaptable para tamaños pequeños. |
| global.edgeSize.xxsmall | 3px | Tamaño predeterminado fuera del ajuste adaptable para tamaños pequeños. |
| global.edgeSize.xsmall | 6px | Tamaño predeterminado fuera del ajuste adaptable para tamaños pequeños. |
| global.edgeSize.small | 12px | Tamaño predeterminado fuera del ajuste adaptable para tamaños pequeños. |
| global.edgeSize.medium | 24px | Tamaño predeterminado fuera del ajuste adaptable para tamaños pequeños. |
| global.edgeSize.large | 48px | Tamaño predeterminado fuera del ajuste adaptable para tamaños pequeños. |
| global.edgeSize.xlarge | 96px | Tamaño predeterminado fuera del ajuste adaptable para tamaños pequeños. |
### Ajustes adaptables para tamaños pequeños

| Nombre / Regla | Valor / Configuración | Uso |
| --- | --- | --- |
| global.breakpoints.small.value | 768 | Límite del punto de ruptura small en el tema base. |
| small.edgeSize.xxsmall | 2px | Espaciado fino para pantallas pequeñas. |
| small.edgeSize.xsmall | 3px | Espaciado xsmall para pantallas pequeñas. |
| small.edgeSize.small | 6px | Relleno adaptable pequeño. |
| small.edgeSize.medium | 12px | Relleno adaptable mediano. |
| small.edgeSize.large | 24px | Relleno grande adaptable. |
| global.breakpoints.medium.value | 1536 | Siguiente límite del punto de ruptura base. |
### Colores y controles base

| Nombre / Regla | Valor / Configuración | Uso |
| --- | --- | --- |
| 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.radius | 4px | Radio de esquina del control base. |
| global.control.border.width | 1px | Borde del control base. |
### Contrato de formulario y campos

| Nombre / Regla | Valor / Configuración | Uso |
| --- | --- | --- |
| Form.value | Object keyed by field name | Usa 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.validate | blur \| submit \| change | Elige cuándo se ejecuta la validación. |
| Form.errors | Object keyed like value | Asocia los errores remotos o de la aplicación a los campos. |
### Integración con Select y el rango

| Nombre / Regla | Valor / Configuración | Uso |
| --- | --- | --- |
| Select.options | String array or object array | El 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 options | reduce devuelve el valor asociado a la clave en lugar del objeto completo. |
| Select.labelKey | Property name or function | Etiqueta visible para las opciones de objeto. |
| Select.onSearch | Function; enables search input | Proporciona el filtrado de la aplicación cuando sea necesario. |
### Anatomía del medidor

| Nombre / Regla | Valor / Configuración | Uso |
| --- | --- | --- |
| value | number | Cantidad representada; se ignora si se proporciona values. |
| max | number or numeric string | Capacidad total disponible; no la confundas con un porcentaje. |
| type | bar \| circle \| pie \| semicircle | Usa circle para la vista general de utilización. |
| color | Color identifier | Válido con un único valor. |
| a11yTitle | string | Describe la medida y el denominador. |
| size | Named size or CSS dimension | Mantén el anillo dentro del ancho disponible. |
## 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.

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

## 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.

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

Un FormField obligatorio con name="name" contiene TextInput id="reservation-name". htmlFor vincula la etiqueta visible. El validador personalizado devuelve un error concreto si el valor, una vez eliminados los espacios iniciales y finales, tiene menos de tres caracteres. Configura la validación para que se ejecute al enviar; así, un formulario vacío que aún no se ha tocado no mostrará un error de inmediato.

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

Preparar plan guarda una instantánea local del formulario validado y de la asignación actual. No aprovisiona infraestructura. El resultado solo cambia tras un envío válido, mientras que los cambios en el control deslizante siguen siendo una propuesta. Esta distinción resulta útil para comparar un plan preparado con el borrador que se está editando.

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.

```
<!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.

```
// 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.

```
// 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.

```
<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.

## 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.

```
// 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

```
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.
```

## 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.

- Contenedor de Grommet Tema, dimensiones de página completa y ámbito de portales.

- Fuente del tema base Escala predeterminada, colores y ajustes adaptables.

- Box Diseño y relleno adaptable.

- Form Valor de objeto controlado y ciclo de validación.

- FormField Vinculación de nombres, etiquetas y validación personalizada.

- Select Callbacks de valor/opción y opciones como objetos.

- RangeInput Interacción nativa con el control deslizante de rango.

- Meter Valor, máximo y descripción accesible.

- ResponsiveContext Lee el punto de ruptura activo del tema.

- Tema HPE Paquete independiente opcional del tema de marca.

## Recursos relacionados del sistema de diseño de HPE Grommet

### Infor sistema de diseño

Crea un formulario de mantenimiento empresarial con estados reales de entrada de IDS, alias de tema y un identificador de recurso exacto. Inspecciona los tokens del tema público actual, un paquete de Web Components fijado en una versión concreta y un flujo local de borradores con validación y restablecimiento.

### Kajabi Sage

Crea un panel para compartir dirigido a creadores, con contexto claro del curso, acciones de copia evidentes y mensajes fiables sobre el portapapeles. Explora la anatomía de los componentes Rails de Sage, sus especificaciones tipográficas publicadas y la capa de tokens Pine, más reciente y cargada externamente.

### Kiwi Orbit

Una guía de Orbit centrada en viajes, con colores y espaciado reales del producto, opciones nativas de equipaje, un desglose de precios coherente y un flujo local completo de revisión.


- [Referencia de implementación](https://v2.grommet.io/grommet)
- [Fuente](https://raw.githubusercontent.com/grommet/grommet/master/src/js/themes/base.js)
- [Fuente](https://v2.grommet.io/form)
- [Fuente](https://v2.grommet.io/select)
- [Fuente](https://v2.grommet.io/meter)
- [Consulta la especificación complementaria](https://github.com/grommet/grommet-theme-hpe)
- [Consulta la especificación complementaria](https://v2.grommet.io/grommet)
- [Consulta la especificación complementaria](https://raw.githubusercontent.com/grommet/grommet/master/src/js/themes/base.js)
- [Consulta la especificación complementaria](https://v2.grommet.io/box)
- [Consulta la especificación complementaria](https://v2.grommet.io/form)
- [Consulta la especificación complementaria](https://v2.grommet.io/formfield)
- [Consulta la especificación complementaria](https://v2.grommet.io/select)
- [Consulta la especificación complementaria](https://v2.grommet.io/meter)
- [Consulta la especificación complementaria](https://v2.grommet.io/rangeinput)
- [Consulta la especificación complementaria](https://v2.grommet.io/responsivecontext)
- [Consulta la especificación complementaria](https://github.com/grommet/grommet)
- [Referencia de código](https://v2.grommet.io/grommet)
- [Referencia de código](https://github.com/grommet/grommet-theme-hpe)
- [Referencia de código](https://v2.grommet.io/select)
- [Contenedor de Grommet Tema, dimensiones de página completa y ámbito de portales.](https://v2.grommet.io/grommet)
- [Fuente del tema base Escala predeterminada, colores y ajustes adaptables.](https://raw.githubusercontent.com/grommet/grommet/master/src/js/themes/base.js)
- [Box Diseño y relleno adaptable.](https://v2.grommet.io/box)
- [Form Valor de objeto controlado y ciclo de validación.](https://v2.grommet.io/form)
- [FormField Vinculación de nombres, etiquetas y validación personalizada.](https://v2.grommet.io/formfield)
- [Select Callbacks de valor/opción y opciones como objetos.](https://v2.grommet.io/select)
- [RangeInput Interacción nativa con el control deslizante de rango.](https://v2.grommet.io/rangeinput)
- [Meter Valor, máximo y descripción accesible.](https://v2.grommet.io/meter)
- [ResponsiveContext Lee el punto de ruptura activo del tema.](https://v2.grommet.io/responsivecontext)
- [Tema HPE Paquete independiente opcional del tema de marca.](https://github.com/grommet/grommet-theme-hpe)
