diff --git a/.changeset/moody-cougars-exist.md b/.changeset/moody-cougars-exist.md new file mode 100644 index 0000000000..c9f452b9a5 --- /dev/null +++ b/.changeset/moody-cougars-exist.md @@ -0,0 +1,5 @@ +--- +"@hashicorp/design-system-components": minor +--- + +Extended the `Hds::SideNav` component to support responsiveness (animation/transition) and content portaling by adapting existing implementation for Cloud UI diff --git a/packages/components/addon/components/hds/side-nav/home-link.hbs b/packages/components/addon/components/hds/side-nav/header/home-link.hbs similarity index 100% rename from packages/components/addon/components/hds/side-nav/home-link.hbs rename to packages/components/addon/components/hds/side-nav/header/home-link.hbs diff --git a/packages/components/addon/components/hds/side-nav/home-link.js b/packages/components/addon/components/hds/side-nav/header/home-link.js similarity index 70% rename from packages/components/addon/components/hds/side-nav/home-link.js rename to packages/components/addon/components/hds/side-nav/header/home-link.js index 965fd75978..ad83974528 100644 --- a/packages/components/addon/components/hds/side-nav/home-link.js +++ b/packages/components/addon/components/hds/side-nav/header/home-link.js @@ -6,7 +6,7 @@ import Component from '@glimmer/component'; import { assert } from '@ember/debug'; -export default class HdsSideNavHomeLinkComponent extends Component { +export default class HdsSideNavHeaderHomeLinkComponent extends Component { /** * @param ariaLabel * @type {string} @@ -16,7 +16,7 @@ export default class HdsSideNavHomeLinkComponent extends Component { let { ariaLabel } = this.args; assert( - '@ariaLabel for "Hds::SideNav::HomeLink" must have a valid value', + '@ariaLabel for "Hds::SideNav::Header::HomeLink" ("Logo") must have a valid value', ariaLabel !== undefined ); diff --git a/packages/components/addon/components/hds/side-nav/icon-button.hbs b/packages/components/addon/components/hds/side-nav/header/icon-button.hbs similarity index 100% rename from packages/components/addon/components/hds/side-nav/icon-button.hbs rename to packages/components/addon/components/hds/side-nav/header/icon-button.hbs diff --git a/packages/components/addon/components/hds/side-nav/icon-button.js b/packages/components/addon/components/hds/side-nav/header/icon-button.js similarity index 71% rename from packages/components/addon/components/hds/side-nav/icon-button.js rename to packages/components/addon/components/hds/side-nav/header/icon-button.js index 8ddde8164a..14395d65f5 100644 --- a/packages/components/addon/components/hds/side-nav/icon-button.js +++ b/packages/components/addon/components/hds/side-nav/header/icon-button.js @@ -6,7 +6,7 @@ import Component from '@glimmer/component'; import { assert } from '@ember/debug'; -export default class HdsSideNavIconButtonComponent extends Component { +export default class HdsSideNavHeaderIconButtonComponent extends Component { /** * @param ariaLabel * @type {string} @@ -16,7 +16,7 @@ export default class HdsSideNavIconButtonComponent extends Component { let { ariaLabel } = this.args; assert( - '@ariaLabel for "Hds::SideNav::IconButton" must have a valid value', + '@ariaLabel for "Hds::SideNav::Header::IconButton" must have a valid value', ariaLabel !== undefined ); diff --git a/packages/components/addon/components/hds/side-nav/header.hbs b/packages/components/addon/components/hds/side-nav/header/index.hbs similarity index 58% rename from packages/components/addon/components/hds/side-nav/header.hbs rename to packages/components/addon/components/hds/side-nav/header/index.hbs index 7f4f0b07c4..0f5423050e 100644 --- a/packages/components/addon/components/hds/side-nav/header.hbs +++ b/packages/components/addon/components/hds/side-nav/header/index.hbs @@ -4,10 +4,10 @@ }}
- + + +
+
+ +
+
+
+ + + Skip Link (A11y Refocus) + + +
+ +
+ + + + + + + +
+ Examples of sidebar navigation + + + + + Using content injected via portal + + +
+ + <:header> + + <:logo> + + + <:actions> + + + + + + + + + + + + + + + + + + + + + <:body> + + + <:footer> + OrgSelect / ContextSwitcher + + +
+
+
+ + + Services + + + + + + + + + Default Org + + + + + + + +
+ + Using yielded content + + + +
+ + <:header> + + <:logo> + + + <:actions> + + + + + + + + + + + + + + + + + + + + + + + <:body> + + + + + + Services + + + + + + + + + + + + Default Org + + + + + + + + + <:footer> + OrgSelect / ContextSwitcher + + +
+
+
+
+
+
\ No newline at end of file diff --git a/packages/components/tests/integration/components/hds/side-nav/home-link-test.js b/packages/components/tests/integration/components/hds/side-nav/header/home-link-test.js similarity index 60% rename from packages/components/tests/integration/components/hds/side-nav/home-link-test.js rename to packages/components/tests/integration/components/hds/side-nav/header/home-link-test.js index 59606e4c56..fa73c624c7 100644 --- a/packages/components/tests/integration/components/hds/side-nav/home-link-test.js +++ b/packages/components/tests/integration/components/hds/side-nav/header/home-link-test.js @@ -15,30 +15,29 @@ module('Integration | Component | hds/side-nav/home-link', function (hooks) { resetOnerror(); }); - // Basic - test('it should render the component with a CSS class that matches the component name', async function (assert) { await render( - hbs`` + hbs`` ); assert.dom('#test-home-link').hasClass('hds-side-nav__home-link'); }); - // Test Content / Args + // CONTENT test('it renders the passed in args', async function (assert) { await render( - hbs`` + hbs`` ); assert.dom('.flight-icon-hashicorp').exists(); assert .dom('#test-home-link') - .hasAttribute('href', 'https://www.hashicorp.com/'); + .hasAttribute('href', 'https://www.hashicorp.com/') + .hasAttribute('aria-label', 'Hashicorp'); }); test('it renders the logo with a custom passed in color', async function (assert) { await render( - hbs`` + hbs`` ); assert .dom('.flight-icon-boundary') @@ -49,23 +48,23 @@ module('Integration | Component | hds/side-nav/home-link', function (hooks) { test('it should spread all the attributes passed to the component on the element', async function (assert) { await render( - hbs`` + hbs`` ); - assert.dom('#test-sidenav-homelink').hasClass('my-class'); - assert.dom('#test-sidenav-homelink').hasAttribute('data-test1'); - assert.dom('#test-sidenav-homelink').hasAttribute('data-test2', 'test'); + assert.dom('#test-side-nav-homelink').hasClass('my-class'); + assert.dom('#test-side-nav-homelink').hasAttribute('data-test1'); + assert.dom('#test-side-nav-homelink').hasAttribute('data-test2', 'test'); }); // ASSERTIONS test('it should throw an assertion if @ariaLabel is missing/has no value', async function (assert) { const errorMessage = - '@ariaLabel for "Hds::SideNav::HomeLink" must have a valid value'; + '@ariaLabel for "Hds::SideNav::Header::HomeLink" ("Logo") must have a valid value'; assert.expect(2); setupOnerror(function (error) { assert.strictEqual(error.message, `Assertion Failed: ${errorMessage}`); }); - await render(hbs``); + await render(hbs``); assert.throws(function () { throw new Error(errorMessage); }); diff --git a/packages/components/tests/integration/components/hds/side-nav/icon-button-test.js b/packages/components/tests/integration/components/hds/side-nav/header/icon-button-test.js similarity index 60% rename from packages/components/tests/integration/components/hds/side-nav/icon-button-test.js rename to packages/components/tests/integration/components/hds/side-nav/header/icon-button-test.js index 083310f198..616e5dff3d 100644 --- a/packages/components/tests/integration/components/hds/side-nav/icon-button-test.js +++ b/packages/components/tests/integration/components/hds/side-nav/header/icon-button-test.js @@ -15,22 +15,20 @@ module('Integration | Component | hds/side-nav/icon-button', function (hooks) { resetOnerror(); }); - // Basic - test('it should render the component with a CSS class that matches the component name', async function (assert) { await render( - hbs`` + hbs`` ); assert .dom('#test-side-nav-icon-button') .hasClass('hds-side-nav__icon-button'); }); - // Test Content / Args + // CONTENT test('it renders the passed in args', async function (assert) { await render( - hbs`` + hbs`` ); assert.dom('.flight-icon-search').exists(); }); @@ -39,27 +37,27 @@ module('Integration | Component | hds/side-nav/icon-button', function (hooks) { test('it should render a