diff --git a/packages/frontend/assets/img/logo.png b/packages/frontend/assets/img/logo.png
new file mode 100644
index 000000000..2c8400d79
Binary files /dev/null and b/packages/frontend/assets/img/logo.png differ
diff --git a/packages/frontend/components/common/Avatar.tsx b/packages/frontend/components/common/Avatar.tsx
new file mode 100644
index 000000000..d25b47f8b
--- /dev/null
+++ b/packages/frontend/components/common/Avatar.tsx
@@ -0,0 +1,5 @@
+import { Avatar as MantineAvatar } from "@mantine/core";
+
+export function Avatar({ src }: { src: string }) {
+ return ;
+}
diff --git a/packages/frontend/components/common/Button.tsx b/packages/frontend/components/common/Button.tsx
new file mode 100644
index 000000000..9ee4e31cb
--- /dev/null
+++ b/packages/frontend/components/common/Button.tsx
@@ -0,0 +1,16 @@
+import { Button as MantineButton } from "@mantine/core";
+import { ReactNode } from "react";
+
+export function Button({
+ children,
+ icon,
+}: {
+ children: ReactNode;
+ icon: ReactNode;
+}) {
+ return (
+
+ {children}
+
+ );
+}
diff --git a/packages/frontend/components/common/TextInput.tsx b/packages/frontend/components/common/TextInput.tsx
new file mode 100644
index 000000000..840f5d9a9
--- /dev/null
+++ b/packages/frontend/components/common/TextInput.tsx
@@ -0,0 +1,38 @@
+import { TextInput as MantineTextInput } from "@mantine/core";
+import { createStyles, MantineSize } from "@mantine/styles";
+import { ReactNode } from "react";
+
+const useStyles = createStyles(() => ({
+ input: {
+ backgroundColor: "var(--colors-bg-lighter)",
+ color: "var(--colors-text)",
+ fontWeight: 500,
+ fontSize: "0.9rem",
+ "::placeholder": {
+ color: "var(--colors-text-lighter)",
+ },
+ },
+}));
+
+export function TextInput({
+ placeholder,
+ icon,
+ size,
+}: {
+ placeholder: string;
+ icon?: ReactNode;
+ size?: MantineSize;
+}) {
+ const { classes } = useStyles();
+ return (
+
+ );
+}
diff --git a/packages/frontend/components/layout.tsx b/packages/frontend/components/layout.tsx
index 58ddcdecf..ec40ed7c3 100644
--- a/packages/frontend/components/layout.tsx
+++ b/packages/frontend/components/layout.tsx
@@ -1,28 +1,58 @@
import styled from "@emotion/styled";
import { ReactNode } from "react";
+import { HiChevronDown, HiSearch } from "react-icons/hi";
+import { TextInput } from "./common/TextInput";
+import NextImage from "next/image";
+import logo from "../assets/img/logo.png";
+import { Avatar } from "./common/Avatar";
+import { Button } from "./common/Button";
-const _Button = styled.button`
- padding: 32px;
- background-color: hotpink;
- font-size: 24px;
- border-radius: 4px;
- color: black;
- font-weight: bold;
- &:hover {
- color: white;
+const _Header = styled.header`
+ display: grid;
+ grid-template-columns: 1fr 1fr 1fr;
+ align-items: center;
+ padding: 1rem;
+
+ & > :first-child {
+ justify-self: flex-start;
+ }
+
+ & > :last-child {
+ justify-self: flex-end;
}
`;
-const Container = styled.div`
- background-color: var(--bg);
+const _RightContainer = styled.div`
+ display: flex;
+ gap: 1rem;
+`;
+
+const _LogoContainer = styled.div`
+ background-color: var(--colors-bg-lighter);
+ display: grid;
+ place-items: center;
+ padding: 0.25rem;
+ border-radius: 16px;
`;
export function Layout({ children }: { children: ReactNode }) {
return (
-
-
- <_Button>hello
+ <>
+ <_Header>
+ <_LogoContainer>
+
+
+ }
+ size="md"
+ />
+ <_RightContainer>
+ }>Create new...
+
+
+
{children}
-
+ >
);
}
diff --git a/packages/frontend/package-lock.json b/packages/frontend/package-lock.json
index 05f8d55c8..4aaa0d059 100644
--- a/packages/frontend/package-lock.json
+++ b/packages/frontend/package-lock.json
@@ -13,6 +13,7 @@
"next": "^11.1.2",
"react": "^17.0.2",
"react-dom": "^17.0.2",
+ "react-icons": "^4.3.1",
"swr": "^1.0.1"
},
"devDependencies": {
@@ -3583,6 +3584,14 @@
"resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz",
"integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA=="
},
+ "node_modules/react-icons": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.3.1.tgz",
+ "integrity": "sha512-cB10MXLTs3gVuXimblAdI71jrJx8njrJZmNMEMC+sQu5B/BIOmlsAjskdqpn81y8UBVEGuHODd7/ci5DvoSzTQ==",
+ "peerDependencies": {
+ "react": "*"
+ }
+ },
"node_modules/react-is": {
"version": "17.0.2",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
@@ -7090,6 +7099,12 @@
"resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz",
"integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA=="
},
+ "react-icons": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.3.1.tgz",
+ "integrity": "sha512-cB10MXLTs3gVuXimblAdI71jrJx8njrJZmNMEMC+sQu5B/BIOmlsAjskdqpn81y8UBVEGuHODd7/ci5DvoSzTQ==",
+ "requires": {}
+ },
"react-is": {
"version": "17.0.2",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
diff --git a/packages/frontend/package.json b/packages/frontend/package.json
index 3901f0131..876e35a30 100644
--- a/packages/frontend/package.json
+++ b/packages/frontend/package.json
@@ -14,6 +14,7 @@
"next": "^11.1.2",
"react": "^17.0.2",
"react-dom": "^17.0.2",
+ "react-icons": "^4.3.1",
"swr": "^1.0.1"
},
"devDependencies": {
diff --git a/packages/frontend/pages/_app.css b/packages/frontend/pages/_app.css
index a29a6b9a0..c9be3731c 100644
--- a/packages/frontend/pages/_app.css
+++ b/packages/frontend/pages/_app.css
@@ -1,6 +1,8 @@
:root {
- --colors-bg: #2d306f;
- --colors-text: rgba(255, 255, 255, 0.85);
+ --colors-bg: hsl(237.3, 42.3%, 30.6%);
+ --colors-bg-lighter: hsl(237.3, 42.3%, 35.6%);
+ --colors-text: rgba(255, 255, 255, 0.95);
+ --colors-text-lighter: rgba(255, 255, 255, 0.55);
}
*,
diff --git a/packages/frontend/pages/_app.tsx b/packages/frontend/pages/_app.tsx
index 42917b0a7..cd6fe70f4 100644
--- a/packages/frontend/pages/_app.tsx
+++ b/packages/frontend/pages/_app.tsx
@@ -22,6 +22,7 @@ export default function App(props: AppProps) {