style: widget footer improvements (#503)

* fix: add menu items to translation file

* style: tooltips, icons and paddings in footer

* style: beautify link to main site
This commit is contained in:
Daniel González-Albo
2025-11-02 19:59:13 +01:00
committed by GitHub
parent 3e2b177ffe
commit 8b7fdce278
3 changed files with 113 additions and 56 deletions

View File

@@ -1,6 +1,12 @@
import { Button, Menu, MenuItem, styled } from "@mui/material"; import { Button, Menu, MenuItem, styled } from "@mui/material";
import type { MenuItemProps } from "@mui/material"; import type { MenuItemProps } from "@mui/material";
import { ChevronDown } from "lucide-react"; import {
ChevronDown,
EyeOff,
PaintBucket,
TextCursorInput,
Trash2,
} from "lucide-react";
import { useRef, useState } from "react"; import { useRef, useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { theme } from "../../theme"; import { theme } from "../../theme";
@@ -98,7 +104,8 @@ function SheetTab(props: SheetTabProps) {
handleClose(); handleClose();
}} }}
> >
Rename <TextCursorInput />
{t("sheet_tab.rename")}
</StyledMenuItem> </StyledMenuItem>
<StyledMenuItem <StyledMenuItem
onClick={() => { onClick={() => {
@@ -106,16 +113,8 @@ function SheetTab(props: SheetTabProps) {
handleClose(); handleClose();
}} }}
> >
Change Color <PaintBucket />
</StyledMenuItem> {t("sheet_tab.change_color")}
<StyledMenuItem
disabled={!props.canDelete}
onClick={() => {
handleOpenDeleteDialog();
handleClose();
}}
>
Delete
</StyledMenuItem> </StyledMenuItem>
<StyledMenuItem <StyledMenuItem
disabled={!props.canDelete} disabled={!props.canDelete}
@@ -124,8 +123,20 @@ function SheetTab(props: SheetTabProps) {
handleClose(); handleClose();
}} }}
> >
Hide sheet <EyeOff />
{t("sheet_tab.hide_sheet")}
</StyledMenuItem> </StyledMenuItem>
<MenuDivider />
<DeleteButton
disabled={!props.canDelete}
onClick={() => {
handleOpenDeleteDialog();
handleClose();
}}
>
<Trash2 />
{t("sheet_tab.delete")}
</DeleteButton>
</StyledMenu> </StyledMenu>
<SheetRenameDialog <SheetRenameDialog
open={renameDialogOpen} open={renameDialogOpen}
@@ -178,7 +189,9 @@ const StyledMenu = styled(Menu)`
const StyledMenuItem = styled(MenuItem)<MenuItemProps>(() => ({ const StyledMenuItem = styled(MenuItem)<MenuItemProps>(() => ({
display: "flex", display: "flex",
justifyContent: "space-between", justifyContent: "flex-start",
alignItems: "center",
gap: "8px",
fontSize: "12px", fontSize: "12px",
width: "calc(100% - 8px)", width: "calc(100% - 8px)",
margin: "0px 4px", margin: "0px 4px",
@@ -188,6 +201,11 @@ const StyledMenuItem = styled(MenuItem)<MenuItemProps>(() => ({
"&:disabled": { "&:disabled": {
color: "#BDBDBD", color: "#BDBDBD",
}, },
"& svg": {
width: "16px",
height: "16px",
color: `${theme.palette.grey[600]}`,
},
})); }));
const TabWrapper = styled("div")<{ $color: string; $selected: boolean }>` const TabWrapper = styled("div")<{ $color: string; $selected: boolean }>`
@@ -233,4 +251,25 @@ const Name = styled("div")`
user-select: none; user-select: none;
`; `;
const MenuDivider = styled("div")`
width: 100%;
margin: auto;
margin-top: 4px;
margin-bottom: 4px;
border-top: 1px solid ${theme.palette.grey[200]};
`;
const DeleteButton = styled(StyledMenuItem)`
color: ${theme.palette.error.main};
svg {
color: ${theme.palette.error.main};
}
&:hover {
background-color: ${theme.palette.error.main}1A;
}
&:active {
background-color: ${theme.palette.error.main}1A;
}
`;
export default SheetTab; export default SheetTab;

View File

@@ -1,7 +1,9 @@
import { styled } from "@mui/material"; import { styled } from "@mui/material";
import { Tooltip } from "@mui/material";
import { Menu, Plus } from "lucide-react"; import { Menu, Plus } from "lucide-react";
import { useState } from "react"; import { useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { IronCalcLogo } from "../../icons";
import { theme } from "../../theme"; import { theme } from "../../theme";
import { StyledButton } from "../Toolbar/Toolbar"; import { StyledButton } from "../Toolbar/Toolbar";
import { NAVIGATION_HEIGHT } from "../constants"; import { NAVIGATION_HEIGHT } from "../constants";
@@ -49,20 +51,16 @@ function SheetTabBar(props: SheetTabBarProps) {
return ( return (
<Container> <Container>
<LeftButtonsContainer> <LeftButtonsContainer>
<StyledButton <Tooltip title={t("navigation.add_sheet")}>
title={t("navigation.add_sheet")} <StyledButton $pressed={false} onClick={props.onAddBlankSheet}>
$pressed={false}
onClick={props.onAddBlankSheet}
>
<Plus /> <Plus />
</StyledButton> </StyledButton>
<StyledButton </Tooltip>
onClick={handleClick} <Tooltip title={t("navigation.sheet_list")}>
title={t("navigation.sheet_list")} <StyledButton onClick={handleClick} $pressed={false}>
$pressed={false}
>
<Menu /> <Menu />
</StyledButton> </StyledButton>
</Tooltip>
</LeftButtonsContainer> </LeftButtonsContainer>
<VerticalDivider /> <VerticalDivider />
<Sheets> <Sheets>
@@ -90,9 +88,15 @@ function SheetTabBar(props: SheetTabBarProps) {
))} ))}
</SheetInner> </SheetInner>
</Sheets> </Sheets>
<Advert href="https://www.ironcalc.com" target="_blank"> <RightContainer>
ironcalc.com <Tooltip title={t("navigation.link")}>
</Advert> <LogoLink
onClick={() => window.open("https://www.ironcalc.com", "_blank")}
>
<IronCalcLogo />
</LogoLink>
</Tooltip>
</RightContainer>
<SheetListMenu <SheetListMenu
anchorEl={anchorEl} anchorEl={anchorEl}
open={open} open={open}
@@ -119,14 +123,11 @@ const Container = styled("div")`
display: flex; display: flex;
height: ${NAVIGATION_HEIGHT}px; height: ${NAVIGATION_HEIGHT}px;
align-items: center; align-items: center;
padding: 0px 12px; padding: 0px;
font-family: Inter; font-family: Inter;
overflow: hidden;
background-color: ${theme.palette.common.white}; background-color: ${theme.palette.common.white};
border-top: 1px solid ${theme.palette.grey["300"]}; border-top: 1px solid ${theme.palette.grey["300"]};
@media (max-width: 769px) {
padding-right: 0px;
padding-left: 8px;
}
`; `;
const Sheets = styled("div")` const Sheets = styled("div")`
@@ -143,30 +144,15 @@ const SheetInner = styled("div")`
display: flex; display: flex;
`; `;
const Advert = styled("a")`
display: flex;
align-items: center;
color: ${theme.palette.primary.main};
padding: 0px 0px 0px 12px;
font-size: 12px;
text-decoration: none;
border-left: 1px solid ${theme.palette.grey["300"]};
transition: color 0.2s ease-in-out;
&:hover {
text-decoration: underline;
}
@media (max-width: 769px) {
display: none;
}
`;
const LeftButtonsContainer = styled("div")` const LeftButtonsContainer = styled("div")`
display: flex; display: flex;
flex-direction: row; flex-direction: row;
align-items: center;
height: 100%;
gap: 4px; gap: 4px;
padding-right: 12px; padding: 0px 12px;
@media (max-width: 769px) { @media (max-width: 769px) {
padding-right: 8px; padding: 0px 8px;
} }
`; `;
@@ -178,4 +164,29 @@ const VerticalDivider = styled("div")`
} }
`; `;
const RightContainer = styled("a")`
display: flex;
align-items: center;
color: ${theme.palette.primary.main};
height: 100%;
padding: 0px 8px;
@media (max-width: 769px) {
display: none;
}
`;
const LogoLink = styled("div")`
display: flex;
align-items: center;
padding: 8px;
border-radius: 4px;
svg {
height: 14px;
width: auto;
}
&:hover {
background-color: ${theme.palette.grey["100"]};
}
`;
export default SheetTabBar; export default SheetTabBar;

View File

@@ -81,6 +81,12 @@
"confirm": "Yes, delete sheet", "confirm": "Yes, delete sheet",
"cancel": "Cancel" "cancel": "Cancel"
}, },
"sheet_tab": {
"rename": "Rename",
"change_color": "Change Color",
"delete": "Delete",
"hide_sheet": "Hide sheet"
},
"formula_input": { "formula_input": {
"update": "Update", "update": "Update",
"label": "Formula", "label": "Formula",
@@ -88,7 +94,8 @@
}, },
"navigation": { "navigation": {
"add_sheet": "Add sheet", "add_sheet": "Add sheet",
"sheet_list": "Sheet list" "sheet_list": "Sheet list",
"link": "Open ironcalc.com"
}, },
"name_manager_dialog": { "name_manager_dialog": {
"title": "Named Ranges", "title": "Named Ranges",