diff --git a/addons/rose/addon/components/rose/cards.js b/addons/rose/addon/components/rose/cards.js
new file mode 100644
index 000000000..c54fb638d
--- /dev/null
+++ b/addons/rose/addon/components/rose/cards.js
@@ -0,0 +1,7 @@
+import Component from '@ember/component';
+import layout from '../../templates/components/rose/cards';
+
+export default Component.extend({
+ layout,
+ tagName: '',
+});
diff --git a/addons/rose/addon/components/rose/cards.stories.mdx b/addons/rose/addon/components/rose/cards.stories.mdx
new file mode 100644
index 000000000..a032687e2
--- /dev/null
+++ b/addons/rose/addon/components/rose/cards.stories.mdx
@@ -0,0 +1,61 @@
+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';
+
+
+
+# Cards
+
+A set of cards arranged side-by-side.
+
+
+ {{
+ template: hbs`
+
+
+
+
+
+
+
+ `,
+ context: {}
+ }}
+
+
+
+```htmlbars
+
+
+
+
+```
diff --git a/addons/rose/addon/styles/rose/components/_cards.scss b/addons/rose/addon/styles/rose/components/_cards.scss
new file mode 100644
index 000000000..b3feb536f
--- /dev/null
+++ b/addons/rose/addon/styles/rose/components/_cards.scss
@@ -0,0 +1,4 @@
+.rose-cards {
+ display: flex;
+ flex-wrap: wrap;
+}
diff --git a/addons/rose/addon/styles/rose/components/_index.scss b/addons/rose/addon/styles/rose/components/_index.scss
index 9376545de..f63f9bdf0 100644
--- a/addons/rose/addon/styles/rose/components/_index.scss
+++ b/addons/rose/addon/styles/rose/components/_index.scss
@@ -4,6 +4,7 @@
@import 'layout';
@import 'notification';
@import 'card';
+@import 'cards';
@import 'page-header';
@import 'separator';
@import 'nav';
diff --git a/addons/rose/addon/styles/rose/components/card/_link.scss b/addons/rose/addon/styles/rose/components/card/_link.scss
index 26b3e3f8c..a62df13f8 100644
--- a/addons/rose/addon/styles/rose/components/card/_link.scss
+++ b/addons/rose/addon/styles/rose/components/card/_link.scss
@@ -8,6 +8,7 @@
color: var(--ui-gray);
display: inline-flex;
flex-direction: column;
+ margin: 0 sizing.rems(m) sizing.rems(m) 0;
a {
text-decoration: none;
diff --git a/addons/rose/addon/templates/components/rose/cards.hbs b/addons/rose/addon/templates/components/rose/cards.hbs
new file mode 100644
index 000000000..eafcba07d
--- /dev/null
+++ b/addons/rose/addon/templates/components/rose/cards.hbs
@@ -0,0 +1,8 @@
+
+ {{yield (hash
+ link=(component "rose/card/link")
+ )}}
+
diff --git a/addons/rose/app/components/rose/cards.js b/addons/rose/app/components/rose/cards.js
new file mode 100644
index 000000000..b1d33f82d
--- /dev/null
+++ b/addons/rose/app/components/rose/cards.js
@@ -0,0 +1 @@
+export { default } from 'rose/components/rose/cards';
diff --git a/addons/rose/tests/integration/components/rose/cards-test.js b/addons/rose/tests/integration/components/rose/cards-test.js
new file mode 100644
index 000000000..9c8b32743
--- /dev/null
+++ b/addons/rose/tests/integration/components/rose/cards-test.js
@@ -0,0 +1,22 @@
+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/cards', function (hooks) {
+ setupRenderingTest(hooks);
+
+ test('it renders', async function (assert) {
+ assert.expect(2);
+ await render(hbs`
+
+
+
+ `);
+ assert.ok(find('.rose-cards'));
+ assert.ok(find('.rose-card-link'));
+ });
+});