Finish UI skeleton

This commit is contained in:
Jake Walker 2022-08-04 18:41:53 +01:00
parent 9eb850a969
commit c89d435b5a
Signed by: jakew
GPG key ID: 2B83DC56C147243B
4 changed files with 79 additions and 31 deletions

View file

@ -1,27 +1,32 @@
import { AppShell, Box, Grid, Stack } from "@mantine/core" import { AppShell, Box, Button, Grid, Group, Input, Stack } from "@mantine/core"
import { useState } from "react"
import ChannelList from "./components/ChannelList" import ChannelList from "./components/ChannelList"
import Header from "./components/Header" import Header from "./components/Header"
import MemberList from "./components/MemberList" import MemberList from "./components/MemberList"
import Message from "./components/Message" import Message from "./components/Message"
function App() { function App() {
const [opened, setOpened] = useState(false);
return ( return (
<AppShell <AppShell
padding="md" padding={0}
navbar={<ChannelList />} navbarOffsetBreakpoint="sm"
header={<Header />}> navbar={<ChannelList hidden={!opened} />}
<Grid> header={<Header opened={opened} setOpened={setOpened} />}
<Grid.Col span={10}> aside={<MemberList />}
<Stack sx={{ overflowY: "scroll" }}> >
<Stack sx={{ maxHeight: "calc(100vh - 60px)" }} spacing={0}>
<Stack sx={{ overflowY: "auto", flexGrow: 1 }} p="md">
{[...Array(10)].map((e, i) => ( {[...Array(10)].map((e, i) => (
<Message /> <Message />
))} ))}
</Stack> </Stack>
</Grid.Col> <Group p="md" sx={(theme) => ({ borderTop: `1px solid ${theme.colorScheme === 'dark' ? theme.colors.dark[5] : theme.colors.gray[2]}`})}>
<Grid.Col span={2}> <Input sx={{ flexGrow: 1 }} placeholder="Message" />
<MemberList /> <Button>Send</Button>
</Grid.Col> </Group>
</Grid> </Stack>
</AppShell> </AppShell>
) )
} }

View file

@ -1,12 +1,22 @@
import { Navbar, NavLink } from "@mantine/core"; import { ActionIcon, Box, Button, Group, Navbar, NavLink, Stack } from "@mantine/core";
import { Hash } from "react-feather"; import { Hash, Settings } from "react-feather";
function ChannelList() { function ChannelList(props: { hidden: boolean }) {
return ( return (
<Navbar width={{ base: 300 }} p="xs"> <Navbar width={{ base: '100%', sm: 200, md: 300 }} p="sm" hidden={props.hidden} hiddenBreakpoint="sm">
<Stack sx={{ flexGrow: 1 }}>
<Box>
{[...Array(4)].map((e, i) => ( {[...Array(4)].map((e, i) => (
<NavLink label={`Channel ${i+1}`} icon={<Hash />}/> <NavLink label={`Channel ${i+1}`} icon={<Hash />}/>
))} ))}
</Box>
</Stack>
<Button.Group>
<Button sx={{ flexGrow: 1 }}>Connect</Button>
<Button variant="outline">
<Settings size={20} />
</Button>
</Button.Group>
</Navbar> </Navbar>
) )
} }

View file

@ -1,14 +1,41 @@
import { Header as MHeader, Group, Text, Space } from '@mantine/core'; import { Header as MHeader, Group, Text, MediaQuery, Burger, createStyles } from '@mantine/core';
interface HeaderProps {
opened: boolean
setOpened: React.Dispatch<React.SetStateAction<boolean>>
}
const useStyles = createStyles((theme) => ({
title: {
[`@media (min-width: ${theme.breakpoints.sm}px)`]: {
width: "180px"
},
[`@media (min-width: ${theme.breakpoints.md}px)`]: {
width: "280px"
}
}
}))
function Header(props: HeaderProps) {
const { classes } = useStyles();
function Header() {
return ( return (
<MHeader height={60} p="xs" sx={(theme) => ({ <MHeader height={60} p="md" sx={(theme) => ({
backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[6] : theme.colors.blue[6], backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[5] : theme.colors.blue[6],
color: 'white' color: 'white'
})}> })}>
<Group sx={{ height: "100%" }}> <Group sx={{ height: "100%" }}>
<Text size="xl" my="auto" sx={{ width: "280px" }}>Echo Web</Text> <MediaQuery largerThan="sm" styles={{ display: 'none' }}>
<Burger
opened={props.opened}
onClick={() => props.setOpened((o) => !o)}
color="white"
size="sm" />
</MediaQuery>
<Text size="xl" my="auto" className={classes.title}>Echo Web</Text>
<MediaQuery smallerThan="sm" styles={{ display: 'none' }}>
<Text size="md" my="auto">Channel 1</Text> <Text size="md" my="auto">Channel 1</Text>
</MediaQuery>
</Group> </Group>
</MHeader> </MHeader>
) )

View file

@ -1,8 +1,14 @@
import { Navbar, NavLink } from "@mantine/core" import { Aside, MediaQuery, Navbar, NavLink } from "@mantine/core"
function MemberList() { function MemberList() {
return ( return (
<p>Member List</p> <MediaQuery smallerThan="sm" styles={{ display: 'none' }}>
<Aside p="sm" hiddenBreakpoint="sm" width={{ sm: 200, lg: 300 }}>
{[...Array(4)].map((e, i) => (
<NavLink label={`Person ${i+1}`}/>
))}
</Aside>
</MediaQuery>
) )
} }