aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/organisms/navbar/navbar.tsx
diff options
context:
space:
mode:
authorArmand Philippot <git@armandphilippot.com>2023-11-03 12:22:47 +0100
committerArmand Philippot <git@armandphilippot.com>2023-11-11 18:15:27 +0100
commit5d3e8a4d0c2ce2ad8f22df857ab3ce54fcfc38ac (patch)
treea758333b29e2e6614de609acb312ea9ff0d3a33b /src/components/organisms/navbar/navbar.tsx
parent655be4404630a20ae4ca40c4af84afcc2e63557b (diff)
refactor(components): replace Toolbar with Navbar component
* remove SearchModal and SettingsModal components * add a generic NavbarItem component (instead of the previous toolbar items to avoid unreadable styles...) * move FlippingLabel component logic into NavbarItem since it is only used here
Diffstat (limited to 'src/components/organisms/navbar/navbar.tsx')
-rw-r--r--src/components/organisms/navbar/navbar.tsx65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/components/organisms/navbar/navbar.tsx b/src/components/organisms/navbar/navbar.tsx
new file mode 100644
index 0000000..ee379e9
--- /dev/null
+++ b/src/components/organisms/navbar/navbar.tsx
@@ -0,0 +1,65 @@
+import {
+ type ForwardRefRenderFunction,
+ forwardRef,
+ type ReactNode,
+} from 'react';
+import { List, type ListProps } from '../../atoms';
+import { NavbarItem, type NavbarItemProps } from './navbar-item';
+import styles from './navbar.module.scss';
+
+export type NavbarItemData = Pick<
+ NavbarItemProps,
+ | 'icon'
+ | 'id'
+ | 'isActive'
+ | 'label'
+ | 'modalHeading'
+ | 'modalVisibleFrom'
+ | 'onDeactivate'
+ | 'onToggle'
+ | 'showIconOnModal'
+> & {
+ contents: ReactNode;
+};
+
+export type NavbarItems = [NavbarItemData, NavbarItemData?, NavbarItemData?];
+
+export type NavbarProps = Omit<
+ ListProps<false, false>,
+ 'children' | 'hideMarker' | 'isHierarchical' | 'isInline' | 'isOrdered'
+> & {
+ /**
+ * The navbar items.
+ *
+ * The number of items should not exceed 3 because of the modal position on
+ * small screens.
+ */
+ items: NavbarItems;
+};
+
+const NavbarWithRef: ForwardRefRenderFunction<HTMLUListElement, NavbarProps> = (
+ { className = '', items, ...props },
+ ref
+) => {
+ const wrapperClass = `${styles.wrapper} ${className}`;
+ const navItems = items.filter(
+ (item): item is NavbarItemData => item !== undefined
+ );
+
+ return (
+ <List {...props} className={wrapperClass} hideMarker isInline ref={ref}>
+ {navItems.map(({ contents, ...item }) => (
+ <NavbarItem {...item} className={styles.item} key={item.id}>
+ {contents}
+ </NavbarItem>
+ ))}
+ </List>
+ );
+};
+
+/**
+ * Navbar component
+ *
+ * Render the website navbar.
+ */
+export const Navbar = forwardRef(NavbarWithRef);