173 lines
4.9 KiB
TypeScript
173 lines
4.9 KiB
TypeScript
|
/*
|
||
|
This file is part of GNU Taler
|
||
|
(C) 2022 Taler Systems S.A.
|
||
|
|
||
|
GNU Taler is free software; you can redistribute it and/or modify it under the
|
||
|
terms of the GNU General Public License as published by the Free Software
|
||
|
Foundation; either version 3, or (at your option) any later version.
|
||
|
|
||
|
GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
|
||
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||
|
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||
|
|
||
|
You should have received a copy of the GNU General Public License along with
|
||
|
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
* @author Sebastian Javier Marchano (sebasjm)
|
||
|
*/
|
||
|
|
||
|
import { h, VNode } from "preact";
|
||
|
import { useState } from "preact/hooks";
|
||
|
import { Menu, MenuItem } from "./Menu.jsx";
|
||
|
import { Paper } from "./Paper.js";
|
||
|
|
||
|
export default {
|
||
|
title: "mui/menu",
|
||
|
component: Menu,
|
||
|
};
|
||
|
|
||
|
export const BasicExample = (): VNode => {
|
||
|
const [open, setOpen] = useState(false);
|
||
|
async function handleClose(): Promise<void> {
|
||
|
setOpen(false);
|
||
|
}
|
||
|
async function handleClick(): Promise<void> {
|
||
|
setOpen(true);
|
||
|
}
|
||
|
return (
|
||
|
<Menu open={open} onClose={handleClose} onClick={handleClick}>
|
||
|
<MenuItem onClick={handleClose}>Profile</MenuItem>
|
||
|
<MenuItem onClick={handleClose}>My account</MenuItem>
|
||
|
<MenuItem onClick={handleClose}>Logout</MenuItem>
|
||
|
</Menu>
|
||
|
);
|
||
|
};
|
||
|
|
||
|
import { styled } from "@linaria/react";
|
||
|
// eslint-disable-next-line import/extensions
|
||
|
import { theme } from "./style";
|
||
|
import { Typography } from "./Typography.js";
|
||
|
import { Divider } from "./Divider.js";
|
||
|
|
||
|
const ListItemIcon = styled.div`
|
||
|
min-width: 36px;
|
||
|
color: ${theme.palette.action.active};
|
||
|
flex-shrink: 0;
|
||
|
display: inline-flex;
|
||
|
`;
|
||
|
|
||
|
const IconCut = (): VNode => (
|
||
|
<svg
|
||
|
xmlns="http://www.w3.org/2000/svg"
|
||
|
viewBox="0 0 24 24"
|
||
|
aria-hidden="true"
|
||
|
focusable="false"
|
||
|
style={{
|
||
|
width: "1em",
|
||
|
height: "1em",
|
||
|
}}
|
||
|
>
|
||
|
<path d="M9.64 7.64c.23-.5.36-1.05.36-1.64 0-2.21-1.79-4-4-4S2 3.79 2 6s1.79 4 4 4c.59 0 1.14-.13 1.64-.36L10 12l-2.36 2.36C7.14 14.13 6.59 14 6 14c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4c0-.59-.13-1.14-.36-1.64L12 14l7 7h3v-1L9.64 7.64zM6 8c-1.1 0-2-.89-2-2s.9-2 2-2 2 .89 2 2-.9 2-2 2zm0 12c-1.1 0-2-.89-2-2s.9-2 2-2 2 .89 2 2-.9 2-2 2zm6-7.5c-.28 0-.5-.22-.5-.5s.22-.5.5-.5.5.22.5.5-.22.5-.5.5zM19 3l-6 6 2 2 7-7V3z" />
|
||
|
</svg>
|
||
|
);
|
||
|
|
||
|
const IconCopy = (): VNode => (
|
||
|
<svg
|
||
|
xmlns="http://www.w3.org/2000/svg"
|
||
|
viewBox="0 0 24 24"
|
||
|
aria-hidden="true"
|
||
|
focusable="false"
|
||
|
style={{
|
||
|
width: "1em",
|
||
|
height: "1em",
|
||
|
}}
|
||
|
>
|
||
|
<path d="M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z" />
|
||
|
</svg>
|
||
|
);
|
||
|
|
||
|
const IconPaste = (): VNode => (
|
||
|
<svg
|
||
|
xmlns="http://www.w3.org/2000/svg"
|
||
|
viewBox="0 0 24 24"
|
||
|
aria-hidden="true"
|
||
|
focusable="false"
|
||
|
style={{
|
||
|
width: "1em",
|
||
|
height: "1em",
|
||
|
}}
|
||
|
>
|
||
|
<path d="M19 2h-4.18C14.4.84 13.3 0 12 0c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm7 18H5V4h2v3h10V4h2v16z" />
|
||
|
</svg>
|
||
|
);
|
||
|
|
||
|
const IconCloud = (): VNode => (
|
||
|
<svg
|
||
|
xmlns="http://www.w3.org/2000/svg"
|
||
|
viewBox="0 0 24 24"
|
||
|
aria-hidden="true"
|
||
|
focusable="false"
|
||
|
style={{
|
||
|
width: "1em",
|
||
|
height: "1em",
|
||
|
}}
|
||
|
>
|
||
|
<path d="M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96z" />
|
||
|
</svg>
|
||
|
);
|
||
|
|
||
|
const ListItemText = styled.div`
|
||
|
flex: 1 1 auto;
|
||
|
min-width: 0px;
|
||
|
margin-top: 4px;
|
||
|
margin-bottom: 4px;
|
||
|
`;
|
||
|
|
||
|
export function IconMenu(): VNode {
|
||
|
return (
|
||
|
<div style={{ width: 320 }}>
|
||
|
<Paper>
|
||
|
<ul>
|
||
|
<MenuItem>
|
||
|
<ListItemIcon>
|
||
|
<IconCut />
|
||
|
</ListItemIcon>
|
||
|
<ListItemText>Cut</ListItemText>
|
||
|
<Typography variant="body2" /* color="text.secondary" */>
|
||
|
⌘X
|
||
|
</Typography>
|
||
|
</MenuItem>
|
||
|
<MenuItem>
|
||
|
<ListItemIcon>
|
||
|
<IconCopy />
|
||
|
</ListItemIcon>
|
||
|
<ListItemText>Copy</ListItemText>
|
||
|
<Typography variant="body2" /* color="text.secondary" */>
|
||
|
⌘C
|
||
|
</Typography>
|
||
|
</MenuItem>
|
||
|
<MenuItem>
|
||
|
<ListItemIcon>
|
||
|
<IconPaste />
|
||
|
</ListItemIcon>
|
||
|
<ListItemText>Paste</ListItemText>
|
||
|
<Typography variant="body2" /* color="text.secondary" */>
|
||
|
⌘V
|
||
|
</Typography>
|
||
|
</MenuItem>
|
||
|
<Divider />
|
||
|
<MenuItem>
|
||
|
<ListItemIcon>
|
||
|
<IconCloud />
|
||
|
</ListItemIcon>
|
||
|
<ListItemText>Web Clipboard</ListItemText>
|
||
|
</MenuItem>
|
||
|
</ul>
|
||
|
</Paper>
|
||
|
</div>
|
||
|
);
|
||
|
}
|