diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx index af667d6..4fe8669 100644 --- a/.storybook/preview.tsx +++ b/.storybook/preview.tsx @@ -4,6 +4,7 @@ import { BackgroundComponent } from "../src/components"; import { useEffect, useState } from "react"; import { addons } from "@storybook/preview-api"; import { DARK_MODE_EVENT_NAME } from "storybook-dark-mode"; +import { LayoutProvider } from "../src/hooks"; /** @type { import('@storybook/react').Preview } */ const preview = { @@ -44,7 +45,7 @@ export default preview; export const decorators = [ (renderStory) => ( - {renderStory()} + {renderStory()} ), (renderStory) => ( diff --git a/src/components/icons/burger-arrow-icon.component.tsx b/src/components/icons/burger-arrow-icon.component.tsx new file mode 100644 index 0000000..6e9c6b7 --- /dev/null +++ b/src/components/icons/burger-arrow-icon.component.tsx @@ -0,0 +1,15 @@ +import React from "react"; +import { IconComponent } from "./icon.component"; +import type { IconProps } from "./icon.component"; + +export const BurgerArrowIconComponent: React.FC = ({ + fill = "white", + ...props +}) => ( + + + +); diff --git a/src/components/icons/burger-cross-icon.component.tsx b/src/components/icons/burger-cross-icon.component.tsx new file mode 100644 index 0000000..a24318f --- /dev/null +++ b/src/components/icons/burger-cross-icon.component.tsx @@ -0,0 +1,18 @@ +import React from "react"; +import { IconComponent } from "./icon.component"; +import type { IconProps } from "./icon.component"; + +export const BurgerCrossIconComponent: React.FC = ({ + fill = "white", + ...props +}) => ( + + + +); diff --git a/src/components/icons/burger-icon.component.tsx b/src/components/icons/burger-icon.component.tsx new file mode 100644 index 0000000..4d7d08d --- /dev/null +++ b/src/components/icons/burger-icon.component.tsx @@ -0,0 +1,19 @@ +import React from "react"; +import { IconComponent } from "./icon.component"; +import type { IconProps } from "./icon.component"; + +export const BurgerIconComponent: React.FC = ({ + fill = "white", + ...props +}) => ( + + + +); diff --git a/src/components/icons/icons.stories.tsx b/src/components/icons/icons.stories.tsx index 79667ec..8bb23a8 100644 --- a/src/components/icons/icons.stories.tsx +++ b/src/components/icons/icons.stories.tsx @@ -27,6 +27,9 @@ import { NetworkIconComponent } from "./network-icon.component"; import { ForbiddenIconComponent } from "./forbidden-icon.component"; import { AnalyticsIconComponent } from "./analytics-icon.component"; import { KeysIconComponent } from "./keys-icon.component"; +import { BurgerIconComponent } from "./burger-icon.component"; +import { BurgerCrossIconComponent } from "./burger-cross-icon.component"; +import { BurgerArrowIconComponent } from "./burger-arrow-icon.component"; export default { title: "Components/Icons", @@ -55,6 +58,9 @@ export const Download = () => ; export const Forbidden = () => ; export const Analytics = () => ; export const Keys = () => ; +export const Burger = () => ; +export const BurgerCross = () => ; +export const BurgerArrow = () => ; export const CC = () => ; export const BY = () => ; diff --git a/src/components/icons/index.ts b/src/components/icons/index.ts index aef8ae8..e85f159 100644 --- a/src/components/icons/index.ts +++ b/src/components/icons/index.ts @@ -18,6 +18,9 @@ export * from "./download-icon.component"; export * from "./forbidden-icon.component"; export * from "./analytics-icon.component"; export * from "./keys-icon.component"; +export * from "./burger-icon.component"; +export * from "./burger-cross-icon.component"; +export * from "./burger-arrow-icon.component"; export * from "./cc"; export * from "./signal"; diff --git a/src/components/layout/footer/footer.module.scss b/src/components/layout/footer/footer.module.scss index 344976c..0c7e3d2 100644 --- a/src/components/layout/footer/footer.module.scss +++ b/src/components/layout/footer/footer.module.scss @@ -5,7 +5,7 @@ color: var(--text-0-c); display: flex; - padding: 4rem; + padding: 2rem; justify-content: space-between; text-align: center; diff --git a/src/components/layout/header/header.component.tsx b/src/components/layout/header/header.component.tsx index 319f55c..4ecec66 100644 --- a/src/components/layout/header/header.component.tsx +++ b/src/components/layout/header/header.component.tsx @@ -2,11 +2,27 @@ import * as React from "react"; // @ts-ignore import styles from "./header.module.scss"; +import { useLayout } from "../../../hooks"; +import { useCallback } from "react"; +import { BurgerArrowIconComponent, BurgerIconComponent } from "../../icons"; type Props = { children?: React.ReactNode; }; export const HeaderComponent: React.FC = ({ children }) => { - return
{children}
; + const { toggleNavigator, openNavigator } = useLayout(); + + const onClickBurger = useCallback(() => { + toggleNavigator(); + }, [toggleNavigator]); + + return ( +
+
+ {openNavigator ? : } +
+ {children} +
+ ); }; diff --git a/src/components/layout/header/header.module.scss b/src/components/layout/header/header.module.scss index 9b7c2c2..2894db1 100644 --- a/src/components/layout/header/header.module.scss +++ b/src/components/layout/header/header.module.scss @@ -1,3 +1,5 @@ +@use "../../../styles/all.module.scss" as *; + .header { display: flex; @@ -5,4 +7,14 @@ align-items: center; padding: 1rem 1rem 1rem 0; + + .burger { + display: none; + cursor: pointer; + margin-left: 2rem; + + @include phone-only() { + display: inherit; + } + } } diff --git a/src/components/layout/main-layout/main-layout.component.tsx b/src/components/layout/main-layout/main-layout.component.tsx index 480c0bf..a6edb92 100644 --- a/src/components/layout/main-layout/main-layout.component.tsx +++ b/src/components/layout/main-layout/main-layout.component.tsx @@ -10,8 +10,10 @@ import { CardComponent, MainComponent, LicenseComponent, + HeaderComponent, } from "../../../components"; import { cn } from "../../../utils"; +import { LayoutProvider } from "../../../hooks"; type Props = { navigatorChildren?: React.ReactNode; @@ -26,26 +28,28 @@ export const MainLayoutComponent: React.FC = ({ footerChildren, }) => { return ( - - -
- -
- {/*{headerChildren && }*/} - + + + +
+ +
+ + +
-
- - - {footerChildren} - - - - + + + {footerChildren} + + + + + ); }; diff --git a/src/components/layout/main-layout/main-layout.stories.tsx b/src/components/layout/main-layout/main-layout.stories.tsx index 1b12f21..86983a7 100644 --- a/src/components/layout/main-layout/main-layout.stories.tsx +++ b/src/components/layout/main-layout/main-layout.stories.tsx @@ -12,7 +12,7 @@ export default { component: MainLayoutComponent, }; -export const Primary = { +export const MainLayout = { args: { headerChildren: ( <> @@ -96,3 +96,76 @@ export const Primary = { ), }, }; + +export const MainLayoutHeadless = { + args: { + navigatorChildren: ( + <> + }> + Home + + }> + Hotels + + }> + Hotels + + }> + Hotels or not hotels + + + ), + children: ( + <> +
content
+
+
content
+
+
content
+
+
content
+
+
content
+
+
+ content1111111111111111111111111111111111111 1 1111kj hn1kjh1jkh + kjh1jkh 1hjk 1khj 1kjh1 hkj 1khjkh1j khj 1 sdf ;lkmjds fpkjlosdjklf + jklsdfjkl sdjklf jksldfj klsdfjklsdjlkf +
+
+
content
+
+
content
+
+
content
+
+
content
+
+
content
+
+
content
+
+
content
+
+
content
+
+
content
+
+
content
+
+
content
+
+
content
+
+ + ), + footerChildren: ( + <> + Manifest + Report a bug + Run your own hotel + Terms and conditions + + ), + }, +}; diff --git a/src/components/layout/navigation/nav-item/nav-item.component.tsx b/src/components/layout/navigation/nav-item/nav-item.component.tsx index aa2a5b0..8ba5938 100644 --- a/src/components/layout/navigation/nav-item/nav-item.component.tsx +++ b/src/components/layout/navigation/nav-item/nav-item.component.tsx @@ -5,6 +5,7 @@ import styles from "./nav-item.module.scss"; import { cn } from "../../../../utils"; import type { BoxProps } from "../../../../components"; import { ButtonComponent } from "../../../../components"; +import { useLayout } from "../../../../hooks"; type Props = { className?: string; @@ -20,11 +21,14 @@ export const NavItemComponent: React.FC = ({ children, ...props }) => { + const { toggleNavigator } = useLayout(); + return ( {icon} {children} diff --git a/src/components/layout/navigation/navigator/navigator.component.tsx b/src/components/layout/navigation/navigator/navigator.component.tsx index 7a04f6c..b5702e5 100644 --- a/src/components/layout/navigation/navigator/navigator.component.tsx +++ b/src/components/layout/navigation/navigator/navigator.component.tsx @@ -1,15 +1,22 @@ import * as React from "react"; // @ts-ignore -import styles from "./navigation.module.scss"; +import styles from "./navigator.module.scss"; // @ts-ignore import image from "../../../../../assets/logo.png"; +import { useLayout } from "../../../../hooks"; +import { cn } from "../../../../utils"; type Props = {} & React.HTMLProps; export const NavigatorComponent: React.FC = ({ children }) => { + const { openNavigator } = useLayout(); return ( -