summaryrefslogtreecommitdiffstats
path: root/src/components/Sidebar/Sidebar.tsx
diff options
context:
space:
mode:
authorArmand Philippot <git@armandphilippot.com>2022-01-15 22:45:57 +0100
committerArmand Philippot <git@armandphilippot.com>2022-01-15 22:51:30 +0100
commitaa1ca65e7c9807c6d6020e39166536297fe1cdae (patch)
tree2648da350fec3b71ab7f575d63e4c63ba08248b1 /src/components/Sidebar/Sidebar.tsx
parent16dbb4742264edac82fa6bb8e461259d097f4437 (diff)
chore: update sidebar and widgets styles
I'm now using a widget that can be expanded/collapsed. It also allows me to handle more effectively widgets overflow and to avoid styles repetitions. However, with stylelint rule "no-descending-specificity", I'm not sure if the stylesheets are really logical... Maybe I should deactivate this rule.
Diffstat (limited to 'src/components/Sidebar/Sidebar.tsx')
-rw-r--r--src/components/Sidebar/Sidebar.tsx30
1 files changed, 26 insertions, 4 deletions
diff --git a/src/components/Sidebar/Sidebar.tsx b/src/components/Sidebar/Sidebar.tsx
index 8c9fa1d..f319f9e 100644
--- a/src/components/Sidebar/Sidebar.tsx
+++ b/src/components/Sidebar/Sidebar.tsx
@@ -1,10 +1,32 @@
-import { FunctionComponent } from 'react';
+import { Children, cloneElement, isValidElement, ReactNode } from 'react';
import styles from './Sidebar.module.scss';
-const Sidebar: FunctionComponent = ({ children }) => {
+type SidebarPosition = 'left' | 'right';
+
+const Sidebar = ({
+ children,
+ position,
+ title,
+}: {
+ children: ReactNode;
+ position: SidebarPosition;
+ title?: string;
+}) => {
+ const childrenWithProps = Children.map(children, (child) => {
+ if (isValidElement(child)) {
+ return cloneElement(child, { titleLevel: title ? 3 : 2 });
+ }
+ return child;
+ });
+
+ const positionClass = `wrapper--${position}`;
+
return (
- <aside className={styles.wrapper}>
- <div className={styles.body}>{children}</div>
+ <aside className={`${styles.wrapper} ${styles[positionClass]}`}>
+ <div className={styles.body}>
+ {title && <h2>{title}</h2>}
+ {childrenWithProps}
+ </div>
</aside>
);
};