From 6b09b643ab7f9acd0288ce25435fc634bbd9a536 Mon Sep 17 00:00:00 2001 From: Susmitha Girumala Date: Tue, 2 Jun 2020 09:29:40 -0400 Subject: [PATCH 1/9] =?UTF-8?q?chore:=20=F0=9F=A4=96=20Introduce=20main=20?= =?UTF-8?q?content=20header=20rose=20component?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Main content header component contains a title(basic & dropdown) with actions. --- .../components/rose/layout/main/header.js | 7 ++ .../rose/layout/main/header.stories.mdx | 66 ++++++++++++++++ .../rose/layout/main/header/title.js | 7 ++ .../rose/components/header/_dropdown.scss | 23 ++++-- .../styles/rose/components/layout/_index.scss | 2 + .../rose/components/layout/main/_index.scss | 1 + .../components/layout/main/header/_index.scss | 75 +++++++++++++++++++ .../styles/rose/utilities/_dropdown.scss | 18 +++++ .../components/rose/header/dropdown.hbs | 2 +- .../components/rose/layout/main/header.hbs | 11 +++ .../rose/layout/main/header/title.hbs | 19 +++++ .../app/components/rose/layout/main/header.js | 1 + .../rose/layout/main/header/title.js | 1 + .../rose/layout/main/header-test.js | 60 +++++++++++++++ .../rose/layout/main/header/title-test.js | 59 +++++++++++++++ 15 files changed, 345 insertions(+), 7 deletions(-) create mode 100644 addons/rose/addon/components/rose/layout/main/header.js create mode 100644 addons/rose/addon/components/rose/layout/main/header.stories.mdx create mode 100644 addons/rose/addon/components/rose/layout/main/header/title.js create mode 100644 addons/rose/addon/styles/rose/components/layout/main/_index.scss create mode 100644 addons/rose/addon/styles/rose/components/layout/main/header/_index.scss create mode 100644 addons/rose/addon/styles/rose/utilities/_dropdown.scss create mode 100644 addons/rose/addon/templates/components/rose/layout/main/header.hbs create mode 100644 addons/rose/addon/templates/components/rose/layout/main/header/title.hbs create mode 100644 addons/rose/app/components/rose/layout/main/header.js create mode 100644 addons/rose/app/components/rose/layout/main/header/title.js create mode 100644 addons/rose/tests/integration/components/rose/layout/main/header-test.js create mode 100644 addons/rose/tests/integration/components/rose/layout/main/header/title-test.js diff --git a/addons/rose/addon/components/rose/layout/main/header.js b/addons/rose/addon/components/rose/layout/main/header.js new file mode 100644 index 0000000000..74d5391270 --- /dev/null +++ b/addons/rose/addon/components/rose/layout/main/header.js @@ -0,0 +1,7 @@ +import Component from '@ember/component'; +import layout from '../../../../templates/components/rose/layout/main/header'; + +export default Component.extend({ + layout, + tagName: '', +}); diff --git a/addons/rose/addon/components/rose/layout/main/header.stories.mdx b/addons/rose/addon/components/rose/layout/main/header.stories.mdx new file mode 100644 index 0000000000..3d2dda848a --- /dev/null +++ b/addons/rose/addon/components/rose/layout/main/header.stories.mdx @@ -0,0 +1,66 @@ +import { Meta, Story, Preview } from '@storybook/addon-docs/blocks'; +import { hbs } from 'ember-cli-htmlbars'; +import { action } from '@storybook/addon-actions'; +import { text, boolean, select } from '@storybook/addon-knobs'; + + + +# Layout | Main Header + +A header component for main layout component with ability to configure title and action buttons. Title can be configured to be a either a dropdown component or a simple heading title. The title dropdown is `Rose::Header::Dropdown` component where as all header actions are `Rose::Button` components. + +```html + + + + Menu item + Menu item + Button menu item + + + Secondary + Primary + +``` + + + {{ + template: hbs` + + + + Menu item + Menu item + Button menu item + + + Secondary + Primary + + `, + context: { + pagetitle: text('page title', 'Page Section Title'), + dropdownIcon: select( + 'dropdown icon', + { + 'user-square-fill': 'user-square-fill', + 'check-circle-outline': 'check-circle-outline', + 'copy-action': 'copy-action', + 'unfold-more': 'unfold-more', + 'unfold-less': 'unfold-less', + }, + 'user-square-fill' + ), + }, + }} + + +Main page title can configured to be a basic title. + +```html + + + +``` diff --git a/addons/rose/addon/components/rose/layout/main/header/title.js b/addons/rose/addon/components/rose/layout/main/header/title.js new file mode 100644 index 0000000000..285af1ebbf --- /dev/null +++ b/addons/rose/addon/components/rose/layout/main/header/title.js @@ -0,0 +1,7 @@ +import Component from '@ember/component'; +import layout from '../../../../../templates/components/rose/layout/main/header/title'; + +export default Component.extend({ + layout, + tagName: '', +}); diff --git a/addons/rose/addon/styles/rose/components/header/_dropdown.scss b/addons/rose/addon/styles/rose/components/header/_dropdown.scss index bf6ab366d2..5436c1b572 100644 --- a/addons/rose/addon/styles/rose/components/header/_dropdown.scss +++ b/addons/rose/addon/styles/rose/components/header/_dropdown.scss @@ -1,22 +1,32 @@ -@use 'sass:map'; @use '../../variables/sizing'; @use '../../utilities/type'; +@use '../../utilities/dropdown'; -$dropdown-chevron: ( - 'default': - "data:image/svg+xml;utf-8,", +@include dropdown.dropdown-style( + 'light', + ( + color: var(--white), + chevron: 'light', + ) +); + +@include dropdown.dropdown-style( + 'dark', + ( + color: var(--black), + chevron: 'dark', + ) ); .rose-header-dropdown { position: relative; + display: inline-block; .rose-header-dropdown-trigger { cursor: default; overflow: hidden; display: flex; align-items: center; - color: var(--white); - background: url(map.get($dropdown-chevron, default)) no-repeat right center; background-size: sizing.rems(m); margin-right: sizing.rems(s); padding-right: sizing.rems(l) - sizing.rems(xxs); @@ -68,6 +78,7 @@ $dropdown-chevron: ( background: var(--subtle); box-shadow: 0 $xxs $xxs rgba(var(--stark-components), var(--opacity-3)), 0 $xxs $xs rgba(var(--stark-components), var(--opacity-4)); + z-index: 99; } &.dropdown-right { diff --git a/addons/rose/addon/styles/rose/components/layout/_index.scss b/addons/rose/addon/styles/rose/components/layout/_index.scss index 909cdbc83c..33944c8fe9 100644 --- a/addons/rose/addon/styles/rose/components/layout/_index.scss +++ b/addons/rose/addon/styles/rose/components/layout/_index.scss @@ -1,6 +1,8 @@ @use '../../variables/sizing'; @use '../../variables/media'; +@import 'main'; + .rose-layout-page { display: grid; grid-template-areas: diff --git a/addons/rose/addon/styles/rose/components/layout/main/_index.scss b/addons/rose/addon/styles/rose/components/layout/main/_index.scss new file mode 100644 index 0000000000..6053ec3184 --- /dev/null +++ b/addons/rose/addon/styles/rose/components/layout/main/_index.scss @@ -0,0 +1 @@ +@import 'header'; diff --git a/addons/rose/addon/styles/rose/components/layout/main/header/_index.scss b/addons/rose/addon/styles/rose/components/layout/main/header/_index.scss new file mode 100644 index 0000000000..6e4be91b63 --- /dev/null +++ b/addons/rose/addon/styles/rose/components/layout/main/header/_index.scss @@ -0,0 +1,75 @@ +@use '../../../../utilities/type' as typography; +@use '../../../../variables/sizing'; +@use '../../../../variables/media'; + +.rose-layout-main-header { + display: grid; + grid-template-areas: 'title title actions'; + grid-template-columns: 1fr auto; + + .rose-layout-main-header-title { + display: inline-block; + grid-area: title; + + .rose-layout-main-header-title-text { + display: inline-block; + color: var(--stark); + } + + .rose-layout-main-header-title-icon { + vertical-align: sub; + + svg { + width: sizing.rems(l); + width: sizing.rems(l); + } + } + } + + .rose-header-dropdown { + .rose-header-dropdown-trigger-text { + // Apply heading level 1 style to text to fit page section style spec + // Duplicate of h1 style defined in typography + @include typography.type(h1, bold); + margin-top: sizing.rems(m); + margin-bottom: sizing.rems(xs); + + margin-right: sizing.rems(xs); + } + + .rose-header-dropdown-trigger { + background-size: sizing.rems(l); + background-position: right (sizing.rems(m) + sizing.rems(s)); + } + + .rose-icon > svg { + vertical-align: sub; + } + } + + .rose-layout-main-header-actions { + grid-area: actions; + display: flex; + align-items: center; + justify-content: flex-end; + + // Remove margin to align action buttons with h1 text + button { + margin-bottom: 0; + } + } +} + +@media (max-width: media.width(small)) { + .rose-layout-main-header { + grid-template-columns: 1fr; + grid-template-rows: 1fr auto; + grid-template-areas: + 'title' + 'actions'; + + .rose-layout-main-header-actions { + flex-wrap: wrap; + } + } +} diff --git a/addons/rose/addon/styles/rose/utilities/_dropdown.scss b/addons/rose/addon/styles/rose/utilities/_dropdown.scss new file mode 100644 index 0000000000..059d2d56dc --- /dev/null +++ b/addons/rose/addon/styles/rose/utilities/_dropdown.scss @@ -0,0 +1,18 @@ +@use 'sass:map'; + +$dropdown-chevron: ( + 'light': + "data:image/svg+xml;utf-8,", + 'dark': + "data:image/svg+xml;utf-8,", +); + +@mixin dropdown-style($name, $default) { + .rose-header-dropdown-#{$name} { + .rose-header-dropdown-trigger { + color: map.get($default, color); + background: url(map.get($dropdown-chevron, map.get($default, chevron))) + no-repeat right center; + } + } +} diff --git a/addons/rose/addon/templates/components/rose/header/dropdown.hbs b/addons/rose/addon/templates/components/rose/header/dropdown.hbs index 86406b2d9a..cc874c2840 100644 --- a/addons/rose/addon/templates/components/rose/header/dropdown.hbs +++ b/addons/rose/addon/templates/components/rose/header/dropdown.hbs @@ -1,6 +1,6 @@
diff --git a/addons/rose/addon/templates/components/rose/layout/main/header.hbs b/addons/rose/addon/templates/components/rose/layout/main/header.hbs new file mode 100644 index 0000000000..9634fdb25d --- /dev/null +++ b/addons/rose/addon/templates/components/rose/layout/main/header.hbs @@ -0,0 +1,11 @@ +
+ {{yield (hash + title=(component 'rose/layout/main/header/title') + )}} + +
+ {{yield (hash + action=(component 'rose/button') + )}} +
+
diff --git a/addons/rose/addon/templates/components/rose/layout/main/header/title.hbs b/addons/rose/addon/templates/components/rose/layout/main/header/title.hbs new file mode 100644 index 0000000000..1147d6c483 --- /dev/null +++ b/addons/rose/addon/templates/components/rose/layout/main/header/title.hbs @@ -0,0 +1,19 @@ +
+ {{#if (has-block)}} + {{yield (hash + dropdown=(component 'rose/header/dropdown' style='dark') + )}} + {{else}} +
+ {{#if @icon}} + {{inline-svg @icon}} + {{/if}} + + {{#if @text}} +

{{@text}}

+ {{/if}} +
+ {{/if}} +
diff --git a/addons/rose/app/components/rose/layout/main/header.js b/addons/rose/app/components/rose/layout/main/header.js new file mode 100644 index 0000000000..cc3ca87693 --- /dev/null +++ b/addons/rose/app/components/rose/layout/main/header.js @@ -0,0 +1 @@ +export { default } from 'rose/components/rose/layout/main/header'; diff --git a/addons/rose/app/components/rose/layout/main/header/title.js b/addons/rose/app/components/rose/layout/main/header/title.js new file mode 100644 index 0000000000..c189eb8d51 --- /dev/null +++ b/addons/rose/app/components/rose/layout/main/header/title.js @@ -0,0 +1 @@ +export { default } from 'rose/components/rose/layout/main/header/title'; diff --git a/addons/rose/tests/integration/components/rose/layout/main/header-test.js b/addons/rose/tests/integration/components/rose/layout/main/header-test.js new file mode 100644 index 0000000000..e2261a66d9 --- /dev/null +++ b/addons/rose/tests/integration/components/rose/layout/main/header-test.js @@ -0,0 +1,60 @@ +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render, find, findAll } from '@ember/test-helpers'; +import hbs from 'htmlbars-inline-precompile'; + +module('Integration | Component | rose/layout/main/header', function (hooks) { + setupRenderingTest(hooks); + + test('it renders', async function (assert) { + await render(hbs``); + assert.ok(find('.rose-layout-main-header')); + }); + + test('it renders with title', async function (assert) { + await render(hbs` + + `); + assert.ok(find('.rose-layout-main-header-title')); + assert.equal( + find('.rose-layout-main-header-title').textContent.trim(), + 'header title' + ); + }); + + test('it renders with dropdown title', async function (assert) { + await render(hbs` + + + + `); + assert.ok(find('.rose-header-dropdown')); + assert.equal( + find('.rose-layout-main-header-title').textContent.trim(), + 'Dropdown title' + ); + }); + + test('it renders with dropdown title menu', async function (assert) { + await render(hbs` + + + Menu item + Button menu item + + + `); + assert.ok(find('.rose-header-dropdown')); + assert.equal(findAll('a').length, 1); + assert.equal(findAll('button').length, 1); + }); + + test('it renders with actions', async function (assert) { + await render(hbs` + + + `); + assert.ok(find('.rose-layout-main-header-actions')); + assert.ok(findAll('button').length, 2); + }); +}); diff --git a/addons/rose/tests/integration/components/rose/layout/main/header/title-test.js b/addons/rose/tests/integration/components/rose/layout/main/header/title-test.js new file mode 100644 index 0000000000..8d7fef6ac6 --- /dev/null +++ b/addons/rose/tests/integration/components/rose/layout/main/header/title-test.js @@ -0,0 +1,59 @@ +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render, click, find, findAll } from '@ember/test-helpers'; +import hbs from 'htmlbars-inline-precompile'; + +module('Integration | Component | rose/layout/main/header/title', function ( + hooks +) { + setupRenderingTest(hooks); + + test('it renders', async function (assert) { + await render(hbs``); + assert.ok(find('.rose-layout-main-header-title')); + }); + + test('it renders with title', async function (assert) { + await render( + hbs`` + ); + assert.equal( + find('.rose-layout-main-header-title-text').textContent.trim(), + 'header title' + ); + }); + + test('it renders with title as dropdown', async function (assert) { + await render(hbs` + + Menu item + Menu item + Button menu item + Button menu item + Button menu item + + `); + assert.equal( + find('.rose-header-dropdown-trigger').textContent.trim(), + 'header title' + ); + assert.equal(findAll('a').length, 2); + assert.equal(findAll('button').length, 3); + }); + + test('it opens title dropdown on click', async function (assert) { + await render(hbs` + + Menu item + Menu item + Button menu item + Button menu item + Button menu item + + `); + await click('summary'); + assert.ok(find('#dropdown').open); + await click('#title'); + assert.notOk(find('#dropdown').open); + }); +}); From 33d85940bf4af15c6a6aec1caa9f300fa249483e Mon Sep 17 00:00:00 2001 From: Susmitha Girumala Date: Tue, 2 Jun 2020 15:17:47 -0400 Subject: [PATCH 2/9] =?UTF-8?q?chore:=20=F0=9F=A4=96=20Add=20page=20header?= =?UTF-8?q?=20component=20to=20rose=20addon?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Page header component comprises of a simple 1x1 grid component --- .../components/rose/layout/page-header.js | 7 ++++++ .../rose/layout/page-header.stories.mdx | 23 +++++++++++++++++++ .../styles/rose/components/layout/_index.scss | 1 + .../rose/components/layout/_page-header.scss | 19 +++++++++++++++ .../components/rose/layout/page-header.hbs | 3 +++ .../app/components/rose/layout/page-header.js | 1 + .../rose/layout/page-header-test.js | 23 +++++++++++++++++++ 7 files changed, 77 insertions(+) create mode 100644 addons/rose/addon/components/rose/layout/page-header.js create mode 100644 addons/rose/addon/components/rose/layout/page-header.stories.mdx create mode 100644 addons/rose/addon/styles/rose/components/layout/_page-header.scss create mode 100644 addons/rose/addon/templates/components/rose/layout/page-header.hbs create mode 100644 addons/rose/app/components/rose/layout/page-header.js create mode 100644 addons/rose/tests/integration/components/rose/layout/page-header-test.js diff --git a/addons/rose/addon/components/rose/layout/page-header.js b/addons/rose/addon/components/rose/layout/page-header.js new file mode 100644 index 0000000000..e7ed1d3900 --- /dev/null +++ b/addons/rose/addon/components/rose/layout/page-header.js @@ -0,0 +1,7 @@ +import Component from '@ember/component'; +import layout from '../../../templates/components/rose/layout/page-header'; + +export default Component.extend({ + layout, + tagName: '', +}); diff --git a/addons/rose/addon/components/rose/layout/page-header.stories.mdx b/addons/rose/addon/components/rose/layout/page-header.stories.mdx new file mode 100644 index 0000000000..c771ba93af --- /dev/null +++ b/addons/rose/addon/components/rose/layout/page-header.stories.mdx @@ -0,0 +1,23 @@ +import { Meta, Story, Preview } from '@storybook/addon-docs/blocks'; +import { hbs } from 'ember-cli-htmlbars'; +import { action } from '@storybook/addon-actions'; + + + +# Layout|Page Header + +A page layout/positioning component that configures a single column grid for use as a header. + +```htmlbars + +``` + + + {{ + template: hbs` + + Page Header + + `, + }} + diff --git a/addons/rose/addon/styles/rose/components/layout/_index.scss b/addons/rose/addon/styles/rose/components/layout/_index.scss index 33944c8fe9..40c35ee12c 100644 --- a/addons/rose/addon/styles/rose/components/layout/_index.scss +++ b/addons/rose/addon/styles/rose/components/layout/_index.scss @@ -2,6 +2,7 @@ @use '../../variables/media'; @import 'main'; +@import 'page-header'; .rose-layout-page { display: grid; diff --git a/addons/rose/addon/styles/rose/components/layout/_page-header.scss b/addons/rose/addon/styles/rose/components/layout/_page-header.scss new file mode 100644 index 0000000000..0fb1fe8eb0 --- /dev/null +++ b/addons/rose/addon/styles/rose/components/layout/_page-header.scss @@ -0,0 +1,19 @@ +@use '../../variables/media'; + +.rose-layout-page-header { + display: grid; + grid-template-areas: + 'title title utilities'; + grid-template-columns: 1fr auto; + grid-template-rows: auto 1fr; +} + +@media (max-width: media.width(small)) { + .rose-layout-page { + grid-template-columns: 1fr; + grid-template-rows: 0.1fr auto 1fr; + grid-template-areas: + 'title' + 'utilities'; + } +} diff --git a/addons/rose/addon/templates/components/rose/layout/page-header.hbs b/addons/rose/addon/templates/components/rose/layout/page-header.hbs new file mode 100644 index 0000000000..090d7b83d4 --- /dev/null +++ b/addons/rose/addon/templates/components/rose/layout/page-header.hbs @@ -0,0 +1,3 @@ +
+ {{yield}} +
diff --git a/addons/rose/app/components/rose/layout/page-header.js b/addons/rose/app/components/rose/layout/page-header.js new file mode 100644 index 0000000000..0ee6126310 --- /dev/null +++ b/addons/rose/app/components/rose/layout/page-header.js @@ -0,0 +1 @@ +export { default } from 'rose/components/rose/layout/page-header'; \ No newline at end of file diff --git a/addons/rose/tests/integration/components/rose/layout/page-header-test.js b/addons/rose/tests/integration/components/rose/layout/page-header-test.js new file mode 100644 index 0000000000..a5f0be46b7 --- /dev/null +++ b/addons/rose/tests/integration/components/rose/layout/page-header-test.js @@ -0,0 +1,23 @@ +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render, find } from '@ember/test-helpers'; +import hbs from 'htmlbars-inline-precompile'; + +module('Integration | Component | rose/layout/page-header', function(hooks) { + setupRenderingTest(hooks); + + test('it renders', async function(assert) { + await render(hbs``); + assert.ok(find('.rose-layout-page-header')); + }); + + test('it renders with html attributes', async function(assert) { + await render(hbs``); + assert.ok(find('#page-header')); + }); + + test('it renders with content', async function(assert) { + await render(hbs`Page header content`); + assert.equal(find('.rose-layout-page-header').textContent.trim(), 'Page header content'); + }); +}); From 1a8a0d062f07e0b6dd61b084118c2e15f6352d74 Mon Sep 17 00:00:00 2001 From: Susmitha Girumala Date: Tue, 2 Jun 2020 17:53:18 -0400 Subject: [PATCH 3/9] =?UTF-8?q?chore:=20=F0=9F=A4=96=20Separate=20page=20h?= =?UTF-8?q?eader=20into=20layout=20&=20content=20components?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Introduce new PageHeader layout, title, and utilities components --- .../rose/layout/main/header.stories.mdx | 66 ---------------- .../rose/layout/page-header.stories.mdx | 7 +- .../main/header.js => page-header/title.js} | 2 +- .../rose/page-header/title.stories.mdx | 62 +++++++++++++++ .../title.js => page-header/utilities.js} | 2 +- .../rose/page-header/utilities.stories.mdx | 31 ++++++++ .../addon/styles/rose/components/_index.scss | 2 +- .../styles/rose/components/layout/_index.scss | 1 - .../rose/components/layout/_page-header.scss | 13 +++- .../rose/components/layout/main/_index.scss | 1 - .../components/layout/main/header/_index.scss | 75 ------------------- .../rose/components/page-header/_index.scss | 2 + .../rose/components/page-header/_title.scss | 35 +++++++++ .../components/page-header/_utilities.scss | 8 ++ .../components/rose/layout/main/header.hbs | 11 --- .../rose/layout/main/header/title.hbs | 19 ----- .../components/rose/page-header/title.hbs | 17 +++++ .../components/rose/page-header/utilities.hbs | 5 ++ .../app/components/rose/layout/main/header.js | 1 - .../rose/layout/main/header/title.js | 1 - .../app/components/rose/layout/page-header.js | 2 +- .../app/components/rose/page-header/title.js | 1 + .../components/rose/page-header/utilities.js | 1 + .../rose/layout/main/header-test.js | 60 --------------- .../rose/layout/page-header-test.js | 17 +++-- .../main/header => page-header}/title-test.js | 22 +++--- .../rose/page-header/utilities-test.js | 38 ++++++++++ 27 files changed, 237 insertions(+), 265 deletions(-) delete mode 100644 addons/rose/addon/components/rose/layout/main/header.stories.mdx rename addons/rose/addon/components/rose/{layout/main/header.js => page-header/title.js} (57%) create mode 100644 addons/rose/addon/components/rose/page-header/title.stories.mdx rename addons/rose/addon/components/rose/{layout/main/header/title.js => page-header/utilities.js} (54%) create mode 100644 addons/rose/addon/components/rose/page-header/utilities.stories.mdx delete mode 100644 addons/rose/addon/styles/rose/components/layout/main/_index.scss delete mode 100644 addons/rose/addon/styles/rose/components/layout/main/header/_index.scss create mode 100644 addons/rose/addon/styles/rose/components/page-header/_index.scss create mode 100644 addons/rose/addon/styles/rose/components/page-header/_title.scss create mode 100644 addons/rose/addon/styles/rose/components/page-header/_utilities.scss delete mode 100644 addons/rose/addon/templates/components/rose/layout/main/header.hbs delete mode 100644 addons/rose/addon/templates/components/rose/layout/main/header/title.hbs create mode 100644 addons/rose/addon/templates/components/rose/page-header/title.hbs create mode 100644 addons/rose/addon/templates/components/rose/page-header/utilities.hbs delete mode 100644 addons/rose/app/components/rose/layout/main/header.js delete mode 100644 addons/rose/app/components/rose/layout/main/header/title.js create mode 100644 addons/rose/app/components/rose/page-header/title.js create mode 100644 addons/rose/app/components/rose/page-header/utilities.js delete mode 100644 addons/rose/tests/integration/components/rose/layout/main/header-test.js rename addons/rose/tests/integration/components/rose/{layout/main/header => page-header}/title-test.js (73%) create mode 100644 addons/rose/tests/integration/components/rose/page-header/utilities-test.js diff --git a/addons/rose/addon/components/rose/layout/main/header.stories.mdx b/addons/rose/addon/components/rose/layout/main/header.stories.mdx deleted file mode 100644 index 3d2dda848a..0000000000 --- a/addons/rose/addon/components/rose/layout/main/header.stories.mdx +++ /dev/null @@ -1,66 +0,0 @@ -import { Meta, Story, Preview } from '@storybook/addon-docs/blocks'; -import { hbs } from 'ember-cli-htmlbars'; -import { action } from '@storybook/addon-actions'; -import { text, boolean, select } from '@storybook/addon-knobs'; - - - -# Layout | Main Header - -A header component for main layout component with ability to configure title and action buttons. Title can be configured to be a either a dropdown component or a simple heading title. The title dropdown is `Rose::Header::Dropdown` component where as all header actions are `Rose::Button` components. - -```html - - - - Menu item - Menu item - Button menu item - - - Secondary - Primary - -``` - - - {{ - template: hbs` - - - - Menu item - Menu item - Button menu item - - - Secondary - Primary - - `, - context: { - pagetitle: text('page title', 'Page Section Title'), - dropdownIcon: select( - 'dropdown icon', - { - 'user-square-fill': 'user-square-fill', - 'check-circle-outline': 'check-circle-outline', - 'copy-action': 'copy-action', - 'unfold-more': 'unfold-more', - 'unfold-less': 'unfold-less', - }, - 'user-square-fill' - ), - }, - }} - - -Main page title can configured to be a basic title. - -```html - - - -``` diff --git a/addons/rose/addon/components/rose/layout/page-header.stories.mdx b/addons/rose/addon/components/rose/layout/page-header.stories.mdx index c771ba93af..218fa75c1d 100644 --- a/addons/rose/addon/components/rose/layout/page-header.stories.mdx +++ b/addons/rose/addon/components/rose/layout/page-header.stories.mdx @@ -6,7 +6,7 @@ import { action } from '@storybook/addon-actions'; # Layout|Page Header -A page layout/positioning component that configures a single column grid for use as a header. +A page layout/positioning component that configures a two column grid with defined areas: title and utilities ```htmlbars @@ -15,8 +15,9 @@ A page layout/positioning component that configures a single column grid for use {{ template: hbs` - - Page Header + +
Grid area: title
+
Grid area: utilities
`, }}
diff --git a/addons/rose/addon/components/rose/layout/main/header.js b/addons/rose/addon/components/rose/page-header/title.js similarity index 57% rename from addons/rose/addon/components/rose/layout/main/header.js rename to addons/rose/addon/components/rose/page-header/title.js index 74d5391270..9ac3c14317 100644 --- a/addons/rose/addon/components/rose/layout/main/header.js +++ b/addons/rose/addon/components/rose/page-header/title.js @@ -1,5 +1,5 @@ import Component from '@ember/component'; -import layout from '../../../../templates/components/rose/layout/main/header'; +import layout from '../../../templates/components/rose/page-header/title'; export default Component.extend({ layout, diff --git a/addons/rose/addon/components/rose/page-header/title.stories.mdx b/addons/rose/addon/components/rose/page-header/title.stories.mdx new file mode 100644 index 0000000000..050c771923 --- /dev/null +++ b/addons/rose/addon/components/rose/page-header/title.stories.mdx @@ -0,0 +1,62 @@ +import { Meta, Story, Preview } from '@storybook/addon-docs/blocks'; +import { hbs } from 'ember-cli-htmlbars'; +import { action } from '@storybook/addon-actions'; +import { text, select } from '@storybook/addon-knobs'; + + + +# Title + +A header title component with ability to configure dropdown using `Rose::Header::Dropdown`. To be used with `Rose::Layout::PageHeader`. + +```html + + + + Menu item + Button menu item + + + +``` + + + {{ + template: hbs` + + + + Menu item + Button menu item + + + + `, + context: { + pageTitle: text('pageTitle', 'Page Section Title'), + dropdownIcon: select( + 'dropdownIcon', + { + 'user-square-fill': 'user-square-fill', + 'check-circle-outline': 'check-circle-outline', + 'copy-action': 'copy-action', + 'unfold-more': 'unfold-more', + 'unfold-less': 'unfold-less', + }, + 'user-square-fill' + ), + }, + }} + + +Title can be configured to be a level 1 heading with optional icon. + +```html + +``` diff --git a/addons/rose/addon/components/rose/layout/main/header/title.js b/addons/rose/addon/components/rose/page-header/utilities.js similarity index 54% rename from addons/rose/addon/components/rose/layout/main/header/title.js rename to addons/rose/addon/components/rose/page-header/utilities.js index 285af1ebbf..71b82bc1c9 100644 --- a/addons/rose/addon/components/rose/layout/main/header/title.js +++ b/addons/rose/addon/components/rose/page-header/utilities.js @@ -1,5 +1,5 @@ import Component from '@ember/component'; -import layout from '../../../../../templates/components/rose/layout/main/header/title'; +import layout from '../../../templates/components/rose/page-header/utilities'; export default Component.extend({ layout, diff --git a/addons/rose/addon/components/rose/page-header/utilities.stories.mdx b/addons/rose/addon/components/rose/page-header/utilities.stories.mdx new file mode 100644 index 0000000000..e1077084ee --- /dev/null +++ b/addons/rose/addon/components/rose/page-header/utilities.stories.mdx @@ -0,0 +1,31 @@ +import { Meta, Story, Preview } from '@storybook/addon-docs/blocks'; +import { hbs } from 'ember-cli-htmlbars'; +import { action } from '@storybook/addon-actions'; + + + +# Utilities + +An component comprised of `Rose::Button` as actions. To be used with `Rose::Layout::PageHeader`. + +```html + + + Secondary + Primary + + +``` + + + {{ + template: hbs` + + + Secondary + Primary + + + `, + }} + diff --git a/addons/rose/addon/styles/rose/components/_index.scss b/addons/rose/addon/styles/rose/components/_index.scss index ec7bd22afd..fd25c4bf2b 100644 --- a/addons/rose/addon/styles/rose/components/_index.scss +++ b/addons/rose/addon/styles/rose/components/_index.scss @@ -4,4 +4,4 @@ @import 'layout'; @import 'notification'; @import 'card'; -@import 'nav'; +@import 'page-header'; diff --git a/addons/rose/addon/styles/rose/components/layout/_index.scss b/addons/rose/addon/styles/rose/components/layout/_index.scss index 40c35ee12c..9b927fb2c7 100644 --- a/addons/rose/addon/styles/rose/components/layout/_index.scss +++ b/addons/rose/addon/styles/rose/components/layout/_index.scss @@ -1,7 +1,6 @@ @use '../../variables/sizing'; @use '../../variables/media'; -@import 'main'; @import 'page-header'; .rose-layout-page { diff --git a/addons/rose/addon/styles/rose/components/layout/_page-header.scss b/addons/rose/addon/styles/rose/components/layout/_page-header.scss index 0fb1fe8eb0..ccd539138b 100644 --- a/addons/rose/addon/styles/rose/components/layout/_page-header.scss +++ b/addons/rose/addon/styles/rose/components/layout/_page-header.scss @@ -2,16 +2,21 @@ .rose-layout-page-header { display: grid; - grid-template-areas: - 'title title utilities'; + grid-template-areas: 'title title utilities'; grid-template-columns: 1fr auto; grid-template-rows: auto 1fr; + + .rose-page-header-utilities { + display: flex; + align-items: center; + justify-content: flex-end; + flex-wrap: wrap; + } } @media (max-width: media.width(small)) { - .rose-layout-page { + .rose-layout-page-header { grid-template-columns: 1fr; - grid-template-rows: 0.1fr auto 1fr; grid-template-areas: 'title' 'utilities'; diff --git a/addons/rose/addon/styles/rose/components/layout/main/_index.scss b/addons/rose/addon/styles/rose/components/layout/main/_index.scss deleted file mode 100644 index 6053ec3184..0000000000 --- a/addons/rose/addon/styles/rose/components/layout/main/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import 'header'; diff --git a/addons/rose/addon/styles/rose/components/layout/main/header/_index.scss b/addons/rose/addon/styles/rose/components/layout/main/header/_index.scss deleted file mode 100644 index 6e4be91b63..0000000000 --- a/addons/rose/addon/styles/rose/components/layout/main/header/_index.scss +++ /dev/null @@ -1,75 +0,0 @@ -@use '../../../../utilities/type' as typography; -@use '../../../../variables/sizing'; -@use '../../../../variables/media'; - -.rose-layout-main-header { - display: grid; - grid-template-areas: 'title title actions'; - grid-template-columns: 1fr auto; - - .rose-layout-main-header-title { - display: inline-block; - grid-area: title; - - .rose-layout-main-header-title-text { - display: inline-block; - color: var(--stark); - } - - .rose-layout-main-header-title-icon { - vertical-align: sub; - - svg { - width: sizing.rems(l); - width: sizing.rems(l); - } - } - } - - .rose-header-dropdown { - .rose-header-dropdown-trigger-text { - // Apply heading level 1 style to text to fit page section style spec - // Duplicate of h1 style defined in typography - @include typography.type(h1, bold); - margin-top: sizing.rems(m); - margin-bottom: sizing.rems(xs); - - margin-right: sizing.rems(xs); - } - - .rose-header-dropdown-trigger { - background-size: sizing.rems(l); - background-position: right (sizing.rems(m) + sizing.rems(s)); - } - - .rose-icon > svg { - vertical-align: sub; - } - } - - .rose-layout-main-header-actions { - grid-area: actions; - display: flex; - align-items: center; - justify-content: flex-end; - - // Remove margin to align action buttons with h1 text - button { - margin-bottom: 0; - } - } -} - -@media (max-width: media.width(small)) { - .rose-layout-main-header { - grid-template-columns: 1fr; - grid-template-rows: 1fr auto; - grid-template-areas: - 'title' - 'actions'; - - .rose-layout-main-header-actions { - flex-wrap: wrap; - } - } -} diff --git a/addons/rose/addon/styles/rose/components/page-header/_index.scss b/addons/rose/addon/styles/rose/components/page-header/_index.scss new file mode 100644 index 0000000000..6cd272653c --- /dev/null +++ b/addons/rose/addon/styles/rose/components/page-header/_index.scss @@ -0,0 +1,2 @@ +@import 'title'; +@import 'utilities'; diff --git a/addons/rose/addon/styles/rose/components/page-header/_title.scss b/addons/rose/addon/styles/rose/components/page-header/_title.scss new file mode 100644 index 0000000000..32fdb890db --- /dev/null +++ b/addons/rose/addon/styles/rose/components/page-header/_title.scss @@ -0,0 +1,35 @@ +@use '../../variables/sizing'; +@use '../../utilities/type' as typography; + +.rose-page-header-title { + display: inline-block; + grid-area: title; + + .rose-page-header-title-text { + display: inline-block; + color: var(--stark); + } + + .rose-page-header-title-icon { + vertical-align: sub; + + svg { + width: sizing.rems(l); + width: sizing.rems(l); + } + } + + .rose-header-dropdown { + .rose-header-dropdown-trigger-text { + @include typography.type(h1, bold); + margin-top: sizing.rems(xs); + margin-bottom: sizing.rems(xs); + + margin-right: sizing.rems(xs); + } + + .rose-header-dropdown-trigger { + background-size: sizing.rems(l); + } + } +} diff --git a/addons/rose/addon/styles/rose/components/page-header/_utilities.scss b/addons/rose/addon/styles/rose/components/page-header/_utilities.scss new file mode 100644 index 0000000000..45a78dd820 --- /dev/null +++ b/addons/rose/addon/styles/rose/components/page-header/_utilities.scss @@ -0,0 +1,8 @@ +.rose-page-header-utilities { + grid-area: utilities; + + // Remove margin to align action buttons with h1 text + button { + margin-bottom: 0; + } +} diff --git a/addons/rose/addon/templates/components/rose/layout/main/header.hbs b/addons/rose/addon/templates/components/rose/layout/main/header.hbs deleted file mode 100644 index 9634fdb25d..0000000000 --- a/addons/rose/addon/templates/components/rose/layout/main/header.hbs +++ /dev/null @@ -1,11 +0,0 @@ -
- {{yield (hash - title=(component 'rose/layout/main/header/title') - )}} - -
- {{yield (hash - action=(component 'rose/button') - )}} -
-
diff --git a/addons/rose/addon/templates/components/rose/layout/main/header/title.hbs b/addons/rose/addon/templates/components/rose/layout/main/header/title.hbs deleted file mode 100644 index 1147d6c483..0000000000 --- a/addons/rose/addon/templates/components/rose/layout/main/header/title.hbs +++ /dev/null @@ -1,19 +0,0 @@ -
- {{#if (has-block)}} - {{yield (hash - dropdown=(component 'rose/header/dropdown' style='dark') - )}} - {{else}} -
- {{#if @icon}} - {{inline-svg @icon}} - {{/if}} - - {{#if @text}} -

{{@text}}

- {{/if}} -
- {{/if}} -
diff --git a/addons/rose/addon/templates/components/rose/page-header/title.hbs b/addons/rose/addon/templates/components/rose/page-header/title.hbs new file mode 100644 index 0000000000..388e538127 --- /dev/null +++ b/addons/rose/addon/templates/components/rose/page-header/title.hbs @@ -0,0 +1,17 @@ +
+ {{#if (has-block)}} + {{yield (hash + dropdown=(component 'rose/header/dropdown' style='dark') + )}} + {{else}} +
+ {{#if @icon}} + {{inline-svg @icon}} + {{/if}} + + {{#if @text}} +

{{@text}}

+ {{/if}} +
+ {{/if}} +
diff --git a/addons/rose/addon/templates/components/rose/page-header/utilities.hbs b/addons/rose/addon/templates/components/rose/page-header/utilities.hbs new file mode 100644 index 0000000000..3203ea86e0 --- /dev/null +++ b/addons/rose/addon/templates/components/rose/page-header/utilities.hbs @@ -0,0 +1,5 @@ +
+ {{yield (hash + action=(component 'rose/button') + )}} +
diff --git a/addons/rose/app/components/rose/layout/main/header.js b/addons/rose/app/components/rose/layout/main/header.js deleted file mode 100644 index cc3ca87693..0000000000 --- a/addons/rose/app/components/rose/layout/main/header.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from 'rose/components/rose/layout/main/header'; diff --git a/addons/rose/app/components/rose/layout/main/header/title.js b/addons/rose/app/components/rose/layout/main/header/title.js deleted file mode 100644 index c189eb8d51..0000000000 --- a/addons/rose/app/components/rose/layout/main/header/title.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from 'rose/components/rose/layout/main/header/title'; diff --git a/addons/rose/app/components/rose/layout/page-header.js b/addons/rose/app/components/rose/layout/page-header.js index 0ee6126310..5235f3c7bd 100644 --- a/addons/rose/app/components/rose/layout/page-header.js +++ b/addons/rose/app/components/rose/layout/page-header.js @@ -1 +1 @@ -export { default } from 'rose/components/rose/layout/page-header'; \ No newline at end of file +export { default } from 'rose/components/rose/layout/page-header'; diff --git a/addons/rose/app/components/rose/page-header/title.js b/addons/rose/app/components/rose/page-header/title.js new file mode 100644 index 0000000000..880f984d0c --- /dev/null +++ b/addons/rose/app/components/rose/page-header/title.js @@ -0,0 +1 @@ +export { default } from 'rose/components/rose/page-header/title'; diff --git a/addons/rose/app/components/rose/page-header/utilities.js b/addons/rose/app/components/rose/page-header/utilities.js new file mode 100644 index 0000000000..69dd95a0ce --- /dev/null +++ b/addons/rose/app/components/rose/page-header/utilities.js @@ -0,0 +1 @@ +export { default } from 'rose/components/rose/page-header/utilities'; diff --git a/addons/rose/tests/integration/components/rose/layout/main/header-test.js b/addons/rose/tests/integration/components/rose/layout/main/header-test.js deleted file mode 100644 index e2261a66d9..0000000000 --- a/addons/rose/tests/integration/components/rose/layout/main/header-test.js +++ /dev/null @@ -1,60 +0,0 @@ -import { module, test } from 'qunit'; -import { setupRenderingTest } from 'ember-qunit'; -import { render, find, findAll } from '@ember/test-helpers'; -import hbs from 'htmlbars-inline-precompile'; - -module('Integration | Component | rose/layout/main/header', function (hooks) { - setupRenderingTest(hooks); - - test('it renders', async function (assert) { - await render(hbs``); - assert.ok(find('.rose-layout-main-header')); - }); - - test('it renders with title', async function (assert) { - await render(hbs` - - `); - assert.ok(find('.rose-layout-main-header-title')); - assert.equal( - find('.rose-layout-main-header-title').textContent.trim(), - 'header title' - ); - }); - - test('it renders with dropdown title', async function (assert) { - await render(hbs` - - - - `); - assert.ok(find('.rose-header-dropdown')); - assert.equal( - find('.rose-layout-main-header-title').textContent.trim(), - 'Dropdown title' - ); - }); - - test('it renders with dropdown title menu', async function (assert) { - await render(hbs` - - - Menu item - Button menu item - - - `); - assert.ok(find('.rose-header-dropdown')); - assert.equal(findAll('a').length, 1); - assert.equal(findAll('button').length, 1); - }); - - test('it renders with actions', async function (assert) { - await render(hbs` - - - `); - assert.ok(find('.rose-layout-main-header-actions')); - assert.ok(findAll('button').length, 2); - }); -}); diff --git a/addons/rose/tests/integration/components/rose/layout/page-header-test.js b/addons/rose/tests/integration/components/rose/layout/page-header-test.js index a5f0be46b7..723df72c11 100644 --- a/addons/rose/tests/integration/components/rose/layout/page-header-test.js +++ b/addons/rose/tests/integration/components/rose/layout/page-header-test.js @@ -3,21 +3,26 @@ import { setupRenderingTest } from 'ember-qunit'; import { render, find } from '@ember/test-helpers'; import hbs from 'htmlbars-inline-precompile'; -module('Integration | Component | rose/layout/page-header', function(hooks) { +module('Integration | Component | rose/layout/page-header', function (hooks) { setupRenderingTest(hooks); - test('it renders', async function(assert) { + test('it renders', async function (assert) { await render(hbs``); assert.ok(find('.rose-layout-page-header')); }); - test('it renders with html attributes', async function(assert) { + test('it renders with html attributes', async function (assert) { await render(hbs``); assert.ok(find('#page-header')); }); - test('it renders with content', async function(assert) { - await render(hbs`Page header content`); - assert.equal(find('.rose-layout-page-header').textContent.trim(), 'Page header content'); + test('it renders with content', async function (assert) { + await render( + hbs`Page header content` + ); + assert.equal( + find('.rose-layout-page-header').textContent.trim(), + 'Page header content' + ); }); }); diff --git a/addons/rose/tests/integration/components/rose/layout/main/header/title-test.js b/addons/rose/tests/integration/components/rose/page-header/title-test.js similarity index 73% rename from addons/rose/tests/integration/components/rose/layout/main/header/title-test.js rename to addons/rose/tests/integration/components/rose/page-header/title-test.js index 8d7fef6ac6..b4e8d7e741 100644 --- a/addons/rose/tests/integration/components/rose/layout/main/header/title-test.js +++ b/addons/rose/tests/integration/components/rose/page-header/title-test.js @@ -3,28 +3,24 @@ import { setupRenderingTest } from 'ember-qunit'; import { render, click, find, findAll } from '@ember/test-helpers'; import hbs from 'htmlbars-inline-precompile'; -module('Integration | Component | rose/layout/main/header/title', function ( - hooks -) { +module('Integration | Component | rose/page-header/title', function (hooks) { setupRenderingTest(hooks); test('it renders', async function (assert) { - await render(hbs``); - assert.ok(find('.rose-layout-main-header-title')); + await render(hbs``); + assert.ok(find('.rose-page-header-title')); }); test('it renders with title', async function (assert) { - await render( - hbs`` - ); + await render(hbs``); assert.equal( - find('.rose-layout-main-header-title-text').textContent.trim(), + find('.rose-page-header-title-text').textContent.trim(), 'header title' ); }); test('it renders with title as dropdown', async function (assert) { - await render(hbs` + await render(hbs` Menu item Menu item @@ -32,7 +28,7 @@ module('Integration | Component | rose/layout/main/header/title', function ( Button menu item Button menu item - `); + `); assert.equal( find('.rose-header-dropdown-trigger').textContent.trim(), 'header title' @@ -42,7 +38,7 @@ module('Integration | Component | rose/layout/main/header/title', function ( }); test('it opens title dropdown on click', async function (assert) { - await render(hbs` + await render(hbs` Menu item Menu item @@ -50,7 +46,7 @@ module('Integration | Component | rose/layout/main/header/title', function ( Button menu item Button menu item - `); + `); await click('summary'); assert.ok(find('#dropdown').open); await click('#title'); diff --git a/addons/rose/tests/integration/components/rose/page-header/utilities-test.js b/addons/rose/tests/integration/components/rose/page-header/utilities-test.js new file mode 100644 index 0000000000..5685c96d42 --- /dev/null +++ b/addons/rose/tests/integration/components/rose/page-header/utilities-test.js @@ -0,0 +1,38 @@ +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render, find, findAll } from '@ember/test-helpers'; +import hbs from 'htmlbars-inline-precompile'; + +module('Integration | Component | rose/page-header/utilities', function ( + hooks +) { + setupRenderingTest(hooks); + + test('it renders', async function (assert) { + await render(hbs``); + assert.ok(find('.rose-page-header-utilities')); + }); + + test('it renders with attributes', async function (assert) { + await render(hbs``); + assert.ok(find('#utilities')); + }); + + test('it renders with content', async function (assert) { + await render( + hbs`Page header utilities` + ); + assert.equal( + find('.rose-page-header-utilities').textContent.trim(), + 'Page header utilities' + ); + }); + + test('it renders utility action buttons', async function (assert) { + await render(hbs` + + + `); + assert.equal(findAll('button').length, 2); + }); +}); From 9ef514e63b1ced6a1820b21bef152e1fd8ccd7f2 Mon Sep 17 00:00:00 2001 From: Susmitha Girumala Date: Tue, 2 Jun 2020 18:18:27 -0400 Subject: [PATCH 4/9] =?UTF-8?q?chore:=20=F0=9F=A4=96=20Integrate=20rose=20?= =?UTF-8?q?pageheader=20components=20into=20core=20ui?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/templates/orgs/org/projects/index.hbs | 19 ++++++++++++------- .../app/templates/orgs/org/projects/new.hbs | 4 +++- .../templates/orgs/org/projects/project.hbs | 4 ++++ 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/ui/core/app/templates/orgs/org/projects/index.hbs b/ui/core/app/templates/orgs/org/projects/index.hbs index c2fb6fa590..ed49140497 100644 --- a/ui/core/app/templates/orgs/org/projects/index.hbs +++ b/ui/core/app/templates/orgs/org/projects/index.hbs @@ -1,11 +1,16 @@
- -

{{t "resources.projects"}}

- - - - {{t "titles.new"}} - + + + + + {{t 'titles.new'}} + + +
    {{#each @model as |project|}} diff --git a/ui/core/app/templates/orgs/org/projects/new.hbs b/ui/core/app/templates/orgs/org/projects/new.hbs index 920983b023..90011f7d04 100644 --- a/ui/core/app/templates/orgs/org/projects/new.hbs +++ b/ui/core/app/templates/orgs/org/projects/new.hbs @@ -7,7 +7,9 @@ {{t "titles.new"}}
-

{{t "titles.new"}}

+ + + + + + + Date: Fri, 5 Jun 2020 15:44:02 -0400 Subject: [PATCH 5/9] =?UTF-8?q?refactor:=20=F0=9F=92=A1=20Rename=20layout/?= =?UTF-8?q?page=20to=20layout/global=20in=20rose=20addon?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rose/layout/{page.js => global.js} | 2 +- .../components/rose/layout/global.stories.mdx | 30 ++++++++++++ .../layout/{page/header.js => global/body.js} | 2 +- .../{page/sidebar.js => global/header.js} | 2 +- .../{page/main.js => global/navigation.js} | 2 +- .../components/rose/layout/page.stories.mdx | 31 ------------ .../addon/styles/rose/components/_index.scss | 1 + .../styles/rose/components/layout/_index.scss | 40 +--------------- .../rose/components/layout/global/_body.scss | 3 ++ .../components/layout/global/_header.scss | 3 ++ .../rose/components/layout/global/_index.scss | 29 ++++++++++++ .../components/layout/global/_navigation.scss | 6 +++ .../components/rose/layout/global.hbs | 7 +++ .../components/rose/layout/global/body.hbs | 3 ++ .../components/rose/layout/global/header.hbs | 3 ++ .../rose/layout/global/navigation.hbs | 3 ++ .../templates/components/rose/layout/page.hbs | 7 --- .../components/rose/layout/page/header.hbs | 3 -- .../components/rose/layout/page/main.hbs | 3 -- .../components/rose/layout/page/sidebar.hbs | 3 -- .../rose/app/components/rose/layout/global.js | 1 + .../app/components/rose/layout/global/body.js | 1 + .../components/rose/layout/global/header.js | 1 + .../rose/layout/global/navigation.js | 1 + .../rose/app/components/rose/layout/page.js | 1 - .../app/components/rose/layout/page/header.js | 1 - .../app/components/rose/layout/page/main.js | 1 - .../components/rose/layout/page/sidebar.js | 1 - .../rose/tests/dummy/app/templates/index.hbs | 16 +++---- .../components/rose/layout/global-test.js | 47 +++++++++++++++++++ .../main-test.js => global/body-test.js} | 12 ++--- .../layout/{page => global}/header-test.js | 12 ++--- .../navigation-test.js} | 14 +++--- .../components/rose/layout/page-test.js | 47 ------------------- ui/core/app/routes/orgs/org/projects/index.js | 13 ++++- ui/core/app/templates/application.hbs | 20 ++++---- .../templates/orgs/org/projects/project.hbs | 10 ++-- 37 files changed, 195 insertions(+), 187 deletions(-) rename addons/rose/addon/components/rose/layout/{page.js => global.js} (59%) create mode 100644 addons/rose/addon/components/rose/layout/global.stories.mdx rename addons/rose/addon/components/rose/layout/{page/header.js => global/body.js} (91%) rename addons/rose/addon/components/rose/layout/{page/sidebar.js => global/header.js} (90%) rename addons/rose/addon/components/rose/layout/{page/main.js => global/navigation.js} (89%) delete mode 100644 addons/rose/addon/components/rose/layout/page.stories.mdx create mode 100644 addons/rose/addon/styles/rose/components/layout/global/_body.scss create mode 100644 addons/rose/addon/styles/rose/components/layout/global/_header.scss create mode 100644 addons/rose/addon/styles/rose/components/layout/global/_index.scss create mode 100644 addons/rose/addon/styles/rose/components/layout/global/_navigation.scss create mode 100644 addons/rose/addon/templates/components/rose/layout/global.hbs create mode 100644 addons/rose/addon/templates/components/rose/layout/global/body.hbs create mode 100644 addons/rose/addon/templates/components/rose/layout/global/header.hbs create mode 100644 addons/rose/addon/templates/components/rose/layout/global/navigation.hbs delete mode 100644 addons/rose/addon/templates/components/rose/layout/page.hbs delete mode 100644 addons/rose/addon/templates/components/rose/layout/page/header.hbs delete mode 100644 addons/rose/addon/templates/components/rose/layout/page/main.hbs delete mode 100644 addons/rose/addon/templates/components/rose/layout/page/sidebar.hbs create mode 100644 addons/rose/app/components/rose/layout/global.js create mode 100644 addons/rose/app/components/rose/layout/global/body.js create mode 100644 addons/rose/app/components/rose/layout/global/header.js create mode 100644 addons/rose/app/components/rose/layout/global/navigation.js delete mode 100644 addons/rose/app/components/rose/layout/page.js delete mode 100644 addons/rose/app/components/rose/layout/page/header.js delete mode 100644 addons/rose/app/components/rose/layout/page/main.js delete mode 100644 addons/rose/app/components/rose/layout/page/sidebar.js create mode 100644 addons/rose/tests/integration/components/rose/layout/global-test.js rename addons/rose/tests/integration/components/rose/layout/{page/main-test.js => global/body-test.js} (61%) rename addons/rose/tests/integration/components/rose/layout/{page => global}/header-test.js (60%) rename addons/rose/tests/integration/components/rose/layout/{page/sidebar-test.js => global/navigation-test.js} (55%) delete mode 100644 addons/rose/tests/integration/components/rose/layout/page-test.js diff --git a/addons/rose/addon/components/rose/layout/page.js b/addons/rose/addon/components/rose/layout/global.js similarity index 59% rename from addons/rose/addon/components/rose/layout/page.js rename to addons/rose/addon/components/rose/layout/global.js index 10190bcba9..c9beb6f91c 100644 --- a/addons/rose/addon/components/rose/layout/page.js +++ b/addons/rose/addon/components/rose/layout/global.js @@ -1,5 +1,5 @@ import Component from '@ember/component'; -import layout from '../../../templates/components/rose/layout/page'; +import layout from '../../../templates/components/rose/layout/global'; export default Component.extend({ layout, diff --git a/addons/rose/addon/components/rose/layout/global.stories.mdx b/addons/rose/addon/components/rose/layout/global.stories.mdx new file mode 100644 index 0000000000..2adb2f277a --- /dev/null +++ b/addons/rose/addon/components/rose/layout/global.stories.mdx @@ -0,0 +1,30 @@ +import { Meta, Story, Preview } from '@storybook/addon-docs/blocks'; +import { hbs } from 'ember-cli-htmlbars'; +import { action } from '@storybook/addon-actions'; +import { text, boolean, select } from '@storybook/addon-knobs'; + + + +# Layout|Global + +A top-level layout/positioning component that allows three distinct sections to be configured: header, navigation, and body. + +```htmlbars + + + + + +``` + + + {{ + template: hbs` + + Header + Body + Navigation + + `, + }} + diff --git a/addons/rose/addon/components/rose/layout/page/header.js b/addons/rose/addon/components/rose/layout/global/body.js similarity index 91% rename from addons/rose/addon/components/rose/layout/page/header.js rename to addons/rose/addon/components/rose/layout/global/body.js index 45f4c68617..a7de3a0e1c 100644 --- a/addons/rose/addon/components/rose/layout/page/header.js +++ b/addons/rose/addon/components/rose/layout/global/body.js @@ -1,5 +1,5 @@ import Component from '@ember/component'; -import layout from '../../../../templates/components/rose/layout/page/header'; +import layout from '../../../../templates/components/rose/layout/global/body'; export default Component.extend({ layout, diff --git a/addons/rose/addon/components/rose/layout/page/sidebar.js b/addons/rose/addon/components/rose/layout/global/header.js similarity index 90% rename from addons/rose/addon/components/rose/layout/page/sidebar.js rename to addons/rose/addon/components/rose/layout/global/header.js index 9df366f6d5..274e815845 100644 --- a/addons/rose/addon/components/rose/layout/page/sidebar.js +++ b/addons/rose/addon/components/rose/layout/global/header.js @@ -1,5 +1,5 @@ import Component from '@ember/component'; -import layout from '../../../../templates/components/rose/layout/page/sidebar'; +import layout from '../../../../templates/components/rose/layout/global/header'; export default Component.extend({ layout, diff --git a/addons/rose/addon/components/rose/layout/page/main.js b/addons/rose/addon/components/rose/layout/global/navigation.js similarity index 89% rename from addons/rose/addon/components/rose/layout/page/main.js rename to addons/rose/addon/components/rose/layout/global/navigation.js index 83b4d6dcb3..8759a341f8 100644 --- a/addons/rose/addon/components/rose/layout/page/main.js +++ b/addons/rose/addon/components/rose/layout/global/navigation.js @@ -1,5 +1,5 @@ import Component from '@ember/component'; -import layout from '../../../../templates/components/rose/layout/page/main'; +import layout from '../../../../templates/components/rose/layout/global/navigation'; export default Component.extend({ layout, diff --git a/addons/rose/addon/components/rose/layout/page.stories.mdx b/addons/rose/addon/components/rose/layout/page.stories.mdx deleted file mode 100644 index ae54e41f8c..0000000000 --- a/addons/rose/addon/components/rose/layout/page.stories.mdx +++ /dev/null @@ -1,31 +0,0 @@ -import { Meta, Story, Preview } from '@storybook/addon-docs/blocks'; -import { hbs } from 'ember-cli-htmlbars'; -import { action } from '@storybook/addon-actions'; -import { text, boolean, select } from '@storybook/addon-knobs'; - - - -# Layout|Page - -A page layout/positioning component that allows three distinct sections to be configured: header, sidebar, and main. -Sidebar's content width determines it's column width. - -```htmlbars - - - - - -``` - - - {{ - template: hbs` - - Header - Main - Sidebar - - `, - }} - diff --git a/addons/rose/addon/styles/rose/components/_index.scss b/addons/rose/addon/styles/rose/components/_index.scss index fd25c4bf2b..f8ba54fb12 100644 --- a/addons/rose/addon/styles/rose/components/_index.scss +++ b/addons/rose/addon/styles/rose/components/_index.scss @@ -5,3 +5,4 @@ @import 'notification'; @import 'card'; @import 'page-header'; +@import 'nav'; diff --git a/addons/rose/addon/styles/rose/components/layout/_index.scss b/addons/rose/addon/styles/rose/components/layout/_index.scss index 9b927fb2c7..8ec7ba2ab5 100644 --- a/addons/rose/addon/styles/rose/components/layout/_index.scss +++ b/addons/rose/addon/styles/rose/components/layout/_index.scss @@ -1,40 +1,2 @@ -@use '../../variables/sizing'; -@use '../../variables/media'; - +@import 'global'; @import 'page-header'; - -.rose-layout-page { - display: grid; - grid-template-areas: - 'header header header header' - 'sidebar main main main'; - // Define static grid column for sidebar - grid-template-columns: 16rem auto 1fr; - grid-template-rows: auto 1fr; - height: 100vh; -} - -.rose-layout-header { - grid-area: header; -} - -.rose-layout-main { - grid-area: main; -} - -.rose-layout-sidebar { - grid-area: sidebar; - border-right: sizing.rems(xxxxs) solid var(--ui-border-subtler-1); -} - -@media (max-width: media.width(small)) { - .rose-layout-page { - grid-template-columns: 1fr; - grid-template-rows: 0.1fr auto 1fr; - grid-template-areas: - 'header' - 'sidebar' - 'main'; - padding-bottom: 0; - } -} diff --git a/addons/rose/addon/styles/rose/components/layout/global/_body.scss b/addons/rose/addon/styles/rose/components/layout/global/_body.scss new file mode 100644 index 0000000000..926856f49e --- /dev/null +++ b/addons/rose/addon/styles/rose/components/layout/global/_body.scss @@ -0,0 +1,3 @@ +.rose-layout-global-body { + grid-area: body; +} diff --git a/addons/rose/addon/styles/rose/components/layout/global/_header.scss b/addons/rose/addon/styles/rose/components/layout/global/_header.scss new file mode 100644 index 0000000000..0c784bc7e6 --- /dev/null +++ b/addons/rose/addon/styles/rose/components/layout/global/_header.scss @@ -0,0 +1,3 @@ +.rose-layout-global-header { + grid-area: header; +} diff --git a/addons/rose/addon/styles/rose/components/layout/global/_index.scss b/addons/rose/addon/styles/rose/components/layout/global/_index.scss new file mode 100644 index 0000000000..6f6af52c5c --- /dev/null +++ b/addons/rose/addon/styles/rose/components/layout/global/_index.scss @@ -0,0 +1,29 @@ +@use '../../../variables/sizing'; +@use '../../../variables/media'; + +@import 'header'; +@import 'body'; +@import 'navigation'; + +.rose-layout-global { + display: grid; + grid-template-areas: + 'header header header header' + 'navigation body body body'; + // Define 16rem static grid column for navigation + grid-template-columns: (sizing.rems(m) * 16) auto 1fr; + grid-template-rows: auto 1fr; + height: 100vh; +} + +@media (max-width: media.width(small)) { + .rose-layout-global { + grid-template-columns: 1fr; + grid-template-rows: 0.1fr auto 1fr; + grid-template-areas: + 'header' + 'navigation' + 'body'; + padding-bottom: 0; + } +} diff --git a/addons/rose/addon/styles/rose/components/layout/global/_navigation.scss b/addons/rose/addon/styles/rose/components/layout/global/_navigation.scss new file mode 100644 index 0000000000..9482c0223e --- /dev/null +++ b/addons/rose/addon/styles/rose/components/layout/global/_navigation.scss @@ -0,0 +1,6 @@ +@use '../../../variables/sizing'; + +.rose-layout-global-navigation { + grid-area: navigation; + border-right: sizing.rems(xxxxs) solid var(--ui-border-subtler-1); +} diff --git a/addons/rose/addon/templates/components/rose/layout/global.hbs b/addons/rose/addon/templates/components/rose/layout/global.hbs new file mode 100644 index 0000000000..4ed9a90337 --- /dev/null +++ b/addons/rose/addon/templates/components/rose/layout/global.hbs @@ -0,0 +1,7 @@ +
+ {{yield (hash + header=(component 'rose/layout/global/header') + body=(component 'rose/layout/global/body') + navigation=(component 'rose/layout/global/navigation') + )}} +
diff --git a/addons/rose/addon/templates/components/rose/layout/global/body.hbs b/addons/rose/addon/templates/components/rose/layout/global/body.hbs new file mode 100644 index 0000000000..b89c802f7f --- /dev/null +++ b/addons/rose/addon/templates/components/rose/layout/global/body.hbs @@ -0,0 +1,3 @@ +
+ {{yield}} +
diff --git a/addons/rose/addon/templates/components/rose/layout/global/header.hbs b/addons/rose/addon/templates/components/rose/layout/global/header.hbs new file mode 100644 index 0000000000..b2e966d0db --- /dev/null +++ b/addons/rose/addon/templates/components/rose/layout/global/header.hbs @@ -0,0 +1,3 @@ +
+ {{yield}} +
diff --git a/addons/rose/addon/templates/components/rose/layout/global/navigation.hbs b/addons/rose/addon/templates/components/rose/layout/global/navigation.hbs new file mode 100644 index 0000000000..b23782e923 --- /dev/null +++ b/addons/rose/addon/templates/components/rose/layout/global/navigation.hbs @@ -0,0 +1,3 @@ + diff --git a/addons/rose/addon/templates/components/rose/layout/page.hbs b/addons/rose/addon/templates/components/rose/layout/page.hbs deleted file mode 100644 index 73a8b205fb..0000000000 --- a/addons/rose/addon/templates/components/rose/layout/page.hbs +++ /dev/null @@ -1,7 +0,0 @@ -
- {{yield (hash - header=(component 'rose/layout/page/header') - main=(component 'rose/layout/page/main') - sidebar=(component 'rose/layout/page/sidebar') - )}} -
diff --git a/addons/rose/addon/templates/components/rose/layout/page/header.hbs b/addons/rose/addon/templates/components/rose/layout/page/header.hbs deleted file mode 100644 index 545ac6c22a..0000000000 --- a/addons/rose/addon/templates/components/rose/layout/page/header.hbs +++ /dev/null @@ -1,3 +0,0 @@ -
- {{yield}} -
diff --git a/addons/rose/addon/templates/components/rose/layout/page/main.hbs b/addons/rose/addon/templates/components/rose/layout/page/main.hbs deleted file mode 100644 index 1752414ce3..0000000000 --- a/addons/rose/addon/templates/components/rose/layout/page/main.hbs +++ /dev/null @@ -1,3 +0,0 @@ -
- {{yield}} -
diff --git a/addons/rose/addon/templates/components/rose/layout/page/sidebar.hbs b/addons/rose/addon/templates/components/rose/layout/page/sidebar.hbs deleted file mode 100644 index 07f519a2bb..0000000000 --- a/addons/rose/addon/templates/components/rose/layout/page/sidebar.hbs +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/addons/rose/app/components/rose/layout/global.js b/addons/rose/app/components/rose/layout/global.js new file mode 100644 index 0000000000..d55398ff9f --- /dev/null +++ b/addons/rose/app/components/rose/layout/global.js @@ -0,0 +1 @@ +export { default } from 'rose/components/rose/layout/global'; \ No newline at end of file diff --git a/addons/rose/app/components/rose/layout/global/body.js b/addons/rose/app/components/rose/layout/global/body.js new file mode 100644 index 0000000000..3f6780e177 --- /dev/null +++ b/addons/rose/app/components/rose/layout/global/body.js @@ -0,0 +1 @@ +export { default } from 'rose/components/rose/layout/global/body'; \ No newline at end of file diff --git a/addons/rose/app/components/rose/layout/global/header.js b/addons/rose/app/components/rose/layout/global/header.js new file mode 100644 index 0000000000..6d737401be --- /dev/null +++ b/addons/rose/app/components/rose/layout/global/header.js @@ -0,0 +1 @@ +export { default } from 'rose/components/rose/layout/global/header'; \ No newline at end of file diff --git a/addons/rose/app/components/rose/layout/global/navigation.js b/addons/rose/app/components/rose/layout/global/navigation.js new file mode 100644 index 0000000000..fa056e99e8 --- /dev/null +++ b/addons/rose/app/components/rose/layout/global/navigation.js @@ -0,0 +1 @@ +export { default } from 'rose/components/rose/layout/global/navigation'; \ No newline at end of file diff --git a/addons/rose/app/components/rose/layout/page.js b/addons/rose/app/components/rose/layout/page.js deleted file mode 100644 index a88273d718..0000000000 --- a/addons/rose/app/components/rose/layout/page.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from 'rose/components/rose/layout/page'; diff --git a/addons/rose/app/components/rose/layout/page/header.js b/addons/rose/app/components/rose/layout/page/header.js deleted file mode 100644 index 77437dd121..0000000000 --- a/addons/rose/app/components/rose/layout/page/header.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from 'rose/components/rose/layout/page/header'; diff --git a/addons/rose/app/components/rose/layout/page/main.js b/addons/rose/app/components/rose/layout/page/main.js deleted file mode 100644 index 3bde34d59f..0000000000 --- a/addons/rose/app/components/rose/layout/page/main.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from 'rose/components/rose/layout/page/main'; diff --git a/addons/rose/app/components/rose/layout/page/sidebar.js b/addons/rose/app/components/rose/layout/page/sidebar.js deleted file mode 100644 index aa6735e844..0000000000 --- a/addons/rose/app/components/rose/layout/page/sidebar.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from 'rose/components/rose/layout/page/sidebar'; diff --git a/addons/rose/tests/dummy/app/templates/index.hbs b/addons/rose/tests/dummy/app/templates/index.hbs index ec39650390..841d801224 100644 --- a/addons/rose/tests/dummy/app/templates/index.hbs +++ b/addons/rose/tests/dummy/app/templates/index.hbs @@ -1,5 +1,5 @@ - - + + @@ -28,18 +28,18 @@ - + - + Item Name Item Name Item Name Item Name - + - + Dummy app index template @@ -198,5 +198,5 @@ - - + + diff --git a/addons/rose/tests/integration/components/rose/layout/global-test.js b/addons/rose/tests/integration/components/rose/layout/global-test.js new file mode 100644 index 0000000000..7bff3a3b6f --- /dev/null +++ b/addons/rose/tests/integration/components/rose/layout/global-test.js @@ -0,0 +1,47 @@ +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render, find } from '@ember/test-helpers'; +import hbs from 'htmlbars-inline-precompile'; + +module('Integration | Component | rose/layout/global', function(hooks) { + setupRenderingTest(hooks); + + test('it renders', async function (assert) { + await render(hbs``); + assert.ok(find('div')); + assert.ok(find('.rose-layout-global')); + }); + + test('it renders with attributes', async function (assert) { + await render(hbs``); + assert.ok(find('#global')); + }); + + test('it renders with content', async function (assert) { + await render(hbs` +