diff --git a/src/components/NavigationBar.tsx b/src/components/NavigationBar.tsx
new file mode 100644
index 0000000..7c47cff
--- /dev/null
+++ b/src/components/NavigationBar.tsx
@@ -0,0 +1,26 @@
+import { Spacer } from "@/foundations";
+import { flex, mq } from "@/style-predefines";
+import { css } from "@emotion/react";
+import styled from "@emotion/styled";
+import chroma from "chroma-js";
+
+const NavigationContainer = styled.div(
+ ({ theme }) => css`
+ height: 100%;
+ width: ${theme.spacings.xxs * 36}px;
+ padding-top: ${theme.spacings.xxs * 24}px;
+ background-color: ${chroma(theme.backgroundColor.light).darken(0.3).hex()};
+ ${flex(theme, "column", "flex-start", "stretch", "sm")}
+ ${mq.dark} {
+ background-color: ${chroma(theme.backgroundColor.dark).brighten(0.3).hex()};
+ }
+ `
+);
+
+export function NavigationBar() {
+ return (
+
+
+
+ );
+}
diff --git a/src/components/WindowMoveHandler.tsx b/src/components/WindowMoveHandler.tsx
new file mode 100644
index 0000000..b113abe
--- /dev/null
+++ b/src/components/WindowMoveHandler.tsx
@@ -0,0 +1,17 @@
+import { css } from "@emotion/react";
+import styled from "@emotion/styled";
+
+const Handler = styled.div(
+ ({ theme }) => css`
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ height: ${theme.spacings.xxs * 24}px;
+ z-index: 1;
+ `
+);
+
+export function WindowMoveHandler() {
+ return ;
+}
diff --git a/src/components/WindowMoveHandler/WindowMoveHandler.tsx b/src/components/WindowMoveHandler/WindowMoveHandler.tsx
deleted file mode 100644
index d4bac7c..0000000
--- a/src/components/WindowMoveHandler/WindowMoveHandler.tsx
+++ /dev/null
@@ -1,17 +0,0 @@
-import { css } from "@emotion/react";
-import styled from "@emotion/styled";
-
-const Handler = styled.div(({ theme }) =>
- css({
- position: "fixed",
- top: 0,
- left: 0,
- right: 0,
- height: theme.spacings.xxs * 24,
- zIndex: 1,
- })
-);
-
-export function WindowMoveHandler() {
- return ;
-}
diff --git a/src/components/index.tsx b/src/components/index.tsx
index 9118272..bf14e32 100644
--- a/src/components/index.tsx
+++ b/src/components/index.tsx
@@ -1 +1,2 @@
-export { WindowMoveHandler } from "./WindowMoveHandler/WindowMoveHandler";
+export { NavigationBar } from "./NavigationBar";
+export { WindowMoveHandler } from "./WindowMoveHandler";
diff --git a/src/foundations/Avatar.tsx b/src/foundations/Avatar.tsx
new file mode 100644
index 0000000..021f354
--- /dev/null
+++ b/src/foundations/Avatar.tsx
@@ -0,0 +1,42 @@
+import { flex } from "@/style-predefines";
+import { css, useTheme } from "@emotion/react";
+import styled from "@emotion/styled";
+import { __, always, cond, includes, T } from "ramda";
+import { PropsWithChildren } from "react";
+
+type AvatarProps = {
+ size?: "xs" | "sm" | "md" | "lg" | "xl" | "xxl";
+ square?: boolean;
+ bgColor?: string;
+};
+
+const AvatarContainer = styled("div")(({ theme, size, square }) => {
+ const radiusSize = cond([
+ [includes(__, ["xs", "sm", "md"]), always("xxs")],
+ [T, always("xs")],
+ ])(size);
+ return css`
+ height: ${theme.spacings[size]};
+ width: ${theme.spacings[size]};
+ border-radius: ${theme.radius[square ? "none" : radiusSize]};
+ overflow: hidden;
+ ${flex(theme, "row", "center", "center")}
+ .child {
+ overflow: hidden;
+ }
+ `;
+});
+
+export function Avatar({
+ size = "md",
+ square = false,
+ bgColor,
+ children,
+}: PropsWithChildren) {
+ const theme = useTheme();
+ return (
+
+ {children}
+
+ );
+}
diff --git a/src/foundations/Spacer.tsx b/src/foundations/Spacer.tsx
new file mode 100644
index 0000000..e595b67
--- /dev/null
+++ b/src/foundations/Spacer.tsx
@@ -0,0 +1,10 @@
+import { css } from "@emotion/react";
+import styled from "@emotion/styled";
+
+export const Spacer = styled.div(
+ () => css`
+ flex-grow: 1;
+ flex-shrink: 0;
+ align-self: stretch;
+ `
+);
diff --git a/src/foundations/index.tsx b/src/foundations/index.tsx
index e69de29..3743486 100644
--- a/src/foundations/index.tsx
+++ b/src/foundations/index.tsx
@@ -0,0 +1 @@
+export { Spacer } from "./Spacer";
diff --git a/src/pages/MainLayout.tsx b/src/pages/MainLayout.tsx
index 9804969..f80da0b 100644
--- a/src/pages/MainLayout.tsx
+++ b/src/pages/MainLayout.tsx
@@ -1,22 +1,27 @@
-import { WindowMoveHandler } from "@/components";
+import { NavigationBar, WindowMoveHandler } from "@/components";
import { flex } from "@/style-predefines";
import { css } from "@emotion/react";
import styled from "@emotion/styled";
-const LayoutContainer = styled.div(({ theme }) =>
- css({
- height: "100vh",
- width: "100vw",
- paddingTop: theme.spacings.xxs * 24,
- ...flex(theme, "row", "flex-start", "stretch"),
- overflow: "hidden",
- })
+const LayoutContainer = styled.div(
+ ({ theme }) => css`
+ height: 100%;
+ width: 100%;
+ overflow: hidden;
+ ${flex(theme, "row", "flex-start", "stretch")}
+ .main-content {
+ flex-grow: 1;
+ overflow: hidden;
+ }
+ `
);
export function MainLayout() {
return (
+
+ Main Content
);
}