From 355625b5dd1b4e2e52e6e5d0eee1a13d76c09fda Mon Sep 17 00:00:00 2001
From: Armand Philippot <git@armandphilippot.com>
Date: Sat, 9 Apr 2022 19:40:14 +0200
Subject: chore: add a Section component

---
 src/components/atoms/layout/section.tsx | 57 +++++++++++++++++++++++++++++++++
 1 file changed, 57 insertions(+)
 create mode 100644 src/components/atoms/layout/section.tsx

(limited to 'src/components/atoms/layout/section.tsx')

diff --git a/src/components/atoms/layout/section.tsx b/src/components/atoms/layout/section.tsx
new file mode 100644
index 0000000..f1bbb34
--- /dev/null
+++ b/src/components/atoms/layout/section.tsx
@@ -0,0 +1,57 @@
+import { ReactNode, VFC } from 'react';
+import Heading from '../headings/heading';
+import styles from './section.module.scss';
+
+export type SectionVariant = 'dark' | 'light';
+
+export type SectionProps = {
+  /**
+   * Set additional classnames to the section element.
+   */
+  className?: string;
+  /**
+   * The section content.
+   */
+  content: ReactNode;
+  /**
+   * The section title.
+   */
+  title: string;
+  /**
+   * The section variant.
+   */
+  variant?: SectionVariant;
+  /**
+   * Add a border at the bottom of the section. Default: true.
+   */
+  withBorder?: boolean;
+};
+
+/**
+ * Section component
+ *
+ * Render a section element.
+ */
+const Section: VFC<SectionProps> = ({
+  className = '',
+  content,
+  title,
+  variant = 'dark',
+  withBorder = true,
+}) => {
+  const borderClass = withBorder ? styles[`wrapper--borders`] : '';
+  const variantClass = styles[`wrapper--${variant}`];
+
+  return (
+    <section
+      className={`${styles.wrapper} ${borderClass} ${variantClass} ${className}`}
+    >
+      <Heading level={2} className={styles.title}>
+        {title}
+      </Heading>
+      <div className={styles.body}>{content}</div>
+    </section>
+  );
+};
+
+export default Section;
-- 
cgit v1.2.3

