# HPE Grommet デザインシステム

## HPE Grommet デザインシステムのインターフェースプレビュー

割り当て案を調整し、検証済みのローカルプランを作成します。

## HPE Grommet デザインシステムのデザインリファレンス

baseSpacing=24 と scale=6 を使用して生成した Grommet v2 の基本テーマです。これらは grommet-theme-hpe の値ではありません。ネイティブのスターターでは、Arial と、例示したブランドカラーおよびフォーカスカラーをアプリ側のテーマ設定として明示しています。

### 標準のエッジサイズスケール

| 名前 / ルール | 値 / 設定 | 用途 |
| --- | --- | --- |
| global.edgeSize.hair | 1px | 小サイズのレスポンシブ上書き以外で使われる標準サイズ。 |
| global.edgeSize.xxsmall | 3px | 小サイズのレスポンシブ上書き以外で使われる標準サイズ。 |
| global.edgeSize.xsmall | 6px | 小サイズのレスポンシブ上書き以外で使われる標準サイズ。 |
| global.edgeSize.small | 12px | 小サイズのレスポンシブ上書き以外で使われる標準サイズ。 |
| global.edgeSize.medium | 24px | 小サイズのレスポンシブ上書き以外で使われる標準サイズ。 |
| global.edgeSize.large | 48px | 小サイズのレスポンシブ上書き以外で使われる標準サイズ。 |
| global.edgeSize.xlarge | 96px | 小サイズのレスポンシブ上書き以外で使われる標準サイズ。 |
### 小サイズのレスポンシブ上書き

| 名前 / ルール | 値 / 設定 | 用途 |
| --- | --- | --- |
| global.breakpoints.small.value | 768 | 基本テーマでの小サイズのブレークポイント境界。 |
| small.edgeSize.xxsmall | 2px | 小画面向けの細かい間隔。 |
| small.edgeSize.xsmall | 3px | 小画面向けの極小間隔。 |
| small.edgeSize.small | 6px | 小画面でのレスポンシブパディング。 |
| small.edgeSize.medium | 12px | 中画面でのレスポンシブパディング。 |
| small.edgeSize.large | 24px | レスポンシブ時の大きめのパディング。 |
| global.breakpoints.medium.value | 1536 | 次の基本ブレークポイント境界。 |
### 基本の色とコントロール

| 名前 / ルール | 値 / 設定 | 用途 |
| --- | --- | --- |
| global.colors.brand | #7D4CDB | HPE グリーンではなく、Grommet の標準ブランドカラー。 |
| global.colors.focus | #6FFFB0 | 標準のフォーカスアクセント。 |
| global.colors.text.light | #444444 | ライトテーマの本文テキスト。 |
| global.colors.text.dark | #f8f8f8 | ダークテーマの本文テキスト。 |
| global.colors.background-front.light | #FFFFFF | 手前側の明るいサーフェス。 |
| global.colors.background-front.dark | #444444 | 手前側の暗いサーフェス。 |
| global.control.border.radius | 4px | コントロールの基本角丸。 |
| global.control.border.width | 1px | コントロールの基本ボーダー。 |
### フォームとフィールドの仕様

| 名前 / ルール | 値 / 設定 | 用途 |
| --- | --- | --- |
| Form.value | Object keyed by field name | 制御対象の予約オブジェクトを1つ使用してください。 |
| Form.onChange | (value) => {} | DOM イベントではなく、更新済みのオブジェクトを受け取ります。 |
| Form.onSubmit | ({ value, touched }) => {} | フォームで現在受け入れられている値を読み取ります。 |
| Form.validate | blur \| submit \| change | 入力検証を実行するタイミングを選択します。 |
| Form.errors | Object keyed like value | リモートまたはアプリケーションのエラーを各フィールドに関連付けます。 |
### Select と範囲入力の連携

| 名前 / ルール | 値 / 設定 | 用途 |
| --- | --- | --- |
| Select.options | String array or object array | 値の形式をシンプルに保つため、この例では文字列を使用します。 |
| Select.onChange | ({ value, option }) => {} | Select では event.target.value を読み取らないでください。 |
| Select.valueKey | { key, reduce } for object options | reduce はオブジェクト全体ではなく、キーに対応する値を返します。 |
| Select.labelKey | Property name or function | オブジェクト形式の選択肢に表示ラベルを指定します。 |
| Select.onSearch | Function; enables search input | 必要に応じて、アプリケーション側の絞り込み処理を指定します。 |
### Meter の構成

| 名前 / ルール | 値 / 設定 | 用途 |
| --- | --- | --- |
| value | number | 表示する量です。values を指定すると無視されます。 |
| max | number or numeric string | 利用可能な容量の合計です。値をパーセントと取り違えないでください。 |
| type | bar \| circle \| pie \| semicircle | 利用状況の概要には circle を使用します。 |
| color | Color identifier | 単一の値に対応します。 |
| a11yTitle | string | 指標と分母を説明します。 |
| size | Named size or CSS dimension | 利用可能な幅の内側にリングを収めます。 |
## HPE Grommet デザインシステム完全ガイド

実際のインターフェースで、このデザインシステムを選び、適用し、レビューするための実践ガイドです。

詳しいガイダンス、実装の出発点、ソースへのリンクをまとめています。

## HPE Grommet デザインシステム：Grommet の基本テーマと HPE テーマ

### 紫色を HPE のデザイントークンとして表示しない

> Grommet は HPE に関連する React フレームワークで、独自の基本テーマを備えています。別途提供される grommet-theme-hpe パッケージは、HPE のデザインスタイルを採用するアプリケーション向けに hpe をエクスポートします。このリファレンスでは、基本フレームワークと、テーマを明示的に設定した例を解説します。ブランドカラーの紫色とフォーカスカラーのミントグリーンは基本テーマに由来し、現在の HPE ブランドカラーとして示しているものではありません。

関連する仕様を確認する

### アプリケーション側で明示的に指定するシンプルなテーマ

この設定では、アプリケーションで選択したフォントとして Arial を指定し、ドキュメントに記載されている基本テーマのブランドカラーとフォーカスカラーを再指定しています。それ以外のコンポーネントのルールは、すべて Grommet から継承します。実際の HPE 製品では、代わりに承認済みの hpe テーマを渡すことができます。その場合、テーマの上書きによって基本値が変わる可能性があるため、ここに記載した基本値と照らし合わせて、適用後の余白とタイポグラフィを確認してください。

関連する仕様を確認する

## HPE Grommet デザインシステム：テーマのスケールはブレークポイントで変わることがある

### 名前付きの値にはレスポンシブな意図がある

基本ジェネレーターは 24 ピクセルから始まります。デフォルトでは中サイズの端の余白は 24px ですが、小さいブレークポイントでは中サイズが 12px に変わります。そのため、レスポンシブな padding を使う Box は、JSX に medium と記述されていても縮小することがあります。スケールとブレークポイントの上書きをあわせて確認し、medium が常に 24 ピクセルだと断言しないでください。

関連する仕様を確認する

### 実際のレイアウトには Box を使う

このプランナーでは、ページに column の Box を使い、フォームと容量の概要にはレスポンシブな row/column の Box を使います。フォームは伸縮し、概要には実用的な最小幅が保たれます。小さな画面では、ドキュメント上の順序に沿って、グラフがコントロールの後に表示されます。

関連する仕様を確認する

## HPE Grommet デザインシステム：読みやすさを意識した基準値を明示する

### フォントサイズと行の高さは別々のテーマ値

基本ジェネレーターは、間隔の入力値から 18 ピクセルのフォントサイズと 24 ピクセルの行の高さを導きます。この例では、その組み合わせと Arial を明示的に使用し、独自のブランドフォントをダウンロードしたかのような印象を与えないようにしています。見出しには Grommet の Heading、本文には Text を使うことで、CSS 内にコンポーネントの内部実装を再現せずに、テーマにそれぞれの役割を解決させます。

関連する仕様を確認する

## HPE Grommet デザインシステム：予約情報を1つのオブジェクトで管理する

### name でフィールドと値を紐付ける

フォーム全体の連携には Form を使います。制御するパターンでは、value と onChange を呼び出し元が管理します。各 FormField と子入力要素に設定する name は、対応する値のキーを指定します。この予約情報オブジェクトには name と pool が含まれています。容量スライダーは、送信前に図をリアルタイムで更新するため、別の数値として保持します。

関連する仕様を確認する

### 予約名を検証する

name="name" を指定した必須の FormField で、TextInput id="reservation-name" を囲みます。htmlFor で表示ラベルと入力欄を関連付けます。カスタムバリデーターは、前後の空白を除いた値が3文字未満の場合に、具体的なエラーを返します。入力されていない空のフォームを最初からエラー表示にしないよう、validation は submit に設定します。

関連する仕様を確認する

## HPE Grommet デザインシステム：Select のイベント形式は独自

### シンプルなケースでは文字列を使う

サンプルの pool オプションは Production と Development です。そのため、制御対象の値は文字列になります。オブジェクト形式のオプションに切り替える場合は、labelKey と、必要に応じて reduce を使った valueKey を設定し、その選択に合わせて保存する値を統一してください。Select の onChange が公開するのは value/option オブジェクトで、ネイティブの range input イベントとは異なります。

関連する仕様を確認する

### 検索とオプションの読み込みはアプリケーション側で処理する

onSearch が指定されている場合、Select に検索フィールドが表示されます。ただし、この prop を指定しても、すべての option が自動的に絞り込まれるわけではありません。検索を閉じたりクリアしたりしたときに元に戻せるよう、絞り込み前のデータは別に保持してください。2つの候補プールを使うサンプルでは、意図的に検索を省略しています。

関連する仕様を確認する

## HPE Grommet デザインシステム：Meter には単位と分母が必要

### 意味がわからない割合ではなく、容量を表す

Meter には、予測使用量と max=100 を渡します。この例示用プランナーでは、サンプルの pool ですでに35単位が使用されており、新たな予約量は5から60まで指定できます。デモの分母が100であるため、割合と数値が偶然一致します。合計容量が変わってもデータの契約を維持できるよう、コードでは max を明示的に渡しています。

関連する仕様を確認する

### グラフとテキストの値を連動させる

円形グラフ、予測使用量のラベル、残りの容量は、同じスライダー値から算出します。ネイティブの RangeInput は DOM イベントを返すため、計算の前に event.target.value を Number に変換してください。変換しないと、文字列に 35 を加算して、見た目はもっともらしくても誤った合計になることがあります。

関連する仕様を確認する

## HPE Grommet デザインシステム：ドキュメントのスクロールと狭い画面での構成

### このページには full="min" を使う

Grommet の full=true は、ビューポートと内部スクロールをアプリケーション側で管理する場合を想定しています。このプランナーでは full="min" を使い、ドキュメントが伸びるようにします。これにより、スマートフォンでフォームや検証メッセージが固定高さのシェル内に閉じ込められるのを防げます。

関連する仕様を確認する

### Grommet 内で ResponsiveContext を読み取る

子コンポーネントで現在のコンテキストを読み取り、小さい画面では column、それ以外では row を選択します。テーマに応じたコンテキストを取得するには、その子コンポーネントをプロバイダーで囲む必要があります。利用可能な幅が狭い場合、フォールバックのレイアウトは自然な縦並びになります。

- フィールドのラベルは入力欄の上に配置します。

- 容量の概要は、ソース上でコントロールの後に配置します。

- 検証テキストを隠さずに、アクション行を折り返せるようにします。

関連する仕様を確認する

## HPE Grommet デザインシステム：ラベル、エラー、測定値を関連付ける

### 数値表示には必ず意味を添える

範囲コントロールには、常に表示されるラベルと単位を付けます。円形グラフの a11yTitle には、予測使用量と総容量を含めます。色付きの弧だけに情報を頼らないよう、近くのテキストにも同じ数値を表示します。エラーテキストでは予約に関する問題を具体的に示し、該当するフィールドの近くに表示します。

関連する仕様を確認する

### この画面内での結果を明示する

「プランを準備」すると、検証済みフォームと現在の割り当てのスナップショットがローカルに保存されます。インフラストラクチャはプロビジョニングされません。有効な内容を送信した後にのみ結果が変わり、スライダーの変更は提案として扱われます。この違いにより、準備済みのプランと現在編集中の下書きを比較できます。

1. 名前を空のまま送信し、必須項目のエラーが表示されることを確認してください。

2. 名前を入力し、プールを選択して割り当てを調整してください。

3. プランを準備し、ローカルのスナップショットに選択したプールと数値の単位が含まれていることを確認してください。

関連する仕様を確認する

## HPE Grommet デザインシステム Grommetの構成一式をマウントする

### フレームワークとスタイル用ピア依存パッケージをインストールする

クライアントプロジェクトに、styled-componentsとReactランタイムとともにgrommetをインストールします。Grommetをマウントし、その後にResponsiveContextを利用する子要素、制御されたForm、FormField/TextInput/Select、RangeInput、Meterを配置します。Buttonではchildrenではなくlabelを使い、デフォルトのラベルスタイル付きボタンの動作を明示してください。

関連する仕様を確認する

## HPE Grommet デザインシステムのコンポーネント例

### 完全なスタンドアロンのインタラクティブ見本

ドキュメント全体をindex.htmlとして保存し、ブラウザーで開いてください。ベースGrommetの寸法と色をHTML/CSSに基づいて独自に解釈し、Arialフォントを明示的に選択しています。別途提供されるHPEテーマとは異なります。

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

コードリファレンス

- 容量の計算には、表示されているサンプルプールを使用します。スタンドアロンのレイアウトは独自のHTMLに基づきます。ネイティブの例では、別途提供されるHPEテーマではなくベースGrommetを選択しています。

### 完全なネイティブ実装のエントリ

セットアップの完全な実装を、焦点を絞った API の解説とあわせてここにまとめています。セットアップに記載されたパッケージとビルドの前提条件に従ってください。

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

コードリファレンス

- ルート要素を持つプロジェクト向けのクライアント側main.jsxです。ベースGrommetに、アプリケーションのフォントとブランドの上書きを明示的に追加しています。HPEテーマが暗黙に適用されることはありません。APIは公式ドキュメントと照合済みです。この環境ではネイティブのコンパイルを検証していません。

### HPEブランドテーマに意図的に切り替える

そのデザインを目標とする場合に限り、別パッケージを使用してください。値はインストール済みのリリースに照らして再確認してください。

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

コードリファレンス

- 上の参照表はベーステーマについてのものであり、この任意の上書きには適用されません。

### Selectのオブジェクト値

プールIDを保存し、ラベルを表示します。

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

コードリファレンス

- 呼び出し元のコンポーネントでuseStateを使ってpoolId/setPoolIdを宣言します。

- reduceを有効にすると、保存される値はオブジェクトではなくIDになります。

## HPE Grommet デザインシステムのエージェント設定

### 実装の出発点

ルート要素を持つプロジェクト向けのクライアント側main.jsxです。ベースGrommetに、アプリケーションのフォントとブランドの上書きを明示的に追加しています。HPEテーマが暗黙に適用されることはありません。APIは公式ドキュメントと照合済みです。この環境ではネイティブのコンパイルを検証していません。

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

### あなたのプロジェクト向けプロンプト

```
提供されたベースGrommetの予約プランナーを、制御されたForm、名前付きFormField、Select、RangeInput、明示的なmaxを指定したMeterで実装します。ベーステーマの値とgrommet-theme-hpeの値を区別してください。スライダーの値を数値に変換して単位を表示し、名前を検証したうえで、ローカルのプランスナップショットのみを生成します。
```

## HPE Grommet デザインシステムの参照元と対象範囲

ベースGrommetを独自に実装するための参考資料です。HPEブランドテーマの採用例は別途示します。容量の数値は架空のローカルデータであり、インフラストラクチャの指標でもプロビジョニングでもありません。

- Grommetのコンテナ テーマ、ページ全体のサイズ設定、ポータルの適用範囲。

- ベーステーマのソース デフォルトのスケール、色、レスポンシブ時の上書き。

- Box レイアウトとレスポンシブなパディング。

- Form 制御されたオブジェクト値と検証のライフサイクル。

- FormField 名前のバインド、ラベル、カスタム検証。

- Select 値／オプションのコールバックとオブジェクト形式のオプション。

- RangeInput ネイティブの範囲選択操作。

- Meter 値、最大値、アクセシブルな説明。

- ResponsiveContext 現在のテーマのブレークポイントを読み取ります。

- HPEテーマ 独立した任意のブランドテーマパッケージ。

## HPE Grommet デザインシステムの関連リソース

### Infor デザインシステム

実際のIDS入力状態、テーマのエイリアス、正確なアセット識別子を使って、企業向け保守フォームを構成します。公開中のテーマトークン、バージョンを固定したWeb Componentsパッケージ、入力検証とリセットに対応したローカル下書きのワークフローを確認できます。

### Kajabi Sage

クリエイター向けの共有パネルを作成し、コースの情報を読みやすく示し、コピー操作を分かりやすくして、クリップボードの状態を正確に伝えます。Sage の Rails コンポーネントの構造、公開されているタイポグラフィ仕様、外部から読み込む新しい Pine トークンレイヤーを確認できます。

### Kiwi Orbit

実際の製品カラーとスペーシング、標準の手荷物選択、統一された料金の内訳、ローカルで完結するレビューの一連の流れを備えた、旅行に特化したOrbitガイドです。


- [実装リファレンス](https://v2.grommet.io/grommet)
- [ソース](https://raw.githubusercontent.com/grommet/grommet/master/src/js/themes/base.js)
- [ソース](https://v2.grommet.io/form)
- [ソース](https://v2.grommet.io/select)
- [ソース](https://v2.grommet.io/meter)
- [関連する仕様を確認する](https://github.com/grommet/grommet-theme-hpe)
- [関連する仕様を確認する](https://v2.grommet.io/grommet)
- [関連する仕様を確認する](https://raw.githubusercontent.com/grommet/grommet/master/src/js/themes/base.js)
- [関連する仕様を確認する](https://v2.grommet.io/box)
- [関連する仕様を確認する](https://v2.grommet.io/form)
- [関連する仕様を確認する](https://v2.grommet.io/formfield)
- [関連する仕様を確認する](https://v2.grommet.io/select)
- [関連する仕様を確認する](https://v2.grommet.io/meter)
- [関連する仕様を確認する](https://v2.grommet.io/rangeinput)
- [関連する仕様を確認する](https://v2.grommet.io/responsivecontext)
- [関連する仕様を確認する](https://github.com/grommet/grommet)
- [コードリファレンス](https://v2.grommet.io/grommet)
- [コードリファレンス](https://github.com/grommet/grommet-theme-hpe)
- [コードリファレンス](https://v2.grommet.io/select)
- [Grommetのコンテナ テーマ、ページ全体のサイズ設定、ポータルの適用範囲。](https://v2.grommet.io/grommet)
- [ベーステーマのソース デフォルトのスケール、色、レスポンシブ時の上書き。](https://raw.githubusercontent.com/grommet/grommet/master/src/js/themes/base.js)
- [Box レイアウトとレスポンシブなパディング。](https://v2.grommet.io/box)
- [Form 制御されたオブジェクト値と検証のライフサイクル。](https://v2.grommet.io/form)
- [FormField 名前のバインド、ラベル、カスタム検証。](https://v2.grommet.io/formfield)
- [Select 値／オプションのコールバックとオブジェクト形式のオプション。](https://v2.grommet.io/select)
- [RangeInput ネイティブの範囲選択操作。](https://v2.grommet.io/rangeinput)
- [Meter 値、最大値、アクセシブルな説明。](https://v2.grommet.io/meter)
- [ResponsiveContext 現在のテーマのブレークポイントを読み取ります。](https://v2.grommet.io/responsivecontext)
- [HPEテーマ 独立した任意のブランドテーマパッケージ。](https://github.com/grommet/grommet-theme-hpe)
