Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
248ebe8
Initial commit
SeamusLeonardHPE Dec 10, 2025
71239ae
Removed unused partial
SeamusLeonardHPE Dec 12, 2025
6b21bc2
Removed unnecessary imports
SeamusLeonardHPE Dec 12, 2025
1f1e27e
Merge branch 'master' of github.com:grommet/hpe-design-system into do…
britt6612 Dec 12, 2025
746de12
add code changes
britt6612 Dec 12, 2025
19d227c
Updates from review
SeamusLeonardHPE Dec 17, 2025
713bbfd
Changed example border to weak
SeamusLeonardHPE Dec 17, 2025
3c65231
Modifed based on PR feedback ascending navigation example
SeamusLeonardHPE Jan 28, 2026
8c3dd11
Modifed based on PR feedback fix
SeamusLeonardHPE Jan 28, 2026
8336d31
Remove unnecessary fragment from HomeContent
SeamusLeonardHPE Jan 28, 2026
70c3ae0
Updated example content
SeamusLeonardHPE Feb 3, 2026
6c35542
Removed unused icon cause build fail
SeamusLeonardHPE Feb 3, 2026
dbcfdec
requested edits to example content
SeamusLeonardHPE Feb 5, 2026
bfc437e
fixed build fail
SeamusLeonardHPE Feb 5, 2026
4e6f7c8
Added code example in accordian - fixed padding issue
SeamusLeonardHPE Feb 5, 2026
37de7d3
Fixed build error
SeamusLeonardHPE Feb 5, 2026
1f32531
Content update
SeamusLeonardHPE Feb 5, 2026
160cb18
Content update from @julauxen
SeamusLeonardHPE Feb 5, 2026
eac9a19
Content update from @julauxen
SeamusLeonardHPE Feb 5, 2026
89af502
Merge branch 'master' of github.com:grommet/hpe-design-system into do…
britt6612 Feb 9, 2026
043c179
Merge branch 'master' into docs-ascending-navigation-update
britt6612 Feb 9, 2026
a6ba58c
Merge branch 'docs-ascending-navigation-update' of github.com:grommet…
britt6612 Feb 9, 2026
f83f445
merge with master
britt6612 Feb 11, 2026
f569729
update files
britt6612 Feb 11, 2026
207a0f6
Review feedback
SeamusLeonardHPE Feb 12, 2026
2884f44
Updated avatar props to standarize across other examples
SeamusLeonardHPE Feb 12, 2026
1d55c54
Removed redundant size prop, fixed card padding
SeamusLeonardHPE Feb 12, 2026
9621ba1
remove box
britt6612 Feb 12, 2026
92c2cc9
Apply suggestion from @britt6612
britt6612 Feb 12, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions aries-site/src/data/structures/templates/templates.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ export const templates = [
name: 'Ascending navigation',
available: true,
cardOrder: 101,
description: `The Ascending Button for Navigation allows
the user to navigate to a parent page from a child page
by moving upward in the application or website hierarchy.`,
description: `Ascending navigation enables users
to move up one level in an application’s hierarchy,
from a child page back to its parent.`,
preview: {
image: {
src: {
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
/* eslint-disable react/prop-types */
import React, { useState } from 'react';
import {
Anchor,
Box,
Button,
Grommet,
Header,
Markdown,
PageContent,
PageHeader,
Paragraph,
Text,
} from 'grommet';
import { hpe } from 'grommet-theme-hpe';
import { Left, Home } from '@hpe-design/icons-grommet';

import { components } from '../../../components/content/MarkdownComponents';
import { HomeContent } from './components/HomeContent';
import { sectionConfig } from './data/sections';

export const AscendingNavigationExample = () => {
const [activeSection, setActiveSection] = useState('overview');
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These represent pages, not sections. For clarity variable names should align to what they represent.

Comment applies to references of "section" throughout.

Suggested change
const [activeSection, setActiveSection] = useState('overview');
const [activePage, setActivePage] = useState('overview');


const config = sectionConfig[activeSection];
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In this a configuration or the pages content?

Suggested change
const config = sectionConfig[activeSection];
const page = pageContent[activePage];

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

updated


const sectionContent = {
home: <HomeContent onNavigate={setActiveSection} />,
overview: (
<Paragraph>
This overview page can describe the purpose of your app or design
system. It's a child of the Home page.
</Paragraph>
),
components: (
<>
<Text weight="bold">Components in use in this example:</Text>
<Markdown components={components}>
{`- \`Page\`, \`PageContent\`, \`PageHeader\`
- \`Box\`, \`Header\`, \`Nav\`, \`Button\`
- \`Text\`, \`Paragraph\`, \`Anchor\``}
</Markdown>
</>
),
help: (
<>
<Text weight="bold">To create this demo application:</Text>
<Markdown components={components}>
{
`1. Create a React sandbox
2. Install \`grommet\`, \`grommet-theme-hpe\`, \`@hpe-design/icons-grommet\`
3. Replace your App.js with this template`
}
</Markdown>
</>
),
};

return (
<Grommet theme={hpe}>
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should not have a Grommet wrapper here.

Suggested change
<Grommet theme={hpe}>

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed

<Box
background="background-back"
width="full"
border={{ color: 'border-weak', size: 'xsmall' }}
pad={{ bottom: 'xlarge' }}
>
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We are re-creating how "Example containers" are displayed within the site and creating fragmentation, additional deviation and overhead. Why not just use the Example container's properties for consistency?

Suggested change
<Box
background="background-back"
width="full"
border={{ color: 'border-weak', size: 'xsmall' }}
pad={{ bottom: 'xlarge' }}
>
<>

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Replaced custom box container with example.

<Header
pad={{ horizontal: 'medium', vertical: 'small' }}
background="background-front"
>
<Button
default
icon={<Home />}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The screen reader will read out both "Go to Home page" and the icon's aria-label "Home". Which is redundant and confusing. Need to suppress the latter.

Suggested change
icon={<Home />}
icon={<Home aria-hidden="true" />}

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

added

onClick={() => setActiveSection('home')}
hoverIndicator="background"
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is unnecessary.

Suggested change
hoverIndicator="background"

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

removed

a11yTitle="Go to Home page"
/>
</Header>
<Box>
<PageContent gap="small">
<PageHeader
title={config.label}
subtitle={config.subtitle}
parent={
activeSection !== 'home' ? (
<Anchor
label="Home"
icon={<Left />}
onClick={() => setActiveSection('home')}
/>
) : undefined
}
actions={
activeSection !== 'home' && <Button label="Primary" primary />
}
/>
<Box gap="small">{sectionContent[activeSection]}</Box>
</PageContent>
</Box>
</Box>
</Grommet>
);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/* eslint-disable react/prop-types */
import { Paragraph, Grid } from 'grommet';
import { SectionCard } from './SectionCard';
import { sections } from '../data/sections';

export const HomeContent = ({ onNavigate }) => (
<>
<Paragraph>
Use the navigation in the header or the cards below to explore different
sections of this demo app. While on any nested page the{' '}
<strong>Ascending navigation</strong> will bring you home.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why capitalized? This is not a proper noun.

Why so bold? It is resolving to 700 weight. It should resolve to 500 weight.

Suggested change
<strong>Ascending navigation</strong> will bring you home.
<strong>ascending navigation</strong> will bring you home.
Screenshot 2026-01-22 at 4 57 27 PM

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed this text and will let example be self explanatory

</Paragraph>
<Grid columns="small" gap="small">
{sections.map(section => (
<SectionCard key={section.id} section={section} onClick={onNavigate} />
))}
</Grid>
</>
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
/* eslint-disable react/prop-types */
import { Button } from 'grommet';

export const NavigationButton = ({ section, isActive, onClick }) => (
<Button
default
icon={section.icon}
label={section.label}
active={isActive}
onClick={() => onClick(section.id)}
/>
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
/* eslint-disable react/prop-types */
import { Card, Box, Heading, Paragraph } from 'grommet';
import { LinkNext } from '@hpe-design/icons-grommet';

export const SectionCard = ({ section, onClick }) => (
<Card default onClick={() => onClick(section.id)} pad="xsmall">
<Box direction="row" fill justify="between">
<Heading
level="2"
margin={{
horizontal: 'none',
vertical: '3xsmall',
}}
>
{section.label}
</Heading>
<LinkNext height="xxlarge" />
</Box>

<Paragraph>
This leads to the {section.label} page of your HPE Design System demo app.
</Paragraph>
</Card>
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { Announce, Help, Template } from '@hpe-design/icons-grommet';
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not really a fan of this pattern here because it is harder to read and takes a lot of effort to follow. For clarity and flexibility, I'd rather follow the pattern you use in HomeContent.js. Similarly create OverviewContent.js, Components.js, Help.js and eliminate the whole config concept.

Instead you can replace all of that with:

const [activePage, setActivePage] = useContext('home');

const pageContent = {
  home: <HomeContent />,
  overview: <OverviewContent />,
  components: <ComponentsContent />,
  help: <HelpContent />
};


....

<>
  {pageContent[activePage]}
<>

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Moved into separate pages and named PageOne, PageTwo... etc so we can update to any content.


export const sections = [
{ id: 'overview', label: 'Overview', icon: <Announce size="small" /> },
{ id: 'components', label: 'Components', icon: <Template size="small" /> },
{ id: 'help', label: 'Help', icon: <Help size="small" /> },
];

export const sectionConfig = {
home: { label: 'Home', subtitle: 'HPE Design System demo.' },
overview: { label: 'Overview', subtitle: 'This is the overview section.' },
components: {
label: 'Components',
subtitle: 'This is the components section.',
},
help: { label: 'Help', subtitle: 'This is the help section.' },
};
Comment on lines +3 to +31
Copy link
Collaborator

@halocline halocline Jan 23, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@julauxen - How did we arrive at the content this example is displaying? I don't see the new content documented in the issue. Only a reference to replace static images.

Historically we have tried to author content which is more representative of the real world scenarios consumers of the HPE Design System will be encountering so that it is more recognizable and relatable.

One of the key things this example needs to communicate is the parent-child relationship and the associated navigation. I'm not sure the Home page use case is the most compelling or representative for the concepts we want to communicate.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@halocline I'll take accountability for forging ahead with code before agreeing upon content.

Ive updated to use a similar pattern to the previous image example
Identity & access > User
https://deploy-preview-5653--keen-mayer-a86c8b.netlify.app/templates/ascending-navigation

@julauxen we can decide if i should remove additional pages or choose suitable content (which will be easy now that the frame work is solid)

image

Copy link
Collaborator

@julauxen julauxen Feb 5, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sorry I missed this comment, thanks for adjusting the content, both here and after our syncs

Original file line number Diff line number Diff line change
@@ -1 +1 @@
export * from './AscendingNavigationAnatomy';
export * from './AscendingNavigationExample';
76 changes: 36 additions & 40 deletions aries-site/src/pages/templates/ascending-navigation.mdx
Original file line number Diff line number Diff line change
@@ -1,59 +1,55 @@
import { DiagramPreview, Example } from '../../layouts';
import { AscendingNavigationAnatomy } from '../../examples';
import { Example } from '../../layouts';
import {
AscendingNavigationExample
} from '../../examples';
import { Text } from 'grommet';

When an application’s hierarchy is well designed, the ascending button will typically take the user
back to the previous page they came from.
The `parent` property on [PageHeader](https://design-system.hpe.design/components/PageHeader) generates a link to the immediate upstream page in the hierarchy.

<Example
caption="Example of an ascending button."
plain
pad="xsmall"
previewWidth="medium"
height={{ min: 'xsmall' }}
>
<DiagramPreview
src={{
dark: '/templateImages/ascending-button-preview-invert.svg',
light: '/templateImages/ascending-button-preview.svg',
}}
alt="ascending button in an application"
/>
</Example>

## Guidance

- Follows the [default button styling](https://design-system.hpe.design/components/button#default-button) with a "FormPrevious" icon.
- Displayed below the Header and aligned to the left with the pages content.

## When to use

- To allow users to return to the parent (hub) screen when on a details (child/spoke) page.
- To visually communicate the parent page for the user’s current page.

## Example

Ascending Navigation provides an easy way for a user to move from a child page up to a parent page.

<Example
caption={
<>
<Text margin={{ top: 'xsmall' }} size="small">
{' '}
1. A preview of Users detail view (child page).
1. Page loads on <strong>Overview</strong> child page
</Text>
<br></br>
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are we using caption (which renders in the DOM as a figcaption) appropriately here? It seems like we are trying to describe the experience/interaction behavior vs. the figcaption "describing the rest of the contents of its parent

element."

I'd expect a figcaption to read "Example demonstrating how an "ascending navigation" anchor allows a user to navigate from a child page to its parent."

I'm not sure the "1. Page loads on Overview child page" and "2. Interacting with the Ascending Navigation link brings the user to the home page" adds much value -- can likely be eliminated. If we do think describing these interactions is needed, this should probably be placed in line with the preceding paragraph.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed

<Text margin={{ top: 'xsmall' }} size="small">
{' '}
2. A preview of Ascending Navigation to the parent page utilizing the ascending
button.
2. Interacting with the <strong>Ascending Navigation</strong> link brings the user to the home page.
</Text>
</>
}
plain
pad="xsmall"
previewWidth="xlarge"
height={{ min: 'xsmall' }}
pad={{
bottom: "xlarge"
}}
previewWidth="full"
>
<AscendingNavigationAnatomy />
<AscendingNavigationExample />
</Example>

```txt
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we are going to display this code sample inline, this should be jsx not txt.

Suggested change
```txt
```jsx

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated to jsx

<PageHeader
parent={ <Anchor label="Home" icon={<Left />} a11yTitle="Link to the home page" />}
title="Example page title"
subtitle="I'm a direct child of the homepage"
/>
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm curious why we are deviating from the form factor / pattern for our typical example containers and showing code inline vs. "show example code"? Is this an intentional deviation? If so, what's the rationale?

I'd think we'd be making use of <Example />'s code prop.

Screenshot 2026-01-22 at 2 15 11 PM

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will need to connect with @britt6612 to help me learn how to add raw code urls via code prop

```

## Guidance
- Renders as a standard anchor link using [default anchor styling](https://design-system.hpe.design/components/anchor).
- Should be paired with a [**Left**](https://hpe-design-icons-grommet.netlify.app/?path=/story/icons-hpe-icons-for-grommet--default&args=iconName:Left) icon to clearly communicate backward navigation.
- Keep the label short and contextual, match the parent name to set navigation expectaions.
- Use only one ascending link per page.

## When to use

Use ascending navigation when your product has a parent/child or hub/spoke page structure and users may need to return to the parent context.

- Detail pages that roll up into an overview page.
- Spoke pages that sit under a central hub.
- Nested workflows where returning to previous context is important.