aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/atoms/layout
diff options
context:
space:
mode:
authorArmand Philippot <git@armandphilippot.com>2022-04-20 19:27:46 +0200
committerArmand Philippot <git@armandphilippot.com>2022-04-20 19:27:46 +0200
commitec54c7692d5588addcd7563626df381aa86d5d79 (patch)
treeae751d5763c95511fb57b980c37df4c397e9c3bb /src/components/atoms/layout
parenta08291b1586858fc894a27d56f55f87a88f8dbd3 (diff)
chore: add a Sidebar component
Diffstat (limited to 'src/components/atoms/layout')
-rw-r--r--src/components/atoms/layout/sidebar.module.scss7
-rw-r--r--src/components/atoms/layout/sidebar.stories.tsx55
-rw-r--r--src/components/atoms/layout/sidebar.test.tsx11
-rw-r--r--src/components/atoms/layout/sidebar.tsx24
4 files changed, 97 insertions, 0 deletions
diff --git a/src/components/atoms/layout/sidebar.module.scss b/src/components/atoms/layout/sidebar.module.scss
new file mode 100644
index 0000000..da2acbe
--- /dev/null
+++ b/src/components/atoms/layout/sidebar.module.scss
@@ -0,0 +1,7 @@
+@use "@styles/abstracts/functions" as fun;
+
+.wrapper {
+ > *:not(:first-child) {
+ margin-top: fun.convert-px(-2);
+ }
+}
diff --git a/src/components/atoms/layout/sidebar.stories.tsx b/src/components/atoms/layout/sidebar.stories.tsx
new file mode 100644
index 0000000..337d0c9
--- /dev/null
+++ b/src/components/atoms/layout/sidebar.stories.tsx
@@ -0,0 +1,55 @@
+import { ComponentMeta, ComponentStory } from '@storybook/react';
+import { IntlProvider } from 'react-intl';
+import SidebarComponent from './sidebar';
+
+/**
+ * Sidebar - Storybook Meta
+ */
+export default {
+ title: 'Atoms/Layout',
+ component: SidebarComponent,
+ argTypes: {
+ children: {
+ control: {
+ type: 'text',
+ },
+ description: 'The sidebar content.',
+ type: {
+ name: 'string',
+ required: true,
+ },
+ },
+ className: {
+ control: {
+ type: 'text',
+ },
+ description: 'Set additional classnames to the aside element.',
+ table: {
+ category: 'Styles',
+ },
+ type: {
+ name: 'string',
+ required: false,
+ },
+ },
+ },
+ decorators: [
+ (Story) => (
+ <IntlProvider locale="en">
+ <Story />
+ </IntlProvider>
+ ),
+ ],
+} as ComponentMeta<typeof SidebarComponent>;
+
+const Template: ComponentStory<typeof SidebarComponent> = (args) => (
+ <SidebarComponent {...args} />
+);
+
+/**
+ * Layout Stories - Sidebar
+ */
+export const Sidebar = Template.bind({});
+Sidebar.args = {
+ children: 'Some widgets.',
+};
diff --git a/src/components/atoms/layout/sidebar.test.tsx b/src/components/atoms/layout/sidebar.test.tsx
new file mode 100644
index 0000000..4c9459d
--- /dev/null
+++ b/src/components/atoms/layout/sidebar.test.tsx
@@ -0,0 +1,11 @@
+import { render, screen } from '@test-utils';
+import Sidebar from './sidebar';
+
+const children = 'A widget';
+
+describe('Sidebar', () => {
+ it('renders an aside element', () => {
+ render(<Sidebar>{children}</Sidebar>);
+ expect(screen.getByRole('complementary')).toHaveTextContent(children);
+ });
+});
diff --git a/src/components/atoms/layout/sidebar.tsx b/src/components/atoms/layout/sidebar.tsx
new file mode 100644
index 0000000..194ed9f
--- /dev/null
+++ b/src/components/atoms/layout/sidebar.tsx
@@ -0,0 +1,24 @@
+import { FC, ReactNode } from 'react';
+import styles from './sidebar.module.scss';
+
+export type SidebarProps = {
+ /**
+ * The sidebar body.
+ */
+ children: ReactNode;
+ /**
+ * Set additional classnames to the aside element.
+ */
+ className?: string;
+};
+
+/**
+ * Sidebar component
+ *
+ * Render an aside element.
+ */
+const Sidebar: FC<SidebarProps> = ({ children, className = '' }) => {
+ return <aside className={`${styles.wrapper} ${className}`}>{children}</aside>;
+};
+
+export default Sidebar;