Правки по дизайну

This commit is contained in:
ArtChaos189 2023-05-04 20:31:31 +03:00
parent 5c8e4011a7
commit f262ec8f33
41 changed files with 3435 additions and 2425 deletions

@ -1,45 +1,48 @@
import * as React from "react";
import { createRoot } from 'react-dom/client';
import { createRoot } from "react-dom/client";
import { BrowserRouter, Routes, Route } from "react-router-dom";
import { CssBaseline, ThemeProvider } from "@mui/material";
import { LocalizationProvider } from "@mui/x-date-pickers";
import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs";
import CreateLink from "./pages/CreateLink/CreateLink";
import Stats from "./pages/Stats/Stats";
import { CssBaseline, ThemeProvider } from "@mui/material";
import Landing from "./pages/Landing/Landing";
import theme from "@theme";
import Buying from "./pages/Buying/Buying";
import LinkTransitionsChart from "./pages/LinkTransitionsChart/LinkTransitionsChart";
import Buying from "./pages/Buying/Buying";
import MyLinks from "./pages/MyLinks/MyLinks";
import { LocalizationProvider } from '@mui/x-date-pickers';
import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';
import 'dayjs/locale/ru';
import dayjs from "dayjs";
import ScrollToTop from "./kitUI/ScrollToTop";
import Navbar from "./kitUI/Navbars/Navbar";
import dayjs from "dayjs";
import theme from "@theme";
import "dayjs/locale/ru";
dayjs.locale("ru");
const container = document.getElementById('root');
const container = document.getElementById("root");
const root = createRoot(container!);
root.render(
<React.StrictMode>
<LocalizationProvider dateAdapter={AdapterDayjs} adapterLocale="ru">
<ThemeProvider theme={theme}>
<CssBaseline />
<BrowserRouter>
<ScrollToTop />
<Navbar />
<Routes>
<Route path="/" element={<Landing />} />
<Route path="/buy" element={<Buying />} />
<Route path="/chart" element={<LinkTransitionsChart />} />
<Route path="/links" element={<MyLinks />} />
<Route path="/create" element={<CreateLink />} />
<Route path="/stats" element={<Stats />} />
</Routes>
</BrowserRouter>
</ThemeProvider>
</LocalizationProvider>
</React.StrictMode>
<React.StrictMode>
<LocalizationProvider dateAdapter={AdapterDayjs} adapterLocale="ru">
<ThemeProvider theme={theme}>
<CssBaseline />
<BrowserRouter>
<ScrollToTop />
<Navbar />
<Routes>
<Route path="/" element={<Landing />} />
<Route path="/buy" element={<Buying />} />
<Route path="/chart" element={<LinkTransitionsChart />} />
<Route path="/links" element={<MyLinks />} />
<Route path="/create" element={<CreateLink />} />
<Route path="/stats" element={<Stats />} />
</Routes>
</BrowserRouter>
</ThemeProvider>
</LocalizationProvider>
</React.StrictMode>
);

@ -1,89 +1,105 @@
import { Box, FormControl, SxProps, TextField, Theme, Typography, useMediaQuery, useTheme } from "@mui/material";
import { ChangeEventHandler } from "react";
interface Props {
id: string;
label?: string;
placeholder?: string;
backgroundColor?: string;
disabled?: boolean;
inputColor?: string;
sx?: SxProps<Theme>;
textFieldSx?: SxProps<Theme>;
multiline?: boolean;
maxRows?: number;
value?: string;
onChange?: ChangeEventHandler<HTMLInputElement>;
id: string;
label?: string;
placeholder?: string;
backgroundColor?: string;
disabled?: boolean;
inputColor?: string;
sx?: SxProps<Theme>;
textFieldSx?: SxProps<Theme>;
multiline?: boolean;
maxRows?: number;
value?: string;
onChange?: ChangeEventHandler<HTMLInputElement>;
}
export default function CustomTextField({ id, label, placeholder, backgroundColor, disabled, inputColor, sx, textFieldSx, multiline, maxRows, value, onChange }: Props) {
const theme = useTheme();
const upMd = useMediaQuery(theme.breakpoints.up("md"));
export default function CustomTextField({
id,
label,
placeholder,
backgroundColor,
disabled,
inputColor,
sx,
textFieldSx,
multiline,
maxRows,
value,
onChange,
}: Props) {
const theme = useTheme();
const upMd = useMediaQuery(theme.breakpoints.up("md"));
return (
<Box sx={sx}>
{label && <Typography
variant="t1"
sx={{
fontWeight: 500,
color: "#4D4D4D",
mb: upMd ? "10px" : "11.5px",
lineHeight: "100%",
}}
>{label}</Typography>}
<FormControl
fullWidth
variant="standard"
sx={{
p: 0,
}}
>
<TextField
multiline={multiline}
maxRows={maxRows}
id={id}
value={value}
onChange={onChange}
fullWidth
placeholder={placeholder}
disabled={disabled}
sx={{
"& .MuiOutlinedInput-root": {
borderRadius: "10px",
padding: 0,
overflow: "hidden",
backgroundColor,
color: "black",
"& fieldset": {
border: "1px solid #9A9AAF",
},
"&:hover fieldset": {
borderColor: "#5b5d6e",
},
"&.Mui-focused fieldset": {
borderColor: "#9A9AAF",
},
"& ::placeholder": {
color: "#9A9AAF",
opacity: 1,
},
"& input": {
p: "11px 20px",
WebkitTextFillColor: inputColor,
},
"& .MuiInputBase-inputMultiline": {
overflow: "hidden",
padding: "10px 20px",
paddingBottom: "8px",
WebkitTextFillColor: inputColor,
lineHeight: "21.33px",
}
},
...textFieldSx,
}}
/>
</FormControl>
</Box>
);
}
return (
<Box sx={sx}>
{label && (
<Typography
variant="t1"
sx={{
fontWeight: 500,
color: "#4D4D4D",
mb: upMd ? "10px" : "11.5px",
lineHeight: "100%",
}}
>
{label}
</Typography>
)}
<FormControl
fullWidth
variant="standard"
sx={{
p: 0,
}}
>
<TextField
multiline={multiline}
maxRows={maxRows}
id={id}
value={value}
onChange={onChange}
fullWidth
placeholder={placeholder}
disabled={disabled}
sx={{
"& .MuiOutlinedInput-root": {
borderRadius: "10px",
padding: 0,
overflow: "hidden",
backgroundColor,
color: "black",
"& fieldset": {
border: "1px solid #9A9AAF",
},
"&:hover fieldset": {
borderColor: "#5b5d6e",
},
"&.Mui-focused fieldset": {
borderColor: "#995BEE",
},
"& ::placeholder": {
color: "#9A9AAF",
opacity: 1,
},
"& input": {
p: "11px 20px",
WebkitTextFillColor: inputColor,
},
"& .MuiInputBase-inputMultiline": {
overflow: "hidden",
padding: "10px 20px",
paddingBottom: "8px",
WebkitTextFillColor: inputColor,
lineHeight: "21.33px",
},
},
...textFieldSx,
}}
/>
</FormControl>
</Box>
);
}

@ -1,27 +1,30 @@
import { Box, SxProps, Theme } from "@mui/material";
interface Props {
sx?: SxProps<Theme>;
sx?: SxProps<Theme>;
}
export default function BurgerIcon({ sx }: Props) {
return (
<Box sx={{
width: "30px",
height: "30px",
display: "flex",
alignItems: "center",
justifyContent: "center",
flexShrink: 0,
...sx,
}}>
<svg width="30" height="31" viewBox="0 0 30 31" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M28 8.15039L3 8.15039" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" />
<path d="M28 16.1504H3" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" />
<path d="M28 24.1504H3" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" />
</svg>
</Box>
);
}
return (
<Box
sx={{
width: "30px",
height: "30px",
display: "flex",
alignItems: "center",
justifyContent: "center",
flexShrink: 0,
"&:hover": {
color: "#7E2AEA",
},
...sx,
}}
>
<svg width="30" height="31" viewBox="0 0 30 31" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M28 8.15039L3 8.15039" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" />
<path d="M28 16.1504H3" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" />
<path d="M28 24.1504H3" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" />
</svg>
</Box>
);
}

@ -1,27 +1,39 @@
import { Box } from "@mui/material";
export default function CalendarIcon() {
return (
<Box sx={{
display: "flex",
alignItems: "center",
justifyContent: "center",
flexShrink: 0,
}}>
<svg width="20" height="22" viewBox="0 0 20 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="1" y="2.5" width="18" height="18" rx="5" stroke="#7E2AEA" strokeWidth="1.5" />
<path d="M1 7.5H19" stroke="#7E2AEA" strokeWidth="1.5" strokeLinejoin="round" />
<path d="M14.5 1L14.5 4" stroke="#7E2AEA" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
<path d="M5.5 1L5.5 4" stroke="#7E2AEA" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
<path d="M4.5 11.5H5.5" stroke="#7E2AEA" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
<path d="M9.5 11.5H10.5" stroke="#7E2AEA" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
<path d="M14.5 11.5H15.5" stroke="#7E2AEA" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
<path d="M4.5 15.5H5.5" stroke="#7E2AEA" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
<path d="M9.5 15.5H10.5" stroke="#7E2AEA" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
<path d="M14.5 15.5H15.5" stroke="#7E2AEA" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
</svg>
</Box>
);
}
return (
<Box
sx={{
display: "flex",
alignItems: "center",
justifyContent: "center",
flexShrink: 0,
"&:hover path": {
stroke: "#581CA7",
},
"&:active path": {
stroke: "#FB5607",
},
"&:hover rect": {
stroke: "#581CA7",
},
"&:active rect": {
stroke: "#FB5607",
},
}}
>
<svg width="20" height="22" viewBox="0 0 20 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="1" y="2.5" width="18" height="18" rx="5" stroke="#7E2AEA" strokeWidth="1.5" />
<path d="M1 7.5H19" stroke="#7E2AEA" strokeWidth="1.5" strokeLinejoin="round" />
<path d="M14.5 1L14.5 4" stroke="#7E2AEA" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
<path d="M5.5 1L5.5 4" stroke="#7E2AEA" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
<path d="M4.5 11.5H5.5" stroke="#7E2AEA" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
<path d="M9.5 11.5H10.5" stroke="#7E2AEA" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
<path d="M14.5 11.5H15.5" stroke="#7E2AEA" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
<path d="M4.5 15.5H5.5" stroke="#7E2AEA" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
<path d="M9.5 15.5H10.5" stroke="#7E2AEA" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
<path d="M14.5 15.5H15.5" stroke="#7E2AEA" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
</svg>
</Box>
);
}

@ -1,25 +1,28 @@
import { Box, SxProps, Theme } from "@mui/material";
interface Props {
sx?: SxProps<Theme>;
sx?: SxProps<Theme>;
}
export default function CloseIcon({ sx }: Props) {
return (
<Box sx={{
width: "30px",
height: "30px",
display: "flex",
alignItems: "center",
justifyContent: "center",
flexShrink: 0,
...sx,
}}>
<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M3 3L27 27M3 27L27 3" stroke="currentColor" />
</svg>
</Box>
);
}
return (
<Box
sx={{
width: "30px",
height: "30px",
display: "flex",
alignItems: "center",
justifyContent: "center",
flexShrink: 0,
"&:hover": {
color: "#7E2AEA",
},
...sx,
}}
>
<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M3 3L27 27M3 27L27 3" stroke="currentColor" />
</svg>
</Box>
);
}

@ -1,20 +1,31 @@
import { Box } from "@mui/material";
export default function CopyIcon() {
return (
<Box sx={{
width: "24px",
height: "24px",
display: "flex",
alignItems: "center",
justifyContent: "center",
flexShrink: 0,
}}>
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M16.5357 17.4286V19.4643C16.5357 20.5886 15.6243 21.5 14.5 21.5H7.03571C5.91142 21.5 5 20.5886 5 19.4643V8.60714C5 7.48285 5.91142 6.57143 7.03571 6.57143H9.07143M16.5357 17.4286H11.1071C9.98285 17.4286 9.07143 16.5172 9.07143 15.3929V6.57143M16.5357 17.4286H17.2143C18.3386 17.4286 19.25 16.5172 19.25 15.3929V7.92857M13.8214 2.5H11.1071C9.98285 2.5 9.07143 3.41142 9.07143 4.53572V6.57143M13.8214 2.5V7.92857H19.25M13.8214 2.5L19.25 7.92857" stroke="#7E2AEA" strokeWidth="1.58333" strokeLinejoin="round" />
</svg>
</Box>
);
}
return (
<Box
sx={{
width: "24px",
height: "24px",
display: "flex",
alignItems: "center",
justifyContent: "center",
flexShrink: 0,
"&:hover path": {
stroke: "#581CA7",
},
"&:active path": {
stroke: "#FB5607",
},
}}
>
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
d="M16.5357 17.4286V19.4643C16.5357 20.5886 15.6243 21.5 14.5 21.5H7.03571C5.91142 21.5 5 20.5886 5 19.4643V8.60714C5 7.48285 5.91142 6.57143 7.03571 6.57143H9.07143M16.5357 17.4286H11.1071C9.98285 17.4286 9.07143 16.5172 9.07143 15.3929V6.57143M16.5357 17.4286H17.2143C18.3386 17.4286 19.25 16.5172 19.25 15.3929V7.92857M13.8214 2.5H11.1071C9.98285 2.5 9.07143 3.41142 9.07143 4.53572V6.57143M13.8214 2.5V7.92857H19.25M13.8214 2.5L19.25 7.92857"
stroke="#7E2AEA"
strokeWidth="1.58333"
strokeLinejoin="round"
/>
</svg>
</Box>
);
}

@ -1,73 +1,101 @@
import Box from "@mui/material/Box";
import Button from "@mui/material/Button";
import SectionStyled from "@kitUI/section";
import { useTheme } from "@mui/material/styles";
import LogoLight from "@kitUI/img/logo_pena_links_light";
import NavMenuItem from "../NavMenuItem";
import SectionStyled from "@kitUI/section";
import LogoLight from "@kitUI/img/logo_pena_links_light";
interface Props {
menuItems: { path: string; title: string; }[];
menuItems: { path: string; title: string }[];
}
export default function DesktopLandingNavbar({ menuItems }: Props) {
const themeMUI = useTheme();
const themeMUI = useTheme();
return (
<SectionStyled
tag="header"
mwidth="1200px"
sxsect={{
minHeight: "90px",
position: "absolute",
zIndex: themeMUI.zIndex.header,
background: "none",
top: 0,
borderBottom: "1px solid #434654",
}}
sxcont={{
display: "flex",
alignItems: "center",
}}
return (
<SectionStyled
tag="header"
mwidth="1200px"
sxsect={{
minHeight: "90px",
position: "absolute",
zIndex: themeMUI.zIndex.header,
background: "none",
top: 0,
borderBottom: "1px solid #434654",
}}
sxcont={{
display: "flex",
alignItems: "center",
}}
>
<LogoLight style={{ minWidth: "150px" }} textColor="white" />
<Box
sx={{
display: "flex",
gap: "14px",
ml: "42px",
overflow: "hidden",
}}
>
{menuItems.map((element) => (
<NavMenuItem mode="dark" key={element.title} to={element.path}>
{element.title}
</NavMenuItem>
))}
</Box>
<Box
sx={{
ml: "auto",
display: "flex",
gap: "20px",
}}
>
<Button
variant="outlined"
disableRipple
sx={{
color: "white",
border: "1px solid white",
textTransform: "none",
fontWeight: "400",
fontSize: "18px",
lineHeight: "24px",
borderRadius: "8px",
p: "9px 31px",
"&:hover": {
borderColor: "white",
bgColor: "#252734",
},
"&:active": {
borderColor: "#7E2AEA",
background: "#7E2AEA",
},
}}
>
<LogoLight style={{ minWidth: "150px" }} />
<Box
sx={{
display: "flex",
gap: "14px",
ml: "42px",
overflow: "hidden",
}}
>
{menuItems.map((element, index) =>
<NavMenuItem mode="dark" key={index} to={element.path}>{element.title}</NavMenuItem>
)}
</Box>
<Box sx={{
ml: "auto",
display: "flex",
gap: "20px",
}}>
<Button
variant="outlined"
sx={{
color: "white",
border: "1px solid white",
textTransform: "none",
fontWeight: "400",
fontSize: "18px",
lineHeight: "24px",
borderRadius: "8px",
p: "9px 31px",
}}
>Регистрация</Button>
<Button
variant="template"
sx={{
p: "9px 31px",
}}
>Войти</Button>
</Box>
</SectionStyled>
);
}
Регистрация
</Button>
<Button
disableRipple
variant="template"
sx={{
p: "9px 31px",
"&:hover": {
border: "1px solid #944FEE",
bgcolor: "#944FEE",
},
"&:active": {
borderColor: "#944FEE",
bgcolor: "white",
color: "#944FEE",
},
}}
>
Войти
</Button>
</Box>
</SectionStyled>
);
}

@ -1,18 +1,26 @@
import { useMediaQuery, useTheme } from "@mui/material";
import DesktopLandingNavbar from "./DesktopLandingNavbar";
import MobileLandingNavbar from "./MobileLandingNavbar";
import TabletLandingNavbar from "./TabletLandingNavbar";
const landingNavMenuItems: { path: string; title: string; }[] = [
{ path: "/links", title: "Мои ссылки" },
{ path: "/create", title: "Создание ссылки" },
{ path: "/stats", title: "Статистика" },
{ path: "/chart", title: "Пиксель" }
const landingNavMenuItems: { path: string; title: string }[] = [
{ path: "/links", title: "Мои ссылки" },
{ path: "/create", title: "Создание ссылки" },
{ path: "/stats", title: "Статистика" },
{ path: "/chart", title: "Пиксель" },
];
export default function LandingNavbar() {
const muiTheme = useTheme();
const upLg = useMediaQuery(muiTheme.breakpoints.up("lg"));
const muiTheme = useTheme();
const phablet = useMediaQuery(muiTheme.breakpoints.up(1000));
const isMobile = useMediaQuery(muiTheme.breakpoints.up(600));
return upLg ? <DesktopLandingNavbar menuItems={landingNavMenuItems} /> : <MobileLandingNavbar menuItems={landingNavMenuItems} />;
}
return phablet ? (
<DesktopLandingNavbar menuItems={landingNavMenuItems} />
) : isMobile ? (
<TabletLandingNavbar menuItems={landingNavMenuItems} />
) : (
<MobileLandingNavbar menuItems={landingNavMenuItems} />
);
}

@ -1,3 +1,4 @@
import { forwardRef, useState } from "react";
import Button from "@mui/material/Button";
import Dialog from "@mui/material/Dialog";
import AppBar from "@mui/material/AppBar";
@ -6,133 +7,142 @@ import IconButton from "@mui/material/IconButton";
import Slide from "@mui/material/Slide";
import { TransitionProps } from "@mui/material/transitions";
import Box from "@mui/material/Box";
import LogoLight from "@kitUI/img/logo_pena_links_light";
import { useTheme } from "@mui/material";
import BurgerIcon from "../../Icons/BurgerIcon";
import CloseIcon from "@root/kitUI/Icons/CloseIcon";
import { forwardRef, useState } from "react";
import NavMenuItem from "../NavMenuItem";
import LogoLight from "@kitUI/img/logo_pena_links_light";
import CloseIcon from "@root/kitUI/Icons/CloseIcon";
import BurgerIcon from "../../Icons/BurgerIcon";
const logoStyle = { minWidth: "101px", width: "101px", height: "39px" };
const Transition = forwardRef(function Transition(
props: TransitionProps & {
children: React.ReactElement;
},
ref: React.Ref<unknown>,
props: TransitionProps & {
children: React.ReactElement;
},
ref: React.Ref<unknown>
) {
return <Slide direction="up" ref={ref} {...props} />;
return <Slide direction="up" ref={ref} {...props} />;
});
interface Props {
menuItems: { path: string; title: string; }[];
menuItems: { path: string; title: string }[];
}
export default function MobileLandingNavbar({ menuItems }: Props) {
const theme = useTheme();
const [isDialogOpen, setIsDialogOpen] = useState(false);
const theme = useTheme();
const [isDialogOpen, setIsDialogOpen] = useState(false);
return (
<Box
component="nav"
sx={{
width: "100%",
height: "51px",
backgroundColor: "#2A2C3A",
display: "flex",
justifyContent: "space-between",
alignItems: "center",
zIndex: theme.zIndex.header,
px: "16px",
gap: "20px",
}}
return (
<Box
component="nav"
sx={{
width: "100%",
height: "51px",
backgroundColor: "#2A2C3A",
display: "flex",
justifyContent: "space-between",
alignItems: "center",
zIndex: theme.zIndex.header,
px: "16px",
gap: "20px",
}}
>
<LogoLight style={logoStyle} textColor="white" />
<IconButton onClick={() => setIsDialogOpen(true)} sx={{ p: 0 }}>
<BurgerIcon sx={{ color: "white" }} />
</IconButton>
<Dialog
fullScreen
open={isDialogOpen}
onClose={() => setIsDialogOpen(false)}
TransitionComponent={Transition}
PaperProps={{
sx: {
height: "100%",
display: "flex",
flexDirection: "column",
background: "#252734",
pb: "20px",
gap: "18px",
},
}}
>
<AppBar
sx={{
position: "relative",
boxShadow: "none",
borderRadius: 0,
background: "#252734",
}}
>
<LogoLight style={logoStyle} />
<IconButton onClick={() => setIsDialogOpen(true)} sx={{ p: 0 }}>
<BurgerIcon sx={{ color: "white" }} />
<Toolbar
disableGutters
sx={{
display: "flex",
justifyContent: "space-between",
px: "16px",
minHeight: "51px",
[theme.breakpoints.up("sm")]: {
minHeight: "51px",
},
}}
>
<LogoLight style={logoStyle} textColor="white" />
<IconButton onClick={() => setIsDialogOpen(false)} aria-label="close" sx={{ p: 0 }}>
<CloseIcon sx={{ color: "white" }} />
</IconButton>
<Dialog
fullScreen
open={isDialogOpen}
onClose={() => setIsDialogOpen(false)}
TransitionComponent={Transition}
PaperProps={{
sx: {
height: "100%",
display: "flex",
flexDirection: "column",
background: "#252734",
pb: "20px",
gap: "18px",
}
}}
>
<AppBar sx={{
position: "relative",
boxShadow: "none",
borderRadius: 0,
background: "#252734",
}}>
<Toolbar
disableGutters
sx={{
display: "flex",
justifyContent: "space-between",
px: "16px",
minHeight: "51px",
[theme.breakpoints.up("sm")]: {
minHeight: "51px",
},
}}
>
<LogoLight style={logoStyle} />
<IconButton
onClick={() => setIsDialogOpen(false)}
aria-label="close"
sx={{ p: 0 }}
>
<CloseIcon sx={{ color: "white" }} />
</IconButton>
</Toolbar>
</AppBar>
<Box sx={{
display: "flex",
flexDirection: "column",
alignItems: "start",
}}>
{menuItems.map((element, index) =>
<NavMenuItem key={index} mode="dark" fullWidth to={element.path}>{element.title}</NavMenuItem>
)}
</Box>
<Box sx={{
mt: "auto",
display: "flex",
justifyContent: "center",
gap: "20px",
px: "16px",
}}>
<Button
variant="template"
sx={{
p: "9px 31px",
}}
>Войти</Button>
<Button
variant="outlined"
sx={{
color: "white",
border: "1px solid white",
textTransform: "none",
fontWeight: "400",
fontSize: "18px",
lineHeight: "24px",
borderRadius: "8px",
p: "9px 31px",
}}
>Регистрация</Button>
</Box>
</Dialog >
</Box >
);
}
</Toolbar>
</AppBar>
<Box
sx={{
display: "flex",
flexDirection: "column",
alignItems: "start",
}}
>
{menuItems.map((element, index) => (
<NavMenuItem key={index} mode="dark" fullWidth to={element.path}>
{element.title}
</NavMenuItem>
))}
</Box>
<Box
sx={{
mt: "auto",
display: "flex",
justifyContent: "center",
gap: "20px",
px: "16px",
}}
>
<Button
variant="template"
sx={{
p: "9px 31px",
}}
>
Войти
</Button>
<Button
variant="outlined"
sx={{
color: "white",
border: "1px solid white",
textTransform: "none",
fontWeight: "400",
fontSize: "18px",
lineHeight: "24px",
borderRadius: "8px",
p: "9px 31px",
}}
>
Регистрация
</Button>
</Box>
</Dialog>
</Box>
);
}

@ -0,0 +1,186 @@
import { forwardRef, useState } from "react";
import { TransitionProps } from "@mui/material/transitions";
import Box from "@mui/material/Box";
import Button from "@mui/material/Button";
import { useTheme } from "@mui/material/styles";
import { AppBar, Dialog, IconButton, Slide, Toolbar } from "@mui/material";
import CloseIcon from "@root/kitUI/Icons/CloseIcon";
import BurgerIcon from "@root/kitUI/Icons/BurgerIcon";
import SectionStyled from "@kitUI/section";
import LogoLight from "@kitUI/img/logo_pena_links_light";
import NavMenuItem from "../NavMenuItem";
interface Props {
menuItems: { path: string; title: string }[];
}
const Transition = forwardRef(function Transition(
props: TransitionProps & {
children: React.ReactElement;
},
ref: React.Ref<unknown>
) {
return <Slide direction="left" ref={ref} {...props} />;
});
const logoStyle = { minWidth: "101px", width: "101px", height: "39px" };
export default function TabletLandingNavbar({ menuItems }: Props) {
const themeMUI = useTheme();
const theme = useTheme();
const [isDialogOpen, setIsDialogOpen] = useState(false);
return (
<SectionStyled
tag="header"
mwidth="1200px"
sxsect={{
minHeight: "90px",
position: "absolute",
zIndex: themeMUI.zIndex.header,
background: "none",
top: 0,
borderBottom: "1px solid #434654",
}}
sxcont={{
display: "flex",
alignItems: "center",
}}
>
<LogoLight style={{ minWidth: "150px" }} textColor="white" />
<Box
sx={{
ml: "auto",
display: "flex",
gap: "20px",
}}
>
<Button
variant="outlined"
disableRipple
sx={{
color: "white",
border: "1px solid white",
textTransform: "none",
fontWeight: "400",
fontSize: "18px",
lineHeight: "24px",
borderRadius: "8px",
p: "9px 31px",
"&:hover": {
borderColor: "#7E2AEA",
bgColor: "#7E2AEA",
},
}}
>
Регистрация
</Button>
<Button
disableRipple
variant="template"
sx={{
p: "9px 31px",
"&:hover": {
border: "1px solid white",
bgcolor: "#7E2AEA",
},
"&:active": {
borderColor: "#7E2AEA",
bgcolor: "#7E2AEA",
color: "white",
},
}}
>
Войти
</Button>
<IconButton
disableRipple
onClick={() => setIsDialogOpen(true)}
sx={{
p: 0,
}}
>
<BurgerIcon sx={{ color: "white" }} />
</IconButton>
<Dialog
fullScreen
open={isDialogOpen}
onClose={() => setIsDialogOpen(false)}
TransitionComponent={Transition}
PaperProps={{
sx: {
p: "20px",
boxShadow: "none",
ml: "auto",
width: "320px",
height: "100%",
display: "flex",
flexDirection: "column",
background: "#252734",
pb: "20px",
gap: "18px",
},
}}
>
<AppBar
sx={{
position: "relative",
boxShadow: "none",
borderRadius: 0,
background: "#252734",
}}
>
<Toolbar
disableGutters
sx={{
display: "flex",
justifyContent: "space-between",
px: "16px",
minHeight: "51px",
[theme.breakpoints.up("sm")]: {
minHeight: "51px",
},
}}
>
<IconButton
disableRipple
onClick={() => setIsDialogOpen(false)}
aria-label="close"
sx={{ p: 0, ml: "auto" }}
>
<CloseIcon sx={{ color: "white" }} />
</IconButton>
</Toolbar>
</AppBar>
<Box
sx={{
display: "flex",
justifyContent: "right",
flexDirection: "column",
alignItems: "end",
}}
>
{menuItems.map((element) => (
<NavMenuItem key={element.title} mode="dark" to={element.path}>
{element.title}
</NavMenuItem>
))}
</Box>
<Box
sx={{
mt: "auto",
ml: "auto",
display: "flex",
justifyContent: "center",
px: "16px",
}}
>
<LogoLight style={logoStyle} textColor="white" />
</Box>
</Dialog>
</Box>
</SectionStyled>
);
}

@ -1,52 +1,66 @@
import { MouseEventHandler, ReactNode } from "react";
import { Button, SxProps, Theme } from "@mui/material";
import { Link, useLocation } from "react-router-dom";
import { Button, SxProps, Theme } from "@mui/material";
interface Props {
to: string;
children: ReactNode;
mode?: "light" | "dark";
defaultColor?: string;
sx?: SxProps<Theme>;
onClick?: MouseEventHandler<HTMLButtonElement> | undefined;
fullWidth?: boolean;
to: string;
children: ReactNode;
mode?: "light" | "dark";
defaultColor?: string;
sx?: SxProps<Theme>;
onClick?: MouseEventHandler<HTMLButtonElement> | undefined;
fullWidth?: boolean;
}
export default function NavMenuItem({ children, mode = "light", to, defaultColor, sx, onClick, fullWidth = false }: Props) {
const location = useLocation();
export default function NavMenuItem({
children,
mode = "light",
to,
defaultColor,
sx,
onClick,
fullWidth = false,
}: Props) {
const location = useLocation();
const mainColor = defaultColor ?? (mode === "light" ? "black" : "white");
const color = location.pathname === to ? "#7E2AEA" : mainColor;
const mainColor = defaultColor ?? (mode === "light" ? "black" : "white");
const color = location.pathname === to ? "#7E2AEA" : mainColor;
const fullWidthSx = {
width: "100%",
py: "12px",
pl: "40px",
borderRadius: 0,
justifyContent: "start",
const fullWidthSx = {
width: "100%",
py: "12px",
pl: "40px",
borderRadius: 0,
justifyContent: "start",
"&:hover": {
backgroundColor: mode === "light" ? "#F2F3F7" : "#333647",
},
};
return (
<Button
disableRipple
{...{
to: !onClick ? to : undefined,
component: !onClick ? Link : undefined,
onClick,
}}
variant="text"
sx={{
color,
textTransform: "none",
fontSize: "16px",
lineHeight: "20px",
py: "9px",
...(fullWidth && fullWidthSx),
...sx,
"&:hover": {
backgroundColor: mode === "light" ? "#F2F3F7" : "#333647",
}
};
return (
<Button
{...{
to: !onClick ? to : undefined,
component: !onClick ? Link : undefined,
onClick,
}}
variant="text"
sx={{
color,
textTransform: "none",
fontSize: "16px",
lineHeight: "20px",
py: "9px",
...(fullWidth && fullWidthSx),
...sx,
}}
>{children}</Button>
);
}
color: "#7E2AEA",
background: "none",
},
}}
>
{children}
</Button>
);
}

@ -1,12 +1,12 @@
import { useLocation } from "react-router-dom";
import LandingNavbar from "./LandingNavbar/LandingNavbar";
import NavbarLoggedIn from "./NavbarLoggedIn/NavbarLoggedIn";
export default function Navbar() {
const location = useLocation();
const location = useLocation();
if (location.pathname === "/") return <LandingNavbar />;
if (location.pathname === "/") return <LandingNavbar />;
return <NavbarLoggedIn />;
}
return <NavbarLoggedIn />;
}

@ -1,124 +1,186 @@
import { Box, IconButton, Popover, Paper } from "@mui/material";
import PenaLogoDark from "../../img/logo_pena_links_dark";
import CustomAvatar from "./Avatar";
import LogoutIcon from "./LogoutIcon";
import { ReactNode, useEffect, useRef, useState } from "react";
import NavMenuItem from "../NavMenuItem";
import { useLocation } from "react-router-dom";
import { Box, IconButton, Popover, Paper } from "@mui/material";
import LogoutIcon from "./LogoutIcon";
import NavMenuItem from "../NavMenuItem";
import CustomAvatar from "./Avatar";
import PenaLogoDark from "../../img/logo_pena_links_dark";
export default function DesktopNavbar() {
const location = useLocation();
const [isPopperOpen, setIsPopperOpen] = useState<boolean>(false);
const navbarRef = useRef<HTMLDivElement>(null);
const location = useLocation();
const [isPopperOpen, setIsPopperOpen] = useState<boolean>(false);
const navbarRef = useRef<HTMLDivElement>(null);
const handleClick = () => {
setIsPopperOpen(prev => !prev);
};
const handleClick = () => {
setIsPopperOpen((prev) => !prev);
};
const handleClose = () => {
setIsPopperOpen(false);
};
const handleClose = () => {
setIsPopperOpen(false);
};
async function handleLogoutClick() {
async function handleLogoutClick() {}
}
useEffect(
function closePopperOnLocationChange() {
setIsPopperOpen(false);
},
[location.pathname]
);
useEffect(function closePopperOnLocationChange() {
setIsPopperOpen(false);
}, [location.pathname]);
return (
<Box
ref={navbarRef}
component="nav"
sx={{
px: "16px",
display: "flex",
height: "80px",
alignItems: "center",
bgcolor: "white",
borderBottom: "1px solid #E3E3E3",
}}
return (
<Box
ref={navbarRef}
component="nav"
sx={{
px: "16px",
display: "flex",
height: "80px",
alignItems: "center",
bgcolor: "white",
borderBottom: "1px solid #E3E3E3",
}}
>
<PenaLogoDark style={{ minWidth: "124px" }} />
<Box
sx={{
ml: "52px",
display: "flex",
gap: "14px",
overflow: "hidden",
}}
>
<NavMenuItem to="/links">Мои ссылки</NavMenuItem>
<NavMenuItem to="/create" onClick={handleClick}>
Создание ссылки
</NavMenuItem>
<NavMenuItem to="/">Кастомизация ссылки</NavMenuItem>
<NavMenuItem to="/stats">Статистика</NavMenuItem>
<NavMenuItem to="/chart">Пиксель</NavMenuItem>
</Box>
<Box
sx={{
display: "flex",
ml: "auto",
}}
>
<CustomAvatar
sx={{
ml: "27px",
backgroundColor: "#FB5607",
height: "36px",
width: "36px",
"&:hover": {
border: " 2px solid #9A9AAF",
},
"&:active": {
border: "2px solid black",
},
"&:active .buttonPress": {
bgcolor: "#7E2AEA",
fill: "#7E2AEA",
},
}}
/>
<IconButton
disableRipple
onClick={handleLogoutClick}
sx={{
ml: "20px",
bgcolor: "#F2F3F7",
borderRadius: "6px",
height: "36px",
width: "36px",
"&:hover": {
bgcolor: "#9A9AAF",
},
"&:hover path": {
stroke: "white",
},
"&:active": {
bgcolor: "#7E2AEA",
},
}}
>
<PenaLogoDark style={{ minWidth: "124px" }} />
<Box sx={{
ml: "52px",
display: "flex",
gap: "14px",
overflow: "hidden",
}}>
<NavMenuItem to="/links">Мои ссылки</NavMenuItem>
<NavMenuItem to="/create" onClick={handleClick}>Создание ссылки</NavMenuItem>
<NavMenuItem to="/">Кастомизация ссылки</NavMenuItem>
<NavMenuItem to="/stats">Статистика</NavMenuItem>
<NavMenuItem to="/chart">Пиксель</NavMenuItem>
</Box>
<Box
sx={{
display: "flex",
ml: "auto",
}}
>
<CustomAvatar sx={{ ml: "27px", backgroundColor: "#FB5607", height: "36px", width: "36px" }} />
<IconButton
onClick={handleLogoutClick}
sx={{ ml: "20px", bgcolor: "#F2F3F7", borderRadius: "6px", height: "36px", width: "36px" }}
>
<LogoutIcon />
</IconButton>
</Box>
<Popover
id="nav-popover"
open={isPopperOpen}
anchorEl={isPopperOpen ? navbarRef.current : null}
onClose={handleClose}
anchorOrigin={{
vertical: "bottom",
horizontal: "center",
}}
marginThreshold={0}
sx={{
"& .MuiPopover-paper": {
width: "100vw",
maxWidth: "100vw",
borderRadius: 0,
}
}}
>
<Paper sx={{
borderRadius: 0,
display: "flex",
flexDirection: "column",
}}>
<MenuSubItem to="/create">Создание ссылки</MenuSubItem>
<MenuSubItem to="/buy">Покупка и настройка custom ссылки</MenuSubItem>
<MenuSubItem to="/">A/B тесты</MenuSubItem>
</Paper>
</Popover>
</Box>
);
<LogoutIcon />
</IconButton>
</Box>
<Popover
id="nav-popover"
open={isPopperOpen}
anchorEl={isPopperOpen ? navbarRef.current : null}
onClose={handleClose}
anchorOrigin={{
vertical: "bottom",
horizontal: "center",
}}
marginThreshold={0}
sx={{
"& .MuiPopover-paper": {
width: "100vw",
maxWidth: "100vw",
borderRadius: 0,
},
}}
>
<Paper
sx={{
borderRadius: 0,
display: "flex",
flexDirection: "column",
}}
>
<Box
sx={{
"&:hover": {
backgroundColor: "#F2F3F7",
},
}}
>
<MenuSubItem to="/create">Создание ссылки</MenuSubItem>
</Box>
<Box
sx={{
"&:hover": {
backgroundColor: "#F2F3F7",
},
}}
>
<MenuSubItem to="/buy">Покупка и настройка custom ссылки</MenuSubItem>
</Box>
<Box
sx={{
"&:hover": {
backgroundColor: "#F2F3F7",
},
}}
>
<MenuSubItem to="/">A/B тесты</MenuSubItem>
</Box>
</Paper>
</Popover>
</Box>
);
}
function MenuSubItem({ children, to }: {
to: string;
children: ReactNode;
}) {
return (
<NavMenuItem
to={to}
defaultColor="#4D4D4D"
sx={{
fontWeight: 400,
py: "15px",
pl: "200px",
justifyContent: "start",
"&:hover": {
backgroundColor: "#F2F3F7",
}
}}
>{children}</NavMenuItem>
);
}
function MenuSubItem({ children, to }: { to: string; children: ReactNode }) {
return (
<NavMenuItem
to={to}
defaultColor="#4D4D4D"
sx={{
fontWeight: 400,
py: "15px",
pl: "200px",
justifyContent: "start",
"&:hover": {
backgroundColor: "#F2F3F7",
},
}}
>
{children}
</NavMenuItem>
);
}

@ -1,12 +1,19 @@
export default function LogoutIcon() {
return (
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12.5601 12.3V15.25C12.5601 16.3546 11.6646 17.25 10.5601 17.25H3.69596C2.59139 17.25 1.69596 16.3546 1.69596 15.25V2.75C1.69596 1.64543 2.59139 0.75 3.69596 0.75H10.5601C11.6646 0.75 12.5601 1.64543 12.5601 2.75V5.7" stroke="#9A9AAF" strokeWidth="1.5" strokeLinecap="round" />
<path d="M15.067 11.475L16.8532 9.71165C17.2498 9.32011 17.2498 8.6799 16.8532 8.28836L15.067 6.52501" stroke="#9A9AAF" strokeWidth="1.5" strokeLinecap="round" />
<path d="M16.7384 9L6.70996 9" stroke="#9A9AAF" strokeWidth="1.5" strokeLinecap="round" />
</svg>
);
}
return (
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
d="M12.5601 12.3V15.25C12.5601 16.3546 11.6646 17.25 10.5601 17.25H3.69596C2.59139 17.25 1.69596 16.3546 1.69596 15.25V2.75C1.69596 1.64543 2.59139 0.75 3.69596 0.75H10.5601C11.6646 0.75 12.5601 1.64543 12.5601 2.75V5.7"
stroke="#9A9AAF"
strokeWidth="1.5"
strokeLinecap="round"
/>
<path
d="M15.067 11.475L16.8532 9.71165C17.2498 9.32011 17.2498 8.6799 16.8532 8.28836L15.067 6.52501"
stroke="#9A9AAF"
strokeWidth="1.5"
strokeLinecap="round"
/>
<path d="M16.7384 9L6.70996 9" stroke="#9A9AAF" strokeWidth="1.5" strokeLinecap="round" />
</svg>
);
}

@ -1,13 +1,16 @@
import { useLocation } from "react-router-dom";
import { useTheme, useMediaQuery } from "@mui/material";
import DesktopNavbar from "./DesktopNavbar";
import MobileNavbar from "./MobileNavbar";
import { useLocation } from "react-router-dom";
import TabletNavbar from "./TabletNavbar";
export default function NavbarLoggedIn() {
const muiTheme = useTheme();
const location = useLocation();
const upLg = useMediaQuery(muiTheme.breakpoints.up("lg"));
const muiTheme = useTheme();
const location = useLocation();
return upLg ? <DesktopNavbar /> : <MobileNavbar key={location.pathname} />;
}
const phablet = useMediaQuery(muiTheme.breakpoints.up(1000));
const isMobile = useMediaQuery(muiTheme.breakpoints.up(600));
return phablet ? <DesktopNavbar /> : isMobile ? <TabletNavbar /> : <MobileNavbar key={location.pathname} />;
}

@ -0,0 +1,234 @@
import { ReactNode, forwardRef, useEffect, useRef, useState } from "react";
import { useLocation, Link } from "react-router-dom";
import { Box, IconButton, AppBar, Toolbar, useTheme, Slide, Dialog } from "@mui/material";
import { TransitionProps } from "@mui/material/transitions";
import CloseIcon from "@root/kitUI/Icons/CloseIcon";
import LogoLight from "@kitUI/img/logo_pena_links_light";
import BurgerIcon from "@root/kitUI/Icons/BurgerIcon";
import LogoutIcon from "./LogoutIcon";
import NavMenuItem from "../NavMenuItem";
import CustomAvatar from "./Avatar";
import PenaLogoDark from "../../img/logo_pena_links_dark";
const Transition = forwardRef(function Transition(
props: TransitionProps & {
children: React.ReactElement;
},
ref: React.Ref<unknown>
) {
return <Slide direction="left" ref={ref} {...props} />;
});
const logoStyle = { minWidth: "101px", width: "101px", height: "39px" };
export default function TabletNavbar() {
const theme = useTheme();
const [isDialogOpen, setIsDialogOpen] = useState(false);
const location = useLocation();
const [isPopperOpen, setIsPopperOpen] = useState<boolean>(false);
const navbarRef = useRef<HTMLDivElement>(null);
const handleClick = () => {
setIsPopperOpen((prev) => !prev);
};
const handleClose = () => {
setIsPopperOpen(false);
};
const dialogClose = () => {
setIsDialogOpen(false);
setIsPopperOpen(false);
};
async function handleLogoutClick() {}
useEffect(
function closePopperOnLocationChange() {
setIsPopperOpen(false);
handleClose();
},
[location.pathname]
);
return (
<Box
ref={navbarRef}
component="nav"
sx={{
px: "16px",
display: "flex",
height: "80px",
alignItems: "center",
bgcolor: "white",
borderBottom: "1px solid #E3E3E3",
}}
>
<PenaLogoDark style={{ minWidth: "124px" }} />
<Box
sx={{
display: "flex",
ml: "auto",
}}
>
<CustomAvatar
sx={{
ml: "27px",
backgroundColor: "#FB5607",
height: "36px",
width: "36px",
"&:hover": {
border: " 2px solid #9A9AAF",
},
"&:active": {
border: "2px solid black",
},
"&:active .buttonPress": {
bgcolor: "#7E2AEA",
fill: "#7E2AEA",
},
}}
/>
<IconButton
disableRipple
onClick={handleLogoutClick}
sx={{
ml: "20px",
bgcolor: "#F2F3F7",
borderRadius: "6px",
height: "36px",
width: "36px",
"&:hover": {
bgcolor: "#9A9AAF",
},
"&:hover path": {
stroke: "white",
},
"&:active": {
bgcolor: "#7E2AEA",
},
}}
>
<LogoutIcon />
</IconButton>
</Box>
<IconButton onClick={() => setIsDialogOpen(true)} sx={{ p: 0, ml: "40px" }}>
<BurgerIcon sx={{ color: "black" }} />
</IconButton>
<Dialog
fullScreen
open={isDialogOpen}
onClose={dialogClose}
TransitionComponent={Transition}
PaperProps={{
sx: {
border: "1px solid white",
p: "20px",
boxShadow: "none",
ml: "auto",
width: "390px",
height: "100%",
display: "flex",
flexDirection: "column",
backgroundColor: "white",
borderColor: "white",
pb: "20px",
gap: "18px",
overflow: "hidden",
},
}}
>
<AppBar
sx={{
position: "relative",
background: "none",
boxShadow: "none",
borderRadius: 0,
}}
>
<Toolbar
disableGutters
sx={{
display: "flex",
justifyContent: "space-between",
bgcolor: "white",
px: "16px",
minHeight: "51px",
[theme.breakpoints.up("sm")]: {
minHeight: "51px",
},
}}
>
<IconButton
disableRipple
onClick={() => setIsDialogOpen(false)}
aria-label="close"
sx={{ p: 0, ml: "auto" }}
>
<CloseIcon sx={{ color: "black" }} />
</IconButton>
</Toolbar>
</AppBar>
<Box
sx={{
display: "flex",
justifyContent: "right",
flexDirection: "column",
alignItems: "start",
}}
>
<NavMenuItem to="/links">Мои ссылки</NavMenuItem>
<Box sx={{ boxSizing: "border-box", ml: "-20px", width: "110%", bgcolor: isPopperOpen ? "#F2F3F7" : "none" }}>
<NavMenuItem sx={{ pl: "28px" }} to="/create" onClick={handleClick}>
Создание ссылки
</NavMenuItem>
</Box>
{isPopperOpen && (
<Box sx={{ width: "100%", display: "flex", flexDirection: "column", gap: "25px", ml: "40px", mt: "12px" }}>
<MenuSubItem to="/create">Создание ссылки</MenuSubItem>
<MenuSubItem to="/buy">Покупка и настройка custom ссылки</MenuSubItem>
<MenuSubItem to="/">A/B тесты</MenuSubItem>
</Box>
)}
<NavMenuItem to="/">Кастомизация ссылки</NavMenuItem>
<NavMenuItem to="/stats">Статистика</NavMenuItem>
<NavMenuItem to="/chart">Пиксель</NavMenuItem>
</Box>
<Box
sx={{
mt: "auto",
ml: "auto",
display: "flex",
justifyContent: "center",
px: "16px",
}}
>
<LogoLight style={logoStyle} />
</Box>
</Dialog>
</Box>
);
}
function MenuSubItem({ children, to }: { to: string; children: ReactNode }) {
return (
<Box
sx={{
"&:hover .link": {
color: "#7E2AEA",
},
}}
>
<Link className="link" to={to} style={{ color: "#4D4D4D", textDecoration: "none" }}>
{children}
</Link>
</Box>
);
}

@ -1,71 +1,92 @@
import Box from "@mui/material/Box";
import Logotip from '@kitUI/img/logo_pena_links_light';
import SectionStyled from './section';
import Logotip from "@kitUI/img/logo_pena_links_light";
import SectionStyled from "./section";
import { useTheme } from "@mui/material/styles";
import { Typography, useMediaQuery } from '@mui/material';
import { Typography, useMediaQuery } from "@mui/material";
import NavMenuItem from "./Navbars/NavMenuItem";
export default function Footer() {
const theme = useTheme();
const upMd = useMediaQuery(theme.breakpoints.up("md"));
const theme = useTheme();
const upMd = useMediaQuery(theme.breakpoints.up("md"));
return (
<SectionStyled tag={'footer'} bg={'#252734'} mwidth={'1200px'}
sxsect={{
justifyContent: 'space-around',
position: "relative",
zIndex: theme.zIndex.content,
py: upMd ? "70px" : "40px",
return (
<SectionStyled
tag={"footer"}
bg={"#252734"}
mwidth={"1200px"}
sxsect={{
justifyContent: "space-around",
position: "relative",
zIndex: theme.zIndex.content,
py: upMd ? "70px" : "40px",
}}
sxcont={{
display: "flex",
alignItems: "start",
flexDirection: "column",
boxSizing: "border-box",
[theme.breakpoints.down("md")]: {
padding: "0 18px",
},
}}
>
<Box
sx={{
display: "flex",
flexDirection: upMd ? "row" : "column",
alignItems: "start",
width: "100%",
maxWidth: "702px",
justifyContent: "space-between",
columnGap: "30px",
rowGap: "36px",
}}
>
<Box
sx={{
display: "flex",
flexDirection: "column",
gap: "10px",
}}
>
<Logotip style={{ minWidth: "124px", width: "124px", height: "48px" }} textColor="white" />
<Typography
sx={{
color: "#727074",
fontSize: "14px",
lineHeight: "20px",
}}
sxcont={{
display: 'flex',
alignItems: 'start',
flexDirection: 'column',
boxSizing: 'border-box',
[theme.breakpoints.down('md')]: {
padding: '0 18px',
},
}}>
<Box sx={{
display: 'flex',
flexDirection: upMd ? "row" : "column",
alignItems: 'start',
width: "100%",
maxWidth: "702px",
justifyContent: "space-between",
columnGap: "30px",
rowGap: "36px",
}}>
<Box sx={{
display: "flex",
flexDirection: "column",
gap: "10px",
}}>
<Logotip style={{ minWidth: "124px", width: "124px", height: "48px" }} />
<Typography sx={{
color: "#727074",
fontSize: "14px",
lineHeight: "20px",
}}>(c) 2023 Examplelink.com</Typography>
</Box>
<Box sx={{
display: 'flex',
flexDirection: upMd ? "column" : "column",
alignItems: "start",
flexWrap: "wrap",
maxHeight: upMd ? "145px" : undefined,
maxWidth: "450px",
flexGrow: 1,
ml: "-8px",
mt: "-6px",
}}>
<NavMenuItem mode="dark" to="/links">Мои ссылки</NavMenuItem>
<NavMenuItem mode="dark" to="/create">Создание ссылки</NavMenuItem>
<NavMenuItem mode="dark" to="/stats">Статистика</NavMenuItem>
<NavMenuItem mode="dark" to="/chart">Пиксель</NavMenuItem>
</Box>
</Box>
</SectionStyled>
);
}
>
(c) 2023 Examplelink.com
</Typography>
</Box>
<Box
sx={{
display: "flex",
flexDirection: upMd ? "column" : "column",
alignItems: "start",
flexWrap: "wrap",
maxHeight: upMd ? "145px" : undefined,
maxWidth: "450px",
flexGrow: 1,
ml: "-8px",
mt: "-6px",
}}
>
<NavMenuItem mode="dark" to="/links">
Мои ссылки
</NavMenuItem>
<NavMenuItem mode="dark" to="/create">
Создание ссылки
</NavMenuItem>
<NavMenuItem mode="dark" to="/stats">
Статистика
</NavMenuItem>
<NavMenuItem mode="dark" to="/chart">
Пиксель
</NavMenuItem>
</Box>
</Box>
</SectionStyled>
);
}

@ -1,30 +1,49 @@
import { CSSProperties } from "react";
interface Props {
style?: CSSProperties;
blobColor?: string;
style?: CSSProperties;
blobColor?: string;
textColor?: string;
}
export default function PenaLogoLight({ style, blobColor = "#7E2AEA" }: Props) {
return (
<svg width="150" height="58" viewBox="0 0 150 58" fill="none" xmlns="http://www.w3.org/2000/svg" style={style}>
<g clipPath="url(#clip0_522_519)">
<path fillRule="evenodd" clipRule="evenodd" d="M21.6318 2.77152C15.522 2.06379 11.3068 8.62681 7.38602 13.3709C3.94519 17.5343 1.38319 22.2369 1.08561 27.6324C0.769009 33.3726 1.81028 39.3507 5.72092 43.5607C9.74908 47.8972 15.7831 50.6373 21.6318 49.7514C26.9949 48.9391 29.368 43.0496 33.3608 39.3743C37.6963 35.3835 45.7735 33.5274 45.6615 27.6324C45.5493 21.7283 37.0246 20.5726 32.9228 16.329C28.6741 11.9333 27.7012 3.47456 21.6318 2.77152Z" fill={blobColor} />
<ellipse cx="36.8326" cy="47.51" rx="3.37135" ry="3.37135" fill={blobColor} />
<circle cx="33.4603" cy="10.0988" r="1.28432" fill={blobColor} />
<path d="M54.0021 26.2513C53.6276 22.6105 51.9148 19.2385 49.1956 16.7888C46.4764 14.339 42.9445 12.9861 39.2846 12.9922C38.765 12.9924 38.2457 13.0196 37.7289 13.0736C34.0898 13.4558 30.7211 15.1718 28.2725 17.8909C25.8239 20.61 24.4689 24.1395 24.4688 27.7985V27.7985V48.9505H30.8143V39.9609C33.2953 41.6869 36.2464 42.6098 39.2687 42.6049C39.7884 42.6047 40.3077 42.5775 40.8245 42.5235C42.7582 42.3202 44.6331 41.7381 46.3419 40.8103C48.0507 39.8825 49.56 38.6272 50.7837 37.1161C52.0073 35.605 52.9214 33.8676 53.4736 32.0033C54.0258 30.1389 54.2054 28.184 54.0021 26.2502V26.2513ZM45.8523 33.1257C45.1552 33.9915 44.2933 34.7105 43.3164 35.241C42.3396 35.7715 41.2672 36.1028 40.1614 36.216C39.8648 36.2467 39.5669 36.2623 39.2687 36.2625C37.3497 36.2607 35.4882 35.6066 33.9899 34.4075C32.4916 33.2084 31.4454 31.5355 31.0232 29.6635C30.6009 27.7914 30.8276 25.8315 31.666 24.1052C32.5044 22.379 33.9048 20.9891 35.6373 20.1636C37.3697 19.3382 39.3313 19.1262 41.2002 19.5625C43.069 19.9988 44.7339 21.0575 45.9218 22.5648C47.1096 24.0721 47.7498 25.9384 47.7371 27.8574C47.7245 29.7764 47.0599 31.6342 45.8523 33.1257Z" fill="white" />
<path d="M70.5601 12.9922C70.0405 12.9924 69.5212 13.0196 69.0044 13.0736C65.2337 13.4707 61.7591 15.2992 59.2966 18.1823C56.8341 21.0653 55.5715 24.7831 55.7689 28.5695C55.9663 32.3559 57.6088 35.9223 60.3578 38.5336C63.1068 41.1449 66.7528 42.6021 70.5443 42.6049C71.0639 42.6047 71.5832 42.5775 72.1 42.5234C74.8187 42.234 77.4048 41.1998 79.5733 39.5347C81.7419 37.8696 83.4087 35.6383 84.3903 33.0865H77.1574L77.1278 33.1235C76.2014 34.2687 74.992 35.1521 73.6193 35.6865C72.2466 36.2208 70.7583 36.3875 69.3014 36.1701C67.8445 35.9527 66.4697 35.3587 65.3128 34.4469C64.1559 33.5351 63.2572 32.3371 62.7054 30.9713H85.0207C85.4905 28.8095 85.4707 26.57 84.9628 24.4168C84.4548 22.2637 83.4716 20.2514 82.0851 18.5276C80.6986 16.8037 78.944 15.4119 76.9498 14.4541C74.9556 13.4963 72.7724 12.9968 70.5601 12.9922V12.9922ZM62.7054 24.6257C63.283 23.2039 64.2357 21.9654 65.4617 21.0424C66.6878 20.1193 68.1414 19.5463 69.6675 19.3843C69.9641 19.3535 70.262 19.338 70.5601 19.3378C72.2456 19.3349 73.8932 19.8372 75.2904 20.7798C76.6877 21.7223 77.7704 23.0619 78.399 24.6257H62.7054Z" fill="white" />
<path d="M100.694 12.9922C98.2684 12.9884 95.8892 13.6552 93.8193 14.9191V12.9922H87.4737V42.6049H93.8193V26.2122C93.8193 24.389 94.5436 22.6404 95.8328 21.3512C97.122 20.062 98.8705 19.3378 100.694 19.3378C102.517 19.3378 104.265 20.062 105.555 21.3512C106.844 22.6404 107.568 24.389 107.568 26.2122V42.6049H113.914V26.2122C113.914 22.706 112.521 19.3435 110.042 16.8642C107.562 14.385 104.2 12.9922 100.694 12.9922Z" fill="white" />
<path d="M145.646 29.6906V12.9922H139.301V15.6362C136.82 13.9094 133.869 12.9865 130.846 12.9922C130.327 12.9924 129.807 13.0196 129.291 13.0736C125.52 13.4708 122.045 15.2993 119.583 18.1823C117.12 21.0653 115.858 24.7832 116.055 28.5696C116.253 32.356 117.895 35.9223 120.644 38.5336C123.393 41.1449 127.039 42.6021 130.83 42.6049C131.35 42.6047 131.869 42.5775 132.386 42.5235C136.074 42.146 139.483 40.3891 141.931 37.6046C143.833 40.1489 146.587 41.9238 149.69 42.6049V35.9526C148.485 35.4073 147.464 34.5268 146.747 33.4163C146.03 32.3058 145.648 31.0124 145.646 29.6906ZM137.414 33.1236C136.717 33.9893 135.855 34.7081 134.878 35.2386C133.901 35.769 132.829 36.1005 131.723 36.2138C131.427 36.2446 131.129 36.2602 130.83 36.2604C128.663 36.2603 126.577 35.428 125.005 33.9352C123.433 32.4424 122.494 30.4031 122.381 28.238C122.269 26.073 122.992 23.9474 124.401 22.2999C125.811 20.6525 127.798 19.6088 129.955 19.3843C130.251 19.3535 130.549 19.338 130.846 19.3378C132.444 19.3391 134.008 19.7927 135.359 20.646C136.709 21.4993 137.79 22.7175 138.477 24.1596C139.164 25.6018 139.429 27.2089 139.241 28.7952C139.053 30.3816 138.419 31.8822 137.414 33.1236Z" fill="white" />
<path d="M115.15 55.5195V45.9186H116.991V55.5195H115.15ZM118.883 47.6213V45.9186H120.723V47.6213H118.883ZM118.883 55.5195V48.5644H120.723V55.5195H118.883ZM128.943 55.5195H127.102V51.9699C127.102 51.219 127.063 50.7343 126.984 50.516C126.906 50.2934 126.777 50.1209 126.598 49.9987C126.423 49.8764 126.212 49.8153 125.963 49.8153C125.644 49.8153 125.358 49.9026 125.105 50.0773C124.852 50.2519 124.677 50.4833 124.581 50.7715C124.489 51.0596 124.443 51.5923 124.443 52.3694V55.5195H122.603V48.5644H124.312V49.5861C124.919 48.8002 125.683 48.4072 126.605 48.4072C127.011 48.4072 127.382 48.4815 127.718 48.6299C128.054 48.774 128.307 48.9595 128.478 49.1866C128.652 49.4136 128.772 49.6712 128.838 49.9594C128.908 50.2475 128.943 50.6601 128.943 51.1971V55.5195ZM130.75 55.5195V45.9186H132.59V51.0138L134.745 48.5644H137.011L134.634 51.1055L137.181 55.5195H135.197L133.448 52.3956L132.59 53.2928V55.5195H130.75ZM137.633 53.5352L139.48 53.2536C139.559 53.6116 139.718 53.8844 139.958 54.0722C140.198 54.2556 140.534 54.3472 140.967 54.3472C141.443 54.3472 141.801 54.2599 142.041 54.0853C142.202 53.963 142.283 53.7993 142.283 53.5941C142.283 53.4544 142.239 53.3387 142.152 53.247C142.06 53.1597 141.855 53.0789 141.536 53.0047C140.052 52.6772 139.111 52.3782 138.714 52.1075C138.164 51.732 137.889 51.2102 137.889 50.5422C137.889 49.9397 138.127 49.4333 138.602 49.0229C139.078 48.6124 139.816 48.4072 140.816 48.4072C141.768 48.4072 142.475 48.5622 142.938 48.8722C143.401 49.1822 143.719 49.6406 143.894 50.2475L142.159 50.5684C142.084 50.2977 141.942 50.0903 141.733 49.9463C141.528 49.8022 141.233 49.7302 140.849 49.7302C140.364 49.7302 140.017 49.7978 139.807 49.9332C139.668 50.0292 139.598 50.1537 139.598 50.3065C139.598 50.4375 139.659 50.5488 139.781 50.6405C139.947 50.7627 140.519 50.9352 141.497 51.1578C142.479 51.3805 143.165 51.6534 143.554 51.9765C143.938 52.3039 144.13 52.7602 144.13 53.3452C144.13 53.9827 143.864 54.5306 143.331 54.9891C142.798 55.4475 142.01 55.6767 140.967 55.6767C140.019 55.6767 139.268 55.4846 138.714 55.1004C138.164 54.7162 137.803 54.1944 137.633 53.5352Z" fill="white" />
</g>
<defs>
<clipPath id="clip0_522_519">
<rect width="149.833" height="58" fill="white" />
</clipPath>
</defs>
</svg>
);
}
export default function PenaLogoLight({ style, blobColor = "#7E2AEA", textColor = "black" }: Props) {
return (
<svg width="150" height="58" viewBox="0 0 150 58" fill="none" xmlns="http://www.w3.org/2000/svg" style={style}>
<g clipPath="url(#clip0_522_519)">
<path
fillRule="evenodd"
clipRule="evenodd"
d="M21.6318 2.77152C15.522 2.06379 11.3068 8.62681 7.38602 13.3709C3.94519 17.5343 1.38319 22.2369 1.08561 27.6324C0.769009 33.3726 1.81028 39.3507 5.72092 43.5607C9.74908 47.8972 15.7831 50.6373 21.6318 49.7514C26.9949 48.9391 29.368 43.0496 33.3608 39.3743C37.6963 35.3835 45.7735 33.5274 45.6615 27.6324C45.5493 21.7283 37.0246 20.5726 32.9228 16.329C28.6741 11.9333 27.7012 3.47456 21.6318 2.77152Z"
fill={blobColor}
/>
<ellipse cx="36.8326" cy="47.51" rx="3.37135" ry="3.37135" fill={blobColor} />
<circle cx="33.4603" cy="10.0988" r="1.28432" fill={blobColor} />
<path
d="M54.0021 26.2513C53.6276 22.6105 51.9148 19.2385 49.1956 16.7888C46.4764 14.339 42.9445 12.9861 39.2846 12.9922C38.765 12.9924 38.2457 13.0196 37.7289 13.0736C34.0898 13.4558 30.7211 15.1718 28.2725 17.8909C25.8239 20.61 24.4689 24.1395 24.4688 27.7985V27.7985V48.9505H30.8143V39.9609C33.2953 41.6869 36.2464 42.6098 39.2687 42.6049C39.7884 42.6047 40.3077 42.5775 40.8245 42.5235C42.7582 42.3202 44.6331 41.7381 46.3419 40.8103C48.0507 39.8825 49.56 38.6272 50.7837 37.1161C52.0073 35.605 52.9214 33.8676 53.4736 32.0033C54.0258 30.1389 54.2054 28.184 54.0021 26.2502V26.2513ZM45.8523 33.1257C45.1552 33.9915 44.2933 34.7105 43.3164 35.241C42.3396 35.7715 41.2672 36.1028 40.1614 36.216C39.8648 36.2467 39.5669 36.2623 39.2687 36.2625C37.3497 36.2607 35.4882 35.6066 33.9899 34.4075C32.4916 33.2084 31.4454 31.5355 31.0232 29.6635C30.6009 27.7914 30.8276 25.8315 31.666 24.1052C32.5044 22.379 33.9048 20.9891 35.6373 20.1636C37.3697 19.3382 39.3313 19.1262 41.2002 19.5625C43.069 19.9988 44.7339 21.0575 45.9218 22.5648C47.1096 24.0721 47.7498 25.9384 47.7371 27.8574C47.7245 29.7764 47.0599 31.6342 45.8523 33.1257Z"
fill={textColor}
/>
<path
d="M70.5601 12.9922C70.0405 12.9924 69.5212 13.0196 69.0044 13.0736C65.2337 13.4707 61.7591 15.2992 59.2966 18.1823C56.8341 21.0653 55.5715 24.7831 55.7689 28.5695C55.9663 32.3559 57.6088 35.9223 60.3578 38.5336C63.1068 41.1449 66.7528 42.6021 70.5443 42.6049C71.0639 42.6047 71.5832 42.5775 72.1 42.5234C74.8187 42.234 77.4048 41.1998 79.5733 39.5347C81.7419 37.8696 83.4087 35.6383 84.3903 33.0865H77.1574L77.1278 33.1235C76.2014 34.2687 74.992 35.1521 73.6193 35.6865C72.2466 36.2208 70.7583 36.3875 69.3014 36.1701C67.8445 35.9527 66.4697 35.3587 65.3128 34.4469C64.1559 33.5351 63.2572 32.3371 62.7054 30.9713H85.0207C85.4905 28.8095 85.4707 26.57 84.9628 24.4168C84.4548 22.2637 83.4716 20.2514 82.0851 18.5276C80.6986 16.8037 78.944 15.4119 76.9498 14.4541C74.9556 13.4963 72.7724 12.9968 70.5601 12.9922V12.9922ZM62.7054 24.6257C63.283 23.2039 64.2357 21.9654 65.4617 21.0424C66.6878 20.1193 68.1414 19.5463 69.6675 19.3843C69.9641 19.3535 70.262 19.338 70.5601 19.3378C72.2456 19.3349 73.8932 19.8372 75.2904 20.7798C76.6877 21.7223 77.7704 23.0619 78.399 24.6257H62.7054Z"
fill={textColor}
/>
<path
d="M100.694 12.9922C98.2684 12.9884 95.8892 13.6552 93.8193 14.9191V12.9922H87.4737V42.6049H93.8193V26.2122C93.8193 24.389 94.5436 22.6404 95.8328 21.3512C97.122 20.062 98.8705 19.3378 100.694 19.3378C102.517 19.3378 104.265 20.062 105.555 21.3512C106.844 22.6404 107.568 24.389 107.568 26.2122V42.6049H113.914V26.2122C113.914 22.706 112.521 19.3435 110.042 16.8642C107.562 14.385 104.2 12.9922 100.694 12.9922Z"
fill={textColor}
/>
<path
d="M145.646 29.6906V12.9922H139.301V15.6362C136.82 13.9094 133.869 12.9865 130.846 12.9922C130.327 12.9924 129.807 13.0196 129.291 13.0736C125.52 13.4708 122.045 15.2993 119.583 18.1823C117.12 21.0653 115.858 24.7832 116.055 28.5696C116.253 32.356 117.895 35.9223 120.644 38.5336C123.393 41.1449 127.039 42.6021 130.83 42.6049C131.35 42.6047 131.869 42.5775 132.386 42.5235C136.074 42.146 139.483 40.3891 141.931 37.6046C143.833 40.1489 146.587 41.9238 149.69 42.6049V35.9526C148.485 35.4073 147.464 34.5268 146.747 33.4163C146.03 32.3058 145.648 31.0124 145.646 29.6906ZM137.414 33.1236C136.717 33.9893 135.855 34.7081 134.878 35.2386C133.901 35.769 132.829 36.1005 131.723 36.2138C131.427 36.2446 131.129 36.2602 130.83 36.2604C128.663 36.2603 126.577 35.428 125.005 33.9352C123.433 32.4424 122.494 30.4031 122.381 28.238C122.269 26.073 122.992 23.9474 124.401 22.2999C125.811 20.6525 127.798 19.6088 129.955 19.3843C130.251 19.3535 130.549 19.338 130.846 19.3378C132.444 19.3391 134.008 19.7927 135.359 20.646C136.709 21.4993 137.79 22.7175 138.477 24.1596C139.164 25.6018 139.429 27.2089 139.241 28.7952C139.053 30.3816 138.419 31.8822 137.414 33.1236Z"
fill={textColor}
/>
<path
d="M115.15 55.5195V45.9186H116.991V55.5195H115.15ZM118.883 47.6213V45.9186H120.723V47.6213H118.883ZM118.883 55.5195V48.5644H120.723V55.5195H118.883ZM128.943 55.5195H127.102V51.9699C127.102 51.219 127.063 50.7343 126.984 50.516C126.906 50.2934 126.777 50.1209 126.598 49.9987C126.423 49.8764 126.212 49.8153 125.963 49.8153C125.644 49.8153 125.358 49.9026 125.105 50.0773C124.852 50.2519 124.677 50.4833 124.581 50.7715C124.489 51.0596 124.443 51.5923 124.443 52.3694V55.5195H122.603V48.5644H124.312V49.5861C124.919 48.8002 125.683 48.4072 126.605 48.4072C127.011 48.4072 127.382 48.4815 127.718 48.6299C128.054 48.774 128.307 48.9595 128.478 49.1866C128.652 49.4136 128.772 49.6712 128.838 49.9594C128.908 50.2475 128.943 50.6601 128.943 51.1971V55.5195ZM130.75 55.5195V45.9186H132.59V51.0138L134.745 48.5644H137.011L134.634 51.1055L137.181 55.5195H135.197L133.448 52.3956L132.59 53.2928V55.5195H130.75ZM137.633 53.5352L139.48 53.2536C139.559 53.6116 139.718 53.8844 139.958 54.0722C140.198 54.2556 140.534 54.3472 140.967 54.3472C141.443 54.3472 141.801 54.2599 142.041 54.0853C142.202 53.963 142.283 53.7993 142.283 53.5941C142.283 53.4544 142.239 53.3387 142.152 53.247C142.06 53.1597 141.855 53.0789 141.536 53.0047C140.052 52.6772 139.111 52.3782 138.714 52.1075C138.164 51.732 137.889 51.2102 137.889 50.5422C137.889 49.9397 138.127 49.4333 138.602 49.0229C139.078 48.6124 139.816 48.4072 140.816 48.4072C141.768 48.4072 142.475 48.5622 142.938 48.8722C143.401 49.1822 143.719 49.6406 143.894 50.2475L142.159 50.5684C142.084 50.2977 141.942 50.0903 141.733 49.9463C141.528 49.8022 141.233 49.7302 140.849 49.7302C140.364 49.7302 140.017 49.7978 139.807 49.9332C139.668 50.0292 139.598 50.1537 139.598 50.3065C139.598 50.4375 139.659 50.5488 139.781 50.6405C139.947 50.7627 140.519 50.9352 141.497 51.1578C142.479 51.3805 143.165 51.6534 143.554 51.9765C143.938 52.3039 144.13 52.7602 144.13 53.3452C144.13 53.9827 143.864 54.5306 143.331 54.9891C142.798 55.4475 142.01 55.6767 140.967 55.6767C140.019 55.6767 139.268 55.4846 138.714 55.1004C138.164 54.7162 137.803 54.1944 137.633 53.5352Z"
fill={textColor}
/>
</g>
<defs>
<clipPath id="clip0_522_519">
<rect width="149.833" height="58" fill="white" />
</clipPath>
</defs>
</svg>
);
}

@ -1,49 +1,44 @@
import { Box, Typography, useMediaQuery, useTheme } from "@mui/material";
import NumberIcon from "@root/kitUI/Icons/NumberIcon";
import Section from "@root/kitUI/section";
import LinkGenerationCard from "./LinkGenerationCard";
export default function Buying() {
const theme = useTheme();
const upMd = useMediaQuery(theme.breakpoints.up("md"));
const theme = useTheme();
const upMd = useMediaQuery(theme.breakpoints.up("md"));
return (
<>
<Section
sxsect={{
py: upMd ? "50px" : "40px",
}}
>
<Typography variant="h3" maxWidth={upMd ? undefined : "273px"}>
Покупка коротких ссылок
</Typography>
<Box sx={{
mt: upMd ? "35px" : "30px",
display: "flex",
flexDirection: "column",
gap: upMd ? "30px" : "26px",
}}>
<LinkGenerationCard
id="three-symbols-link"
headerText="Сокращенная трехсимвольная ссылка"
icon={<NumberIcon
number={3}
color="#FB5607"
backgroundColor="#FEDFD0"
sx={{ alignSelf: "start" }}
/>} />
<LinkGenerationCard
id="four-symbols-link"
headerText="Сокращенная четырехсимвольная ссылка"
icon={<NumberIcon
number={4}
color="#FB5607"
backgroundColor="#FEDFD0"
sx={{ alignSelf: "start" }}
/>} />
</Box>
</Section>
</>
);
}
return (
<>
<Section
sxsect={{
py: upMd ? "50px" : "40px",
}}
>
<Typography variant="h3" maxWidth={upMd ? undefined : "273px"}>
Покупка коротких ссылок
</Typography>
<Box
sx={{
mt: upMd ? "35px" : "30px",
display: "flex",
flexDirection: "column",
gap: upMd ? "30px" : "26px",
}}
>
<LinkGenerationCard
id="three-symbols-link"
headerText="Сокращенная трехсимвольная ссылка"
icon={<NumberIcon number={3} color="#FB5607" backgroundColor="#FEDFD0" sx={{ alignSelf: "start" }} />}
/>
<LinkGenerationCard
id="four-symbols-link"
headerText="Сокращенная четырехсимвольная ссылка"
icon={<NumberIcon number={4} color="#FB5607" backgroundColor="#FEDFD0" sx={{ alignSelf: "start" }} />}
/>
</Box>
</Section>
</>
);
}

@ -1,85 +1,116 @@
import { ReactNode, useState } from "react";
import { Typography, Box, Button, Paper, useMediaQuery, useTheme } from "@mui/material";
import CustomTextField from "@root/kitUI/CustomTextField";
interface Props {
id: string;
icon: ReactNode;
headerText: string;
id: string;
icon: ReactNode;
headerText: string;
}
export default function LinkGenerationCard({ id, headerText, icon }: Props) {
const theme = useTheme();
const upMd = useMediaQuery(theme.breakpoints.up("md"));
const [linkToShortenField, setLinkToShortenField] = useState<string>("");
const [shortenedLink, setShortenedLink] = useState<string>("");
const theme = useTheme();
const upMd = useMediaQuery(theme.breakpoints.up("md"));
const [linkToShortenField, setLinkToShortenField] = useState<string>("");
const [shortenedLink, setShortenedLink] = useState<string>("");
return (
<Paper sx={{
width: "100%",
p: "20px",
display: "flex",
flexDirection: "column",
}}>
<Box sx={{
display: "flex",
gap: "14px",
alignItems: "center",
}}>
{icon}
<Typography variant="h4" lineHeight="100% !important">{headerText}</Typography>
</Box>
<CustomTextField
id={`${id}-input`}
label="Ссылка которую вы хотите сократить"
placeholder="Введите ссылку"
backgroundColor="#F2F3F7"
value={linkToShortenField}
onChange={e => setLinkToShortenField(e.target.value)}
sx={{
mt: upMd ? "29px" : "23px",
}}
/>
<CustomTextField
id={`${id}-generated`}
label="Генерация сокращенной ссылки"
placeholder="Здесь будет ваша новая ссылка вида links.ru/xxx"
value={shortenedLink}
disabled
sx={{
mt: upMd ? "23px" : "21px",
}}
/>
<Box sx={{
mt: "30px",
display: "flex",
flexWrap: "wrap",
gap: upMd ? "20px" : "13px",
maxWidth: "412px",
}}>
<Button
variant="template"
sx={{
p: "9px 0",
minWidth: "min-content",
flexGrow: 1,
flexBasis: 0,
}}
>Сгенерировать</Button>
<Button
variant="template"
sx={{
p: "9px 0",
minWidth: "min-content",
flexGrow: 1,
flexBasis: 0,
backgroundColor: "rgb(0 0 0 / 0)",
color: "#9A9AAF",
borderColor: "#9A9AAF",
}}>
Сохранить</Button>
</Box>
</Paper>
);
}
return (
<Paper
sx={{
width: "100%",
p: "20px",
display: "flex",
flexDirection: "column",
}}
>
<Box
sx={{
display: "flex",
gap: "14px",
alignItems: "center",
}}
>
{icon}
<Typography variant="h4" lineHeight="100% !important">
{headerText}
</Typography>
</Box>
<CustomTextField
id={`${id}-input`}
label="Ссылка которую вы хотите сократить"
placeholder="Введите ссылку"
backgroundColor="#F2F3F7"
value={linkToShortenField}
onChange={(e) => setLinkToShortenField(e.target.value)}
sx={{
mt: upMd ? "29px" : "23px",
}}
/>
<CustomTextField
id={`${id}-generated`}
label="Генерация сокращенной ссылки"
placeholder="Здесь будет ваша новая ссылка вида links.ru/xxx"
value={shortenedLink}
disabled
sx={{
mt: upMd ? "23px" : "21px",
}}
/>
<Box
sx={{
mt: "30px",
display: "flex",
flexWrap: "wrap",
gap: upMd ? "20px" : "13px",
maxWidth: "412px",
}}
>
<Button
disableRipple
variant="template"
sx={{
p: "9px 0",
minWidth: "min-content",
flexGrow: 1,
flexBasis: 0,
"&:hover": {
borderColor: "#944FEE",
bgcolor: "#944FEE",
},
"&:active": {
borderColor: "#944FEE",
color: "#944FEE",
bgcolor: "white",
},
}}
>
Сгенерировать
</Button>
<Button
disableRipple
variant="template"
sx={{
p: "9px 0",
minWidth: "min-content",
flexGrow: 1,
flexBasis: 0,
backgroundColor: "rgb(0 0 0 / 0)",
color: "#9A9AAF",
borderColor: "#9A9AAF",
"&:hover": {
bgcolor: "white",
},
"&:active": {
borderColor: "#944FEE",
color: "#944FEE",
bgcolor: "white",
},
}}
>
Сохранить
</Button>
</Box>
</Paper>
);
}

@ -1,188 +1,216 @@
import { useState } from "react";
import { useMediaQuery, Typography, useTheme, Box, Paper, Switch, Button } from "@mui/material";
import CustomTextField from "@root/kitUI/CustomTextField";
import Section from "@root/kitUI/section";
import { useState } from "react";
export default function CreateLink() {
const theme = useTheme();
const upMd = useMediaQuery(theme.breakpoints.up("md"));
const [isAddUtm, setIsAddUtm] = useState<boolean>(false);
const theme = useTheme();
const upMd = useMediaQuery(theme.breakpoints.up("md"));
const [isAddUtm, setIsAddUtm] = useState<boolean>(false);
function createLinkHandler() {
function createLinkHandler() {}
}
return (
<>
<Section
sxsect={{
pt: upMd ? "50px" : "40px",
}}
return (
<>
<Section
sxsect={{
pt: upMd ? "50px" : "40px",
}}
>
<Typography variant="h3">Создание ссылки</Typography>
<Paper
sx={{
mt: upMd ? "35px" : "35px",
p: "20px",
backgroundColor: "#7E2AEA",
}}
>
<Typography variant="h4" color="white">
Создать новую ссылку
</Typography>
<CustomTextField
id="link-input1"
backgroundColor="#F2F3F7"
placeholder="Введите ссылку"
sx={{ mt: "30px" }}
/>
</Paper>
<Paper
sx={{
mt: upMd ? "30px" : "25px",
p: "20px",
}}
>
<Typography variant="t1" fontWeight={500}>
Заголовок
</Typography>
<Typography
sx={{
mt: "7px",
fontWeight: 400,
fontSize: "14px",
lineHeight: "17px",
color: "#9A9AAF",
}}
>
(необязательно)
</Typography>
<CustomTextField id="link-input2" backgroundColor="#F2F3F7" placeholder="Введите текст" sx={{ mt: "9px" }} />
</Paper>
<Box
sx={{
mt: upMd ? "38px" : "32px",
display: "flex",
gap: "8px",
alignItems: "center",
}}
>
<Switch checked={isAddUtm} onChange={(event, checked) => setIsAddUtm(checked)} />
<Typography variant="h4">Добавление UTM</Typography>
</Box>
{isAddUtm && (
<Paper
sx={{
mt: "19px",
p: "20px",
pt: upMd ? undefined : "23px",
}}
>
<Box
sx={{
display: "flex",
flexWrap: "wrap",
rowGap: "28.5px",
columnGap: "80px",
}}
>
<Typography variant="h3">
Создание ссылки
</Typography>
<Paper sx={{
mt: upMd ? "35px" : "35px",
p: "20px",
backgroundColor: "#7E2AEA",
}}>
<Typography variant="h4" color="white">
Создать новую ссылку
</Typography>
<CustomTextField
id="link-input1"
backgroundColor="#F2F3F7"
placeholder="Введите ссылку"
sx={{ mt: "30px" }}
/>
</Paper>
<Paper sx={{
mt: upMd ? "30px" : "25px",
p: "20px",
}}>
<Typography variant="t1" fontWeight={500}>
Заголовок
</Typography>
<Typography sx={{
mt: "7px",
fontWeight: 400,
fontSize: "14px",
lineHeight: "17px",
color: "#9A9AAF",
}}>
(необязательно)
</Typography>
<CustomTextField
id="link-input2"
backgroundColor="#F2F3F7"
placeholder="Введите текст"
sx={{ mt: "9px" }}
/>
</Paper>
<Box sx={{
mt: upMd ? "38px" : "32px",
display: "flex",
gap: "8px",
alignItems: "center",
}}>
<Switch checked={isAddUtm} onChange={(e, checked) => setIsAddUtm(checked)} />
<Typography variant="h4">
Добавление UTM
</Typography>
</Box>
{isAddUtm &&
<Paper sx={{
mt: "19px",
p: "20px",
pt: upMd ? undefined : "23px",
}}>
<Box sx={{
display: "flex",
flexWrap: "wrap",
rowGap: "28.5px",
columnGap: "80px",
}}>
<CustomTextField
id="company"
label="Компания"
placeholder="Компания"
backgroundColor="#F2F3F7"
sx={{
flexBasis: "100%",
}}
/>
<CustomTextField
id="Subdid1"
label="Subdid1"
placeholder="Subdid1"
backgroundColor="#F2F3F7"
sx={{
flexBasis: upMd ? "33%" : "100%",
flexGrow: 1,
}}
/>
<CustomTextField
id="Subdid2"
label="Subdid2"
placeholder="Subdid2"
backgroundColor="#F2F3F7"
sx={{
flexBasis: upMd ? "33%" : "100%",
flexGrow: 1,
}}
/>
<CustomTextField
id="Subdid3"
label="Subdid3"
placeholder="Subdid3"
backgroundColor="#F2F3F7"
sx={{
flexBasis: upMd ? "33%" : "100%",
flexGrow: 1,
}}
/>
<CustomTextField
id="Subdid4"
label="Subdid4"
placeholder="Subdid4"
backgroundColor="#F2F3F7"
sx={{
flexBasis: upMd ? "33%" : "100%",
flexGrow: 1,
}}
/>
</Box>
<Typography variant="t1" fontWeight={500} mt="30px">
Предварительный просмотр тега UTM
</Typography>
<Typography variant="t1" mt="13px">-</Typography>
</Paper>
}
<Typography variant="h4" mt={upMd ? "50px" : "50px"}>
Ваша короткая ссылка
</Typography>
<Button
variant="template"
sx={{
mt: "30px",
backgroundColor: "rgb(0 0 0 / 0)",
borderColor: "#7E2AEA",
color: "#7E2AEA",
p: "9px 31px",
}}
>Сделать ссылку короткой</Button>
<Paper sx={{
mt: "20px",
mb: "160px",
p: "20px",
}}>
<CustomTextField
disabled
id="new-link"
placeholder="Здесь будет ваша новая ссылка"
backgroundColor="#F2F3F7"
/>
</Paper>
<Paper sx={{
position: "fixed",
right: upMd ? "calc((max(100%, 1200px) - 1160px) / 2)" : "16px",
bottom: 0,
p: "20px",
width: upMd ? "max-content" : "min(100% - 32px, 280px)",
borderBottomRightRadius: 0,
borderBottomLeftRadius: 0,
}}>
<Button
variant="template"
sx={{
p: "22px 50px",
}}
onClick={createLinkHandler}
>Создать ссылку</Button>
</Paper>
</Section>
</>
);
}
<CustomTextField
id="company"
label="Компания"
placeholder="Компания"
backgroundColor="#F2F3F7"
sx={{
flexBasis: "100%",
}}
/>
<CustomTextField
id="Subdid1"
label="Subdid1"
placeholder="Subdid1"
backgroundColor="#F2F3F7"
sx={{
flexBasis: upMd ? "33%" : "100%",
flexGrow: 1,
}}
/>
<CustomTextField
id="Subdid2"
label="Subdid2"
placeholder="Subdid2"
backgroundColor="#F2F3F7"
sx={{
flexBasis: upMd ? "33%" : "100%",
flexGrow: 1,
}}
/>
<CustomTextField
id="Subdid3"
label="Subdid3"
placeholder="Subdid3"
backgroundColor="#F2F3F7"
sx={{
flexBasis: upMd ? "33%" : "100%",
flexGrow: 1,
}}
/>
<CustomTextField
id="Subdid4"
label="Subdid4"
placeholder="Subdid4"
backgroundColor="#F2F3F7"
sx={{
flexBasis: upMd ? "33%" : "100%",
flexGrow: 1,
}}
/>
</Box>
<Typography variant="t1" fontWeight={500} mt="30px">
Предварительный просмотр тега UTM
</Typography>
<Typography variant="t1" mt="13px">
-
</Typography>
</Paper>
)}
<Typography variant="h4" mt={upMd ? "50px" : "50px"}>
Ваша короткая ссылка
</Typography>
<Button
disableRipple
variant="template"
sx={{
mt: "30px",
backgroundColor: "rgb(0 0 0 / 0)",
borderColor: "#7E2AEA",
color: "#7E2AEA",
p: "9px 31px",
"&:hover": {
bgcolor: "background: rgba(0,0,0,.5)",
},
"&:active": {
bgcolor: "#581CA7",
color: "white",
},
}}
>
Сделать ссылку короткой
</Button>
<Paper
sx={{
mt: "20px",
mb: "160px",
p: "20px",
}}
>
<CustomTextField
disabled
id="new-link"
placeholder="Здесь будет ваша новая ссылка"
backgroundColor="#F2F3F7"
/>
</Paper>
<Paper
sx={{
position: "fixed",
right: upMd ? "calc((max(100%, 1200px) - 1160px) / 2)" : "16px",
bottom: 0,
p: "20px",
width: upMd ? "max-content" : "min(100% - 32px, 280px)",
borderBottomRightRadius: 0,
borderBottomLeftRadius: 0,
}}
>
<Button
disableRipple
variant="template"
sx={{
p: "22px 50px",
"&:hover": {
bgcolor: "#944FEE",
},
"&:active": {
bgcolor: "white",
borderColor: "#944FEE",
color: "#944FEE",
},
}}
onClick={createLinkHandler}
>
Создать ссылку
</Button>
</Paper>
</Section>
</>
);
}

@ -2,48 +2,53 @@ import { Box, Typography, useMediaQuery, useTheme } from "@mui/material";
import PenaLogoLight from "@root/kitUI/img/logo_pena_links_light";
import Section from "@root/kitUI/section";
export default function AboutProject() {
const theme = useTheme();
const upMd = useMediaQuery(theme.breakpoints.up("md"));
const theme = useTheme();
const upMd = useMediaQuery(theme.breakpoints.up("md"));
return (
<Section
bg="#7E2AEA"
sxsect={{
pt: "102px",
pb: upMd? "94px":"98px",
}}
sxcont={{
display: "flex",
justifyContent: "space-between",
}}
return (
<Section
bg="#7E2AEA"
sxsect={{
pt: "102px",
pb: upMd ? "94px" : "98px",
}}
sxcont={{
display: "flex",
justifyContent: "space-between",
}}
>
<Box>
<Typography
variant="h3"
sx={{
color: "white",
maxWidth: "560px",
lineHeight: "118.5%",
}}
>
<Box>
<Typography
variant="h3"
sx={{
color: "white",
maxWidth: "560px",
lineHeight: "118.5%",
}}
>
О нашем проекте
</Typography>
<Typography color="white" variant="t1" maxWidth="560px" mt="23px">
Текст-заполнитель
это текст, который имеет некоторые,т, который имеет некоторые характеристики реального письменного текста, но является. Текст-заполнитель
это текст, который имеет некоторые характеристики реального письменного текста, но является
</Typography>
</Box>
{upMd && <PenaLogoLight blobColor="#5A1EA8" style={{
alignSelf: "end",
opacity: 0.5,
height: "62px",
minWidth: "160px",
width: "160px",
marginBottom: "3px",
}} />}
</Section>
);
}
О нашем проекте
</Typography>
<Typography color="white" variant="t1" maxWidth="560px" mt="23px">
Текст-заполнитель это текст, который имеет некоторые,т, который имеет некоторые характеристики реального
письменного текста, но является. Текст-заполнитель это текст, который имеет некоторые характеристики
реального письменного текста, но является
</Typography>
</Box>
{upMd && (
<PenaLogoLight
blobColor="#5A1EA8"
style={{
alignSelf: "end",
opacity: 0.5,
height: "62px",
minWidth: "160px",
width: "160px",
marginBottom: "3px",
}}
textColor="white"
/>
)}
</Section>
);
}

@ -1,110 +1,123 @@
import { Box, Typography, useMediaQuery, useTheme } from "@mui/material";
import PenaLogoLight from "@root/kitUI/img/logo_pena_links_light";
import Section from "@root/kitUI/section";
import BigNumberTextCard from "./BigNumberTextCard";
import LaptopWithTrails1 from "./LaptopWithTrails1";
import LaptopWithTrails2 from "./LaptopWithTrails2";
export default function Advantages() {
const theme = useTheme();
const upLg = useMediaQuery(theme.breakpoints.up("lg"));
const upMd = useMediaQuery(theme.breakpoints.up("md"));
const theme = useTheme();
const upLg = useMediaQuery(theme.breakpoints.up("lg"));
const upMd = useMediaQuery(theme.breakpoints.up("md"));
return (
<Section
bg="#333647"
sxsect={{
pt: "174px",
pb: upMd ? "117px" : "100px",
overflow: "hidden",
}}
return (
<Section
bg="#333647"
sxsect={{
pt: "174px",
pb: upMd ? "117px" : "100px",
overflow: "hidden",
}}
>
<Typography
variant="h3"
sx={{
color: "white",
lineHeight: "36px",
[theme.breakpoints.down("md")]: {
lineHeight: "118.5%",
},
}}
>
Преимущества системы от
<span
style={{
marginLeft: upMd ? "15px" : "12px",
}}
>
<Typography variant="h3" sx={{
color: "white",
lineHeight: "36px",
[theme.breakpoints.down('md')]: {
lineHeight: "118.5%",
}
}}>
Преимущества системы от
<span style={{
marginLeft: upMd ? "15px" : "12px",
}}>
<PenaLogoLight style={{
height: upMd ? "37px" : "31px",
width: upMd ? "96px" : "80px",
minWidth: upMd ? "96px" : "80px",
position: "relative",
verticalAlign: "text-bottom",
}} />
</span>
</Typography>
<Box sx={{
display: "flex",
flexDirection: upLg ? "row" : "column",
mt: upLg ? "143px" : "23px",
}}>
<LaptopWithTrails1 />
<Box sx={{
position: "relative",
width: "100%",
height: "100%",
display: "flex",
flexDirection: "column",
gap: "45px",
flex: "1 1 0",
}}>
<BigNumberTextCard
number="1"
headerText="Удобный интерфейс"
text="Текст-заполнитель — это текст, который имеет "
/>
<BigNumberTextCard
number="2"
headerText="Личный кабинет"
text="Текст-заполнитель — это текст, который имеет "
/>
<BigNumberTextCard
number="3"
headerText="Гарантии"
text="Текст-заполнитель — это текст, который имеет "
/>
</Box>
</Box>
<Box sx={{
display: "flex",
flexDirection: upLg ? "row" : "column",
mt: upLg ? "210px" : "43px",
}}>
{!upLg && <LaptopWithTrails2 />}
<Box sx={{
position: "relative",
width: "100%",
height: "100%",
display: "flex",
flexDirection: "column",
gap: "45px",
flex: "1 1 0",
}}>
<BigNumberTextCard
number="4"
headerText="Простая кастомизация"
text="Текст-заполнитель — это текст, который имеет "
/>
<BigNumberTextCard
number="5"
headerText="Актуальная статистика"
text="Текст-заполнитель — это текст, который имеет "
/>
<BigNumberTextCard
number="6"
headerText="Еще преимущество"
text="Текст-заполнитель — это текст, который имеет "
/>
</Box>
{upLg && <LaptopWithTrails2 />}
</Box>
</Section>
);
}
<PenaLogoLight
style={{
height: upMd ? "37px" : "31px",
width: upMd ? "96px" : "80px",
minWidth: upMd ? "96px" : "80px",
position: "relative",
verticalAlign: "text-bottom",
}}
textColor="white"
/>
</span>
</Typography>
<Box
sx={{
display: "flex",
flexDirection: upLg ? "row" : "column",
mt: upLg ? "143px" : "23px",
}}
>
<LaptopWithTrails1 />
<Box
sx={{
position: "relative",
width: "100%",
height: "100%",
display: "flex",
flexDirection: "column",
gap: "45px",
flex: "1 1 0",
}}
>
<BigNumberTextCard
number="1"
headerText="Удобный интерфейс"
text="Текст-заполнитель — это текст, который имеет "
/>
<BigNumberTextCard
number="2"
headerText="Личный кабинет"
text="Текст-заполнитель — это текст, который имеет "
/>
<BigNumberTextCard number="3" headerText="Гарантии" text="Текст-заполнитель — это текст, который имеет " />
</Box>
</Box>
<Box
sx={{
display: "flex",
flexDirection: upLg ? "row" : "column",
mt: upLg ? "210px" : "43px",
}}
>
{!upLg && <LaptopWithTrails2 />}
<Box
sx={{
position: "relative",
width: "100%",
height: "100%",
display: "flex",
flexDirection: "column",
gap: "45px",
flex: "1 1 0",
}}
>
<BigNumberTextCard
number="4"
headerText="Простая кастомизация"
text="Текст-заполнитель — это текст, который имеет "
/>
<BigNumberTextCard
number="5"
headerText="Актуальная статистика"
text="Текст-заполнитель — это текст, который имеет "
/>
<BigNumberTextCard
number="6"
headerText="Еще преимущество"
text="Текст-заполнитель — это текст, который имеет "
/>
</Box>
{upLg && <LaptopWithTrails2 />}
</Box>
</Section>
);
}

@ -1,36 +1,41 @@
import { Box, SxProps, Theme, useMediaQuery, useTheme } from "@mui/material";
import macbookImage1 from "@kitUI/img/landing/macbook1.png";
interface Props {
sx?: SxProps<Theme>;
sx?: SxProps<Theme>;
}
export default function LaptopWithTrails1({ sx }: Props) {
const theme = useTheme();
const upLg = useMediaQuery(theme.breakpoints.up("lg"));
const theme = useTheme();
const upLg = useMediaQuery(theme.breakpoints.up("lg"));
const isTablet = useMediaQuery(theme.breakpoints.up(1200));
const isMobile = useMediaQuery(theme.breakpoints.up(600));
return (
<Box sx={{
position: "relative",
transform: upLg ? "scale(1.149) translate(-10.95%, 13.5%)" : "scale(1.2)",
transformOrigin: upLg ? undefined : "50% 0",
maxHeight: upLg ? "350px" : undefined,
display: "flex",
alignItems: "center",
flex: "1.52 1.52 0",
mb: upLg ? undefined : "33px",
...sx,
}}>
<img
alt=""
src={macbookImage1}
style={{
position: "relative",
zIndex: 1,
width: "100%",
}}
/>
</Box>
);
}
return (
<Box
sx={{
position: "relative",
transform: upLg ? "scale(1.149) translate(-10.95%, 13.5%)" : "scale(1.2)",
transformOrigin: upLg ? undefined : "50% 0",
maxHeight: upLg ? "350px" : undefined,
display: "flex",
alignItems: "center",
flex: "1.52 1.52 0",
mb: upLg ? undefined : "33px",
ml: isMobile ? "44px" : "0" || isTablet ? "0" : "44px",
...sx,
}}
>
<img
alt=""
src={macbookImage1}
style={{
position: "relative",
zIndex: 1,
width: "100%",
}}
/>
</Box>
);
}

@ -1,35 +1,40 @@
import { Box, SxProps, Theme, useMediaQuery, useTheme } from "@mui/material";
import macbookImage2 from "@kitUI/img/landing/macbook2.png";
interface Props {
sx?: SxProps<Theme>;
sx?: SxProps<Theme>;
}
export default function LaptopWithTrails2({ sx }: Props) {
const theme = useTheme();
const upLg = useMediaQuery(theme.breakpoints.up("lg"));
const theme = useTheme();
const upLg = useMediaQuery(theme.breakpoints.up("lg"));
const isTablet = useMediaQuery(theme.breakpoints.up(1200));
const isMobile = useMediaQuery(theme.breakpoints.up(600));
return (
<Box sx={{
position: "relative",
transform: upLg ? "scale(1.132) translate(10.85%, -3.3%)" : "scale(1.16)",
maxHeight: upLg ? "350px" : undefined,
display: "flex",
alignItems: "center",
mb: upLg ? undefined : "47px",
flex: "1.52 1.52 0" ,
...sx,
}}>
<img
alt=""
src={macbookImage2}
style={{
position: "relative",
zIndex: 1,
width: "100%",
}}
/>
</Box>
);
}
return (
<Box
sx={{
position: "relative",
transform: upLg ? "scale(1.132) translate(10.85%, -3.3%)" : "scale(1.16)",
maxHeight: upLg ? "350px" : undefined,
display: "flex",
alignItems: "center",
mb: upLg ? undefined : "47px",
flex: "1.52 1.52 0",
mr: isMobile ? "44px" : "0" || isTablet ? "0" : "44px",
...sx,
}}
>
<img
alt=""
src={macbookImage2}
style={{
position: "relative",
zIndex: 1,
width: "100%",
}}
/>
</Box>
);
}

@ -1,133 +1,149 @@
import { Box, FormControl, IconButton, TextField, Typography, useMediaQuery, useTheme } from "@mui/material";
import Section from "@root/kitUI/section";
import { useState } from "react";
import { Box, FormControl, IconButton, TextField, Typography, useMediaQuery, useTheme } from "@mui/material";
import ChainLinks from "./ChainLinks";
import StatisticsIcon from "./StatisticsIcon";
import Section from "@root/kitUI/section";
export default function Hero() {
const theme = useTheme();
const upLg = useMediaQuery(theme.breakpoints.up("lg"));
const [linkField, setLinkField] = useState<string>("");
const theme = useTheme();
const upLg = useMediaQuery(theme.breakpoints.up("lg"));
const isMobile = useMediaQuery(theme.breakpoints.up(600));
const [linkField, setLinkField] = useState<string>("");
return (
<Section
bg="#333647"
sxsect={{
background: "linear-gradient(288.61deg, rgba(0, 0, 0, 0.35) 0.72%, rgba(0, 0, 0, 0) 77.86%), #333647",
pt: upLg ? "217px" : "17px",
pb: upLg ? "171px" : "60px",
}}
sxcont={{
position: "relative",
}}
return (
<Section
bg="#333647"
sxsect={{
background: "linear-gradient(288.61deg, rgba(0, 0, 0, 0.35) 0.72%, rgba(0, 0, 0, 0) 77.86%), #333647",
pt: upLg ? "217px" : "17px",
pb: upLg ? "171px" : "60px",
}}
sxcont={{
position: "relative",
}}
>
{!upLg && (
<Box
sx={{
display: "flex",
justifyContent: "center",
mt: isMobile ? "100px" : "0",
}}
>
{!upLg &&
<Box sx={{
display: "flex",
justifyContent: "center",
}}>
<ChainLinks style={{
width: "100%",
height: "100%",
maxHeight: "274px",
pointerEvents: "none",
}} />
</Box>
}
<Box sx={{
position: "relative",
zIndex: theme.zIndex.content,
mt: upLg ? undefined : "11px",
}}>
<Typography variant="h1" color="white" maxWidth="690px">
Управляйте вашими ссылками
</Typography>
<Typography
variant="t1"
sx={{
color: "white",
maxWidth: "681px",
mt: upLg ? "30px" : "20px",
}}
>
Текст-заполнитель это текст, который имеет некоторые характеристики реального письменного текста, но является
</Typography>
<Box sx={{
mt: upLg ? "85px" : "40px",
display: "flex",
gap: "20px",
alignItems: "end",
maxWidth: "624px",
}}>
<Box sx={{
display: "flex",
flexDirection: "column",
gap: "8px",
flexGrow:1,
}}>
<Typography
variant="t1"
sx={{
color: "#C293FF",
fontWeight: 500,
maxWidth:"85%",
}}
>
Посмотрите статистику по вашей ссылке
</Typography>
<FormControl
variant="standard"
fullWidth
>
<TextField
id="link"
placeholder="Введите ссылку"
value={linkField}
onChange={e => setLinkField(e.target.value)}
sx={{
"& .MuiOutlinedInput-root": {
borderRadius: "10px",
backgroundColor: "#2A2C3A",
color: "white",
"& fieldset": {
border: "1px solid #9A9AAF",
},
"&:hover fieldset": {
borderColor: "#5b5d6e",
},
"&.Mui-focused fieldset": {
borderColor: "#9A9AAF",
},
"& ::placeholder": {
color: "#9A9AAF",
opacity: 1,
},
"& input": {
p: "11px 20px",
}
},
}}
/>
</FormControl>
</Box>
<IconButton sx={{
p: 0,
height: "44px",
width: "44px",
}}>
<StatisticsIcon />
</IconButton>
</Box>
</Box>
{upLg &&
<ChainLinks style={{
position: "absolute",
top: "-12px",
right: "15px",
zIndex: 0,
}} />
}
</Section>
);
}
<ChainLinks
style={{
width: "100%",
height: "100%",
maxHeight: "274px",
pointerEvents: "none",
}}
/>
</Box>
)}
<Box
sx={{
position: "relative",
zIndex: theme.zIndex.content,
mt: upLg ? undefined : "11px",
}}
>
<Typography variant="h1" color="white" maxWidth="690px">
Управляйте вашими ссылками
</Typography>
<Typography
variant="t1"
sx={{
color: "white",
maxWidth: "681px",
mt: upLg ? "30px" : "20px",
}}
>
Текст-заполнитель это текст, который имеет некоторые характеристики реального письменного текста, но
является
</Typography>
<Box
sx={{
mt: upLg ? "85px" : "40px",
display: "flex",
gap: "20px",
alignItems: "end",
maxWidth: "624px",
}}
>
<Box
sx={{
display: "flex",
flexDirection: "column",
gap: "8px",
flexGrow: 1,
}}
>
<Typography
variant="t1"
sx={{
color: "#C293FF",
fontWeight: 500,
maxWidth: "85%",
}}
>
Посмотрите статистику по вашей ссылке
</Typography>
<FormControl variant="standard" fullWidth>
<TextField
id="link"
placeholder="Введите ссылку"
value={linkField}
onChange={(e) => setLinkField(e.target.value)}
sx={{
"& .MuiOutlinedInput-root": {
borderRadius: "10px",
backgroundColor: "#2A2C3A",
color: "white",
"& fieldset": {
border: "1px solid #9A9AAF",
},
"&:hover fieldset": {
borderColor: "#5b5d6e",
},
"&.Mui-focused fieldset": {
borderColor: "#944FEE",
},
"& ::placeholder": {
color: "#9A9AAF",
opacity: 1,
},
"& input": {
p: "11px 20px",
},
},
}}
/>
</FormControl>
</Box>
<IconButton
disableRipple
sx={{
p: 0,
height: "44px",
width: "44px",
}}
>
<StatisticsIcon />
</IconButton>
</Box>
</Box>
{upLg && (
<ChainLinks
style={{
position: "absolute",
top: "-12px",
right: "15px",
zIndex: 0,
}}
/>
)}
</Section>
);
}

@ -1,26 +1,36 @@
import { Box } from "@mui/material";
export default function StatisticsIcon() {
return (
<Box sx={{
backgroundColor: "#7E2AEA",
width: "44px",
height: "44px",
borderRadius: "8px",
display: "flex",
alignItems: "center",
justifyContent: "center",
flexShrink: 0,
}}>
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M3 21.333H20.5" stroke="white" strokeWidth="1.6" strokeLinecap="round" />
<path d="M18.5 18V2" stroke="white" strokeWidth="1.6" strokeLinecap="round" />
<path d="M14 18V6" stroke="white" strokeWidth="1.6" strokeLinecap="round" />
<path d="M9.5 18V10" stroke="white" strokeWidth="1.6" strokeLinecap="round" />
<path d="M5 14V18" stroke="white" strokeWidth="1.6" strokeLinecap="round" />
</svg>
</Box>
);
}
return (
<Box
sx={{
backgroundColor: "#7E2AEA",
width: "44px",
height: "44px",
borderRadius: "8px",
display: "flex",
alignItems: "center",
justifyContent: "center",
flexShrink: 0,
"&:hover": {
bgcolor: "#944FEE",
},
"&:active": {
stroke: "#944FEE",
background: "white",
},
"&:active path": {
stroke: "#944FEE",
},
}}
>
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M3 21.333H20.5" stroke="white" strokeWidth="1.6" strokeLinecap="round" />
<path d="M18.5 18V2" stroke="white" strokeWidth="1.6" strokeLinecap="round" />
<path d="M14 18V6" stroke="white" strokeWidth="1.6" strokeLinecap="round" />
<path d="M9.5 18V10" stroke="white" strokeWidth="1.6" strokeLinecap="round" />
<path d="M5 14V18" stroke="white" strokeWidth="1.6" strokeLinecap="round" />
</svg>
</Box>
);
}

@ -1,71 +1,73 @@
import { Typography, useMediaQuery, useTheme } from "@mui/material";
import { Box } from "@mui/system";
import { Typography, useMediaQuery, useTheme, Box } from "@mui/material";
import Section from "@root/kitUI/section";
import cardImage1 from "@kitUI/img/landing/card1.png";
import cardImage2 from "@kitUI/img/landing/card2.png";
import cardImage3 from "@kitUI/img/landing/card3.png";
import ImageTextNumberCard from "./ImageTextNumberCard";
import NumberIcon from "@root/kitUI/Icons/NumberIcon";
const cardSx = {
minWidth: "300px",
maxWidth: "360px",
flex: "1 1 0",
};
import ImageTextNumberCard from "./ImageTextNumberCard";
export default function HowItWorks() {
const theme = useTheme();
const upMd = useMediaQuery(theme.breakpoints.up("md"));
const theme = useTheme();
const upMd = useMediaQuery(theme.breakpoints.up("md"));
const isTablet = useMediaQuery(theme.breakpoints.up(1100));
const isMobile = useMediaQuery(theme.breakpoints.up(600));
return (
<Section
bg="#262836"
sxsect={{
pt: upMd ? "101px" : "100px",
mb: "-70px",
}}
>
<Typography
variant="h3"
sx={{
color: "white",
lineHeight: "118.5%",
}}
>
Как работает сервис
</Typography>
<Box
sx={{
mt: upMd ? "60px" : "43px",
display: "flex",
flexWrap: 'wrap',
justifyContent: "space-evenly",
gap: upMd ? "40px" : "31px",
}}
>
<ImageTextNumberCard
icon={<NumberIcon number={1} color="#FFFFFF" backgroundColor="#26283580" />}
image={cardImage1}
headerText="Создайте короткую ссылку"
text="Текст-заполнитель — это текст, который имеет некоторые характеристики "
sx={cardSx}
/>
<ImageTextNumberCard
icon={<NumberIcon number={2} color="#FFFFFF" backgroundColor="#26283580" />}
image={cardImage2}
headerText="Отслеживайте статистику"
text="Текст-заполнитель — это текст, который имеет некоторые характеристики "
sx={cardSx}
/>
<ImageTextNumberCard
icon={<NumberIcon number={3} color="#FFFFFF" backgroundColor="#26283580" />}
image={cardImage3}
headerText="Контролируйте процессы онлайн"
text="Текст-заполнитель — это текст, который имеет некоторые характеристики "
sx={cardSx}
/>
</Box>
</Section>
);
}
const cardSx = {
minWidth: "300px",
maxWidth: isTablet ? "293px" : isMobile ? "0" : "360px",
flex: "1 1 0",
};
return (
<Section
bg="#262836"
sxsect={{
pt: upMd ? "101px" : "100px",
mb: "-70px",
}}
>
<Typography
variant="h3"
sx={{
color: "white",
lineHeight: "118.5%",
}}
>
Как работает сервис
</Typography>
<Box
sx={{
mt: upMd ? "60px" : "43px",
display: "flex",
flexWrap: "wrap",
justifyContent: "space-evenly",
gap: isTablet ? "40px" : "20px",
}}
>
<ImageTextNumberCard
icon={<NumberIcon number={1} color="#FFFFFF" backgroundColor="#26283580" />}
image={cardImage1}
headerText="Создайте короткую ссылку"
text="Текст-заполнитель — это текст, который имеет некоторые характеристики "
sx={cardSx}
/>
<ImageTextNumberCard
icon={<NumberIcon number={2} color="#FFFFFF" backgroundColor="#26283580" />}
image={cardImage2}
headerText="Отслеживайте статистику"
text="Текст-заполнитель — это текст, который имеет некоторые характеристики "
sx={cardSx}
/>
<ImageTextNumberCard
icon={<NumberIcon number={3} color="#FFFFFF" backgroundColor="#26283580" />}
image={cardImage3}
headerText="Контролируйте процессы онлайн"
text="Текст-заполнитель — это текст, который имеет некоторые характеристики "
sx={cardSx}
/>
</Box>
</Section>
);
}

@ -5,21 +5,20 @@ import Advantages from "./Advantages/Advantages";
import Profits from "./Profits/Profits";
import Tariffs from "./Tariffs/Tariffs";
import RegisterNow from "./RegisterNow";
import Footer from "@root/kitUI/footer";
export default function Landing() {
return (
<>
<Hero />
<AboutProject />
<HowItWorks />
<Advantages />
<Profits />
<Tariffs />
<RegisterNow />
<Footer />
</>
);
}
return (
<>
<Hero />
<AboutProject />
<HowItWorks />
<Advantages />
<Profits />
<Tariffs />
<RegisterNow />
<Footer />
</>
);
}

@ -1,61 +1,162 @@
import { CSSProperties } from "react";
interface Props {
style?: CSSProperties;
style?: CSSProperties;
}
export default function Lights({ style }: Props) {
return (
<svg width="196" height="175" viewBox="0 0 196 175" fill="none" xmlns="http://www.w3.org/2000/svg" style={style}>
<path d="M148.919 117.806C148.832 118.245 149.047 118.688 149.446 118.891C149.845 119.094 150.33 119.008 150.634 118.679L194.734 71.0005C194.96 70.7563 195.05 70.4159 194.973 70.0922C194.897 69.7685 194.665 69.5038 194.354 69.3862L169.945 60.15L176.081 29.1944C176.168 28.7554 175.953 28.312 175.554 28.1089C175.155 27.9058 174.67 27.9924 174.366 28.321L130.266 75.9996C130.04 76.2437 129.95 76.5841 130.027 76.9078C130.103 77.2315 130.335 77.4962 130.646 77.6139L155.055 86.85L148.919 117.806Z" fill="url(#paint0_linear_522_580)" stroke="url(#paint1_linear_522_580)" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
<path d="M40.9831 173.858C40.9396 174.077 41.0473 174.299 41.2467 174.4C41.4461 174.502 41.6887 174.459 41.8406 174.294L101.279 110.033C101.392 109.911 101.437 109.741 101.399 109.579C101.36 109.417 101.244 109.285 101.089 109.226L67.5199 96.5232L75.9288 54.0972C75.9723 53.8777 75.8647 53.656 75.6652 53.5545C75.4658 53.4529 75.2232 53.4962 75.0713 53.6605L15.6329 117.922C15.52 118.044 15.4752 118.214 15.5133 118.376C15.5514 118.538 15.6675 118.67 15.823 118.729L49.392 131.432L40.9831 173.858Z" fill="url(#paint2_linear_522_580)" stroke="url(#paint3_linear_522_580)" strokeLinecap="round" strokeLinejoin="round" />
<path d="M98.4966 45.2711C98.4096 45.7101 98.6249 46.1535 99.0237 46.3566C99.4225 46.5597 99.9077 46.4731 100.212 46.1445L131.659 12.1451C131.885 11.901 131.975 11.5606 131.898 11.2369C131.822 10.9132 131.59 10.6485 131.279 10.5308L114.1 4.0305L118.428 -17.8056C118.515 -18.2446 118.3 -18.688 117.901 -18.8911C117.503 -19.0942 117.017 -19.0076 116.713 -18.679L85.2659 15.3204C85.0401 15.5645 84.9504 15.9049 85.0266 16.2286C85.1029 16.5523 85.3351 16.817 85.6461 16.9347L102.825 23.435L98.4966 45.2711Z" fill="url(#paint4_linear_522_580)" stroke="url(#paint5_linear_522_580)" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
<path d="M10.9188 60.8071C10.8324 61.2467 11.0489 61.6902 11.4487 61.8924C11.8485 62.0946 12.334 62.0062 12.6369 61.676L35.7369 36.4975C35.9609 36.2533 36.0494 35.914 35.9732 35.5915C35.897 35.269 35.666 35.0052 35.3564 34.8871L22.9438 30.1518L26.0812 14.1929C26.1676 13.7533 25.9511 13.3098 25.5513 13.1076C25.1515 12.9054 24.666 12.9938 24.3631 13.324L1.26313 38.5025C1.03912 38.7467 0.950604 39.086 1.02679 39.4085C1.10297 39.731 1.33396 39.9948 1.64356 40.1129L14.0562 44.8482L10.9188 60.8071Z" fill="url(#paint6_linear_522_580)" stroke="url(#paint7_linear_522_580)" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
<path d="M121.409 173.904C121.366 174.124 121.475 174.346 121.675 174.447C121.876 174.547 122.119 174.502 122.27 174.337L138.37 156.658C138.481 156.536 138.525 156.367 138.487 156.206C138.448 156.045 138.334 155.914 138.179 155.855L129.371 152.47L131.591 141.096C131.634 140.876 131.525 140.654 131.325 140.553C131.124 140.453 130.881 140.498 130.73 140.663L114.63 158.342C114.519 158.464 114.475 158.633 114.513 158.794C114.552 158.955 114.666 159.086 114.821 159.145L123.629 162.53L121.409 173.904Z" fill="url(#paint8_linear_522_580)" stroke="url(#paint9_linear_522_580)" strokeLinecap="round" strokeLinejoin="round" />
<defs>
<linearGradient id="paint0_linear_522_580" x1="134.5" y1="118" x2="173.136" y2="33.7566" gradientUnits="userSpaceOnUse">
<stop stopColor="#7E2AEA" />
<stop offset="1" stopColor="#A56BF1" />
</linearGradient>
<linearGradient id="paint1_linear_522_580" x1="134.5" y1="118" x2="173.136" y2="33.7566" gradientUnits="userSpaceOnUse">
<stop stopColor="#7E2AEA" />
<stop offset="1" stopColor="#A56BF1" />
</linearGradient>
<linearGradient id="paint2_linear_522_580" x1="3.5" y1="146" x2="72.7907" y2="60.411" gradientUnits="userSpaceOnUse">
<stop stopColor="#7E2AEA" />
<stop offset="1" stopColor="#A56BF1" stopOpacity="0.38" />
</linearGradient>
<linearGradient id="paint3_linear_522_580" x1="3.5" y1="146" x2="72.7907" y2="60.411" gradientUnits="userSpaceOnUse">
<stop stopColor="#7E2AEA" />
<stop offset="1" stopColor="#A56BF1" stopOpacity="0.38" />
</linearGradient>
<linearGradient id="paint4_linear_522_580" x1="97.3203" y1="59.0215" x2="116.047" y2="-14.6081" gradientUnits="userSpaceOnUse">
<stop stopColor="#7E2AEA" />
<stop offset="1" stopColor="#C08EFF" />
</linearGradient>
<linearGradient id="paint5_linear_522_580" x1="97.3203" y1="59.0215" x2="116.047" y2="-14.6081" gradientUnits="userSpaceOnUse">
<stop stopColor="#7E2AEA" />
<stop offset="1" stopColor="#C08EFF" />
</linearGradient>
<linearGradient id="paint6_linear_522_580" x1="5" y1="61" x2="35.2289" y2="2.11754" gradientUnits="userSpaceOnUse">
<stop stopColor="#7E2AEA" />
<stop offset="1" stopColor="#C08EFF" />
</linearGradient>
<linearGradient id="paint7_linear_522_580" x1="5" y1="61" x2="35.2289" y2="2.11754" gradientUnits="userSpaceOnUse">
<stop stopColor="#7E2AEA" />
<stop offset="1" stopColor="#C08EFF" />
</linearGradient>
<linearGradient id="paint8_linear_522_580" x1="111.614" y1="166.31" x2="138.507" y2="132.908" gradientUnits="userSpaceOnUse">
<stop stopColor="#7E2AEA" />
<stop offset="1" stopColor="#A56BF1" stopOpacity="0.17" />
</linearGradient>
<linearGradient id="paint9_linear_522_580" x1="111.614" y1="166.31" x2="138.507" y2="132.908" gradientUnits="userSpaceOnUse">
<stop stopColor="#7E2AEA" />
<stop offset="1" stopColor="#A56BF1" stopOpacity="0.17" />
</linearGradient>
</defs>
</svg>
);
}
return (
<svg width="196" height="175" viewBox="0 0 196 175" fill="none" xmlns="http://www.w3.org/2000/svg" style={style}>
<path
d="M148.919 117.806C148.832 118.245 149.047 118.688 149.446 118.891C149.845 119.094 150.33 119.008 150.634 118.679L194.734 71.0005C194.96 70.7563 195.05 70.4159 194.973 70.0922C194.897 69.7685 194.665 69.5038 194.354 69.3862L169.945 60.15L176.081 29.1944C176.168 28.7554 175.953 28.312 175.554 28.1089C175.155 27.9058 174.67 27.9924 174.366 28.321L130.266 75.9996C130.04 76.2437 129.95 76.5841 130.027 76.9078C130.103 77.2315 130.335 77.4962 130.646 77.6139L155.055 86.85L148.919 117.806Z"
fill="url(#paint0_linear_522_580)"
stroke="url(#paint1_linear_522_580)"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
/>
<path
d="M40.9831 173.858C40.9396 174.077 41.0473 174.299 41.2467 174.4C41.4461 174.502 41.6887 174.459 41.8406 174.294L101.279 110.033C101.392 109.911 101.437 109.741 101.399 109.579C101.36 109.417 101.244 109.285 101.089 109.226L67.5199 96.5232L75.9288 54.0972C75.9723 53.8777 75.8647 53.656 75.6652 53.5545C75.4658 53.4529 75.2232 53.4962 75.0713 53.6605L15.6329 117.922C15.52 118.044 15.4752 118.214 15.5133 118.376C15.5514 118.538 15.6675 118.67 15.823 118.729L49.392 131.432L40.9831 173.858Z"
fill="url(#paint2_linear_522_580)"
stroke="url(#paint3_linear_522_580)"
strokeLinecap="round"
strokeLinejoin="round"
/>
<path
d="M98.4966 45.2711C98.4096 45.7101 98.6249 46.1535 99.0237 46.3566C99.4225 46.5597 99.9077 46.4731 100.212 46.1445L131.659 12.1451C131.885 11.901 131.975 11.5606 131.898 11.2369C131.822 10.9132 131.59 10.6485 131.279 10.5308L114.1 4.0305L118.428 -17.8056C118.515 -18.2446 118.3 -18.688 117.901 -18.8911C117.503 -19.0942 117.017 -19.0076 116.713 -18.679L85.2659 15.3204C85.0401 15.5645 84.9504 15.9049 85.0266 16.2286C85.1029 16.5523 85.3351 16.817 85.6461 16.9347L102.825 23.435L98.4966 45.2711Z"
fill="url(#paint4_linear_522_580)"
stroke="url(#paint5_linear_522_580)"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
/>
<path
d="M10.9188 60.8071C10.8324 61.2467 11.0489 61.6902 11.4487 61.8924C11.8485 62.0946 12.334 62.0062 12.6369 61.676L35.7369 36.4975C35.9609 36.2533 36.0494 35.914 35.9732 35.5915C35.897 35.269 35.666 35.0052 35.3564 34.8871L22.9438 30.1518L26.0812 14.1929C26.1676 13.7533 25.9511 13.3098 25.5513 13.1076C25.1515 12.9054 24.666 12.9938 24.3631 13.324L1.26313 38.5025C1.03912 38.7467 0.950604 39.086 1.02679 39.4085C1.10297 39.731 1.33396 39.9948 1.64356 40.1129L14.0562 44.8482L10.9188 60.8071Z"
fill="url(#paint6_linear_522_580)"
stroke="url(#paint7_linear_522_580)"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
/>
<path
d="M121.409 173.904C121.366 174.124 121.475 174.346 121.675 174.447C121.876 174.547 122.119 174.502 122.27 174.337L138.37 156.658C138.481 156.536 138.525 156.367 138.487 156.206C138.448 156.045 138.334 155.914 138.179 155.855L129.371 152.47L131.591 141.096C131.634 140.876 131.525 140.654 131.325 140.553C131.124 140.453 130.881 140.498 130.73 140.663L114.63 158.342C114.519 158.464 114.475 158.633 114.513 158.794C114.552 158.955 114.666 159.086 114.821 159.145L123.629 162.53L121.409 173.904Z"
fill="url(#paint8_linear_522_580)"
stroke="url(#paint9_linear_522_580)"
strokeLinecap="round"
strokeLinejoin="round"
/>
<defs>
<linearGradient
id="paint0_linear_522_580"
x1="134.5"
y1="118"
x2="173.136"
y2="33.7566"
gradientUnits="userSpaceOnUse"
>
<stop stopColor="#7E2AEA" />
<stop offset="1" stopColor="#A56BF1" />
</linearGradient>
<linearGradient
id="paint1_linear_522_580"
x1="134.5"
y1="118"
x2="173.136"
y2="33.7566"
gradientUnits="userSpaceOnUse"
>
<stop stopColor="#7E2AEA" />
<stop offset="1" stopColor="#A56BF1" />
</linearGradient>
<linearGradient
id="paint2_linear_522_580"
x1="3.5"
y1="146"
x2="72.7907"
y2="60.411"
gradientUnits="userSpaceOnUse"
>
<stop stopColor="#7E2AEA" />
<stop offset="1" stopColor="#A56BF1" stopOpacity="0.38" />
</linearGradient>
<linearGradient
id="paint3_linear_522_580"
x1="3.5"
y1="146"
x2="72.7907"
y2="60.411"
gradientUnits="userSpaceOnUse"
>
<stop stopColor="#7E2AEA" />
<stop offset="1" stopColor="#A56BF1" stopOpacity="0.38" />
</linearGradient>
<linearGradient
id="paint4_linear_522_580"
x1="97.3203"
y1="59.0215"
x2="116.047"
y2="-14.6081"
gradientUnits="userSpaceOnUse"
>
<stop stopColor="#7E2AEA" />
<stop offset="1" stopColor="#C08EFF" />
</linearGradient>
<linearGradient
id="paint5_linear_522_580"
x1="97.3203"
y1="59.0215"
x2="116.047"
y2="-14.6081"
gradientUnits="userSpaceOnUse"
>
<stop stopColor="#7E2AEA" />
<stop offset="1" stopColor="#C08EFF" />
</linearGradient>
<linearGradient
id="paint6_linear_522_580"
x1="5"
y1="61"
x2="35.2289"
y2="2.11754"
gradientUnits="userSpaceOnUse"
>
<stop stopColor="#7E2AEA" />
<stop offset="1" stopColor="#C08EFF" />
</linearGradient>
<linearGradient
id="paint7_linear_522_580"
x1="5"
y1="61"
x2="35.2289"
y2="2.11754"
gradientUnits="userSpaceOnUse"
>
<stop stopColor="#7E2AEA" />
<stop offset="1" stopColor="#C08EFF" />
</linearGradient>
<linearGradient
id="paint8_linear_522_580"
x1="111.614"
y1="166.31"
x2="138.507"
y2="132.908"
gradientUnits="userSpaceOnUse"
>
<stop stopColor="#7E2AEA" />
<stop offset="1" stopColor="#A56BF1" stopOpacity="0.17" />
</linearGradient>
<linearGradient
id="paint9_linear_522_580"
x1="111.614"
y1="166.31"
x2="138.507"
y2="132.908"
gradientUnits="userSpaceOnUse"
>
<stop stopColor="#7E2AEA" />
<stop offset="1" stopColor="#A56BF1" stopOpacity="0.17" />
</linearGradient>
</defs>
</svg>
);
}

@ -2,193 +2,219 @@ import { Box, Typography, useMediaQuery, useTheme } from "@mui/material";
import Section from "@root/kitUI/section";
import Lights from "./Lights";
const infoBoxSx = {
display: "flex",
alignItems: "end",
textAlign: "center",
width: "100%",
p: "20px",
display: "flex",
alignItems: "end",
textAlign: "center",
width: "100%",
p: "20px",
};
export default function Profits() {
const theme = useTheme();
const upLg = useMediaQuery(theme.breakpoints.up("lg"));
const upMd = useMediaQuery(theme.breakpoints.up("md"));
const theme = useTheme();
const upLg = useMediaQuery(theme.breakpoints.up("lg"));
const upMd = useMediaQuery(theme.breakpoints.up("md"));
const isTablet = useMediaQuery(theme.breakpoints.up(1000));
const infoContainerSx = {
display: "flex",
flexDirection: "column",
justifyContent: "end",
gap: upLg ? "25px" : "15px",
alignItems: "center",
flex: "1 0 0",
};
console.log(upLg);
const infoText1 = <InfoText text="Отслеживание изменений активности" />;
const infoText2 = <InfoText text="Автоматизация процессов аналитики" />;
const infoText3 = <InfoText text="Какая-то еще выгодная выгода" />;
const infoContainerSx = {
display: "flex",
flexDirection: "column",
justifyContent: "end",
gap: upLg ? "25px" : "15px",
alignItems: "center",
flex: "1 0 0",
};
return (
<Section
bg="#262835"
sxsect={{
pb: upMd ? "100px" : "98px",
pt: upMd ? "100px" : "102px",
background: `
const infoText1 = <InfoText text="Отслеживание изменений активности" />;
const infoText2 = <InfoText text="Автоматизация процессов аналитики" />;
const infoText3 = <InfoText text="Какая-то еще выгодная выгода" />;
return (
<Section
bg="#262835"
sxsect={{
pb: upMd ? "100px" : "98px",
pt: upMd ? "100px" : "102px",
background: `
linear-gradient(284.12deg, rgba(0, 0, 0, 0.35) 3.47%, rgba(0, 0, 0, 0) 82.88%),
linear-gradient(0deg, #262835, #262835), #333647;
`,
}}
}}
>
<Typography
variant="h3"
sx={{
maxWidth: "480px",
color: "white",
lineHeight: "118.5%",
[theme.breakpoints.down("md")]: {
lineHeight: "118.5%",
},
}}
>
Выгода для бизнеса по мнению пользователей
</Typography>
<Box
sx={{
mt: upMd ? "75px" : "54px",
display: "flex",
gap: isTablet ? "100px" : "73px",
flexDirection: isTablet ? "row" : "column",
}}
>
<Box
sx={{
flex: "3.9 0 0",
display: "flex",
gap: "20px",
}}
>
<Typography variant="h3" sx={{
maxWidth: "480px",
<Box sx={infoContainerSx}>
<Typography
variant="h4"
sx={{
color: "white",
lineHeight: "118.5%",
[theme.breakpoints.down('md')]: {
lineHeight: "118.5%",
}
}}>
Выгода для бизнеса по мнению пользователей
}}
>
42%
</Typography>
<Box sx={{
mt: upMd ? "75px" : "54px",
display: "flex",
gap: upLg ? "100px" : "73px",
flexDirection: upLg ? "row" : "column",
}}>
<Box sx={{
flex: "3.9 0 0",
display: "flex",
gap: "20px",
}}>
<Box sx={infoContainerSx}>
<Typography
variant="h4"
sx={{
color: "white",
lineHeight: "118.5%",
}}
>42%</Typography>
<Box sx={{
...infoBoxSx,
borderRadius: upMd ? "16px" : "8px",
mt: upLg ? 0 : "5px",
height: upMd ? "300px" : "147px",
backgroundColor: "#7E2AEA",
position: "relative",
overflow: "hidden",
}}>
<Lights style={{
position: "absolute",
top: "0px",
left: "calc(50% - 2px)",
translate: "-50%",
width: "100%",
}} />
{upLg && infoText1}
</Box>
{!upLg && infoText1}
</Box>
<Box sx={infoContainerSx}>
<Typography
variant="h4"
sx={{
color: "white",
lineHeight: "118.5%",
}}
>32%</Typography>
<Box sx={{
...infoBoxSx,
borderRadius: upMd ? "16px" : "8px",
mt: upLg ? 0 : "5px",
height: upMd ? "230px" : "113px",
backgroundColor: "#515675",
}}>
{upLg && infoText2}
</Box>
{!upLg && infoText2}
</Box>
<Box sx={infoContainerSx}>
<Typography
variant="h4"
sx={{
color: "white",
lineHeight: "118.5%",
}}
>26%</Typography>
<Box sx={{
...infoBoxSx,
borderRadius: upMd ? "16px" : "8px",
mt: upLg ? 0 : "5px",
height: upMd ? "150px" : "73px",
backgroundColor: "#333647",
}}>
{upLg && infoText3}
</Box>
{!upLg && infoText3}
</Box>
</Box>
<Box sx={{
display: "flex",
flexDirection: "column",
flex: "2 0 0",
}}>
<Typography sx={{
color: "white",
fontWeight: 500,
fontSize: "24px",
lineHeight: "28px",
}}>
Заголовок
</Typography>
<Typography color="white" variant="t1" mt="20px" maxWidth={upLg ? "355px" : undefined}>
Текст-заполнитель это текст, который имеет некоторые,т, который имеет некоторые характеристики реального письменного текста
</Typography>
<Typography
variant="t1"
sx={{
maxWidth: upLg ? "355px" : undefined,
color: "white",
mt: upLg ? "auto" : "40px",
ml: upLg ? undefined : "1.2em",
position: "relative",
"&::before": {
content: '"*"',
position: "absolute",
left: "-1em",
top: "0px",
color: "#C293FF",
}
}}
>
Текст-заполнитель это текст, который имеет
</Typography>
</Box>
<Box
sx={{
...infoBoxSx,
borderRadius: upMd ? "16px" : "8px",
mt: isTablet ? 0 : "5px",
height: upMd ? "300px" : "147px",
backgroundColor: "#7E2AEA",
position: "relative",
overflow: "hidden",
}}
>
<Lights
style={{
position: "absolute",
top: "0px",
left: "calc(50% - 2px)",
translate: "-50%",
width: "100%",
}}
/>
{isTablet && infoText1}
</Box>
</Section>
);
}
function InfoText({ text }: {
text: string;
}) {
const theme = useTheme();
const upLg = useMediaQuery(theme.breakpoints.up("lg"));
return (
<Typography
color="white"
{!isTablet && infoText1}
</Box>
<Box sx={infoContainerSx}>
<Typography
variant="h4"
sx={{
color: "white",
lineHeight: "118.5%",
}}
>
32%
</Typography>
<Box
sx={{
...infoBoxSx,
borderRadius: upMd ? "16px" : "8px",
mt: isTablet ? 0 : "5px",
height: upMd ? "230px" : "113px",
backgroundColor: "#515675",
}}
>
{isTablet && infoText2}
</Box>
{!isTablet && infoText2}
</Box>
<Box sx={infoContainerSx}>
<Typography
variant="h4"
sx={{
color: "white",
lineHeight: "118.5%",
}}
>
26%
</Typography>
<Box
sx={{
...infoBoxSx,
borderRadius: upMd ? "16px" : "8px",
mt: isTablet ? 0 : "5px",
height: upMd ? "150px" : "73px",
backgroundColor: "#333647",
}}
>
{isTablet && infoText3}
</Box>
{!isTablet && infoText3}
</Box>
</Box>
<Box
sx={{
display: "flex",
flexDirection: "column",
flex: "2 0 0",
}}
>
<Typography
sx={{
color: "white",
fontWeight: 500,
fontSize: "24px",
lineHeight: "28px",
}}
>
Заголовок
</Typography>
<Typography color="white" variant="t1" mt="20px">
Текст-заполнитель это текст, который имеет некоторые,т, который имеет некоторые характеристики реального
письменного текста
</Typography>
<Typography
variant="t1"
sx={{
fontWeight: "500",
fontSize: upLg ? undefined : "13px",
lineHeight: upLg ? undefined : "15px",
textAlign: "center",
maxWidth: upLg ? undefined : "110px",
maxWidth: isTablet ? "355px" : undefined,
color: "white",
mt: isTablet ? "auto" : "40px",
ml: isTablet ? undefined : "1.2em",
position: "relative",
"&::before": {
content: '"*"',
position: "absolute",
left: "-1em",
top: "0px",
color: "#C293FF",
},
}}
>
{text}
</Typography>
);
}
>
Текст-заполнитель это текст, который имеет
</Typography>
</Box>
</Box>
</Section>
);
}
function InfoText({ text }: { text: string }) {
const theme = useTheme();
const upLg = useMediaQuery(theme.breakpoints.up("lg"));
return (
<Typography
color="white"
variant="t1"
sx={{
fontWeight: "500",
fontSize: upLg ? undefined : "13px",
lineHeight: upLg ? undefined : "15px",
textAlign: "center",
maxWidth: upLg ? undefined : "110px",
}}
>
{text}
</Typography>
);
}

@ -1,44 +1,57 @@
import { Box, Button, Typography, useMediaQuery, useTheme } from "@mui/material";
import Section from "@root/kitUI/section";
export default function RegisterNow() {
const theme = useTheme();
const upMd = useMediaQuery(theme.breakpoints.up("md"));
const theme = useTheme();
const upMd = useMediaQuery(theme.breakpoints.up("md"));
return (
<Section
bg="#7E2AEA"
sxsect={{
py: "100px",
}}
return (
<Section
bg="#7E2AEA"
sxsect={{
py: "100px",
}}
>
<Typography variant="h1" color="white">
Начните управлять своим бизнесом уже сейчас
</Typography>
<Box
sx={{
display: "flex",
gap: "20px",
mt: upMd ? "50px" : "40px",
}}
>
<Button
disableRipple
variant="template"
sx={{
color: "black",
backgroundColor: "white",
p: "9px 31px",
"&:hover": {
bgcolor: "white",
},
}}
>
<Typography variant="h1" color="white">
Начните управлять своим бизнесом уже сейчас
</Typography>
<Box sx={{
display: "flex",
gap: "20px",
mt: upMd ? "50px" : "40px",
}}>
<Button
variant="template"
sx={{
color: "black",
backgroundColor: "white",
p: "9px 31px",
}}
>Войти</Button>
<Button
variant="template"
sx={{
color: "white",
backgroundColor: "none",
p: "9px 31px",
border: "1px solid #FFFFFF",
}}
>Регистрация</Button>
</Box>
</Section>
);
}
Войти
</Button>
<Button
disableRipple
variant="template"
sx={{
color: "white",
backgroundColor: "none",
p: "9px 31px",
border: "1px solid #FFFFFF",
"&:hover": {
bgColor: "#581CA7",
},
}}
>
Регистрация
</Button>
</Box>
</Section>
);
}

@ -1,212 +1,274 @@
import { Typography, Box, Button, List, ListItem, ListItemIcon, ListItemText, SxProps, Theme, useMediaQuery, useTheme } from "@mui/material";
import Section from "@root/kitUI/section";
import { ReactNode } from "react";
import {
Typography,
Box,
Button,
List,
ListItem,
ListItemIcon,
ListItemText,
SxProps,
Theme,
useMediaQuery,
useTheme,
} from "@mui/material";
import Section from "@root/kitUI/section";
import CheckIcon from "./CheckIcon";
import CircleIcon from "./CircleIcon";
import Trails from "./Trails";
const cardContainerSx = {
minWidth: "300px",
maxWidth: "360px",
flex: "1 1 0",
minWidth: "300px",
maxWidth: "360px",
flex: "1 1 0",
};
const cardSx = {
display: "flex",
flexDirection: "column",
alignItems: "center",
height: "500px",
borderRadius: "12px",
p: "20px",
pt: "30px",
display: "flex",
flexDirection: "column",
alignItems: "center",
height: "500px",
borderRadius: "12px",
p: "20px",
pt: "30px",
};
export default function Tariffs() {
const theme = useTheme();
const upLg = useMediaQuery(theme.breakpoints.up("lg"));
const upMd = useMediaQuery(theme.breakpoints.up("md"));
const theme = useTheme();
const upLg = useMediaQuery(theme.breakpoints.up("lg"));
const upMd = useMediaQuery(theme.breakpoints.up("md"));
const isTablet = useMediaQuery(theme.breakpoints.up(1000));
return (
<Section
bg="#333647"
sxsect={{
pt: "100px",
pb: upMd ? "100px" : "89px",
}}
return (
<Section
bg="#333647"
sxsect={{
pt: "100px",
pb: upMd ? "100px" : "89px",
}}
>
<Typography
sx={{
color: "white",
fontWeight: 500,
fontSize: "36px",
lineHeight: "43px",
}}
>
Наши тарифы
</Typography>
<Box
sx={{
mt: upMd ? "75px" : "85px",
display: "flex",
flexWrap: "wrap",
justifyContent: "space-evenly",
gap: isTablet ? "40px" : "20px",
}}
>
<Box
sx={{
...cardContainerSx,
order: upLg ? 1 : 2,
}}
>
<Typography sx={{
color: "white",
fontWeight: 500,
fontSize: '36px',
lineHeight: '43px',
}}>
Наши тарифы
<Box
sx={{
...cardSx,
backgroundColor: "#282937",
border: "1px solid #9A9AAF",
}}
>
<Typography variant="t1" color="white" fontWeight="500">
Платно
</Typography>
<Box sx={{
mt: upMd ? "75px" : "85px",
display: "flex",
flexWrap: 'wrap',
justifyContent: "space-evenly",
gap: upMd ? "40px" : "30px",
}}>
<Box sx={{
...cardContainerSx,
order: upLg ? 1 : 2,
}}>
<Box sx={{
...cardSx,
backgroundColor: "#282937",
border: "1px solid #9A9AAF",
}}>
<Typography variant="t1" color="white" fontWeight="500">Платно</Typography>
<Typography sx={{
color: "white",
mt: "30px",
fontWeight: 500,
fontSize: "36px",
lineHeight: "43px",
}}>4 560 руб.</Typography>
<CustomList
sx={{
mt: "70px",
}}
icon={<CheckIcon bgcolor="#7E2AEA" lineColor="white" />}
items={[
"Доступ к полной статистике",
"Делигирование сокращателя на домен ",
"То же, что и в бесплатном тарифе",
]}
/>
<Button
variant="template"
sx={{
p: "9px 51.5px",
mt: "auto",
}}>Выбрать</Button>
</Box>
</Box>
<Box sx={{
...cardContainerSx,
position: "relative",
order: upLg ? 2 : 1,
}}>
<Trails style={{
position: "absolute",
top: "-64px",
left: "34px",
}} />
<Box sx={{
...cardSx,
backgroundColor: "#7E2AEA",
position: "relative",
}}>
<Typography variant="t1" color="white" fontWeight="500">Бесплатно</Typography>
<Typography sx={{
color: "white",
mt: "30px",
fontWeight: 500,
fontSize: "36px",
lineHeight: "43px",
}}>0 руб.</Typography>
<CustomList
sx={{
mt: "70px",
}}
icon={<CheckIcon bgcolor="white" lineColor="#7E2AEA" />}
items={[
"Просмотр количества кликов",
"Сокращение, UTM-метки",
"Экспорт статистики",
"Пиксель",
]}
/>
<Button
variant="template"
sx={{
color: "black",
backgroundColor: "white",
p: "9px 51.5px",
mt: "auto",
}}
>Выбрать</Button>
</Box>
</Box>
<Box sx={{
...cardContainerSx,
order: 3,
}}>
<Box sx={{
...cardSx,
height: "auto",
}}>
<Typography variant="t1" color="#9B4FFD" fontWeight="500">Скоро</Typography>
<Typography sx={{
color: "white",
mt: "30px",
fontWeight: 500,
fontSize: "36px",
lineHeight: "43px",
}}>В разработке</Typography>
<CustomList
sx={{
mt: "72px",
ml: "5px",
}}
icon={<CircleIcon />}
items={[
"Продажа коротких ссылок",
"Ручная генерация",
"Брендирование",
"Двойная ссылка",
]}
/>
</Box>
</Box>
</Box>
</Section>
);
<Typography
sx={{
color: "white",
mt: "30px",
fontWeight: 500,
fontSize: "36px",
lineHeight: "43px",
}}
>
4 560 руб.
</Typography>
<CustomList
sx={{
mt: "70px",
}}
icon={<CheckIcon bgcolor="#7E2AEA" lineColor="white" />}
items={[
"Доступ к полной статистике",
"Делигирование сокращателя на домен ",
"То же, что и в бесплатном тарифе",
]}
/>
<Button
disableRipple
variant="template"
sx={{
p: "9px 51.5px",
mt: "auto",
"&:hover": {
border: "1px solid 944FEE",
bgcolor: "#944FEE",
},
"&:active": {
borderColor: "#944FEE",
bgcolor: "white",
color: "#944FEE",
},
}}
>
Выбрать
</Button>
</Box>
</Box>
<Box
sx={{
...cardContainerSx,
position: "relative",
order: upLg ? 2 : 1,
}}
>
<Trails
style={{
position: "absolute",
top: "-64px",
left: "34px",
}}
/>
<Box
sx={{
...cardSx,
backgroundColor: "#7E2AEA",
position: "relative",
}}
>
<Typography variant="t1" color="white" fontWeight="500">
Бесплатно
</Typography>
<Typography
sx={{
color: "white",
mt: "30px",
fontWeight: 500,
fontSize: "36px",
lineHeight: "43px",
}}
>
0 руб.
</Typography>
<CustomList
sx={{
mt: "70px",
}}
icon={<CheckIcon bgcolor="white" lineColor="#7E2AEA" />}
items={["Просмотр количества кликов", "Сокращение, UTM-метки", "Экспорт статистики", "Пиксель"]}
/>
<Button
disableRipple
variant="template"
sx={{
color: "black",
backgroundColor: "white",
p: "9px 51.5px",
mt: "auto",
"&:hover": {
bgcolor: "white",
},
"&:active": {
bgcolor: "white",
},
}}
>
Выбрать
</Button>
</Box>
</Box>
<Box
sx={{
...cardContainerSx,
order: 3,
}}
>
<Box
sx={{
...cardSx,
height: "auto",
}}
>
<Typography variant="t1" color="#9B4FFD" fontWeight="500">
Скоро
</Typography>
<Typography
sx={{
color: "white",
mt: "30px",
fontWeight: 500,
fontSize: "36px",
lineHeight: "43px",
}}
>
В разработке
</Typography>
<CustomList
sx={{
mt: "72px",
ml: "5px",
}}
icon={<CircleIcon />}
items={["Продажа коротких ссылок", "Ручная генерация", "Брендирование", "Двойная ссылка"]}
/>
</Box>
</Box>
</Box>
</Section>
);
}
function CustomList({ items, sx, icon }: {
items: string[];
sx?: SxProps<Theme>;
icon: ReactNode;
}) {
return (
<List sx={{
color: "white",
width: "100%",
function CustomList({ items, sx, icon }: { items: string[]; sx?: SxProps<Theme>; icon: ReactNode }) {
return (
<List
sx={{
color: "white",
width: "100%",
p: 0,
display: "flex",
flexDirection: "column",
gap: "24px",
...sx,
}}
>
{items.map((text, index) => (
<ListItem
key={text}
sx={{
p: 0,
display: "flex",
flexDirection: "column",
gap: "24px",
...sx,
}}>
{items.map((text, index) => (
<ListItem
key={index}
sx={{
p: 0,
}}
>
<ListItemIcon sx={{
minWidth: "30px",
alignSelf: "start",
mt: "3px",
ml: "11px",
}}>
{icon}
</ListItemIcon>
<ListItemText
disableTypography
primary={<Typography variant="t1">{text}</Typography>}
sx={{
m: 0,
}}
/>
</ListItem>
))}
</List>
);
}
}}
>
<ListItemIcon
sx={{
minWidth: "30px",
alignSelf: "start",
mt: "3px",
ml: "11px",
}}
>
{icon}
</ListItemIcon>
<ListItemText
disableTypography
primary={<Typography variant="t1">{text}</Typography>}
sx={{
m: 0,
}}
/>
</ListItem>
))}
</List>
);
}

@ -1,89 +1,96 @@
import { MouseEventHandler, useState } from "react";
import { Typography, Button, Paper, SxProps, Theme, Box, IconButton } from "@mui/material";
import CustomTextField from "@root/kitUI/CustomTextField";
import CopyIcon from "@root/kitUI/Icons/CopyIcon";
import StatisticsIcon from "@root/kitUI/Icons/StatisticsIcon";
import { MouseEventHandler, useState } from "react";
interface Props {
link: {
id: string;
name: string;
link: string;
shortenedLink: string;
};
handleCopyClick?: MouseEventHandler<HTMLButtonElement>;
handleStatisticsClick?: MouseEventHandler<HTMLButtonElement>;
sx?: SxProps<Theme>;
link: {
id: string;
name: string;
link: string;
shortenedLink: string;
};
handleCopyClick?: MouseEventHandler<HTMLButtonElement>;
handleStatisticsClick?: MouseEventHandler<HTMLButtonElement>;
sx?: SxProps<Theme>;
}
export default function LinkCard({ link, handleCopyClick, handleStatisticsClick, sx }: Props) {
const [isOpened, setIsOpened] = useState<boolean>(false);
const [isOpened, setIsOpened] = useState<boolean>(false);
return (
<Paper
sx={{
p: "20px",
...sx,
}}
return (
<Paper
sx={{
p: "20px",
...sx,
}}
>
<Typography
variant="t1"
sx={{
fontWeight: 500,
minHeight: "calc(21.33px * 2)",
}}
>
{link.name}
</Typography>
<CustomTextField
multiline
maxRows={3}
disabled
value={link.link}
id={link.id}
inputColor="#4D4D4D"
sx={{ mt: "9px" }}
/>
<Button
disableRipple
variant="underlined"
onClick={() => setIsOpened((p) => !p)}
sx={{
mt: "30px",
mb: "3px",
"&:hover": {
bgcolor: "white",
},
}}
>
{`${isOpened ? "Скрыть" : "Показать"} сокращенную ссылку`}
</Button>
{isOpened && (
<Box
sx={{
display: "flex",
flexDirection: "column",
gap: "5px",
}}
>
<Typography
variant="t1"
sx={{
fontWeight: 500,
minHeight: "calc(21.33px * 2)",
}}
>
{link.name}
</Typography>
<CustomTextField
multiline
maxRows={3}
disabled
value={link.link}
id={link.id}
inputColor="#4D4D4D"
sx={{ mt: "9px" }}
/>
<Button
variant="underlined"
onClick={() => setIsOpened(p => !p)}
sx={{ mt: "30px", mb: "3px" }}
>
{`${isOpened ? "Скрыть" : "Показать"} сокращенную ссылку`}
</Button>
{isOpened &&
<Box sx={{
display: "flex",
flexDirection: "column",
gap: "5px",
}}>
<Typography
variant="t1"
sx={{
mt: "10px",
overflowWrap: "anywhere",
}}
>{link.shortenedLink}</Typography>
<Box sx={{
alignSelf: "end",
display: "flex",
}}>
<IconButton
onClick={handleCopyClick}
sx={{ p: "5px" }}
>
<CopyIcon />
</IconButton>
<IconButton
onClick={handleStatisticsClick}
sx={{ p: "5px" }}
>
<StatisticsIcon />
</IconButton>
</Box>
</Box>
}
</Paper>
);
}
<Typography
variant="t1"
sx={{
mt: "10px",
overflowWrap: "anywhere",
}}
>
{link.shortenedLink}
</Typography>
<Box
sx={{
alignSelf: "end",
display: "flex",
}}
>
<IconButton disableRipple onClick={handleCopyClick} sx={{ p: "5px" }}>
<CopyIcon />
</IconButton>
<IconButton disableRipple onClick={handleStatisticsClick} sx={{ p: "5px" }}>
<StatisticsIcon />
</IconButton>
</Box>
</Box>
)}
</Paper>
);
}

@ -1,84 +1,86 @@
import { Typography, Box, useMediaQuery, useTheme, Pagination } from "@mui/material";
import Section from "@root/kitUI/section";
import { useState } from "react";
import { Typography, Box, useMediaQuery, useTheme, Pagination } from "@mui/material";
import Section from "@root/kitUI/section";
import ColumnLayout from "./ColumnLayout";
import LinkCard from "./LinkCard";
const links = createExampleLinks(12);
export default function MyLinks() {
const theme = useTheme();
const upMd = useMediaQuery(theme.breakpoints.up("md"));
const [currentPage, setCurrentPage] = useState<number>(0);
const theme = useTheme();
const upMd = useMediaQuery(theme.breakpoints.up("md"));
const [currentPage, setCurrentPage] = useState<number>(0);
const pagination = (
<Pagination
shape="rounded"
count={5}
page={currentPage + 1}
onChange={(e, value) => setCurrentPage(value - 1)}
/>
);
const pagination = (
<Pagination
shape="rounded"
count={5}
page={currentPage + 1}
onChange={(event, value) => setCurrentPage(value - 1)}
/>
);
return (
<>
<Section
sxsect={{
pt: upMd ? "50px" : "40px",
pb: upMd ? "115px" : "20px",
}}
>
<Typography variant="h3">
Мои ссылки
</Typography>
{!upMd &&
<Box sx={{
display: "flex",
justifyContent: "center",
mt: "40px",
}}>
{pagination}
</Box>
}
<ColumnLayout sx={{
mt: !upMd ? "30px" : "40px",
}}>
{links.map((link) => (
<LinkCard
link={link}
key={link.id}
/>
))}
</ColumnLayout>
<Box sx={{
display: "flex",
justifyContent: upMd ? "end" : "center",
mt: "32px",
}}>
{pagination}
</Box>
</Section>
</>
);
return (
<>
<Section
sxsect={{
pt: upMd ? "50px" : "40px",
pb: upMd ? "115px" : "20px",
}}
>
<Typography variant="h3">Мои ссылки</Typography>
{!upMd && (
<Box
sx={{
display: "flex",
justifyContent: "center",
mt: "40px",
}}
>
{pagination}
</Box>
)}
<ColumnLayout
sx={{
mt: !upMd ? "30px" : "40px",
}}
>
{links.map((link) => (
<LinkCard link={link} key={link.id} />
))}
</ColumnLayout>
<Box
sx={{
display: "flex",
justifyContent: upMd ? "end" : "center",
mt: "32px",
}}
>
{pagination}
</Box>
</Section>
</>
);
}
function createExampleLinks(amount: number): {
id: string;
name: string;
link: string;
shortenedLink: string;
id: string;
name: string;
link: string;
shortenedLink: string;
}[] {
const links = [];
const names = ["Без названия", "Без названия", "Пена", "ФармКорп", "Очень длинное название ссылки на две строки"];
for (let i = 0; i < amount; i++) {
links.push({
id: `link-field-${i}`,
name: names[Math.floor(Math.random() * names.length)],
link: "https://link.fynrods.ru/?p=cfii5ug6bi7pt6s4ihr0utm_medium=cpc&utm_source=yandex&utm_campaign=Y_Brand_Search_Rus%7C70301404",
shortenedLink: "https://link.fynrods.ru/?p=cfii5ug6bi7pt6s4ihr0utm_medium=cpc",
});
}
const links = [];
const names = ["Без названия", "Без названия", "Пена", "ФармКорп", "Очень длинное название ссылки на две строки"];
for (let index = 0; index < amount; index++) {
links.push({
id: `link-field-${index}`,
name: names[Math.floor(Math.random() * names.length)],
link: "https://link.fynrods.ru/?p=cfii5ug6bi7pt6s4ihr0utm_medium=cpc&utm_source=yandex&utm_campaign=Y_Brand_Search_Rus%7C70301404",
shortenedLink: "https://link.fynrods.ru/?p=cfii5ug6bi7pt6s4ihr0utm_medium=cpc",
});
}
return links;
}
return links;
}

@ -3,62 +3,75 @@ import CustomTextField from "@root/kitUI/CustomTextField";
import CopyIcon from "@root/kitUI/Icons/CopyIcon";
import { MouseEventHandler } from "react";
interface Props {
sx?: SxProps<Theme>;
onChooseClick: MouseEventHandler<HTMLButtonElement>;
sx?: SxProps<Theme>;
onChooseClick: MouseEventHandler<HTMLButtonElement>;
}
export default function ChooseLink({ sx, onChooseClick }: Props) {
const theme = useTheme();
const upMd = useMediaQuery(theme.breakpoints.up("md"));
const theme = useTheme();
const upMd = useMediaQuery(theme.breakpoints.up("md"));
return (
<Paper sx={{
p: "20px",
...sx,
}}>
<Typography variant="h4">
Ваша сокращенная ссылка
</Typography>
<Box sx={{
mt: "30px",
display: "flex",
flexWrap: upMd ? undefined : "wrap",
justifyContent: "space-between",
alignItems: "center",
gap: upMd ? "4px" : "15px",
}}>
<CustomTextField
id="shortened-link"
placeholder="Выберите ссылку"
backgroundColor="#F2F3F7"
sx={{
width: "100%",
maxWidth: "670px",
flexGrow: 1,
flexBasis: upMd ? 0 : "100%",
order: 1,
}}
/>
<IconButton sx={{
order: upMd ? 2 : 3,
}}>
<CopyIcon />
</IconButton>
<Button
onClick={onChooseClick}
variant="template"
sx={{
p: "9px 31.5px",
ml: upMd ? "auto" : undefined,
flexGrow: 0,
order: upMd ? 3 : 2,
}}
>
Выбрать ссылку
</Button>
</Box>
</Paper>
);
}
return (
<Paper
sx={{
p: "20px",
...sx,
}}
>
<Typography variant="h4">Ваша сокращенная ссылка</Typography>
<Box
sx={{
mt: "30px",
display: "flex",
flexWrap: upMd ? undefined : "wrap",
justifyContent: "space-between",
alignItems: "center",
gap: upMd ? "4px" : "15px",
}}
>
<CustomTextField
id="shortened-link"
placeholder="Выберите ссылку"
backgroundColor="#F2F3F7"
sx={{
width: "100%",
maxWidth: "670px",
flexGrow: 1,
flexBasis: upMd ? 0 : "100%",
order: 1,
}}
/>
<IconButton
disableRipple
sx={{
order: upMd ? 2 : 3,
}}
>
<CopyIcon />
</IconButton>
<Button
disableRipple
onClick={onChooseClick}
variant="template"
sx={{
p: "9px 31.5px",
ml: upMd ? "auto" : undefined,
flexGrow: 0,
order: upMd ? 3 : 2,
"&:hover": {
bgcolor: "#944FEE",
},
"&:active": {
bgcolor: "white",
borderColor: "#944FEE",
color: "#944FEE",
},
}}
>
Выбрать ссылку
</Button>
</Box>
</Paper>
);
}

@ -2,42 +2,47 @@ import { Select, SelectChangeEvent } from "@mui/material";
import { ReactNode } from "react";
import SelectArrowIcon from "./SelectArrowIcon";
interface Props {
children: ReactNode;
id: string;
value: string;
onChange: (e: SelectChangeEvent) => void;
children: ReactNode;
id: string;
value: string;
onChange: (e: SelectChangeEvent) => void;
}
export default function CustomSelect({ children, id, onChange, value }: Props) {
return (
<Select
id={id}
variant="outlined"
displayEmpty
value={value}
onChange={onChange}
sx={{
color: "#7E2AEA",
backgroundColor: "white",
borderRadius: "8px",
"& fieldset": {
border: "none",
},
"& .MuiOutlinedInput-input": {
fontSize: "18px",
minHeight: "0 !important",
lineHeight: "24px",
pl: "33px",
pr: "56px !important",
py: "10px",
},
"& .MuiSelect-icon": {
right: "24px",
},
boxShadow: `
return (
<Select
id={id}
variant="outlined"
displayEmpty
value={value}
onChange={onChange}
sx={{
"&:hover": {
bgcolor: "#995BEE",
color: "white",
},
"&:hover path": {
stroke: "white",
},
color: "#7E2AEA",
backgroundColor: "white",
borderRadius: "8px",
"& fieldset": {
border: "none",
},
"& .MuiOutlinedInput-input": {
fontSize: "18px",
minHeight: "0 !important",
lineHeight: "24px",
pl: "33px",
pr: "56px !important",
py: "10px",
},
"& .MuiSelect-icon": {
right: "24px",
},
boxShadow: `
0px 100px 309px rgba(210, 208, 225, 0.24),
0px 41.7776px 129.093px rgba(210, 208, 225, 0.172525),
0px 22.3363px 69.0192px rgba(210, 208, 225, 0.143066),
@ -45,10 +50,10 @@ export default function CustomSelect({ children, id, onChange, value }: Props) {
0px 6.6501px 20.5488px rgba(210, 208, 225, 0.0969343),
0px 2.76726px 8.55082px rgba(210, 208, 225, 0.0674749)
`,
}}
IconComponent={props => <SelectArrowIcon {...props} />}
>
{children}
</Select>
);
}
}}
IconComponent={(props) => <SelectArrowIcon {...props} />}
>
{children}
</Select>
);
}

@ -1,20 +1,32 @@
import { Box } from "@mui/material";
export default function EditIcon() {
return (
<Box sx={{
width: "44px",
height: "44px",
display: "flex",
alignItems: "center",
justifyContent: "center",
flexShrink: 0,
}}>
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fillRule="evenodd" clipRule="evenodd" d="M13.5137 3.80583C14.5869 2.73107 16.3274 2.73041 17.4013 3.80435L19.8932 6.29621C20.958 7.36099 20.969 9.08475 19.918 10.1631L10.6849 19.6364C9.97933 20.3603 9.01167 20.7684 8.00124 20.7684L5.24909 20.7683C3.96984 20.7682 2.94823 19.7018 3.00203 18.4228L3.12019 15.6137C3.15968 14.6747 3.54996 13.7847 4.2138 13.1198L13.5137 3.80583ZM16.3415 4.86582C15.8533 4.37766 15.0622 4.37796 14.5744 4.86649L12.9113 6.53209L17.1911 10.8119L18.8446 9.11536C19.3224 8.62519 19.3173 7.84166 18.8333 7.35767L16.3415 4.86582ZM5.27446 14.1805L11.8514 7.59355L16.144 11.8862L9.61148 18.5886C9.18816 19.0229 8.60756 19.2678 8.0013 19.2678L5.24916 19.2677C4.82274 19.2677 4.4822 18.9122 4.50014 18.4859L4.61829 15.6768C4.64199 15.1134 4.87616 14.5794 5.27446 14.1805ZM20.5148 20.6951C20.9289 20.6951 21.2645 20.3592 21.2645 19.9448C21.2645 19.5304 20.9289 19.1945 20.5148 19.1945H14.3931C13.9791 19.1945 13.6434 19.5304 13.6434 19.9448C13.6434 20.3592 13.9791 20.6951 14.3931 20.6951H20.5148Z" fill="#7E2AEA" />
</svg>
</Box>
);
}
return (
<Box
sx={{
width: "44px",
height: "44px",
display: "flex",
alignItems: "center",
justifyContent: "center",
flexShrink: 0,
"&:hover": {
bgcolor: "#995DED",
borderRadius: "8px",
},
"&:hover path": {
fill: "white",
},
}}
>
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
fillRule="evenodd"
clipRule="evenodd"
d="M13.5137 3.80583C14.5869 2.73107 16.3274 2.73041 17.4013 3.80435L19.8932 6.29621C20.958 7.36099 20.969 9.08475 19.918 10.1631L10.6849 19.6364C9.97933 20.3603 9.01167 20.7684 8.00124 20.7684L5.24909 20.7683C3.96984 20.7682 2.94823 19.7018 3.00203 18.4228L3.12019 15.6137C3.15968 14.6747 3.54996 13.7847 4.2138 13.1198L13.5137 3.80583ZM16.3415 4.86582C15.8533 4.37766 15.0622 4.37796 14.5744 4.86649L12.9113 6.53209L17.1911 10.8119L18.8446 9.11536C19.3224 8.62519 19.3173 7.84166 18.8333 7.35767L16.3415 4.86582ZM5.27446 14.1805L11.8514 7.59355L16.144 11.8862L9.61148 18.5886C9.18816 19.0229 8.60756 19.2678 8.0013 19.2678L5.24916 19.2677C4.82274 19.2677 4.4822 18.9122 4.50014 18.4859L4.61829 15.6768C4.64199 15.1134 4.87616 14.5794 5.27446 14.1805ZM20.5148 20.6951C20.9289 20.6951 21.2645 20.3592 21.2645 19.9448C21.2645 19.5304 20.9289 19.1945 20.5148 19.1945H14.3931C13.9791 19.1945 13.6434 19.5304 13.6434 19.9448C13.6434 20.3592 13.9791 20.6951 14.3931 20.6951H20.5148Z"
fill="#7E2AEA"
/>
</svg>
</Box>
);
}

@ -9,110 +9,109 @@ import ChooseLink from "./ChooseLink";
import LinkStatTable from "./LinkStatTable";
import FilterIcon from "./FilterIcon";
const showTypeValues = ["Показать все", "Type value 2", "Type value 1", "Type value 3"] as const;
type ShowType = (typeof showTypeValues)[number];
const showTypeValues = [
"Показать все",
"Type value 2",
"Type value 1",
"Type value 3",
] as const;
type ShowType = typeof showTypeValues[number];
const filterValues = [
"Фильтр",
"Filter value 1",
"Filter value 2",
"Filter value 3",
] as const;
type FilterTypes = typeof filterValues[number];
const filterValues = ["Фильтр", "Filter value 1", "Filter value 2", "Filter value 3"] as const;
type FilterTypes = (typeof filterValues)[number];
export default function Stats() {
const theme = useTheme();
const upMd = useMediaQuery(theme.breakpoints.up("md"));
const [startDate, setStartDate] = useState<Dayjs | null>(dayjs("2023-02-09"));
const [endDate, setEndDate] = useState<Dayjs | null>(dayjs("2023-02-10"));
const [showTypeValue, setShowTypeValue] = useState<ShowType>("Показать все");
const [filterValue, setFilterValue] = useState<FilterTypes>("Фильтр");
const theme = useTheme();
const upMd = useMediaQuery(theme.breakpoints.up("md"));
const [startDate, setStartDate] = useState<Dayjs | null>(dayjs("2023-02-09"));
const [endDate, setEndDate] = useState<Dayjs | null>(dayjs("2023-02-10"));
const [showTypeValue, setShowTypeValue] = useState<ShowType>("Показать все");
const [filterValue, setFilterValue] = useState<FilterTypes>("Фильтр");
function handleChooseLink() {
function handleChooseLink() {}
}
return (
<>
<Section
sxsect={{
pt: upMd ? "50px" : "40px",
pb: upMd ? "100px" : "20px",
}}
return (
<>
<Section
sxsect={{
pt: upMd ? "50px" : "40px",
pb: upMd ? "100px" : "20px",
}}
>
<Typography variant="h3">Статистика</Typography>
<ChooseLink sx={{ mt: "35px" }} onChooseClick={handleChooseLink} />
<DateRangeSettings
startDate={startDate}
endDate={endDate}
onStartDateChange={(e) => setStartDate(e)}
onEndDateChange={(e) => setEndDate(e)}
sx={{
mt: upMd ? "30px" : "30px",
}}
/>
<Box
sx={{
mt: "40px",
display: "flex",
width: "100%",
gap: "20px",
}}
>
<CustomSelect
id="select-showall"
value={showTypeValue}
onChange={(e) => setShowTypeValue(e.target.value as ShowType)}
>
{showTypeValues.map((value) => (
<MenuItem key={value} value={value}>
{value}
</MenuItem>
))}
</CustomSelect>
{upMd ? (
<CustomSelect
id="select-filter"
value={filterValue}
onChange={(e) => setFilterValue(e.target.value as FilterTypes)}
>
<Typography variant="h3">
Статистика
</Typography>
<ChooseLink sx={{ mt: "35px" }} onChooseClick={handleChooseLink} />
<DateRangeSettings
startDate={startDate}
endDate={endDate}
onStartDateChange={e => setStartDate(e)}
onEndDateChange={e => setEndDate(e)}
sx={{
mt: upMd ? "30px" : "30px",
}}
/>
<Box sx={{
mt: "40px",
display: "flex",
width: "100%",
gap: "20px",
}}>
<CustomSelect
id="select-showall"
value={showTypeValue}
onChange={e => setShowTypeValue(e.target.value as ShowType)}
>
{showTypeValues.map(value =>
<MenuItem key={value} value={value}>{value}</MenuItem>
)}
</CustomSelect>
{upMd ?
<CustomSelect
id="select-filter"
value={filterValue}
onChange={e => setFilterValue(e.target.value as FilterTypes)}
>
{filterValues.map(value =>
<MenuItem key={value} value={value}>{value}</MenuItem>
)}
</CustomSelect>
:
<IconButton
component={Paper}
sx={{
p: 0,
ml: "5px",
borderRadius: "8px",
backgroundColor: "white",
}}
>
<FilterIcon />
</IconButton>
}
<IconButton
component={Paper}
sx={{
ml: "auto",
p: 0,
borderRadius: "8px",
backgroundColor: "white",
}}
>
<EditIcon />
</IconButton>
</Box>
<LinkStatTable sx={{
mt: upMd ? "20px" : "20px",
}} />
</Section>
</>
);
}
{filterValues.map((value) => (
<MenuItem key={value} value={value}>
{value}
</MenuItem>
))}
</CustomSelect>
) : (
<IconButton
disableRipple
component={Paper}
sx={{
p: 0,
ml: "5px",
borderRadius: "8px",
backgroundColor: "white",
"&:hover": {
bgcolor: "#995DED",
},
}}
>
<FilterIcon />
</IconButton>
)}
<IconButton
disableRipple
component={Paper}
sx={{
ml: "auto",
p: 0,
borderRadius: "8px",
backgroundColor: "white",
}}
>
<EditIcon />
</IconButton>
</Box>
<LinkStatTable
sx={{
mt: upMd ? "20px" : "20px",
}}
/>
</Section>
</>
);
}

@ -1,133 +1,133 @@
import { createTheme } from "@mui/material";
declare module '@mui/material/Button' {
interface ButtonPropsVariantOverrides {
template: true;
underlined: true;
}
declare module "@mui/material/Button" {
interface ButtonPropsVariantOverrides {
template: true;
underlined: true;
}
}
declare module '@mui/material/styles/zIndex.d' {
interface ZIndex {
bubbles: number,
content: number,
header: number,
}
declare module "@mui/material/styles/zIndex.d" {
interface ZIndex {
bubbles: number;
content: number;
header: number;
}
}
declare module '@mui/material/Typography' {
interface TypographyPropsVariantOverrides {
t1: true;
}
declare module "@mui/material/Typography" {
interface TypographyPropsVariantOverrides {
t1: true;
}
}
const theme = createTheme({
palette: {
background: {
default: "#F2F3F7",
}
palette: {
background: {
default: "#F2F3F7",
},
breakpoints: {
values: {
xs: 460,
sm: 600,
md: 680,
lg: 900,
xl: 1000,
}
},
typography: {
fontFamily: 'Rubik',
},
breakpoints: {
values: {
xs: 460,
sm: 600,
md: 680,
lg: 900,
xl: 1000,
},
},
typography: {
fontFamily: "Rubik",
},
components: {
MuiButton: {
variants: [
{
props: {
variant: "template"
},
style: {
background: '#7E2AEA',
border: '1px solid #7E2AEA',
borderRadius: '8px',
padding: '15px 56px',
textTransform: 'none',
color: '#ffffff',
fontWeight: 400,
fontSize: '18px',
lineHeight: '24px'
},
},
{
props: {
variant: "underlined"
},
style: {
color: "#7E2AEA",
padding: 0,
textTransform: "none",
textDecoration: "underline",
textUnderlineOffset: "7px",
fontSize: "16px",
lineHeight: "20px",
}
}
],
components: {
MuiButton: {
variants: [
{
props: {
variant: "template",
},
style: {
background: "#7E2AEA",
border: "1px solid #7E2AEA",
borderRadius: "8px",
padding: "15px 56px",
textTransform: "none",
color: "#ffffff",
fontWeight: 400,
fontSize: "18px",
lineHeight: "24px",
},
},
MuiTypography: {
variants: [
{
props: {
variant: 'h1'
},
style: {
color: '#000000',
fontWeight: 500,
fontSize: '70px',
lineHeight: '100%',
},
},
{
props: {
variant: 'h3'
},
style: {
color: '#000000',
fontWeight: 500,
fontSize: '36px',
lineHeight: '100%',
},
},
{
props: {
variant: 'h4'
},
style: {
color: '#000000',
fontWeight: 500,
fontSize: "24px",
lineHeight: "100%",
},
},
{
props: {
variant: 't1'
},
style: {
display: "block",
fontWeight: 400,
fontSize: "18px",
lineHeight: "21.33px",
},
},
],
{
props: {
variant: "underlined",
},
style: {
color: "#7E2AEA",
padding: 0,
textTransform: "none",
textDecoration: "underline",
textUnderlineOffset: "7px",
fontSize: "16px",
lineHeight: "20px",
},
},
MuiPaper: {
styleOverrides: {
root: {
backgroundColor: "white",
borderRadius: "12px",
boxShadow: `
],
},
MuiTypography: {
variants: [
{
props: {
variant: "h1",
},
style: {
color: "#000000",
fontWeight: 500,
fontSize: "70px",
lineHeight: "100%",
},
},
{
props: {
variant: "h3",
},
style: {
color: "#000000",
fontWeight: 500,
fontSize: "36px",
lineHeight: "100%",
},
},
{
props: {
variant: "h4",
},
style: {
color: "#000000",
fontWeight: 500,
fontSize: "24px",
lineHeight: "100%",
},
},
{
props: {
variant: "t1",
},
style: {
display: "block",
fontWeight: 400,
fontSize: "18px",
lineHeight: "21.33px",
},
},
],
},
MuiPaper: {
styleOverrides: {
root: {
backgroundColor: "white",
borderRadius: "12px",
boxShadow: `
0px 100px 309px rgba(210, 208, 225, 0.24),
0px 41.7776px 129.093px rgba(210, 208, 225, 0.172525),
0px 22.3363px 69.0192px rgba(210, 208, 225, 0.143066),
@ -135,69 +135,70 @@ const theme = createTheme({
0px 6.6501px 20.5488px rgba(210, 208, 225, 0.0969343),
0px 2.76726px 8.55082px rgba(210, 208, 225, 0.0674749)
`,
},
}
},
MuiSwitch: {
styleOverrides: {
root: {
color: "#7E2AEA",
height: "50px",
width: "69px",
"& .MuiSwitch-switchBase.Mui-checked+.MuiSwitch-track": {
backgroundColor: "#7E2AEA",
opacity: 1,
}
},
track: {
height: "12px",
alignSelf: "center",
backgroundColor: "#00000000",
opacity: 1,
border: "1px solid #9A9AAF",
},
thumb: {
height: "32px",
width: "32px",
border: `6px solid #7E2AEA`,
backgroundColor: "white",
boxShadow: `0px 0px 0px 3px white,
},
},
MuiSwitch: {
styleOverrides: {
root: {
color: "#7E2AEA",
height: "50px",
width: "69px",
"& .MuiSwitch-switchBase.Mui-checked+.MuiSwitch-track": {
backgroundColor: "#7E2AEA",
opacity: 1,
},
},
track: {
height: "12px",
alignSelf: "center",
backgroundColor: "#00000000",
opacity: 1,
border: "1px solid #9A9AAF",
},
thumb: {
height: "32px",
width: "32px",
border: `6px solid #7E2AEA`,
backgroundColor: "white",
boxShadow: `0px 0px 0px 3px white,
0px 4px 4px 3px #C3C8DD
`,
"&:focus, &:hover, &.Mui-active, &.Mui-focusVisible": {
boxShadow: `0px 0px 0px 3px white,
"&:focus, &:hover, &.Mui-active, &.Mui-focusVisible": {
boxShadow: `0px 0px 0px 3px white,
0px 4px 4px 3px #C3C8DD
`,
},
}
}
},
},
MuiPagination: {
styleOverrides: {
root: {
marginRight: "-15px",
marginLeft: "-15px",
"& .MuiPaginationItem-root": {
height: "30px",
width: "30px",
minWidth: "30px",
marginLeft: "5px",
marginRight: "5px",
backgroundColor: "white",
color: "black",
fontSize: "16px",
lineHeight: "20px",
fontWeight: 400,
borderRadius: "5px",
"&.Mui-selected": {
backgroundColor: "white",
color: "#7E2AEA",
fontWeight: 500,
},
"&:hover": {
backgroundColor: "#ffffff55",
},
boxShadow: `
},
},
MuiPagination: {
styleOverrides: {
root: {
marginRight: "-15px",
marginLeft: "-15px",
"& .MuiPaginationItem-root": {
height: "30px",
width: "30px",
minWidth: "30px",
marginLeft: "5px",
marginRight: "5px",
backgroundColor: "white",
color: "black",
fontSize: "16px",
lineHeight: "20px",
fontWeight: 400,
borderRadius: "5px",
"&.Mui-selected": {
backgroundColor: "white",
color: "#7E2AEA",
fontWeight: 500,
},
"&:hover": {
backgroundColor: "#ffffff55",
},
boxShadow: `
0px 77.2727px 238.773px rgba(210, 208, 225, 0.24),
0px 32.2827px 99.7535px rgba(210, 208, 225, 0.172525),
0px 17.2599px 53.333px rgba(210, 208, 225, 0.143066),
@ -205,46 +206,46 @@ const theme = createTheme({
0px 5.13872px 15.8786px rgba(210, 208, 225, 0.0969343),
0px 2.13833px 6.60745px rgba(210, 208, 225, 0.0674749)
`,
},
"& .MuiPaginationItem-previousNext": {
backgroundColor: "#7E2AEA",
color: "white",
marginLeft: "15px",
marginRight: "15px",
"&:hover": {
backgroundColor: "#5e00d8",
}
},
}
}
}
},
"& .MuiPaginationItem-previousNext": {
backgroundColor: "#7E2AEA",
color: "white",
marginLeft: "15px",
marginRight: "15px",
"&:hover": {
backgroundColor: "#5e00d8",
},
},
},
},
},
zIndex: {
bubbles: 0,
content: 1,
header: 10,
}
},
zIndex: {
bubbles: 0,
content: 1,
header: 10,
},
});
theme.typography.h1 = {
[theme.breakpoints.down('md')]: {
fontSize: "36px",
lineHeight: "100%",
}
[theme.breakpoints.down("md")]: {
fontSize: "36px",
lineHeight: "100%",
},
};
theme.typography.h3 = {
[theme.breakpoints.down('md')]: {
fontSize: "30px",
lineHeight: "100%",
}
[theme.breakpoints.down("md")]: {
fontSize: "30px",
lineHeight: "100%",
},
};
theme.typography.h4 = {
[theme.breakpoints.down('md')]: {
fontSize: "21px",
lineHeight: "100%",
}
[theme.breakpoints.down("md")]: {
fontSize: "21px",
lineHeight: "100%",
},
};
export default theme;
export default theme;

102
yarn.lock

@ -1042,6 +1042,13 @@
dependencies:
regenerator-runtime "^0.13.11"
"@babel/runtime@^7.21.0":
version "7.21.5"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.5.tgz#8492dddda9644ae3bda3b45eabe87382caee7200"
integrity sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==
dependencies:
regenerator-runtime "^0.13.11"
"@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.3.3":
version "7.20.7"
resolved "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz"
@ -1206,18 +1213,11 @@
resolved "https://registry.npmjs.org/@date-io/core/-/core-1.3.13.tgz"
integrity sha512-AlEKV7TxjeK+jxWVKcCFrfYAk8spX9aCyiToFIiLPtfQbsjmRGLIhb5VZgptQcJdHtLXo7+m0DuurwFgUToQuA==
"@date-io/core@^2.15.0", "@date-io/core@^2.16.0":
"@date-io/core@^2.16.0":
version "2.16.0"
resolved "https://registry.npmjs.org/@date-io/core/-/core-2.16.0.tgz"
integrity sha512-DYmSzkr+jToahwWrsiRA2/pzMEtz9Bq1euJwoOuYwuwIYXnZFtHajY2E6a1VNVDc9jP8YUXK1BvnZH9mmT19Zg==
"@date-io/date-fns@^2.15.0":
version "2.16.0"
resolved "https://registry.npmjs.org/@date-io/date-fns/-/date-fns-2.16.0.tgz"
integrity sha512-bfm5FJjucqlrnQcXDVU5RD+nlGmL3iWgkHTq3uAZWVIuBu6dDmGa3m8a6zo2VQQpu8ambq9H22UyUpn7590joA==
dependencies:
"@date-io/core" "^2.16.0"
"@date-io/dayjs@^2.15.0":
version "2.16.0"
resolved "https://registry.npmjs.org/@date-io/dayjs/-/dayjs-2.16.0.tgz"
@ -1225,20 +1225,6 @@
dependencies:
"@date-io/core" "^2.16.0"
"@date-io/luxon@^2.15.0":
version "2.16.1"
resolved "https://registry.npmjs.org/@date-io/luxon/-/luxon-2.16.1.tgz"
integrity sha512-aeYp5K9PSHV28946pC+9UKUi/xMMYoaGelrpDibZSgHu2VWHXrr7zWLEr+pMPThSs5vt8Ei365PO+84pCm37WQ==
dependencies:
"@date-io/core" "^2.16.0"
"@date-io/moment@^2.15.0":
version "2.16.1"
resolved "https://registry.npmjs.org/@date-io/moment/-/moment-2.16.1.tgz"
integrity sha512-JkxldQxUqZBfZtsaCcCMkm/dmytdyq5pS1RxshCQ4fHhsvP5A7gSqPD22QbVXMcJydi3d3v1Y8BQdUKEuGACZQ==
dependencies:
"@date-io/core" "^2.16.0"
"@emotion/babel-plugin@^11.10.6":
version "11.10.6"
resolved "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz"
@ -1715,6 +1701,11 @@
"@jridgewell/resolve-uri" "3.1.0"
"@jridgewell/sourcemap-codec" "1.4.14"
"@kurkle/color@^0.3.0":
version "0.3.2"
resolved "https://registry.yarnpkg.com/@kurkle/color/-/color-0.3.2.tgz#5acd38242e8bde4f9986e7913c8fdf49d3aa199f"
integrity sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==
"@leichtgewicht/ip-codec@^2.0.1":
version "2.0.4"
resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz"
@ -1833,6 +1824,17 @@
prop-types "^15.8.1"
react-is "^18.2.0"
"@mui/utils@^5.12.0":
version "5.12.0"
resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.12.0.tgz#284db48b36ac26f3d34076379072c1dc8aed1ad0"
integrity sha512-RmQwgzF72p7Yr4+AAUO6j1v2uzt6wr7SWXn68KBsnfVpdOHyclCzH2lr/Xu6YOw9su4JRtdAIYfJFXsS6Cjkmw==
dependencies:
"@babel/runtime" "^7.21.0"
"@types/prop-types" "^15.7.5"
"@types/react-is" "^16.7.1 || ^17.0.0"
prop-types "^15.8.1"
react-is "^18.2.0"
"@mui/x-data-grid-generator@^5.17.5":
version "5.17.24"
resolved "https://registry.npmjs.org/@mui/x-data-grid-generator/-/x-data-grid-generator-5.17.24.tgz"
@ -1886,23 +1888,17 @@
prop-types "^15.8.1"
reselect "^4.1.6"
"@mui/x-date-pickers@^5.0.3":
version "5.0.19"
resolved "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-5.0.19.tgz"
integrity sha512-D8zFyFgwA6faPCTM//3SG17RqCegczKQS9wF/toemhjsP7Ps4ape/llHqowL/BZLbi14OXV0Ud10tfUyVP7Q/Q==
"@mui/x-date-pickers@^6.0.2":
version "6.3.0"
resolved "https://registry.yarnpkg.com/@mui/x-date-pickers/-/x-date-pickers-6.3.0.tgz#398cfe5bb2cd21ab3900cb3b3708bb2e4af6295c"
integrity sha512-Qux/nRGb0HueZU4L0h1QEqmORCrpgLukWWhG1Im6cFCmLtZbBey/0JuAFRa+OgvIXgGktDt8SY/FYsRkfGt2TQ==
dependencies:
"@babel/runtime" "^7.18.9"
"@date-io/core" "^2.15.0"
"@date-io/date-fns" "^2.15.0"
"@date-io/dayjs" "^2.15.0"
"@date-io/luxon" "^2.15.0"
"@date-io/moment" "^2.15.0"
"@mui/utils" "^5.10.3"
"@babel/runtime" "^7.21.0"
"@mui/utils" "^5.12.0"
"@types/react-transition-group" "^4.4.5"
clsx "^1.2.1"
prop-types "^15.7.2"
prop-types "^15.8.1"
react-transition-group "^4.4.5"
rifm "^0.12.1"
"@mui/x-license-pro@5.17.12":
version "5.17.12"
@ -4029,6 +4025,25 @@ char-regex@^2.0.0:
resolved "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz"
integrity sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==
chart.js@^4.2.1:
version "4.3.0"
resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-4.3.0.tgz#ac363030ab3fec572850d2d872956f32a46326a1"
integrity sha512-ynG0E79xGfMaV2xAHdbhwiPLczxnNNnasrmPEXriXsPJGjmhOBYzFVEsB65w2qMDz+CaBJJuJD0inE/ab/h36g==
dependencies:
"@kurkle/color" "^0.3.0"
chartjs-adapter-dayjs-4@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/chartjs-adapter-dayjs-4/-/chartjs-adapter-dayjs-4-1.0.4.tgz#4e810c99d9f28c07364381317d01f1bc504c5b2e"
integrity sha512-yy9BAYW4aNzPVrCWZetbILegTRb7HokhgospPoC3b5iZ5qdlqNmXts2KdSp6AqnjkPAp/YWyHDxLvIvwt5x81w==
chartjs-plugin-zoom@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/chartjs-plugin-zoom/-/chartjs-plugin-zoom-2.0.1.tgz#3db76f92a4741e46cb148cb966181c1b1a974abc"
integrity sha512-ogOmLu6e+Q7E1XWOCOz9YwybMslz9qNfGV2a+qjfmqJYpsw5ZMoRHZBUyW+NGhkpQ5PwwPA/+rikHpBZb7PZuA==
dependencies:
hammerjs "^2.0.8"
check-types@^11.1.1:
version "11.2.2"
resolved "https://registry.npmjs.org/check-types/-/check-types-11.2.2.tgz"
@ -6310,6 +6325,11 @@ gzip-size@^6.0.0:
dependencies:
duplexer "^0.1.2"
hammerjs@^2.0.8:
version "2.0.8"
resolved "https://registry.yarnpkg.com/hammerjs/-/hammerjs-2.0.8.tgz#04ef77862cff2bb79d30f7692095930222bf60f1"
integrity sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==
handle-thing@^2.0.0:
version "2.0.1"
resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz"
@ -9603,7 +9623,7 @@ prompts@^2.0.1, prompts@^2.4.2:
kleur "^3.0.3"
sisteransi "^1.0.5"
prop-types@^15.5.10, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1:
prop-types@^15.5.10, prop-types@^15.6.2, prop-types@^15.8.1:
version "15.8.1"
resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz"
integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
@ -9768,6 +9788,11 @@ react-app-polyfill@^3.0.0:
regenerator-runtime "^0.13.9"
whatwg-fetch "^3.6.2"
react-chartjs-2@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/react-chartjs-2/-/react-chartjs-2-5.2.0.tgz#43c1e3549071c00a1a083ecbd26c1ad34d385f5d"
integrity sha512-98iN5aguJyVSxp5U3CblRLH67J8gkfyGNbiK3c+l1QI/G4irHMPQw44aEPmjVag+YKTyQ260NcF82GTQ3bdscA==
react-dev-utils@^12.0.1:
version "12.0.1"
resolved "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz"
@ -10221,11 +10246,6 @@ reusify@^1.0.4:
resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz"
integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
rifm@^0.12.1:
version "0.12.1"
resolved "https://registry.npmjs.org/rifm/-/rifm-0.12.1.tgz"
integrity sha512-OGA1Bitg/dSJtI/c4dh90svzaUPt228kzFsUkJbtA2c964IqEAwWXeL9ZJi86xWv3j5SMqRvGULl7bA6cK0Bvg==
rifm@^0.7.0:
version "0.7.0"
resolved "https://registry.npmjs.org/rifm/-/rifm-0.7.0.tgz"