-
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
-
20
-
21
-
22
-
23
-
24
-
25
-
26
-
27
-
28
-
29
-
30
-
31
-
32
-
33
-
34
-
35
-
36
-
37
-
38
-
39
-
40
-
41
-
42
-
43
-
44
-
45
-
46
-
47
-
48
-
49
-
50
-
51
-
52
-
53
-
54
-
55
-
56
-
57
-
58
-
59
-
60
-
61
-
62
-
63
-
64
-
65
-
66
-
67
-
68
-
69
-
70
-
71
-
72
-
73
-
74
-
75
-
76
-
77
// SPDX-FileCopyrightText: 2024 Shota FUJI <pockawoooh@gmail.com>
// SPDX-License-Identifier: AGPL-3.0-only
import { ArrowLeftIcon } from "@radix-ui/react-icons";
import {
Box,
type BoxProps,
Card,
Flex,
Grid,
Heading,
IconButton,
Inset,
ScrollArea,
Theme,
} from "@radix-ui/themes";
import { type FC, type ReactNode } from "react";
import css from "./Layout.module.css";
export interface LayoutProps extends Pick<BoxProps, "className" | "children" | "style"> {
title: ReactNode;
onBack?(): void;
}
export const Layout: FC<LayoutProps> = ({
className,
children,
title,
onBack,
...rest
}) => {
return (
<Grid
className={`${css.bgGrid} ${className || ""}`}
inset="0"
height="100%"
p="4"
px={{ initial: "2", md: "4" }}
columns={{ initial: "1", md: "minmax(0, 1fr) 30rem" }}
{...rest}
>
<Box asChild gridColumn="-2 / -1">
<Card>
<Theme asChild panelBackground="solid">
<Flex height="100%" direction="column" gap="5" p={{ initial: "0", md: "1" }}>
<Flex align="center">
{onBack && (
<IconButton
className={css.back}
variant="ghost"
onClick={() => void onBack()}
>
<ArrowLeftIcon />
</IconButton>
)}
<Box className={css.title} asChild flexGrow="1" flexShrink="1">
<Heading size="4" align="center">
{title}
</Heading>
</Box>
</Flex>
<Inset className={css.body} data-root={onBack ? "" : undefined}>
<ScrollArea>
<Box px={{ initial: "2", xs: "3" }} pb="3" pt="0">
{children}
</Box>
</ScrollArea>
</Inset>
</Flex>
</Theme>
</Card>
</Box>
</Grid>
);
};