From 90f3eaa26b31d5f966bc3b8ece016b783f00ae2b Mon Sep 17 00:00:00 2001
From: Eug-VS <eug-vs@keemail.me>
Date: Thu, 9 Jan 2020 09:33:37 +0300
Subject: Implement Window component

Divide Window into three types:
- primary: larger left window
- secondary: smaller right window
- mono: both primary and secondary merged together

For now, Window sizes are hard-coded values in viewport widht
and height measurements.

If a name prop specified, Window is displayed with a top bar.
---
 src/components/Window/Window.js                    | 55 ++++++++++++++++++++++
 .../Window/WindowSurface/WindowSurface.js          | 31 ++++++++++++
 2 files changed, 86 insertions(+)
 create mode 100644 src/components/Window/Window.js
 create mode 100644 src/components/Window/WindowSurface/WindowSurface.js

(limited to 'src/components/Window')

diff --git a/src/components/Window/Window.js b/src/components/Window/Window.js
new file mode 100644
index 0000000..63bd6ba
--- /dev/null
+++ b/src/components/Window/Window.js
@@ -0,0 +1,55 @@
+import React from 'react';
+
+import { Typography, Divider, makeStyles } from "@material-ui/core";
+
+import WindowSurface from "./WindowSurface/WindowSurface";
+
+
+const useStyles = makeStyles(theme => ({
+  header: {
+    padding: theme.spacing(1, 0, 1, 2),
+    background: theme.palette.background.elevation,
+  },
+}));
+
+
+const Window = ({ type, name, children }) => {
+  const classes = useStyles();
+
+  const size = {
+    height: '85vh',
+  };
+
+  const position = {
+    bottom: '3vh',
+  };
+
+  if (type === 'primary') {
+    size.width = '63vw';
+    position.left = '2vw';
+  } else if (type === 'secondary') {
+    size.width = '31vw';
+    position.right = '2vw';
+  } else if (type === 'mono') {
+    position.left = '2vw';
+    position.right = '2vw';
+  }
+
+  return (
+    <WindowSurface
+      size={size}
+      position={position}
+    >
+      {name &&
+      <div>
+        <Typography variant="h5" className={classes.header}>{name}</Typography>
+        <Divider />
+      </div>
+      }
+      {children}
+    </WindowSurface>
+  );
+};
+
+
+export default Window;
diff --git a/src/components/Window/WindowSurface/WindowSurface.js b/src/components/Window/WindowSurface/WindowSurface.js
new file mode 100644
index 0000000..d1d1510
--- /dev/null
+++ b/src/components/Window/WindowSurface/WindowSurface.js
@@ -0,0 +1,31 @@
+import React from 'react';
+
+import { Paper, makeStyles } from "@material-ui/core";
+
+
+const useStyles = makeStyles(theme => ({
+  surface: {
+    position: 'absolute',
+    display: 'flex',
+    flexDirection: 'column',
+    background: theme.palette.background.elevation,
+  }
+}));
+
+
+const WindowSurface = ({ size, position, children }) => {
+  const classes = useStyles();
+
+  return (
+    <Paper
+      elevation={3}
+      style={{...size, ...position}}
+      className={classes.surface}
+    >
+      {children}
+    </Paper>
+  )
+};
+
+
+export default WindowSurface;
\ No newline at end of file
-- 
cgit v1.2.3