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 000000000..e7ed1d390
--- /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 000000000..c771ba93a
--- /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 33944c8fe..40c35ee12 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 000000000..0fb1fe8eb
--- /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 000000000..090d7b83d
--- /dev/null
+++ b/addons/rose/addon/templates/components/rose/layout/page-header.hbs
@@ -0,0 +1,3 @@
+
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 000000000..0ee612631
--- /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 000000000..a5f0be46b
--- /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');
+ });
+});