(theme.palette.mode === "dark" ? "neutral.700" : "neutral.300"),
+ borderRadius: "50%",
+ borderStyle: "solid",
+ borderWidth: 2,
+ height: 36,
+ width: 36,
+ }}
+ />
+ );
+};
+
+export const WizardSteps = (props) => {
+ const { activeStep = 1, orientation = "vertical", steps = [] } = props;
+
+ return (
+
+ }
+ >
+ {steps.map((step) => (
+
+
+ {step.title}
+
+ {step.description}
+
+
+
+ ))}
+
+
+ );
+};
+
+WizardSteps.propTypes = {
+ activeStep: PropTypes.number,
+ orientation: PropTypes.oneOf(["vertical", "horizontal"]),
+ steps: PropTypes.array,
+};
diff --git a/src/components/PrivateRoute.js b/src/components/PrivateRoute.js
new file mode 100644
index 000000000000..178e1f955300
--- /dev/null
+++ b/src/components/PrivateRoute.js
@@ -0,0 +1,27 @@
+import { useLoadClientPrincipalQuery } from "../store/api/auth.js";
+import UnauthenticatedPage from "../pages/unauthenticated.js";
+
+export const PrivateRoute = ({ children, routeType }) => {
+ const { data: profile, error, isFetching } = useLoadClientPrincipalQuery();
+ if (isFetching) {
+ return "Loading...";
+ }
+
+ let roles = null;
+ if (null !== profile?.clientPrincipal) {
+ roles = profile?.clientPrincipal.userRoles;
+ } else if (null === profile?.clientPrincipal) {
+ return ;
+ }
+ if (null === roles) {
+ return ;
+ } else {
+ const isAuthenticated = roles.includes("authenticated") && !error;
+ const isAdmin = roles.includes("admin");
+ if (routeType === "admin") {
+ return !isAdmin ? : children;
+ } else {
+ return !isAuthenticated ? : children;
+ }
+ }
+};
diff --git a/src/components/action-list-item.js b/src/components/action-list-item.js
new file mode 100644
index 000000000000..17bcebdc6e3e
--- /dev/null
+++ b/src/components/action-list-item.js
@@ -0,0 +1,18 @@
+import PropTypes from "prop-types";
+import { ListItemButton, ListItemIcon, ListItemText } from "@mui/material";
+
+export const ActionListItem = (props) => {
+ const { icon, label, ...other } = props;
+
+ return (
+
+ {icon && {icon} }
+
+
+ );
+};
+
+ActionListItem.propTypes = {
+ icon: PropTypes.node,
+ label: PropTypes.string.isRequired,
+};
diff --git a/src/components/action-list.js b/src/components/action-list.js
new file mode 100644
index 000000000000..693b3d812e38
--- /dev/null
+++ b/src/components/action-list.js
@@ -0,0 +1,23 @@
+import PropTypes from 'prop-types';
+import { List } from '@mui/material';
+
+export const ActionList = (props) => {
+ const { children } = props;
+
+ return (
+ theme.palette.mode === 'dark'
+ ? 'neutral.900'
+ : 'neutral.50'
+ }}
+ >
+ {children}
+
+ );
+};
+
+ActionList.propTypes = {
+ children: PropTypes.node
+};
diff --git a/src/components/actions-menu.js b/src/components/actions-menu.js
new file mode 100644
index 000000000000..3c6d8a34abdd
--- /dev/null
+++ b/src/components/actions-menu.js
@@ -0,0 +1,57 @@
+import ChevronDownIcon from '@heroicons/react/24/outline/ChevronDownIcon';
+import PropTypes from 'prop-types';
+import { Button, Menu, MenuItem, SvgIcon } from '@mui/material';
+import { usePopover } from '../hooks/use-popover';
+
+export const ActionsMenu = (props) => {
+ const { actions = [], label = 'Actions', ...other } = props;
+ const popover = usePopover();
+
+ return (
+ <>
+
+
+
+ )}
+ onClick={popover.handleOpen}
+ ref={popover.anchorRef}
+ size="large"
+ variant="contained"
+ {...other}>
+ {label}
+
+
+ {actions.map((item) => (
+ {
+ popover.handleClose();
+ item.handler?.();
+ }}
+ >
+ {item.label}
+
+ ))}
+
+ >
+ );
+};
+
+ActionsMenu.propTypes = {
+ actions: PropTypes.array,
+ label: PropTypes.string
+};
diff --git a/src/components/bulk-actions-menu.js b/src/components/bulk-actions-menu.js
new file mode 100644
index 000000000000..9c4e39c4b310
--- /dev/null
+++ b/src/components/bulk-actions-menu.js
@@ -0,0 +1,73 @@
+import PropTypes from "prop-types";
+import ChevronDownIcon from "@heroicons/react/24/outline/ChevronDownIcon";
+import { Button, ListItemText, Menu, MenuItem, SvgIcon } from "@mui/material";
+import { usePopover } from "../../hooks/use-popover";
+import { ApiPostCall } from "../api/ApiCall";
+
+export const BulkActionsMenu = (props) => {
+ const { disabled, onArchive, onDelete, selectedCount = 0, sx, row, actions, ...other } = props;
+ console.log(row);
+ const popover = usePopover();
+ const deleteRequest = ApiPostCall({
+ url: "/api/DeleteDevices",
+ relatedQueryKeys: "Clients",
+ });
+ return (
+ <>
+
+
+
+ }
+ variant="outlined"
+ sx={{
+ flexShrink: 0,
+ whiteSpace: "nowrap",
+ ...sx,
+ }}
+ {...other}
+ >
+ Bulk Actions
+
+
+
+ deleteRequest.mutate({
+ ids: row.map((row) => row.original.RowKey),
+ })
+ }
+ sx={{ borderRadius: 1 }}
+ >
+ Delete ({selectedCount})
+
+
+ >
+ );
+};
+
+BulkActionsMenu.propTypes = {
+ disabled: PropTypes.bool,
+ onArchive: PropTypes.func,
+ onDelete: PropTypes.func,
+ selectedCount: PropTypes.number,
+};
diff --git a/src/components/chart.js b/src/components/chart.js
new file mode 100644
index 000000000000..a5a71dbbb479
--- /dev/null
+++ b/src/components/chart.js
@@ -0,0 +1,9 @@
+import dynamic from 'next/dynamic';
+import { styled } from '@mui/material/styles';
+
+const ApexChart = dynamic(() => import('react-apexcharts'), {
+ ssr: false,
+ loading: () => null
+});
+
+export const Chart = styled(ApexChart)({});
diff --git a/src/components/confirmation-dialog.js b/src/components/confirmation-dialog.js
new file mode 100644
index 000000000000..fcd629bc9224
--- /dev/null
+++ b/src/components/confirmation-dialog.js
@@ -0,0 +1,104 @@
+import PropTypes from 'prop-types';
+import ExclamationCircleIcon from '@heroicons/react/24/outline/ExclamationCircleIcon';
+import ExclamationTriangleIcon from '@heroicons/react/24/outline/ExclamationTriangleIcon';
+import {
+ Button,
+ Dialog,
+ DialogActions,
+ DialogContent,
+ DialogTitle,
+ Stack,
+ SvgIcon,
+ Typography
+} from '@mui/material';
+
+const iconMap = {
+ error: (
+
+
+
+ ),
+ warning: (
+
+
+
+ ),
+ info: (
+
+
+
+ )
+};
+
+export const ConfirmationDialog = (props) => {
+ const {
+ message = '',
+ onCancel,
+ onConfirm,
+ open = false,
+ title,
+ variant = 'info',
+ ...other
+ } = props;
+
+ const icon = iconMap[variant];
+
+ return (
+
+
+
+ {icon}
+
+ {title}
+
+
+
+
+
+ {message}
+
+
+
+
+ Cancel
+
+
+ Confirm
+
+
+
+ );
+};
+
+ConfirmationDialog.propTypes = {
+ message: PropTypes.string,
+ onCancel: PropTypes.func,
+ onConfirm: PropTypes.func,
+ open: PropTypes.bool,
+ title: PropTypes.string,
+ variant: PropTypes.oneOf(['error', 'warning', 'info'])
+};
diff --git a/src/components/csvExportButton.js b/src/components/csvExportButton.js
new file mode 100644
index 000000000000..9801534a3e6f
--- /dev/null
+++ b/src/components/csvExportButton.js
@@ -0,0 +1,25 @@
+import { BackupTableTwoTone } from "@mui/icons-material";
+import { IconButton, Tooltip } from "@mui/material";
+import { mkConfig, generateCsv, download } from "export-to-csv"; //or use your library of choice here
+const csvConfig = mkConfig({
+ fieldSeparator: ",",
+ decimalSeparator: ".",
+ useKeysAsHeaders: true,
+});
+
+export const CSVExportButton = (props) => {
+ const { rows, columns, reportName } = props;
+
+ const handleExportRows = (rows) => {
+ const rowData = rows.map((row) => row.original);
+ const csv = generateCsv(csvConfig)(rowData);
+ download(csvConfig)(csv);
+ };
+ return (
+
+ handleExportRows(rows)}>
+
+
+
+ );
+};
diff --git a/src/components/file-dropzone.js b/src/components/file-dropzone.js
new file mode 100644
index 000000000000..166f57cce23f
--- /dev/null
+++ b/src/components/file-dropzone.js
@@ -0,0 +1,80 @@
+import PropTypes from 'prop-types';
+import { useDropzone } from 'react-dropzone';
+import ArrowUpOnSquareIcon from '@heroicons/react/24/outline/ArrowUpOnSquareIcon';
+import { Avatar, Box, SvgIcon, Typography } from '@mui/material';
+
+export const FileDropzone = (props) => {
+ const { accept, caption, maxFiles, maxSize, minSize, onDrop, sx } = props;
+ const { getRootProps, getInputProps, isDragActive } = useDropzone({
+ accept,
+ maxFiles,
+ maxSize,
+ minSize,
+ onDrop
+ });
+
+ return (
+ theme.palette.mode === 'dark'
+ ? 'neutral.800'
+ : 'neutral.200',
+ borderRadius: 1,
+ borderStyle: 'dashed',
+ borderWidth: 1,
+ cursor: 'pointer',
+ display: 'flex',
+ flexDirection: 'column',
+ flexWrap: 'wrap',
+ justifyContent: 'center',
+ outline: 'none',
+ width: '100%',
+ py: 2,
+ ...(isDragActive && {
+ borderColor: 'primary.main',
+ backgroundColor: 'action.hover'
+ }),
+ '&:hover': {
+ borderColor: 'primary.main',
+ backgroundColor: 'action.hover'
+ },
+ ...sx
+ }}
+ {...getRootProps()}>
+
+
+
+
+
+ {caption && (
+
+ {caption}
+
+ )}
+
+
+ );
+};
+
+FileDropzone.propTypes = {
+ accept: PropTypes.objectOf(PropTypes.arrayOf(PropTypes.string)),
+ caption: PropTypes.string,
+ maxFiles: PropTypes.number,
+ maxSize: PropTypes.number,
+ minSize: PropTypes.number,
+ onDrop: PropTypes.func,
+ sx: PropTypes.object
+};
diff --git a/src/components/filter-dialog-item.js b/src/components/filter-dialog-item.js
new file mode 100644
index 000000000000..82c1ef3c71b1
--- /dev/null
+++ b/src/components/filter-dialog-item.js
@@ -0,0 +1,148 @@
+import { useMemo } from 'react';
+import PropTypes from 'prop-types';
+import PlusIcon from '@heroicons/react/24/outline/PlusIcon';
+import { Button, FilledInput, MenuItem, Select, Stack, TextField, Typography } from '@mui/material';
+import { DatePicker } from '@mui/x-date-pickers';
+
+export const FilterDialogItem = (props) => {
+ const {
+ disableAdd = false,
+ displayAdd = false,
+ filter,
+ index = 0,
+ onAdd,
+ onOperatorChange,
+ onPropertyChange,
+ onRemoveFilter,
+ onValueChange,
+ operators = [],
+ properties = []
+ } = props;
+
+ const property = useMemo(() => {
+ return properties.find((property) => property.name === filter.property);
+ }, [filter, properties]);
+
+ const operator = useMemo(() => {
+ return operators.find((operator) => operator.name === filter.operator);
+ }, [filter, operators]);
+
+ const operatorOptions = useMemo(() => {
+ return (property?.operators || [])
+ .map((name) => operators.find((operator) => operator.name === name))
+ .filter((operator) => !!operator);
+ }, [property, operators]);
+
+ return (
+
+
+ Where
+
+
+
+ onPropertyChange?.(index, event.target.value)}
+ value={filter.property || ''}
+ >
+ {properties.map((property) => (
+
+ {property.label}
+
+ ))}
+
+ onOperatorChange?.(index, event.target.value)}
+ value={operator?.name || ''}
+ >
+ {operatorOptions.map((operator) => (
+
+ {operator.label}
+
+ ))}
+
+
+ {operator?.field === 'date' && (
+ {
+ if (date) {
+ onValueChange?.(index, date);
+ }
+ }}
+ renderInput={(inputProps) => (
+
+ )}
+ value={filter.value || null}
+ />
+ )}
+ {operator?.field === 'string' && (
+ onValueChange?.(index, event.target.value)}
+ value={filter.value || ''}
+ />
+ )}
+ {operator?.field === 'number' && (
+ onValueChange?.(index, event.target.value)}
+ value={filter.value || ''}
+ />
+ )}
+
+
+ {displayAdd && (
+ onAdd?.(index + 1)}
+ size="small"
+ startIcon={ }
+ >
+ Add
+
+ )}
+ onRemoveFilter?.(index)}
+ size="small"
+ >
+ Remove
+
+
+
+ );
+};
+
+FilterDialogItem.propTypes = {
+ disableAdd: PropTypes.bool,
+ displayAdd: PropTypes.bool,
+ filter: PropTypes.object.isRequired,
+ index: PropTypes.number,
+ onAdd: PropTypes.func,
+ onOperatorChange: PropTypes.func,
+ onPropertyChange: PropTypes.func,
+ onRemoveFilter: PropTypes.func,
+ onValueChange: PropTypes.func,
+ operators: PropTypes.array,
+ properties: PropTypes.array
+};
diff --git a/src/components/filter-dialog.js b/src/components/filter-dialog.js
new file mode 100644
index 000000000000..e2836374c8cf
--- /dev/null
+++ b/src/components/filter-dialog.js
@@ -0,0 +1,134 @@
+import { useCallback } from 'react';
+import PropTypes from 'prop-types';
+import XMarkIcon from '@heroicons/react/24/outline/XMarkIcon';
+import {
+ Button,
+ Chip,
+ Dialog,
+ DialogActions,
+ DialogContent,
+ DialogTitle,
+ Divider,
+ IconButton,
+ Stack,
+ SvgIcon,
+ Typography
+} from '@mui/material';
+import { useFilters } from '../hooks/use-filters';
+import { FilterDialogItem } from './filter-dialog-item';
+
+export const FilterDialog = (props) => {
+ const {
+ // Initial filters, we use the controlled state
+ filters = [], onApply, onClear, onClose, open = false, operators = [], properties = []
+ } = props;
+ const filtersController = useFilters(operators, properties, filters);
+
+ const handleApply = useCallback(() => {
+ // Allow the apply action only when every filter is considered valid.
+ // Check the controller to configure the validation process.
+ if (filtersController.valid) {
+ onApply?.(filtersController.filters);
+ }
+ }, [
+ filtersController.filters,
+ filtersController.valid,
+ onApply
+ ]);
+
+ const displayClear = filters.length > 0;
+
+ return (
+
+
+
+ Filter
+
+
+
+
+
+
+
+
+
+
+
+ )}
+ >
+ {filtersController.filters.map((filter, index) => {
+ const displayAdd = filtersController.filters.length === index + 1;
+
+ return (
+
+ );
+ })}
+
+
+
+ {displayClear && (
+
+ Clear ({filters.length})
+
+ )}
+
+ Apply
+
+
+
+ );
+};
+
+FilterDialog.propTypes = {
+ onApply: PropTypes.func,
+ onClear: PropTypes.func,
+ onClose: PropTypes.func,
+ open: PropTypes.bool,
+ operators: PropTypes.array,
+ properties: PropTypes.array
+};
diff --git a/src/components/images-dialog.js b/src/components/images-dialog.js
new file mode 100644
index 000000000000..71668979d5db
--- /dev/null
+++ b/src/components/images-dialog.js
@@ -0,0 +1,184 @@
+import { useState } from 'react';
+import PropTypes from 'prop-types';
+import TrashIcon from '@heroicons/react/24/outline/TrashIcon';
+import {
+ Box,
+ Button,
+ Dialog,
+ DialogActions,
+ DialogContent,
+ DialogTitle,
+ IconButton,
+ Stack,
+ SvgIcon,
+ Typography
+} from '@mui/material';
+import { alpha } from '@mui/material/styles';
+import { FileDropzone } from './file-dropzone';
+
+export const ImagesDialog = (props) => {
+ const { onClose, onSelect, open = false, ...other } = props;
+ const [uploaded, setUploaded] = useState([]);
+ const [selected, setSelected] = useState([]);
+
+ const handleDrop = (files) => {
+
+ // Here you should upload the images and get the URL back.
+ // We simulate that by creating Object URLs from the file data.
+
+ const images = files.map((file) => URL.createObjectURL(file));
+
+ setUploaded(prevState => ([
+ ...prevState,
+ ...images
+ ]));
+
+ setSelected(prevState => ([
+ ...prevState,
+ ...images
+ ]));
+ };
+
+ const handleSelectOne = (image) => {
+ if (selected.includes(image)) {
+ setSelected((prevState) => {
+ return prevState.filter((_image) => _image !== image);
+ });
+ } else {
+ setSelected((prevSelectedImages) => [...prevSelectedImages, image]);
+ }
+ };
+
+ const handleDeleteOne = (image) => {
+ setUploaded((prevState) => {
+ return prevState.filter((_image) => _image !== image);
+ });
+ };
+
+ const handleSelect = () => {
+ onSelect?.(selected);
+ setSelected([]);
+ setUploaded([]);
+ };
+
+ return (
+
+
+
+ Upload Images
+
+
+ You can only choose images
+
+
+
+
+
+ {uploaded.map((image) => {
+ const isSelected = selected.includes(image);
+
+ return (
+ handleSelectOne(image)}
+ sx={{
+ backgroundImage: `url(${image})`,
+ backgroundPosition: 'center',
+ backgroundSize: 'cover',
+ borderRadius: 1,
+ cursor: 'pointer',
+ height: 122,
+ flexGrow: 0,
+ flexShrink: 0,
+ overflow: 'hidden',
+ position: 'relative',
+ width: 122,
+ ...(isSelected && {
+ boxShadow: (theme) => `0px 0px 0px 2px ${theme.palette.primary.main}`
+ }),
+ '&:hover': {
+ '& > div': {
+ opacity: 1
+ }
+ }
+ }}
+ >
+ alpha(theme.palette.neutral[900], 0.8),
+ display: 'flex',
+ height: '100%',
+ justifyContent: 'center',
+ left: 0,
+ opacity: 0,
+ position: 'absolute',
+ top: 0,
+ width: '100%'
+ }}
+ >
+ {
+ event.stopPropagation();
+ handleDeleteOne(image);
+ }}
+ >
+
+
+
+
+
+
+ );
+ })}
+
+
+
+
+ Cancel
+
+
+ Select
+
+
+
+ );
+};
+
+ImagesDialog.propTypes = {
+ onClose: PropTypes.func,
+ onSelect: PropTypes.func,
+ open: PropTypes.bool,
+ selected: PropTypes.arrayOf(PropTypes.string.isRequired)
+};
diff --git a/src/components/logo.js b/src/components/logo.js
new file mode 100644
index 000000000000..1c343495929e
--- /dev/null
+++ b/src/components/logo.js
@@ -0,0 +1,10 @@
+import PropTypes from "prop-types";
+import Image from "next/image";
+
+export const Logo = (props) => {
+ return ;
+};
+
+Logo.propTypes = {
+ color: PropTypes.oneOf(["black", "primary", "white"]),
+};
diff --git a/src/components/pagination.js b/src/components/pagination.js
new file mode 100644
index 000000000000..1108ddc11e0a
--- /dev/null
+++ b/src/components/pagination.js
@@ -0,0 +1,92 @@
+import { useCallback } from 'react';
+import PropTypes from 'prop-types';
+import ChevronLeftIcon from '@heroicons/react/24/outline/ChevronLeftIcon';
+import ChevronRightIcon from '@heroicons/react/24/outline/ChevronRightIcon';
+import { Box, IconButton, Stack, SvgIcon, Typography } from '@mui/material';
+import { styled } from '@mui/material/styles';
+
+const PaginationRoot = styled('div')((({ theme }) => ({
+ alignItems: 'center',
+ display: 'flex',
+ padding: theme.spacing(2)
+})));
+
+export const Pagination = (props) => {
+ const { disabled, onPageChange, page = 0, rowsCount = 0, rowsPerPage = 0, ...other } = props;
+ const pagesCount = Math.ceil(rowsCount / rowsPerPage) || 1;
+ const isFirstPage = page === 0;
+ const isLastPage = (page + 1) === pagesCount;
+
+ const handlePreviousPage = useCallback(() => {
+ onPageChange?.(page - 1);
+ }, [page, onPageChange]);
+
+ const handleNextPage = useCallback(() => {
+ onPageChange?.(page + 1);
+ }, [page, onPageChange]);
+
+ return (
+
+
+
+ Page
+ {' '}
+
+ {page + 1}
+
+ of
+ {' '}
+
+ {pagesCount}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+Pagination.propTypes = {
+ disabled: PropTypes.bool,
+ onPageChange: PropTypes.func,
+ page: PropTypes.number,
+ rowsCount: PropTypes.number,
+ rowsPerPage: PropTypes.number
+};
diff --git a/src/components/pdfExportButton.js b/src/components/pdfExportButton.js
new file mode 100644
index 000000000000..75cc622a4903
--- /dev/null
+++ b/src/components/pdfExportButton.js
@@ -0,0 +1,35 @@
+import PropTypes from "prop-types";
+import { Button, IconButton, Tooltip } from "@mui/material";
+import { PictureAsPdf } from "@mui/icons-material";
+import jsPDF from "jspdf";
+import autoTable from "jspdf-autotable";
+
+export const PDFExportButton = (props) => {
+ const { rows, columns, reportName } = props;
+
+ const handleExportRows = (rows) => {
+ const unit = "pt";
+ const size = "A3"; // Use A1, A2, A3 or A4
+ const orientation = "landscape"; // portrait or landscape
+ const doc = new jsPDF(orientation, unit, size);
+ const tableData = rows.map((row) => console.log(row.original));
+ const exportColumns = columns.map((c) => ({ header: c.header, dataKey: c.accessorKey }));
+ let content = {
+ startY: 100,
+ columns: exportColumns,
+ body: tableData,
+ theme: "striped",
+ headStyles: { fillColor: [247, 127, 0] },
+ };
+ autoTable(doc, content);
+
+ doc.save(reportName);
+ };
+ return (
+
+ handleExportRows(rows)}>
+
+
+
+ );
+};
diff --git a/src/components/property-list-item.js b/src/components/property-list-item.js
new file mode 100644
index 000000000000..67cd6acd7cd4
--- /dev/null
+++ b/src/components/property-list-item.js
@@ -0,0 +1,66 @@
+import PropTypes from "prop-types";
+import { Box, Button, ListItem, ListItemText, Typography } from "@mui/material";
+import { useState } from "react";
+
+export const PropertyListItem = (props) => {
+ const { align = "vertical", children, component, label, value = "", type, ...other } = props;
+ const [showPassword, setShowPassword] = useState(false);
+ return (
+
+
+ {label}
+
+ }
+ secondary={
+
+ {children || (
+
+ {type !== "password" &&
+ (value === true ? "Yes" : value === false || value === null ? "No" : value)}
+ {type === "password" && (
+ <>
+ {showPassword ? (
+ value
+ ) : (
+ setShowPassword(true)}>Show Password
+ )}
+ >
+ )}
+
+ )}
+
+ }
+ sx={{
+ alignItems: "flex-start",
+ display: "flex",
+ flexDirection: align === "vertical" ? "column" : "row",
+ my: 0,
+ }}
+ />
+
+ );
+};
+
+PropertyListItem.propTypes = {
+ align: PropTypes.string,
+ children: PropTypes.node,
+ component: PropTypes.any,
+ label: PropTypes.string.isRequired,
+ value: PropTypes.string,
+};
diff --git a/src/components/property-list.js b/src/components/property-list.js
new file mode 100644
index 000000000000..a7b5530ef5ce
--- /dev/null
+++ b/src/components/property-list.js
@@ -0,0 +1,16 @@
+import PropTypes from 'prop-types';
+import { List } from '@mui/material';
+
+export const PropertyList = (props) => {
+ const { children } = props;
+
+ return (
+
+ {children}
+
+ );
+};
+
+PropertyList.propTypes = {
+ children: PropTypes.node
+};
diff --git a/src/components/query-field.js b/src/components/query-field.js
new file mode 100644
index 000000000000..f1078830ee60
--- /dev/null
+++ b/src/components/query-field.js
@@ -0,0 +1,91 @@
+import { useCallback, useEffect, useRef, useState } from 'react';
+import PropTypes from 'prop-types';
+import MagnifyingGlassIcon from '@heroicons/react/24/outline/MagnifyingGlassIcon';
+import { InputBase, SvgIcon } from '@mui/material';
+import { styled } from '@mui/material/styles';
+
+const QueryFieldRoot = styled('div')((({ theme }) => ({
+ alignItems: 'center',
+ backgroundColor: 'background.paper',
+ border: `1px solid ${theme.palette.divider}`,
+ borderRadius: theme.shape.borderRadius,
+ display: 'flex',
+ height: 42,
+ padding: '0 16px'
+})));
+
+export const QueryField = (props) => {
+ const { disabled, onChange, placeholder, value: initialValue = '', ...other } = props;
+ const [autoFocus, setAutoFocus] = useState(false);
+ const inputRef = useRef(null);
+ const [value, setValue] = useState('');
+
+ useEffect(() => {
+ setValue(initialValue);
+ }, [initialValue]);
+
+ useEffect(() => {
+ if (!disabled && autoFocus && inputRef?.current) {
+ inputRef.current.focus();
+ }
+ },
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ [disabled]);
+
+ const handleChange = useCallback((event) => {
+ setValue(event.target.value);
+ }, []);
+
+ const handleKeyup = useCallback((event) => {
+ if (event.code === 'Enter') {
+ onChange?.(value);
+ }
+ }, [value, onChange]);
+
+ const handleFocus = useCallback(() => {
+ setAutoFocus(true);
+ }, []);
+
+ const handleBlur = useCallback((event) => {
+ /*
+ There is a situation where an input goes from not disabled to disabled and DOM emits a blur
+ event, with event as undefined. This means, that sometimes we'll receive an React Synthetic
+ event and sometimes undefined because when DOM triggers the event, React is unaware of it,
+ or it simply does not emit the event. To bypass this behaviour, we store a local variable
+ that acts as autofocus.
+ */
+
+ if (event) {
+ setAutoFocus(false);
+ }
+ }, []);
+
+ return (
+
+
+
+
+
+
+ );
+};
+
+QueryField.propTypes = {
+ disabled: PropTypes.bool,
+ onChange: PropTypes.func,
+ placeholder: PropTypes.string,
+ value: PropTypes.string
+};
diff --git a/src/components/quill-editor.js b/src/components/quill-editor.js
new file mode 100644
index 000000000000..cec7ba1c3de0
--- /dev/null
+++ b/src/components/quill-editor.js
@@ -0,0 +1,125 @@
+import 'react-quill/dist/quill.snow.css';
+import { useRef } from 'react';
+import dynamic from 'next/dynamic';
+import PropTypes from 'prop-types';
+import { styled } from '@mui/material/styles';
+
+const Quill = dynamic(() => import('react-quill'), {
+ ssr: false,
+ loading: () => null
+});
+
+const QuillEditorRoot = styled('div')(({ theme }) => ({
+ border: 1,
+ borderColor: theme.palette.divider,
+ borderRadius: theme.shape.borderRadius,
+ borderStyle: 'solid',
+ display: 'flex',
+ flexDirection: 'column',
+ overflow: 'hidden',
+ '& .quill': {
+ display: 'flex',
+ flex: 1,
+ flexDirection: 'column',
+ overflow: 'hidden'
+ },
+ '& .ql-snow.ql-toolbar': {
+ borderColor: theme.palette.divider,
+ borderLeft: 'none',
+ borderRight: 'none',
+ borderTop: 'none',
+ '& .ql-picker-label:hover': {
+ color: theme.palette.primary.main
+ },
+ '& .ql-picker-label.ql-active': {
+ color: theme.palette.primary.main
+ },
+ '& .ql-picker-item:hover': {
+ color: theme.palette.primary.main
+ },
+ '& .ql-picker-item.ql-selected': {
+ color: theme.palette.primary.main
+ },
+ '& button:hover': {
+ color: theme.palette.primary.main,
+ '& .ql-stroke': {
+ stroke: theme.palette.primary.main
+ }
+ },
+ '& button:focus': {
+ color: theme.palette.primary.main,
+ '& .ql-stroke': {
+ stroke: theme.palette.primary.main
+ }
+ },
+ '& button.ql-active': {
+ '& .ql-stroke': {
+ stroke: theme.palette.primary.main
+ }
+ },
+ '& .ql-stroke': {
+ stroke: theme.palette.text.primary
+ },
+ '& .ql-picker': {
+ color: theme.palette.text.primary
+ },
+ '& .ql-picker-options': {
+ backgroundColor: theme.palette.background.paper,
+ border: 'none',
+ borderRadius: theme.shape.borderRadius,
+ boxShadow: theme.shadows[10],
+ padding: theme.spacing(2)
+ }
+ },
+ '& .ql-snow.ql-container': {
+ borderBottom: 'none',
+ borderColor: theme.palette.divider,
+ borderLeft: 'none',
+ borderRight: 'none',
+ display: 'flex',
+ flex: 1,
+ flexDirection: 'column',
+ height: 'auto',
+ overflow: 'hidden',
+ '& .ql-editor': {
+ color: theme.palette.text.primary,
+ flex: 1,
+ fontFamily: theme.typography.body1.fontFamily,
+ fontSize: theme.typography.body1.fontSize,
+ height: 'auto',
+ overflowY: 'auto',
+ padding: theme.spacing(2),
+ '&.ql-blank::before': {
+ color: theme.palette.text.secondary,
+ fontStyle: 'normal',
+ left: theme.spacing(2)
+ }
+ }
+ }
+}));
+
+export const QuillEditor = (props) => {
+ const { sx, onChange, placeholder, value, ...other } = props;
+ const ref = useRef(null);
+
+ return (
+
+
+
+ );
+};
+
+QuillEditor.propTypes = {
+ onChange: PropTypes.func,
+ placeholder: PropTypes.string,
+ sx: PropTypes.object,
+ value: PropTypes.string
+};
diff --git a/src/components/resource-error.js b/src/components/resource-error.js
new file mode 100644
index 000000000000..b0c0d709cb7f
--- /dev/null
+++ b/src/components/resource-error.js
@@ -0,0 +1,55 @@
+import PropTypes from 'prop-types';
+import ArrowPathIcon from '@heroicons/react/24/outline/ArrowPathIcon';
+import ExclamationTriangleIcon from '@heroicons/react/24/outline/ExclamationTriangleIcon';
+import { Button, SvgIcon, Typography } from '@mui/material';
+import { styled } from '@mui/material/styles';
+
+const ResourceErrorRoot = styled('div')(({ theme }) => ({
+ alignItems: 'center',
+ backgroundColor: theme.palette.mode === 'dark'
+ ? theme.palette.neutral[900]
+ : theme.palette.neutral[50],
+ display: 'flex',
+ flexDirection: 'column',
+ justifyContent: 'center',
+ padding: theme.spacing(3)
+}));
+
+export const ResourceError = (props) => {
+ const { message = 'Something went wrong, please try again.', onReload, sx } = props;
+
+ return (
+
+
+
+
+
+ {message}
+
+ {onReload && (
+
+
+
+ )}
+ sx={{ mt: 2 }}
+ variant="text"
+ >
+ Reload Data
+
+ )}
+
+ );
+};
+
+ResourceError.propTypes = {
+ message: PropTypes.string,
+ onReload: PropTypes.func,
+ sx: PropTypes.object
+};
diff --git a/src/components/resource-loading.js b/src/components/resource-loading.js
new file mode 100644
index 000000000000..743a53baea03
--- /dev/null
+++ b/src/components/resource-loading.js
@@ -0,0 +1,33 @@
+import PropTypes from "prop-types";
+import { CircularProgress, SvgIcon, Typography } from "@mui/material";
+import { styled } from "@mui/material/styles";
+
+const ResourceLoadingRoot = styled("div")(({ theme }) => ({
+ alignItems: "center",
+ backgroundColor:
+ theme.palette.mode === "dark" ? theme.palette.neutral[900] : theme.palette.neutral[50],
+ display: "flex",
+ flexDirection: "column",
+ justifyContent: "center",
+ padding: theme.spacing(3),
+}));
+
+export const ResourceLoading = (props) => {
+ const { message, sx } = props;
+
+ return (
+
+
+ {message && (
+
+ {message}
+
+ )}
+
+ );
+};
+
+ResourceLoading.propTypes = {
+ message: PropTypes.string,
+ sx: PropTypes.object,
+};
diff --git a/src/components/resource-unavailable.js b/src/components/resource-unavailable.js
new file mode 100644
index 000000000000..cc5e22c0b8f2
--- /dev/null
+++ b/src/components/resource-unavailable.js
@@ -0,0 +1,64 @@
+import PropTypes from "prop-types";
+import PlusIcon from "@heroicons/react/24/outline/PlusIcon";
+import { Box, Button, SvgIcon, Typography } from "@mui/material";
+import { styled } from "@mui/material/styles";
+import { useTheme } from "@emotion/react";
+
+const ResourceUnavailableRoot = styled("div")(({ theme }) => ({
+ alignItems: "center",
+ backgroundColor:
+ theme.palette.mode === "dark" ? theme.palette.neutral[900] : theme.palette.neutral[50],
+ display: "flex",
+ flexDirection: "column",
+ justifyContent: "center",
+ padding: theme.spacing(3),
+}));
+
+export const ResourceUnavailable = (props) => {
+ const { message = "", onCreate, createButtonText, sx, type, target } = props;
+ const theme = useTheme();
+
+ return (
+
+
+
+
+ {message && (
+
+ {message}
+
+ )}
+ {onCreate && (
+
+
+
+ }
+ sx={{ mt: 2 }}
+ variant="contained"
+ >
+ {createButtonText || "Create"}
+
+ )}
+
+ );
+};
+
+ResourceUnavailable.propTypes = {
+ message: PropTypes.string,
+ onCreate: PropTypes.func,
+ sx: PropTypes.object,
+};
diff --git a/src/components/rtl.js b/src/components/rtl.js
new file mode 100644
index 000000000000..4815634f13f0
--- /dev/null
+++ b/src/components/rtl.js
@@ -0,0 +1,34 @@
+import { useEffect } from 'react';
+import PropTypes from 'prop-types';
+import createCache from '@emotion/cache';
+import { CacheProvider } from '@emotion/react';
+import stylisRTLPlugin from 'stylis-plugin-rtl';
+
+const styleCache = () => createCache({
+ key: 'rtl',
+ prepend: true,
+ stylisPlugins: [stylisRTLPlugin]
+});
+
+export const RTL = (props) => {
+ const { children, direction = 'ltr' } = props;
+
+ useEffect(() => {
+ document.dir = direction;
+ }, [direction]);
+
+ if (direction === 'rtl') {
+ return (
+
+ {children}
+
+ );
+ }
+
+ return <>{children}>;
+};
+
+RTL.propTypes = {
+ children: PropTypes.node.isRequired,
+ direction: PropTypes.oneOf(['ltr', 'rtl'])
+};
diff --git a/src/components/scrollbar.js b/src/components/scrollbar.js
new file mode 100644
index 000000000000..92e589296d65
--- /dev/null
+++ b/src/components/scrollbar.js
@@ -0,0 +1,5 @@
+import "simplebar/dist/simplebar.min.css";
+import SimpleBar from "simplebar-react";
+import { styled } from "@mui/material/styles";
+
+export const Scrollbar = styled(SimpleBar)``;
diff --git a/src/components/toaster.js b/src/components/toaster.js
new file mode 100644
index 000000000000..11a136b6adbe
--- /dev/null
+++ b/src/components/toaster.js
@@ -0,0 +1,49 @@
+import { CloseSharp } from "@mui/icons-material";
+import { Alert, Button, IconButton, Snackbar } from "@mui/material";
+import { useSelector } from "react-redux";
+import { useDispatch } from "react-redux";
+import { closeToast } from "../store/toasts";
+
+const Toasts = () => {
+ const dispatch = useDispatch();
+ const toasts = useSelector((state) => state.toasts.toasts);
+
+ return (
+ <>
+ {[
+ toasts.map((toast) => (
+ dispatch(closeToast({ index: toast.index }))}
+ action={
+ <>
+ dispatch(closeToast({ index: toast.index }))}
+ >
+
+
+ >
+ }
+ >
+ dispatch(closeToast({ index: toast.index }))}
+ severity="error"
+ variant="filled"
+ sx={{ width: "100%" }}
+ >
+ {toast.toastError.status} - {toast.message}
+
+
+ )),
+ ]}
+ >
+ );
+};
+
+export default Toasts;
diff --git a/src/components/widget-previewer.js b/src/components/widget-previewer.js
new file mode 100644
index 000000000000..396fa976f765
--- /dev/null
+++ b/src/components/widget-previewer.js
@@ -0,0 +1,41 @@
+import PropTypes from 'prop-types';
+import { Card, Stack, Typography } from '@mui/material';
+
+export const WidgetPreviewer = (props) => {
+ const { title, description, children, ...other } = props;
+
+ return (
+
+
+ {typeof title === 'string'
+ ? (
+
+ {title}
+
+ )
+ : title}
+ {typeof description === 'string'
+ ? (
+
+ {description}
+
+ )
+ : description}
+
+
+ {children}
+
+
+ );
+};
+
+WidgetPreviewer.propTypes = {
+ children: PropTypes.node.isRequired,
+ description: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),
+ title: PropTypes.oneOfType([PropTypes.string, PropTypes.node])
+};
diff --git a/src/config.js b/src/config.js
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/src/contexts/settings-context.js b/src/contexts/settings-context.js
new file mode 100644
index 000000000000..275ad6fac9d9
--- /dev/null
+++ b/src/contexts/settings-context.js
@@ -0,0 +1,154 @@
+import { createContext, useCallback, useEffect, useMemo, useState } from 'react';
+import PropTypes from 'prop-types';
+import isEqual from 'lodash.isequal';
+
+const STORAGE_KEY = 'app.settings';
+
+let storage;
+
+class MemoryStorage {
+ get length() {
+ return this.store.size;
+ }
+
+ store = new Map();
+
+ clear() {
+ this.store.clear();
+ }
+
+ getItem(key) {
+ return this.store.get(key);
+ }
+
+ removeItem(key) {
+ this.store.delete(key);
+ }
+
+ setItem(key, value) {
+ this.store.set(key, value);
+ }
+
+ key(index) {
+ return Array.from(this.store.values())[index] || null;
+ }
+}
+
+try {
+ storage = globalThis.localStorage;
+} catch (err) {
+ console.error('[Settings Context] Local storage is not available', err);
+ storage = new MemoryStorage();
+}
+
+const restoreSettings = () => {
+ let value = null;
+
+ try {
+ const restored = storage.getItem(STORAGE_KEY);
+
+ if (restored) {
+ value = JSON.parse(restored);
+ }
+ } catch (err) {
+ console.error(err);
+ // If stored data is not a strigified JSON this will fail,
+ // that's why we catch the error
+ }
+
+ return value;
+};
+
+const deleteSettings = () => {
+ storage.removeItem(STORAGE_KEY);
+};
+
+const storeSettings = (value) => {
+ storage.setItem(STORAGE_KEY, JSON.stringify(value));
+};
+
+const initialSettings = {
+ direction: 'ltr',
+ paletteMode: 'light',
+ pinNav: true
+};
+
+const initialState = {
+ ...initialSettings,
+ isInitialized: false
+};
+
+export const SettingsContext = createContext({
+ ...initialState,
+ handleReset: () => { },
+ handleUpdate: () => { },
+ isCustom: false
+});
+
+export const SettingsProvider = (props) => {
+ const { children } = props;
+ const [state, setState] = useState(initialState);
+
+ useEffect(() => {
+ const restored = restoreSettings();
+
+ if (restored) {
+ setState((prevState) => ({
+ ...prevState,
+ ...restored,
+ isInitialized: true
+ }));
+ }
+ }, []);
+
+ const handleReset = useCallback(() => {
+ deleteSettings();
+ setState((prevState) => ({
+ ...prevState,
+ ...initialSettings
+ }));
+ }, []);
+
+ const handleUpdate = useCallback((settings) => {
+ setState((prevState) => {
+ storeSettings({
+ direction: prevState.direction,
+ paletteMode: prevState.paletteMode,
+ pinNav: prevState.pinNav,
+ ...settings
+ });
+
+ return {
+ ...prevState,
+ ...settings
+ };
+ });
+ }, []);
+
+ const isCustom = useMemo(() => {
+ return !isEqual(initialSettings, {
+ direction: state.direction,
+ paletteMode: state.paletteMode,
+ pinNav: state.pinNav
+ });
+ }, [state]);
+
+ return (
+
+ {children}
+
+ );
+};
+
+SettingsProvider.propTypes = {
+ children: PropTypes.node.isRequired
+};
+
+export const SettingsConsumer = SettingsContext.Consumer;
diff --git a/src/hooks/use-auth.js b/src/hooks/use-auth.js
new file mode 100644
index 000000000000..0b8e687f758c
--- /dev/null
+++ b/src/hooks/use-auth.js
@@ -0,0 +1,4 @@
+import { useContext } from 'react';
+import { AuthContext } from '../contexts/auth/jwt-context';
+
+export const useAuth = () => useContext(AuthContext);
diff --git a/src/hooks/use-dialog.js b/src/hooks/use-dialog.js
new file mode 100644
index 000000000000..2e88f6adfd62
--- /dev/null
+++ b/src/hooks/use-dialog.js
@@ -0,0 +1,28 @@
+import { useCallback, useState } from 'react';
+
+export function useDialog() {
+ const [state, setState] = useState({
+ open: false,
+ data: undefined
+ });
+
+ const handleOpen = useCallback((data) => {
+ setState({
+ open: true,
+ data
+ });
+ }, []);
+
+ const handleClose = useCallback(() => {
+ setState({
+ open: false
+ });
+ }, []);
+
+ return {
+ data: state.data,
+ handleClose,
+ handleOpen,
+ open: state.open
+ };
+}
diff --git a/src/hooks/use-filters.js b/src/hooks/use-filters.js
new file mode 100644
index 000000000000..57faa1de4023
--- /dev/null
+++ b/src/hooks/use-filters.js
@@ -0,0 +1,143 @@
+import { useCallback, useEffect, useMemo, useState } from 'react';
+
+const emptyFilter = {
+ operator: undefined,
+ property: '',
+ value: undefined
+};
+
+const validateFilter = (filter) => {
+ // Filters need an operator and a property
+ if (!filter.operator || !filter.property) {
+ return false;
+ }
+
+ // isBlank and isPresent operators cannot have a value
+ if (filter.operator === 'isBlank' || filter.operator === 'isPresent') {
+ return typeof filter.value === 'undefined';
+ }
+
+ // Other operators require a value
+ if (typeof filter.value === 'undefined') {
+ return false;
+ }
+
+ return true;
+};
+
+export const useFilters = (operators = [], properties = [], initialFilters = []) => {
+ const [filters, setFilters] = useState([]);
+
+ useEffect(() => {
+ setFilters(initialFilters.length > 0
+ ? initialFilters
+ : [emptyFilter]);
+ }, [initialFilters]);
+
+ const valid = useMemo(() => {
+ let passedAll = true;
+
+ for (let i = 0; i < filters.length; i++) {
+ const passed = validateFilter(filters[i]);
+
+ if (!passed) {
+ passedAll = false;
+ break;
+ }
+ }
+
+ return passedAll;
+ }, [filters]);
+
+ const handleFilterAdd = useCallback((index) => {
+ setFilters((prevState) => {
+ const filters = [...prevState];
+
+ filters.splice(index, 0, emptyFilter);
+
+ return filters;
+ });
+ }, []);
+
+ const handleOperatorChange = useCallback((index, name) => {
+ // Ensure operator is allowed
+
+ const operator = operators.find((operator) => operator.name === name);
+
+ if (!operator) {
+ return;
+ }
+
+ setFilters((prevState) => {
+ const filters = [...prevState];
+
+ filters[index] = {
+ ...filters[index],
+ operator: name
+ };
+
+ return filters;
+ });
+ }, [operators]);
+
+ const handlePropertyChange = useCallback((index, name) => {
+ // Ensure property is allowed
+
+ const property = properties.find((property) => property.name === name);
+
+ if (!property) {
+ return;
+ }
+
+ setFilters((prevState) => {
+ const filters = [...prevState];
+
+ filters[index] = {
+ operator: undefined,
+ property: name,
+ value: undefined
+ };
+
+ return filters;
+ });
+ }, [properties]);
+
+ const handleValueChange = useCallback((index, value) => {
+ setFilters((prevState) => {
+ const filters = [...prevState];
+
+ filters[index] = {
+ ...filters[index],
+ value
+ };
+
+ return filters;
+ });
+ }, []);
+
+ const handleFiltersClear = useCallback(() => {
+ setFilters([emptyFilter]);
+ }, []);
+
+ const handleFilterRemove = useCallback((index) => {
+ if (filters.length === 1) {
+ setFilters([emptyFilter]);
+ return;
+ }
+
+ setFilters((prevState) => {
+ return prevState.filter((filter, _index) => _index !== index);
+ });
+ }, [filters]);
+
+ return {
+ filters,
+ handleFilterAdd,
+ handleFilterRemove,
+ handleFiltersClear,
+ handleOperatorChange,
+ handlePropertyChange,
+ handleValueChange,
+ valid
+ };
+};
diff --git a/src/hooks/use-mocked-user.js b/src/hooks/use-mocked-user.js
new file mode 100644
index 000000000000..262df3fd1b1b
--- /dev/null
+++ b/src/hooks/use-mocked-user.js
@@ -0,0 +1,10 @@
+export const useMockedUser = () => {
+ // To get the user from the authContext, you can use
+ // `const { user } = useAuth();`
+ return {
+ id: '5e86809283e28b96d2d38537',
+ avatar: '/assets/avatars/avatar-chen-simmons.jpg',
+ name: 'Chen Simmons',
+ email: 'chen.simmons@devias.io'
+ };
+};
diff --git a/src/hooks/use-mounted.js b/src/hooks/use-mounted.js
new file mode 100644
index 000000000000..8274d16fff3d
--- /dev/null
+++ b/src/hooks/use-mounted.js
@@ -0,0 +1,15 @@
+import { useCallback, useEffect, useRef } from 'react';
+
+export const useMounted = () => {
+ const isMounted = useRef(false);
+
+ useEffect(() => {
+ isMounted.current = true;
+
+ return () => {
+ isMounted.current = false;
+ };
+ }, []);
+
+ return useCallback(() => isMounted.current, []);
+};
diff --git a/src/hooks/use-page-view.js b/src/hooks/use-page-view.js
new file mode 100644
index 000000000000..c4365337c92a
--- /dev/null
+++ b/src/hooks/use-page-view.js
@@ -0,0 +1,3 @@
+import { useEffect } from "react";
+
+export const usePageView = () => {};
diff --git a/src/hooks/use-popover.js b/src/hooks/use-popover.js
new file mode 100644
index 000000000000..a374004c9564
--- /dev/null
+++ b/src/hooks/use-popover.js
@@ -0,0 +1,26 @@
+import { useCallback, useRef, useState } from 'react';
+
+export function usePopover() {
+ const anchorRef = useRef(null);
+ const [open, setOpen] = useState(false);
+
+ const handleOpen = useCallback(() => {
+ setOpen(true);
+ }, []);
+
+ const handleClose = useCallback(() => {
+ setOpen(false);
+ }, []);
+
+ const handleToggle = useCallback(() => {
+ setOpen((prevState) => !prevState);
+ }, []);
+
+ return {
+ anchorRef,
+ handleClose,
+ handleOpen,
+ handleToggle,
+ open
+ };
+}
diff --git a/src/hooks/use-selection.js b/src/hooks/use-selection.js
new file mode 100644
index 000000000000..f6b5fef49f74
--- /dev/null
+++ b/src/hooks/use-selection.js
@@ -0,0 +1,35 @@
+import { useCallback, useEffect, useState } from 'react';
+
+export const useSelection = (items = []) => {
+ const [selected, setSelected] = useState([]);
+
+ useEffect(() => {
+ setSelected([]);
+ }, [items]);
+
+ const handleSelectAll = useCallback(() => {
+ setSelected([...items]);
+ }, [items]);
+
+ const handleSelectOne = useCallback((item) => {
+ setSelected((prevState) => [...prevState, item]);
+ }, []);
+
+ const handleDeselectAll = useCallback(() => {
+ setSelected([]);
+ }, []);
+
+ const handleDeselectOne = useCallback((item) => {
+ setSelected((prevState) => {
+ return prevState.filter((_item) => _item !== item);
+ });
+ }, []);
+
+ return {
+ handleDeselectAll,
+ handleDeselectOne,
+ handleSelectAll,
+ handleSelectOne,
+ selected
+ };
+};
diff --git a/src/hooks/use-settings.js b/src/hooks/use-settings.js
new file mode 100644
index 000000000000..39e4f9b60b64
--- /dev/null
+++ b/src/hooks/use-settings.js
@@ -0,0 +1,4 @@
+import { useContext } from 'react';
+import { SettingsContext } from '../contexts/settings-context';
+
+export const useSettings = () => useContext(SettingsContext);
diff --git a/src/hooks/use-window-scroll.js b/src/hooks/use-window-scroll.js
new file mode 100644
index 000000000000..3f3172fae595
--- /dev/null
+++ b/src/hooks/use-window-scroll.js
@@ -0,0 +1,16 @@
+import { useEffect } from 'react';
+import { throttle } from 'lodash';
+
+export const useWindowScroll = (config) => {
+ useEffect(() => {
+ const { handler, delay } = config;
+
+ const withThrottle = throttle(handler, delay);
+
+ window.addEventListener('scroll', withThrottle);
+
+ return () => {
+ window.removeEventListener('scroll', withThrottle);
+ };
+ }, [config]);
+};
diff --git a/src/i18n.js b/src/i18n.js
new file mode 100644
index 000000000000..648a786dc0bb
--- /dev/null
+++ b/src/i18n.js
@@ -0,0 +1,105 @@
+import i18n from 'i18next';
+import { initReactI18next } from 'react-i18next';
+
+const resources = {
+ en: {
+ translation: {}
+ },
+ de: {
+ translation: {
+ 'Language changed': 'Sprache geändert',
+ 'Blank Page': 'Leere Seiten',
+ 'Card Headings': 'Kartenüberschriften',
+ 'Data States': 'Datenstatus',
+ 'Data Stats': 'Datenstatistiken',
+ 'General Settings': 'Allgemeine Einstellungen',
+ 'Image Uploader': 'Bild-Uploader',
+ 'Page Headings': 'Seitenüberschriften',
+ Account: 'Konto',
+ Activity: 'Aktivität',
+ Billing: 'Abrechnung',
+ Buttons: 'Tasten',
+ Colors: 'Farben',
+ Components: 'Komponenten',
+ Create: 'Schaffen',
+ Customers: 'Kunden',
+ Details: 'Einzelheiten',
+ Documentation: 'Dokumentation',
+ Foundation: 'Stiftung',
+ Inputs: 'Eingänge',
+ Insights: 'Einblicke',
+ Inventory: 'Inventar',
+ Invoices: 'Rechnungen',
+ List: 'Aufführen',
+ Lists: 'Listen',
+ Notifications: 'Benachrichtigungen',
+ Onboarding: 'Onboarding',
+ Orders: 'Aufträge',
+ Organization: 'Organisationen',
+ Overview: 'Überblick',
+ Preview: 'Vorschau',
+ Products: 'Produkte',
+ Reports: 'Berichte',
+ Sales: 'Der Umsatz',
+ Shadows: 'Schatten',
+ Summary: 'Zusammenfassung',
+ Tables: 'Tabellen',
+ Team: 'Team',
+ Typography: 'Typografie'
+ }
+ },
+ es: {
+ translation: {
+ 'Language changed': 'Idioma cambianda',
+ 'Blank Page': 'Paginas en Blanco',
+ 'Card Headings': 'Encabezados de Tarjetas',
+ 'Data States': 'Estados de Datos',
+ 'Data Stats': 'Estadísticas de Datos',
+ 'General Settings': 'Configuración General',
+ 'Image Uploader': 'Cargador de Imágenes',
+ 'Page Headings': 'Encabezados de Página',
+ Account: 'Cuenta',
+ Activity: 'Actividad',
+ Billing: 'Facturación',
+ Buttons: 'Botones',
+ Colors: 'Colores',
+ Components: 'Componentes',
+ Create: 'Crear',
+ Customers: 'Clientes',
+ Details: 'Detalles',
+ Documentation: 'Documentación',
+ Foundation: 'Fundación',
+ Inputs: 'Entradas',
+ Insights: 'Perspectivas',
+ Inventory: 'Inventario',
+ Invoices: 'Facturas',
+ List: 'Lista',
+ Lists: 'Listas',
+ Notifications: 'Notificaciones',
+ Onboarding: 'Inducción',
+ Orders: 'Pedidos',
+ Organization: 'Organizaciones',
+ Overview: 'Visión general',
+ Preview: 'Avance',
+ Products: 'Productos',
+ Reports: 'Informes',
+ Sales: 'Ventas',
+ Shadows: 'Sombras',
+ Summary: 'Resumen',
+ Tables: 'Tabeles',
+ Team: 'Equipo',
+ Typography: 'Tipografía'
+ }
+ }
+};
+
+i18n
+ .use(initReactI18next)
+ .init({
+ resources,
+ lng: 'en',
+ fallbackLng: 'en',
+ interpolation: {
+ escapeValue: false
+ }
+ });
diff --git a/src/icons/iconly/bulk/bag.js b/src/icons/iconly/bulk/bag.js
new file mode 100644
index 000000000000..7880745240ca
--- /dev/null
+++ b/src/icons/iconly/bulk/bag.js
@@ -0,0 +1,21 @@
+const Bag = (props) => (
+
+
+
+
+);
+
+export default Bag;
diff --git a/src/icons/iconly/bulk/buy.js b/src/icons/iconly/bulk/buy.js
new file mode 100644
index 000000000000..ceb06ed5a086
--- /dev/null
+++ b/src/icons/iconly/bulk/buy.js
@@ -0,0 +1,21 @@
+const Buy = (props) => (
+
+
+
+
+);
+
+export default Buy;
diff --git a/src/icons/iconly/bulk/calendar.js b/src/icons/iconly/bulk/calendar.js
new file mode 100644
index 000000000000..d9cc5c8eb8bb
--- /dev/null
+++ b/src/icons/iconly/bulk/calendar.js
@@ -0,0 +1,29 @@
+const Calendar = (props) => (
+
+
+
+
+
+
+);
+
+export default Calendar;
diff --git a/src/icons/iconly/bulk/category.js b/src/icons/iconly/bulk/category.js
new file mode 100644
index 000000000000..9f6ad476c831
--- /dev/null
+++ b/src/icons/iconly/bulk/category.js
@@ -0,0 +1,21 @@
+const Category = (props) => (
+
+
+
+
+);
+
+export default Category;
diff --git a/src/icons/iconly/bulk/chart.js b/src/icons/iconly/bulk/chart.js
new file mode 100644
index 000000000000..2cd781dc6d44
--- /dev/null
+++ b/src/icons/iconly/bulk/chart.js
@@ -0,0 +1,29 @@
+const Chart = (props) => (
+
+
+
+
+
+
+);
+
+export default Chart;
diff --git a/src/icons/iconly/bulk/document.js b/src/icons/iconly/bulk/document.js
new file mode 100644
index 000000000000..1c8ccd4f1d07
--- /dev/null
+++ b/src/icons/iconly/bulk/document.js
@@ -0,0 +1,21 @@
+const Document = (props) => (
+
+
+
+
+);
+
+export default Document;
diff --git a/src/icons/iconly/bulk/graph.js b/src/icons/iconly/bulk/graph.js
new file mode 100644
index 000000000000..473baa543351
--- /dev/null
+++ b/src/icons/iconly/bulk/graph.js
@@ -0,0 +1,21 @@
+const Graph = (props) => (
+
+
+
+
+);
+
+export default Graph;
diff --git a/src/icons/iconly/bulk/settings.js b/src/icons/iconly/bulk/settings.js
new file mode 100644
index 000000000000..2045bfd55581
--- /dev/null
+++ b/src/icons/iconly/bulk/settings.js
@@ -0,0 +1,21 @@
+const Settings = (props) => (
+
+
+
+
+);
+
+export default Settings;
diff --git a/src/icons/iconly/bulk/show.js b/src/icons/iconly/bulk/show.js
new file mode 100644
index 000000000000..deedfe84e040
--- /dev/null
+++ b/src/icons/iconly/bulk/show.js
@@ -0,0 +1,21 @@
+const Show = (props) => (
+
+
+
+
+);
+
+export default Show;
diff --git a/src/icons/iconly/bulk/three-user.js b/src/icons/iconly/bulk/three-user.js
new file mode 100644
index 000000000000..56832b3008e6
--- /dev/null
+++ b/src/icons/iconly/bulk/three-user.js
@@ -0,0 +1,39 @@
+const ThreeUser = (props) => (
+
+
+
+
+
+
+
+
+);
+
+export default ThreeUser;
diff --git a/src/icons/iconly/bulk/ticket.js b/src/icons/iconly/bulk/ticket.js
new file mode 100644
index 000000000000..54f7106dbe5f
--- /dev/null
+++ b/src/icons/iconly/bulk/ticket.js
@@ -0,0 +1,21 @@
+const Ticket = (props) => (
+
+
+
+
+);
+
+export default Ticket;
diff --git a/src/icons/iconly/bulk/two-user.js b/src/icons/iconly/bulk/two-user.js
new file mode 100644
index 000000000000..a537e703ef9f
--- /dev/null
+++ b/src/icons/iconly/bulk/two-user.js
@@ -0,0 +1,30 @@
+const TwoUser = (props) => (
+
+
+
+
+
+
+);
+
+export default TwoUser;
diff --git a/src/layouts/dashboard/account-popover.js b/src/layouts/dashboard/account-popover.js
new file mode 100644
index 000000000000..5a8438bc1e6a
--- /dev/null
+++ b/src/layouts/dashboard/account-popover.js
@@ -0,0 +1,150 @@
+import { useCallback } from "react";
+import PropTypes from "prop-types";
+import { useRouter } from "next/navigation";
+import toast from "react-hot-toast";
+import ArrowRightOnRectangleIcon from "@heroicons/react/24/outline/ArrowRightOnRectangleIcon";
+import BuildingOfficeIcon from "@heroicons/react/24/outline/BuildingOfficeIcon";
+import ChevronDownIcon from "@heroicons/react/24/outline/ChevronDownIcon";
+import UserIcon from "@heroicons/react/24/outline/UserIcon";
+import {
+ Avatar,
+ Box,
+ FormControlLabel,
+ List,
+ ListItem,
+ ListItemAvatar,
+ ListItemButton,
+ ListItemIcon,
+ ListItemText,
+ ListSubheader,
+ Popover,
+ Select,
+ Stack,
+ SvgIcon,
+ Switch,
+ Typography,
+ useMediaQuery,
+} from "@mui/material";
+import { usePopover } from "../../hooks/use-popover";
+import { paths } from "../../paths";
+import { ApiGetCall } from "../../api/ApiCall";
+
+export const AccountPopover = (props) => {
+ const {
+ direction = "ltr",
+ language = "en",
+ onThemeSwitch,
+ paletteMode = "light",
+ ...other
+ } = props;
+ const router = useRouter();
+ const mdDown = useMediaQuery((theme) => theme.breakpoints.down("md"));
+ const popover = usePopover();
+
+ const orgData = ApiGetCall({
+ url: "/.auth/me",
+ queryKey: "me",
+ });
+
+ const handleLogout = useCallback(async () => {
+ try {
+ popover.handleClose();
+
+ router.push("/.auth/logout?post_logout_redirect_uri=" + encodeURIComponent(paths.index));
+ } catch (err) {
+ console.error(err);
+ toast.error("Something went wrong");
+ }
+ }, [router, popover]);
+
+ return (
+ <>
+
+ <>
+ {mdDown && (
+
+
+
+ )}
+ {!mdDown && (
+ <>
+
+
+
+
+
+ {orgData.data?.Org?.Domain}
+
+
+ {orgData.data?.clientPrincipal?.userDetails ?? "Not logged in"}
+
+
+ {orgData.data?.clientPrincipal?.userDetails && (
+
+
+
+ )}
+ >
+ )}
+ >
+
+ {orgData.data?.clientPrincipal?.userDetails && (
+
+
+ {mdDown && (
+
+
+
+ )}
+
+
+ {mdDown && (
+
+ }
+ label="Dark Mode"
+ />
+
+ )}
+
+
+
+
+
+
+
+
+
+
+
+
+ )}
+ >
+ );
+};
+
+AccountPopover.propTypes = {
+ onThemeSwitch: PropTypes.func,
+ paletteMode: PropTypes.oneOf(["dark", "light"]),
+};
diff --git a/src/layouts/dashboard/config.js b/src/layouts/dashboard/config.js
new file mode 100644
index 000000000000..0211ddb8e5d1
--- /dev/null
+++ b/src/layouts/dashboard/config.js
@@ -0,0 +1,45 @@
+import { SvgIcon } from "@mui/material";
+import { paths } from "../../paths";
+import GraphIcon from "../../icons/iconly/bulk/graph";
+import SettingsIcon from "../../icons/iconly/bulk/settings";
+import { UserIcon } from "@heroicons/react/24/outline";
+import { Domain } from "@mui/icons-material";
+
+export const items = [
+ {
+ title: "Overview",
+ path: paths.index,
+ icon: (
+
+
+
+ ),
+ },
+ {
+ title: "Users",
+ path: paths.users,
+ icon: (
+
+
+
+ ),
+ },
+ {
+ title: "Domains",
+ path: paths.domains,
+ icon: (
+
+
+
+ ),
+ },
+ {
+ title: "Onboarding",
+ path: paths.onboarding,
+ icon: (
+
+
+
+ ),
+ },
+];
diff --git a/src/layouts/dashboard/footer.js b/src/layouts/dashboard/footer.js
new file mode 100644
index 000000000000..2a8c34c755ad
--- /dev/null
+++ b/src/layouts/dashboard/footer.js
@@ -0,0 +1,43 @@
+import { Box, Container, Link, Typography } from "@mui/material";
+
+const items = [
+ {
+ label: "About Us",
+ href: "https://devias.io/about-us",
+ },
+ {
+ label: "Terms",
+ href: "https://devias.io/legal/tos",
+ },
+];
+
+export const Footer = () => (
+
+
+
+
+
+
+);
diff --git a/src/layouts/dashboard/index.js b/src/layouts/dashboard/index.js
new file mode 100644
index 000000000000..508ff708dc20
--- /dev/null
+++ b/src/layouts/dashboard/index.js
@@ -0,0 +1,104 @@
+import { useCallback, useEffect, useState } from "react";
+import { usePathname } from "next/navigation";
+import PropTypes from "prop-types";
+import { useMediaQuery } from "@mui/material";
+import { styled } from "@mui/material/styles";
+import { useSettings } from "../../hooks/use-settings";
+import { Footer } from "./footer";
+import { MobileNav } from "./mobile-nav";
+import { SideNav } from "./side-nav";
+import { TopNav } from "./top-nav";
+
+const SIDE_NAV_WIDTH = 270;
+const SIDE_NAV_PINNED_WIDTH = 50;
+const TOP_NAV_HEIGHT = 50;
+
+const useMobileNav = () => {
+ const pathname = usePathname();
+ const [open, setOpen] = useState(false);
+
+ const handlePathnameChange = useCallback(() => {
+ if (open) {
+ setOpen(false);
+ }
+ }, [open]);
+
+ useEffect(
+ () => {
+ handlePathnameChange();
+ },
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ [pathname]
+ );
+
+ const handleOpen = useCallback(() => {
+ setOpen(true);
+ }, []);
+
+ const handleClose = useCallback(() => {
+ setOpen(false);
+ }, []);
+
+ return {
+ handleClose,
+ handleOpen,
+ open,
+ };
+};
+
+const LayoutRoot = styled("div")(({ theme }) => ({
+ backgroundColor: theme.palette.background.default,
+ display: "flex",
+ flex: "1 1 auto",
+ maxWidth: "100%",
+ paddingTop: TOP_NAV_HEIGHT,
+ [theme.breakpoints.up("lg")]: {
+ paddingLeft: SIDE_NAV_WIDTH,
+ },
+}));
+
+const LayoutContainer = styled("div")({
+ display: "flex",
+ flex: "1 1 auto",
+ flexDirection: "column",
+ width: "100%",
+});
+
+export const Layout = (props) => {
+ const { children } = props;
+ const mdDown = useMediaQuery((theme) => theme.breakpoints.down("md"));
+ const settings = useSettings();
+ const mobileNav = useMobileNav();
+
+ const handleNavPin = useCallback(() => {
+ settings.handleUpdate({
+ pinNav: !settings.pinNav,
+ });
+ }, [settings]);
+
+ const offset = settings.pinNav ? SIDE_NAV_WIDTH : SIDE_NAV_PINNED_WIDTH;
+
+ return (
+ <>
+
+ {mdDown && }
+ {!mdDown && }
+
+
+ {children}
+
+
+
+ >
+ );
+};
+
+Layout.propTypes = {
+ children: PropTypes.node,
+};
diff --git a/src/layouts/dashboard/language-popover.js b/src/layouts/dashboard/language-popover.js
new file mode 100644
index 000000000000..1fd441d6afd8
--- /dev/null
+++ b/src/layouts/dashboard/language-popover.js
@@ -0,0 +1,107 @@
+import { useCallback, useRef } from 'react';
+import PropTypes from 'prop-types';
+import { Box, IconButton, ListItemIcon, ListItemText, MenuItem, Popover } from '@mui/material';
+import { usePopover } from '../../hooks/use-popover';
+
+const languageOptions = [
+ {
+ icon: '/assets/flags/flag-uk.svg',
+ label: 'English',
+ value: 'en'
+ },
+ {
+ icon: '/assets/flags/flag-de.svg',
+ label: 'German',
+ value: 'de'
+ },
+ {
+ icon: '/assets/flags/flag-es.svg',
+ label: 'Spanish',
+ value: 'es'
+ }
+];
+
+export const LanguagePopover = (props) => {
+ const { language = 'en', onLanguageChange, ...other } = props;
+ const anchorRef = useRef(null);
+ const popover = usePopover();
+
+ const handleLanguageChange = useCallback((value) => {
+ popover.handleClose();
+ onLanguageChange?.(value);
+ }, [popover, onLanguageChange]);
+
+ const selectedOption = languageOptions.find((option) => option.value === language);
+
+ return (
+ <>
+
+
+ {selectedOption && (
+
+ )}
+
+
+
+ {languageOptions.map((option) => (
+ handleLanguageChange(option.value)}
+ >
+
+
+
+
+
+
+
+ ))}
+
+ >
+ );
+};
+
+LanguagePopover.propTypes = {
+ language: PropTypes.oneOf(['de', 'en', 'es']),
+ onLanguageChange: PropTypes.func
+};
diff --git a/src/layouts/dashboard/mobile-nav-item.js b/src/layouts/dashboard/mobile-nav-item.js
new file mode 100644
index 000000000000..485710a3b367
--- /dev/null
+++ b/src/layouts/dashboard/mobile-nav-item.js
@@ -0,0 +1,173 @@
+import { useCallback, useState } from 'react';
+import NextLink from 'next/link';
+import PropTypes from 'prop-types';
+import ChevronRightIcon from '@heroicons/react/24/outline/ChevronRightIcon';
+import ChevronDownIcon from '@heroicons/react/24/outline/ChevronDownIcon';
+import { Box, ButtonBase, Collapse, SvgIcon } from '@mui/material';
+import ArrowTopRightOnSquareIcon from '@heroicons/react/24/outline/ArrowTopRightOnSquareIcon';
+
+export const MobileNavItem = (props) => {
+ const {
+ active = false,
+ children,
+ depth = 0,
+ disabled = false,
+ external = false,
+ icon,
+ openImmediately = false,
+ path,
+ title
+ } = props;
+ const [open, setOpen] = useState(openImmediately);
+
+ const handleToggle = useCallback(() => {
+ setOpen((prevOpen) => !prevOpen);
+ }, []);
+
+ // Branch
+
+ if (children) {
+ return (
+
+ theme.typography.fontFamily,
+ fontSize: 14,
+ fontWeight: 500,
+ justifyContent: 'flex-start',
+ px: '6px',
+ py: '12px',
+ textAlign: 'left',
+ whiteSpace: 'nowrap',
+ width: '100%'
+ }}
+ >
+
+ {icon}
+
+
+ {title}
+
+
+ {open ? : }
+
+
+
+ {children}
+
+
+ );
+ }
+
+ // Leaf
+
+ const linkProps = path
+ ? external
+ ? {
+ component: 'a',
+ href: path,
+ target: '_blank'
+ }
+ : {
+ component: NextLink,
+ href: path
+ }
+ : {};
+
+ return (
+
+ theme.typography.fontFamily,
+ fontSize: 14,
+ fontWeight: 500,
+ justifyContent: 'flex-start',
+ px: '6px',
+ py: '12px',
+ textAlign: 'left',
+ whiteSpace: 'nowrap',
+ width: '100%'
+ }}
+ {...linkProps}>
+
+ {icon}
+
+
+ {title}
+
+ {external && (
+
+
+
+ )}
+
+
+ );
+};
+
+MobileNavItem.propTypes = {
+ active: PropTypes.bool,
+ children: PropTypes.node,
+ depth: PropTypes.number,
+ disabled: PropTypes.bool,
+ external: PropTypes.bool,
+ icon: PropTypes.node,
+ openImmediately: PropTypes.bool,
+ path: PropTypes.string,
+ title: PropTypes.string.isRequired
+};
diff --git a/src/layouts/dashboard/mobile-nav.js b/src/layouts/dashboard/mobile-nav.js
new file mode 100644
index 000000000000..82c3036731ce
--- /dev/null
+++ b/src/layouts/dashboard/mobile-nav.js
@@ -0,0 +1,147 @@
+import NextLink from 'next/link';
+import { usePathname } from 'next/navigation';
+import PropTypes from 'prop-types';
+import { Box, Drawer, Stack } from '@mui/material';
+import { Logo } from '../../components/logo';
+import { Scrollbar } from '../../components/scrollbar';
+import { paths } from '../../paths';
+import { items } from './config';
+import { MobileNavItem } from './mobile-nav-item';
+
+const MOBILE_NAV_WIDTH = 280;
+
+const renderItems = ({ depth = 0, items, pathname }) => items.reduce((acc,
+ item) => reduceChildRoutes({
+ acc,
+ depth,
+ item,
+ pathname
+}), []);
+
+const reduceChildRoutes = ({ acc, depth, item, pathname }) => {
+ const checkPath = !!(item.path && pathname);
+ const partialMatch = checkPath ? pathname.includes(item.path) : false;
+ const exactMatch = checkPath ? pathname === item.path : false;
+
+ if (item.items) {
+ acc.push(
+
+
+ {renderItems({
+ depth: depth + 1,
+ items: item.items,
+ pathname
+ })}
+
+
+ );
+ } else {
+ acc.push(
+
+ );
+ }
+
+ return acc;
+};
+
+export const MobileNav = (props) => {
+ const { open, onClose } = props;
+ const pathname = usePathname();
+
+ return (
+
+
+
+
+
+
+
+
+
+ {renderItems({
+ depth: 0,
+ items,
+ pathname
+ })}
+
+
+
+
+ );
+};
+
+MobileNav.propTypes = {
+ onClose: PropTypes.func,
+ open: PropTypes.bool
+};
diff --git a/src/layouts/dashboard/notifications-popover.js b/src/layouts/dashboard/notifications-popover.js
new file mode 100644
index 000000000000..d3291cfa42af
--- /dev/null
+++ b/src/layouts/dashboard/notifications-popover.js
@@ -0,0 +1,175 @@
+import { format, subHours, subMinutes } from 'date-fns';
+import BellIcon from '@heroicons/react/24/outline/BellIcon';
+import SparklesIcon from '@heroicons/react/24/outline/SparklesIcon';
+import SpeakerWaveIcon from '@heroicons/react/24/outline/SpeakerWaveIcon';
+import {
+ Badge,
+ Box,
+ Divider,
+ IconButton,
+ Popover,
+ Stack,
+ SvgIcon,
+ Typography
+} from '@mui/material';
+import { usePopover } from '../../hooks/use-popover';
+
+const now = new Date();
+
+const notifications = [
+ {
+ id: 'cf61492ca564264b53db0717',
+ createdAt: subMinutes(now, 15).getTime(),
+ type: 'newCustomer'
+ },
+ {
+ id: '260bbcfa0a682e94bbda6ee3',
+ createdAt: subHours(subMinutes(now, 42), 1).getTime(),
+ content: 'You can now edit your resources without leaving the page',
+ title: 'Inline Edit is now available',
+ type: 'newFeature'
+ },
+ {
+ id: '266a0d67c47eaafbf0790472',
+ content: 'Version 5.0 comes Custom DNS feature',
+ createdAt: subHours(subMinutes(now, 26), 4).getTime(),
+ title: 'Beta Custom DNS',
+ type: 'newFeature'
+ }
+];
+
+const getContent = (notification) => {
+ switch (notification.type) {
+ case 'newCustomer':
+ return (
+ <>
+
+
+
+
+
+ New Customer
+
+
+ >
+ );
+
+ case 'newFeature':
+ return (
+ <>
+
+
+
+
+
+ {notification.title}
+
+
+ {notification.content && (
+
+ {notification.content}
+
+ )}
+ >
+ );
+
+ default:
+ return null;
+ }
+};
+
+export const NotificationsPopover = () => {
+ const popover = usePopover();
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+ Notifications
+
+
+ }
+ sx={{
+ listStyle: 'none',
+ m: 0,
+ p: 0
+ }}
+ >
+ {notifications.map((notification) => {
+ const createdAt = format(notification.createdAt, 'MMM dd, yyyy');
+
+ return (
+
+ {getContent(notification)}
+
+ {createdAt}
+
+
+ );
+ })}
+
+
+ >
+ );
+};
diff --git a/src/layouts/dashboard/organization-popover.js b/src/layouts/dashboard/organization-popover.js
new file mode 100644
index 000000000000..e60e268ce064
--- /dev/null
+++ b/src/layouts/dashboard/organization-popover.js
@@ -0,0 +1,124 @@
+import { useCallback } from "react";
+import PropTypes from "prop-types";
+import ChevronUpDownIcon from "@heroicons/react/24/outline/ChevronUpDownIcon";
+import PlusIcon from "@heroicons/react/24/outline/PlusIcon";
+import {
+ Button,
+ ButtonBase,
+ Divider,
+ ListItemText,
+ MenuItem,
+ MenuList,
+ Popover,
+ SvgIcon,
+ Typography,
+} from "@mui/material";
+import { common } from "@mui/material/colors";
+import { alpha } from "@mui/material/styles";
+import { usePopover } from "../../hooks/use-popover";
+
+export const OrganizationPopover = (props) => {
+ const { onOrganizationSwitch, organizationId, organizations = [] } = props;
+ const popover = usePopover();
+
+ const handleOrganizationChange = useCallback(
+ (organizationId) => {
+ popover.handleClose();
+ onOrganizationSwitch?.(organizationId);
+ },
+ [popover, onOrganizationSwitch]
+ );
+
+ // NOTE: Ensure an organization is found, otherwise some components will fail.
+ const organization = organizations.find((organization) => organization.id === organizationId);
+
+ return (
+ <>
+
+
+ {organization.name}
+
+
+
+
+
+
+
+ {organizations.map((organization) => {
+ const isSelected = organization.id === organizationId;
+
+ return (
+ handleOrganizationChange?.(organization.id)}
+ selected={isSelected}
+ sx={{ borderRadius: 1 }}
+ >
+ {organization.name}
+
+ );
+ })}
+
+
+
+
+
+ }
+ sx={{
+ justifyContent: "flex-start",
+ textAlign: "left",
+ }}
+ >
+ Create Org
+
+
+ >
+ );
+};
+
+OrganizationPopover.propTypes = {
+ onOrganizationSwitch: PropTypes.func,
+ organizationId: PropTypes.string.isRequired,
+ organizations: PropTypes.array,
+};
diff --git a/src/layouts/dashboard/side-nav-item.js b/src/layouts/dashboard/side-nav-item.js
new file mode 100644
index 000000000000..94d094648a96
--- /dev/null
+++ b/src/layouts/dashboard/side-nav-item.js
@@ -0,0 +1,199 @@
+import { useCallback, useState } from 'react';
+import NextLink from 'next/link';
+import PropTypes from 'prop-types';
+import ChevronRightIcon from '@heroicons/react/24/outline/ChevronRightIcon';
+import ChevronDownIcon from '@heroicons/react/24/outline/ChevronDownIcon';
+import ArrowTopRightOnSquareIcon from '@heroicons/react/24/outline/ArrowTopRightOnSquareIcon';
+import { Box, ButtonBase, Collapse, SvgIcon } from '@mui/material';
+
+export const SideNavItem = (props) => {
+ const {
+ active = false,
+ children,
+ collapse = false,
+ depth = 0,
+ external = false,
+ icon,
+ openImmediately = false,
+ path,
+ title
+ } = props;
+ const [open, setOpen] = useState(openImmediately);
+
+ const handleToggle = useCallback(() => {
+ setOpen((prevOpen) => !prevOpen);
+ }, []);
+
+ // Branch
+
+ if (children) {
+ return (
+
+ theme.typography.fontFamily,
+ fontSize: 14,
+ fontWeight: 500,
+ justifyContent: 'flex-start',
+ px: '6px',
+ py: '12px',
+ textAlign: 'left',
+ whiteSpace: 'nowrap',
+ width: '100%'
+ }}
+ >
+
+ {icon}
+
+
+ {title}
+
+
+ {open ? : }
+
+
+
+ {children}
+
+
+ );
+ }
+
+ // Leaf
+
+ const linkProps = path
+ ? external
+ ? {
+ component: 'a',
+ href: path,
+ target: '_blank'
+ }
+ : {
+ component: NextLink,
+ href: path
+ }
+ : {};
+
+ return (
+
+ theme.typography.fontFamily,
+ fontSize: 14,
+ fontWeight: 500,
+ justifyContent: 'flex-start',
+ px: '6px',
+ py: '12px',
+ textAlign: 'left',
+ whiteSpace: 'nowrap',
+ width: '100%'
+ }}
+ {...linkProps}>
+
+ {icon}
+
+
+ {title}
+
+ {external && (
+
+
+
+ )}
+
+
+ );
+};
+
+SideNavItem.propTypes = {
+ active: PropTypes.bool,
+ children: PropTypes.any,
+ collapse: PropTypes.bool,
+ depth: PropTypes.number,
+ external: PropTypes.bool,
+ icon: PropTypes.any,
+ openImmediately: PropTypes.bool,
+ path: PropTypes.string,
+ title: PropTypes.string.isRequired
+};
diff --git a/src/layouts/dashboard/side-nav.js b/src/layouts/dashboard/side-nav.js
new file mode 100644
index 000000000000..44e77514dc17
--- /dev/null
+++ b/src/layouts/dashboard/side-nav.js
@@ -0,0 +1,154 @@
+import { useState } from 'react';
+import { usePathname } from 'next/navigation';
+import PropTypes from 'prop-types';
+import ChevronLeftIcon from '@heroicons/react/24/outline/ChevronLeftIcon';
+import ChevronRightIcon from '@heroicons/react/24/outline/ChevronRightIcon';
+import { Box, Divider, Drawer, IconButton, Stack, SvgIcon } from '@mui/material';
+import { Scrollbar } from '../../components/scrollbar';
+import { items } from './config';
+import { SideNavItem } from './side-nav-item';
+
+const SIDE_NAV_WIDTH = 270;
+const SIDE_NAV_COLLAPSED_WIDTH = 73; // icon size + padding + border right
+const TOP_NAV_HEIGHT = 64;
+
+const renderItems = ({ collapse = false, depth = 0, items, pathname }) => items.reduce((acc,
+ item) => reduceChildRoutes({
+ acc,
+ collapse,
+ depth,
+ item,
+ pathname
+}), []);
+
+const reduceChildRoutes = ({ acc, collapse, depth, item, pathname }) => {
+ const checkPath = !!(item.path && pathname);
+ const partialMatch = checkPath ? pathname.includes(item.path) : false;
+ const exactMatch = checkPath ? pathname === item.path : false;
+
+ if (item.items) {
+ acc.push(
+
+
+ {renderItems({
+ collapse,
+ depth: depth + 1,
+ items: item.items,
+ pathname
+ })}
+
+
+ );
+ } else {
+ acc.push(
+
+ );
+ }
+
+ return acc;
+};
+
+export const SideNav = (props) => {
+ const { onPin, pinned = false } = props;
+ const pathname = usePathname();
+ const [hovered, setHovered] = useState(false);
+
+ const collapse = !(pinned || hovered);
+
+ return (
+ { setHovered(true); },
+ onMouseLeave: () => { setHovered(false); },
+ sx: {
+ backgroundColor: 'background.default',
+ height: `calc(100% - ${TOP_NAV_HEIGHT}px)`,
+ overflowX: 'hidden',
+ top: TOP_NAV_HEIGHT,
+ transition: 'width 250ms ease-in-out',
+ width: collapse ? SIDE_NAV_COLLAPSED_WIDTH : SIDE_NAV_WIDTH,
+ zIndex: (theme) => theme.zIndex.appBar - 100
+ }
+ }}
+ >
+
+
+
+ {renderItems({
+ collapse,
+ depth: 0,
+ items,
+ pathname
+ })}
+
+
+
+
+
+ {pinned ? : }
+
+
+
+
+
+
+ );
+};
+
+SideNav.propTypes = {
+ onPin: PropTypes.func,
+ pinned: PropTypes.bool
+};
diff --git a/src/layouts/dashboard/top-nav.js b/src/layouts/dashboard/top-nav.js
new file mode 100644
index 000000000000..d6d6d89d8e09
--- /dev/null
+++ b/src/layouts/dashboard/top-nav.js
@@ -0,0 +1,96 @@
+import { useCallback } from "react";
+import NextLink from "next/link";
+import PropTypes from "prop-types";
+import Bars3Icon from "@heroicons/react/24/outline/Bars3Icon";
+import MoonIcon from "@heroicons/react/24/outline/MoonIcon";
+import SunIcon from "@heroicons/react/24/outline/SunIcon";
+import { Box, Divider, IconButton, Stack, SvgIcon, useMediaQuery } from "@mui/material";
+import { Logo } from "../../components/logo";
+import { useSettings } from "../../hooks/use-settings";
+import { paths } from "../../paths";
+import { AccountPopover } from "./account-popover";
+const TOP_NAV_HEIGHT = 64;
+
+export const TopNav = (props) => {
+ const { onNavOpen } = props;
+ const settings = useSettings();
+ const mdDown = useMediaQuery((theme) => theme.breakpoints.down("md"));
+
+ const handleThemeSwitch = useCallback(() => {
+ settings.handleUpdate({
+ paletteMode: settings.paletteMode === "light" ? "dark" : "light",
+ });
+ }, [settings]);
+
+ return (
+ theme.zIndex.appBar,
+ }}
+ >
+
+
+ }
+ >
+
+
+
+
+ {mdDown && (
+
+
+
+
+
+ )}
+
+
+ {!mdDown && (
+
+
+ {settings.paletteMode === "dark" ? : }
+
+
+ )}
+
+
+
+
+ );
+};
+
+TopNav.propTypes = {
+ onNavOpen: PropTypes.func,
+ openNav: PropTypes.bool,
+};
diff --git a/src/layouts/product/index.js b/src/layouts/product/index.js
new file mode 100644
index 000000000000..7cc8cfe8e778
--- /dev/null
+++ b/src/layouts/product/index.js
@@ -0,0 +1,257 @@
+import { useCallback, useEffect, useState } from 'react';
+import NextLink from 'next/link';
+import { usePathname, useRouter } from 'next/navigation';
+import PropTypes from 'prop-types';
+import toast from 'react-hot-toast';
+import ArrowLeftIcon from '@heroicons/react/24/outline/ArrowLeftIcon';
+import {
+ Box,
+ Button,
+ Container,
+ Divider,
+ Skeleton,
+ Stack,
+ SvgIcon,
+ Tab,
+ Tabs,
+ Typography
+} from '@mui/material';
+import { productsApi } from '../../api/products';
+import { ActionsMenu } from '../../components/actions-menu';
+import { ConfirmationDialog } from '../../components/confirmation-dialog';
+import { ResourceError } from '../../components/resource-error';
+import { ResourceUnavailable } from '../../components/resource-unavailable';
+import { useDialog } from '../../hooks/use-dialog';
+import { useMounted } from '../../hooks/use-mounted';
+import { paths } from '../../paths';
+
+const tabOptions = [
+ {
+ label: 'Summary',
+ path: paths.dashboard.products.details.index
+ },
+ {
+ label: 'Inventory',
+ path: paths.dashboard.products.details.inventory
+ },
+ {
+ label: 'Insights',
+ path: paths.dashboard.products.details.insights
+ }
+];
+
+const useProductStore = () => {
+ const isMounted = useMounted();
+ const [state, setState] = useState({ isLoading: true });
+
+ const handleProductGet = useCallback(async () => {
+ setState({ isLoading: true });
+
+ try {
+ const response = await productsApi.getProduct();
+
+ if (isMounted()) {
+ setState({ data: response });
+ }
+ } catch (err) {
+ console.error(err);
+
+ if (isMounted()) {
+ setState({ error: 'Something went wrong' });
+ }
+ }
+ }, [isMounted]);
+
+ useEffect(() => {
+ handleProductGet();
+ },
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ []);
+
+ return {
+ state
+ };
+};
+
+const getResourcesState = (storeState) => {
+ if (storeState.isLoading) {
+ return 'loading';
+ }
+
+ if (storeState.error) {
+ return 'error';
+ }
+
+ return storeState.data ? 'available' : 'unavailable';
+};
+
+export const Layout = (props) => {
+ const { children } = props;
+ const router = useRouter();
+ const pathname = usePathname();
+ const productStore = useProductStore();
+ const discontinueDialog = useDialog();
+ const archiveDialog = useDialog();
+
+ const handleInvoiceSend = useCallback(() => {
+ toast.error('This action is not available on demo');
+ }, []);
+
+ const handleDiscontinue = useCallback(() => {
+ discontinueDialog.handleClose();
+ toast.error('This action is not available on demo');
+ }, [discontinueDialog]);
+
+ const handleArchive = useCallback(() => {
+ archiveDialog.handleClose();
+ toast.error('This action is not available on demo');
+ }, [archiveDialog]);
+
+ const handleTabsChange = useCallback((event, value) => {
+ router.push(value);
+ }, [router]);
+
+ const currentTab = tabOptions.find((option) => option.path === pathname);
+
+ const resourcesState = getResourcesState(productStore.state);
+
+ return (
+ <>
+
+
+ {resourcesState === 'loading' && (
+
+
+
+
+
+ )}
+ {resourcesState === 'error' && (
+
+ )}
+ {resourcesState === 'unavailable' && (
+
+ )}
+ {resourcesState === 'available' && (
+
+
+
+
+
+
+ )}
+ variant="text"
+ >
+ Products
+
+
+
+
+
+ Product
+
+
+
+
+ Published
+
+
+
+
+
+
+
+ {tabOptions.map((option) => (
+
+ ))}
+
+
+
+
+ {children}
+
+ )}
+
+
+
+
+ >
+ );
+};
+
+Layout.propTypes = {
+ children: PropTypes.node
+};
diff --git a/src/layouts/reports/index.js b/src/layouts/reports/index.js
new file mode 100644
index 000000000000..b005609be2dd
--- /dev/null
+++ b/src/layouts/reports/index.js
@@ -0,0 +1,34 @@
+import PropTypes from "prop-types";
+import { Box, Container, Stack } from "@mui/material";
+import { paths } from "../../paths";
+
+const tabOptions = [
+ {
+ label: "Overview",
+ path: paths.index,
+ },
+];
+
+export const Layout = (props) => {
+ const { children } = props;
+
+ return (
+
+
+
+
+ {children}
+
+
+
+ );
+};
+
+Layout.propTypes = {
+ children: PropTypes.node,
+};
diff --git a/src/libs/nprogress.js b/src/libs/nprogress.js
new file mode 100644
index 000000000000..3192306a9013
--- /dev/null
+++ b/src/libs/nprogress.js
@@ -0,0 +1,6 @@
+import Router from 'next/router';
+import nProgress from 'nprogress';
+
+Router.events.on('routeChangeStart', nProgress.start);
+Router.events.on('routeChangeError', nProgress.done);
+Router.events.on('routeChangeComplete', nProgress.done);
diff --git a/src/pages/404.js b/src/pages/404.js
new file mode 100644
index 000000000000..db11c0a21e86
--- /dev/null
+++ b/src/pages/404.js
@@ -0,0 +1,64 @@
+import NextLink from 'next/link';
+import Head from 'next/head';
+import { Box, Button, Container, Typography } from '@mui/material';
+import { paths } from '../paths';
+
+const Page = () => (
+ <>
+
+
+ Error: Not Found | Material Kit Pro
+
+
+
+
+
+
+
+
+ Nothing here!
+
+
+ The page requested does not exist.
+
+
+ Take me home
+
+
+
+ >
+);
+
+export default Page;
diff --git a/src/pages/_app.js b/src/pages/_app.js
new file mode 100644
index 000000000000..eec179f55e02
--- /dev/null
+++ b/src/pages/_app.js
@@ -0,0 +1,73 @@
+import { useEffect } from "react";
+import Head from "next/head";
+import { Toaster } from "react-hot-toast";
+import { Provider as ReduxProvider } from "react-redux";
+import { CacheProvider } from "@emotion/react";
+import { ThemeProvider } from "@mui/material/styles";
+import CssBaseline from "@mui/material/CssBaseline";
+import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider";
+import { AdapterDateFns } from "@mui/x-date-pickers/AdapterDateFns";
+import { SettingsConsumer, SettingsProvider } from "../contexts/settings-context";
+import { RTL } from "../components/rtl";
+import { store } from "../store";
+import { createTheme } from "../theme";
+import { createEmotionCache } from "../utils/create-emotion-cache";
+import "../libs/nprogress";
+// Remove if locales are not used
+import "../i18n";
+import Toasts from "../components/toaster";
+import { PrivateRoute } from "../components/PrivateRoute";
+import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
+
+const queryClient = new QueryClient();
+const clientSideEmotionCache = createEmotionCache();
+
+const App = (props) => {
+ const { Component, emotionCache = clientSideEmotionCache, pageProps } = props;
+
+ const getLayout = Component.getLayout ?? ((page) => page);
+
+ return (
+
+
+ CyberDrain User Manager
+
+
+
+
+
+
+
+
+ {(settings) => {
+ // Prevent theme flicker when restoring custom settings from browser storage
+ if (!settings.isInitialized) {
+ // return null;
+ }
+ const theme = createTheme({
+ colorPreset: "green",
+ direction: settings.direction,
+ paletteMode: settings.paletteMode,
+ contrast: "high",
+ });
+
+ return (
+
+
+
+ {getLayout( )}
+
+
+
+ );
+ }}
+
+
+
+
+
+
+ );
+};
+
+export default App;
diff --git a/src/pages/_document.js b/src/pages/_document.js
new file mode 100644
index 000000000000..c764cde02995
--- /dev/null
+++ b/src/pages/_document.js
@@ -0,0 +1,63 @@
+import { Children } from 'react';
+import Document, { Head, Html, Main, NextScript } from 'next/document';
+import createEmotionServer from '@emotion/server/create-instance';
+import { createEmotionCache } from '../utils/create-emotion-cache';
+
+class CustomDocument extends Document {
+ render() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+CustomDocument.getInitialProps = async (ctx) => {
+ const originalRenderPage = ctx.renderPage;
+ const cache = createEmotionCache();
+ const { extractCriticalToChunks } = createEmotionServer(cache);
+
+ ctx.renderPage = () => originalRenderPage({
+ enhanceApp: (App) => (props) => (
+
+ )
+ });
+
+ const initialProps = await Document.getInitialProps(ctx);
+ const emotionStyles = extractCriticalToChunks(initialProps.html);
+ const emotionStyleTags = emotionStyles.styles.map((style) => (
+
+ ));
+
+ return {
+ ...initialProps,
+ styles: [...Children.toArray(initialProps.styles), ...emotionStyleTags]
+ };
+};
+
+export default CustomDocument;
diff --git a/src/pages/domains.js b/src/pages/domains.js
new file mode 100644
index 000000000000..db06015ac80d
--- /dev/null
+++ b/src/pages/domains.js
@@ -0,0 +1,150 @@
+import Head from "next/head";
+import { useRef } from "react";
+import {
+ Alert,
+ Box,
+ Button,
+ Card,
+ CircularProgress,
+ Container,
+ Dialog,
+ DialogActions,
+ DialogContent,
+ DialogTitle,
+ Divider,
+ Stack,
+ TextField,
+ Typography,
+} from "@mui/material";
+import { useDialog } from "../hooks/use-dialog";
+import { Layout as DashboardLayout } from "../layouts/dashboard";
+import { CippDataTable } from "../components/CippTable/CippDataTable";
+import { ReactQueryDevtools } from "@tanstack/react-query-devtools";
+import { TrashIcon } from "@heroicons/react/24/outline";
+import { ApiPostCall } from "../api/ApiCall";
+import { useFormik } from "formik";
+
+const Page = () => {
+ const ref = useRef();
+ const createDialog = useDialog();
+ const domainPostRequest = ApiPostCall({
+ urlFromData: true,
+ relatedQueryKeys: "users",
+ });
+
+ const formik = useFormik({
+ initialValues: {
+ domainName: "",
+ },
+ onSubmit: async (values, helpers) => {
+ try {
+ domainPostRequest.mutate({ url: "/api/AddCustomDomain", ...values });
+ helpers.resetForm();
+ helpers.setStatus({ success: true });
+ helpers.setSubmitting(false);
+ } catch (err) {
+ helpers.setStatus({ success: false });
+ helpers.setErrors({ submit: err.message });
+ helpers.setSubmitting(false);
+ }
+ },
+ });
+
+ return (
+ <>
+
+ Devices
+
+
+
+
+
+
+
+
+ Add Domain}
+ actions={[
+ {
+ label: "Delete domain",
+ type: "GET",
+ url: "api/DeleteCustomDomain",
+ data: { domain: "Domain" },
+ icon: ,
+ },
+ ]}
+ simple={false}
+ api={{ url: "api/ListCustomDomains" }}
+ columns={[
+ {
+ header: "Domain",
+ accessorKey: "Domain",
+ },
+ {
+ header: "Status",
+ accessorKey: "Status",
+ },
+ ]}
+ />
+
+
+
+
+
+
+
+ >
+ );
+};
+
+Page.getLayout = (page) => {page} ;
+
+export default Page;
diff --git a/src/pages/index.js b/src/pages/index.js
new file mode 100644
index 000000000000..d88eed5d31b3
--- /dev/null
+++ b/src/pages/index.js
@@ -0,0 +1,104 @@
+import Head from "next/head";
+import { Unstable_Grid2 as Grid } from "@mui/material";
+import { Layout as DashboardLayout } from "../layouts/dashboard";
+import { Layout as ReportsLayout } from "../layouts/reports";
+import { paths } from "../paths";
+import { CippImageCard } from "../components/CippCards/CippImageCard.jsx";
+import { ApiGetCall } from "../api/ApiCall.jsx";
+import { CippPropertyListCard } from "../components/CippCards/CippPropertyListCard.jsx";
+import { DomainAdd, Email, LockOpen } from "@mui/icons-material";
+import { UserPlusIcon } from "@heroicons/react/24/outline";
+
+const now = new Date();
+
+const Page = () => {
+ const deviceData = ApiGetCall({
+ url: "/api/deploymentstatus",
+ queryKey: "deploymentstatus",
+ });
+ return (
+ <>
+
+ CyberDrain Backend Manager
+
+
+
+
+
+
+
+ {deviceData.data?.deployed === true && (
+ ,
+ // link: paths.onboarding,
+ // },
+ {
+ label: "Add User",
+ icon: ,
+ link: paths.users,
+ },
+ {
+ label: "Add Domain",
+ icon: ,
+ link: paths.domains,
+ },
+ ]}
+ />
+ )}
+
+
+
+ >
+ );
+};
+
+Page.getLayout = (page) => (
+
+ {page}
+
+);
+
+export default Page;
diff --git a/src/pages/onboarding.js b/src/pages/onboarding.js
new file mode 100644
index 000000000000..a65df914ea72
--- /dev/null
+++ b/src/pages/onboarding.js
@@ -0,0 +1,93 @@
+import Head from "next/head";
+import { Box, Container, Stack, Typography } from "@mui/material";
+import { Layout as DashboardLayout } from "../layouts/dashboard";
+import { CippWizard } from "../components/CippWizard/CippWizard";
+import {
+ BuildingOfficeIcon,
+ CloudIcon,
+ CpuChipIcon,
+ NewspaperIcon,
+} from "@heroicons/react/24/outline";
+import { Api, BackupTable, Key } from "@mui/icons-material";
+import { CippPSACredentialsStep } from "../components/CippWizard/CippPSACredentialsStep";
+import { CippPSASyncOptions } from "../components/CippWizard/CippPSASyncOptions";
+import { CippWizardConfirmation } from "../components/CippWizard/CippWizardConfirmation";
+import { CippWizardOptionsList } from "../components/CippWizard/CippWizardOptionsList";
+import { CippDeploymentStep } from "../components/CippWizard/CIPPDeploymentStep";
+
+const Page = () => {
+ const steps = [
+ {
+ title: "Step 1",
+ description: "Onboarding",
+ component: CippWizardOptionsList,
+ componentProps: {
+ title: "Select your option",
+ subtext: "Choose the onboarding option",
+ valuesKey: "Option",
+ options: [
+ {
+ description: "I want to deploy my instance for the first time.",
+ icon: ,
+ label: "Deploy my Instance",
+ value: "Deploy",
+ },
+ {
+ description: "I want to deploy API Access for my instance.",
+ icon: ,
+ label: "API Setup",
+ value: "Api",
+ },
+ {
+ description: "I want to see my API credentials",
+ icon: ,
+ label: "API Credentials",
+ value: "Creds",
+ },
+ ],
+ },
+ },
+ {
+ title: "Step 2",
+ description: "Configuration",
+ component: CippDeploymentStep,
+ },
+ {
+ title: "Step 3",
+ description: "Confirmation",
+ component: CippWizardConfirmation,
+ },
+ ];
+
+ return (
+ <>
+
+ CyberDrain Onboarding
+
+
+
+
+
+ Onboarding
+
+
+
+
+
+
+
+
+
+ >
+ );
+};
+
+Page.getLayout = (page) => {page} ;
+
+export default Page;
diff --git a/src/pages/unauthenticated.js b/src/pages/unauthenticated.js
new file mode 100644
index 000000000000..770fd2fc0a55
--- /dev/null
+++ b/src/pages/unauthenticated.js
@@ -0,0 +1,43 @@
+import { Grid } from "@mui/material";
+import { Layout as DashboardLayout } from "../layouts/dashboard";
+import Head from "next/head.js";
+import { CippImageCard } from "../components/CippCards/CippImageCard.jsx";
+import { Layout as ReportsLayout } from "../layouts/reports";
+
+const UnauthenticatedPage = () => {
+ return (
+
+
+
+ Devices
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default UnauthenticatedPage;
diff --git a/src/pages/users.js b/src/pages/users.js
new file mode 100644
index 000000000000..14fbba469281
--- /dev/null
+++ b/src/pages/users.js
@@ -0,0 +1,223 @@
+import Head from "next/head";
+import {
+ Alert,
+ Box,
+ Button,
+ Card,
+ CircularProgress,
+ Container,
+ Dialog,
+ DialogActions,
+ DialogContent,
+ DialogTitle,
+ Divider,
+ Icon,
+ IconButton,
+ Stack,
+ SvgIcon,
+ Switch,
+ TextField,
+ Tooltip,
+ Typography,
+} from "@mui/material";
+import { useDialog } from "../hooks/use-dialog";
+import { Layout as DashboardLayout } from "../layouts/dashboard";
+import { CippDataTable } from "../components/CippTable/CippDataTable";
+import { ReactQueryDevtools } from "@tanstack/react-query-devtools";
+import { CopyAll, Delete, Update } from "@mui/icons-material";
+import { CippAutoComplete } from "../components/CippComponents/CippAutocomplete";
+import { ApiPostCall } from "../api/ApiCall";
+import { useMemo, useState } from "react";
+import CopyToClipboard from "react-copy-to-clipboard";
+
+const Page = () => {
+ const actionPostRequest = ApiPostCall({
+ urlFromData: true,
+ relatedQueryKeys: "users",
+ });
+ const handleRoleChange = (userid, email, role) => {
+ actionPostRequest.mutate({
+ url: `/api/UpdateUser?userid=${userid}&role=${role}&email=${email}`,
+ data: {},
+ });
+ };
+ const createDialog = useDialog();
+ const handleSubmit = (e) => {
+ e.preventDefault();
+ const formData = new FormData(e.target);
+ let combinedRoles = "";
+ if (role.includes("superadmin")) {
+ //superadmin needs atleast superadmin +admin, so if superadmin is selected, we add admin as well
+ combinedRoles = role.includes("superadmin") ? role.join(",") : role.concat("admin").join(",");
+ } else {
+ combinedRoles = role.join(",");
+ }
+ const requestData = {
+ email: formData.get("email"),
+ role: combinedRoles,
+ ManagementAccess: formData.get("managementAccess") === "on",
+ };
+
+ actionPostRequest.mutate({ url: "/api/InviteUsers", ...requestData });
+ };
+ const [role, setRole] = useState([]);
+ const columns = [
+ {
+ header: "Email",
+ accessorKey: "DisplayName",
+ },
+ {
+ accessorKey: "Role",
+ header: "Roles",
+ minSize: 450,
+ Cell: ({ cell, row, table }) => (
+ <>
+ handleRoleChange(row.original.Name, row.original.DisplayName, nv)}
+ defaultValue={cell
+ .getValue()
+ .split(",")
+ .filter((x) => x !== "anonymous" && x !== "authenticated")}
+ />
+ >
+ ),
+ },
+ {
+ header: "Management Access",
+ accessorKey: "ManagementAccess",
+ Cell: ({ cell, row, table }) => (cell.getValue() ? "Yes" : "No"),
+ },
+ ];
+ return (
+ <>
+
+ Users
+
+
+
+
+
+
+
+ Add User}
+ title="Users"
+ noDataButton={{
+ createText: "Create a user",
+ createFunction: createDialog.handleOpen,
+ }}
+ actions={[
+ {
+ label: "Grant Management Access",
+ type: "GET",
+ url: "api/UpdateUser",
+ data: { userid: "Name", email: "DisplayName", managementAccess: true },
+ icon: ,
+ multiPost: false,
+ },
+ {
+ label: "Remove Management Access",
+ type: "GET",
+ url: "api/UpdateUser",
+ data: { userid: "Name", email: "DisplayName", managementAccess: false },
+ icon: ,
+ multiPost: false,
+ },
+ {
+ label: "Delete User",
+ type: "POST",
+ url: "api/DeleteUser",
+ data: { email: "DisplayName" },
+ icon: ,
+ multiPost: false,
+ },
+ ]}
+ simple={false}
+ api={{ url: "api/ListUsers" }}
+ columns={columns}
+ />
+
+
+
+
+
+
+
+ >
+ );
+};
+
+Page.getLayout = (page) => {page} ;
+
+export default Page;
diff --git a/src/paths.js b/src/paths.js
new file mode 100644
index 000000000000..f64a4578bad9
--- /dev/null
+++ b/src/paths.js
@@ -0,0 +1,7 @@
+export const paths = {
+ index: "/",
+ onboarding: "/onboarding",
+ users: "/users",
+ domains: "/domains",
+ credentials: "/credentials",
+};
diff --git a/src/sections/dashboard/account/account-2fa.js b/src/sections/dashboard/account/account-2fa.js
new file mode 100644
index 000000000000..84d9c05759e8
--- /dev/null
+++ b/src/sections/dashboard/account/account-2fa.js
@@ -0,0 +1,47 @@
+import { useCallback } from 'react';
+import toast from 'react-hot-toast';
+import { Button, Card, CardContent, Typography, Unstable_Grid2 as Grid } from '@mui/material';
+
+export const Account2FA = () => {
+ const handleActivate = useCallback(() => {
+ toast.success('Two-factor authentication activated');
+ }, []);
+
+ return (
+
+
+
+
+
+ Two-factor authentication (2FA)
+
+
+ Enhanced security for your mention account
+
+
+
+
+ Activate
+
+
+
+
+
+ );
+};
diff --git a/src/sections/dashboard/account/account-details.js b/src/sections/dashboard/account/account-details.js
new file mode 100644
index 000000000000..70f226b435bb
--- /dev/null
+++ b/src/sections/dashboard/account/account-details.js
@@ -0,0 +1,223 @@
+import { useFormik } from 'formik';
+import * as Yup from 'yup';
+import toast from 'react-hot-toast';
+import {
+ Avatar,
+ Box,
+ Button,
+ Card,
+ CardContent,
+ FormHelperText,
+ MenuItem,
+ Stack,
+ TextField,
+ Typography,
+ Unstable_Grid2 as Grid
+} from '@mui/material';
+import { useMockedUser } from '../../../hooks/use-mocked-user';
+
+const companySizeOptions = ['1-10', '11-30', '31-50', '50+'];
+
+const initialValues = {
+ companyName: 'Devias IO',
+ companySize: '1-10',
+ email: 'chen.simmons@devias.io',
+ jobTitle: 'Operation',
+ name: 'Chen Simmons',
+ submit: null
+};
+
+const validationSchema = Yup.object({
+ companyName: Yup
+ .string()
+ .max(255)
+ .required('Company name is required'),
+ companySize: Yup
+ .string()
+ .max(255)
+ .oneOf(companySizeOptions)
+ .required('Company size is required'),
+ email: Yup
+ .string()
+ .max(255)
+ .email('Must be a valid email')
+ .required('Email is required'),
+ jobTitle: Yup
+ .string()
+ .max(255)
+ .required('Job name is required'),
+ name: Yup
+ .string()
+ .max(255)
+ .required('Name is required')
+});
+
+export const AccountDetails = (props) => {
+ const user = useMockedUser();
+ const formik = useFormik({
+ initialValues,
+ validationSchema,
+ onSubmit: async (values, helpers) => {
+ try {
+ toast.success('Settings saved');
+ helpers.resetForm();
+ helpers.setStatus({ success: true });
+ helpers.setSubmitting(false);
+ } catch (err) {
+ console.error(err);
+ helpers.setStatus({ success: false });
+ helpers.setErrors({ submit: err.message });
+ helpers.setSubmitting(false);
+ }
+ }
+ });
+
+ return (
+
+
+
+
+
+ Settings
+
+
+
+
+
+
+
+
+ Change
+
+
+ Delete
+
+
+
+ Recommended dimensions: 200x200, maximum file size: 5MB
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/src/sections/dashboard/account/account-password.js b/src/sections/dashboard/account/account-password.js
new file mode 100644
index 000000000000..4f197beda810
--- /dev/null
+++ b/src/sections/dashboard/account/account-password.js
@@ -0,0 +1,121 @@
+import { useFormik } from 'formik';
+import * as Yup from 'yup';
+import toast from 'react-hot-toast';
+import {
+ Box,
+ Button,
+ Card,
+ CardContent,
+ FormHelperText,
+ Stack,
+ TextField,
+ Typography,
+ Unstable_Grid2 as Grid
+} from '@mui/material';
+
+const initialValues = {
+ newPassword: '',
+ password: '',
+ submit: null
+};
+
+const validationSchema = Yup.object({
+ newPassword: Yup
+ .string()
+ .min(7)
+ .max(255)
+ .required('New password is required'),
+ password: Yup
+ .string()
+ .min(7)
+ .max(255)
+ .required('Old password is required')
+});
+
+export const AccountPassword = (props) => {
+ const formik = useFormik({
+ initialValues,
+ validationSchema,
+ onSubmit: async (values, helpers) => {
+ try {
+ toast.success('Password changed');
+ helpers.resetForm();
+ helpers.setStatus({ success: true });
+ helpers.setSubmitting(false);
+ } catch (err) {
+ console.error(err);
+ helpers.setStatus({ success: false });
+ helpers.setErrors({ submit: err.message });
+ helpers.setSubmitting(false);
+ }
+ }
+ });
+
+ return (
+
+
+
+
+
+ Change password
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/src/sections/dashboard/calendar/calendar-container.js b/src/sections/dashboard/calendar/calendar-container.js
new file mode 100644
index 000000000000..4993fdf9bbe9
--- /dev/null
+++ b/src/sections/dashboard/calendar/calendar-container.js
@@ -0,0 +1,46 @@
+import { alpha, styled } from '@mui/material/styles';
+
+export const CalendarContainer = styled('div')(({ theme }) => ({
+ '& .fc-license-message': {
+ display: 'none'
+ },
+ '& .fc': {
+ '--fc-bg-event-opacity': 1,
+ '--fc-border-color': theme.palette.divider,
+ '--fc-daygrid-event-dot-width': '10px',
+ '--fc-event-text-color': theme.palette.primary.contrastText,
+ '--fc-list-event-hover-bg-color': theme.palette.background.default,
+ '--fc-neutral-bg-color': theme.palette.background.default,
+ '--fc-page-bg-color': theme.palette.background.default,
+ '--fc-today-bg-color': alpha(theme.palette.primary.main, 0.25),
+ color: theme.palette.text.primary,
+ fontFamily: theme.typography.fontFamily
+ },
+ '& .fc .fc-col-header-cell-cushion': {
+ paddingBottom: '10px',
+ paddingTop: '10px',
+ fontSize: theme.typography.overline.fontSize,
+ fontWeight: theme.typography.overline.fontWeight,
+ letterSpacing: theme.typography.overline.letterSpacing,
+ lineHeight: theme.typography.overline.lineHeight,
+ textTransform: theme.typography.overline.textTransform
+ },
+ '& .fc .fc-day-other .fc-daygrid-day-top': {
+ color: theme.palette.text.secondary
+ },
+ '& .fc-daygrid-event': {
+ borderRadius: theme.shape.borderRadius,
+ padding: '1px 4px',
+ fontSize: theme.typography.subtitle2.fontSize,
+ fontWeight: theme.typography.subtitle2.fontWeight,
+ lineHeight: theme.typography.subtitle2.lineHeight
+ },
+ '& .fc-daygrid-block-event .fc-event-time': {
+ fontSize: theme.typography.body2.fontSize,
+ fontWeight: theme.typography.body2.fontWeight,
+ lineHeight: theme.typography.body2.lineHeight
+ },
+ '& .fc-daygrid-day-frame': {
+ padding: '12px'
+ }
+}));
diff --git a/src/sections/dashboard/calendar/calendar-event-dialog.js b/src/sections/dashboard/calendar/calendar-event-dialog.js
new file mode 100644
index 000000000000..c7682b638a3d
--- /dev/null
+++ b/src/sections/dashboard/calendar/calendar-event-dialog.js
@@ -0,0 +1,291 @@
+import { useCallback, useMemo } from 'react';
+import PropTypes from 'prop-types';
+import toast from 'react-hot-toast';
+import { addMinutes } from 'date-fns';
+import * as Yup from 'yup';
+import { useFormik } from 'formik';
+import TrashIcon from '@heroicons/react/24/outline/TrashIcon';
+import {
+ Box,
+ Button,
+ Dialog,
+ Divider,
+ FormControlLabel,
+ FormHelperText,
+ IconButton,
+ Stack,
+ SvgIcon,
+ Switch,
+ TextField,
+ Typography
+} from '@mui/material';
+import { DateTimePicker } from '@mui/x-date-pickers';
+import { useDispatch } from '../../../store';
+import { thunks } from '../../../thunks/calendar';
+
+const useInitialValues = (event, range) => {
+ return useMemo(() => {
+ if (event) {
+ return {
+ allDay: event.allDay || false,
+ color: event.color || '',
+ description: event.description || '',
+ end: event.end ? new Date(event.end) : addMinutes(new Date(), 30),
+ start: event.start ? new Date(event.start) : new Date(),
+ title: event.title || '',
+ submit: null
+ };
+ }
+
+ if (range) {
+ return {
+ allDay: false,
+ color: '',
+ description: '',
+ end: new Date(range.end),
+ start: new Date(range.start),
+ title: '',
+ submit: null
+ };
+ }
+
+ return {
+ allDay: false,
+ color: '',
+ description: '',
+ end: addMinutes(new Date(), 30),
+ start: new Date(),
+ title: '',
+ submit: null
+ };
+ }, [event, range]);
+};
+
+const validationSchema = Yup.object({
+ allDay: Yup.bool(),
+ description: Yup.string().max(5000),
+ end: Yup.date(),
+ start: Yup.date(),
+ title: Yup
+ .string()
+ .max(255)
+ .required('Title is required')
+});
+
+export const CalendarEventDialog = (props) => {
+ const {
+ action = 'create',
+ event,
+ onAddComplete,
+ onClose,
+ onDeleteComplete,
+ onEditComplete,
+ open = false,
+ range
+ } = props;
+ const dispatch = useDispatch();
+ const initialValues = useInitialValues(event, range);
+ const formik = useFormik({
+ enableReinitialize: true,
+ initialValues,
+ validationSchema,
+ onSubmit: async (values, helpers) => {
+ try {
+ const data = {
+ allDay: values.allDay,
+ description: values.description,
+ end: values.end.getTime(),
+ start: values.start.getTime(),
+ title: values.title
+ };
+
+ if (action === 'update') {
+ await dispatch(thunks.updateEvent({
+ eventId: event.id,
+ update: data
+ }));
+ toast.success('Event updated');
+ } else {
+ await dispatch(thunks.createEvent(data));
+ toast.success('Event added');
+ }
+
+ if (!event) {
+ onAddComplete?.();
+ } else {
+ onEditComplete?.();
+ }
+ } catch (err) {
+ console.error(err);
+ toast.error('Something went wrong!');
+ helpers.setStatus({ success: false });
+ helpers.setErrors({ submit: err.message });
+ helpers.setSubmitting(false);
+ }
+ }
+ });
+
+ const handleStartDateChange = useCallback((date) => {
+ formik.setFieldValue('start', date);
+
+ // Prevent end date to be before start date
+ if (formik.values.end && date && date > formik.values.end) {
+ formik.setFieldValue('end', date);
+ }
+ }, [formik]);
+
+ const handleEndDateChange = useCallback((date) => {
+ formik.setFieldValue('end', date);
+
+ // Prevent start date to be after end date
+ if (formik.values.start && date && date < formik.values.start) {
+ formik.setFieldValue('start', date);
+ }
+ }, [formik]);
+
+ const handleDelete = useCallback(async () => {
+ if (!event) {
+ return;
+ }
+
+ try {
+ await dispatch(thunks.deleteEvent({
+ eventId: event.id
+ }));
+ onDeleteComplete?.();
+ } catch (err) {
+ console.error(err);
+ }
+ }, [dispatch, event, onDeleteComplete]);
+
+ if (action === 'update' && !event) {
+ return null;
+ }
+
+ return (
+
+
+
+ );
+};
+
+CalendarEventDialog.propTypes = {
+ action: PropTypes.oneOf(['create', 'update']),
+ event: PropTypes.object,
+ onAddComplete: PropTypes.func,
+ onClose: PropTypes.func,
+ onDeleteComplete: PropTypes.func,
+ onEditComplete: PropTypes.func,
+ open: PropTypes.bool,
+ range: PropTypes.object
+};
diff --git a/src/sections/dashboard/calendar/calendar-toolbar.js b/src/sections/dashboard/calendar/calendar-toolbar.js
new file mode 100644
index 000000000000..bb4122dbad16
--- /dev/null
+++ b/src/sections/dashboard/calendar/calendar-toolbar.js
@@ -0,0 +1,124 @@
+import { useCallback } from 'react';
+import PropTypes from 'prop-types';
+import { format } from 'date-fns';
+import {
+ Button,
+ ButtonGroup,
+ IconButton,
+ Stack,
+ SvgIcon,
+ Tooltip,
+ Typography
+} from '@mui/material';
+import ViewConfigIcon from '@mui/icons-material/ViewComfy';
+import ViewWeekIcon from '@mui/icons-material/ViewWeek';
+import ViewDayIcon from '@mui/icons-material/ViewDay';
+import ViewAgendaIcon from '@mui/icons-material/ViewAgenda';
+
+const viewOptions = [
+ {
+ icon: (
+
+
+
+ ),
+ label: 'Month',
+ value: 'dayGridMonth'
+ },
+ {
+ icon: (
+
+
+
+ ),
+ label: 'Week',
+ value: 'timeGridWeek'
+ },
+ {
+ icon: (
+
+
+
+ ),
+ label: 'Day',
+ value: 'timeGridDay'
+ },
+ {
+ icon: (
+
+
+
+ ),
+ label: 'Agenda',
+ value: 'listWeek'
+ }
+];
+
+export const CalendarToolbar = (props) => {
+ const { date, onDateNext, onDatePrev, onDateToday, onViewChange, view, ...other } = props;
+
+ const handleViewChange = useCallback((view) => {
+ onViewChange?.(view);
+ }, [onViewChange]);
+
+ const today = format(date, 'MMMM y');
+
+ return (
+
+
+
+ Prev
+
+
+ Today
+
+
+ Next
+
+
+
+ {today}
+
+
+ {viewOptions.map((option) => {
+ const isCurrent = option.value === view;
+
+ return (
+
+ handleViewChange(option.value)}
+ >
+ {option.icon}
+
+
+ );
+ })}
+
+
+ );
+};
+
+CalendarToolbar.propTypes = {
+ children: PropTypes.node,
+ date: PropTypes.instanceOf(Date).isRequired,
+ onAddClick: PropTypes.func,
+ onDateNext: PropTypes.func,
+ onDatePrev: PropTypes.func,
+ onDateToday: PropTypes.func,
+ onViewChange: PropTypes.func,
+ view: PropTypes.oneOf([
+ 'dayGridMonth',
+ 'timeGridWeek',
+ 'timeGridDay',
+ 'listWeek'
+ ]).isRequired
+};
diff --git a/src/sections/dashboard/components/card-headings/card-heading-1.js b/src/sections/dashboard/components/card-headings/card-heading-1.js
new file mode 100644
index 000000000000..ca4ae828d7cf
--- /dev/null
+++ b/src/sections/dashboard/components/card-headings/card-heading-1.js
@@ -0,0 +1,7 @@
+import { Card, CardHeader } from '@mui/material';
+
+export const CardHeading1 = () => (
+
+
+
+);
diff --git a/src/sections/dashboard/components/card-headings/card-heading-2.js b/src/sections/dashboard/components/card-headings/card-heading-2.js
new file mode 100644
index 000000000000..e55a28c062e0
--- /dev/null
+++ b/src/sections/dashboard/components/card-headings/card-heading-2.js
@@ -0,0 +1,10 @@
+import { Card, CardHeader } from '@mui/material';
+
+export const CardHeading2 = () => (
+
+
+
+);
diff --git a/src/sections/dashboard/components/card-headings/card-heading-3.js b/src/sections/dashboard/components/card-headings/card-heading-3.js
new file mode 100644
index 000000000000..40a4f2c9b1c9
--- /dev/null
+++ b/src/sections/dashboard/components/card-headings/card-heading-3.js
@@ -0,0 +1,50 @@
+import ChevronDownIcon from '@heroicons/react/24/outline/ChevronDownIcon';
+import EllipsisVerticalIcon from '@heroicons/react/24/outline/EllipsisVerticalIcon';
+import {
+ Button,
+ Card,
+ CardHeader,
+ cardHeaderClasses,
+ IconButton,
+ Stack,
+ SvgIcon
+} from '@mui/material';
+
+export const CardHeading3 = () => (
+
+
+
+
+
+ )}
+ size="small"
+ variant="text"
+ >
+ Most recent
+
+
+
+
+
+
+
+ )}
+ subheader="List of the latest orders"
+ sx={{
+ [`& .${cardHeaderClasses.action}`]: {
+ alignSelf: 'center'
+ }
+ }}
+ title="Orders"
+ />
+
+);
diff --git a/src/sections/dashboard/components/data-states/data-state-1.js b/src/sections/dashboard/components/data-states/data-state-1.js
new file mode 100644
index 000000000000..de1c4121ac36
--- /dev/null
+++ b/src/sections/dashboard/components/data-states/data-state-1.js
@@ -0,0 +1,25 @@
+import { Box, Skeleton, Table, TableCell, TableHead, TableRow } from '@mui/material';
+import { Scrollbar } from '../../../../components/scrollbar';
+
+export const DataState1 = () => (
+
+
+
+
+
+ {['Name', 'Phone', 'Email', 'Create at', 'Actions'].map((column) => (
+
+ {column}
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+);
diff --git a/src/sections/dashboard/components/data-states/data-state-2.js b/src/sections/dashboard/components/data-states/data-state-2.js
new file mode 100644
index 000000000000..88674c4a049e
--- /dev/null
+++ b/src/sections/dashboard/components/data-states/data-state-2.js
@@ -0,0 +1,11 @@
+import { Box } from '@mui/material';
+import { ResourceUnavailable } from '../../../../components/resource-unavailable';
+
+export const DataState2 = () => (
+
+ { }}
+ />
+
+);
diff --git a/src/sections/dashboard/components/data-states/data-state-3.js b/src/sections/dashboard/components/data-states/data-state-3.js
new file mode 100644
index 000000000000..083301aef7ff
--- /dev/null
+++ b/src/sections/dashboard/components/data-states/data-state-3.js
@@ -0,0 +1,11 @@
+import { Box } from '@mui/material';
+import { ResourceError } from '../../../../components/resource-error';
+
+export const DataState3 = () => (
+
+ { }}
+ />
+
+);
diff --git a/src/sections/dashboard/components/images-uploader.js b/src/sections/dashboard/components/images-uploader.js
new file mode 100644
index 000000000000..6642ffa355c0
--- /dev/null
+++ b/src/sections/dashboard/components/images-uploader.js
@@ -0,0 +1,120 @@
+import { useCallback, useState } from 'react';
+import TrashIcon from '@heroicons/react/24/outline/TrashIcon';
+import {
+ Box,
+ Button,
+ Card,
+ CardContent,
+ IconButton,
+ Stack,
+ SvgIcon,
+ Typography
+} from '@mui/material';
+import { alpha } from '@mui/material/styles';
+import { ImagesDialog } from '../../../components/images-dialog';
+import { useDialog } from '../../../hooks/use-dialog';
+
+export const ImagesUploader = () => {
+ const dialog = useDialog();
+ const [images, setImages] = useState([
+ '/assets/products/product-1.png',
+ '/assets/products/product-5.png',
+ '/assets/products/product-7.png'
+ ]);
+
+ const handleSelectMany = useCallback((images) => {
+ dialog.handleClose();
+ setImages((prevState) => ([
+ ...prevState,
+ ...images
+ ]));
+ }, [dialog]);
+
+ const handleDeleteOne = useCallback((image) => {
+ setImages((prevState) => {
+ return prevState.filter((_image) => _image !== image);
+ });
+ }, []);
+
+ return (
+ <>
+
+
+
+
+ Images
+
+
+
+
+ Browse
+
+
+
+ {images.map((image) => (
+ div': {
+ opacity: 1
+ }
+ }
+ }}
+ >
+ alpha(theme.palette.neutral[900], 0.8),
+ display: 'flex',
+ height: '100%',
+ justifyContent: 'center',
+ left: 0,
+ opacity: 0,
+ position: 'absolute',
+ top: 0,
+ width: '100%'
+ }}
+ >
+ handleDeleteOne(image)}
+ >
+
+
+
+
+
+
+ ))}
+
+
+
+
+
+
+ >
+ );
+};
diff --git a/src/sections/dashboard/components/lists/list-1.js b/src/sections/dashboard/components/lists/list-1.js
new file mode 100644
index 000000000000..fb9534efe15d
--- /dev/null
+++ b/src/sections/dashboard/components/lists/list-1.js
@@ -0,0 +1,48 @@
+import ArchiveBoxIcon from '@heroicons/react/24/outline/ArchiveBoxIcon';
+import CheckCircleIcon from '@heroicons/react/24/outline/CheckCircleIcon';
+import DocumentDuplicateIcon from '@heroicons/react/24/outline/DocumentDuplicateIcon';
+import ReceiptPercentIcon from '@heroicons/react/24/outline/ReceiptPercentIcon';
+import { List, ListItemButton, ListItemIcon, ListItemText, SvgIcon } from '@mui/material';
+
+export const List1 = () => (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+);
diff --git a/src/sections/dashboard/components/lists/list-2.js b/src/sections/dashboard/components/lists/list-2.js
new file mode 100644
index 000000000000..ba4903f2f335
--- /dev/null
+++ b/src/sections/dashboard/components/lists/list-2.js
@@ -0,0 +1,63 @@
+import ArrowRightIcon from '@heroicons/react/24/outline/ArrowRightIcon';
+import ChatBubbleBottomCenterIcon from '@heroicons/react/24/outline/ChatBubbleBottomCenterIcon';
+import CurrencyDollarIcon from '@heroicons/react/24/outline/CurrencyDollarIcon';
+import ShoppingCartIcon from '@heroicons/react/24/outline/ShoppingCartIcon';
+import {
+ IconButton,
+ List,
+ ListItem,
+ ListItemIcon,
+ ListItemSecondaryAction,
+ ListItemText,
+ SvgIcon
+} from '@mui/material';
+
+export const List2 = () => (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+);
diff --git a/src/sections/dashboard/components/lists/list-3.js b/src/sections/dashboard/components/lists/list-3.js
new file mode 100644
index 000000000000..46da5cf20778
--- /dev/null
+++ b/src/sections/dashboard/components/lists/list-3.js
@@ -0,0 +1,143 @@
+import { useCallback, useState } from 'react';
+import PropTypes from 'prop-types';
+import { format, subDays, subHours, subMinutes } from 'date-fns';
+import numeral from 'numeral';
+import ChevronDownIcon from '@heroicons/react/24/outline/ChevronDownIcon';
+import {
+ Box,
+ Collapse,
+ IconButton,
+ List,
+ ListItem,
+ Stack,
+ SvgIcon,
+ Typography
+} from '@mui/material';
+
+const now = new Date();
+
+const transactions = [
+ {
+ id: '8b36426c6142a6e0c2fecd02',
+ amount: 250,
+ bankAccount: 'GB 0000 6499 7623 1100 11122',
+ company: 'Material-UI SAS',
+ createdAt: subDays(subHours(subMinutes(now, 15), 1), 3).getTime(),
+ currency: '$',
+ type: 'receive'
+ },
+ {
+ id: 'b4f4e213f327fedce21e7c4c',
+ amount: 100,
+ bankAccount: 'GB 0000 6499 7623 1100 11122',
+ company: 'Material-UI SAS',
+ createdAt: subDays(subHours(subMinutes(now, 40), 6), 7).getTime(),
+ currency: '$',
+ type: 'send'
+ }
+];
+
+const ExpandableListItem = (props) => {
+ const { divider, transaction } = props;
+ const [open, setOpen] = useState(false);
+
+ const handleOpenChange = useCallback(() => {
+ setOpen((prevState) => !prevState);
+ }, []);
+
+ const createdDay = format(transaction.createdAt, 'dd');
+ const createdMonth = format(transaction.createdAt, 'MMM yy');
+ const amount = numeral(transaction.amount).format(`${transaction.currency}0,0.00`);
+
+ return (
+
+
+
+
+ {createdDay}
+
+
+ {createdMonth}
+
+
+
+
+ {transaction.company}
+
+
+ {transaction.bankAccount}
+
+
+
+ {amount}
+
+
+
+
+
+
+
+
+
+
+ Content
+
+
+
+
+ );
+};
+
+ExpandableListItem.propTypes = {
+ transaction: PropTypes.object.isRequired
+};
+
+export const List3 = () => (
+
+ {transactions.map((transaction, index) => {
+ const hasDivider = transactions.length > index + 1;
+
+ return (
+
+ );
+ })}
+
+);
diff --git a/src/sections/dashboard/components/lists/list-4.js b/src/sections/dashboard/components/lists/list-4.js
new file mode 100644
index 000000000000..f7ab448f1df9
--- /dev/null
+++ b/src/sections/dashboard/components/lists/list-4.js
@@ -0,0 +1,104 @@
+import { Box, List, ListItem, ListItemText, Typography } from '@mui/material';
+
+export const List4 = () => (
+
+
+
+ Full Name
+
+ )}
+ secondary={(
+
+
+ Natalie Rusell
+
+
+ )}
+ sx={{ my: 0 }}
+ />
+
+
+
+ Email Address
+
+ )}
+ secondary={(
+
+
+ natalie.rusell@gmail.com
+
+
+ )}
+ sx={{ my: 0 }}
+ />
+
+
+
+ Job Position
+
+ )}
+ secondary={(
+
+
+ Backend Developer
+
+
+ )}
+ sx={{ my: 0 }}
+ />
+
+
+);
diff --git a/src/sections/dashboard/components/lists/list-5.js b/src/sections/dashboard/components/lists/list-5.js
new file mode 100644
index 000000000000..277d07aa7faf
--- /dev/null
+++ b/src/sections/dashboard/components/lists/list-5.js
@@ -0,0 +1,113 @@
+import { Box, List, ListItem, ListItemText, Typography } from '@mui/material';
+
+export const List5 = () => (
+
+
+
+ Full Name
+
+ )}
+ secondary={(
+
+
+ Natalie Rusell
+
+
+ )}
+ sx={{
+ alignItems: 'flex-start',
+ display: 'flex',
+ flexDirection: 'row',
+ my: 0
+ }}
+ />
+
+
+
+ Email Address
+
+ )}
+ secondary={(
+
+
+ natalie.rusell@gmail.com
+
+
+ )}
+ sx={{
+ alignItems: 'flex-start',
+ display: 'flex',
+ flexDirection: 'row',
+ my: 0
+ }}
+ />
+
+
+
+ Job Position
+
+ )}
+ secondary={(
+
+
+ Backend Developer
+
+
+ )}
+ sx={{
+ alignItems: 'flex-start',
+ display: 'flex',
+ flexDirection: 'row',
+ my: 0
+ }}
+ />
+
+
+);
diff --git a/src/sections/dashboard/components/onboarding/wizard.js b/src/sections/dashboard/components/onboarding/wizard.js
new file mode 100644
index 000000000000..600fc3bf4d5b
--- /dev/null
+++ b/src/sections/dashboard/components/onboarding/wizard.js
@@ -0,0 +1,134 @@
+import { useCallback, useMemo, useState } from "react";
+import PropTypes from "prop-types";
+import { Card, CardContent, Container, Stack, Unstable_Grid2 as Grid } from "@mui/material";
+import { WizardBusinessStep } from "../../../../components/CippWizard/CippWizardOptionsList";
+import { WizardConfirmationStep } from "../../../../components/CippWizard/CippWizardConfirmation";
+import { WizardNotificationsStep } from "../../../../components/CippWizard/CippPSASyncOptions";
+import { WizardProfileStep } from "../../../../components/CippWizard/CippPSACredentialsStep";
+import { WizardSteps } from "../../../../components/CippWizard/wizard-steps";
+
+const steps = [
+ {
+ title: "Step 1",
+ description: "Select your source",
+ },
+ {
+ title: "Step 2",
+ description: "Enter your credentials",
+ },
+ {
+ title: "Step 3",
+ description: "Select your Sync Options",
+ },
+ {
+ title: "Step 4",
+ description: "Confirmation",
+ },
+];
+
+export const Wizard = (props) => {
+ const { orientation = "horizontal" } = props;
+ const [activeStep, setActiveStep] = useState(0);
+ const [values, setValues] = useState({
+ businessType: "saas",
+ name: "",
+ website: "",
+ companyName: "",
+ notifications: ["productUpdate", "weeklyNews"],
+ });
+
+ const handleBack = useCallback(() => {
+ setActiveStep((prevState) => {
+ if (prevState > 0) {
+ return prevState - 1;
+ }
+
+ return prevState;
+ });
+ }, []);
+
+ const handleNext = useCallback((values) => {
+ setValues((prevState) => ({
+ ...prevState,
+ ...values,
+ }));
+
+ setActiveStep((prevState) => {
+ if (prevState < steps.length - 1) {
+ return prevState + 1;
+ }
+
+ return prevState;
+ });
+ }, []);
+
+ const content = useMemo(() => {
+ switch (activeStep) {
+ case 0:
+ return (
+
+ );
+
+ case 1:
+ return (
+
+ );
+
+ case 2:
+ return (
+
+ );
+
+ case 3:
+ return ;
+
+ default:
+ return null;
+ }
+ }, [activeStep, handleNext, handleBack, values]);
+
+ return (
+
+ {orientation === "vertical" ? (
+
+
+
+
+
+
+ {content}
+
+
+
+ ) : (
+
+
+
+
+ {content}
+
+
+
+ )}
+
+ );
+};
diff --git a/src/sections/dashboard/components/page-headings/page-heading-1.js b/src/sections/dashboard/components/page-headings/page-heading-1.js
new file mode 100644
index 000000000000..fd1253600c29
--- /dev/null
+++ b/src/sections/dashboard/components/page-headings/page-heading-1.js
@@ -0,0 +1,33 @@
+import PlusIcon from '@heroicons/react/24/outline/PlusIcon';
+import { Box, Button, Stack, SvgIcon, Typography } from '@mui/material';
+
+export const PageHeading1 = () => (
+
+
+
+
+ Customers
+
+
+
+
+
+
+ )}
+ variant="contained"
+ size="large"
+ >
+ Add
+
+
+
+
+);
diff --git a/src/sections/dashboard/components/page-headings/page-heading-2.js b/src/sections/dashboard/components/page-headings/page-heading-2.js
new file mode 100644
index 000000000000..7a32a240fcdd
--- /dev/null
+++ b/src/sections/dashboard/components/page-headings/page-heading-2.js
@@ -0,0 +1,104 @@
+import ArrowLeftIcon from '@heroicons/react/24/outline/ArrowLeftIcon';
+import BuildingOfficeIcon from '@heroicons/react/24/outline/BuildingOfficeIcon';
+import CalendarIcon from '@heroicons/react/24/outline/CalendarIcon';
+import LinkIcon from '@heroicons/react/24/outline/LinkIcon';
+import PlusIcon from '@heroicons/react/24/outline/PlusIcon';
+import { Button, Stack, SvgIcon, Typography } from '@mui/material';
+
+export const PageHeading2 = () => (
+
+
+
+
+
+ )}
+ >
+ Back
+
+
+
+
+
+ Natalie Rusell
+
+
+
+
+
+
+
+ Since 14 Feb 2023
+
+
+
+
+
+
+
+ Berlin, Germany
+
+
+
+
+
+
+
+ Twitter
+
+
+
+
+
+
+
+
+ )}
+ variant="contained"
+ size="large"
+ >
+ Add
+
+
+
+
+);
diff --git a/src/sections/dashboard/components/page-headings/page-heading-3.js b/src/sections/dashboard/components/page-headings/page-heading-3.js
new file mode 100644
index 000000000000..e87fb22c6339
--- /dev/null
+++ b/src/sections/dashboard/components/page-headings/page-heading-3.js
@@ -0,0 +1,59 @@
+import PlusIcon from '@heroicons/react/24/outline/PlusIcon';
+import { Breadcrumbs, Button, Link, Stack, SvgIcon, Typography } from '@mui/material';
+
+export const PageHeading3 = () => (
+
+
+
+
+ Home
+
+
+ Customers
+
+
+ Pending
+
+
+
+
+
+
+ Natalie Rusell
+
+
+
+
+
+
+ )}
+ variant="contained"
+ size="large"
+ >
+ Add
+
+
+
+
+);
diff --git a/src/sections/dashboard/components/stats/stats-1.js b/src/sections/dashboard/components/stats/stats-1.js
new file mode 100644
index 000000000000..05f98cf8cf91
--- /dev/null
+++ b/src/sections/dashboard/components/stats/stats-1.js
@@ -0,0 +1,117 @@
+import ArrowRightIcon from '@heroicons/react/24/outline/ArrowRightIcon';
+import LockClosedIcon from '@heroicons/react/24/outline/LockClosedIcon';
+import ReceiptPercentIcon from '@heroicons/react/24/outline/ReceiptPercentIcon';
+import UsersIcon from '@heroicons/react/24/outline/UsersIcon';
+import {
+ Avatar,
+ Box,
+ Button,
+ Card,
+ CardActions,
+ Divider,
+ Stack,
+ SvgIcon,
+ Typography,
+ Unstable_Grid2 as Grid
+} from '@mui/material';
+
+const data = [
+ {
+ icon: (
+
+
+
+ ),
+ label: 'Users',
+ linkLabel: 'Reports',
+ value: 3450
+ },
+ {
+ icon: (
+
+
+
+ ),
+ label: 'Logins',
+ linkLabel: 'Analytics',
+ value: 68
+ },
+ {
+ icon: (
+
+
+
+ ),
+ label: 'Invoices',
+ linkLabel: 'Transactions',
+ value: 3120
+ }
+];
+
+export const Stats1 = () => (
+
+
+ {data.map((item) => {
+ return (
+
+
+
+
+ {item.icon}
+
+
+
+ {item.label}
+
+
+ {item.value}
+
+
+
+
+
+
+
+
+ )}
+ size="small"
+ >
+ {item.linkLabel}
+
+
+
+
+ );
+ })}
+
+
+);
diff --git a/src/sections/dashboard/components/stats/stats-2.js b/src/sections/dashboard/components/stats/stats-2.js
new file mode 100644
index 000000000000..4c160beb8720
--- /dev/null
+++ b/src/sections/dashboard/components/stats/stats-2.js
@@ -0,0 +1,59 @@
+import { Box, Typography, Unstable_Grid2 as Grid } from '@mui/material';
+
+const data = [
+ {
+ label: 'Pending',
+ value: 2
+ },
+ {
+ label: 'Ongoing',
+ value: 2
+ },
+ {
+ label: 'In progress',
+ value: 6
+ },
+ {
+ label: 'Complete',
+ value: 21
+ }
+];
+
+export const Stats2 = () => (
+
+
+ {data.map((item) => (
+
+ theme.palette.mode === 'dark'
+ ? 'neutral.900'
+ : 'neutral.50',
+ borderRadius: 1,
+ p: 2
+ }}
+ >
+
+ {item.label}
+
+
+ {item.value}
+
+
+
+ ))}
+
+
+);
diff --git a/src/sections/dashboard/customers/customer-details.js b/src/sections/dashboard/customers/customer-details.js
new file mode 100644
index 000000000000..bdbd5ff32f24
--- /dev/null
+++ b/src/sections/dashboard/customers/customer-details.js
@@ -0,0 +1,138 @@
+import { useCallback } from 'react';
+import PropTypes from 'prop-types';
+import toast from 'react-hot-toast';
+import EyeIcon from '@heroicons/react/24/outline/EyeIcon';
+import TrashIcon from '@heroicons/react/24/outline/TrashIcon';
+import ArrowTopRightOnSquareIcon from '@heroicons/react/24/outline/ArrowTopRightOnSquareIcon';
+import {
+ Avatar,
+ Button,
+ Card,
+ CardHeader,
+ Divider,
+ IconButton,
+ Stack,
+ SvgIcon
+} from '@mui/material';
+import { ActionList } from '../../../components/action-list';
+import { ActionListItem } from '../../../components/action-list-item';
+import { ConfirmationDialog } from '../../../components/confirmation-dialog';
+import { PropertyList } from '../../../components/property-list';
+import { PropertyListItem } from '../../../components/property-list-item';
+import { useDialog } from '../../../hooks/use-dialog';
+
+export const CustomerDetails = (props) => {
+ const { customer, onEdit, ...other } = props;
+ const deleteDialog = useDialog();
+
+ const handlePreview = useCallback(() => {
+ toast.error('This action is not available on demo');
+ }, []);
+
+ const handleDelete = useCallback(() => {
+ deleteDialog.handleClose();
+ toast.success('Deletion scheduled');
+ }, [deleteDialog]);
+
+ return (
+ <>
+
+
+ Edit
+
+ )}
+ title="Contact Details"
+ />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )}
+ onClick={handlePreview}
+ label="Preview"
+ />
+
+
+
+ )}
+ label="Delete User Data"
+ onClick={deleteDialog.handleOpen}
+ />
+
+
+
+ >
+ );
+};
+
+CustomerDetails.propTypes = {
+ customer: PropTypes.object.isRequired,
+ onEdit: PropTypes.func
+};
diff --git a/src/sections/dashboard/customers/customer-dialog.js b/src/sections/dashboard/customers/customer-dialog.js
new file mode 100644
index 000000000000..c928a9853c91
--- /dev/null
+++ b/src/sections/dashboard/customers/customer-dialog.js
@@ -0,0 +1,200 @@
+import PropTypes from 'prop-types';
+import { useFormik } from 'formik';
+import * as Yup from 'yup';
+import toast from 'react-hot-toast';
+import {
+ Button,
+ Dialog,
+ DialogActions,
+ DialogContent,
+ DialogTitle,
+ FormHelperText,
+ MenuItem,
+ Stack,
+ TextField
+} from '@mui/material';
+
+const countryOptions = ['USA', 'Germany', 'Spain', 'Italy'];
+
+const getInitialValues = (customer) => {
+ return {
+ address: customer?.street || '',
+ country: customer?.country || '',
+ email: customer?.email || '',
+ name: customer?.name || '',
+ phone: customer?.phone || '',
+ submit: null
+ };
+};
+
+const validationSchema = Yup.object({
+ address: Yup
+ .string()
+ .max(255),
+ country: Yup
+ .string()
+ .oneOf(countryOptions),
+ email: Yup
+ .string()
+ .max(255)
+ .email('Must be a valid email')
+ .required('Email is required'),
+ name: Yup
+ .string()
+ .max(255)
+ .required('Name is required'),
+ phone: Yup
+ .string()
+ .max(255)
+});
+
+export const CustomerDialog = (props) => {
+ const { action = 'create', customer, open = false, onClose } = props;
+ const formik = useFormik({
+ enableReinitialize: true,
+ initialValues: getInitialValues(customer),
+ validationSchema,
+ onSubmit: async (values, helpers) => {
+ try {
+ if (action === 'update') {
+ // Do API call
+ toast.success('Customer updated');
+ } else {
+ // Do API call
+ toast.success('Customer created');
+ }
+
+ helpers.resetForm();
+ helpers.setStatus({ success: true });
+ helpers.setSubmitting(false);
+
+ // You might want to return the created/updated customer instead
+ // and let the parent component handle the redirect or other post action.
+
+ onClose?.();
+ } catch (err) {
+ console.error(err);
+ helpers.setStatus({ success: false });
+ helpers.setErrors({ submit: err.message });
+ helpers.setSubmitting(false);
+ }
+ }
+ });
+
+ if (action === 'update' && !customer) {
+ return null;
+ }
+
+ return (
+ formik.resetForm()
+ }}
+ >
+
+ {action === 'update' ? 'Update Customer' : 'Create Customer'}
+
+
+
+
+
+
+
+ {countryOptions.map((option) => (
+
+ {option}
+
+ ))}
+
+
+
+ {formik.errors.submit && (
+
+ {formik.errors.submit}
+
+ )}
+
+
+
+ Cancel
+
+ { formik.handleSubmit(); }}
+ variant="contained"
+ >
+ {action === 'update' ? 'Update' : 'Create'}
+
+
+
+ );
+};
+
+CustomerDialog.propTypes = {
+ action: PropTypes.oneOf(['create', 'update']),
+ customer: PropTypes.object,
+ onClose: PropTypes.func,
+ open: PropTypes.bool
+};
diff --git a/src/sections/dashboard/customers/customer-latest-orders.js b/src/sections/dashboard/customers/customer-latest-orders.js
new file mode 100644
index 000000000000..5ec681fe96d6
--- /dev/null
+++ b/src/sections/dashboard/customers/customer-latest-orders.js
@@ -0,0 +1,260 @@
+import { useCallback, useState } from 'react';
+import NextLink from 'next/link';
+import numeral from 'numeral';
+import { format } from 'date-fns';
+import PropTypes from 'prop-types';
+import ChevronDownIcon from '@heroicons/react/24/outline/ChevronDownIcon';
+import {
+ Avatar,
+ Box,
+ Card,
+ Collapse,
+ Divider,
+ IconButton,
+ Link,
+ Stack,
+ SvgIcon,
+ Table,
+ TableBody,
+ TableCell,
+ TableHead,
+ TableRow,
+ Typography
+} from '@mui/material';
+import { ResourceUnavailable } from '../../../components/resource-unavailable';
+import { Scrollbar } from '../../../components/scrollbar';
+import { paths } from '../../../paths';
+
+const statusMap = {
+ complete: {
+ color: 'success.main',
+ label: 'Complete'
+ },
+ created: {
+ color: 'neutral.500',
+ label: 'Created'
+ },
+ delivered: {
+ color: 'warning.main',
+ label: 'Delivered'
+ },
+ placed: {
+ color: 'info.main',
+ label: 'Placed'
+ },
+ processed: {
+ color: 'error.main',
+ label: 'Processed'
+ }
+};
+
+export const CustomerLatestOrders = (props) => {
+ const { orders = [], ...other } = props;
+ const [expanded, setExpanded] = useState(null);
+
+ const handleExpand = useCallback((orderId) => {
+ setExpanded((prevState) => {
+ return prevState === orderId ? null : orderId;
+ });
+ }, []);
+
+ const hasOrders = orders.length > 0;
+
+ return (
+
+
+ Latest Orders
+
+ {!hasOrders
+ ?
+ : (
+
+ }
+ sx={{
+ listStyle: 'none',
+ m: 0,
+ p: 0
+ }}
+ >
+ {orders.map((order) => {
+ const isExpanded = expanded === order.id;
+ const status = statusMap[order.status];
+ const lineItems = order.lineItems || [];
+ const createdDate = format(order.createdAt, 'dd');
+ const createdMonth = format(order.createdAt, 'MMM yy');
+
+ return (
+
+
+
+
+
+ {createdDate}
+
+
+ {createdMonth}
+
+
+
+
+ Order
+
+
+ #{order.id}
+
+
+
+
+
+
+
+ {status.label}
+
+
+ handleExpand(order.id)}>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Name
+
+
+ Cost
+
+
+ Qty
+
+
+ Total
+
+
+
+
+ {lineItems.map((lineItem, index) => {
+ const unitAmount = numeral(lineItem.unitAmount).format(`${lineItem.currency}0,0.00`);
+ const totalAmount = numeral(lineItem.totalAmount).format(`${lineItem.currency}0,0.00`);
+
+ return (
+
+
+
+
+
+
+ {lineItem.name}
+
+
+ SKU: {lineItem.sku}
+
+
+
+
+
+ {unitAmount}
+
+
+ {lineItem.quantity}
+
+
+ {totalAmount}
+
+
+ );
+ })}
+
+
+
+
+
+ );
+ })}
+
+
+ )}
+
+ );
+};
+
+CustomerLatestOrders.propTypes = {
+ orders: PropTypes.array
+};
diff --git a/src/sections/dashboard/customers/customer-log.js b/src/sections/dashboard/customers/customer-log.js
new file mode 100644
index 000000000000..3968276f8f9a
--- /dev/null
+++ b/src/sections/dashboard/customers/customer-log.js
@@ -0,0 +1,57 @@
+import PropTypes from 'prop-types';
+import { formatDistanceToNowStrict } from 'date-fns';
+import { Avatar, ListItem, Stack, Typography } from '@mui/material';
+
+export const CustomerLog = (props) => {
+ const { createdAt, message, subjectAvatar, subjectId, subjectName, type, ...other } = props;
+
+ const ago = formatDistanceToNowStrict(createdAt);
+
+ return (
+
+
+
+
+
+
+ {subjectName}
+
+ {' '}
+ {message}
+
+
+ {ago} ago
+
+
+
+
+ );
+};
+
+CustomerLog.propTypes = {
+ createdAt: PropTypes.number.isRequired,
+ message: PropTypes.string.isRequired,
+ subjectAvatar: PropTypes.string,
+ subjectId: PropTypes.string.isRequired,
+ subjectName: PropTypes.string,
+ type: PropTypes.string.isRequired
+};
diff --git a/src/sections/dashboard/customers/customer-note-add.js b/src/sections/dashboard/customers/customer-note-add.js
new file mode 100644
index 000000000000..32c02bafc90b
--- /dev/null
+++ b/src/sections/dashboard/customers/customer-note-add.js
@@ -0,0 +1,97 @@
+import { useCallback, useState } from 'react';
+import PropTypes from 'prop-types';
+import ChevronDownIcon from '@heroicons/react/24/outline/ChevronDownIcon';
+import EyeIcon from '@heroicons/react/24/outline/EyeIcon';
+import PaperClipIcon from '@heroicons/react/24/outline/PaperClipIcon';
+import {
+ Button,
+ Card,
+ Divider,
+ IconButton,
+ InputBase,
+ Stack,
+ SvgIcon,
+ Typography
+} from '@mui/material';
+
+export const CustomerNoteAdd = (props) => {
+ const { disabled = false, onAdd, ...other } = props;
+ const [content, setContent] = useState('');
+
+ const handleChange = useCallback((event) => {
+ setContent(event.target.value);
+ }, []);
+
+ const handleSend = useCallback(() => {
+ onAdd?.(content);
+ setContent('');
+ }, [content, onAdd]);
+
+ const canSend = !disabled && content.length > 0;
+
+ return (
+
+
+
+
+
+
+
+
+
+
+ theme.palette.mode === 'dark'
+ ? 'neutral.900'
+ : 'neutral.50',
+ p: 2
+ }}
+ >
+
+
+
+
+
+ Visible to all
+
+
+
+
+
+
+
+
+ Send
+
+
+
+ );
+};
+
+CustomerNoteAdd.propTypes = {
+ disabled: PropTypes.bool,
+ onAdd: PropTypes.func
+};
diff --git a/src/sections/dashboard/customers/customer-note-card.js b/src/sections/dashboard/customers/customer-note-card.js
new file mode 100644
index 000000000000..14eb709a0bac
--- /dev/null
+++ b/src/sections/dashboard/customers/customer-note-card.js
@@ -0,0 +1,65 @@
+import PropTypes from 'prop-types';
+import { formatDistanceToNowStrict } from 'date-fns';
+import { Avatar, Button, Card, Stack, Typography } from '@mui/material';
+
+export const CustomerNoteCard = (props) => {
+ const { authorAvatar, authorName, content, createdAt, deletable, id, onDelete, ...other } = props;
+
+ const ago = formatDistanceToNowStrict(createdAt);
+
+ return (
+
+
+
+
+
+ {authorName}
+
+
+ {content}
+
+
+
+ {ago} ago
+
+ {deletable && (
+ onDelete?.(id)}
+ size="small"
+ >
+ Delete
+
+ )}
+
+
+
+
+ );
+};
+
+CustomerNoteCard.propTypes = {
+ authorAvatar: PropTypes.string,
+ authorName: PropTypes.string,
+ content: PropTypes.string.isRequired,
+ createdAt: PropTypes.number.isRequired,
+ deletable: PropTypes.bool,
+ id: PropTypes.string.isRequired,
+ onDelete: PropTypes.func
+};
diff --git a/src/sections/dashboard/customers/customer-notes.js b/src/sections/dashboard/customers/customer-notes.js
new file mode 100644
index 000000000000..89efbcd63dbb
--- /dev/null
+++ b/src/sections/dashboard/customers/customer-notes.js
@@ -0,0 +1,45 @@
+import PropTypes from 'prop-types';
+import { Stack, Typography } from '@mui/material';
+import { CustomerNoteCard } from './customer-note-card';
+import { CustomerNoteAdd } from './customer-note-add';
+import { useMockedUser } from '../../../hooks/use-mocked-user';
+
+export const CustomerNotes = (props) => {
+ const { notes = [], onNoteCreate, onNoteDelete, ...other } = props;
+ const user = useMockedUser();
+
+ return (
+
+
+ Team Notes
+
+
+
+ {notes.map((note) => {
+ const isDeletable = note.authorId === user.id;
+
+ return (
+
+ );
+ })}
+
+
+ );
+};
+
+CustomerNotes.propTypes = {
+ notes: PropTypes.array,
+ onNoteCreate: PropTypes.func,
+ onNoteDelete: PropTypes.func
+};
diff --git a/src/sections/dashboard/customers/customer-order-menu.js b/src/sections/dashboard/customers/customer-order-menu.js
new file mode 100644
index 000000000000..88727f1c14c7
--- /dev/null
+++ b/src/sections/dashboard/customers/customer-order-menu.js
@@ -0,0 +1,64 @@
+import { useCallback } from 'react';
+import { useRouter } from 'next/navigation';
+import toast from 'react-hot-toast';
+import EllipsisVerticalIcon from '@heroicons/react/24/outline/EllipsisVerticalIcon';
+import { IconButton, Menu, MenuItem, SvgIcon } from '@mui/material';
+import { usePopover } from '../../../hooks/use-popover';
+import { paths } from '../../../paths';
+
+export const CustomerOrderMenu = (props) => {
+ const router = useRouter();
+ const popover = usePopover();
+
+ const handleEdit = useCallback(() => {
+ popover.handleClose();
+ router.push(paths.dashboard.orders.details);
+ }, [popover, router]);
+
+ const handleRefund = useCallback(() => {
+ popover.handleClose();
+ toast.error('This action is not available on demo');
+ }, [popover]);
+
+ const handleDelete = useCallback(() => {
+ popover.handleClose();
+ toast.error('This action is not available on demo');
+ }, [popover]);
+
+ return (
+ <>
+
+
+
+
+
+
+
+ Edit
+
+
+ Refund
+
+
+ Delete
+
+
+ >
+ );
+};
diff --git a/src/sections/dashboard/customers/customer-orders-table.js b/src/sections/dashboard/customers/customer-orders-table.js
new file mode 100644
index 000000000000..d27560898074
--- /dev/null
+++ b/src/sections/dashboard/customers/customer-orders-table.js
@@ -0,0 +1,190 @@
+import NextLink from 'next/link';
+import PropTypes from 'prop-types';
+import { format } from 'date-fns';
+import numeral from 'numeral';
+import {
+ Box,
+ Link,
+ Stack,
+ Table,
+ TableBody,
+ TableCell,
+ TableHead,
+ TableRow,
+ TableSortLabel,
+ Typography
+} from '@mui/material';
+import { Scrollbar } from '../../../components/scrollbar';
+import { paths } from '../../../paths';
+import { CustomerOrderMenu } from './customer-order-menu';
+
+const statusMap = {
+ placed: {
+ color: 'info.main',
+ label: 'Placed'
+ },
+ processed: {
+ color: 'error.main',
+ label: 'Processed'
+ },
+ complete: {
+ color: 'success.main',
+ label: 'Complete'
+ },
+ delivered: {
+ color: 'success.main',
+ label: 'Delivered'
+ }
+};
+
+const columns = [
+ {
+ id: 'id',
+ label: 'Order ID',
+ sortable: true
+ },
+ {
+ id: 'createdAt',
+ label: 'Created',
+ sortable: true
+ },
+ {
+ id: 'distribution',
+ label: 'Distribution',
+ sortable: true
+ },
+ {
+ id: 'status',
+ label: 'Status',
+ sortable: true
+ },
+ {
+ id: 'totalAmount',
+ label: 'Total Amount',
+ sortable: true
+ }
+];
+
+export const CustomerOrdersTable = (props) => {
+ const { isLoading = false, items = [], onSortChange, sortBy, sortDir } = props;
+
+ return (
+
+
+
+
+ {columns.map((column) => (
+
+ {column.sortable
+ ? (
+ onSortChange?.(column.id)}
+ >
+ {column.label}
+
+ )
+ : column.label}
+
+ ))}
+
+
+
+
+ {items.map((order) => {
+ const status = statusMap[order.status];
+ const address = [order.address?.city, order.address?.country].join((', '));
+ const createdDate = format(order.createdAt, 'dd MMM yyyy');
+ const createdTime = format(order.createdAt, 'HH:mm');
+ const totalAmount = numeral(order.totalAmount).format(`${order.currency}0,0.00`);
+
+ return (
+
+
+
+ #{order.id}
+
+
+
+
+
+ {createdDate}
+
+
+ {createdTime}
+
+
+
+
+
+ {address}
+
+ {order.courier && (
+
+ {order.courier}
+
+ )}
+
+
+ {status && (
+
+
+
+ {status.label}
+
+
+ )}
+
+
+ {totalAmount}
+
+
+
+
+
+ );
+ })}
+
+
+
+ );
+};
+
+CustomerOrdersTable.propTypes = {
+ isLoading: PropTypes.bool,
+ items: PropTypes.array,
+ onSortChange: PropTypes.func,
+ sortBy: PropTypes.string,
+ sortDir: PropTypes.oneOf(['asc', 'desc'])
+};
diff --git a/src/sections/dashboard/customers/customer-properties.js b/src/sections/dashboard/customers/customer-properties.js
new file mode 100644
index 000000000000..f98443de56ee
--- /dev/null
+++ b/src/sections/dashboard/customers/customer-properties.js
@@ -0,0 +1,45 @@
+import PropTypes from 'prop-types';
+import { format } from 'date-fns';
+import numeral from 'numeral';
+import { Card, CardHeader, Divider } from '@mui/material';
+import { PropertyList } from '../../../components/property-list';
+import { PropertyListItem } from '../../../components/property-list-item';
+
+export const CustomerProperties = (props) => {
+ const { customer, ...other } = props;
+
+ const storeCredit = numeral(customer.storeCredit).format('$0,0.00') + ' USD';
+ const createdAt = format(customer.createdAt, 'dd/MM/yyyy HH:mm');
+
+ return (
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+CustomerProperties.propTypes = {
+ customer: PropTypes.object.isRequired
+};
diff --git a/src/sections/dashboard/customers/customers-search.js b/src/sections/dashboard/customers/customers-search.js
new file mode 100644
index 000000000000..493e37fa7b2a
--- /dev/null
+++ b/src/sections/dashboard/customers/customers-search.js
@@ -0,0 +1,225 @@
+import { useCallback } from 'react';
+import PropTypes from 'prop-types';
+import AdjustmentsHorizontalIcon from '@heroicons/react/24/outline/AdjustmentsHorizontalIcon';
+import { Box, Button, Divider, Stack, SvgIcon, Tab, Tabs } from '@mui/material';
+import { BulkActionsMenu } from '../../../components/bulk-actions-menu';
+import { QueryField } from '../../../components/query-field';
+import { FilterDialog } from '../../../components/filter-dialog';
+import { useDialog } from '../../../hooks/use-dialog';
+import {
+ containsOperator,
+ endsWithOperator,
+ equalsOperator,
+ greaterThanOperator,
+ isAfterOperator,
+ isBeforeOperator,
+ isBlankOperator,
+ isPresentOperator,
+ lessThanOperator,
+ notContainsOperator,
+ notEqualOperator,
+ startsWithOperator
+} from '../../../utils/filter-operators';
+
+const viewOptions = [
+ {
+ label: 'All',
+ value: 'all'
+ },
+ {
+ label: 'Returning',
+ value: 'isReturning'
+ },
+ {
+ label: 'Ordered recently',
+ value: 'orderedRecently'
+ }
+];
+
+const filterProperties = [
+ {
+ label: 'Name',
+ name: 'name',
+ operators: [
+ 'contains',
+ 'endsWith',
+ 'equals',
+ 'notContains',
+ 'startsWith',
+ 'isBlank',
+ 'isPresent'
+ ]
+ },
+ {
+ label: 'Email',
+ name: 'email',
+ operators: [
+ 'contains',
+ 'endsWith',
+ 'equals',
+ 'notContains',
+ 'startsWith',
+ 'isBlank',
+ 'isPresent'
+ ]
+ },
+ {
+ label: 'Phone',
+ name: 'phone',
+ operators: [
+ 'contains',
+ 'endsWith',
+ 'equals',
+ 'notContains',
+ 'startsWith',
+ 'isBlank',
+ 'isPresent'
+ ]
+ },
+ {
+ label: 'Created',
+ name: 'createdAt',
+ operators: ['isAfter', 'isBefore', 'isBlank', 'isPresent']
+ }
+];
+
+const filterOperators = [
+ containsOperator,
+ endsWithOperator,
+ equalsOperator,
+ greaterThanOperator,
+ isAfterOperator,
+ isBeforeOperator,
+ isBlankOperator,
+ isPresentOperator,
+ lessThanOperator,
+ notContainsOperator,
+ notEqualOperator,
+ startsWithOperator
+];
+
+export const CustomersSearch = (props) => {
+ const {
+ disabled = false,
+ filters = [],
+ onFiltersApply,
+ onFiltersClear,
+ onQueryChange,
+ onViewChange,
+ query = '',
+ selected = [],
+ view = 'all'
+ } = props;
+ const filterDialog = useDialog();
+
+ const handleFiltersApply = useCallback((filters) => {
+ filterDialog.handleClose();
+ onFiltersApply?.(filters);
+ }, [filterDialog, onFiltersApply]);
+
+ const handleFiltersClear = useCallback(() => {
+ filterDialog.handleClose();
+ onFiltersClear?.();
+ }, [filterDialog, onFiltersClear]);
+
+ const hasSelection = selected.length > 0;
+ const hasFilters = filters.length > 0;
+
+ return (
+ <>
+
+
+ onViewChange?.(value)}
+ value={view}
+ variant="scrollable"
+ >
+ {viewOptions.map((option) => (
+
+ ))}
+
+
+
+
+ {hasSelection && (
+
+ )}
+
+
+
+
+ )}
+ sx={{ order: 2 }}
+ variant={hasFilters ? 'contained' : 'text'}
+ >
+ Filter
+
+
+
+
+ >
+ );
+};
+
+CustomersSearch.propTypes = {
+ disabled: PropTypes.bool,
+ filters: PropTypes.array,
+ onFiltersApply: PropTypes.func,
+ onFiltersClear: PropTypes.func,
+ onQueryChange: PropTypes.func,
+ onViewChange: PropTypes.func,
+ query: PropTypes.string,
+ selected: PropTypes.array,
+ view: PropTypes.oneOf(['all', 'isReturning', 'orderedRecently'])
+};
diff --git a/src/sections/dashboard/customers/customers-table-menu.js b/src/sections/dashboard/customers/customers-table-menu.js
new file mode 100644
index 000000000000..d616e6105734
--- /dev/null
+++ b/src/sections/dashboard/customers/customers-table-menu.js
@@ -0,0 +1,64 @@
+import { useCallback } from 'react';
+import { useRouter } from 'next/navigation';
+import toast from 'react-hot-toast';
+import EllipsisVerticalIcon from '@heroicons/react/24/outline/EllipsisVerticalIcon';
+import { IconButton, Menu, MenuItem, SvgIcon } from '@mui/material';
+import { usePopover } from '../../../hooks/use-popover';
+import { paths } from '../../../paths';
+
+export const CustomersTableMenu = () => {
+ const router = useRouter();
+ const popover = usePopover();
+
+ const handleEdit = useCallback(() => {
+ popover.handleClose();
+ router.push(paths.dashboard.customers.details.index);
+ }, [popover, router]);
+
+ const handleReport = useCallback(() => {
+ popover.handleClose();
+ toast.error('This action is not available on demo');
+ }, [popover]);
+
+ const handleDelete = useCallback(() => {
+ popover.handleClose();
+ toast.error('This action is not available on demo');
+ }, [popover]);
+
+ return (
+ <>
+
+
+
+
+
+
+
+ Edit
+
+
+ Report
+
+
+ Delete
+
+
+ >
+ );
+};
diff --git a/src/sections/dashboard/customers/customers-table.js b/src/sections/dashboard/customers/customers-table.js
new file mode 100644
index 000000000000..6af0abce3ddf
--- /dev/null
+++ b/src/sections/dashboard/customers/customers-table.js
@@ -0,0 +1,291 @@
+import PropTypes from 'prop-types';
+import NextLink from 'next/link';
+import { format } from 'date-fns';
+import StarOutlineIcon from '@heroicons/react/24/outline/StarIcon';
+import StarSolidIcon from '@heroicons/react/24/solid/StarIcon';
+import {
+ Avatar,
+ Box,
+ Checkbox,
+ Divider,
+ IconButton,
+ Link,
+ Skeleton,
+ Stack,
+ SvgIcon,
+ Table,
+ TableBody,
+ TableCell,
+ TableHead,
+ TableRow,
+ TableSortLabel
+} from '@mui/material';
+import { Pagination } from '../../../components/pagination';
+import { ResourceError } from '../../../components/resource-error';
+import { ResourceUnavailable } from '../../../components/resource-unavailable';
+import { Scrollbar } from '../../../components/scrollbar';
+import { paths } from '../../../paths';
+import { CustomersTableMenu } from './customers-table-menu';
+
+const columns = [
+ {
+ id: 'name',
+ disablePadding: true,
+ label: 'Name',
+ sortable: true
+ },
+ {
+ id: 'phone',
+ label: 'Phone',
+ sortable: true
+ },
+ {
+ id: 'email',
+ label: 'Email',
+ sortable: true
+ },
+ {
+ id: 'createdAt',
+ label: 'Created',
+ sortable: true
+ }
+];
+
+const getResourcesState = (params) => {
+ if (params.isLoading) {
+ return 'loading';
+ }
+
+ if (params.error) {
+ return 'error';
+ }
+
+ return params.items.length > 0 ? 'available' : 'unavailable';
+};
+
+export const CustomersTable = (props) => {
+ const {
+ count = 0,
+ error,
+ isLoading = false,
+ items = [],
+ onDeselectAll,
+ onDeselectOne,
+ onPageChange,
+ onSelectAll,
+ onSelectOne,
+ onSortChange,
+ page = 0,
+ rowsPerPage = 0,
+ selected = [],
+ sortBy = 'createdAt',
+ sortDir = 'desc'
+ } = props;
+
+ const resourcesState = getResourcesState({
+ isLoading,
+ error,
+ items
+ });
+
+ const selectedSome = (selected.length > 0) && (selected.length < items.length);
+ const selectedAll = (items.length > 0) && (selected.length === items.length);
+
+ return (
+
+
+
+
+
+
+ {
+ if (event.target.checked) {
+ onSelectAll?.();
+ } else {
+ onDeselectAll?.();
+ }
+ }}
+ />
+
+
+ {columns.map((column) => (
+
+ {column.sortable
+ ? (
+ onSortChange?.(column.id)}
+ >
+ {column.label}
+
+ )
+ : column.label}
+
+ ))}
+
+
+
+ {resourcesState === 'available' && (
+
+ {items.map((customer) => {
+ const isSelected = !!selected.find((customerId) => customerId === customer.id);
+ const createdAt = format(customer.createdAt, 'dd/MM/yyyy HH:mm');
+
+ return (
+
+
+ {
+ if (event.target.checked) {
+ onSelectOne?.(customer.id);
+ } else {
+ onDeselectOne?.(customer.id);
+ }
+ }}
+ />
+
+
+
+ { }}
+ size="small"
+ >
+
+ {customer.isFavorite ? : }
+
+
+
+
+
+
+
+
+ {customer.name}
+
+
+
+
+ {customer.phone}
+
+
+ {customer.email}
+
+
+ {createdAt}
+
+
+
+
+
+ );
+ })}
+
+ )}
+
+
+ {resourcesState === 'available' && (
+ <>
+
+
+ >
+ )}
+ {resourcesState === 'loading' && (
+
+
+
+
+
+ )}
+ {resourcesState === 'error' && (
+
+ )}
+ {resourcesState === 'unavailable' && (
+
+ )}
+
+ );
+};
+
+CustomersTable.propTypes = {
+ count: PropTypes.number,
+ error: PropTypes.string,
+ isLoading: PropTypes.bool,
+ items: PropTypes.array,
+ onDeselectAll: PropTypes.func,
+ onDeselectOne: PropTypes.func,
+ onPageChange: PropTypes.func,
+ onSelectAll: PropTypes.func,
+ onSelectOne: PropTypes.func,
+ onSortChange: PropTypes.func,
+ page: PropTypes.number,
+ rowsPerPage: PropTypes.number,
+ selected: PropTypes.array,
+ sortBy: PropTypes.string,
+ sortDir: PropTypes.oneOf(['asc', 'desc'])
+};
diff --git a/src/sections/dashboard/foundation/inputs/input-1.js b/src/sections/dashboard/foundation/inputs/input-1.js
new file mode 100644
index 000000000000..10d3eee8bfe8
--- /dev/null
+++ b/src/sections/dashboard/foundation/inputs/input-1.js
@@ -0,0 +1,32 @@
+import { InputAdornment, Stack, TextField } from '@mui/material';
+
+export const Input1 = () => (
+
+
+
+
+ https://
+
+ )
+ }}
+ />
+
+);
diff --git a/src/sections/dashboard/foundation/inputs/input-2.js b/src/sections/dashboard/foundation/inputs/input-2.js
new file mode 100644
index 000000000000..a49fa9e2ed2d
--- /dev/null
+++ b/src/sections/dashboard/foundation/inputs/input-2.js
@@ -0,0 +1,33 @@
+import { Autocomplete, Stack, TextField } from '@mui/material';
+
+export const Input2 = () => (
+
+ (
+
+ )}
+ />
+ (
+
+ )}
+ />
+
+);
diff --git a/src/sections/dashboard/foundation/inputs/input-3.js b/src/sections/dashboard/foundation/inputs/input-3.js
new file mode 100644
index 000000000000..f0ad3ad87515
--- /dev/null
+++ b/src/sections/dashboard/foundation/inputs/input-3.js
@@ -0,0 +1,26 @@
+import { Checkbox, FormControlLabel, FormGroup, Stack, Typography } from '@mui/material';
+
+export const Input3 = () => (
+
+
+ Notifications
+
+
+ }
+ label="Email"
+ />
+ }
+ label="Push"
+ />
+ }
+ label="SMS"
+ />
+
+
+);
diff --git a/src/sections/dashboard/foundation/inputs/input-4.js b/src/sections/dashboard/foundation/inputs/input-4.js
new file mode 100644
index 000000000000..1b4685afd7e6
--- /dev/null
+++ b/src/sections/dashboard/foundation/inputs/input-4.js
@@ -0,0 +1,31 @@
+import { FormControlLabel, Radio, RadioGroup, Stack, Typography } from '@mui/material';
+
+export const Input4 = () => (
+
+
+ Notifications
+
+
+ }
+ label="Email"
+ />
+ }
+ label="Push"
+ />
+
+ )}
+ label="SMS"
+ />
+
+
+);
diff --git a/src/sections/dashboard/foundation/inputs/input-5.js b/src/sections/dashboard/foundation/inputs/input-5.js
new file mode 100644
index 000000000000..0252ab6094aa
--- /dev/null
+++ b/src/sections/dashboard/foundation/inputs/input-5.js
@@ -0,0 +1,26 @@
+import { FormControlLabel, FormGroup, Stack, Switch, Typography } from '@mui/material';
+
+export const Input5 = () => (
+
+
+ Notifications
+
+
+ }
+ label="Email"
+ />
+ }
+ label="Push"
+ />
+ }
+ label="SMS"
+ />
+
+
+);
diff --git a/src/sections/dashboard/foundation/tables/table-1.js b/src/sections/dashboard/foundation/tables/table-1.js
new file mode 100644
index 000000000000..5c31efc1c875
--- /dev/null
+++ b/src/sections/dashboard/foundation/tables/table-1.js
@@ -0,0 +1,130 @@
+import EllipsisVerticalIcon from '@heroicons/react/24/outline/EllipsisVerticalIcon';
+import {
+ Box,
+ Checkbox,
+ Divider,
+ IconButton,
+ Link,
+ Stack,
+ SvgIcon,
+ Table,
+ TableBody,
+ TableCell,
+ TableHead,
+ TableRow,
+ TableSortLabel,
+ Typography
+} from '@mui/material';
+import { Pagination } from '../../../../components/pagination';
+import { Scrollbar } from '../../../../components/scrollbar';
+
+export const Table1 = () => (
+ <>
+
+
+
+
+
+
+
+
+
+ Order
+
+
+
+
+ Invoice date
+
+
+
+
+ Due date
+
+
+
+
+ Total
+
+
+
+
+ Payment method
+
+
+
+
+ Status
+
+
+
+
+
+
+
+
+
+
+
+
+ #DEV5437
+
+
+
+ 02 Jun 2021
+
+
+ 02 Jun 2021
+
+
+ $100.00
+
+
+ Credit Card
+
+
+
+
+
+ Ongoing
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+);
diff --git a/src/sections/dashboard/invoices/invoice-details.js b/src/sections/dashboard/invoices/invoice-details.js
new file mode 100644
index 000000000000..74b4e5e9f57b
--- /dev/null
+++ b/src/sections/dashboard/invoices/invoice-details.js
@@ -0,0 +1,60 @@
+import PropTypes from 'prop-types';
+import { format } from 'date-fns';
+import { Card, CardHeader, Divider, Stack } from '@mui/material';
+import { PropertyList } from '../../../components/property-list';
+import { PropertyListItem } from '../../../components/property-list-item';
+
+export const InvoiceDetails = (props) => {
+ const { invoice } = props;
+ const issueDate = format(invoice.issueDate, 'dd MMM yyyy');
+ const dueDate = format(invoice.dueDate, 'dd MMM yyyy');
+
+ return (
+
+
+
+ *': {
+ width: {
+ md: '50%'
+ }
+ }
+ }}
+ >
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+InvoiceDetails.propTypes = {
+ invoice: PropTypes.object.isRequired
+};
diff --git a/src/sections/dashboard/invoices/invoice-line-items.js b/src/sections/dashboard/invoices/invoice-line-items.js
new file mode 100644
index 000000000000..034691099e33
--- /dev/null
+++ b/src/sections/dashboard/invoices/invoice-line-items.js
@@ -0,0 +1,133 @@
+import PropTypes from 'prop-types';
+import numeral from 'numeral';
+import {
+ Card,
+ CardHeader,
+ Divider,
+ Stack,
+ Table,
+ TableBody,
+ TableCell,
+ TableHead,
+ TableRow,
+ Typography
+} from '@mui/material';
+import { Scrollbar } from '../../../components/scrollbar';
+
+export const InvoiceLineItems = (props) => {
+ const { invoice } = props;
+
+ const lineItems = invoice.lineItems || [];
+ const taxAmount = numeral(invoice.taxAmount).format(`${invoice.currency}0,0.00`);
+ const totalAmount = numeral(invoice.totalAmount).format(`${invoice.currency}0,0.00`);
+
+ return (
+
+
+
+
+
+
+
+
+ Item
+
+
+ Qty
+
+
+ Subtotal
+
+
+ Total
+
+
+
+
+ {lineItems.map((lineItem, index) => {
+ const unitAmount = numeral(lineItem.unitAmount).format(`${lineItem.currency}0,0.00`);
+ const subtotalAmount = numeral(lineItem.subtotalAmount).format(`${lineItem.currency}0,0.00`);
+ const totalAmount = numeral(lineItem.totalAmount).format(`${lineItem.currency}0,0.00`);
+
+ return (
+
+
+
+ {lineItem.name}
+
+
+ {unitAmount}
+
+
+
+ {lineItem.quantity}
+
+
+ {subtotalAmount}
+
+
+ {totalAmount}
+
+
+ );
+ })}
+
+
+
+
+
+
+
+ Tax
+
+
+ {taxAmount}
+
+
+
+
+
+
+
+
+
+
+
+ Total
+
+
+ {totalAmount}
+
+
+
+
+
+
+
+
+ );
+};
+
+InvoiceLineItems.propTypes = {
+ invoice: PropTypes.object.isRequired
+};
diff --git a/src/sections/dashboard/invoices/invoice-payment-history.js b/src/sections/dashboard/invoices/invoice-payment-history.js
new file mode 100644
index 000000000000..b3f97707a138
--- /dev/null
+++ b/src/sections/dashboard/invoices/invoice-payment-history.js
@@ -0,0 +1,115 @@
+import { Fragment } from 'react';
+import { formatDistanceToNow, subMinutes } from 'date-fns';
+import { Card, CardContent, CardHeader, Divider, Typography } from '@mui/material';
+import { Timeline, TimelineConnector, TimelineContent, TimelineDot, TimelineItem } from '@mui/lab';
+
+const now = new Date();
+
+const logs = [
+ {
+ id: '2aa78a34a87c148865744f62',
+ chargeId: 'th_2JCleBj4vHz',
+ createdAt: subMinutes(now, 15).getTime(),
+ type: 'chargeComplete'
+ },
+ {
+ id: 'cca161770fa1ae35541abab7',
+ createdAt: subMinutes(now, 53).getTime(),
+ currentStatus: 'complete',
+ previousStatus: 'pending',
+ type: 'statusChanged'
+ }
+];
+
+const getContent = (log) => {
+ switch (log.type) {
+ case 'chargeComplete':
+ return (
+ <>
+
+ Stripe charge complete
+
+
+ Charge ID: {log.chargeId}
+
+ >
+ );
+
+ case 'statusChanged':
+ return (
+
+ Status changed from {log.previousStatus} payment to {log.currentStatus} .
+
+ );
+
+ default:
+ return null;
+ }
+};
+
+export const InvoicePaymentHistory = () => (
+
+
+
+
+
+ {logs.map((log, index) => {
+ const hasConnector = logs.length > index + 1;
+ const ago = formatDistanceToNow(log.createdAt);
+
+ return (
+
+
+
+
+ {getContent(log)}
+
+ {ago} ago
+
+
+
+ {hasConnector && (
+ theme.palette.mode === 'dark'
+ ? 'neutral.800'
+ : 'neutral.200',
+ height: 22,
+ ml: '5px',
+ my: 1
+ }}
+ />
+ )}
+
+ );
+ })}
+
+
+
+);
diff --git a/src/sections/dashboard/invoices/invoice-payment.js b/src/sections/dashboard/invoices/invoice-payment.js
new file mode 100644
index 000000000000..be8db27c7fa1
--- /dev/null
+++ b/src/sections/dashboard/invoices/invoice-payment.js
@@ -0,0 +1,67 @@
+import PropTypes from 'prop-types';
+import { format } from 'date-fns';
+import numeral from 'numeral';
+import { Card, CardHeader, Divider, Stack } from '@mui/material';
+import { PropertyList } from '../../../components/property-list';
+import { PropertyListItem } from '../../../components/property-list-item';
+
+export const InvoicePayment = (props) => {
+ const { invoice } = props;
+
+ const paidAt = invoice.paidAt ? format(invoice.paidAt, 'dd MMM yyyy') : '';
+ const totalAmount = numeral(invoice.totalAmount).format(`${invoice.currency}0,0.00`);
+ const transactionFees = numeral(invoice.transactionFees).format(`${invoice.currency}0,0.00`);
+
+ return (
+
+
+
+ *': {
+ width: {
+ md: '50%'
+ }
+ }
+ }}
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+InvoicePayment.propTypes = {
+ invoice: PropTypes.object.isRequired
+};
diff --git a/src/sections/dashboard/invoices/invoice-pdf-document.js b/src/sections/dashboard/invoices/invoice-pdf-document.js
new file mode 100644
index 000000000000..d8df2b6bc3a9
--- /dev/null
+++ b/src/sections/dashboard/invoices/invoice-pdf-document.js
@@ -0,0 +1,287 @@
+import { useMemo } from 'react';
+import PropTypes from 'prop-types';
+import { format } from 'date-fns';
+import numeral from 'numeral';
+import { Document, Page, StyleSheet, Text, View } from '@react-pdf/renderer';
+import { useTheme } from '@mui/material/styles';
+
+const COL1_WIDTH = 60;
+const COLN_WIDTH = (100 - COL1_WIDTH) / 3;
+
+const useStyles = () => {
+ const theme = useTheme();
+
+ return useMemo(() => {
+ return StyleSheet.create({
+ page: {
+ backgroundColor: '#FFFFFF',
+ padding: 24
+ },
+ h4: {
+ fontSize: 24,
+ fontWeight: 600,
+ lineHeight: 1.5
+ },
+ subtitle2: {
+ fontSize: 12,
+ fontWeight: 500,
+ letterSpacing: 0,
+ lineHeight: 1.57
+ },
+ body2: {
+ fontSize: 10,
+ lineHeight: 1.47
+ },
+ h6: {
+ fontSize: 12,
+ fontWeight: 600,
+ lineHeight: 1.6
+ },
+ gutterBottom: {
+ marginBottom: 4
+ },
+ header: {
+ flexDirection: 'row',
+ justifyContent: 'space-between'
+ },
+ status: {
+ textTransform: 'uppercase',
+ color: 'rgba(236, 76, 71, 1)'
+ },
+ details: {
+ flexDirection: 'row',
+ justifyContent: 'space-between',
+ marginTop: 12
+ },
+ dates: {
+ flexDirection: 'row',
+ justifyContent: 'space-between',
+ marginBottom: 36,
+ marginTop: 48
+ },
+ notes: {
+ marginTop: 32
+ },
+ table: {
+ display: 'flex',
+ width: 'auto',
+ border: '1px solid #E1E3EA',
+ borderRadius: 6
+ },
+ tableHeader: {
+ backgroundColor: 'rgba(243, 244, 247, 1)'
+ },
+ tableBody: {},
+ tableRow: {
+ borderBottomWidth: 1,
+ borderColor: '#EEEEEE',
+ borderStyle: 'solid',
+ flexDirection: 'row'
+ },
+ tableCell1: {
+ padding: 6,
+ width: `${COL1_WIDTH}%`,
+ justifyContent: 'center'
+ },
+ tableCellN: {
+ padding: 6,
+ width: `${COLN_WIDTH}%`,
+ justifyContent: 'center'
+ }
+ });
+ }, []);
+};
+
+export const InvoicePdfDocument = (props) => {
+ const { invoice } = props;
+ const styles = useStyles();
+
+ const lineItems = invoice.lineItems || [];
+ const dueDate = format(invoice.dueDate, 'dd MMM yyyy');
+ const issueDate = format(invoice.issueDate, 'dd MMM yyyy');
+ const taxAmount = numeral(invoice.taxAmount).format(`${invoice.currency}0,0.00`);
+ const totalAmount = numeral(invoice.totalAmount).format(`${invoice.currency}0,0.00`);
+
+ return (
+
+
+
+
+
+ {invoice.ref}
+
+
+
+
+ {invoice.status}
+
+
+
+
+
+
+ Invoice to
+
+
+ Acme LTD GB54423345
+
+
+ 340 Lemon St. #5554
+
+
+ Spring Valley, California
+
+
+ United States
+
+
+
+
+ Invoice for
+
+
+ Natalie Rusell
+
+
+ 3845 Salty Street
+
+
+ Salt Lake City
+
+
+ United States
+
+
+
+
+
+
+ Invoice Date
+
+
+ {dueDate}
+
+
+
+
+ Due Date
+
+
+ {issueDate}
+
+
+
+
+
+
+
+
+
+ Description
+
+
+
+
+ Qty
+
+
+
+
+ Total
+
+
+
+
+ Tax
+
+
+
+
+
+ {lineItems.map((lineItem, index) => {
+ const subtotalAmount = numeral(lineItem.subtotalAmount).format(`${lineItem.currency}0,0.00`);
+ const totalAmount = numeral(lineItem.totalAmount).format(`${lineItem.currency}0,0.00`);
+
+ return (
+
+
+
+ {lineItem.name}
+
+
+ {lineItem.unitAmount}
+
+
+
+
+ {lineItem.quantity}
+
+
+
+
+ {subtotalAmount}
+
+
+
+
+ {totalAmount}
+
+
+
+ );
+ })}
+
+
+
+
+
+
+
+ Tax
+
+
+ {taxAmount}
+
+
+
+
+
+
+
+
+
+
+
+ Total
+
+
+ {totalAmount}
+
+
+
+
+
+
+
+
+
+ Notes
+
+
+ {invoice.note}
+
+
+
+
+ );
+};
+
+InvoicePdfDocument.propTypes = {
+ invoice: PropTypes.object.isRequired
+};
diff --git a/src/sections/dashboard/invoices/invoice-pdf-preview.js b/src/sections/dashboard/invoices/invoice-pdf-preview.js
new file mode 100644
index 000000000000..430bd9f70d1d
--- /dev/null
+++ b/src/sections/dashboard/invoices/invoice-pdf-preview.js
@@ -0,0 +1,276 @@
+import PropTypes from 'prop-types';
+import { format } from 'date-fns';
+import numeral from 'numeral';
+import {
+ Box,
+ Paper,
+ Stack,
+ Table,
+ TableBody,
+ TableCell,
+ TableHead,
+ TableRow,
+ Typography
+} from '@mui/material';
+import { Scrollbar } from '../../../components/scrollbar';
+
+export const InvoicePdfPreview = (props) => {
+ const { invoice } = props;
+
+ const lineItems = invoice.lineItems || [];
+ const issueDate = format(invoice.issueDate, 'dd MMM yyyy');
+ const dueDate = format(invoice.dueDate, 'dd MMM yyyy');
+ const taxAmount = numeral(invoice.taxAmount).format(`${invoice.currency}0,0.00`);
+ const totalAmount = numeral(invoice.totalAmount).format(`${invoice.currency}0,0.00`);
+
+ return (
+
+
+
+ {invoice.ref}
+
+
+ {invoice.status}
+
+
+
+
+
+ Invoice to
+
+
+ Acme LTD GB54423345
+
+ 340 Lemon St. #5554
+
+ Spring Valley, California
+
+ United States
+
+
+
+
+ Invoice for
+
+
+ Natalie Rusell
+
+ 3845 Salty Street
+
+ Salt Lake City
+
+ United States
+
+
+
+
+
+
+ Invoice Date
+
+
+ {issueDate}
+
+
+
+
+ Due Date
+
+
+ {dueDate}
+
+
+
+
+
+
+
+
+
+ Item
+
+
+ Qty
+
+
+ Subtotal
+
+
+ Total
+
+
+
+
+ {lineItems.map((lineItem, index) => {
+ const unitAmount = numeral(lineItem.unitAmount).format(`${lineItem.currency}0,0.00`);
+ const subtotalAmount = numeral(lineItem.subtotalAmount).format(`${lineItem.currency}0,0.00`);
+ const totalAmount = numeral(lineItem.totalAmount).format(`${lineItem.currency}0,0.00`);
+
+ return (
+
+
+
+ {lineItem.name}
+
+
+ {unitAmount}
+
+
+
+ {lineItem.quantity}
+
+
+ {subtotalAmount}
+
+
+ {totalAmount}
+
+
+ );
+ })}
+
+
+
+
+
+
+
+ Tax
+
+
+ {taxAmount}
+
+
+
+
+
+
+
+
+
+
+
+ Total
+
+
+ {totalAmount}
+
+
+
+
+
+
+
+
+
+ Notes
+
+
+ "{invoice.note}"
+
+
+ );
+};
+
+InvoicePdfPreview.propTypes = {
+ invoice: PropTypes.object.isRequired
+};
diff --git a/src/sections/dashboard/invoices/invoice-quick-actions.js b/src/sections/dashboard/invoices/invoice-quick-actions.js
new file mode 100644
index 000000000000..664d2081a856
--- /dev/null
+++ b/src/sections/dashboard/invoices/invoice-quick-actions.js
@@ -0,0 +1,196 @@
+import { useCallback, useState } from 'react';
+import { useRouter } from 'next/navigation';
+import PropTypes from 'prop-types';
+import toast from 'react-hot-toast';
+import { PDFDownloadLink } from '@react-pdf/renderer';
+import ArrowDownOnSquareIcon from '@heroicons/react/24/outline/ArrowDownOnSquareIcon';
+import CurrencyDollarIcon from '@heroicons/react/24/outline/CurrencyDollarIcon';
+import DocumentDuplicateIcon from '@heroicons/react/24/outline/DocumentDuplicateIcon';
+import EyeIcon from '@heroicons/react/24/outline/EyeIcon';
+import InboxIcon from '@heroicons/react/24/outline/InboxIcon';
+import TrashIcon from '@heroicons/react/24/outline/TrashIcon';
+import {
+ Button,
+ Card,
+ CardContent,
+ CardHeader,
+ Divider,
+ MenuItem,
+ SvgIcon,
+ TextField
+} from '@mui/material';
+import { ActionList } from '../../../components/action-list';
+import { ActionListItem } from '../../../components/action-list-item';
+import { ConfirmationDialog } from '../../../components/confirmation-dialog';
+import { useDialog } from '../../../hooks/use-dialog';
+import { paths } from '../../../paths';
+import { InvoicePdfDocument } from './invoice-pdf-document';
+
+const notificationOptions = [
+ {
+ label: 'Invoice created',
+ value: 'invoiceCreated'
+ },
+ {
+ label: 'Payment received',
+ value: 'paymentConfirmation'
+ }
+];
+
+export const InvoiceQuickActions = (props) => {
+ const { invoice } = props;
+ const router = useRouter();
+ const markDialog = useDialog();
+ const duplicateDialog = useDialog();
+ const archiveDialog = useDialog();
+ const [notification, setNotification] = useState(notificationOptions[0].value);
+
+ const handleStatusChange = useCallback((event) => {
+ setNotification(event.target.value);
+ }, []);
+
+ const handleSendNotification = useCallback(() => {
+ toast.success('Notification sent');
+ }, []);
+
+ const handleMark = useCallback(() => {
+ markDialog.handleClose();
+ toast.error('This action is not available on demo');
+ }, [markDialog]);
+
+ const handleDuplicate = useCallback(() => {
+ duplicateDialog.handleClose();
+ toast.error('This action is not available on demo');
+ }, [duplicateDialog]);
+
+ const handleDelete = useCallback(() => {
+ archiveDialog.handleClose();
+ toast.error('This action is not available on demo');
+ }, [archiveDialog]);
+
+ const handlePreview = useCallback(() => {
+ router.push(paths.dashboard.invoices.details.preview);
+ }, [router]);
+
+ return (
+ <>
+
+
+
+
+
+ {notificationOptions.map((option) => (
+
+ {option.label}
+
+ ))}
+
+
+
+
+ )}
+ sx={{ mt: 2 }}
+ variant="outlined"
+ >
+ Send Email
+
+
+
+
+
+
+
+ )}
+ label="Preview"
+ onClick={handlePreview}
+ />
+
+
+
+ )}
+ label="Mark Paid"
+ onClick={markDialog.handleOpen}
+ />
+
+
+
+ )}
+ label="Duplicate"
+ onClick={duplicateDialog.handleOpen}
+ />
+ }
+ fileName="invoice"
+ style={{
+ color: 'inherit',
+ textDecoration: 'none'
+ }}
+ >
+
+
+
+ )}
+ label="Download (PDF)"
+ />
+
+
+
+
+ )}
+ label="Delete"
+ onClick={archiveDialog.handleOpen}
+ />
+
+
+
+
+
+ >
+ );
+};
+
+InvoiceQuickActions.propTypes = {
+ invoice: PropTypes.object.isRequired
+};
diff --git a/src/sections/dashboard/invoices/invoices-search.js b/src/sections/dashboard/invoices/invoices-search.js
new file mode 100644
index 000000000000..16c113a45051
--- /dev/null
+++ b/src/sections/dashboard/invoices/invoices-search.js
@@ -0,0 +1,239 @@
+import { useCallback } from 'react';
+import PropTypes from 'prop-types';
+import AdjustmentsHorizontalIcon from '@heroicons/react/24/outline/AdjustmentsHorizontalIcon';
+import { Box, Button, Divider, Stack, SvgIcon, Tab, Tabs } from '@mui/material';
+import { BulkActionsMenu } from '../../../components/bulk-actions-menu';
+import { FilterDialog } from '../../../components/filter-dialog';
+import { QueryField } from '../../../components/query-field';
+import { useDialog } from '../../../hooks/use-dialog';
+import {
+ containsOperator,
+ endsWithOperator,
+ equalsOperator,
+ greaterThanOperator,
+ isAfterOperator,
+ isBeforeOperator,
+ isBlankOperator,
+ isPresentOperator,
+ lessThanOperator,
+ notContainsOperator,
+ notEqualOperator,
+ startsWithOperator
+} from '../../../utils/filter-operators';
+
+const viewOptions = [
+ {
+ label: 'Show all',
+ value: 'all'
+ },
+ {
+ label: 'Ongoing',
+ value: 'ongoing'
+ },
+ {
+ label: 'Paid',
+ value: 'paid'
+ },
+ {
+ label: 'Overdue',
+ value: 'overdue'
+ }
+];
+
+const filterProperties = [
+ {
+ label: 'Ref',
+ name: 'ref',
+ operators: [
+ 'contains',
+ 'endsWith',
+ 'equals',
+ 'notContains',
+ 'startsWith',
+ 'isBlank',
+ 'isPresent'
+ ]
+ },
+ {
+ label: 'Status',
+ name: 'status',
+ operators: [
+ 'contains',
+ 'endsWith',
+ 'equals',
+ 'notContains',
+ 'startsWith',
+ 'isBlank',
+ 'isPresent'
+ ]
+ },
+ {
+ label: 'Payment Method',
+ name: 'paymentMethod',
+ operators: [
+ 'contains',
+ 'endsWith',
+ 'equals',
+ 'notContains',
+ 'startsWith',
+ 'isBlank',
+ 'isPresent'
+ ]
+ },
+ {
+ label: 'Total',
+ name: 'totalAmount',
+ operators: ['equals', 'greaterThan', 'lessThan', 'notEqual', 'isBlank', 'isPresent']
+ },
+ {
+ label: 'Issue Date',
+ name: 'issueDate',
+ operators: ['isAfter', 'isBefore', 'isBlank', 'isPresent']
+ },
+ {
+ label: 'Due Date',
+ name: 'dueDate',
+ operators: ['isAfter', 'isBefore', 'isBlank', 'isPresent']
+ }
+];
+
+const filterOperators = [
+ containsOperator,
+ endsWithOperator,
+ equalsOperator,
+ greaterThanOperator,
+ isAfterOperator,
+ isBeforeOperator,
+ isBlankOperator,
+ isPresentOperator,
+ lessThanOperator,
+ notContainsOperator,
+ notEqualOperator,
+ startsWithOperator
+];
+
+export const InvoicesSearch = (props) => {
+ const {
+ disabled = false,
+ filters = [],
+ onFiltersApply,
+ onFiltersClear,
+ onQueryChange,
+ onViewChange,
+ query = '',
+ selected = [],
+ view = 'all'
+ } = props;
+ const filterDialog = useDialog();
+
+ const handleFiltersApply = useCallback((filters) => {
+ filterDialog.handleClose();
+ onFiltersApply?.(filters);
+ }, [filterDialog, onFiltersApply]);
+
+ const handleFiltersClear = useCallback(() => {
+ filterDialog.handleClose();
+ onFiltersClear?.();
+ }, [filterDialog, onFiltersClear]);
+
+ const hasSelection = selected.length > 0;
+ const hasFilters = filters.length > 0;
+
+ return (
+ <>
+
+
+ onViewChange?.(value)}
+ value={view}
+ variant="scrollable"
+ >
+ {viewOptions.map((option) => (
+
+ ))}
+
+
+
+
+ {hasSelection && (
+
+ )}
+
+
+
+
+ )}
+ sx={{ order: 2 }}
+ variant={hasFilters ? 'contained' : 'text'}
+ >
+ Filter
+
+
+
+
+ >
+ );
+};
+
+InvoicesSearch.propTypes = {
+ disabled: PropTypes.bool,
+ filters: PropTypes.array,
+ onFiltersApply: PropTypes.func,
+ onFiltersClear: PropTypes.func,
+ onQueryChange: PropTypes.func,
+ onViewChange: PropTypes.func,
+ query: PropTypes.string,
+ selected: PropTypes.array,
+ view: PropTypes.oneOf(['all', 'ongoing', 'paid', 'overdue'])
+};
diff --git a/src/sections/dashboard/invoices/invoices-stats.js b/src/sections/dashboard/invoices/invoices-stats.js
new file mode 100644
index 000000000000..5c1fdc0a7bd7
--- /dev/null
+++ b/src/sections/dashboard/invoices/invoices-stats.js
@@ -0,0 +1,179 @@
+import PropTypes from 'prop-types';
+import numeral from 'numeral';
+import { Box, Card, CardContent, Stack, Typography, Unstable_Grid2 as Grid } from '@mui/material';
+import { alpha, useTheme } from '@mui/material/styles';
+import { Chart } from '../../../components/chart';
+
+const useChartOptions = (labels) => {
+ const theme = useTheme();
+
+ return {
+ chart: {
+ background: 'transparent',
+ stacked: false,
+ toolbar: {
+ show: false
+ },
+ zoom: {
+ enabled: false
+ }
+ },
+ colors: [
+ theme.palette.info.main,
+ theme.palette.success.main,
+ theme.palette.error.main
+ ],
+ dataLabels: {
+ enabled: false
+ },
+ grid: {
+ padding: {
+ left: 0,
+ right: 0
+ }
+ },
+ labels,
+ legend: {
+ show: false
+ },
+ plotOptions: {
+ pie: {
+ expandOnClick: false
+ }
+ },
+ states: {
+ active: {
+ filter: {
+ type: 'none'
+ }
+ },
+ hover: {
+ filter: {
+ type: 'none'
+ }
+ }
+ },
+ stroke: {
+ width: 0
+ },
+ theme: {
+ mode: theme.palette.mode
+ },
+ tooltip: {
+ fillSeriesColor: false
+ }
+ };
+};
+
+export const InvoicesStats = (props) => {
+ const { chartSeries = [], labels = [] } = props;
+ const chartOptions = useChartOptions(labels);
+
+ return (
+ alpha(theme.palette.info.main, 0.1),
+ mb: 4
+ }}
+ >
+
+
+
+
+ Total net income
+
+
+ $12,200.00
+
+
+ From a total of
+ {' '}
+ 6
+ {' '}
+ Invoices
+
+
+
+
+
+ {chartSeries.map((item, index) => {
+ const amount = numeral(item).format('$0,0.00');
+
+ return (
+
+
+
+
+ {labels[index]}
+
+
+
+ {amount}
+
+
+ );
+ })}
+
+
+
+
+
+ );
+};
+
+InvoicesStats.propTypes = {
+ chartSeries: PropTypes.array,
+ labels: PropTypes.array
+};
diff --git a/src/sections/dashboard/invoices/invoices-table-menu.js b/src/sections/dashboard/invoices/invoices-table-menu.js
new file mode 100644
index 000000000000..6038415130f7
--- /dev/null
+++ b/src/sections/dashboard/invoices/invoices-table-menu.js
@@ -0,0 +1,64 @@
+import { useCallback } from 'react';
+import { useRouter } from 'next/navigation';
+import toast from 'react-hot-toast';
+import EllipsisVerticalIcon from '@heroicons/react/24/outline/EllipsisVerticalIcon';
+import { IconButton, Menu, MenuItem, SvgIcon } from '@mui/material';
+import { usePopover } from '../../../hooks/use-popover';
+import { paths } from '../../../paths';
+
+export const InvoicesTableMenu = () => {
+ const router = useRouter();
+ const popover = usePopover();
+
+ const handleEdit = useCallback(() => {
+ popover.handleClose();
+ router.push(paths.dashboard.invoices.index);
+ }, [popover, router]);
+
+ const handleReport = useCallback(() => {
+ popover.handleClose();
+ toast.error('This action is not available on demo');
+ }, [popover]);
+
+ const handleDelete = useCallback(() => {
+ popover.handleClose();
+ toast.error('This action is not available on demo');
+ }, [popover]);
+
+ return (
+ <>
+
+
+
+
+
+
+
+ View
+
+
+ Duplicate
+
+
+ Delete
+
+
+ >
+ );
+};
diff --git a/src/sections/dashboard/invoices/invoices-table.js b/src/sections/dashboard/invoices/invoices-table.js
new file mode 100644
index 000000000000..1a2b307a85d1
--- /dev/null
+++ b/src/sections/dashboard/invoices/invoices-table.js
@@ -0,0 +1,300 @@
+import PropTypes from 'prop-types';
+import NextLink from 'next/link';
+import { format } from 'date-fns';
+import numeral from 'numeral';
+import {
+ Box,
+ Checkbox,
+ Divider,
+ Link,
+ Skeleton,
+ Stack,
+ Table,
+ TableBody,
+ TableCell,
+ TableHead,
+ TableRow,
+ TableSortLabel,
+ Typography
+} from '@mui/material';
+import { Pagination } from '../../../components/pagination';
+import { ResourceError } from '../../../components/resource-error';
+import { ResourceUnavailable } from '../../../components/resource-unavailable';
+import { Scrollbar } from '../../../components/scrollbar';
+import { paths } from '../../../paths';
+import { InvoicesTableMenu } from './invoices-table-menu';
+
+const statusMap = {
+ draft: {
+ color: 'warning.main',
+ label: 'Draft'
+ },
+ ongoing: {
+ color: 'info.main',
+ label: 'Ongoing'
+ },
+ overdue: {
+ color: 'error.main',
+ label: 'Overdue'
+ },
+ paid: {
+ color: 'success.main',
+ label: 'Paid'
+ }
+};
+
+const columns = [
+ {
+ id: 'ref',
+ disablePadding: true,
+ label: 'Invoice Ref',
+ sortable: true
+ },
+ {
+ id: 'issueDate',
+ label: 'Issue Date',
+ sortable: true
+ },
+ {
+ id: 'dueDate',
+ label: 'Due Date',
+ sortable: true
+ },
+ {
+ id: 'totalAmount',
+ label: 'Total',
+ sortable: true
+ },
+ {
+ id: 'paymentMethod',
+ label: 'Payment Method',
+ sortable: true
+ },
+ {
+ id: 'status',
+ label: 'Status',
+ sortable: true
+ }
+];
+
+const getResourcesState = (params) => {
+ if (params.isLoading) {
+ return 'loading';
+ }
+
+ if (params.error) {
+ return 'error';
+ }
+
+ return params.items.length > 0 ? 'available' : 'unavailable';
+};
+
+export const InvoicesTable = (props) => {
+ const {
+ count = 0,
+ error,
+ isLoading = false,
+ items = [],
+ onDeselectAll,
+ onDeselectOne,
+ onPageChange,
+ onSelectAll,
+ onSelectOne,
+ onSortChange,
+ page = 0,
+ rowsPerPage = 0,
+ selected = [],
+ sortBy = 'issueDate',
+ sortDir = 'desc'
+ } = props;
+
+ const resourcesState = getResourcesState({
+ isLoading,
+ error,
+ items
+ });
+
+ const selectedSome = (selected.length > 0) && (selected.length < items.length);
+ const selectedAll = (items.length > 0) && (selected.length === items.length);
+
+ return (
+
+
+
+
+
+
+ {
+ if (event.target.checked) {
+ onSelectAll?.();
+ } else {
+ onDeselectAll?.();
+ }
+ }}
+ />
+
+ {columns.map((column) => (
+
+ {column.sortable
+ ? (
+ onSortChange?.(column.id)}
+ >
+ {column.label}
+
+ )
+ : column.label}
+
+ ))}
+
+
+
+ {resourcesState === 'available' && (
+
+ {items.map((invoice) => {
+ const isSelected = !!selected.find((invoiceId) => invoiceId === invoice.id);
+ const status = statusMap[invoice.status];
+ const issueDate = format(invoice.issueDate, 'dd MMM yyyy');
+ const dueDate = format(invoice.dueDate, 'dd MMM yyyy');
+ const totalAmount = numeral(invoice.totalAmount).format(`${invoice.currency}0,0.00`);
+
+ return (
+
+
+ {
+ if (event.target.checked) {
+ onSelectOne?.(invoice.id);
+ } else {
+ onDeselectOne?.(invoice.id);
+ }
+ }}
+ />
+
+
+
+ {invoice.ref}
+
+
+
+ {issueDate}
+
+
+ {dueDate}
+
+
+ {totalAmount}
+
+
+ {invoice.paymentMethod}
+
+
+
+
+
+ {status.label}
+
+
+
+
+
+
+
+ );
+ })}
+
+ )}
+
+
+ {resourcesState === 'available' && (
+ <>
+
+
+ >
+ )}
+ {resourcesState === 'loading' && (
+
+
+
+
+
+ )}
+ {resourcesState === 'error' && (
+
+ )}
+ {resourcesState === 'unavailable' && (
+
+ )}
+
+ );
+};
+
+InvoicesTable.propTypes = {
+ count: PropTypes.number,
+ error: PropTypes.string,
+ isLoading: PropTypes.bool,
+ items: PropTypes.array,
+ onDeselectAll: PropTypes.func,
+ onDeselectOne: PropTypes.func,
+ onPageChange: PropTypes.func,
+ onSelectAll: PropTypes.func,
+ onSelectOne: PropTypes.func,
+ onSortChange: PropTypes.func,
+ page: PropTypes.number,
+ rowsPerPage: PropTypes.number,
+ selected: PropTypes.array,
+ sortBy: PropTypes.string,
+ sortDir: PropTypes.oneOf(['asc', 'desc'])
+};
diff --git a/src/sections/dashboard/orders/order-create-dialog.js b/src/sections/dashboard/orders/order-create-dialog.js
new file mode 100644
index 000000000000..c16077797e2d
--- /dev/null
+++ b/src/sections/dashboard/orders/order-create-dialog.js
@@ -0,0 +1,130 @@
+import PropTypes from 'prop-types';
+import { useRouter } from 'next/navigation';
+import { useFormik } from 'formik';
+import * as Yup from 'yup';
+import {
+ Button,
+ Dialog,
+ DialogActions,
+ DialogContent,
+ DialogTitle,
+ FormHelperText,
+ Stack,
+ TextField
+} from '@mui/material';
+import { paths } from '../../../paths';
+
+const initialValues = {
+ customerEmail: '',
+ customerName: '',
+ submit: null
+};
+
+const validationSchema = Yup.object({
+ customerEmail: Yup
+ .string()
+ .max(255)
+ .email('Must be a valid email')
+ .required('Customer email is required'),
+ customerName: Yup
+ .string()
+ .max(255)
+ .required('Customer name is required')
+});
+
+export const OrderCreateDialog = (props) => {
+ const { open = false, onClose, ...other } = props;
+ const router = useRouter();
+ const formik = useFormik({
+ initialValues,
+ validationSchema,
+ onSubmit: async (values, helpers) => {
+ try {
+ // Do API call
+
+ helpers.setStatus({ success: true });
+ helpers.setSubmitting(false);
+ helpers.resetForm();
+
+ // You might want to return the created order instead
+ // and let the parent component handle the redirect or other post action.
+
+ router.push(paths.dashboard.orders.details);
+ } catch (err) {
+ console.error(err);
+ helpers.setStatus({ success: false });
+ helpers.setErrors({ submit: err.message });
+ helpers.setSubmitting(false);
+ }
+ }
+ });
+
+ return (
+ formik.resetForm()
+ }}
+ {...other}>
+
+ Create Order
+
+
+
+
+
+
+ {formik.errors.submit && (
+
+ {formik.errors.submit}
+
+ )}
+
+
+
+ Cancel
+
+ { formik.handleSubmit(); }}
+ variant="contained"
+ disabled={formik.isSubmitting}
+ >
+ Create Order
+
+
+
+ );
+};
+
+OrderCreateDialog.propTypes = {
+ onClose: PropTypes.func,
+ open: PropTypes.bool
+};
diff --git a/src/sections/dashboard/orders/order-details-dialog.js b/src/sections/dashboard/orders/order-details-dialog.js
new file mode 100644
index 000000000000..9b8bed80bd43
--- /dev/null
+++ b/src/sections/dashboard/orders/order-details-dialog.js
@@ -0,0 +1,259 @@
+import PropTypes from 'prop-types';
+import { useFormik } from 'formik';
+import * as Yup from 'yup';
+import toast from 'react-hot-toast';
+import {
+ Button,
+ Dialog,
+ DialogActions,
+ DialogContent,
+ DialogTitle,
+ FormHelperText,
+ MenuItem,
+ Stack,
+ TextField
+} from '@mui/material';
+
+const statusOptions = [
+ {
+ label: 'Placed',
+ value: 'placed'
+ },
+ {
+ label: 'Processed',
+ value: 'processed'
+ },
+ {
+ label: 'Delivered',
+ value: 'delivered'
+ },
+ {
+ label: 'Complete',
+ value: 'complete'
+ }
+];
+
+const countryOptions = [
+ {
+ value: 'USA',
+ cities: ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Austin']
+ },
+ {
+ value: 'Germany',
+ cities: ['Berlin', 'Hamburg', 'Munich', 'Dortmund', 'Bremen']
+ },
+ {
+ value: 'Spain',
+ cities: ['Madrid', 'Barcelona', 'Valencia', 'Málaga', 'Sevilla']
+ },
+ {
+ value: 'Italy',
+ cities: ['Rome', 'Milan', 'Naples', 'Turin', 'Palermo']
+ }
+];
+
+const getInitialValues = (order) => {
+ return {
+ city: order?.address?.city || '',
+ country: order?.address?.country || '',
+ email: order?.customer?.email || '',
+ phone: order?.customer?.phone || '',
+ status: order?.status || '',
+ street: order?.address?.street || '',
+ submit: null
+ };
+};
+
+const validationSchema = Yup.object({
+ address: Yup
+ .string()
+ .max(255)
+ .required('Address is required'),
+ country: Yup
+ .string()
+ .max(255)
+ .oneOf(countryOptions.map((option) => option.value))
+ .required('Country is required'),
+ email: Yup
+ .string()
+ .max(255)
+ .email('Must be a valid email')
+ .required('Email is required'),
+ phone: Yup
+ .string()
+ .max(255)
+ .required('Phone number is required'),
+ city: Yup
+ .string()
+ .max(255)
+ .required('City is required'),
+ status: Yup
+ .string()
+ .max(255)
+ .required('Status is required')
+});
+
+export const OrderDetailsDialog = (props) => {
+ const { open = false, onClose, order } = props;
+ const formik = useFormik({
+ enableReinitialize: true,
+ initialValues: getInitialValues(order),
+ validationSchema,
+ onSubmit: async (values, helpers) => {
+ try {
+ toast.success('Order updated');
+ helpers.setStatus({ success: true });
+ helpers.setSubmitting(false);
+ onClose?.();
+ } catch (err) {
+ console.error(err);
+ helpers.setStatus({ success: false });
+ helpers.setErrors({ submit: err.message });
+ helpers.setSubmitting(false);
+ }
+ }
+ });
+
+ const cityOptions = countryOptions.find((option) => option.value
+ === formik.values.country)?.cities || [];
+
+ return (
+ formik.resetForm()
+ }}
+ >
+
+ Edit order
+
+
+
+
+
+
+
+ {statusOptions.map((option) => (
+
+ {option.label}
+
+ ))}
+
+
+ {countryOptions.map((option) => (
+
+ {option.value}
+
+ ))}
+
+
+ {cityOptions.map((option) => (
+
+ {option}
+
+ ))}
+
+
+ {formik.errors.submit && (
+
+ {formik.errors.submit}
+
+ )}
+
+
+
+ Cancel
+
+ { formik.handleSubmit(); }}
+ variant="contained"
+ >
+ Save Changes
+
+
+
+ );
+};
+
+OrderDetailsDialog.propTypes = {
+ onClose: PropTypes.func,
+ open: PropTypes.bool,
+ order: PropTypes.object
+};
diff --git a/src/sections/dashboard/orders/order-details.js b/src/sections/dashboard/orders/order-details.js
new file mode 100644
index 000000000000..ad967116aa06
--- /dev/null
+++ b/src/sections/dashboard/orders/order-details.js
@@ -0,0 +1,99 @@
+import PropTypes from 'prop-types';
+import { Avatar, Box, Button, Card, CardHeader, Divider, Stack } from '@mui/material';
+import { PropertyList } from '../../../components/property-list';
+import { PropertyListItem } from '../../../components/property-list-item';
+import { getInitials } from '../../../utils/get-initials';
+
+const statusMap = {
+ complete: 'Complete',
+ created: 'Created',
+ delivered: 'Delivered',
+ placed: 'Placed',
+ processed: 'Processed'
+};
+
+export const OrderDetails = (props) => {
+ const { order, onEdit, ...other } = props;
+ const status = statusMap[order.status];
+
+ return (
+
+
+ Edit
+
+ )}
+ title="Order Details"
+ />
+
+
+
+ {getInitials(order.customer?.name)}
+
+
+ *': {
+ width: {
+ md: '50%'
+ }
+ }
+ }}
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+OrderDetails.propTypes = {
+ onEdit: PropTypes.func,
+ order: PropTypes.object.isRequired
+};
diff --git a/src/sections/dashboard/orders/order-line-items.js b/src/sections/dashboard/orders/order-line-items.js
new file mode 100644
index 000000000000..cabb7cb207bc
--- /dev/null
+++ b/src/sections/dashboard/orders/order-line-items.js
@@ -0,0 +1,150 @@
+import PropTypes from 'prop-types';
+import numeral from 'numeral';
+import {
+ Avatar,
+ Card,
+ CardHeader,
+ Divider,
+ Stack,
+ Table,
+ TableBody,
+ TableCell,
+ TableHead,
+ TableRow,
+ Typography
+} from '@mui/material';
+import { Scrollbar } from '../../../components/scrollbar';
+
+export const OrderLineItems = (props) => {
+ const { order, ...other } = props;
+
+ const lineItems = order.lineItems || [];
+ const subtotalAmount = numeral(order.subtotalAmount).format(`${order.currency}0,0.00`);
+ const discount = numeral(order.discount).format(`${order.currency}0,0.00`);
+ const taxAmount = numeral(order.taxAmount).format(`${order.currency}0,0.00`);
+ const totalAmount = numeral(order.totalAmount).format(`${order.currency}0,0.00`);
+
+ return (
+
+
+
+
+
+
+
+
+ Name
+
+
+ Cost
+
+
+ Qty
+
+
+ Total
+
+
+
+
+ {lineItems.map((lineItem, index) => {
+ const unitAmount = numeral(lineItem.unitAmount).format(`${lineItem.currency}0,0.00`);
+ const totalAmount = numeral(lineItem.totalAmount).format(`${lineItem.currency}0,0.00`);
+
+ return (
+
+
+
+
+
+
+ {lineItem.name}
+
+
+ SKU: {lineItem.sku}
+
+
+
+
+
+ {unitAmount}
+
+
+ {lineItem.quantity}
+
+
+ {totalAmount}
+
+
+ );
+ })}
+
+
+ Subtotal
+
+
+
+
+ {subtotalAmount}
+
+
+
+
+ Discount
+
+
+
+
+ {discount}
+
+
+
+
+ VAT (25%)
+
+
+
+
+ {taxAmount}
+
+
+
+
+
+ Total
+
+
+
+
+
+
+ {totalAmount}
+
+
+
+
+
+
+
+ );
+};
+
+OrderLineItems.propTypes = {
+ order: PropTypes.object
+};
diff --git a/src/sections/dashboard/orders/order-payment-dialog.js b/src/sections/dashboard/orders/order-payment-dialog.js
new file mode 100644
index 000000000000..5fed6d34f1a8
--- /dev/null
+++ b/src/sections/dashboard/orders/order-payment-dialog.js
@@ -0,0 +1,215 @@
+import PropTypes from 'prop-types';
+import { useFormik } from 'formik';
+import * as Yup from 'yup';
+import toast from 'react-hot-toast';
+import {
+ Button,
+ Dialog,
+ DialogActions,
+ DialogContent,
+ DialogTitle,
+ FormHelperText,
+ MenuItem,
+ Stack,
+ TextField
+} from '@mui/material';
+
+const paymentStatusOptions = [
+ {
+ label: 'Paid',
+ value: 'paid'
+ },
+ {
+ label: 'Not paid',
+ value: 'not-paid'
+ }
+];
+
+const paymentMethodOptions = [
+ {
+ label: 'Direct debit',
+ value: 'debit'
+ },
+ {
+ label: 'Paypal',
+ value: 'paypal'
+ }
+];
+
+const courierOptions = ['DHL', 'UPS', 'FedEx', 'Purolator'];
+
+const getInitialValues = (order) => {
+ return {
+ paymentStatus: order?.paymentStatus || '',
+ courier: order?.courier || '',
+ paymentMethod: order?.paymentMethod || '',
+ submit: null,
+ trackingCode: order?.trackingCode || ''
+ };
+};
+
+const validationSchema = Yup.object({
+ paymentStatus: Yup
+ .string()
+ .max(255)
+ .required('Payment status is required'),
+ courier: Yup
+ .string()
+ .max(255)
+ .required('Courier is required'),
+ paymentMethod: Yup
+ .string()
+ .max(255)
+ .required('Payment method is required'),
+ trackingCode: Yup
+ .string()
+ .max(255)
+ .required('Tracking is required')
+});
+
+export const OrderPaymentDialog = (props) => {
+ const { open = false, onClose, order } = props;
+ const formik = useFormik({
+ enableReinitialize: true,
+ initialValues: getInitialValues(order),
+ validationSchema,
+ onSubmit: async (values, helpers) => {
+ try {
+ toast.success('Order updated');
+ helpers.setStatus({ success: true });
+ helpers.setSubmitting(false);
+ onClose?.();
+ } catch (err) {
+ console.error(err);
+ helpers.setStatus({ success: false });
+ helpers.setErrors({ submit: err.message });
+ helpers.setSubmitting(false);
+ }
+ }
+ });
+
+ return (
+ formik.resetForm()
+ }}
+ >
+
+ Edit order
+
+
+
+
+
+ {paymentStatusOptions.map((option) => (
+
+ {option.label}
+
+ ))}
+
+
+ {paymentMethodOptions.map((option) => (
+
+ {option.label}
+
+ ))}
+
+
+ {courierOptions.map((option) => (
+
+ {option}
+
+ ))}
+
+
+
+ {formik.errors.submit && (
+
+ {formik.errors.submit}
+
+ )}
+
+
+
+ Cancel
+
+ { formik.handleSubmit(); }}
+ variant="contained"
+ >
+ Save Changes
+
+
+
+ );
+};
+
+OrderPaymentDialog.propTypes = {
+ onClose: PropTypes.func,
+ open: PropTypes.bool,
+ order: PropTypes.object
+};
diff --git a/src/sections/dashboard/orders/order-payment.js b/src/sections/dashboard/orders/order-payment.js
new file mode 100644
index 000000000000..b75f8ffac6ab
--- /dev/null
+++ b/src/sections/dashboard/orders/order-payment.js
@@ -0,0 +1,83 @@
+import PropTypes from 'prop-types';
+import { Button, Card, CardHeader, Divider, Stack } from '@mui/material';
+import { PropertyList } from '../../../components/property-list';
+import { PropertyListItem } from '../../../components/property-list-item';
+
+const paymentStatusMap = {
+ paid: 'Paid',
+ pending: 'Pending'
+};
+
+const paymentMethodMap = {
+ creditCard: 'Credit Card',
+ debit: 'Direct Debit',
+ paypal: 'Paypal',
+ stripe: 'Stripe'
+};
+
+export const OrderPayment = (props) => {
+ const { onEdit, order, ...other } = props;
+
+ const paymentStatus = order.paymentStatus ? paymentStatusMap[order.paymentStatus] : 'Not Paid';
+ const paymentMethod = order.paymentMethod ? paymentMethodMap[order.paymentMethod] : '';
+
+ return (
+
+
+ Edit
+
+ )}
+ title="Payment & Courier Details"
+ />
+
+ *': {
+ width: {
+ md: '50%'
+ }
+ }
+ }}
+ >
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+OrderPayment.propTypes = {
+ onEdit: PropTypes.func,
+ order: PropTypes.object.isRequired
+};
diff --git a/src/sections/dashboard/orders/order-quick-actions.js b/src/sections/dashboard/orders/order-quick-actions.js
new file mode 100644
index 000000000000..e88cef1e9370
--- /dev/null
+++ b/src/sections/dashboard/orders/order-quick-actions.js
@@ -0,0 +1,315 @@
+import { useCallback, useState } from 'react';
+import toast from 'react-hot-toast';
+import PropTypes from 'prop-types';
+import { format } from 'date-fns';
+import ArchiveBoxIcon from '@heroicons/react/24/outline/ArchiveBoxIcon';
+import CheckCircleIcon from '@heroicons/react/24/outline/CheckCircleIcon';
+import CheckIcon from '@heroicons/react/24/outline/CheckIcon';
+import DocumentDuplicateIcon from '@heroicons/react/24/outline/DocumentDuplicateIcon';
+import ReceiptRefundIcon from '@heroicons/react/24/outline/ReceiptRefundIcon';
+import {
+ Box,
+ Button,
+ Card,
+ CardContent,
+ CardHeader,
+ Divider,
+ MenuItem,
+ Select,
+ Stack,
+ SvgIcon,
+ Typography
+} from '@mui/material';
+import { styled } from '@mui/material/styles';
+import {
+ Timeline,
+ TimelineConnector,
+ TimelineContent,
+ TimelineDot,
+ TimelineItem,
+ timelineItemClasses,
+ TimelineSeparator
+} from '@mui/lab';
+import { ActionList } from '../../../components/action-list';
+import { ActionListItem } from '../../../components/action-list-item';
+import { ConfirmationDialog } from '../../../components/confirmation-dialog';
+import { useDialog } from '../../../hooks/use-dialog';
+
+const statusOptions = [
+ {
+ color: 'info.main',
+ label: 'Placed',
+ value: 'placed'
+ },
+ {
+ color: 'error.main',
+ label: 'Processed',
+ value: 'processed'
+ },
+ {
+ color: 'warning.main',
+ label: 'Delivered',
+ value: 'delivered'
+ },
+ {
+ color: 'success.main',
+ label: 'Complete',
+ value: 'complete'
+ }
+];
+
+const StyledTimelineDot = (props) => {
+ const { complete } = props;
+
+ return (
+ theme.palette.mode === 'dark'
+ ? 'neutral.800'
+ : 'neutral.200',
+ borderColor: (theme) => theme.palette.mode === 'dark'
+ ? 'neutral.800'
+ : 'neutral.200',
+ color: 'text.secondary',
+ ...(complete && {
+ backgroundColor: 'success.main',
+ borderColor: 'success.main',
+ color: 'success.contrastText'
+ })
+ }}
+ >
+
+
+
+
+ );
+};
+
+const StyledTimelineConnector = styled(TimelineConnector)(({ theme }) => ({
+ backgroundColor: theme.palette.mode === 'dark'
+ ? theme.palette.neutral[800]
+ : theme.palette.neutral[200],
+ height: 24
+}));
+
+const StyledTimelineContent = styled(TimelineContent)(({ theme }) => ({
+ padding: '14px 16px',
+ ...theme.typography.overline
+}));
+
+export const OrderQuickActions = (props) => {
+ const { order, ...other } = props;
+ const markDialog = useDialog();
+ const duplicateDialog = useDialog();
+ const archiveDialog = useDialog();
+ const [status, setStatus] = useState(order?.status || '');
+
+ const handleStatusChange = useCallback((event) => {
+ setStatus(event.target.value);
+ }, []);
+
+ const handleSave = useCallback(() => {
+ toast.success('Changes saved');
+ }, []);
+
+ const handleMark = useCallback(() => {
+ markDialog.handleClose();
+ toast.error('This action is not available on demo');
+ }, [markDialog]);
+
+ const handleDuplicate = useCallback(() => {
+ duplicateDialog.handleClose();
+ toast.error('This action is not available on demo');
+ }, [duplicateDialog]);
+
+ const handleArchive = useCallback(() => {
+ archiveDialog.handleClose();
+ toast.error('This action is not available on demo');
+ }, [archiveDialog]);
+
+ const createdAt = format(order.createdAt, 'MMM/dd/yyyy HH:mm');
+ const updatedAt = order.updatedAt && format(order.updatedAt, 'MMM/dd/yyyy HH:mm');
+
+ return (
+ <>
+
+
+
+
+
+
+ {statusOptions.map((option) => (
+
+
+ {option.label}
+
+ ))}
+
+
+
+ Save Changes
+
+
+ {updatedAt && (
+
+ Updated {updatedAt}
+
+ )}
+
+
+
+
+
+
+
+
+ Placed at {createdAt}
+
+
+
+
+
+
+
+
+ Processed
+
+
+
+
+
+
+
+
+ Delivered
+
+
+
+
+
+
+
+ Complete
+
+
+
+
+
+
+
+
+
+
+ )}
+ label="Mark as Paid"
+ onClick={markDialog.handleOpen}
+ />
+
+
+
+ )}
+ label="Duplicate Order"
+ onClick={duplicateDialog.handleOpen}
+ />
+
+
+
+ )}
+ label="Request a Refund"
+ />
+
+
+
+ )}
+ label="Archive Order"
+ onClick={archiveDialog.handleOpen}
+ />
+
+
+
+
+
+ >
+ );
+};
+
+OrderQuickActions.propTypes = {
+ order: PropTypes.object
+};
diff --git a/src/sections/dashboard/orders/orders-dnd-draggable.js b/src/sections/dashboard/orders/orders-dnd-draggable.js
new file mode 100644
index 000000000000..d31605a5faad
--- /dev/null
+++ b/src/sections/dashboard/orders/orders-dnd-draggable.js
@@ -0,0 +1,101 @@
+import PropTypes from 'prop-types';
+import NextLink from 'next/link';
+import { format } from 'date-fns';
+import { Draggable } from 'react-beautiful-dnd';
+import { Box, Card, Chip, IconButton, Link, Stack } from '@mui/material';
+import DragIndicatorIcon from '@mui/icons-material/DragIndicator';
+import { PropertyList } from '../../../components/property-list';
+import { PropertyListItem } from '../../../components/property-list-item';
+import { paths } from '../../../paths';
+import { OrdersTableMenu } from './orders-table-menu';
+
+export const OrdersDndDraggable = (props) => {
+ const { color, index, order, ...other } = props;
+
+ const address = [order.address?.city, order.address?.country].join((', '));
+ const createdAt = format(order.createdAt, 'dd MMM yyyy HH:mm');
+
+ return (
+
+ {(provided) => (
+
+
+
+
+
+
+
+ #{order.id}
+
+ {color && (
+
+ )}
+
+
+
+
+
+
+
+
+
+
+
+ )}
+
+ );
+};
+
+OrdersDndDraggable.propTypes = {
+ color: PropTypes.string.isRequired,
+ index: PropTypes.number.isRequired,
+ order: PropTypes.object.isRequired
+};
diff --git a/src/sections/dashboard/orders/orders-dnd-droppable.js b/src/sections/dashboard/orders/orders-dnd-droppable.js
new file mode 100644
index 000000000000..5188fce15133
--- /dev/null
+++ b/src/sections/dashboard/orders/orders-dnd-droppable.js
@@ -0,0 +1,80 @@
+import PropTypes from 'prop-types';
+import { Droppable } from 'react-beautiful-dnd';
+import { Box, Divider, Stack, Typography } from '@mui/material';
+import { OrdersDndDraggable } from './orders-dnd-draggable';
+
+export const OrdersDndDroppable = (props) => {
+ const { color, id, orders = [], title, ...other } = props;
+
+ return (
+ `1px solid ${theme.palette.divider}`
+ }
+ }}
+ {...other}>
+
+ {color && (
+
+ )}
+
+ {title}
+
+
+
+
+ {(provided) => (
+
+ {orders.map((order, index) => (
+
+ ))}
+ {provided.placeholder}
+
+ )}
+
+
+ );
+};
+
+OrdersDndDroppable.propTypes = {
+ color: PropTypes.string.isRequired,
+ id: PropTypes.string.isRequired,
+ orders: PropTypes.array.isRequired,
+ title: PropTypes.string.isRequired
+};
diff --git a/src/sections/dashboard/orders/orders-dnd.js b/src/sections/dashboard/orders/orders-dnd.js
new file mode 100644
index 000000000000..70702dd9ae6c
--- /dev/null
+++ b/src/sections/dashboard/orders/orders-dnd.js
@@ -0,0 +1,246 @@
+import { useCallback, useEffect, useState } from 'react';
+import PropTypes from 'prop-types';
+import { DragDropContext } from 'react-beautiful-dnd';
+import { Box } from '@mui/material';
+import { ResourceError } from '../../../components/resource-error';
+import { ResourceLoading } from '../../../components/resource-loading';
+import { ResourceUnavailable } from '../../../components/resource-unavailable';
+import { OrdersDndDroppable } from './orders-dnd-droppable';
+
+const statusMap = {
+ complete: {
+ color: 'success.main',
+ label: 'Complete'
+ },
+ created: {
+ color: 'neutral.500',
+ label: 'Created'
+ },
+ delivered: {
+ color: 'warning.main',
+ label: 'Delivered'
+ },
+ placed: {
+ color: 'info.main',
+ label: 'Placed'
+ },
+ processed: {
+ color: 'error.main',
+ label: 'Processed'
+ }
+};
+
+const createColumns = (orders) => {
+ const columns = [];
+
+ // Here we order and limit the columns to a specific list.
+ // You can add/remove to match your any available status.
+
+ const statuses = ['placed', 'processed', 'delivered', 'complete'];
+
+ statuses.forEach((status) => {
+ columns.push({
+ id: status,
+ color: statusMap[status].color,
+ items: orders.filter((order) => order.status === status),
+ label: statusMap[status].label
+ });
+ });
+
+ return columns;
+};
+
+const reorder = (columns, srcLocation, destLocation, draggableId) => {
+ return columns.map((column) => {
+ if (column.id === srcLocation.droppableId) {
+ // The draggable ID does not correspond
+ if (column.items[srcLocation.index]?.id !== draggableId) {
+ return column;
+ }
+
+ // Clone the items
+ const updatedItems = [...column.items];
+
+ // Remove the item
+ const [removedItem] = updatedItems.splice(srcLocation.index, 1);
+
+ // Add the item to the new position
+ updatedItems.splice(destLocation.index, 0, removedItem);
+
+ return {
+ ...column,
+ items: updatedItems
+ };
+ }
+
+ return column;
+ });
+};
+
+const move = (columns, srcLocation, destLocation, draggableId) => {
+ const srcColumnIdx = columns.findIndex((column) => column.id === srcLocation.droppableId);
+ const destColumnIdx = columns.findIndex((column) => column.id === destLocation.droppableId);
+
+ // Unable to find the source or destination columns
+ if (srcColumnIdx < 0 || destColumnIdx < 0) {
+ return columns;
+ }
+
+ const srcColumn = columns[srcColumnIdx];
+ const destColumn = columns[destColumnIdx];
+
+ // The draggable ID does not correspond
+ if (srcColumn.items[srcLocation.index]?.id !== draggableId) {
+ return columns;
+ }
+
+ // Clone the items of source and destination columns
+
+ const updatedSrcItems = [...srcColumn.items];
+ const updatedDestItems = [...destColumn.items];
+
+ // Remove the item
+ const [removedItem] = updatedSrcItems.splice(srcLocation.index, 1);
+
+ // Add the item to the new position
+ updatedDestItems.splice(destLocation.index, 0, removedItem);
+
+ // Clone the columns and update their items
+
+ const updatedColumns = [...columns];
+
+ updatedColumns[srcColumnIdx] = {
+ ...srcColumn,
+ items: updatedSrcItems
+ };
+
+ updatedColumns[destColumnIdx] = {
+ ...destColumn,
+ items: updatedDestItems
+ };
+
+ return updatedColumns;
+};
+
+const getResourcesState = (params) => {
+ if (params.isLoading) {
+ return 'loading';
+ }
+
+ if (params.error) {
+ return 'error';
+ }
+
+ return params.items.length > 0 ? 'available' : 'unavailable';
+};
+
+export const OrdersDnd = (props) => {
+ const { error, isLoading = false, items = [] } = props;
+ const [columns, setColumns] = useState([]);
+
+ const handleDragEnd = useCallback(async ({ source, destination, draggableId }) => {
+
+ // Dropped outside the column
+ if (!destination) {
+ return;
+ }
+
+ // Nothing has not been moved
+ if (source.droppableId === destination.droppableId && source.index === destination.index) {
+ return;
+ }
+
+ if (source.droppableId === destination.droppableId) {
+ // Moved to the same column on different position
+ setColumns((prevState) => {
+ return reorder(prevState, source, destination, draggableId);
+ });
+ } else {
+ setColumns((prevState) => {
+ return move(prevState, source, destination, draggableId);
+ });
+ }
+ }, []);
+
+ useEffect(() => {
+ setColumns(createColumns(items));
+ }, [items]);
+
+ const resourcesState = getResourcesState({
+ isLoading,
+ error,
+ items
+ });
+
+ switch (resourcesState) {
+ case 'loading':
+ return (
+
+ );
+
+ case 'error':
+ return (
+
+ );
+
+ case 'unavailable':
+ return (
+
+ );
+
+ case 'available':
+ return (
+ theme.palette.mode === 'dark'
+ ? 'neutral.900'
+ : 'neutral.50',
+ display: 'flex',
+ flexGrow: 1,
+ mb: 2,
+ mx: 2,
+ overflow: 'auto'
+ }}
+ >
+
+ {columns.map((column) => (
+
+ ))}
+
+
+ );
+
+ default:
+ return null;
+ }
+};
+
+OrdersDnd.propTypes = {
+ error: PropTypes.string,
+ isLoading: PropTypes.bool,
+ items: PropTypes.array
+};
diff --git a/src/sections/dashboard/orders/orders-search.js b/src/sections/dashboard/orders/orders-search.js
new file mode 100644
index 000000000000..48069eaa6d8d
--- /dev/null
+++ b/src/sections/dashboard/orders/orders-search.js
@@ -0,0 +1,305 @@
+import { useCallback } from 'react';
+import PropTypes from 'prop-types';
+import AdjustmentsHorizontalIcon from '@heroicons/react/24/outline/AdjustmentsHorizontalIcon';
+import ListBulletIcon from '@heroicons/react/24/outline/ListBulletIcon';
+import Squares2X2Icon from '@heroicons/react/24/outline/Squares2X2Icon';
+import {
+ Box,
+ Button,
+ Divider,
+ Stack,
+ SvgIcon,
+ Tab,
+ Tabs,
+ ToggleButton,
+ toggleButtonClasses,
+ ToggleButtonGroup
+} from '@mui/material';
+import { BulkActionsMenu } from '../../../components/bulk-actions-menu';
+import { FilterDialog } from '../../../components/filter-dialog';
+import { QueryField } from '../../../components/query-field';
+import { useDialog } from '../../../hooks/use-dialog';
+import {
+ containsOperator,
+ endsWithOperator,
+ equalsOperator,
+ greaterThanOperator,
+ isAfterOperator,
+ isBeforeOperator,
+ isBlankOperator,
+ isPresentOperator,
+ lessThanOperator,
+ notContainsOperator,
+ notEqualOperator,
+ startsWithOperator
+} from '../../../utils/filter-operators';
+
+const viewOptions = [
+ {
+ label: 'All',
+ value: 'all'
+ },
+ {
+ label: 'Processed',
+ value: 'processed'
+ },
+ {
+ label: 'Delivered',
+ value: 'delivered'
+ },
+ {
+ label: 'Complete',
+ value: 'complete'
+ }
+];
+
+const filterProperties = [
+ {
+ label: 'ID',
+ name: 'id',
+ operators: [
+ 'contains',
+ 'endsWith',
+ 'equals',
+ 'notContains',
+ 'startsWith',
+ 'isBlank',
+ 'isPresent'
+ ]
+ },
+ {
+ label: 'Status',
+ name: 'status',
+ operators: [
+ 'contains',
+ 'endsWith',
+ 'equals',
+ 'notContains',
+ 'startsWith',
+ 'isBlank',
+ 'isPresent'
+ ]
+ },
+ {
+ label: 'Created',
+ name: 'createdAt',
+ operators: ['isAfter', 'isBefore', 'isBlank', 'isPresent']
+ },
+ {
+ label: 'Updated',
+ name: 'updatedAt',
+ operators: ['isAfter', 'isBefore', 'isBlank', 'isPresent']
+ },
+ {
+ label: 'Courier',
+ name: 'courier',
+ operators: [
+ 'contains',
+ 'endsWith',
+ 'equals',
+ 'notContains',
+ 'startsWith',
+ 'isBlank',
+ 'isPresent'
+ ]
+ },
+ {
+ label: 'Payment Method',
+ name: 'paymentMethod',
+ operators: [
+ 'contains',
+ 'endsWith',
+ 'equals',
+ 'notContains',
+ 'startsWith',
+ 'isBlank',
+ 'isPresent'
+ ]
+ },
+ {
+ label: 'Total',
+ name: 'totalAmount',
+ operators: ['equals', 'greaterThan', 'lessThan', 'notEqual', 'isBlank', 'isPresent']
+ }
+];
+
+const filterOperators = [
+ containsOperator,
+ endsWithOperator,
+ equalsOperator,
+ greaterThanOperator,
+ isAfterOperator,
+ isBeforeOperator,
+ isBlankOperator,
+ isPresentOperator,
+ lessThanOperator,
+ notContainsOperator,
+ notEqualOperator,
+ startsWithOperator
+];
+
+export const OrdersSearch = (props) => {
+ const {
+ disabled = false,
+ filters = [],
+ mode = 'table',
+ onFiltersApply,
+ onFiltersClear,
+ onModeChange,
+ onQueryChange,
+ onViewChange,
+ query = '',
+ selected = [],
+ view = 'all'
+ } = props;
+ const filterDialog = useDialog();
+
+ const handleFiltersApply = useCallback((filters) => {
+ filterDialog.handleClose();
+ onFiltersApply?.(filters);
+ }, [filterDialog, onFiltersApply]);
+
+ const handleFiltersClear = useCallback(() => {
+ filterDialog.handleClose();
+ onFiltersClear?.();
+ }, [filterDialog, onFiltersClear]);
+
+ const hasSelection = mode === 'table' && selected.length > 0;
+ const hasFilters = filters.length > 0;
+
+ return (
+ <>
+
+
+ onViewChange?.(value)}
+ value={view}
+ variant="scrollable"
+ >
+ {viewOptions.map((option) => (
+
+ ))}
+
+
+
+
+ {hasSelection && (
+
+ )}
+
+ {
+ if (value) {
+ onModeChange?.(value);
+ }
+ }}
+ size="small"
+ sx={{
+ border: (theme) => `1px solid ${theme.palette.divider}`,
+ p: 0.5,
+ order: 2,
+ [`& .${toggleButtonClasses.root}`]: {
+ border: 0,
+ '&:not(:first-of-type)': {
+ borderRadius: 1
+ },
+ '&:first-of-type': {
+ borderRadius: 1,
+ mr: 0.5
+ }
+ }
+ }}
+ value={mode}
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )}
+ sx={{ order: 3 }}
+ variant={hasFilters ? 'contained' : 'text'}
+ >
+ Filter
+
+
+
+
+ >
+ );
+};
+
+OrdersSearch.propTypes = {
+ disabled: PropTypes.bool,
+ filters: PropTypes.array,
+ mode: PropTypes.oneOf(['dnd', 'table']),
+ onFiltersApply: PropTypes.func,
+ onFiltersClear: PropTypes.func,
+ onModeChange: PropTypes.func,
+ onQueryChange: PropTypes.func,
+ onViewChange: PropTypes.func,
+ query: PropTypes.string,
+ selected: PropTypes.array,
+ view: PropTypes.oneOf(['all', 'complete', 'delivered', 'processed'])
+};
diff --git a/src/sections/dashboard/orders/orders-table-menu.js b/src/sections/dashboard/orders/orders-table-menu.js
new file mode 100644
index 000000000000..327b9bccdad4
--- /dev/null
+++ b/src/sections/dashboard/orders/orders-table-menu.js
@@ -0,0 +1,64 @@
+import { useCallback } from 'react';
+import { useRouter } from 'next/navigation';
+import toast from 'react-hot-toast';
+import EllipsisVerticalIcon from '@heroicons/react/24/outline/EllipsisVerticalIcon';
+import { IconButton, Menu, MenuItem, SvgIcon } from '@mui/material';
+import { usePopover } from '../../../hooks/use-popover';
+import { paths } from '../../../paths';
+
+export const OrdersTableMenu = () => {
+ const router = useRouter();
+ const popover = usePopover();
+
+ const handleEdit = useCallback(() => {
+ popover.handleClose();
+ router.push(paths.dashboard.orders.details);
+ }, [popover, router]);
+
+ const handleRefund = useCallback(() => {
+ popover.handleClose();
+ toast.error('This action is not available on demo');
+ }, [popover]);
+
+ const handleDelete = useCallback(() => {
+ popover.handleClose();
+ toast.error('This action is not available on demo');
+ }, [popover]);
+
+ return (
+ <>
+
+
+
+
+
+
+
+ Edit
+
+
+ Refund
+
+
+ Delete
+
+
+ >
+ );
+};
diff --git a/src/sections/dashboard/orders/orders-table.js b/src/sections/dashboard/orders/orders-table.js
new file mode 100644
index 000000000000..cdea49a15ed4
--- /dev/null
+++ b/src/sections/dashboard/orders/orders-table.js
@@ -0,0 +1,335 @@
+import NextLink from 'next/link';
+import PropTypes from 'prop-types';
+import { format } from 'date-fns';
+import numeral from 'numeral';
+import {
+ Box,
+ Checkbox,
+ Divider,
+ Link,
+ Skeleton,
+ Stack,
+ Table,
+ TableBody,
+ TableCell,
+ TableHead,
+ TableRow,
+ TableSortLabel,
+ Typography
+} from '@mui/material';
+import { Pagination } from '../../../components/pagination';
+import { ResourceError } from '../../../components/resource-error';
+import { ResourceUnavailable } from '../../../components/resource-unavailable';
+import { Scrollbar } from '../../../components/scrollbar';
+import { paths } from '../../../paths';
+import { OrdersTableMenu } from './orders-table-menu';
+
+const statusMap = {
+ complete: {
+ color: 'success.main',
+ label: 'Complete'
+ },
+ created: {
+ color: 'neutral.500',
+ label: 'Created'
+ },
+ delivered: {
+ color: 'warning.main',
+ label: 'Delivered'
+ },
+ placed: {
+ color: 'info.main',
+ label: 'Placed'
+ },
+ processed: {
+ color: 'error.main',
+ label: 'Processed'
+ }
+};
+
+const columns = [
+ {
+ id: 'id',
+ label: 'Order ID',
+ sortable: true
+ },
+ {
+ id: 'createdAt',
+ label: 'Created',
+ sortable: true
+ },
+ {
+ id: 'customer',
+ label: 'Customer',
+ sortable: true
+ },
+ {
+ id: 'distribution',
+ label: 'Distribution',
+ sortable: true
+ },
+ {
+ id: 'status',
+ label: 'Status',
+ sortable: true
+ },
+ {
+ id: 'totalAmount',
+ label: 'Total',
+ sortable: true
+ }
+];
+
+const getResourcesState = (params) => {
+ if (params.isLoading) {
+ return 'loading';
+ }
+
+ if (params.error) {
+ return 'error';
+ }
+
+ return params.items.length > 0 ? 'available' : 'unavailable';
+};
+
+export const OrdersTable = (props) => {
+ const {
+ count = 0,
+ error,
+ isLoading = false,
+ items = [],
+ onDeselectAll,
+ onDeselectOne,
+ onPageChange,
+ onSelectAll,
+ onSelectOne,
+ onSortChange,
+ page = 0,
+ rowsPerPage = 0,
+ selected = [],
+ sortBy = 'createdAt',
+ sortDir = 'desc'
+ } = props;
+
+ const resourcesState = getResourcesState({
+ isLoading,
+ error,
+ items
+ });
+
+ const selectedSome = (selected.length > 0) && (selected.length < items.length);
+ const selectedAll = (items.length > 0) && (selected.length === items.length);
+
+ return (
+
+
+
+
+
+
+
+ {
+ if (event.target.checked) {
+ onSelectAll?.();
+ } else {
+ onDeselectAll?.();
+ }
+ }}
+ />
+
+ {columns.map((column) => (
+
+ {column.sortable
+ ? (
+ onSortChange?.(column.id)}
+ >
+ {column.label}
+
+ )
+ : column.label}
+
+ ))}
+
+
+
+
+ {items.map((order) => {
+ const isSelected = !!selected.find((orderId) => orderId === order.id);
+ const status = statusMap[order.status];
+ const address = [order.address?.city, order.address?.country].join((', '));
+ const createdDate = format(order.createdAt, 'dd MMM yyyy');
+ const createdTime = format(order.createdAt, 'HH:mm');
+ const totalAmount = numeral(order.totalAmount).format(`${order.currency}0,0.00`);
+
+ return (
+
+
+ {
+ if (event.target.checked) {
+ onSelectOne?.(order.id);
+ } else {
+ onDeselectOne?.(order.id);
+ }
+ }}
+ />
+
+
+
+ #{order.id}
+
+
+
+
+ {createdDate}
+
+
+ {createdTime}
+
+
+
+ {order.customer && (
+
+ {order.customer.name}
+
+ )}
+
+
+
+ {address}
+
+
+ {order.courier}
+
+
+
+
+
+
+ {status.label}
+
+
+
+
+ {totalAmount}
+
+
+
+
+
+ );
+ })}
+
+
+
+ {resourcesState === 'available' && (
+ <>
+
+
+ >
+ )}
+ {resourcesState === 'loading' && (
+
+
+
+
+
+ )}
+ {resourcesState === 'error' && (
+
+ )}
+ {resourcesState === 'unavailable' && (
+
+ )}
+
+ );
+};
+
+OrdersTable.propTypes = {
+ count: PropTypes.number,
+ error: PropTypes.string,
+ isLoading: PropTypes.bool,
+ items: PropTypes.array,
+ onDeselectAll: PropTypes.func,
+ onDeselectOne: PropTypes.func,
+ onPageChange: PropTypes.func,
+ onSelectAll: PropTypes.func,
+ onSelectOne: PropTypes.func,
+ onSortChange: PropTypes.func,
+ page: PropTypes.number,
+ rowsPerPage: PropTypes.number,
+ selected: PropTypes.array,
+ sortBy: PropTypes.string,
+ sortDir: PropTypes.oneOf(['asc', 'desc'])
+};
diff --git a/src/sections/dashboard/organization/organization-billing-details.js b/src/sections/dashboard/organization/organization-billing-details.js
new file mode 100644
index 000000000000..a5e69225296b
--- /dev/null
+++ b/src/sections/dashboard/organization/organization-billing-details.js
@@ -0,0 +1,51 @@
+import { Button, Card, CardHeader, Divider, useMediaQuery } from '@mui/material';
+import { PropertyList } from '../../../components/property-list';
+import { PropertyListItem } from '../../../components/property-list-item';
+
+export const OrganizationBillingDetails = () => {
+ const mdDown = useMediaQuery((theme) => theme.breakpoints.down('md'));
+
+ const align = mdDown ? 'vertical' : 'horizontal';
+
+ return (
+
+
+ Edit
+
+ )}
+ title="Billing Details"
+ />
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/src/sections/dashboard/organization/organization-billing-plan.js b/src/sections/dashboard/organization/organization-billing-plan.js
new file mode 100644
index 000000000000..68275af7d1f4
--- /dev/null
+++ b/src/sections/dashboard/organization/organization-billing-plan.js
@@ -0,0 +1,148 @@
+import { Fragment, useCallback, useState } from 'react';
+import numeral from 'numeral';
+import {
+ Button,
+ Card,
+ CardActions,
+ CardHeader,
+ Divider,
+ FormControlLabel,
+ Radio,
+ RadioGroup,
+ Stack,
+ ToggleButton,
+ ToggleButtonGroup,
+ Typography
+} from '@mui/material';
+
+const planOptions = [
+ {
+ id: 'free',
+ description: 'Up to 2 team members',
+ label: 'Free',
+ price: {
+ monthly: 0,
+ yearly: 0
+ }
+ },
+ {
+ id: 'essential',
+ description: 'Best for simple projects or applications.',
+ label: 'Essential',
+ price: {
+ monthly: 120,
+ yearly: 1320
+ }
+ },
+ {
+ id: 'professional',
+ description: 'Best for teams and multiple projects that need added security.',
+ label: 'Professional',
+ price: {
+ monthly: 480,
+ yearly: 5280
+ }
+ }
+];
+
+export const OrganizationBillingPlan = () => {
+ const [plan, setPlan] = useState('essential');
+ const [period, setPeriod] = useState('monthly');
+
+ const handlePlanChange = useCallback((event, value) => {
+ setPlan(value);
+ }, []);
+
+ const handlePeriodChange = useCallback((event, period) => {
+ if (period) {
+ setPeriod(period);
+ }
+ }, []);
+
+ return (
+
+
+
+
+
+ Billing
+
+
+
+ Monthly
+
+
+ Yearly
+
+
+
+
+
+ {planOptions.map((option) => {
+ const amount = numeral(option.price[period]).format('$0,0');
+
+ return (
+
+ }
+ label={(
+
+
+
+ {option.label}
+
+
+ {option.description}
+
+
+
+ {amount}
+
+
+ )}
+ sx={{
+ m: 0,
+ px: 3,
+ py: 1.5
+ }}
+ value={option.id}
+ />
+
+
+ );
+ })}
+
+
+
+ Upgrade Plan
+
+
+
+ );
+};
diff --git a/src/sections/dashboard/organization/organization-invite-dialog.js b/src/sections/dashboard/organization/organization-invite-dialog.js
new file mode 100644
index 000000000000..10bf5109644b
--- /dev/null
+++ b/src/sections/dashboard/organization/organization-invite-dialog.js
@@ -0,0 +1,196 @@
+import { Fragment } from 'react';
+import PropTypes from 'prop-types';
+import { useFormik } from 'formik';
+import * as Yup from 'yup';
+import {
+ Button,
+ Card,
+ Dialog,
+ DialogActions,
+ DialogContent,
+ DialogTitle,
+ Divider,
+ FormControlLabel,
+ FormHelperText,
+ Radio,
+ RadioGroup,
+ Stack,
+ TextField,
+ Typography
+} from '@mui/material';
+import { wait } from '../../../utils/wait';
+
+const roleOptions = [
+ {
+ description: 'Edit access',
+ label: 'Editor',
+ value: 'editor'
+ },
+ {
+ description: 'Full access & billing',
+ label: 'Administrator',
+ value: 'administrator'
+ }
+];
+
+const initialValues = {
+ email: '',
+ name: '',
+ role: 'editor',
+ submit: null
+};
+
+const validationSchema = Yup.object({
+ email: Yup
+ .string()
+ .max(255)
+ .email('Must be a valid email')
+ .required('Email is required'),
+ name: Yup
+ .string()
+ .max(255)
+ .required('Name is required'),
+ role: Yup
+ .mixed()
+ .oneOf(roleOptions.map((option) => option.value))
+});
+
+export const OrganizationInviteDialog = (props) => {
+ const { open = false, onClose, ...other } = props;
+ const formik = useFormik({
+ initialValues,
+ validationSchema,
+ onSubmit: async (values, helpers) => {
+ try {
+ await wait(250);
+ helpers.setStatus({ success: true });
+ helpers.setSubmitting(false);
+ onClose?.();
+ } catch (err) {
+ console.error(err);
+ helpers.setStatus({ success: false });
+ helpers.setErrors({ submit: err.message });
+ helpers.setSubmitting(false);
+ }
+ }
+ });
+
+ return (
+ formik.resetForm()
+ }}
+ {...other}>
+
+
+ );
+};
+
+OrganizationInviteDialog.propTypes = {
+ onClose: PropTypes.func,
+ open: PropTypes.bool
+};
diff --git a/src/sections/dashboard/overview/overview-account-setup.js b/src/sections/dashboard/overview/overview-account-setup.js
new file mode 100644
index 000000000000..3ba3746c8d32
--- /dev/null
+++ b/src/sections/dashboard/overview/overview-account-setup.js
@@ -0,0 +1,65 @@
+import NextLink from "next/link";
+import ArrowRightIcon from "@heroicons/react/24/outline/ArrowRightIcon";
+import { Box, Button, LinearProgress, Stack, SvgIcon, Typography } from "@mui/material";
+import { paths } from "../../../paths";
+
+export const OverviewAccountSetup = () => (
+
+
+
+ Welcome!
+
+
+ Lets setup your RMM or something something something?
+
+
+
+ 2/5
+
+
+
+
+
+
+ }
+ href={paths.onboarding}
+ variant="contained"
+ >
+ Go to account
+
+
+
+
+
+
+);
diff --git a/src/sections/dashboard/overview/overview-bills.js b/src/sections/dashboard/overview/overview-bills.js
new file mode 100644
index 000000000000..55057b0afc3d
--- /dev/null
+++ b/src/sections/dashboard/overview/overview-bills.js
@@ -0,0 +1,167 @@
+import { useState } from 'react';
+import PropTypes from 'prop-types';
+import { Box, Card, CardContent, CardHeader, Divider, Typography } from '@mui/material';
+import { useTheme } from '@mui/material/styles';
+import { ActionsMenu } from '../../../components/actions-menu';
+import { Chart } from '../../../components/chart';
+
+const useChartOptions = () => {
+ const theme = useTheme();
+
+ return {
+ chart: {
+ background: 'transparent',
+ toolbar: {
+ show: false
+ }
+ },
+ colors: [theme.palette.primary.main, theme.palette.primary.dark],
+ dataLabels: {
+ enabled: false
+ },
+ grid: {
+ borderColor: theme.palette.divider,
+ strokeDashArray: 2,
+ yaxis: {
+ lines: {
+ show: true
+ }
+ }
+ },
+ plotOptions: {
+ bar: {
+ columnWidth: '40px'
+ }
+ },
+ states: {
+ active: {
+ filter: {
+ type: 'none'
+ }
+ },
+ hover: {
+ filter: {
+ type: 'none'
+ }
+ }
+ },
+ theme: {
+ mode: theme.palette.mode
+ },
+ xaxis: {
+ axisBorder: {
+ show: false
+ },
+ axisTicks: {
+ show: false
+ },
+ categories: [
+ 'Capital One',
+ 'Ally Bank',
+ 'ING',
+ 'Ridgewood',
+ 'BT Transilvania',
+ 'CEC',
+ 'CBC'
+ ],
+ labels: {
+ style: {
+ colors: theme.palette.text.secondary
+ }
+ }
+ },
+ yaxis: {
+ labels: {
+ offsetX: -12,
+ style: {
+ colors: theme.palette.text.secondary
+ }
+ }
+ }
+ };
+};
+
+export const OverviewBills = (props) => {
+ const { chartSeries = [], stats = [] } = props;
+ const [range, setRange] = useState('Last 7 days');
+ const chartOptions = useChartOptions();
+
+ return (
+
+ { setRange('Last 7 days'); }
+ },
+ {
+ label: 'Last Month',
+ handler: () => { setRange('Last Month'); }
+ },
+ {
+ label: 'Last Year',
+ handler: () => { setRange('Last Year'); }
+ }
+ ]}
+ label={range}
+ size="small"
+ variant="text"
+ />
+ )}
+ title="Bills and Orders"
+ />
+
+
+
+ {stats.map((item) => (
+ theme.palette.mode === 'dark'
+ ? 'neutral.900'
+ : 'neutral.50',
+ borderRadius: 1,
+ p: 2
+ }}
+ >
+
+ {item.label}
+
+
+ {item.value}
+
+
+ ))}
+
+
+
+
+ );
+};
+
+OverviewBills.propTypes = {
+ chartSeries: PropTypes.array,
+ stats: PropTypes.array
+};
diff --git a/src/sections/dashboard/overview/overview-latest-customers.js b/src/sections/dashboard/overview/overview-latest-customers.js
new file mode 100644
index 000000000000..0d6adb8568f1
--- /dev/null
+++ b/src/sections/dashboard/overview/overview-latest-customers.js
@@ -0,0 +1,83 @@
+import NextLink from "next/link";
+import PropTypes from "prop-types";
+import { format } from "date-fns";
+import {
+ Button,
+ Card,
+ CardHeader,
+ Chip,
+ Divider,
+ Stack,
+ Table,
+ TableBody,
+ TableCell,
+ TableRow,
+ Typography,
+} from "@mui/material";
+import { paths } from "../../../paths";
+import numeral from "numeral";
+import { Scrollbar } from "../../../components/scrollbar";
+
+export const OverviewLatestCustomers = (props) => {
+ const { customers = [] } = props;
+
+ return (
+
+
+ View All
+
+ }
+ title="Top Customers"
+ />
+
+
+
+
+ {customers.map((customer) => {
+ const createdDate = format(customer.createdAt, "dd MMM");
+ const amountSpent = numeral(customer.amountSpent).format("$0,0.00");
+
+ return (
+
+
+
+ {createdDate}
+
+
+
+
+ {customer.name}
+
+
+
+
+
+ {customer.orders}
+ {" "}
+ Devices Active{" "}
+
+
+
+ {amountSpent}
+ {" "}
+ Opportunity Value
+
+
+
+ {customer.isOnboarded && }
+
+
+ );
+ })}
+
+
+
+
+ );
+};
+
+OverviewLatestCustomers.propTypes = {
+ customers: PropTypes.array,
+};
diff --git a/src/sections/dashboard/overview/overview-notifications.js b/src/sections/dashboard/overview/overview-notifications.js
new file mode 100644
index 000000000000..50be5c81945a
--- /dev/null
+++ b/src/sections/dashboard/overview/overview-notifications.js
@@ -0,0 +1,159 @@
+import PropTypes from "prop-types";
+import ArrowRightIcon from "@heroicons/react/24/outline/ArrowRightIcon";
+import CubeIcon from "@heroicons/react/24/outline/CubeIcon";
+import UsersIcon from "@heroicons/react/24/outline/UsersIcon";
+import CurrencyDollarIcon from "@heroicons/react/24/outline/CurrencyDollarIcon";
+import {
+ Box,
+ Button,
+ Card,
+ CardHeader,
+ Divider,
+ IconButton,
+ List,
+ ListItem,
+ ListItemIcon,
+ ListItemSecondaryAction,
+ ListItemText,
+ SvgIcon,
+ Typography,
+} from "@mui/material";
+
+const getContent = (notification) => {
+ switch (notification.type) {
+ case "pendingOrders":
+ return (
+ <>
+
+
+
+
+
+
+
+ {notification.orders} pending orders
+ {" "}
+ needs your attention.
+
+ }
+ />
+
+
+
+
+
+
+
+ >
+ );
+
+ case "pendingTransactions":
+ return (
+ <>
+
+
+
+
+
+
+
+ {notification.transactions} pending transactions
+ {" "}
+ needs your attention.
+
+ }
+ />
+
+
+
+
+
+
+
+ >
+ );
+
+ case "teamNotes":
+ return (
+ <>
+
+
+
+
+
+
+
+ {notification.notes} team notes
+ {" "}
+ at the{" "}
+
+ {notification.subject}.
+
+
+ }
+ />
+
+
+
+
+
+
+
+ >
+ );
+
+ default:
+ return null;
+ }
+};
+
+export const OverviewNotifications = (props) => {
+ const { notifications = [] } = props;
+
+ return (
+
+
+
+
+ {notifications.map((notification, index) => {
+ const hasDivider = notifications.length > index + 1;
+
+
+ return (
+
+ {getContent(notification)}
+
+ );
+ })}
+
+
+
+
+
+
+ }
+ >
+ See all notifications
+
+
+
+ );
+};
+
+OverviewNotifications.propTypes = {
+ notifications: PropTypes.array,
+};
diff --git a/src/sections/dashboard/overview/overview-orders-summary.js b/src/sections/dashboard/overview/overview-orders-summary.js
new file mode 100644
index 000000000000..aebe33ad06ee
--- /dev/null
+++ b/src/sections/dashboard/overview/overview-orders-summary.js
@@ -0,0 +1,147 @@
+import { useState } from "react";
+import PropTypes from "prop-types";
+import { Box, Card, CardContent, CardHeader, Divider, Stack, Typography } from "@mui/material";
+import { useTheme } from "@mui/material/styles";
+import { ActionsMenu } from "../../../components/actions-menu";
+import { Chart } from "../../../components/chart";
+
+const useChartOptions = (labels) => {
+ const theme = useTheme();
+
+ return {
+ chart: {
+ background: "transparent",
+ },
+ colors: [
+ theme.palette.primary.main,
+ theme.palette.warning.main,
+ theme.palette.error.main,
+ theme.palette.neutral[200],
+ ],
+ dataLabels: {
+ enabled: false,
+ },
+ labels,
+ legend: {
+ show: false,
+ },
+ plotOptions: {
+ pie: {
+ expandOnClick: false,
+ },
+ },
+ states: {
+ active: {
+ filter: {
+ type: "none",
+ },
+ },
+ hover: {
+ filter: {
+ type: "none",
+ },
+ },
+ },
+ stroke: {
+ width: 0,
+ },
+ theme: {
+ mode: theme.palette.mode,
+ },
+ tooltip: {
+ fillSeriesColor: false,
+ },
+ };
+};
+
+export const OverviewOrdersSummary = (props) => {
+ const { chartSeries = [], labels = [] } = props;
+ const [range, setRange] = useState("Last 7 days");
+ const chartOptions = useChartOptions(labels);
+
+ const total = chartSeries.reduce((acc, value) => acc + value, 0);
+
+ return (
+
+ {
+ setRange("Last 7 days");
+ },
+ },
+ {
+ label: "Last Month",
+ handler: () => {
+ setRange("Last Month");
+ },
+ },
+ {
+ label: "Last Year",
+ handler: () => {
+ setRange("Last Year");
+ },
+ },
+ ]}
+ label={range}
+ size="small"
+ variant="text"
+ />
+ }
+ title="Warranty Information"
+ />
+
+
+
+
+ Total
+ {total}
+
+
+ {chartSeries.map((item, index) => (
+
+
+
+
+ {labels[index]}
+
+
+
+ {item}
+
+
+ ))}
+
+
+
+ );
+};
+
+OverviewOrdersSummary.propTypes = {
+ chartSeries: PropTypes.array,
+ labels: PropTypes.array,
+};
diff --git a/src/sections/dashboard/overview/overview-summary.js b/src/sections/dashboard/overview/overview-summary.js
new file mode 100644
index 000000000000..9c8566a6b3be
--- /dev/null
+++ b/src/sections/dashboard/overview/overview-summary.js
@@ -0,0 +1,53 @@
+import PropTypes from 'prop-types';
+import { Avatar, Card, CardActions, Divider, Stack, Typography } from '@mui/material';
+
+export const OverviewSummary = (props) => {
+ const { action, value, icon, label, ...other } = props;
+
+ return (
+
+
+
+ {icon}
+
+
+
+ {label}
+
+
+ {value}
+
+
+
+
+
+ {action}
+
+
+ );
+};
+
+OverviewSummary.propTypes = {
+ action: PropTypes.node,
+ icon: PropTypes.node,
+ label: PropTypes.string.isRequired,
+ value: PropTypes.number.isRequired
+};
diff --git a/src/sections/dashboard/products/product-Insights-reviews.js b/src/sections/dashboard/products/product-Insights-reviews.js
new file mode 100644
index 000000000000..f946cb0cec10
--- /dev/null
+++ b/src/sections/dashboard/products/product-Insights-reviews.js
@@ -0,0 +1,119 @@
+import StarIcon from '@heroicons/react/24/solid/StarIcon';
+import {
+ Card,
+ CardContent,
+ LinearProgress,
+ List,
+ ListItem,
+ Stack,
+ SvgIcon,
+ Typography
+} from '@mui/material';
+
+const reviews = [
+ {
+ totalReviews: 10,
+ score: 5
+ },
+ {
+ totalReviews: 14,
+ score: 4
+ },
+ {
+ totalReviews: 5,
+ score: 3
+ },
+ {
+ totalReviews: 2,
+ score: 2
+ },
+ {
+ totalReviews: 1,
+ score: 1
+ }
+];
+
+export const ProductInsightsReviews = () => {
+ const totalScore = reviews.reduce((acc, value) => acc + (value.score * value.totalReviews), 0);
+ const totalReviews = reviews.reduce((acc, value) => acc + value.totalReviews, 0);
+ const averageScore = (totalScore / totalReviews).toFixed(2);
+
+ return (
+
+
+
+
+
+
+
+ {averageScore}
+
+
+
+ 14 reviews in total based on 122 reviews
+
+
+
+ {reviews.map((review, index) => {
+ const hasDivider = reviews.length > index + 1;
+ const percentage = ((100 * review.totalReviews) / totalReviews).toFixed(2);
+
+ return (
+
+
+
+ x{review.score}
+
+
+
+ {percentage}%
+
+
+
+ );
+ })}
+
+
+
+
+ );
+};
diff --git a/src/sections/dashboard/products/product-Insights-sales.js b/src/sections/dashboard/products/product-Insights-sales.js
new file mode 100644
index 000000000000..7d390cecfc87
--- /dev/null
+++ b/src/sections/dashboard/products/product-Insights-sales.js
@@ -0,0 +1,106 @@
+import PropTypes from 'prop-types';
+import { Box, Card, CardHeader, Divider } from '@mui/material';
+import { useTheme } from '@mui/material/styles';
+import { Chart } from '../../../components/chart';
+
+const useChartOptions = () => {
+ const theme = useTheme();
+
+ return {
+ chart: {
+ background: 'transparent',
+ toolbar: {
+ show: false
+ },
+ zoom: {
+ enabled: false
+ }
+ },
+ colors: [theme.palette.primary.main],
+ dataLabels: {
+ enabled: false
+ },
+ fill: {
+ type: 'gradient'
+ },
+ grid: {
+ borderColor: theme.palette.divider,
+ xaxis: {
+ lines: {
+ show: true
+ }
+ },
+ yaxis: {
+ lines: {
+ show: true
+ }
+ }
+ },
+ states: {
+ active: {
+ filter: {
+ type: 'none'
+ }
+ },
+ hover: {
+ filter: {
+ type: 'none'
+ }
+ }
+ },
+ stroke: {
+ width: 3
+ },
+ theme: {
+ mode: theme.palette.mode
+ },
+ xaxis: {
+ axisBorder: {
+ color: theme.palette.divider,
+ show: true
+ },
+ axisTicks: {
+ color: theme.palette.divider,
+ show: true
+ },
+ categories: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
+ labels: {
+ style: {
+ colors: theme.palette.text.secondary
+ }
+ }
+ },
+ yaxis: {
+ labels: {
+ offsetX: -12,
+ style: {
+ colors: theme.palette.text.secondary
+ }
+ }
+ }
+ };
+};
+
+export const ProductInsightsSales = (props) => {
+ const { chartSeries = [] } = props;
+ const chartOptions = useChartOptions();
+
+ return (
+
+
+
+
+
+
+
+ );
+};
+
+ProductInsightsSales.propTypes = {
+ chartSeries: PropTypes.array
+};
diff --git a/src/sections/dashboard/products/product-create-dialog.js b/src/sections/dashboard/products/product-create-dialog.js
new file mode 100644
index 000000000000..12d4f2fc4a87
--- /dev/null
+++ b/src/sections/dashboard/products/product-create-dialog.js
@@ -0,0 +1,117 @@
+import PropTypes from 'prop-types';
+import { useFormik } from 'formik';
+import * as Yup from 'yup';
+import toast from 'react-hot-toast';
+import {
+ Button,
+ Dialog,
+ DialogActions,
+ DialogContent,
+ DialogTitle,
+ FormHelperText,
+ Stack,
+ TextField
+} from '@mui/material';
+
+const initialValues = {
+ description: '',
+ name: '',
+ submit: null
+};
+
+const validationSchema = Yup.object({
+ description: Yup.string().max(500).required('Description is required'),
+ name: Yup.string().max(255).required('Name is required')
+});
+
+export const ProductCreateDialog = (props) => {
+ const { open = false, onClose, ...other } = props;
+ const formik = useFormik({
+ initialValues,
+ validationSchema,
+ onSubmit: async (values, helpers) => {
+ try {
+ toast.success('Product created');
+ helpers.setStatus({ success: true });
+ helpers.setSubmitting(false);
+ helpers.resetForm();
+ onClose?.();
+ } catch (err) {
+ console.error(err);
+ helpers.setStatus({ success: false });
+ helpers.setErrors({ submit: err.message });
+ helpers.setSubmitting(false);
+ }
+ }
+ });
+
+ return (
+ formik.resetForm()
+ }}
+ {...other}>
+
+ Create Product
+
+
+
+
+
+
+ {formik.errors.submit && (
+
+ {formik.errors.submit}
+
+ )}
+
+
+
+ Cancel
+
+ { formik.handleSubmit(); }}
+ variant="contained"
+ >
+ Create Product
+
+
+
+ );
+};
+
+ProductCreateDialog.propTypes = {
+ onClose: PropTypes.func,
+ open: PropTypes.bool
+};
diff --git a/src/sections/dashboard/products/product-details-dialog.js b/src/sections/dashboard/products/product-details-dialog.js
new file mode 100644
index 000000000000..2092ba7b19f0
--- /dev/null
+++ b/src/sections/dashboard/products/product-details-dialog.js
@@ -0,0 +1,215 @@
+import PropTypes from 'prop-types';
+import { useFormik } from 'formik';
+import * as Yup from 'yup';
+import toast from 'react-hot-toast';
+import {
+ Autocomplete,
+ Button,
+ Checkbox,
+ Dialog,
+ DialogActions,
+ DialogContent,
+ DialogTitle,
+ FormHelperText,
+ Stack,
+ TextField,
+ Typography
+} from '@mui/material';
+
+const compositionOptions = ['Leather', 'Metal', 'Plastic', 'Organic'];
+
+const tagOptions = ['Watch', 'Style', 'New', 'Promo', 'Discount', 'Refurbished'];
+
+const getInitialValues = (product) => {
+ return {
+ brand: product?.brand || '',
+ chargeTax: product?.chargeTax || true,
+ description: product?.description || '',
+ displayName: product?.displayName || '',
+ composition: product?.composition || [],
+ sku: product?.sku || '',
+ submit: null,
+ tags: product?.tags || []
+ };
+};
+
+const validationSchema = Yup.object({
+ brand: Yup.string().max(255).required('Brand is required'),
+ chargeTax: Yup.boolean(),
+ description: Yup.string().max(500).required('Description is required'),
+ displayName: Yup.string().max(255).required('Display name is required'),
+ composition: Yup.array(),
+ sku: Yup.string().max(255).required('SKU is required'),
+ tags: Yup.array()
+});
+
+export const ProductDetailsDialog = (props) => {
+ const { open = false, onClose, product } = props;
+ const formik = useFormik({
+ enableReinitialize: true,
+ initialValues: getInitialValues(product),
+ validationSchema,
+ onSubmit: async (values, helpers) => {
+ try {
+ // Do API call
+ toast.success('Product updated');
+ helpers.setStatus({ success: true });
+ helpers.setSubmitting(false);
+ onClose?.();
+ } catch (err) {
+ console.error(err);
+ helpers.setStatus({ success: false });
+ helpers.setErrors({ submit: err.message });
+ helpers.setSubmitting(false);
+ }
+ }
+ });
+
+ if (!product) {
+ return null;
+ }
+
+ return (
+ formik.resetForm()
+ }}
+ >
+
+ Edit Product
+
+
+
+ *': {
+ width: '50%'
+ }
+ }}
+ >
+
+
+
+
+
+ { formik.setFieldValue('composition', value); }}
+ options={compositionOptions}
+ renderInput={(inputProps) => (
+
+ )}
+ value={formik.values.composition}
+ />
+ { formik.setFieldValue('tags', value); }}
+ options={tagOptions}
+ renderInput={(inputProps) => (
+
+ )}
+ value={formik.values.tags}
+ />
+
+ { formik.setFieldValue('chargeTax', event.target.checked); }}
+ />
+
+ Charge tax on this product
+
+
+
+ {formik.errors.submit && (
+
+ {formik.errors.submit}
+
+ )}
+
+
+
+ Cancel
+
+ { formik.handleSubmit(); }}
+ variant="contained"
+ >
+ Save Changes
+
+
+
+ );
+};
+
+ProductDetailsDialog.propTypes = {
+ onClose: PropTypes.func,
+ open: PropTypes.bool,
+ product: PropTypes.object
+};
diff --git a/src/sections/dashboard/products/product-details.js b/src/sections/dashboard/products/product-details.js
new file mode 100644
index 000000000000..aa7b496e96e8
--- /dev/null
+++ b/src/sections/dashboard/products/product-details.js
@@ -0,0 +1,81 @@
+import PropTypes from 'prop-types';
+import { format } from 'date-fns';
+import { Button, Card, CardHeader, Divider, useMediaQuery } from '@mui/material';
+import { PropertyList } from '../../../components/property-list';
+import { PropertyListItem } from '../../../components/property-list-item';
+
+export const ProductDetails = (props) => {
+ const { onEdit, product, ...other } = props;
+ const mdDown = useMediaQuery((theme) => theme.breakpoints.down('md'));
+
+ const align = mdDown ? 'vertical' : 'horizontal';
+
+ const createdAt = format(product.createdAt, 'MMM dd, yyyy');
+ const updatedAt = product.updatedAt ? format(product.updatedAt, 'MMM dd, yyyy') : '';
+ const composition = product.composition?.join(', ');
+ const tags = product.tags?.join(', ');
+
+ return (
+
+
+ Edit
+
+ )}
+ title="General Details"
+ />
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+ProductDetails.propTypes = {
+ onEdit: PropTypes.func,
+ product: PropTypes.object.isRequired
+};
diff --git a/src/sections/dashboard/products/product-insights-channel.js b/src/sections/dashboard/products/product-insights-channel.js
new file mode 100644
index 000000000000..e6621ae2d669
--- /dev/null
+++ b/src/sections/dashboard/products/product-insights-channel.js
@@ -0,0 +1,138 @@
+import PropTypes from 'prop-types';
+import { Box, Card, CardHeader, Divider, Stack, Typography } from '@mui/material';
+import { useTheme } from '@mui/material/styles';
+import { Chart } from '../../../components/chart';
+
+const useChartOptions = (labels) => {
+ const theme = useTheme();
+
+ return {
+ chart: {
+ background: 'transparent',
+ toolbar: {
+ show: false
+ }
+ },
+ colors: [
+ theme.palette.primary.main,
+ theme.palette.warning.main,
+ theme.palette.success.main
+ ],
+ dataLabels: {
+ enabled: false
+ },
+ grid: {
+ padding: {
+ left: 0,
+ right: 0
+ }
+ },
+ labels,
+ legend: {
+ show: false
+ },
+ plotOptions: {
+ pie: {
+ expandOnClick: false
+ }
+ },
+ states: {
+ active: {
+ filter: {
+ type: 'none'
+ }
+ },
+ hover: {
+ filter: {
+ type: 'none'
+ }
+ }
+ },
+ stroke: {
+ width: 0
+ },
+ theme: {
+ mode: theme.palette.mode
+ },
+ tooltip: {
+ fillSeriesColor: false,
+ y: {
+ formatter(value) {
+ return `${value}k`;
+ }
+ }
+ }
+ };
+};
+
+export const ProductInsightsChannel = (props) => {
+ const { chartSeries = [], labels = [] } = props;
+ const chartOptions = useChartOptions(labels);
+
+ return (
+
+
+
+
+
+
+
+
+
+ Total views
+
+
+ 27k
+
+
+ {chartSeries.map((item, index) => (
+
+
+
+ {labels[index]}
+
+
+ ))}
+
+
+
+
+ );
+};
+
+ProductInsightsChannel.propTypes = {
+ chartSeries: PropTypes.array,
+ labels: PropTypes.array
+};
diff --git a/src/sections/dashboard/products/product-insights-rate.js b/src/sections/dashboard/products/product-insights-rate.js
new file mode 100644
index 000000000000..8d368cdc0d3a
--- /dev/null
+++ b/src/sections/dashboard/products/product-insights-rate.js
@@ -0,0 +1,133 @@
+import PropTypes from 'prop-types';
+import { Box, Card, CardHeader, Divider, Stack, Typography } from '@mui/material';
+import { useTheme } from '@mui/material/styles';
+import { Chart } from '../../../components/chart';
+
+const useChartOptions = (labels) => {
+ const theme = useTheme();
+
+ return {
+ chart: {
+ background: 'transparent',
+ toolbar: {
+ show: false
+ }
+ },
+ colors: [
+ theme.palette.primary.main,
+ theme.palette.warning.main,
+ theme.palette.success.main
+ ],
+ dataLabels: {
+ enabled: false
+ },
+ grid: {
+ padding: {
+ left: 0,
+ right: 0
+ }
+ },
+ labels,
+ legend: {
+ show: false
+ },
+ plotOptions: {
+ pie: {
+ expandOnClick: false
+ }
+ },
+ states: {
+ active: {
+ filter: {
+ type: 'none'
+ }
+ },
+ hover: {
+ filter: {
+ type: 'none'
+ }
+ }
+ },
+ stroke: {
+ width: 0
+ },
+ theme: {
+ mode: theme.palette.mode
+ },
+ tooltip: {
+ fillSeriesColor: false
+ }
+ };
+};
+
+export const ProductInsightsRate = (props) => {
+ const { chartSeries = [], labels = [] } = props;
+ const chartOptions = useChartOptions(labels);
+
+ return (
+
+
+
+
+
+
+
+
+
+ Return rate
+
+
+ 1.5%
+
+
+ {chartSeries.map((item, index) => (
+
+
+
+ {labels[index]}
+
+
+ ))}
+
+
+
+
+ );
+};
+
+ProductInsightsRate.propTypes = {
+ chartSeries: PropTypes.array,
+ labels: PropTypes.array
+};
diff --git a/src/sections/dashboard/products/product-quick-actions.js b/src/sections/dashboard/products/product-quick-actions.js
new file mode 100644
index 000000000000..013ee7d3a4fd
--- /dev/null
+++ b/src/sections/dashboard/products/product-quick-actions.js
@@ -0,0 +1,144 @@
+import { useCallback, useState } from 'react';
+import toast from 'react-hot-toast';
+import PropTypes from 'prop-types';
+import DocumentDuplicateIcon from '@heroicons/react/24/outline/DocumentDuplicateIcon';
+import EyeIcon from '@heroicons/react/24/outline/EyeIcon';
+import {
+ Box,
+ Button,
+ Card,
+ CardContent,
+ CardHeader,
+ Divider,
+ MenuItem,
+ Select,
+ Stack,
+ SvgIcon
+} from '@mui/material';
+import { ActionList } from '../../../components/action-list';
+import { ActionListItem } from '../../../components/action-list-item';
+import { ConfirmationDialog } from '../../../components/confirmation-dialog';
+import { useDialog } from '../../../hooks/use-dialog';
+
+const statusOptions = [
+ {
+ color: 'info.main',
+ label: 'Draft',
+ value: 'draft'
+ },
+ {
+ color: 'success.main',
+ label: 'Published',
+ value: 'published'
+ }
+];
+
+export const ProductQuickActions = (props) => {
+ const { product, ...other } = props;
+ const duplicateDialog = useDialog();
+ const [status, setStatus] = useState(product.status);
+
+ const handleStatusChange = useCallback((event) => {
+ setStatus(event.target.value);
+ }, []);
+
+ const handleSave = useCallback(() => {
+ toast.success('Changes saved');
+ }, []);
+
+ const handlePreview = useCallback(() => {
+ toast.error('This action is not available on demo');
+ }, []);
+
+ const handleDuplicate = useCallback(() => {
+ duplicateDialog.handleClose();
+ toast.error('This action is not available on demo');
+ }, [duplicateDialog]);
+
+ return (
+ <>
+
+
+
+
+
+
+ {statusOptions.map((option) => (
+
+
+ {option.label}
+
+ ))}
+
+
+
+ Save Changes
+
+
+
+
+
+
+
+
+
+ )}
+ label="Preview"
+ onClick={handlePreview}
+ />
+
+
+
+ )}
+ label="Duplicate"
+ onClick={duplicateDialog.handleOpen}
+ />
+
+
+
+ >
+ );
+};
+
+ProductQuickActions.propTypes = {
+ product: PropTypes.object
+};
diff --git a/src/sections/dashboard/products/product-variant-dialog.js b/src/sections/dashboard/products/product-variant-dialog.js
new file mode 100644
index 000000000000..6015ee0d5d90
--- /dev/null
+++ b/src/sections/dashboard/products/product-variant-dialog.js
@@ -0,0 +1,322 @@
+import PropTypes from 'prop-types';
+import { useFormik } from 'formik';
+import * as Yup from 'yup';
+import toast from 'react-hot-toast';
+import TrashIcon from '@heroicons/react/24/outline/TrashIcon';
+import {
+ Box,
+ Button,
+ Dialog,
+ DialogActions,
+ DialogContent,
+ DialogTitle,
+ FormHelperText,
+ IconButton,
+ InputAdornment,
+ MenuItem,
+ Stack,
+ SvgIcon,
+ TextField,
+ Typography
+} from '@mui/material';
+import { FileDropzone } from '../../../components/file-dropzone';
+import { createResourceId } from '../../../utils/create-resource-id';
+import { alpha } from '@mui/material/styles';
+
+const currencyOptions = [
+ {
+ label: 'EUR',
+ value: '€'
+ },
+ {
+ label: 'USD',
+ value: '$'
+ }
+];
+
+const getInitialValues = (variant) => {
+ return {
+ currency: variant?.currency || '$',
+ description: variant?.description || '',
+ image: variant?.image || '',
+ name: variant?.name || '',
+ price: variant?.price || 0,
+ sku: variant?.sku || '',
+ submit: null
+ };
+};
+
+const validationSchema = Yup.object({
+ currency: Yup
+ .string()
+ .oneOf(currencyOptions.map((option) => option.value))
+ .required('Currency is required'),
+ description: Yup
+ .string()
+ .max(1024)
+ .required('Description name is required'),
+ image: Yup.string(),
+ name: Yup
+ .string()
+ .max(255)
+ .required('Variant name is required'),
+ price: Yup
+ .number()
+ .required('Price is required'),
+ sku: Yup
+ .string()
+ .max(255)
+ .required('Sku is required')
+});
+
+export const ProductVariantDialog = (props) => {
+ const {
+ action = 'create',
+ onClose,
+ onVariantCreated,
+ onVariantUpdated,
+ open = false,
+ variant,
+ ...other
+ } = props;
+ const formik = useFormik({
+ enableReinitialize: true,
+ initialValues: getInitialValues(variant),
+ validationSchema,
+ onSubmit: async (values, helpers) => {
+ try {
+ if (action === 'update') {
+ // Do API call
+ const updated = {
+ ...variant,
+ currency: values.currency,
+ description: values.description,
+ image: values.image,
+ name: values.name,
+ price: values.price,
+ sku: values.sku
+ };
+
+ toast.success('Variant updated');
+ onVariantUpdated?.(updated);
+ } else {
+ // Do API call
+ const created = {
+ id: createResourceId(),
+ createdAt: new Date().getTime(),
+ currency: values.currency,
+ description: values.description,
+ image: values.image,
+ name: values.name,
+ price: values.price,
+ quantity: 1,
+ sku: values.sku
+ };
+
+ toast.success('Variant created');
+ onVariantCreated?.(created);
+ }
+
+ helpers.setStatus({ success: true });
+ helpers.setSubmitting(false);
+ } catch (err) {
+ console.error(err);
+ helpers.setStatus({ success: false });
+ helpers.setErrors({ submit: err.message });
+ helpers.setSubmitting(false);
+ }
+ }
+ });
+
+ const currencyLabel = currencyOptions.find((option) => option.value
+ === formik.values.currency)?.label;
+
+ if (action === 'update' && !variant) {
+ return null;
+ }
+
+ return (
+ {
+ formik.resetForm();
+ }
+ }}
+ {...other}>
+
+ {action === 'update' ? 'Update Variant' : 'Add Variant'}
+
+
+
+
+
+
+
+ {currencyOptions.map((option) => (
+
+ {option.label}
+
+ ))}
+
+
+ {currencyLabel}
+
+ )
+ }}
+ />
+
+
+ Image
+
+ {formik.values.image
+ ? (
+ div': {
+ opacity: 1
+ }
+ }
+ }}
+ >
+ alpha(theme.palette.neutral[900], 0.8),
+ display: 'flex',
+ height: '100%',
+ justifyContent: 'center',
+ left: 0,
+ opacity: 0,
+ position: 'absolute',
+ top: 0,
+ width: '100%'
+ }}
+ >
+ formik.setFieldValue('image', '')}
+ >
+
+
+
+
+
+
+ )
+ : (
+ formik.setFieldValue('image', URL.createObjectURL(files[0]))}
+ sx={{
+ height: 126,
+ width: 126
+ }}
+ />
+ )}
+
+
+ {formik.errors.submit && (
+
+ {formik.errors.submit}
+
+ )}
+
+
+
+ Cancel
+
+ { formik.handleSubmit(); }}
+ variant="contained"
+ >
+ {action === 'update' ? 'Update' : 'Create'}
+
+
+
+ );
+};
+
+ProductVariantDialog.propTypes = {
+ action: PropTypes.oneOf(['create', 'update']),
+ onClose: PropTypes.func,
+ onVariantCreated: PropTypes.func,
+ onVariantUpdated: PropTypes.func,
+ open: PropTypes.bool,
+ variant: PropTypes.object
+};
diff --git a/src/sections/dashboard/products/product-variants-table.js b/src/sections/dashboard/products/product-variants-table.js
new file mode 100644
index 000000000000..97647a3bec9a
--- /dev/null
+++ b/src/sections/dashboard/products/product-variants-table.js
@@ -0,0 +1,179 @@
+import { useCallback, useState } from 'react';
+import PropTypes from 'prop-types';
+import numeral from 'numeral';
+import CubeIcon from '@heroicons/react/24/outline/CubeIcon';
+import {
+ Avatar,
+ Button,
+ InputBase,
+ Stack,
+ SvgIcon,
+ Table,
+ TableBody,
+ TableCell,
+ TableHead,
+ TableRow,
+ ToggleButton,
+ ToggleButtonGroup,
+ Typography
+} from '@mui/material';
+import { Scrollbar } from '../../../components/scrollbar';
+
+const ProductVariantRow = (props) => {
+ const { onQuantityChange, variant, ...other } = props;
+ const [mode, setMode] = useState('add');
+ const [quantity, setQuantity] = useState(0);
+
+ const handleModeChange = useCallback((event, mode) => {
+ if (mode) {
+ setMode(mode);
+ }
+ }, []);
+
+ const handleQuantityChange = useCallback((event) => {
+ const value = +event.target.value;
+
+ if (isNaN(value)) {
+ return;
+ }
+
+ setQuantity(value);
+ }, []);
+
+ const handleQuantitySave = useCallback(() => {
+ const newQuantity = mode === 'add'
+ ? variant.quantity + quantity
+ : variant.quantity - quantity;
+
+ onQuantityChange?.(variant.id, newQuantity);
+ setQuantity(0);
+ }, [mode, variant, quantity, onQuantityChange]);
+
+ const price = numeral(variant.price).format(`${variant.currency}0,0.00`);
+
+ return (
+
+
+
+
+
+
+
+
+
+ {variant.name}
+
+
+
+
+ {variant.quantity}
+
+
+ {price}
+
+
+ {variant.sku}
+
+
+
+
+
+ Add
+
+
+ Set
+
+
+ theme.palette.mode === 'dark'
+ ? 'neutral.700'
+ : 'neutral.300',
+ borderRadius: 1,
+ borderStyle: 'solid',
+ borderWidth: 1,
+ maxHeight: 48
+ }}
+ type="number"
+ value={quantity}
+ />
+
+ Save
+
+
+
+
+ );
+};
+
+ProductVariantRow.propTypes = {
+ onQuantityChange: PropTypes.func,
+ variant: PropTypes.object.isRequired
+};
+
+export const ProductVariantsTable = (props) => {
+ const { onQuantityChange, variants = [] } = props;
+
+ return (
+
+
+
+
+
+ Variant
+
+
+ Inventory
+
+
+ Price
+
+
+ SKU
+
+
+ Actions
+
+
+
+
+ {variants.map((variant) => (
+
+ ))}
+
+
+
+ );
+};
diff --git a/src/sections/dashboard/products/product-variants.js b/src/sections/dashboard/products/product-variants.js
new file mode 100644
index 000000000000..552fb4766ccc
--- /dev/null
+++ b/src/sections/dashboard/products/product-variants.js
@@ -0,0 +1,203 @@
+import { useCallback } from 'react';
+import PropTypes from 'prop-types';
+import { format } from 'date-fns';
+import numeral from 'numeral';
+import CubeIcon from '@heroicons/react/24/outline/CubeIcon';
+import {
+ Avatar,
+ Button,
+ Card,
+ CardHeader,
+ Divider,
+ Stack,
+ SvgIcon,
+ Table,
+ TableBody,
+ TableCell,
+ TableHead,
+ TableRow,
+ Typography
+} from '@mui/material';
+import { ConfirmationDialog } from '../../../components/confirmation-dialog';
+import { ResourceUnavailable } from '../../../components/resource-unavailable';
+import { Scrollbar } from '../../../components/scrollbar';
+import { useDialog } from '../../../hooks/use-dialog';
+import { ProductVariantDialog } from './product-variant-dialog';
+
+export const ProductVariants = (props) => {
+ const { onVariantCreated, onVariantDeleted, onVariantUpdated, variants = [], ...other } = props;
+ const createDialog = useDialog();
+ const deleteDialog = useDialog();
+ const updateDialog = useDialog();
+
+ const handleVariantCreated = useCallback((variant) => {
+ createDialog.handleClose();
+ onVariantCreated?.(variant);
+ }, [createDialog, onVariantCreated]);
+
+ const handleVariantDelete = useCallback((variantId) => {
+ // Do API call here to behave the same as created and updated actions
+ onVariantDeleted?.(variantId);
+ deleteDialog.handleClose();
+ }, [deleteDialog, onVariantDeleted]);
+
+ const handleVariantUpdated = useCallback((variant) => {
+ updateDialog.handleClose();
+ onVariantUpdated?.(variant);
+ }, [updateDialog, onVariantUpdated]);
+
+ const hasVariants = variants.length > 0;
+
+ const updatingVariant = updateDialog.open
+ ? variants.find((variant) => variant.id === updateDialog.data)
+ : undefined;
+
+ return (
+ <>
+
+ createDialog.handleOpen()}
+ >
+ Add
+
+ )}
+ title="Variants"
+ />
+
+
+
+
+
+
+ Name
+
+
+ SKU
+
+
+ Created
+
+
+ Actions
+
+
+
+
+ {variants.map((variant) => {
+ const createdAt = format(variant.createdAt, 'MMM dd yyyy');
+ const price = numeral(variant.price).format(`${variant.currency}0,0.00`);
+
+ return (
+
+
+
+ `1px solid ${theme.palette.divider}`,
+ height: 48,
+ width: 48
+ }}
+ variant="rounded"
+ >
+
+
+
+
+
+
+ {variant.name}
+
+
+ {price}
+
+
+
+
+
+ {variant.sku}
+
+
+ {createdAt}
+
+
+
+ )}
+ spacing={2}
+ >
+ updateDialog.handleOpen(variant.id)}
+ size="small"
+ >
+ Edit
+
+ deleteDialog.handleOpen(variant.id)}
+ size="small"
+ >
+ Delete
+
+
+
+
+ );
+ })}
+
+
+
+ {!hasVariants && (
+
+ )}
+
+
+
+ handleVariantDelete(deleteDialog.data)}
+ open={deleteDialog.open}
+ title="Delete variant"
+ variant="error"
+ />
+ >
+ );
+};
+
+ProductVariants.propTypes = {
+ onVariantCreated: PropTypes.func,
+ onVariantDeleted: PropTypes.func,
+ onVariantUpdated: PropTypes.func,
+ variants: PropTypes.array
+};
diff --git a/src/sections/dashboard/products/products-search.js b/src/sections/dashboard/products/products-search.js
new file mode 100644
index 000000000000..2679bc289225
--- /dev/null
+++ b/src/sections/dashboard/products/products-search.js
@@ -0,0 +1,216 @@
+import { useCallback } from 'react';
+import PropTypes from 'prop-types';
+import { Box, Button, Divider, Stack, SvgIcon, Tab, Tabs } from '@mui/material';
+import AdjustmentsHorizontalIcon from '@heroicons/react/24/outline/AdjustmentsHorizontalIcon';
+import { BulkActionsMenu } from '../../../components/bulk-actions-menu';
+import { FilterDialog } from '../../../components/filter-dialog';
+import { QueryField } from '../../../components/query-field';
+import { useDialog } from '../../../hooks/use-dialog';
+import {
+ containsOperator,
+ endsWithOperator,
+ equalsOperator,
+ greaterThanOperator,
+ isAfterOperator,
+ isBeforeOperator,
+ isBlankOperator,
+ isPresentOperator,
+ lessThanOperator,
+ notContainsOperator,
+ notEqualOperator,
+ startsWithOperator
+} from '../../../utils/filter-operators';
+
+const viewOptions = [
+ {
+ label: 'All',
+ value: 'all'
+ },
+ {
+ label: 'Published',
+ value: 'published'
+ },
+ {
+ label: 'Draft',
+ value: 'draft'
+ },
+ {
+ label: 'Archived',
+ value: 'archived'
+ }
+];
+
+const filterProperties = [
+ {
+ label: 'Name',
+ name: 'name',
+ operators: [
+ 'contains',
+ 'endsWith',
+ 'equals',
+ 'notContains',
+ 'startsWith',
+ 'isBlank',
+ 'isPresent'
+ ]
+ },
+ {
+ label: 'Status',
+ name: 'status',
+ operators: [
+ 'contains',
+ 'endsWith',
+ 'equals',
+ 'notContains',
+ 'startsWith',
+ 'isBlank',
+ 'isPresent'
+ ]
+ },
+ {
+ label: 'Created',
+ name: 'createdAt',
+ operators: ['isAfter', 'isBefore', 'isBlank', 'isPresent']
+ }
+];
+
+const filterOperators = [
+ containsOperator,
+ endsWithOperator,
+ equalsOperator,
+ greaterThanOperator,
+ isAfterOperator,
+ isBeforeOperator,
+ isBlankOperator,
+ isPresentOperator,
+ lessThanOperator,
+ notContainsOperator,
+ notEqualOperator,
+ startsWithOperator
+];
+
+export const ProductsSearch = (props) => {
+ const {
+ disabled = false,
+ filters = [],
+ onFiltersApply,
+ onFiltersClear,
+ onQueryChange,
+ onViewChange,
+ query = '',
+ selected = [],
+ view = 'all'
+ } = props;
+ const filterDialog = useDialog();
+
+ const handleFiltersApply = useCallback((filters) => {
+ filterDialog.handleClose();
+ onFiltersApply?.(filters);
+ }, [filterDialog, onFiltersApply]);
+
+ const handleFiltersClear = useCallback(() => {
+ filterDialog.handleClose();
+ onFiltersClear?.();
+ }, [filterDialog, onFiltersClear]);
+
+ const hasSelection = selected.length > 0;
+ const hasFilters = filters.length > 0;
+
+ return (
+ <>
+
+
+ onViewChange?.(value)}
+ value={view}
+ variant="scrollable"
+ >
+ {viewOptions.map((option) => (
+
+ ))}
+
+
+
+
+ {hasSelection && (
+
+ )}
+
+
+
+
+ )}
+ sx={{ order: 2 }}
+ variant={hasFilters ? 'contained' : 'text'}
+ >
+ Filter
+
+
+
+
+ >
+ );
+};
+
+ProductsSearch.propTypes = {
+ disabled: PropTypes.bool,
+ filters: PropTypes.array,
+ onFiltersApply: PropTypes.func,
+ onFiltersClear: PropTypes.func,
+ onQueryChange: PropTypes.func,
+ onViewChange: PropTypes.func,
+ query: PropTypes.string,
+ selected: PropTypes.array,
+ view: PropTypes.oneOf(['all', 'published', 'draft', 'archived'])
+};
diff --git a/src/sections/dashboard/products/products-stats.js b/src/sections/dashboard/products/products-stats.js
new file mode 100644
index 000000000000..8a68b8ff7a58
--- /dev/null
+++ b/src/sections/dashboard/products/products-stats.js
@@ -0,0 +1,71 @@
+import CheckCircleIcon from "@heroicons/react/24/outline/CheckCircleIcon";
+import CurrencyDollarIcon from "@heroicons/react/24/outline/CurrencyDollarIcon";
+import ShoppingCartIcon from "@heroicons/react/24/outline/ShoppingCartIcon";
+import XCircleIcon from "@heroicons/react/24/outline/XCircleIcon";
+import { Card, Stack, SvgIcon, Typography, Unstable_Grid2 as Grid } from "@mui/material";
+
+const stats = [
+ {
+ icon: ,
+ data: "5,000",
+ name: "Total Devices",
+ },
+ {
+ icon: ,
+ data: "15",
+ name: "Total Clients",
+ },
+ {
+ icon: ,
+ data: "2345",
+ name: "Active Devices",
+ },
+ {
+ icon: ,
+ data: "300",
+ name: "Expired Devices",
+ },
+];
+
+export const ProductsStats = () => (
+
+
+ {stats.map((item) => (
+ ({
+ xs: `1px solid ${theme.palette.divider}`,
+ md: "none",
+ }),
+ borderRight: (theme) => ({
+ md: `1px solid ${theme.palette.divider}`,
+ }),
+ "&:nth-of-type(3)": {
+ borderBottom: (theme) => ({
+ xs: `1px solid ${theme.palette.divider}`,
+ sm: "none",
+ }),
+ },
+ "&:nth-of-type(4)": {
+ borderBottom: "none",
+ },
+ }}
+ >
+
+ {item.icon}
+
+
+ {item.name}
+
+ {item.data}
+
+
+
+ ))}
+
+
+);
diff --git a/src/sections/dashboard/products/products-table-menu.js b/src/sections/dashboard/products/products-table-menu.js
new file mode 100644
index 000000000000..91f334a59f35
--- /dev/null
+++ b/src/sections/dashboard/products/products-table-menu.js
@@ -0,0 +1,64 @@
+import { useCallback } from 'react';
+import { useRouter } from 'next/navigation';
+import toast from 'react-hot-toast';
+import EllipsisVerticalIcon from '@heroicons/react/24/outline/EllipsisVerticalIcon';
+import { IconButton, Menu, MenuItem, SvgIcon } from '@mui/material';
+import { usePopover } from '../../../hooks/use-popover';
+import { paths } from '../../../paths';
+
+export const ProductsTableMenu = () => {
+ const router = useRouter();
+ const popover = usePopover();
+
+ const handleEdit = useCallback(() => {
+ popover.handleClose();
+ router.push(paths.dashboard.products.details.index);
+ }, [popover, router]);
+
+ const handleArchive = useCallback(() => {
+ popover.handleClose();
+ toast.error('This action is not available on demo');
+ }, [popover]);
+
+ const handleDelete = useCallback(() => {
+ popover.handleClose();
+ toast.error('This action is not available on demo');
+ }, [popover]);
+
+ return (
+ <>
+
+
+
+
+
+
+
+ Edit
+
+
+ Archive
+
+
+ Delete
+
+
+ >
+ );
+};
diff --git a/src/sections/dashboard/products/products-table.js b/src/sections/dashboard/products/products-table.js
new file mode 100644
index 000000000000..3cde0869ffff
--- /dev/null
+++ b/src/sections/dashboard/products/products-table.js
@@ -0,0 +1,301 @@
+import PropTypes from 'prop-types';
+import NextLink from 'next/link';
+import { format } from 'date-fns';
+import {
+ Avatar,
+ Box,
+ Checkbox,
+ Divider,
+ Link,
+ Skeleton,
+ Stack,
+ Table,
+ TableBody,
+ TableCell,
+ TableHead,
+ TableRow,
+ TableSortLabel,
+ Typography
+} from '@mui/material';
+import { Pagination } from '../../../components/pagination';
+import { ResourceError } from '../../../components/resource-error';
+import { ResourceUnavailable } from '../../../components/resource-unavailable';
+import { Scrollbar } from '../../../components/scrollbar';
+import { paths } from '../../../paths';
+import { ProductsTableMenu } from './products-table-menu';
+
+const statusMap = {
+ draft: {
+ color: 'info.main',
+ label: 'Draft'
+ },
+ published: {
+ color: 'success.main',
+ label: 'Published'
+ }
+};
+
+const columns = [
+ {
+ id: 'name',
+ label: 'Name',
+ sortable: true
+ },
+ {
+ id: 'createdAt',
+ label: 'Created',
+ sortable: true
+ },
+ {
+ id: 'status',
+ label: 'Status',
+ sortable: true
+ }
+];
+
+const getResourcesState = (params) => {
+ if (params.isLoading) {
+ return 'loading';
+ }
+
+ if (params.error) {
+ return 'error';
+ }
+
+ return params.items.length > 0 ? 'available' : 'unavailable';
+};
+
+export const ProductsTable = (props) => {
+ const {
+ count = 0,
+ error,
+ isLoading = false,
+ items = [],
+ onDeselectAll,
+ onDeselectOne,
+ onPageChange,
+ onSelectAll,
+ onSelectOne,
+ onSortChange,
+ page = 0,
+ rowsPerPage = 0,
+ selected = [],
+ sortBy = 'createdAt',
+ sortDir = 'desc'
+ } = props;
+
+ const resourcesState = getResourcesState({
+ isLoading,
+ error,
+ items
+ });
+
+ const selectedSome = (selected.length > 0) && (selected.length < items.length);
+ const selectedAll = (items.length > 0) && (selected.length === items.length);
+
+ return (
+
+
+
+
+
+
+ {
+ if (event.target.checked) {
+ onSelectAll?.();
+ } else {
+ onDeselectAll?.();
+ }
+ }}
+ />
+
+ {columns.map((column) => (
+
+ {column.sortable
+ ? (
+ onSortChange?.(column.id)}
+ >
+ {column.label}
+
+ )
+ : column.label}
+
+ ))}
+
+
+
+ {resourcesState === 'available' && (
+
+ {items.map((product) => {
+ const isSelected = !!selected.find((productId) => productId === product.id);
+ const status = statusMap[product.status];
+ const createdDate = format(product.createdAt, 'dd MMM yyyy');
+ const createdTime = format(product.createdAt, 'HH:mm');
+
+ return (
+
+
+ {
+ if (event.target.checked) {
+ onSelectOne?.(product.id);
+ } else {
+ onDeselectOne?.(product.id);
+ }
+ }}
+ />
+
+
+
+
+
+
+ {product.name}
+
+
+ 12 in stock for 1 variant
+
+
+
+
+
+
+
+ {createdDate}
+
+
+ {createdTime}
+
+
+
+
+
+
+
+ {status.label}
+
+
+
+
+
+
+
+ );
+ })}
+
+ )}
+
+
+ {resourcesState === 'available' && (
+ <>
+
+
+ >
+ )}
+ {resourcesState === 'loading' && (
+
+
+
+
+
+ )}
+ {resourcesState === 'error' && (
+
+ )}
+ {resourcesState === 'unavailable' && (
+
+ )}
+
+ );
+};
+
+ProductsTable.propTypes = {
+ count: PropTypes.number,
+ error: PropTypes.string,
+ isLoading: PropTypes.bool,
+ items: PropTypes.array,
+ onDeselectAll: PropTypes.func,
+ onDeselectOne: PropTypes.func,
+ onPageChange: PropTypes.func,
+ onSelectAll: PropTypes.func,
+ onSelectOne: PropTypes.func,
+ onSortChange: PropTypes.func,
+ page: PropTypes.number,
+ rowsPerPage: PropTypes.number,
+ selected: PropTypes.array,
+ sortBy: PropTypes.string,
+ sortDir: PropTypes.oneOf(['asc', 'desc'])
+};
diff --git a/src/sections/dashboard/sales/sales-breakdown.js b/src/sections/dashboard/sales/sales-breakdown.js
new file mode 100644
index 000000000000..0424b97669f7
--- /dev/null
+++ b/src/sections/dashboard/sales/sales-breakdown.js
@@ -0,0 +1,179 @@
+import { useCallback, useState } from 'react';
+import PropTypes from 'prop-types';
+import { Box, Card, CardHeader, Divider, Tab, Tabs } from '@mui/material';
+import { useTheme } from '@mui/material/styles';
+import { ActionsMenu } from '../../../components/actions-menu';
+import { Chart } from '../../../components/chart';
+
+const useChartOptions = (categories) => {
+ const theme = useTheme();
+
+ return {
+ chart: {
+ background: 'transparent',
+ toolbar: {
+ show: false
+ }
+ },
+ colors: [
+ theme.palette.primary.main
+ ],
+ dataLabels: {
+ enabled: false
+ },
+ grid: {
+ borderColor: theme.palette.divider,
+ strokeDashArray: 2,
+ xaxis: {
+ lines: {
+ show: true
+ }
+ },
+ yaxis: {
+ lines: {
+ show: false
+ }
+ }
+ },
+ legend: {
+ show: false
+ },
+ plotOptions: {
+ bar: {
+ horizontal: true,
+ barHeight: '45%',
+ distributed: true
+ }
+ },
+ states: {
+ active: {
+ filter: {
+ type: 'none'
+ }
+ },
+ hover: {
+ filter: {
+ type: 'none'
+ }
+ }
+ },
+ theme: {
+ mode: theme.palette.mode
+ },
+ xaxis: {
+ axisBorder: {
+ show: false
+ },
+ axisTicks: {
+ show: false
+ },
+ categories,
+ labels: {
+ style: {
+ colors: theme.palette.text.secondary
+ }
+ }
+ },
+ yaxis: {
+ labels: {
+ style: {
+ colors: theme.palette.text.secondary
+ }
+ }
+ }
+ };
+};
+
+const tabOptions = [
+ {
+ label: 'Watches',
+ value: 'watches'
+ },
+ {
+ label: 'Mouse Pads',
+ value: 'mouse_pads'
+ },
+ {
+ label: 'Shoes',
+ value: 'shoes'
+ },
+ {
+ label: 'Cameras',
+ value: 'cameras'
+ },
+ {
+ label: 'Phones',
+ value: 'phones'
+ }
+];
+
+export const SalesBreakdown = (props) => {
+ const { categories = [], chartSeries = [] } = props;
+ const chartOptions = useChartOptions(categories);
+ const [tab, setTab] = useState('watches');
+ const [range, setRange] = useState('Last 7 days');
+
+ const handleTabChange = useCallback((value) => {
+ setTab(value);
+ }, []);
+
+ return (
+
+ { setRange('Last 7 days'); }
+ },
+ {
+ label: 'Last Month',
+ handler: () => { setRange('Last Month'); }
+ },
+ {
+ label: 'Last Year',
+ handler: () => { setRange('Last Year'); }
+ }
+ ]}
+ label={range}
+ size="small"
+ variant="text"
+ />
+ )}
+ title="Products Breakdown"
+ />
+
+
+ handleTabChange(value)}
+ value={tab}
+ variant="scrollable"
+ >
+ {tabOptions.map((option) => (
+
+ ))}
+
+
+
+
+
+
+
+ );
+};
+
+SalesBreakdown.propTypes = {
+ categories: PropTypes.array,
+ chartSeries: PropTypes.array
+};
diff --git a/src/sections/dashboard/sales/sales-kpi.js b/src/sections/dashboard/sales/sales-kpi.js
new file mode 100644
index 000000000000..9b5ab8aaacd6
--- /dev/null
+++ b/src/sections/dashboard/sales/sales-kpi.js
@@ -0,0 +1,160 @@
+import { useState } from 'react';
+import PropTypes from 'prop-types';
+import { Box, Card, CardContent, CardHeader, Divider, Typography } from '@mui/material';
+import { useTheme } from '@mui/material/styles';
+import { ActionsMenu } from '../../../components/actions-menu';
+import { Chart } from '../../../components/chart';
+
+const useChartOptions = () => {
+ const theme = useTheme();
+
+ return {
+ chart: {
+ background: 'transparent',
+ toolbar: {
+ show: false
+ },
+ zoom: {
+ enabled: false
+ }
+ },
+ legend: {
+ show: true
+ },
+ colors: [theme.palette.primary.main],
+ dataLabels: {
+ enabled: false
+ },
+ fill: {
+ type: 'gradient'
+ },
+ grid: {
+ borderColor: theme.palette.divider,
+ xaxis: {
+ lines: {
+ show: true
+ }
+ },
+ yaxis: {
+ lines: {
+ show: true
+ }
+ }
+ },
+ stroke: {
+ width: 3
+ },
+ theme: {
+ mode: theme.palette.mode
+ },
+ xaxis: {
+ axisBorder: {
+ color: theme.palette.divider,
+ show: true
+ },
+ axisTicks: {
+ color: theme.palette.divider,
+ show: true
+ },
+ categories: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
+ labels: {
+ style: {
+ colors: theme.palette.text.secondary
+ }
+ }
+ },
+ yaxis: {
+ labels: {
+ offsetX: -12,
+ style: {
+ colors: theme.palette.text.secondary
+ }
+ }
+ }
+ };
+};
+
+export const SalesKpi = (props) => {
+ const { chartSeries = [], stats = [] } = props;
+ const [range, setRange] = useState('Last 7 days');
+ const chartOptions = useChartOptions();
+
+ return (
+
+ { setRange('Last 7 days'); }
+ },
+ {
+ label: 'Last Month',
+ handler: () => { setRange('Last Month'); }
+ },
+ {
+ label: 'Last Year',
+ handler: () => { setRange('Last Year'); }
+ }
+ ]}
+ label={range}
+ size="small"
+ variant="text"
+ />
+ )}
+ title="Key Performance Indicators"
+ />
+
+
+
+ {stats.map((item) => (
+ theme.palette.mode === 'dark'
+ ? 'neutral.900'
+ : 'neutral.50',
+ borderRadius: 1,
+ p: 2
+ }}
+ >
+
+ {item.label}
+
+
+ {item.value}
+
+
+ ))}
+
+
+
+
+ );
+};
+
+SalesKpi.propTypes = {
+ chartSeries: PropTypes.array,
+ stats: PropTypes.array
+};
diff --git a/src/sections/docs/article-content.js b/src/sections/docs/article-content.js
new file mode 100644
index 000000000000..ba07896f47e8
--- /dev/null
+++ b/src/sections/docs/article-content.js
@@ -0,0 +1,151 @@
+import Markdown from 'react-markdown';
+import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';
+import PropTypes from 'prop-types';
+import { styled } from '@mui/material/styles';
+import { codeStyle } from '../../utils/code-style';
+
+const Code = (props) => {
+ const { node, inline, className, children, ...other } = props;
+
+ const language = /language-(\w+)/.exec(className || '');
+
+ return !inline && language
+ ? (
+
+ )
+ : (
+
+ {children}
+
+ );
+};
+
+const Link = (props) => {
+ const { href, children } = props;
+
+ if (!href?.startsWith('http')) {
+ return (
+
+ {children}
+
+ );
+ }
+
+ return (
+
+ {children}
+
+ );
+};
+
+const components = {
+ link: Link,
+ code: Code
+};
+
+const ArticleContentRoot = styled('div')(({ theme }) => ({
+ color: theme.palette.text.primary,
+ fontFamily: theme.typography.fontFamily,
+ '& blockquote': {
+ borderLeft: `4px solid ${theme.palette.text.secondary}`,
+ marginBottom: theme.spacing(2),
+ paddingBottom: theme.spacing(1),
+ paddingLeft: theme.spacing(2),
+ paddingTop: theme.spacing(1),
+ '& > p': {
+ color: theme.palette.text.secondary,
+ marginBottom: 0
+ }
+ },
+ '& code': {
+ color: theme.palette.primary.main,
+ fontFamily: 'Inconsolata, Monaco, Consolas, \'Courier New\', Courier, monospace',
+ fontSize: 14,
+ paddingLeft: 2,
+ paddingRight: 2
+ },
+ '& h1': {
+ fontSize: 35,
+ fontWeight: 500,
+ letterSpacing: '-0.24px',
+ marginBottom: theme.spacing(2),
+ marginTop: theme.spacing(6)
+ },
+ '& h2': {
+ fontSize: 29,
+ fontWeight: 500,
+ letterSpacing: '-0.24px',
+ marginBottom: theme.spacing(2),
+ marginTop: theme.spacing(6)
+ },
+ '& h3': {
+ fontSize: 24,
+ fontWeight: 500,
+ letterSpacing: '-0.06px',
+ marginBottom: theme.spacing(2),
+ marginTop: theme.spacing(6)
+ },
+ '& h4': {
+ fontSize: 20,
+ fontWeight: 500,
+ letterSpacing: '-0.06px',
+ marginBottom: theme.spacing(2),
+ marginTop: theme.spacing(4)
+ },
+ '& h5': {
+ fontSize: 16,
+ fontWeight: 500,
+ letterSpacing: '-0.05px',
+ marginBottom: theme.spacing(2),
+ marginTop: theme.spacing(2)
+ },
+ '& h6': {
+ fontSize: 14,
+ fontWeight: 500,
+ letterSpacing: '-0.05px',
+ marginBottom: theme.spacing(2),
+ marginTop: theme.spacing(2)
+ },
+ '& li': {
+ fontSize: 14,
+ lineHeight: 1.5,
+ marginBottom: theme.spacing(2),
+ marginLeft: theme.spacing(4)
+ },
+ '& p': {
+ fontSize: 14,
+ lineHeight: 1.5,
+ marginBottom: theme.spacing(2),
+ '& > a': {
+ color: theme.palette.primary.main
+ }
+ }
+}));
+
+export const ArticleContent = (props) => {
+ const { content } = props;
+
+ return (
+
+
+
+ );
+};
+
+ArticleContent.propTypes = {
+ content: PropTypes.string.isRequired
+};
diff --git a/src/sections/home/home-compare.js b/src/sections/home/home-compare.js
new file mode 100644
index 000000000000..1f94f9461541
--- /dev/null
+++ b/src/sections/home/home-compare.js
@@ -0,0 +1,214 @@
+import ArrowTopRightOnSquareIcon from '@heroicons/react/24/outline/ArrowTopRightOnSquareIcon';
+import CheckCircleIcon from '@heroicons/react/24/solid/CheckCircleIcon';
+import {
+ Box,
+ Button,
+ Container,
+ Divider,
+ List,
+ ListItem,
+ ListItemIcon,
+ ListItemText,
+ SvgIcon,
+ Typography,
+ Unstable_Grid2 as Grid
+} from '@mui/material';
+
+const freeFeatures = [
+ '4 page examples',
+ 'Community support',
+ 'Free design assets (Figma)'
+];
+
+const proFeatures = [
+ '30 page examples',
+ 'Premium support',
+ 'Pro design assets (Figma)',
+ 'Authentication with Amplify, Auth0, Firebase and JWT',
+ 'Data states',
+ 'Built with Mocked API'
+];
+
+export const HomeCompare = () => (
+
+
+
+ Try the free demo
+
+
+
+ theme.palette.mode === 'dark'
+ ? 'neutral.900'
+ : 'neutral.50',
+ borderRadius: '10px',
+ display: 'flex',
+ flexDirection: 'column',
+ height: '100%',
+ p: 3
+ }}
+ >
+
+ Version
+
+
+ Free
+
+
+ {freeFeatures.map((feature) => (
+
+
+
+
+
+
+
+
+ ))}
+
+
+
+
+
+
+ )}
+ href="https://github.com/devias-io/carpatin-dashboard-free"
+ size="large"
+ target="_target"
+ variant="outlined"
+ >
+ Try the Demo
+
+
+
+
+
+ theme.palette.mode === 'dark'
+ ? 'neutral.900'
+ : 'neutral.50',
+ borderRadius: '10px',
+ display: 'flex',
+ flexDirection: 'column',
+ height: '100%',
+ p: 3
+ }}
+ >
+
+ Version
+
+
+ Pro
+
+
+ {proFeatures.map((feature) => (
+
+
+
+
+
+
+
+
+ ))}
+
+
+
+
+
+
+ )}
+ href="https://mui.com/store/items/carpatin-dashboard"
+ size="large"
+ target="_target"
+ variant="contained"
+ >
+ Purchase Pro Version
+
+
+
+
+
+
+
+);
diff --git a/src/sections/home/home-faq-card.js b/src/sections/home/home-faq-card.js
new file mode 100644
index 000000000000..2138a9cb84b3
--- /dev/null
+++ b/src/sections/home/home-faq-card.js
@@ -0,0 +1,40 @@
+import PropTypes from 'prop-types';
+import { Box, Stack, Typography } from '@mui/material';
+
+export const HomeFaqCard = (props) => {
+ const { question, children } = props;
+
+ return (
+ theme.palette.mode === 'dark'
+ ? 'neutral.900'
+ : 'neutral.50'
+ }}
+ >
+
+
+ {question}
+
+
+ {children}
+
+
+
+ );
+};
+
+HomeFaqCard.propTypes = {
+ children: PropTypes.node,
+ question: PropTypes.string.isRequired
+};
diff --git a/src/sections/home/home-faqs.js b/src/sections/home/home-faqs.js
new file mode 100644
index 000000000000..d0dfced58abf
--- /dev/null
+++ b/src/sections/home/home-faqs.js
@@ -0,0 +1,117 @@
+import { Box, Container, Link, Stack, Typography, Unstable_Grid2 as Grid } from '@mui/material';
+import { HomeFaqCard } from './home-faq-card';
+
+export const HomeFaqs = () => (
+
+
+
+ Frequently asked questions
+
+
+
+
+
+ Yes, you can check out our open source
+ {' '}
+
+ dashboard template
+
+ {' '}
+ which should give you an overview of the code quality and folder structure.
+
+
+ Keep in mind that some aspects may differ from the Carpatin
+ - Admin Dashboard Paid version.
+
+
+ The license is per project (domain), but if you intend to develop an unknown number of
+ projects feel free to
+ {' '}
+
+ contact us
+
+ {' '}
+ and we'll find a solution.
+
+
+
+
+
+
+ Absolutely! If you intend to charge users for using your product Extended license is
+ created specifically for this context.
+
+
+ The components in Material-UI are designed to work in the latest, stable releases of
+ all major browsers, including Chrome, Firefox, Safari, and Edge.
+
+
+ We don't support Internet Explorer 11.
+
+
+
+
+
+
+ The Standard license is designed for internal applications in which staff will access
+ the application.
+
+
+ An example could be the back-office dashboard of a public-facing e-commerce website in
+ which staff would sign in and manage inventory, customers, etc.
+
+
+ The Standard Plus license includes an expertly designed complete Figma kit that takes
+ advantage of modern Figma features like Variants and Auto Layout.
+
+
+ Should you need a sample of the Figma file, you can
+
+ {' '}
+ download a free preview
+ {' '}
+
+ from the Figma community.
+
+
+ We don't include assets for other design tools such as Sketch or Adobe XD.
+
+
+
+
+
+
+);
diff --git a/src/sections/home/home-features.js b/src/sections/home/home-features.js
new file mode 100644
index 000000000000..91adf237bd17
--- /dev/null
+++ b/src/sections/home/home-features.js
@@ -0,0 +1,263 @@
+import ArrowDownOnSquareIcon from '@heroicons/react/24/outline/ArrowDownOnSquareIcon';
+import Squares2X2Icon from '@heroicons/react/24/outline/Squares2X2Icon';
+import {
+ Avatar,
+ Box,
+ Container,
+ Divider,
+ Stack,
+ SvgIcon,
+ Typography,
+ Unstable_Grid2 as Grid
+} from '@mui/material';
+
+export const HomeFeatures = () => (
+
+
+
+
+
+ Packed with features
+
+
+ More than 30 screens, utilities and hooks for your product development
+
+
+
+
+
+ theme.palette.mode === 'dark'
+ ? 'neutral.900'
+ : 'neutral.50',
+ borderRadius: '10px',
+ p: 3
+ }}
+ >
+
+
+
+
+
+ Authentication
+
+
+ The template comes with Cognito, Firebase, Auth0 and JWT Auth systems installed and
+ configured. Get up and running in a matter of minutes.
+
+
+
+
+
+ theme.palette.mode === 'dark'
+ ? 'neutral.900'
+ : 'neutral.50',
+ borderRadius: '10px',
+ p: 6
+ }}
+ >
+
+
+
+
+ Loading and Error states
+
+
+ Screens come connected to a fake server api client and state management system,
+ and can be hooked to your real server in no time.
+
+
+
+
+ theme.palette.mode === 'dark'
+ ? 'neutral.900'
+ : 'neutral.50',
+ borderRadius: '10px',
+ p: 6
+ }}
+ >
+
+
+
+
+ Advanced Features
+
+
+ When it comes to management, it’s important to have good tools for specific needs,
+ so we included a powerful filter system so you won’t have to build one.
+
+
+
+
+
+
+ ({
+ md: `1px solid ${theme.palette.divider}`
+ })
+ }}
+ >
+
+
+
+
+
+
+
+ Responsive
+
+
+ Fully responsive templates. Layouts are created with mobile in mind
+ to make your project ready for any type of end-user.
+
+
+
+
+
+
+
+
+
+
+
+ Free Updates
+
+
+ We continuously deploy new updates which include updated dependencies,
+ new screens and bug fixes.
+
+
+
+
+
+
+
+
+);
diff --git a/src/sections/home/home-hero.js b/src/sections/home/home-hero.js
new file mode 100644
index 000000000000..c3b7b824df60
--- /dev/null
+++ b/src/sections/home/home-hero.js
@@ -0,0 +1,76 @@
+import NextLink from "next/link";
+import { Box, Button, Container, Stack, Typography } from "@mui/material";
+import { paths } from "../../paths";
+
+export const HomeHero = () => (
+
+
+
+ Meet Carpatin -
+
+ Admin Dashboard
+
+
+ Carpatin is a professionally crafted admin dashboard for everyday product development with
+ MUI components.
+
+
+
+ Live Preview
+
+
+ Purchase
+
+
+
+
+
+
+
+);
diff --git a/src/sections/home/home-pricing.js b/src/sections/home/home-pricing.js
new file mode 100644
index 000000000000..39e47ee6acc3
--- /dev/null
+++ b/src/sections/home/home-pricing.js
@@ -0,0 +1,185 @@
+import CheckCircleIcon from '@heroicons/react/24/solid/CheckCircleIcon';
+import XCircleIcon from '@heroicons/react/24/outline/XCircleIcon';
+import {
+ Box,
+ Button,
+ Card,
+ Container,
+ Divider,
+ List,
+ ListItem,
+ ListItemIcon,
+ ListItemText,
+ SvgIcon,
+ Typography,
+ Unstable_Grid2 as Grid
+} from '@mui/material';
+
+const features = [
+ 'One end project',
+ '12 months updates',
+ '6 months of support',
+ 'TypeScript version',
+ 'Design assets',
+ 'Commercial applications'
+];
+
+const plans = [
+ {
+ name: 'Standard',
+ features: ['One end project', '12 months updates', '6 months of support']
+ },
+ {
+ name: 'Standard Plus',
+ features: [
+ 'One end project',
+ '12 months updates',
+ '6 months of support',
+ 'TypeScript version',
+ 'Design assets'
+ ]
+ },
+ {
+ name: 'Extended',
+ features: [
+ 'One end project',
+ '12 months updates',
+ '6 months of support',
+ 'TypeScript version',
+ 'Design assets',
+ 'Commercial applications'
+ ]
+ }
+];
+
+export const HomePricing = () => (
+ theme.palette.mode === 'dark'
+ ? 'neutral.900'
+ : 'neutral.50',
+ py: 15
+ }}
+ >
+
+
+ Pricing
+
+
+ {plans.map((plan) => (
+
+
+
+ License
+
+
+ {plan.name}
+
+
+ {features.map((feature) => {
+ const isIncluded = plan.features.includes(feature);
+
+ return (
+
+
+
+ {isIncluded ? : }
+
+
+
+
+ );
+ })}
+
+
+
+
+ Purchase Now
+
+
+
+
+ ))}
+
+
+
+ Do you have a special case?
+
+
+ Let’s talk about your specific requirements and see how we can help you.
+
+
+ Contact us
+
+
+
+
+);
diff --git a/src/sections/home/home-support.js b/src/sections/home/home-support.js
new file mode 100644
index 000000000000..01f64860ad44
--- /dev/null
+++ b/src/sections/home/home-support.js
@@ -0,0 +1,196 @@
+import {
+ Avatar,
+ avatarClasses,
+ AvatarGroup,
+ Box,
+ Button,
+ Container,
+ Stack,
+ Typography,
+ Unstable_Grid2 as Grid
+} from '@mui/material';
+
+const members = [
+ {
+ avatar: '/assets/support-stefania.png',
+ name: 'Stefania Vladutu'
+ },
+ {
+ avatar: '/assets/support-alexandru.png',
+ name: 'Alexandru Comanescu'
+ },
+ {
+ avatar: '/assets/support-adrian.png',
+ name: 'Adrian Manea'
+ }
+];
+
+export const HomeSupport = () => (
+
+
+ theme.palette.mode === 'dark'
+ ? 'neutral.900'
+ : 'neutral.50',
+ borderColor: 'divider',
+ borderRadius: 2,
+ borderStyle: 'solid',
+ borderWidth: 1
+ }}
+ >
+
+ ({
+ md: `1px solid ${theme.palette.divider}`
+ }),
+ display: 'flex',
+ flexDirection: 'column',
+ mb: {
+ xs: 4,
+ md: 0
+ },
+ pr: {
+ md: 4
+ }
+ }}
+ >
+
+
+ Design Files
+
+
+ We've included the source Figma files in Plus &
+ Extended licenses so you can get creative! Build layouts with confidence.
+
+
+
+
+ Preview Figma Files
+
+
+
+
+
+
+
+
+
+
+
+ Premium Support
+
+
+ Our support team is here to help you get started with any template-related questions.
+ We answer pretty fast.
+
+
+
+
+ Contact us
+
+ theme.palette.mode === 'dark'
+ ? 'neutral.900'
+ : 'neutral.50'
+ }
+ }}
+ >
+ {members.map((member) => (
+
+ ))}
+
+
+
+
+
+
+
+);
diff --git a/src/sections/home/home-user-flows.js b/src/sections/home/home-user-flows.js
new file mode 100644
index 000000000000..8f1d28dbc781
--- /dev/null
+++ b/src/sections/home/home-user-flows.js
@@ -0,0 +1,79 @@
+import NextLink from "next/link";
+import { Box, Button, Chip, Container, Stack, Typography } from "@mui/material";
+import { paths } from "../../paths";
+
+const features = ["Customers", "Products", "Orders", "Invoices", "Organization"];
+
+export const HomeUserFlows = () => (
+ (theme.palette.mode === "dark" ? "neutral.900" : "neutral.50"),
+ py: "64px",
+ }}
+ >
+
+
+
+
+
+ Management User Flows
+
+
+ Rather than a generic template, we focused on management-specific screens to enable
+ developers focus on the important part of the development process.
+
+
+ {features.map((feature) => (
+
+ ))}
+
+
+
+ Live Preview
+
+
+ Purchase
+
+
+
+
+
+
+
+
+
+
+);
diff --git a/src/store/ApiClient.js b/src/store/ApiClient.js
new file mode 100644
index 000000000000..e17c059e0071
--- /dev/null
+++ b/src/store/ApiClient.js
@@ -0,0 +1,23 @@
+import axios from "axios";
+
+const methods = ["get", "post", "put", "patch", "del"];
+
+export default class ApiClient {
+ constructor() {
+ methods.forEach((method) => {
+ this[method] = (path, { params, data } = {}) => {
+ return new Promise((resolve, reject) => {
+ axios({
+ method,
+ baseURL: window.location.origin,
+ url: path,
+ data,
+ params,
+ })
+ .then((result) => resolve(result))
+ .catch((error) => reject(error));
+ });
+ };
+ });
+ }
+}
diff --git a/src/store/api/app.js b/src/store/api/app.js
new file mode 100644
index 000000000000..226bb569002d
--- /dev/null
+++ b/src/store/api/app.js
@@ -0,0 +1,143 @@
+import { baseApi } from "./baseApi";
+
+export const appApi = baseApi.injectEndpoints({
+ endpoints: (builder) => ({
+ loadVersions: builder.query({
+ queryFn: (_args, _baseQueryApi, _options, baseQuery) =>
+ baseQuery({ path: "/version_latest.txt" }).then(({ data }) =>
+ baseQuery({
+ path: "/api/GetVersion",
+ params: { localversion: data.replace(/(\r\n|\n|\r)/gm, "") },
+ })
+ ),
+ }),
+ loadVersionLocal: builder.query({
+ query: () => ({ path: "/version_latest.txt" }),
+ }),
+ loadVersionRemote: builder.query({
+ query: (localVersion) => ({
+ path: "/api/GetVersion",
+ params: { localversion: localVersion },
+ }),
+ }),
+ loadAlertsDash: builder.query({
+ queryFn: (_args, _baseQueryApi, _options, baseQuery) =>
+ baseQuery({ path: "/version_latest.txt" }).then(({ data }) =>
+ baseQuery({
+ path: "/api/GetCippAlerts",
+ params: { localversion: data.replace(/(\r\n|\n|\r)/gm, "") },
+ })
+ ),
+ }),
+ loadDash: builder.query({
+ query: (localVersion) => ({
+ path: "/api/GetDashboard",
+ }),
+ }),
+ execPermissionsAccessCheck: builder.query({
+ query: () => ({
+ path: "/api/ExecAccessChecks",
+ params: {
+ Permissions: true,
+ },
+ }),
+ }),
+ execNotificationConfig: builder.query({
+ query: ({
+ email,
+ webhook,
+ tokenUpdater,
+ removeUser,
+ removeStandard,
+ addPolicy,
+ addUser,
+ addStandardsDeploy,
+ addChocoApp,
+ onePerTenant,
+ sendtoIntegration,
+ includeTenantId,
+ logsToInclude,
+ Severity,
+ }) => ({
+ path: "/api/ExecNotificationConfig",
+ data: {
+ email: email,
+ webhook: webhook,
+ tokenUpdater: tokenUpdater,
+ removeUser: removeUser,
+ removeStandard: removeStandard,
+ addPolicy: addPolicy,
+ addUser: addUser,
+ addStandardsDeploy: addStandardsDeploy,
+ addChocoApp: addChocoApp,
+ onePerTenant: onePerTenant,
+ logsToInclude: logsToInclude,
+ Severity: Severity,
+ sendtoIntegration: sendtoIntegration,
+ includeTenantId: includeTenantId,
+ },
+ method: "post",
+ }),
+ }),
+ execTenantsAccessCheck: builder.query({
+ query: ({ tenantDomains }) => ({
+ path: "/api/ExecAccessChecks",
+ params: {
+ Tenants: true,
+ },
+ data: {
+ tenantid: tenantDomains.join(","),
+ },
+ method: "post",
+ }),
+ }),
+ execClearCache: builder.query({
+ query: ({ tenantsOnly }) => ({
+ path: "/api/ListTenants",
+ params: {
+ ClearCache: true,
+ TenantsOnly: tenantsOnly,
+ },
+ }),
+ }),
+ listNotificationConfig: builder.query({
+ query: () => ({
+ path: "/api/listNotificationConfig",
+ }),
+ }),
+ genericPostRequest: builder.query({
+ query: ({ path, values }) => ({
+ path,
+ data: values,
+ method: "post",
+ }),
+ }),
+ genericGetRequest: builder.query({
+ query: ({ path, params }) => ({
+ path,
+ params: params,
+ method: "GET",
+ }),
+ }),
+ }),
+});
+
+export const {
+ useLoadVersionLocalQuery,
+ useLoadVersionRemoteQuery,
+ useLoadVersionsQuery,
+ useLoadDashQuery,
+ useLoadAlertsDashQuery,
+ useExecPermissionsAccessCheckQuery,
+ useLazyExecPermissionsAccessCheckQuery,
+ useExecTenantsAccessCheckQuery,
+ useLazyExecTenantsAccessCheckQuery,
+ useExecClearCacheQuery,
+ useLazyExecClearCacheQuery,
+ useLazyExecNotificationConfigQuery,
+ useLazyListNotificationConfigQuery,
+ useLazyGenericPostRequestQuery,
+ useLazyGenericGetRequestQuery,
+ useGenericGetRequestQuery,
+ useGenericPostRequestQuery,
+} = appApi;
diff --git a/src/store/api/auth.js b/src/store/api/auth.js
new file mode 100644
index 000000000000..f212734600f0
--- /dev/null
+++ b/src/store/api/auth.js
@@ -0,0 +1,11 @@
+import { baseApi } from "./baseApi";
+
+export const authApi = baseApi.injectEndpoints({
+ endpoints: (builder) => ({
+ loadClientPrincipal: builder.query({
+ query: () => ({ path: "/.auth/me" }),
+ }),
+ }),
+});
+
+export const { useLoadClientPrincipalQuery } = authApi;
diff --git a/src/store/api/baseApi.js b/src/store/api/baseApi.js
new file mode 100644
index 000000000000..190ed80a3212
--- /dev/null
+++ b/src/store/api/baseApi.js
@@ -0,0 +1,9 @@
+import { createApi } from "@reduxjs/toolkit/query/react";
+import { baseQuery } from "./baseQuery";
+
+export const baseApi = createApi({
+ reducerPath: "api",
+ baseQuery: baseQuery(),
+ keepUnusedDataFor: 0,
+ endpoints: () => ({}),
+});
diff --git a/src/store/api/baseQuery.js b/src/store/api/baseQuery.js
new file mode 100644
index 000000000000..90173f3b7cc2
--- /dev/null
+++ b/src/store/api/baseQuery.js
@@ -0,0 +1,55 @@
+import axios from 'axios'
+
+let newController = new AbortController() // Controller for managing abortion of requests
+
+const retryDelays = [100, 200, 300] // Delays in milliseconds for retries
+
+export const axiosQuery = async ({ path, method = 'get', params, data, hideToast }) => {
+ let attempt = 0
+
+ while (attempt <= retryDelays.length) {
+ try {
+ const result = await axios({
+ signal: newController.signal,
+ method,
+ baseURL: window.location.origin,
+ url: path,
+ data,
+ params,
+ })
+ return { data: result.data } // Successful response
+ } catch (error) {
+ if (attempt === retryDelays.length || !shouldRetry(error, path)) {
+ return {
+ // Max retries reached or error should not trigger a retry
+ error: {
+ status: error.response?.status,
+ data: error.response?.data,
+ hideToast,
+ message: error.message,
+ },
+ }
+ }
+ await delay(retryDelays[attempt]) // Wait before retrying
+ attempt++
+ }
+ }
+}
+
+const shouldRetry = (error, path) => {
+ // Check if the path starts with 'List', error qualifies for a retry, and payload message is 'Backend call failure'
+ return (
+ path.toLowerCase().startsWith('/api/list') &&
+ error.response &&
+ error.response.status >= 500 &&
+ error.response.data === 'Backend call failure'
+ )
+}
+const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms))
+
+export function abortRequestSafe() {
+ newController.abort() // Abort any ongoing request
+ newController = new AbortController() // Reset the controller for new requests
+}
+
+export const baseQuery = ({ baseUrl } = { baseUrl: '' }) => axiosQuery
diff --git a/src/store/index.js b/src/store/index.js
new file mode 100644
index 000000000000..f6bb5f22a6ef
--- /dev/null
+++ b/src/store/index.js
@@ -0,0 +1,22 @@
+import { useDispatch as useReduxDispatch, useSelector as useReduxSelector } from "react-redux";
+import { configureStore } from "@reduxjs/toolkit";
+import { rootReducer } from "./root-reducer";
+import { errorMiddleware } from "./middleware/errorMiddleware";
+import { unauthenticatedMiddleware } from "./middleware/unauthenticatedMiddleware";
+import { persistStore, FLUSH, PAUSE, PERSIST, PURGE, REGISTER, REHYDRATE } from "redux-persist";
+import { apiMiddleware } from "./root-reducer";
+
+export const store = configureStore({
+ reducer: rootReducer,
+ devTools: process.env.REACT_APP_ENABLE_REDUX_DEV_TOOLS === "true",
+ middleware: (getDefaultMiddleware) =>
+ getDefaultMiddleware({
+ serializableCheck: {
+ ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER],
+ },
+ }).concat([unauthenticatedMiddleware, ...apiMiddleware, errorMiddleware]),
+});
+
+export const useSelector = useReduxSelector;
+
+export const useDispatch = () => useReduxDispatch();
diff --git a/src/store/middleware/errorMiddleware.js b/src/store/middleware/errorMiddleware.js
new file mode 100644
index 000000000000..44112368b788
--- /dev/null
+++ b/src/store/middleware/errorMiddleware.js
@@ -0,0 +1,50 @@
+// this will catch all errors, or any actions with prop `error` set
+// set action.hideToastError to `true` to ignore this middleware
+import { isRejectedWithValue } from "@reduxjs/toolkit";
+import { store } from "../index";
+import { showToast } from "../toasts";
+
+export const errorMiddleware =
+ ({ dispatch }) =>
+ (next) =>
+ (action) => {
+ if (
+ isRejectedWithValue(action) &&
+ !action.error?.hideToastError &&
+ action.payload.message !== "canceled"
+ ) {
+ if (action.payload.data === "Backend call failure") {
+ action.payload.data =
+ "The Azure Function has taken too long to respond. Try selecting a different report or a single tenant instead";
+ }
+ //if the payload is a string, show the string, if the payload is an object, check if there is a 'Results or 'results' or 'result' property and show that, otherwise show the whole object
+ let message = action.payload?.data || "A generic error has occurred.";
+ if (typeof message === "string") {
+ // Do nothing, message is already a string
+ } else if (typeof message === "object") {
+ if (message.Results) {
+ message = message.Results;
+ } else if (message.results) {
+ message = message.results;
+ } else if (message.result) {
+ message = message.result;
+ } else {
+ message = JSON.stringify(message);
+ }
+ }
+ if (message.length > 240) {
+ message = message.substring(0, 240) + "...";
+ }
+ const toastError = action.payload;
+ console.log("error message", message);
+ dispatch(
+ showToast({
+ title: "An error has occurred",
+ message: message,
+ toastError,
+ })
+ );
+ }
+
+ return next(action);
+ };
diff --git a/src/store/middleware/unauthenticatedMiddleware.js b/src/store/middleware/unauthenticatedMiddleware.js
new file mode 100644
index 000000000000..b00a2bb8be04
--- /dev/null
+++ b/src/store/middleware/unauthenticatedMiddleware.js
@@ -0,0 +1,18 @@
+import { isRejectedWithValue } from '@reduxjs/toolkit'
+//import { resetAuthAction } from 'src/store/actions'
+//import { authApi } from 'src/store/api/auth'
+
+export const unauthenticatedMiddleware =
+ ({ dispatch }) =>
+ (next) =>
+ (action) => {
+ if (isRejectedWithValue(action) && action.payload.status === 401) {
+ //dispatch(resetAuthAction())
+ //dispatch(authApi.utils.resetApiState())
+
+ // Catch API call on timed out SWA session and send to login page
+ window.location.href = '/.auth/login/aad?post_login_redirect_uri=' + window.location.href
+ }
+
+ return next(action)
+ }
diff --git a/src/store/root-reducer.js b/src/store/root-reducer.js
new file mode 100644
index 000000000000..8e55e6059d7a
--- /dev/null
+++ b/src/store/root-reducer.js
@@ -0,0 +1,10 @@
+import { combineReducers } from "@reduxjs/toolkit";
+import { baseApi } from "./api/baseApi";
+import { toastsSlice } from "./toasts";
+
+export const apiMiddleware = [baseApi.middleware];
+
+export const rootReducer = combineReducers({
+ [baseApi.reducerPath]: baseApi.reducer,
+ [toastsSlice.name]: toastsSlice.reducer,
+});
diff --git a/src/store/toasts.js b/src/store/toasts.js
new file mode 100644
index 000000000000..9fb5c1464227
--- /dev/null
+++ b/src/store/toasts.js
@@ -0,0 +1,27 @@
+import { createSlice } from "@reduxjs/toolkit";
+
+const initialState = {
+ toasts: [],
+ currentIndex: 0,
+};
+
+export const TOAST_REDUCER_PATH = "toasts";
+export const toastsSlice = createSlice({
+ name: TOAST_REDUCER_PATH,
+ initialState,
+ reducers: {
+ showToast: (state, { payload: { message, title, toastError } }) => {
+ state.currentIndex++;
+ state.toasts.push({ message, title, toastError, index: state.currentIndex });
+ },
+ closeToast: (state, { payload: { index } }) => {
+ state.toasts = state.toasts.filter((el) => el.index !== index);
+ },
+ resetToast: () => {
+ return { ...initialState };
+ },
+ },
+});
+
+export const { showToast, closeToast, resetToast } = toastsSlice.actions;
+export default toastsSlice.reducer;
diff --git a/src/theme/base/create-components.js b/src/theme/base/create-components.js
new file mode 100644
index 000000000000..029b99fcdc97
--- /dev/null
+++ b/src/theme/base/create-components.js
@@ -0,0 +1,428 @@
+import XCircleIcon from '@heroicons/react/24/outline/XCircleIcon';
+import {
+ createTheme,
+ filledInputClasses,
+ inputAdornmentClasses,
+ inputBaseClasses,
+ inputLabelClasses,
+ SvgIcon,
+ switchClasses,
+ tableCellClasses
+} from '@mui/material';
+
+// Used only to create transitions
+const muiTheme = createTheme();
+
+export const createComponents = () => {
+ return {
+ MuiAutocomplete: {
+ styleOverrides: {
+ root: {
+ [`& .${filledInputClasses.root}`]: {
+ paddingTop: 6
+ }
+ },
+ noOptions: {
+ fontSize: 14,
+ letterSpacing: 0.15,
+ lineHeight: 1.6
+ },
+ option: {
+ fontSize: 14,
+ letterSpacing: 0.15,
+ lineHeight: 1.6
+ }
+ }
+ },
+ MuiAvatar: {
+ styleOverrides: {
+ root: {
+ fontSize: 14,
+ fontWeight: 600,
+ letterSpacing: 0
+ }
+ }
+ },
+ MuiButton: {
+ defaultProps: {
+ disableRipple: true
+ },
+ styleOverrides: {
+ root: {
+ fontWeight: 600
+ },
+ sizeLarge: {
+ fontSize: 15
+ },
+ sizeMedium: {
+ fontSize: 14
+ },
+ sizeSmall: {
+ fontSize: 13
+ }
+ }
+ },
+ MuiButtonGroup: {
+ defaultProps: {
+ disableRipple: true
+ }
+ },
+ MuiCardActions: {
+ styleOverrides: {
+ root: {
+ paddingBottom: 16,
+ paddingLeft: 24,
+ paddingRight: 24,
+ paddingTop: 16
+ }
+ }
+ },
+ MuiCardContent: {
+ styleOverrides: {
+ root: {
+ paddingBottom: 20,
+ paddingLeft: 24,
+ paddingRight: 24,
+ paddingTop: 20
+ }
+ }
+ },
+ MuiCardHeader: {
+ styleOverrides: {
+ root: {
+ paddingBottom: 16,
+ paddingLeft: 24,
+ paddingRight: 24,
+ paddingTop: 16
+ },
+ subheader: {
+ fontSize: 14
+ },
+ title: {
+ fontSize: 16
+ }
+ }
+ },
+ MuiCheckbox: {
+ styleOverrides: {
+ root: {
+ '&:hover': {
+ backgroundColor: 'transparent'
+ }
+ }
+ }
+ },
+ MuiChip: {
+ defaultProps: {
+ deleteIcon: (
+
+
+
+ )
+ },
+ styleOverrides: {
+ avatar: {
+ borderRadius: 6
+ },
+ root: {
+ borderRadius: 6,
+ fontWeight: 400,
+ letterSpacing: 0
+ }
+ }
+ },
+ MuiCssBaseline: {
+ styleOverrides: {
+ '*': {
+ boxSizing: 'border-box'
+ },
+ html: {
+ MozOsxFontSmoothing: 'grayscale',
+ WebkitFontSmoothing: 'antialiased',
+ display: 'flex',
+ flexDirection: 'column',
+ minHeight: '100%',
+ width: '100%'
+ },
+ body: {
+ display: 'flex',
+ flex: '1 1 auto',
+ flexDirection: 'column',
+ minHeight: '100%',
+ width: '100%'
+ },
+ '#__next': {
+ display: 'flex',
+ flex: '1 1 auto',
+ flexDirection: 'column',
+ height: '100%',
+ width: '100%'
+ },
+ '#nprogress': {
+ pointerEvents: 'none'
+ },
+ '#nprogress .bar': {
+ backgroundColor: '#12B76A',
+ height: 3,
+ left: 0,
+ position: 'fixed',
+ top: 0,
+ width: '100%',
+ zIndex: 2000
+ }
+ }
+ },
+ MuiDialogActions: {
+ styleOverrides: {
+ root: {
+ paddingBottom: 32,
+ paddingLeft: 32,
+ paddingRight: 32,
+ paddingTop: 24,
+ '&>:not(:first-of-type)': {
+ marginLeft: 16
+ }
+ }
+ }
+ },
+ MuiDialogContent: {
+ styleOverrides: {
+ root: {
+ paddingBottom: 8,
+ paddingLeft: 32,
+ paddingRight: 32,
+ paddingTop: 8
+ }
+ }
+ },
+ MuiDialogTitle: {
+ styleOverrides: {
+ root: {
+ fontSize: 24,
+ fontWeight: 600,
+ paddingBottom: 24,
+ paddingLeft: 32,
+ paddingRight: 32,
+ paddingTop: 32
+ }
+ }
+ },
+ MuiFormControlLabel: {
+ styleOverrides: {
+ label: {
+ fontSize: 14,
+ letterSpacing: 0.15,
+ lineHeight: 1.43
+ }
+ }
+ },
+ MuiIcon: {
+ styleOverrides: {
+ fontSizeLarge: {
+ fontSize: 32
+ }
+ }
+ },
+ MuiIconButton: {
+ styleOverrides: {
+ root: {
+ borderRadius: 6,
+ padding: 8
+ },
+ sizeSmall: {
+ padding: 4
+ }
+ }
+ },
+ MuiInputAdornment: {
+ styleOverrides: {
+ root: {
+ [`&.${inputAdornmentClasses.positionStart}.${inputAdornmentClasses.filled}`]: {
+ '&:not(.MuiInputAdornment-hiddenLabel)': {
+ marginTop: 0
+ }
+ }
+ }
+ }
+ },
+ MuiInputBase: {
+ styleOverrides: {
+ input: {
+ '&::placeholder': {
+ opacity: 1
+ },
+ [`label[data-shrink=false] + .${inputBaseClasses.formControl} &`]: {
+ '&::placeholder': {
+ opacity: 1 + '!important'
+ }
+ }
+ }
+ }
+ },
+ MuiFilledInput: {
+ styleOverrides: {
+ root: {
+ borderRadius: 6,
+ borderStyle: 'solid',
+ borderWidth: 1,
+ overflow: 'hidden',
+ padding: '6px 12px',
+ transition: muiTheme.transitions.create([
+ 'border-color',
+ 'box-shadow'
+ ]),
+ '&:before': {
+ display: 'none'
+ },
+ '&:after': {
+ display: 'none'
+ }
+ },
+ input: {
+ padding: 0,
+ height: 'unset',
+ fontSize: 14,
+ fontWeight: 500,
+ lineHeight: 1.6
+ }
+ }
+ },
+ MuiFormLabel: {
+ styleOverrides: {
+ root: {
+ fontSize: 14,
+ fontWeight: 500,
+ [`&.${inputLabelClasses.filled}`]: {
+ marginBottom: 8,
+ position: 'relative',
+ transform: 'none'
+ }
+ }
+ }
+ },
+ MuiListItemIcon: {
+ styleOverrides: {
+ root: {
+ marginRight: '16px',
+ minWidth: 'unset'
+ }
+ }
+ },
+ MuiPaper: {
+ styleOverrides: {
+ root: {
+ backgroundImage: 'none'
+ }
+ }
+ },
+ MuiRadio: {
+ styleOverrides: {
+ root: {
+ transition: 'color 250ms',
+ '&:hover': {
+ backgroundColor: 'transparent'
+ }
+ }
+ }
+ },
+ MuiSelect: {
+ defaultProps: {
+ variant: 'filled'
+ },
+ styleOverrides: {
+ filled: {
+ '&:focus': {
+ backgroundColor: 'transparent'
+ }
+ }
+ }
+ },
+ MuiSkeleton: {
+ styleOverrides: {
+ root: {
+ borderRadius: 4
+ }
+ }
+ },
+ MuiSvgIcon: {
+ styleOverrides: {
+ fontSizeLarge: {
+ fontSize: 32
+ }
+ }
+ },
+ MuiSwitch: {
+ styleOverrides: {
+ root: {
+ borderRadius: 48,
+ height: 24,
+ marginBottom: 8,
+ marginLeft: 8,
+ marginRight: 8,
+ marginTop: 8,
+ padding: 0,
+ width: 44
+ },
+ switchBase: {
+ padding: 4,
+ '&:hover': {
+ backgroundColor: 'transparent'
+ },
+ [`&.${switchClasses.checked}+.${switchClasses.track}`]: {
+ opacity: 1
+ },
+ [`&.${switchClasses.disabled}+.${switchClasses.track}`]: {
+ opacity: 1
+ },
+ [`&.${switchClasses.checked}.${switchClasses.disabled}+.${switchClasses.track}`]: {
+ opacity: 0.5
+ }
+ },
+ track: {
+ opacity: 1
+ },
+ thumb: {
+ height: 16,
+ width: 16
+ }
+ }
+ },
+ MuiTab: {
+ defaultProps: {
+ disableRipple: true
+ },
+ styleOverrides: {
+ root: {
+ fontSize: 14,
+ letterSpacing: 0.15,
+ lineHeight: 1.71
+ }
+ }
+ },
+ MuiTableHead: {
+ styleOverrides: {
+ root: {
+ [`&.${tableCellClasses.root}`]: {
+ fontSize: 11,
+ fontWeight: 600,
+ textTransform: 'uppercase'
+ }
+ }
+ }
+ },
+ MuiTableRow: {
+ styleOverrides: {
+ root: {
+ [`&:last-of-type .${tableCellClasses.root}`]: {
+ borderWidth: 0
+ }
+ }
+ }
+ },
+ MuiTextField: {
+ defaultProps: {
+ variant: 'filled'
+ }
+ }
+ };
+};
diff --git a/src/theme/base/create-options.js b/src/theme/base/create-options.js
new file mode 100644
index 000000000000..92e6a9b896ab
--- /dev/null
+++ b/src/theme/base/create-options.js
@@ -0,0 +1,27 @@
+import { createTypography } from './create-typography';
+import { createComponents } from './create-components';
+
+// Here we do not modify the "palette" and "shadows" because "light" and "dark" mode
+// may have different values.
+
+export const createOptions = (config) => {
+ const { direction = 'ltr' } = config;
+
+ return {
+ breakpoints: {
+ values: {
+ xs: 0,
+ sm: 600,
+ md: 900,
+ lg: 1200,
+ xl: 1440
+ }
+ },
+ components: createComponents(),
+ direction,
+ shape: {
+ borderRadius: 6
+ },
+ typography: createTypography()
+ };
+};
diff --git a/src/theme/base/create-typography.js b/src/theme/base/create-typography.js
new file mode 100644
index 000000000000..16bcd64a6f99
--- /dev/null
+++ b/src/theme/base/create-typography.js
@@ -0,0 +1,67 @@
+export const createTypography = () => {
+ return {
+ fontFamily: 'Inter, sans-serif',
+ h1: {
+ fontSize: 48,
+ fontWeight: 600,
+ lineHeight: 1.5
+ },
+ h2: {
+ fontSize: 36,
+ fontWeight: 600,
+ lineHeight: 1.5
+ },
+ h3: {
+ fontSize: 32,
+ fontWeight: 600,
+ lineHeight: 1.5
+ },
+ h4: {
+ fontSize: 24,
+ fontWeight: 600,
+ lineHeight: 1.5
+ },
+ h5: {
+ fontSize: 18,
+ fontWeight: 600,
+ lineHeight: 1.5
+ },
+ h6: {
+ fontSize: 16,
+ fontWeight: 600,
+ lineHeight: 1.5
+ },
+ body1: {
+ lineHeight: 1.5
+ },
+ body2: {
+ lineHeight: 1.6
+ },
+ subtitle1: {
+ fontSize: 16,
+ fontWeight: 500,
+ letterSpacing: 0,
+ lineHeight: 1.75
+ },
+ subtitle2: {
+ fontSize: 14,
+ fontWeight: 500,
+ letterSpacing: 0,
+ lineHeight: 1.75
+ },
+ caption: {
+ fontWeight: 400,
+ lineHeight: 1.6
+ },
+ overline: {
+ fontSize: 12,
+ fontWeight: 600,
+ letterSpacing: 1,
+ lineHeight: 2.46
+ },
+ button: {
+ fontWeight: 500,
+ textTransform: 'none'
+ }
+ };
+};
diff --git a/src/theme/colors.js b/src/theme/colors.js
new file mode 100644
index 000000000000..e008094db4d4
--- /dev/null
+++ b/src/theme/colors.js
@@ -0,0 +1,81 @@
+import { alpha } from "@mui/material/styles";
+
+const withAlphas = (color) => {
+ return {
+ ...color,
+ alpha4: alpha(color.main, 0.04),
+ alpha8: alpha(color.main, 0.08),
+ alpha12: alpha(color.main, 0.12),
+ alpha30: alpha(color.main, 0.3),
+ alpha50: alpha(color.main, 0.5),
+ };
+};
+
+export const neutral = {
+ 50: "#F9FAFB",
+ 100: "#F2F4F7",
+ 200: "#EAECF0",
+ 300: "#D0D5DD",
+ 400: "#98A2B3",
+ 500: "#667085",
+ 600: "#475467",
+ 700: "#344054",
+ 800: "#1D2939",
+ 900: "#101828",
+};
+
+export const blue = withAlphas({
+ light: "#003049",
+ main: "#003049",
+ dark: "#003049",
+ contrastText: "#FFFFFF",
+});
+
+export const green = withAlphas({
+ light: "#F77F00",
+ main: "#F77F00",
+ dark: "#F77F00",
+ contrastText: "#FFFFFF",
+});
+
+export const indigo = withAlphas({
+ light: "#EBEEFE",
+ main: "#635dff",
+ dark: "#4338CA",
+ contrastText: "#FFFFFF",
+});
+
+export const purple = withAlphas({
+ light: "#F4EBFF",
+ main: "#9E77ED",
+ dark: "#6941C6",
+ contrastText: "#FFFFFF",
+});
+
+export const success = withAlphas({
+ light: "#3FC79A",
+ main: "#10B981",
+ dark: "#0B815A",
+ contrastText: "#FFFFFF",
+});
+
+export const info = withAlphas({
+ light: "#CFF9FE",
+ main: "#06AED4",
+ dark: "#0E7090",
+ contrastText: "#FFFFFF",
+});
+
+export const warning = withAlphas({
+ light: "#FEF0C7",
+ main: "#F79009",
+ dark: "#B54708",
+ contrastText: "#FFFFFF",
+});
+
+export const error = withAlphas({
+ light: "#FEE4E2",
+ main: "#F04438",
+ dark: "#B42318",
+ contrastText: "#FFFFFF",
+});
diff --git a/src/theme/dark/create-components.js b/src/theme/dark/create-components.js
new file mode 100644
index 000000000000..a282b561a35b
--- /dev/null
+++ b/src/theme/dark/create-components.js
@@ -0,0 +1,209 @@
+import {
+ filledInputClasses,
+ paperClasses,
+ radioClasses,
+ switchClasses,
+ tableCellClasses,
+ tableRowClasses,
+} from "@mui/material";
+import { common } from "@mui/material/colors";
+import { alpha } from "@mui/material/styles";
+
+export const createComponents = ({ palette }) => {
+ return {
+ MuiAutocomplete: {
+ styleOverrides: {
+ paper: {
+ borderWidth: 1,
+ borderStyle: "solid",
+ borderColor: palette.neutral[600],
+ },
+ },
+ },
+ MuiAvatar: {
+ styleOverrides: {
+ root: {
+ backgroundColor: palette.neutral[800],
+ color: palette.text.secondary,
+ },
+ },
+ },
+ MuiButton: {
+ styleOverrides: {
+ root: {
+ "&:focus": {
+ boxShadow: `${alpha(palette.primary.main, 0.25)} 0 0 0 0.2rem`,
+ },
+ },
+ },
+ },
+ MuiCard: {
+ styleOverrides: {
+ root: {
+ [`&.${paperClasses.elevation1}`]: {
+ boxShadow: `0px 0px 1px ${palette.neutral[800]}, 0px 1px 3px ${alpha(
+ palette.neutral[900],
+ 0.12
+ )}`,
+ },
+ },
+ },
+ },
+ MuiChip: {
+ styleOverrides: {
+ avatar: {
+ backgroundColor: palette.neutral[800],
+ },
+ },
+ },
+ MuiInputBase: {
+ styleOverrides: {
+ input: {
+ "&::placeholder": {
+ color: palette.text.secondary,
+ },
+ },
+ },
+ },
+ MuiFilledInput: {
+ styleOverrides: {
+ root: {
+ backgroundColor: palette.background.paper,
+ borderColor: palette.neutral[600],
+ boxShadow: `0px 1px 2px 0px ${alpha(palette.neutral[900], 0.08)}`,
+ "&:hover": {
+ backgroundColor: palette.action.hover,
+ },
+ [`&.${filledInputClasses.disabled}`]: {
+ backgroundColor: palette.action.disabledBackground,
+ borderColor: palette.neutral[800],
+ boxShadow: "none",
+ },
+ [`&.${filledInputClasses.focused}`]: {
+ backgroundColor: "transparent",
+ borderColor: palette.primary.main,
+ boxShadow: `${alpha(palette.primary.main, 0.25)} 0 0 0 0.2rem`,
+ },
+ [`&.${filledInputClasses.error}`]: {
+ borderColor: palette.error.main,
+ boxShadow: `${alpha(palette.error.main, 0.25)} 0 0 0 0.2rem`,
+ },
+ },
+ },
+ },
+ MuiFormLabel: {
+ styleOverrides: {
+ root: {
+ color: palette.text.primary,
+ },
+ },
+ },
+ MuiRadio: {
+ defaultProps: {
+ checkedIcon: (
+
+
+
+
+
+ ),
+ icon: (
+
+
+
+
+ ),
+ },
+ styleOverrides: {
+ root: {
+ color: palette.text.secondary,
+ [`&:hover:not(.${radioClasses.checked})`]: {
+ color: palette.text.primary,
+ },
+ },
+ },
+ },
+ MuiSkeleton: {
+ styleOverrides: {
+ root: {
+ backgroundColor: palette.neutral[600],
+ },
+ },
+ },
+ MuiSwitch: {
+ styleOverrides: {
+ root: {
+ "&:focus-within": {
+ boxShadow: `${alpha(palette.primary.main, 0.25)} 0 0 0 0.2rem`,
+ },
+ },
+ switchBase: {
+ [`&.${switchClasses.disabled}`]: {
+ [`&+.${switchClasses.track}`]: {
+ backgroundColor: alpha(palette.text.primary, 0.08),
+ },
+ [`& .${switchClasses.thumb}`]: {
+ backgroundColor: alpha(palette.text.secondary, 0.86),
+ },
+ },
+ },
+ track: {
+ backgroundColor: palette.neutral[500],
+ },
+ thumb: {
+ backgroundColor: common.white,
+ },
+ },
+ },
+ MuiTableCell: {
+ styleOverrides: {
+ root: {
+ borderBottomWidth: 1,
+ borderBottomStyle: "solid",
+ borderBottomColor: palette.neutral[800],
+ },
+ },
+ },
+ MuiTableHead: {
+ styleOverrides: {
+ root: {
+ backgroundColor: palette.neutral[900],
+ borderBottomWidth: 1,
+ borderBottomStyle: "solid",
+ borderBottomColor: palette.neutral[800],
+ [`.${tableCellClasses.root}`]: {
+ color: palette.text.secondary,
+ },
+ },
+ },
+ },
+ MuiTableRow: {
+ styleOverrides: {
+ root: {
+ [`&.${tableRowClasses.hover}`]: {
+ backgroundColor: palette.neutral[900],
+ },
+ },
+ },
+ },
+ MuiToggleButton: {
+ styleOverrides: {
+ root: {
+ borderColor: palette.neutral[700],
+ },
+ },
+ },
+ };
+};
diff --git a/src/theme/dark/create-options.js b/src/theme/dark/create-options.js
new file mode 100644
index 000000000000..d8ff164cb48c
--- /dev/null
+++ b/src/theme/dark/create-options.js
@@ -0,0 +1,16 @@
+import { createComponents } from './create-components';
+import { createPalette } from './create-palette';
+import { createShadows } from './create-shadows';
+
+export const createOptions = (config) => {
+ const { colorPreset, contrast } = config;
+ const palette = createPalette({ colorPreset, contrast });
+ const components = createComponents({ palette });
+ const shadows = createShadows({ palette });
+
+ return {
+ components,
+ palette,
+ shadows
+ };
+};
diff --git a/src/theme/dark/create-palette.js b/src/theme/dark/create-palette.js
new file mode 100644
index 000000000000..46059219f9ac
--- /dev/null
+++ b/src/theme/dark/create-palette.js
@@ -0,0 +1,36 @@
+import { common } from '@mui/material/colors';
+import { alpha } from '@mui/material/styles';
+import { error, info, neutral, success, warning } from '../colors';
+import { getPrimary } from '../utils';
+
+export const createPalette = (config) => {
+ const { colorPreset, contrast } = config;
+
+ return {
+ action: {
+ active: neutral[400],
+ disabled: alpha(neutral[400], 0.38),
+ disabledBackground: alpha(neutral[400], 0.12),
+ focus: alpha(neutral[400], 0.16),
+ hover: alpha(neutral[400], 0.04),
+ selected: alpha(neutral[400], 0.12)
+ },
+ background: {
+ default: contrast === 'high' ? '#0A0F18' : '#0C121D',
+ paper: '#101826'
+ },
+ divider: neutral[800],
+ error,
+ info,
+ mode: 'dark',
+ neutral,
+ primary: getPrimary(colorPreset),
+ success,
+ text: {
+ primary: common.white,
+ secondary: '#97A1BA',
+ disabled: alpha(common.white, 0.38)
+ },
+ warning
+ };
+};
diff --git a/src/theme/dark/create-shadows.js b/src/theme/dark/create-shadows.js
new file mode 100644
index 000000000000..e83fd8258214
--- /dev/null
+++ b/src/theme/dark/create-shadows.js
@@ -0,0 +1,29 @@
+export const createShadows = (config) => {
+ return [
+ 'none',
+ '0px 1px 2px rgba(0, 0, 0, 0.24)',
+ '0px 1px 2px rgba(0, 0, 0, 0.24)',
+ '0px 1px 4px rgba(0, 0, 0, 0.24)',
+ '0px 1px 5px rgba(0, 0, 0, 0.24)',
+ '0px 1px 6px rgba(0, 0, 0, 0.24)',
+ '0px 2px 6px rgba(0, 0, 0, 0.24)',
+ '0px 3px 6px rgba(0, 0, 0, 0.24)',
+ '0px 4px 6px rgba(0, 0, 0, 0.24)',
+ '0px 5px 12px rgba(0, 0, 0, 0.24)',
+ '0px 5px 14px rgba(0, 0, 0, 0.24)',
+ '0px 5px 15px rgba(0, 0, 0, 0.24)',
+ '0px 6px 15px rgba(0, 0, 0, 0.24)',
+ '0px 7px 15px rgba(0, 0, 0, 0.24)',
+ '0px 8px 15px rgba(0, 0, 0, 0.24)',
+ '0px 9px 15px rgba(0, 0, 0, 0.24)',
+ '0px 10px 15px rgba(0, 0, 0, 0.24)',
+ '0px 12px 22px rgba(0, 0, 0, 0.24)',
+ '0px 13px 22px rgba(0, 0, 0, 0.24)',
+ '0px 14px 24px rgba(0, 0, 0, 0.24)',
+ '0px 20px 25px rgba(0, 0, 0, 0.24)',
+ '0px 25px 50px rgba(0, 0, 0, 0.24)',
+ '0px 25px 50px rgba(0, 0, 0, 0.24)',
+ '0px 25px 50px rgba(0, 0, 0, 0.24)',
+ '0px 25px 50px rgba(0, 0, 0, 0.24)'
+ ];
+};
diff --git a/src/theme/index.js b/src/theme/index.js
new file mode 100644
index 000000000000..6775235067fa
--- /dev/null
+++ b/src/theme/index.js
@@ -0,0 +1,28 @@
+import { createTheme as createMuiTheme, responsiveFontSizes } from '@mui/material/styles';
+import { createOptions as createBaseOptions } from './base/create-options';
+import { createOptions as createDarkOptions } from './dark/create-options';
+import { createOptions as createLightOptions } from './light/create-options';
+
+export const createTheme = (config) => {
+ let theme = createMuiTheme(
+ // Base options available for both dark and light palette modes
+ createBaseOptions({
+ direction: config.direction
+ }),
+ // Options based on selected palette mode, color preset and contrast
+ config.paletteMode === 'dark'
+ ? createDarkOptions({
+ colorPreset: config.colorPreset,
+ contrast: config.contrast
+ })
+ : createLightOptions({
+ colorPreset: config.colorPreset,
+ contrast: config.contrast
+ }));
+
+ if (config.responsiveFontSizes) {
+ theme = responsiveFontSizes(theme);
+ }
+
+ return theme;
+};
diff --git a/src/theme/light/create-components.js b/src/theme/light/create-components.js
new file mode 100644
index 000000000000..c015f5ce8ab6
--- /dev/null
+++ b/src/theme/light/create-components.js
@@ -0,0 +1,240 @@
+import {
+ filledInputClasses,
+ paperClasses,
+ radioClasses,
+ switchClasses,
+ tableCellClasses,
+ tableRowClasses
+} from '@mui/material';
+import { common } from '@mui/material/colors';
+import { alpha } from '@mui/material/styles';
+
+export const createComponents = ({ palette }) => {
+ return {
+ MuiAutocomplete: {
+ styleOverrides: {
+ paper: {
+ borderWidth: 1,
+ borderStyle: 'solid',
+ borderColor: palette.divider
+ }
+ }
+ },
+ MuiAvatar: {
+ styleOverrides: {
+ root: {
+ backgroundColor: palette.neutral[200],
+ color: palette.text.secondary
+ }
+ }
+ },
+ MuiButton: {
+ styleOverrides: {
+ contained: {
+ '&:focus': {
+ boxShadow: `${alpha(palette.primary.main, 0.25)} 0 0 0 0.2rem`
+ }
+ }
+ }
+ },
+ MuiCard: {
+ styleOverrides: {
+ root: {
+ [`&.${paperClasses.elevation1}`]: {
+ boxShadow: `0px 0px 1px ${palette.neutral[200]}, 0px 1px 3px ${alpha(palette.neutral[800],
+ 0.08)}`
+ }
+ }
+ }
+ },
+ MuiChip: {
+ styleOverrides: {
+ avatar: {
+ backgroundColor: palette.neutral[200]
+ }
+ }
+ },
+ MuiInputBase: {
+ styleOverrides: {
+ input: {
+ '&::placeholder': {
+ color: palette.text.secondary
+ }
+ }
+ }
+ },
+ MuiFilledInput: {
+ styleOverrides: {
+ root: {
+ backgroundColor: palette.background.paper,
+ borderColor: palette.neutral[300],
+ boxShadow: `0px 1px 2px 0px ${alpha(palette.neutral[800], 0.08)}`,
+ '&:hover': {
+ backgroundColor: palette.action.hover
+ },
+ [`&.${filledInputClasses.disabled}`]: {
+ backgroundColor: palette.action.disabledBackground,
+ borderColor: palette.neutral[300],
+ boxShadow: 'none'
+ },
+ [`&.${filledInputClasses.focused}`]: {
+ backgroundColor: 'transparent',
+ borderColor: palette.primary.main,
+ boxShadow: `${alpha(palette.primary.main, 0.25)} 0 0 0 0.2rem`
+ },
+ [`&.${filledInputClasses.error}`]: {
+ borderColor: palette.error.main,
+ boxShadow: `${alpha(palette.error.main, 0.25)} 0 0 0 0.2rem`
+ }
+ }
+ }
+ },
+ MuiFormLabel: {
+ styleOverrides: {
+ root: {
+ color: palette.text.primary
+ }
+ }
+ },
+ MuiRadio: {
+ defaultProps: {
+ checkedIcon: (
+
+
+
+
+
+ ),
+ icon: (
+
+
+
+
+ )
+ },
+ styleOverrides: {
+ root: {
+ color: palette.text.secondary,
+ [`&:hover:not(.${radioClasses.checked})`]: {
+ color: palette.text.primary
+ }
+ }
+ }
+ },
+ MuiSkeleton: {
+ styleOverrides: {
+ root: {
+ backgroundColor: palette.neutral[100]
+ }
+ }
+ },
+ MuiSwitch: {
+ styleOverrides: {
+ root: {
+ '&:focus-within': {
+ boxShadow: `${alpha(palette.primary.main, 0.25)} 0 0 0 0.2rem`
+ }
+ },
+ switchBase: {
+ [`&.${switchClasses.disabled}`]: {
+ [`&+.${switchClasses.track}`]: {
+ backgroundColor: alpha(palette.neutral[500], 0.08)
+ },
+ [`& .${switchClasses.thumb}`]: {
+ backgroundColor: alpha(palette.neutral[500], 0.26)
+ }
+ }
+ },
+ track: {
+ backgroundColor: palette.neutral[500]
+ },
+ thumb: {
+ backgroundColor: common.white
+ }
+ }
+ },
+ MuiTableCell: {
+ styleOverrides: {
+ root: {
+ borderBottomWidth: 1,
+ borderBottomStyle: 'solid',
+ borderBottomColor: palette.divider
+ }
+ }
+ },
+ MuiTableHead: {
+ styleOverrides: {
+ root: {
+ backgroundColor: palette.neutral[50],
+ borderBottomWidth: 1,
+ borderBottomStyle: 'solid',
+ borderBottomColor: palette.divider,
+ [`.${tableCellClasses.root}`]: {
+ color: palette.text.secondary
+ }
+ }
+ }
+ },
+ MuiTableRow: {
+ styleOverrides: {
+ root: {
+ [`&.${tableRowClasses.hover}`]: {
+ '&:hover': {
+ backgroundColor: palette.neutral[50]
+ }
+ }
+ }
+ }
+ },
+ MuiToggleButton: {
+ styleOverrides: {
+ root: {
+ borderColor: palette.divider
+ }
+ }
+ }
+ };
+};
diff --git a/src/theme/light/create-options.js b/src/theme/light/create-options.js
new file mode 100644
index 000000000000..d8ff164cb48c
--- /dev/null
+++ b/src/theme/light/create-options.js
@@ -0,0 +1,16 @@
+import { createComponents } from './create-components';
+import { createPalette } from './create-palette';
+import { createShadows } from './create-shadows';
+
+export const createOptions = (config) => {
+ const { colorPreset, contrast } = config;
+ const palette = createPalette({ colorPreset, contrast });
+ const components = createComponents({ palette });
+ const shadows = createShadows({ palette });
+
+ return {
+ components,
+ palette,
+ shadows
+ };
+};
diff --git a/src/theme/light/create-palette.js b/src/theme/light/create-palette.js
new file mode 100644
index 000000000000..5626cc6bdc69
--- /dev/null
+++ b/src/theme/light/create-palette.js
@@ -0,0 +1,36 @@
+import { common } from '@mui/material/colors';
+import { alpha } from '@mui/material/styles';
+import { error, info, neutral, success, warning } from '../colors';
+import { getPrimary } from '../utils';
+
+export const createPalette = (config) => {
+ const { colorPreset, contrast } = config;
+
+ return {
+ action: {
+ active: neutral[400],
+ disabled: alpha(neutral[900], 0.38),
+ disabledBackground: alpha(neutral[900], 0.12),
+ focus: alpha(neutral[900], 0.16),
+ hover: alpha(neutral[900], 0.04),
+ selected: alpha(neutral[900], 0.12)
+ },
+ background: {
+ default: contrast === 'high' ? '#FCFCFD' : common.white,
+ paper: common.white
+ },
+ divider: '#F2F4F7',
+ error,
+ info,
+ mode: 'light',
+ neutral,
+ primary: getPrimary(colorPreset),
+ success,
+ text: {
+ primary: neutral[900],
+ secondary: neutral[500],
+ disabled: alpha(neutral[900], 0.38)
+ },
+ warning
+ };
+};
diff --git a/src/theme/light/create-shadows.js b/src/theme/light/create-shadows.js
new file mode 100644
index 000000000000..fea93a0be27f
--- /dev/null
+++ b/src/theme/light/create-shadows.js
@@ -0,0 +1,35 @@
+import { alpha } from '@mui/material/styles';
+
+export const createShadows = (config) => {
+ const { palette } = config;
+ const layer1Color = palette.neutral[200];
+ const layer2Color = alpha(palette.neutral[800], 0.08);
+
+ return [
+ 'none',
+ `0px 0px 1px ${layer1Color}, 0px 1px 2px ${layer2Color}`,
+ `0px 0px 1px ${layer1Color}, 0px 1px 3px ${layer2Color}`,
+ `0px 0px 1px ${layer1Color}, 0px 3px 6px ${layer2Color}`,
+ `0px 0px 1px ${layer1Color}, 0px 3px 8px ${layer2Color}`,
+ `0px 0px 1px ${layer1Color}, 0px 4px 12px ${layer2Color}`,
+ `0px 0px 1px ${layer1Color}, 0px 6px 7px ${layer2Color}`,
+ `0px 0px 1px ${layer1Color}, 0px 6px 10px ${layer2Color}`,
+ `0px 0px 1px ${layer1Color}, 0px 6px 12px ${layer2Color}`,
+ `0px 0px 1px ${layer1Color}, 0px 6px 13px ${layer2Color}`,
+ `0px 0px 1px ${layer1Color}, 0px 6px 14px ${layer2Color}`,
+ `0px 0px 1px ${layer1Color}, 0px 6px 15px ${layer2Color}`,
+ `0px 0px 1px ${layer1Color}, 0px 6px 16px ${layer2Color}`,
+ `0px 0px 1px ${layer1Color}, 0px 6px 17px ${layer2Color}`,
+ `0px 0px 1px ${layer1Color}, 0px 6px 18px ${layer2Color}`,
+ `0px 0px 1px ${layer1Color}, 0px 6px 20px ${layer2Color}`,
+ `0px 0px 1px ${layer1Color}, 0px 10px 28px ${layer2Color}`,
+ `0px 0px 1px ${layer1Color}, 0px 10px 28px ${layer2Color}`,
+ `0px 0px 1px ${layer1Color}, 0px 10px 30px ${layer2Color}`,
+ `0px 0px 1px ${layer1Color}, 0px 10px 34px ${layer2Color}`,
+ `0px 0px 1px ${layer1Color}, 0px 10px 32px ${layer2Color}`,
+ `0px 0px 1px ${layer1Color}, 0px 10px 34px ${layer2Color}`,
+ `0px 0px 1px ${layer1Color}, 0px 10px 36px ${layer2Color}`,
+ `0px 0px 1px ${layer1Color}, 0px 10px 38px ${layer2Color}`,
+ `0px 0px 1px ${layer1Color}, 0px 10px 40px ${layer2Color}`
+ ];
+};
diff --git a/src/theme/utils.js b/src/theme/utils.js
new file mode 100644
index 000000000000..388a0e8d7e54
--- /dev/null
+++ b/src/theme/utils.js
@@ -0,0 +1,19 @@
+import { blue, green, indigo, purple } from "./colors";
+
+export const getPrimary = (preset) => {
+ switch (preset) {
+ case "blue":
+ return blue;
+ case "green":
+ return green;
+ case "indigo":
+ return indigo;
+ case "purple":
+ return purple;
+ default:
+ console.error(
+ 'Invalid color preset, accepted values: "blue", "green", "indigo" or "purple"".'
+ );
+ return indigo;
+ }
+};
diff --git a/src/utils/apply-filters.js b/src/utils/apply-filters.js
new file mode 100644
index 000000000000..547b7a19fd3d
--- /dev/null
+++ b/src/utils/apply-filters.js
@@ -0,0 +1,171 @@
+// NOTE: In really you'll use server filter, but you can also use this to filter the data on client.
+
+const contains = (rowValue, filterValue) => {
+ if (!rowValue) {
+ return false;
+ }
+
+ return rowValue.toLowerCase().includes(filterValue.toLowerCase());
+};
+
+const endsWith = (rowValue, filterValue) => {
+ if (!rowValue) {
+ return false;
+ }
+
+ return rowValue.substring(rowValue.length - filterValue.length) === filterValue;
+};
+
+const equals = (rowValue, filterValue) => {
+ if (!rowValue) {
+ return false;
+ }
+
+ // Here we evaluate == instead of === because values can be number | string
+ // eslint-disable-next-line eqeqeq
+ return rowValue == filterValue;
+};
+
+const greaterThan = (rowValue, filterValue) => {
+ if (!rowValue) {
+ return false;
+ }
+
+ return rowValue > filterValue;
+};
+
+const isAfter = (rowValue, filterValue) => {
+ if (!rowValue) {
+ return false;
+ }
+
+ return new Date(rowValue).getTime() > new Date(filterValue).getTime();
+};
+
+const isBlank = (rowValue) => {
+ if (rowValue === null || typeof rowValue === 'undefined') {
+ return true;
+ }
+
+ return false;
+};
+
+const isPresent = (rowValue) => {
+ if (rowValue === null || typeof rowValue === 'undefined') {
+ return false;
+ }
+
+ return true;
+};
+
+const lessThan = (rowValue, filterValue) => {
+ if (!rowValue) {
+ return false;
+ }
+
+ return rowValue < filterValue;
+};
+
+const isBefore = (rowValue, filterValue) => {
+ if (!rowValue) {
+ return false;
+ }
+
+ return new Date(rowValue).getTime() < new Date(filterValue).getTime();
+};
+
+const notContains = (rowValue, filterValue) => {
+ if (!rowValue) {
+ return false;
+ }
+
+ return !rowValue.includes(filterValue);
+};
+
+const notEqual = (rowValue, filterValue) => {
+ if (!rowValue) {
+ return false;
+ }
+
+ return rowValue !== filterValue;
+};
+
+const startsWith = (rowValue, filterValue) => {
+ if (!rowValue) {
+ return false;
+ }
+
+ return rowValue.substring(0, filterValue.length) === filterValue;
+};
+
+const checkFilter = (rowValue, filter) => {
+ switch (filter.operator) {
+ case 'contains':
+ return contains(rowValue, filter.value);
+
+ case 'endsWith':
+ return endsWith(rowValue, filter.value);
+
+ case 'equals':
+ return equals(rowValue, filter.value);
+
+ case 'greaterThan':
+ return greaterThan(rowValue, filter.value);
+
+ case 'isAfter':
+ return isAfter(rowValue, filter.value);
+
+ case 'isBefore':
+ return isBefore(rowValue, filter.value);
+
+ case 'isBlank':
+ return isBlank(rowValue);
+
+ case 'isPresent':
+ return isPresent(rowValue);
+
+ case 'lessThan':
+ return lessThan(rowValue, filter.value);
+
+ case 'notContains':
+ return notContains(rowValue, filter.value);
+
+ case 'notEqual':
+ return notEqual(rowValue, filter.value);
+
+ case 'startsWith':
+ return startsWith(rowValue, filter.value);
+
+ default:
+ throw new Error('Provided an unknown filter operator');
+ }
+};
+
+export const applyFilters = (rows, filters = []) => {
+ if (filters.length === 0) {
+ return rows;
+ }
+
+ return rows.filter((row) => {
+ let passedAll = true;
+
+ for (let i = 0; i < filters.length; i++) {
+ const filter = filters[i];
+ const rowValue = row[filter.property];
+ let passed = true;
+
+ try {
+ passed = checkFilter(rowValue, filter);
+ } catch (err) {
+ console.warn('[Apply Filters] Skipped filter due to error', err);
+ }
+
+ if (!passed) {
+ passedAll = false;
+ break;
+ }
+ }
+
+ return passedAll;
+ });
+};
diff --git a/src/utils/apply-pagination.js b/src/utils/apply-pagination.js
new file mode 100644
index 000000000000..69401ceafbd4
--- /dev/null
+++ b/src/utils/apply-pagination.js
@@ -0,0 +1,3 @@
+export function applyPagination(documents, page, rowsPerPage) {
+ return documents.slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage);
+}
diff --git a/src/utils/apply-sort.js b/src/utils/apply-sort.js
new file mode 100644
index 000000000000..6d8126f7af9b
--- /dev/null
+++ b/src/utils/apply-sort.js
@@ -0,0 +1,37 @@
+function descendingComparator(a, b, sortBy) {
+ // When compared to something undefined, always returns false.
+ // This means that if a field does not exist from either element ('a' or 'b') the return will be 0.
+
+ if (b[sortBy] < a[sortBy]) {
+ return -1;
+ }
+
+ if (b[sortBy] > a[sortBy]) {
+ return 1;
+ }
+
+ return 0;
+}
+
+function getComparator(sortDir, sortBy) {
+ return (sortDir === 'desc'
+ ? (a, b) => descendingComparator(a, b, sortBy)
+ : (a, b) => -descendingComparator(a, b, sortBy));
+}
+
+export function applySort(documents, sortBy, sortDir) {
+ const comparator = getComparator(sortDir, sortBy);
+ const stabilizedThis = documents.map((el, index) => [el, index]);
+
+ stabilizedThis.sort((a, b) => {
+ const newOrder = comparator(a[0], b[0]);
+
+ if (newOrder !== 0) {
+ return newOrder;
+ }
+
+ return a[1] - b[1];
+ });
+
+ return stabilizedThis.map((el) => el[0]);
+}
diff --git a/src/utils/code-style.js b/src/utils/code-style.js
new file mode 100644
index 000000000000..8a2ad37cae2a
--- /dev/null
+++ b/src/utils/code-style.js
@@ -0,0 +1,158 @@
+import { neutral } from '../theme/colors';
+
+export const codeStyle = {
+ 'code[class*="language-"]': {
+ color: neutral[50],
+ background: 'none',
+ textShadow: '0 1px rgba(0, 0, 0, 0.3)',
+ fontFamily: '\'Roboto Mono\', Consolas, Monaco, \'Andale Mono\', \'Ubuntu Mono\', monospace',
+ fontSize: '14px',
+ textAlign: 'left',
+ whiteSpace: 'pre',
+ wordSpacing: 'normal',
+ wordBreak: 'normal',
+ wordWrap: 'normal',
+ lineHeight: '1.5',
+ MozTabSize: '4',
+ OTabSize: '4',
+ tabSize: '4',
+ WebkitHyphens: 'none',
+ MozHyphens: 'none',
+ msHyphens: 'none',
+ hyphens: 'none'
+ },
+ 'pre[class*="language-"]': {
+ color: neutral[50],
+ background: neutral[800],
+ textShadow: '0 1px rgba(0, 0, 0, 0.3)',
+ fontFamily: '\'Roboto Mono\', Consolas, Monaco, \'Andale Mono\', \'Ubuntu Mono\', monospace',
+ fontSize: '14px',
+ textAlign: 'left',
+ whiteSpace: 'pre',
+ wordSpacing: 'normal',
+ wordBreak: 'normal',
+ wordWrap: 'normal',
+ lineHeight: '1.5',
+ MozTabSize: '4',
+ OTabSize: '4',
+ tabSize: '4',
+ WebkitHyphens: 'none',
+ MozHyphens: 'none',
+ msHyphens: 'none',
+ hyphens: 'none',
+ padding: '1em',
+ margin: '.5em 0',
+ overflow: 'auto',
+ borderRadius: '8px'
+ },
+ ':not(pre) > code[class*="language-"]': {
+ background: neutral[800],
+ padding: '.1em',
+ borderRadius: '.3em',
+ whiteSpace: 'normal'
+ },
+ comment: {
+ color: '#6272a4'
+ },
+ prolog: {
+ color: '#6272a4'
+ },
+ doctype: {
+ color: '#6272a4'
+ },
+ cdata: {
+ color: '#6272a4'
+ },
+ punctuation: {
+ color: '#f8f8f2'
+ },
+ '.namespace': {
+ Opacity: '.7'
+ },
+ property: {
+ color: '#ff79c6'
+ },
+ tag: {
+ color: '#ff79c6'
+ },
+ constant: {
+ color: '#ff79c6'
+ },
+ symbol: {
+ color: '#ff79c6'
+ },
+ deleted: {
+ color: '#ff79c6'
+ },
+ boolean: {
+ color: '#bd93f9'
+ },
+ number: {
+ color: '#bd93f9'
+ },
+ selector: {
+ color: '#50fa7b'
+ },
+ 'attr-name': {
+ color: '#50fa7b'
+ },
+ string: {
+ color: '#50fa7b'
+ },
+ char: {
+ color: '#50fa7b'
+ },
+ builtin: {
+ color: '#50fa7b'
+ },
+ inserted: {
+ color: '#50fa7b'
+ },
+ operator: {
+ color: '#f8f8f2'
+ },
+ entity: {
+ color: '#f8f8f2',
+ cursor: 'help'
+ },
+ url: {
+ color: '#f8f8f2'
+ },
+ '.language-css .token.string': {
+ color: '#f8f8f2'
+ },
+ '.style .token.string': {
+ color: '#f8f8f2'
+ },
+ variable: {
+ color: '#f8f8f2'
+ },
+ atrule: {
+ color: '#f1fa8c'
+ },
+ 'attr-value': {
+ color: '#f1fa8c'
+ },
+ function: {
+ color: '#f1fa8c'
+ },
+ 'class-name': {
+ color: '#f1fa8c'
+ },
+ keyword: {
+ color: '#8be9fd'
+ },
+ regex: {
+ color: '#ffb86c'
+ },
+ important: {
+ color: '#ffb86c',
+ fontWeight: 'bold'
+ },
+ bold: {
+ fontWeight: 'bold'
+ },
+ italic: {
+ fontStyle: 'italic'
+ }
+};
diff --git a/src/utils/create-emotion-cache.js b/src/utils/create-emotion-cache.js
new file mode 100644
index 000000000000..d058f7a25946
--- /dev/null
+++ b/src/utils/create-emotion-cache.js
@@ -0,0 +1,5 @@
+import createCache from '@emotion/cache';
+
+export const createEmotionCache = () => {
+ return createCache({ key: 'css', prepend: true });
+};
diff --git a/src/utils/create-resource-id.js b/src/utils/create-resource-id.js
new file mode 100644
index 000000000000..30065ced6261
--- /dev/null
+++ b/src/utils/create-resource-id.js
@@ -0,0 +1,5 @@
+export const createResourceId = () => {
+ const arr = new Uint8Array(12);
+ window.crypto.getRandomValues(arr);
+ return Array.from(arr, (v) => v.toString(16).padStart(2, '0')).join('');
+};
diff --git a/src/utils/deep-copy.js b/src/utils/deep-copy.js
new file mode 100644
index 000000000000..9df7ee57a09e
--- /dev/null
+++ b/src/utils/deep-copy.js
@@ -0,0 +1,24 @@
+// eslint-disable-next-line consistent-return
+export function deepCopy(obj) {
+ if (typeof obj !== 'object' || obj === null) {
+ return obj;
+ }
+
+ if (obj instanceof Date) {
+ return new Date(obj.getTime());
+ }
+
+ if (obj instanceof Array) {
+ return obj.reduce((arr, item, index) => {
+ arr[index] = deepCopy(item);
+ return arr;
+ }, []);
+ }
+
+ if (obj instanceof Object) {
+ return Object.keys(obj).reduce((newObj, key) => {
+ newObj[key] = deepCopy(obj[key]);
+ return newObj;
+ }, {});
+ }
+}
diff --git a/src/utils/docs.js b/src/utils/docs.js
new file mode 100644
index 000000000000..15da9e9f42ec
--- /dev/null
+++ b/src/utils/docs.js
@@ -0,0 +1,39 @@
+import { lstatSync, readdirSync, readFileSync } from 'fs';
+import { join } from 'path';
+import matter from 'gray-matter';
+
+const docsDir = join(process.cwd(), 'docs');
+
+export const getArticle = (slug, fields = []) => {
+ const filePath = join(docsDir, `${slug}.md`);
+ const fileData = readFileSync(filePath, 'utf8');
+ const { data, content } = matter(fileData);
+
+ const article = {};
+
+ fields.forEach((field) => {
+ if (field === 'slug') {
+ article[field] = slug;
+ }
+
+ if (field === 'content') {
+ article[field] = content;
+ }
+
+ if (typeof data[field] !== 'undefined') {
+ article[field] = data[field];
+ }
+ });
+
+ return article;
+};
+
+export const getArticles = (fields = []) => {
+ // Read all files recursively from docs directory
+ const filePaths = readdirSync(docsDir).filter((item) => {
+ const currPath = join(docsDir, item);
+ return !lstatSync(currPath).isDirectory();
+ });
+
+ return filePaths.map((filePath) => getArticle(filePath.replace(/\.md$/, ''), fields));
+};
diff --git a/src/utils/filter-operators.js b/src/utils/filter-operators.js
new file mode 100644
index 000000000000..bad9d75f58e9
--- /dev/null
+++ b/src/utils/filter-operators.js
@@ -0,0 +1,71 @@
+export const containsOperator = {
+ label: 'contains',
+ name: 'contains',
+ field: 'string'
+};
+
+export const endsWithOperator = {
+ label: 'ends with',
+ name: 'endsWith',
+ field: 'string'
+};
+
+export const equalsOperator = {
+ label: 'equals',
+ name: 'equals',
+ field: 'string'
+};
+
+export const greaterThanOperator = {
+ label: 'greater than',
+ name: 'greaterThan',
+ field: 'number'
+};
+
+export const isAfterOperator = {
+ label: 'is after',
+ name: 'isAfter',
+ field: 'date'
+};
+
+export const isBeforeOperator = {
+ label: 'is before',
+ name: 'isBefore',
+ field: 'date'
+};
+
+export const isBlankOperator = {
+ label: 'is blank',
+ name: 'isBlank',
+ field: undefined
+};
+
+export const isPresentOperator = {
+ label: 'is present',
+ name: 'isPresent',
+ field: undefined
+};
+
+export const lessThanOperator = {
+ label: 'less than',
+ name: 'lessThan',
+ field: 'number'
+};
+
+export const notContainsOperator = {
+ label: 'not contains',
+ name: 'notContains',
+ field: 'string'
+};
+
+export const notEqualOperator = {
+ label: 'not equal',
+ name: 'notEqual',
+ field: 'string'
+};
+
+export const startsWithOperator = {
+ label: 'starts with',
+ name: 'startsWith',
+ field: 'string'
+};
diff --git a/src/utils/get-initials.js b/src/utils/get-initials.js
new file mode 100644
index 000000000000..84d62a7afbcb
--- /dev/null
+++ b/src/utils/get-initials.js
@@ -0,0 +1,6 @@
+export const getInitials = (name = '') => name
+ .replace(/\s+/, ' ')
+ .split(' ')
+ .slice(0, 2)
+ .map((v) => v && v[0].toUpperCase())
+ .join('');
diff --git a/src/utils/jwt.js b/src/utils/jwt.js
new file mode 100644
index 000000000000..5c93551a0716
--- /dev/null
+++ b/src/utils/jwt.js
@@ -0,0 +1,70 @@
+/* eslint-disable no-bitwise */
+export const JWT_SECRET = 'devias-top-secret-key';
+export const JWT_EXPIRES_IN = 3600 * 24 * 2; // 2 days
+
+// Since we are unable to sign a JWT in a browser
+// because "jsonwebtoken" library is available on server side only, NodeJS environment
+// we simply simulate a signed token, no complex checks because on server side
+// you're using the library
+export const sign = (payload, privateKey, header) => {
+ const now = new Date();
+ const newHeader = { ...header };
+ newHeader.expiresIn = new Date(now.getTime() + newHeader.expiresIn);
+ const encodedHeader = btoa(JSON.stringify(newHeader));
+ const encodedPayload = btoa(JSON.stringify(payload));
+ const signature = btoa(Array
+ .from(encodedPayload)
+ .map((item, key) => (String.fromCharCode(item.charCodeAt(0) ^ privateKey[key
+ % privateKey.length].charCodeAt(0))))
+ .join(''));
+
+ return `${encodedHeader}.${encodedPayload}.${signature}`;
+};
+
+// Since we create a fake signed token, we have to implement a fake jwt decode
+// platform to simulate "jwt-decode" library.
+export const decode = (token) => {
+ const [encodedHeader, encodedPayload, signature] = token.split('.');
+ const header = JSON.parse(atob(encodedHeader));
+ const payload = JSON.parse(atob(encodedPayload));
+ const now = new Date();
+
+ if (now < header.expiresIn) {
+ throw new Error('Expired token');
+ }
+
+ const verifiedSignature = btoa(Array
+ .from(encodedPayload)
+ .map((item, key) => (String.fromCharCode(item.charCodeAt(0) ^ JWT_SECRET[key
+ % JWT_SECRET.length].charCodeAt(0))))
+ .join(''));
+
+ if (verifiedSignature !== signature) {
+ throw new Error('Invalid signature');
+ }
+
+ return payload;
+};
+
+export const verify = (token, privateKey) => {
+ const [encodedHeader, encodedPayload, signature] = token.split('.');
+ const header = JSON.parse(atob(encodedHeader));
+ const payload = JSON.parse(atob(encodedPayload));
+ const now = new Date();
+
+ if (now < header.expiresIn) {
+ throw new Error('Expired token');
+ }
+
+ const verifiedSignature = btoa(Array
+ .from(encodedPayload)
+ .map((item, key) => (String.fromCharCode(item.charCodeAt(0) ^ privateKey[key
+ % privateKey.length].charCodeAt(0))))
+ .join(''));
+
+ if (verifiedSignature !== signature) {
+ throw new Error('Invalid signature');
+ }
+
+ return payload;
+};
diff --git a/src/utils/noop.js b/src/utils/noop.js
new file mode 100644
index 000000000000..894b8d23a165
--- /dev/null
+++ b/src/utils/noop.js
@@ -0,0 +1 @@
+export const noop = (...args) => { };
diff --git a/src/utils/obj-from-array.js b/src/utils/obj-from-array.js
new file mode 100644
index 000000000000..100c7ddc3d16
--- /dev/null
+++ b/src/utils/obj-from-array.js
@@ -0,0 +1,4 @@
+export const objFromArray = (arr, key = 'id') => arr.reduce((accumulator, current) => {
+ accumulator[current[key]] = current;
+ return accumulator;
+}, {});
diff --git a/src/utils/wait.js b/src/utils/wait.js
new file mode 100644
index 000000000000..59ff5bb21225
--- /dev/null
+++ b/src/utils/wait.js
@@ -0,0 +1 @@
+export const wait = (time) => new Promise((res) => setTimeout(res, time));
diff --git a/staticwebapp.config.json b/staticwebapp.config.json
index 0c36ddcac257..85378b1b9dea 100644
--- a/staticwebapp.config.json
+++ b/staticwebapp.config.json
@@ -6,105 +6,57 @@
"cache-control": "must-revalidate, max-age=15770000"
}
},
- {
- "route": "/login",
- "rewrite": "/.auth/login/aad"
- },
- {
- "route": "/.auth/login/twitter",
- "statusCode": 404
- },
- {
- "route": "/.auth/login/github",
- "statusCode": 404
- },
{
"route": "/logout",
"redirect": "/.auth/logout?post_logout_redirect_uri=/LogoutRedirect"
},
{
- "route": "/api/ExecSAMSetup",
- "allowedRoles": ["admin", "editor", "readonly", "authenticated", "anonymous"]
- },
- {
- "route": "/api/AddStandardsDeploy",
- "allowedRoles": ["admin"]
- },
- {
- "route": "/LogoutRedirect",
- "allowedRoles": ["admin", "editor", "readonly", "authenticated", "anonymous"]
- },
- {
- "route": "/404",
- "allowedRoles": ["admin", "editor", "readonly", "authenticated", "anonymous"]
- },
- {
- "route": "/api/RemoveStandard",
- "allowedRoles": ["admin"]
- },
- {
- "route": "/api/add*",
- "allowedRoles": ["admin", "editor"]
- },
- {
- "route": "/api/edit*",
- "allowedRoles": ["admin", "editor"]
- },
- {
- "route": "/api/ExecSendPush",
- "allowedRoles": ["admin", "editor", "readonly"]
- },
- {
- "route": "/api/ExecExcludeTenant",
- "allowedRoles": ["admin"]
- },
- {
- "route": "/api/Exec*",
- "allowedRoles": ["admin", "editor"]
- },
- {
- "route": "/api/Remove*",
- "allowedRoles": ["admin", "editor"]
- },
- {
- "route": "/cipp/*",
- "allowedRoles": ["admin"]
- },
- {
- "route": "/tenant/standards/*",
- "allowedRoles": ["admin"]
+ "route": "/api/Webhook",
+ "allowedRoles": [
+ "admin",
+ "editor",
+ "readonly",
+ "authenticated",
+ "anonymous"
+ ]
},
{
"route": "/",
- "allowedRoles": ["admin", "editor", "readonly", "reader", "authenticated", "anonymous"]
- },
- {
- "route": "/api/Public*",
- "allowedRoles": ["admin", "editor", "readonly", "reader", "authenticated", "anonymous"]
+ "allowedRoles": [
+ "admin",
+ "editor",
+ "readonly",
+ "reader",
+ "authenticated",
+ "anonymous"
+ ]
},
{
"route": "*",
- "allowedRoles": ["admin", "editor", "readonly", "reader"]
+ "allowedRoles": [
+ "admin",
+ "editor",
+ "readonly",
+ "reader",
+ "authenticated",
+ "anonymous"
+ ]
}
],
"navigationFallback": {
"rewrite": "index.html",
"exclude": ["/static/*.{png,jpg,gif}", "/css/*"]
},
- "responseOverrides": {
- "401": {
- "rewrite": "/401"
- },
- "403": {
- "rewrite": "/403"
- },
- "404": {
- "rewrite": "/404"
- }
- },
+
"globalHeaders": {
- "content-security-policy": "default-src https: blob: 'unsafe-eval' 'unsafe-inline'; object-src 'self' blob:; img-src 'self' blob: data: *"
+ "content-security-policy": "default-src https: 'unsafe-eval' 'unsafe-inline'; object-src 'none'; img-src 'self' data: *"
},
+ "platformErrorOverrides": [
+ {
+ "errorType": "Unauthenticated",
+ "serve": "/login"
+ }
+ ],
"mimeTypes": {
".json": "text/json"
}
diff --git a/yarn.lock b/yarn.lock
new file mode 100644
index 000000000000..de57efb0d312
--- /dev/null
+++ b/yarn.lock
@@ -0,0 +1,6223 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@ampproject/remapping@^2.2.0":
+ "integrity" "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="
+ "resolved" "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz"
+ "version" "2.3.0"
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.5"
+ "@jridgewell/trace-mapping" "^0.3.24"
+
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.24.7":
+ "integrity" "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA=="
+ "resolved" "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/highlight" "^7.24.7"
+ "picocolors" "^1.0.0"
+
+"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.24.8":
+ "integrity" "sha512-c4IM7OTg6k1Q+AJ153e2mc2QVTezTwnb4VzquwcyiEzGnW0Kedv4do/TrkU98qPeC5LNiMt/QXwIjzYXLBpyZg=="
+ "resolved" "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.8.tgz"
+ "version" "7.24.8"
+
+"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.0.0-0 || ^8.0.0-0 <8.0.0", "@babel/core@^7.12.0", "@babel/core@^7.13.0", "@babel/core@^7.19.6", "@babel/core@^7.4.0 || ^8.0.0-0 <8.0.0":
+ "integrity" "sha512-6AWcmZC/MZCO0yKys4uhg5NlxL0ESF3K6IAaoQ+xSXvPyPyxNWRafP+GDbI88Oh68O7QkJgmEtedWPM9U0pZNg=="
+ "resolved" "https://registry.npmjs.org/@babel/core/-/core-7.24.8.tgz"
+ "version" "7.24.8"
+ dependencies:
+ "@ampproject/remapping" "^2.2.0"
+ "@babel/code-frame" "^7.24.7"
+ "@babel/generator" "^7.24.8"
+ "@babel/helper-compilation-targets" "^7.24.8"
+ "@babel/helper-module-transforms" "^7.24.8"
+ "@babel/helpers" "^7.24.8"
+ "@babel/parser" "^7.24.8"
+ "@babel/template" "^7.24.7"
+ "@babel/traverse" "^7.24.8"
+ "@babel/types" "^7.24.8"
+ "convert-source-map" "^2.0.0"
+ "debug" "^4.1.0"
+ "gensync" "^1.0.0-beta.2"
+ "json5" "^2.2.3"
+ "semver" "^6.3.1"
+
+"@babel/generator@^7.24.8":
+ "integrity" "sha512-47DG+6F5SzOi0uEvK4wMShmn5yY0mVjVJoWTphdY2B4Rx9wHgjK7Yhtr0ru6nE+sn0v38mzrWOlah0p/YlHHOQ=="
+ "resolved" "https://registry.npmjs.org/@babel/generator/-/generator-7.24.8.tgz"
+ "version" "7.24.8"
+ dependencies:
+ "@babel/types" "^7.24.8"
+ "@jridgewell/gen-mapping" "^0.3.5"
+ "@jridgewell/trace-mapping" "^0.3.25"
+ "jsesc" "^2.5.1"
+
+"@babel/helper-annotate-as-pure@^7.24.7":
+ "integrity" "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/types" "^7.24.7"
+
+"@babel/helper-builder-binary-assignment-operator-visitor@^7.24.7":
+ "integrity" "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/traverse" "^7.24.7"
+ "@babel/types" "^7.24.7"
+
+"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.24.7", "@babel/helper-compilation-targets@^7.24.8":
+ "integrity" "sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz"
+ "version" "7.24.8"
+ dependencies:
+ "@babel/compat-data" "^7.24.8"
+ "@babel/helper-validator-option" "^7.24.8"
+ "browserslist" "^4.23.1"
+ "lru-cache" "^5.1.1"
+ "semver" "^6.3.1"
+
+"@babel/helper-create-class-features-plugin@^7.24.7", "@babel/helper-create-class-features-plugin@^7.24.8":
+ "integrity" "sha512-4f6Oqnmyp2PP3olgUMmOwC3akxSm5aBYraQ6YDdKy7NcAMkDECHWG0DEnV6M2UAkERgIBhYt8S27rURPg7SxWA=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.8.tgz"
+ "version" "7.24.8"
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.24.7"
+ "@babel/helper-environment-visitor" "^7.24.7"
+ "@babel/helper-function-name" "^7.24.7"
+ "@babel/helper-member-expression-to-functions" "^7.24.8"
+ "@babel/helper-optimise-call-expression" "^7.24.7"
+ "@babel/helper-replace-supers" "^7.24.7"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7"
+ "@babel/helper-split-export-declaration" "^7.24.7"
+ "semver" "^6.3.1"
+
+"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.24.7":
+ "integrity" "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.24.7"
+ "regexpu-core" "^5.3.1"
+ "semver" "^6.3.1"
+
+"@babel/helper-define-polyfill-provider@^0.6.1", "@babel/helper-define-polyfill-provider@^0.6.2":
+ "integrity" "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz"
+ "version" "0.6.2"
+ dependencies:
+ "@babel/helper-compilation-targets" "^7.22.6"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "debug" "^4.1.1"
+ "lodash.debounce" "^4.0.8"
+ "resolve" "^1.14.2"
+
+"@babel/helper-environment-visitor@^7.24.7":
+ "integrity" "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/types" "^7.24.7"
+
+"@babel/helper-function-name@^7.24.7":
+ "integrity" "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/template" "^7.24.7"
+ "@babel/types" "^7.24.7"
+
+"@babel/helper-hoist-variables@^7.24.7":
+ "integrity" "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/types" "^7.24.7"
+
+"@babel/helper-member-expression-to-functions@^7.24.7", "@babel/helper-member-expression-to-functions@^7.24.8":
+ "integrity" "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz"
+ "version" "7.24.8"
+ dependencies:
+ "@babel/traverse" "^7.24.8"
+ "@babel/types" "^7.24.8"
+
+"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.24.7":
+ "integrity" "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/traverse" "^7.24.7"
+ "@babel/types" "^7.24.7"
+
+"@babel/helper-module-transforms@^7.24.7", "@babel/helper-module-transforms@^7.24.8":
+ "integrity" "sha512-m4vWKVqvkVAWLXfHCCfff2luJj86U+J0/x+0N3ArG/tP0Fq7zky2dYwMbtPmkc/oulkkbjdL3uWzuoBwQ8R00Q=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.8.tgz"
+ "version" "7.24.8"
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.24.7"
+ "@babel/helper-module-imports" "^7.24.7"
+ "@babel/helper-simple-access" "^7.24.7"
+ "@babel/helper-split-export-declaration" "^7.24.7"
+ "@babel/helper-validator-identifier" "^7.24.7"
+
+"@babel/helper-optimise-call-expression@^7.24.7":
+ "integrity" "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/types" "^7.24.7"
+
+"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.24.8", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
+ "integrity" "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz"
+ "version" "7.24.8"
+
+"@babel/helper-remap-async-to-generator@^7.24.7":
+ "integrity" "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.24.7"
+ "@babel/helper-environment-visitor" "^7.24.7"
+ "@babel/helper-wrap-function" "^7.24.7"
+
+"@babel/helper-replace-supers@^7.24.7":
+ "integrity" "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.24.7"
+ "@babel/helper-member-expression-to-functions" "^7.24.7"
+ "@babel/helper-optimise-call-expression" "^7.24.7"
+
+"@babel/helper-simple-access@^7.24.7":
+ "integrity" "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/traverse" "^7.24.7"
+ "@babel/types" "^7.24.7"
+
+"@babel/helper-skip-transparent-expression-wrappers@^7.24.7":
+ "integrity" "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/traverse" "^7.24.7"
+ "@babel/types" "^7.24.7"
+
+"@babel/helper-split-export-declaration@^7.24.7":
+ "integrity" "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/types" "^7.24.7"
+
+"@babel/helper-string-parser@^7.24.8":
+ "integrity" "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz"
+ "version" "7.24.8"
+
+"@babel/helper-validator-identifier@^7.24.7":
+ "integrity" "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz"
+ "version" "7.24.7"
+
+"@babel/helper-validator-option@^7.24.7", "@babel/helper-validator-option@^7.24.8":
+ "integrity" "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz"
+ "version" "7.24.8"
+
+"@babel/helper-wrap-function@^7.24.7":
+ "integrity" "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw=="
+ "resolved" "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-function-name" "^7.24.7"
+ "@babel/template" "^7.24.7"
+ "@babel/traverse" "^7.24.7"
+ "@babel/types" "^7.24.7"
+
+"@babel/helpers@^7.24.8":
+ "integrity" "sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ=="
+ "resolved" "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.8.tgz"
+ "version" "7.24.8"
+ dependencies:
+ "@babel/template" "^7.24.7"
+ "@babel/types" "^7.24.8"
+
+"@babel/highlight@^7.24.7":
+ "integrity" "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw=="
+ "resolved" "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.24.7"
+ "chalk" "^2.4.2"
+ "js-tokens" "^4.0.0"
+ "picocolors" "^1.0.0"
+
+"@babel/parser@^7.24.7", "@babel/parser@^7.24.8":
+ "integrity" "sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w=="
+ "resolved" "https://registry.npmjs.org/@babel/parser/-/parser-7.24.8.tgz"
+ "version" "7.24.8"
+
+"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.7":
+ "integrity" "sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.7":
+ "integrity" "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.7":
+ "integrity" "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7"
+ "@babel/plugin-transform-optional-chaining" "^7.24.7"
+
+"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.24.7":
+ "integrity" "sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2":
+ "integrity" "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz"
+ "version" "7.21.0-placeholder-for-preset-env.2"
+
+"@babel/plugin-syntax-async-generators@^7.8.4":
+ "integrity" "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz"
+ "version" "7.8.4"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-class-properties@^7.12.13":
+ "integrity" "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz"
+ "version" "7.12.13"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-syntax-class-static-block@^7.14.5":
+ "integrity" "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz"
+ "version" "7.14.5"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-dynamic-import@^7.8.3":
+ "integrity" "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz"
+ "version" "7.8.3"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-export-namespace-from@^7.8.3":
+ "integrity" "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz"
+ "version" "7.8.3"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.3"
+
+"@babel/plugin-syntax-import-assertions@^7.24.7":
+ "integrity" "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-syntax-import-attributes@^7.24.7":
+ "integrity" "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-syntax-import-meta@^7.10.4":
+ "integrity" "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz"
+ "version" "7.10.4"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-json-strings@^7.8.3":
+ "integrity" "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz"
+ "version" "7.8.3"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-jsx@^7.24.7":
+ "integrity" "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-syntax-logical-assignment-operators@^7.10.4":
+ "integrity" "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz"
+ "version" "7.10.4"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3":
+ "integrity" "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz"
+ "version" "7.8.3"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-numeric-separator@^7.10.4":
+ "integrity" "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz"
+ "version" "7.10.4"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-object-rest-spread@^7.8.3":
+ "integrity" "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz"
+ "version" "7.8.3"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-catch-binding@^7.8.3":
+ "integrity" "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz"
+ "version" "7.8.3"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-chaining@^7.8.3":
+ "integrity" "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz"
+ "version" "7.8.3"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-private-property-in-object@^7.14.5":
+ "integrity" "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz"
+ "version" "7.14.5"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-top-level-await@^7.14.5":
+ "integrity" "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz"
+ "version" "7.14.5"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-typescript@^7.24.7":
+ "integrity" "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-syntax-unicode-sets-regex@^7.18.6":
+ "integrity" "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz"
+ "version" "7.18.6"
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-transform-arrow-functions@^7.24.7":
+ "integrity" "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-async-generator-functions@^7.24.7":
+ "integrity" "sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-remap-async-to-generator" "^7.24.7"
+ "@babel/plugin-syntax-async-generators" "^7.8.4"
+
+"@babel/plugin-transform-async-to-generator@^7.24.7":
+ "integrity" "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-module-imports" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-remap-async-to-generator" "^7.24.7"
+
+"@babel/plugin-transform-block-scoped-functions@^7.24.7":
+ "integrity" "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-block-scoping@^7.24.7":
+ "integrity" "sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-class-properties@^7.24.7":
+ "integrity" "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-class-static-block@^7.24.7":
+ "integrity" "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/plugin-syntax-class-static-block" "^7.14.5"
+
+"@babel/plugin-transform-classes@^7.24.8":
+ "integrity" "sha512-VXy91c47uujj758ud9wx+OMgheXm4qJfyhj1P18YvlrQkNOSrwsteHk+EFS3OMGfhMhpZa0A+81eE7G4QC+3CA=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.8.tgz"
+ "version" "7.24.8"
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.24.7"
+ "@babel/helper-compilation-targets" "^7.24.8"
+ "@babel/helper-environment-visitor" "^7.24.7"
+ "@babel/helper-function-name" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.8"
+ "@babel/helper-replace-supers" "^7.24.7"
+ "@babel/helper-split-export-declaration" "^7.24.7"
+ "globals" "^11.1.0"
+
+"@babel/plugin-transform-computed-properties@^7.24.7":
+ "integrity" "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/template" "^7.24.7"
+
+"@babel/plugin-transform-destructuring@^7.24.8":
+ "integrity" "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz"
+ "version" "7.24.8"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.8"
+
+"@babel/plugin-transform-dotall-regex@^7.24.7":
+ "integrity" "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-duplicate-keys@^7.24.7":
+ "integrity" "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-dynamic-import@^7.24.7":
+ "integrity" "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/plugin-syntax-dynamic-import" "^7.8.3"
+
+"@babel/plugin-transform-exponentiation-operator@^7.24.7":
+ "integrity" "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-export-namespace-from@^7.24.7":
+ "integrity" "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
+
+"@babel/plugin-transform-for-of@^7.24.7":
+ "integrity" "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7"
+
+"@babel/plugin-transform-function-name@^7.24.7":
+ "integrity" "sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-compilation-targets" "^7.24.7"
+ "@babel/helper-function-name" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-json-strings@^7.24.7":
+ "integrity" "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/plugin-syntax-json-strings" "^7.8.3"
+
+"@babel/plugin-transform-literals@^7.24.7":
+ "integrity" "sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-logical-assignment-operators@^7.24.7":
+ "integrity" "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+
+"@babel/plugin-transform-member-expression-literals@^7.24.7":
+ "integrity" "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-modules-amd@^7.24.7":
+ "integrity" "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-module-transforms" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-modules-commonjs@^7.24.7", "@babel/plugin-transform-modules-commonjs@^7.24.8":
+ "integrity" "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz"
+ "version" "7.24.8"
+ dependencies:
+ "@babel/helper-module-transforms" "^7.24.8"
+ "@babel/helper-plugin-utils" "^7.24.8"
+ "@babel/helper-simple-access" "^7.24.7"
+
+"@babel/plugin-transform-modules-systemjs@^7.24.7":
+ "integrity" "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-hoist-variables" "^7.24.7"
+ "@babel/helper-module-transforms" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-validator-identifier" "^7.24.7"
+
+"@babel/plugin-transform-modules-umd@^7.24.7":
+ "integrity" "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-module-transforms" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-named-capturing-groups-regex@^7.24.7":
+ "integrity" "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-new-target@^7.24.7":
+ "integrity" "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-nullish-coalescing-operator@^7.24.7":
+ "integrity" "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+
+"@babel/plugin-transform-numeric-separator@^7.24.7":
+ "integrity" "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/plugin-syntax-numeric-separator" "^7.10.4"
+
+"@babel/plugin-transform-object-rest-spread@^7.24.7":
+ "integrity" "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-compilation-targets" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+ "@babel/plugin-transform-parameters" "^7.24.7"
+
+"@babel/plugin-transform-object-super@^7.24.7":
+ "integrity" "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-replace-supers" "^7.24.7"
+
+"@babel/plugin-transform-optional-catch-binding@^7.24.7":
+ "integrity" "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+
+"@babel/plugin-transform-optional-chaining@^7.24.7", "@babel/plugin-transform-optional-chaining@^7.24.8":
+ "integrity" "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz"
+ "version" "7.24.8"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.8"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7"
+ "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+
+"@babel/plugin-transform-parameters@^7.24.7":
+ "integrity" "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-private-methods@^7.24.7":
+ "integrity" "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-private-property-in-object@^7.24.7":
+ "integrity" "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.24.7"
+ "@babel/helper-create-class-features-plugin" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
+
+"@babel/plugin-transform-property-literals@^7.24.7":
+ "integrity" "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-react-constant-elements@^7.18.12":
+ "integrity" "sha512-7LidzZfUXyfZ8/buRW6qIIHBY8wAZ1OrY9c/wTr8YhZ6vMPo+Uc/CVFLYY1spZrEQlD4w5u8wjqk5NQ3OVqQKA=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-react-display-name@^7.24.7":
+ "integrity" "sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-react-jsx-development@^7.24.7":
+ "integrity" "sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/plugin-transform-react-jsx" "^7.24.7"
+
+"@babel/plugin-transform-react-jsx@^7.24.7":
+ "integrity" "sha512-+Dj06GDZEFRYvclU6k4bme55GKBEWUmByM/eoKuqg4zTNQHiApWRhQph5fxQB2wAEFvRzL1tOEj1RJ19wJrhoA=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.24.7"
+ "@babel/helper-module-imports" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/plugin-syntax-jsx" "^7.24.7"
+ "@babel/types" "^7.24.7"
+
+"@babel/plugin-transform-react-pure-annotations@^7.24.7":
+ "integrity" "sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-regenerator@^7.24.7":
+ "integrity" "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "regenerator-transform" "^0.15.2"
+
+"@babel/plugin-transform-reserved-words@^7.24.7":
+ "integrity" "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-shorthand-properties@^7.24.7":
+ "integrity" "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-spread@^7.24.7":
+ "integrity" "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7"
+
+"@babel/plugin-transform-sticky-regex@^7.24.7":
+ "integrity" "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-template-literals@^7.24.7":
+ "integrity" "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-typeof-symbol@^7.24.8":
+ "integrity" "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz"
+ "version" "7.24.8"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.8"
+
+"@babel/plugin-transform-typescript@^7.24.7":
+ "integrity" "sha512-CgFgtN61BbdOGCP4fLaAMOPkzWUh6yQZNMr5YSt8uz2cZSSiQONCQFWqsE4NeVfOIhqDOlS9CR3WD91FzMeB2Q=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.8.tgz"
+ "version" "7.24.8"
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.24.7"
+ "@babel/helper-create-class-features-plugin" "^7.24.8"
+ "@babel/helper-plugin-utils" "^7.24.8"
+ "@babel/plugin-syntax-typescript" "^7.24.7"
+
+"@babel/plugin-transform-unicode-escapes@^7.24.7":
+ "integrity" "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-unicode-property-regex@^7.24.7":
+ "integrity" "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-unicode-regex@^7.24.7":
+ "integrity" "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-unicode-sets-regex@^7.24.7":
+ "integrity" "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg=="
+ "resolved" "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/preset-env@^7.19.4":
+ "integrity" "sha512-vObvMZB6hNWuDxhSaEPTKCwcqkAIuDtE+bQGn4XMXne1DSLzFVY8Vmj1bm+mUQXYNN8NmaQEO+r8MMbzPr1jBQ=="
+ "resolved" "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.8.tgz"
+ "version" "7.24.8"
+ dependencies:
+ "@babel/compat-data" "^7.24.8"
+ "@babel/helper-compilation-targets" "^7.24.8"
+ "@babel/helper-plugin-utils" "^7.24.8"
+ "@babel/helper-validator-option" "^7.24.8"
+ "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.24.7"
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.24.7"
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.7"
+ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.24.7"
+ "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2"
+ "@babel/plugin-syntax-async-generators" "^7.8.4"
+ "@babel/plugin-syntax-class-properties" "^7.12.13"
+ "@babel/plugin-syntax-class-static-block" "^7.14.5"
+ "@babel/plugin-syntax-dynamic-import" "^7.8.3"
+ "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
+ "@babel/plugin-syntax-import-assertions" "^7.24.7"
+ "@babel/plugin-syntax-import-attributes" "^7.24.7"
+ "@babel/plugin-syntax-import-meta" "^7.10.4"
+ "@babel/plugin-syntax-json-strings" "^7.8.3"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+ "@babel/plugin-syntax-numeric-separator" "^7.10.4"
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+ "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+ "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
+ "@babel/plugin-syntax-top-level-await" "^7.14.5"
+ "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6"
+ "@babel/plugin-transform-arrow-functions" "^7.24.7"
+ "@babel/plugin-transform-async-generator-functions" "^7.24.7"
+ "@babel/plugin-transform-async-to-generator" "^7.24.7"
+ "@babel/plugin-transform-block-scoped-functions" "^7.24.7"
+ "@babel/plugin-transform-block-scoping" "^7.24.7"
+ "@babel/plugin-transform-class-properties" "^7.24.7"
+ "@babel/plugin-transform-class-static-block" "^7.24.7"
+ "@babel/plugin-transform-classes" "^7.24.8"
+ "@babel/plugin-transform-computed-properties" "^7.24.7"
+ "@babel/plugin-transform-destructuring" "^7.24.8"
+ "@babel/plugin-transform-dotall-regex" "^7.24.7"
+ "@babel/plugin-transform-duplicate-keys" "^7.24.7"
+ "@babel/plugin-transform-dynamic-import" "^7.24.7"
+ "@babel/plugin-transform-exponentiation-operator" "^7.24.7"
+ "@babel/plugin-transform-export-namespace-from" "^7.24.7"
+ "@babel/plugin-transform-for-of" "^7.24.7"
+ "@babel/plugin-transform-function-name" "^7.24.7"
+ "@babel/plugin-transform-json-strings" "^7.24.7"
+ "@babel/plugin-transform-literals" "^7.24.7"
+ "@babel/plugin-transform-logical-assignment-operators" "^7.24.7"
+ "@babel/plugin-transform-member-expression-literals" "^7.24.7"
+ "@babel/plugin-transform-modules-amd" "^7.24.7"
+ "@babel/plugin-transform-modules-commonjs" "^7.24.8"
+ "@babel/plugin-transform-modules-systemjs" "^7.24.7"
+ "@babel/plugin-transform-modules-umd" "^7.24.7"
+ "@babel/plugin-transform-named-capturing-groups-regex" "^7.24.7"
+ "@babel/plugin-transform-new-target" "^7.24.7"
+ "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.7"
+ "@babel/plugin-transform-numeric-separator" "^7.24.7"
+ "@babel/plugin-transform-object-rest-spread" "^7.24.7"
+ "@babel/plugin-transform-object-super" "^7.24.7"
+ "@babel/plugin-transform-optional-catch-binding" "^7.24.7"
+ "@babel/plugin-transform-optional-chaining" "^7.24.8"
+ "@babel/plugin-transform-parameters" "^7.24.7"
+ "@babel/plugin-transform-private-methods" "^7.24.7"
+ "@babel/plugin-transform-private-property-in-object" "^7.24.7"
+ "@babel/plugin-transform-property-literals" "^7.24.7"
+ "@babel/plugin-transform-regenerator" "^7.24.7"
+ "@babel/plugin-transform-reserved-words" "^7.24.7"
+ "@babel/plugin-transform-shorthand-properties" "^7.24.7"
+ "@babel/plugin-transform-spread" "^7.24.7"
+ "@babel/plugin-transform-sticky-regex" "^7.24.7"
+ "@babel/plugin-transform-template-literals" "^7.24.7"
+ "@babel/plugin-transform-typeof-symbol" "^7.24.8"
+ "@babel/plugin-transform-unicode-escapes" "^7.24.7"
+ "@babel/plugin-transform-unicode-property-regex" "^7.24.7"
+ "@babel/plugin-transform-unicode-regex" "^7.24.7"
+ "@babel/plugin-transform-unicode-sets-regex" "^7.24.7"
+ "@babel/preset-modules" "0.1.6-no-external-plugins"
+ "babel-plugin-polyfill-corejs2" "^0.4.10"
+ "babel-plugin-polyfill-corejs3" "^0.10.4"
+ "babel-plugin-polyfill-regenerator" "^0.6.1"
+ "core-js-compat" "^3.37.1"
+ "semver" "^6.3.1"
+
+"@babel/preset-modules@0.1.6-no-external-plugins":
+ "integrity" "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA=="
+ "resolved" "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz"
+ "version" "0.1.6-no-external-plugins"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/types" "^7.4.4"
+ "esutils" "^2.0.2"
+
+"@babel/preset-react@^7.18.6":
+ "integrity" "sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag=="
+ "resolved" "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-validator-option" "^7.24.7"
+ "@babel/plugin-transform-react-display-name" "^7.24.7"
+ "@babel/plugin-transform-react-jsx" "^7.24.7"
+ "@babel/plugin-transform-react-jsx-development" "^7.24.7"
+ "@babel/plugin-transform-react-pure-annotations" "^7.24.7"
+
+"@babel/preset-typescript@^7.18.6":
+ "integrity" "sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ=="
+ "resolved" "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-validator-option" "^7.24.7"
+ "@babel/plugin-syntax-jsx" "^7.24.7"
+ "@babel/plugin-transform-modules-commonjs" "^7.24.7"
+ "@babel/plugin-transform-typescript" "^7.24.7"
+
+"@babel/regjsgen@^0.8.0":
+ "integrity" "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA=="
+ "resolved" "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz"
+ "version" "0.8.0"
+
+"@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.0", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.4", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.9", "@babel/runtime@^7.20.13", "@babel/runtime@^7.20.6", "@babel/runtime@^7.23.9", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2":
+ "integrity" "sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA=="
+ "resolved" "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.8.tgz"
+ "version" "7.24.8"
+ dependencies:
+ "regenerator-runtime" "^0.14.0"
+
+"@babel/template@^7.24.7":
+ "integrity" "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig=="
+ "resolved" "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz"
+ "version" "7.24.7"
+ dependencies:
+ "@babel/code-frame" "^7.24.7"
+ "@babel/parser" "^7.24.7"
+ "@babel/types" "^7.24.7"
+
+"@babel/traverse@^7.24.7", "@babel/traverse@^7.24.8":
+ "integrity" "sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ=="
+ "resolved" "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.8.tgz"
+ "version" "7.24.8"
+ dependencies:
+ "@babel/code-frame" "^7.24.7"
+ "@babel/generator" "^7.24.8"
+ "@babel/helper-environment-visitor" "^7.24.7"
+ "@babel/helper-function-name" "^7.24.7"
+ "@babel/helper-hoist-variables" "^7.24.7"
+ "@babel/helper-split-export-declaration" "^7.24.7"
+ "@babel/parser" "^7.24.8"
+ "@babel/types" "^7.24.8"
+ "debug" "^4.3.1"
+ "globals" "^11.1.0"
+
+"@babel/types@^7.20.0", "@babel/types@^7.24.7", "@babel/types@^7.24.8", "@babel/types@^7.4.4":
+ "integrity" "sha512-SkSBEHwwJRU52QEVZBmMBnE5Ux2/6WU1grdYyOhpbCNxbmJrDuDCphBzKZSO3taf0zztp+qkWlymE5tVL5l0TA=="
+ "resolved" "https://registry.npmjs.org/@babel/types/-/types-7.24.8.tgz"
+ "version" "7.24.8"
+ dependencies:
+ "@babel/helper-string-parser" "^7.24.8"
+ "@babel/helper-validator-identifier" "^7.24.7"
+ "to-fast-properties" "^2.0.0"
+
+"@date-io/core@^2.15.0", "@date-io/core@^2.17.0":
+ "integrity" "sha512-+EQE8xZhRM/hsY0CDTVyayMDDY5ihc4MqXCrPxooKw19yAzUIC6uUqsZeaOFNL9YKTNxYKrJP5DFgE8o5xRCOw=="
+ "resolved" "https://registry.npmjs.org/@date-io/core/-/core-2.17.0.tgz"
+ "version" "2.17.0"
+
+"@date-io/date-fns@^2.15.0":
+ "integrity" "sha512-L0hWZ/mTpy3Gx/xXJ5tq5CzHo0L7ry6KEO9/w/JWiFWFLZgiNVo3ex92gOl3zmzjHqY/3Ev+5sehAr8UnGLEng=="
+ "resolved" "https://registry.npmjs.org/@date-io/date-fns/-/date-fns-2.17.0.tgz"
+ "version" "2.17.0"
+ dependencies:
+ "@date-io/core" "^2.17.0"
+
+"@date-io/dayjs@^2.15.0":
+ "integrity" "sha512-Iq1wjY5XzBh0lheFA0it6Dsyv94e8mTiNR8vuTai+KopxDkreL3YjwTmZHxkgB7/vd0RMIACStzVgWvPATnDCA=="
+ "resolved" "https://registry.npmjs.org/@date-io/dayjs/-/dayjs-2.17.0.tgz"
+ "version" "2.17.0"
+ dependencies:
+ "@date-io/core" "^2.17.0"
+
+"@date-io/luxon@^2.15.0":
+ "integrity" "sha512-l712Vdm/uTddD2XWt9TlQloZUiTiRQtY5TCOG45MQ/8u0tu8M17BD6QYHar/3OrnkGybALAMPzCy1r5D7+0HBg=="
+ "resolved" "https://registry.npmjs.org/@date-io/luxon/-/luxon-2.17.0.tgz"
+ "version" "2.17.0"
+ dependencies:
+ "@date-io/core" "^2.17.0"
+
+"@date-io/moment@^2.15.0":
+ "integrity" "sha512-e4nb4CDZU4k0WRVhz1Wvl7d+hFsedObSauDHKtZwU9kt7gdYEAzKgnrSCTHsEaXrDumdrkCYTeZ0Tmyk7uV4tw=="
+ "resolved" "https://registry.npmjs.org/@date-io/moment/-/moment-2.17.0.tgz"
+ "version" "2.17.0"
+ dependencies:
+ "@date-io/core" "^2.17.0"
+
+"@emotion/babel-plugin@^11.10.5":
+ "integrity" "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ=="
+ "resolved" "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz"
+ "version" "11.11.0"
+ dependencies:
+ "@babel/helper-module-imports" "^7.16.7"
+ "@babel/runtime" "^7.18.3"
+ "@emotion/hash" "^0.9.1"
+ "@emotion/memoize" "^0.8.1"
+ "@emotion/serialize" "^1.1.2"
+ "babel-plugin-macros" "^3.1.0"
+ "convert-source-map" "^1.5.0"
+ "escape-string-regexp" "^4.0.0"
+ "find-root" "^1.1.0"
+ "source-map" "^0.5.7"
+ "stylis" "4.2.0"
+
+"@emotion/cache@^11.10.5", "@emotion/cache@11.10.5":
+ "integrity" "sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA=="
+ "resolved" "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.5.tgz"
+ "version" "11.10.5"
+ dependencies:
+ "@emotion/memoize" "^0.8.0"
+ "@emotion/sheet" "^1.2.1"
+ "@emotion/utils" "^1.2.0"
+ "@emotion/weak-memoize" "^0.3.0"
+ "stylis" "4.1.3"
+
+"@emotion/cache@^11.11.0":
+ "integrity" "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ=="
+ "resolved" "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz"
+ "version" "11.11.0"
+ dependencies:
+ "@emotion/memoize" "^0.8.1"
+ "@emotion/sheet" "^1.2.2"
+ "@emotion/utils" "^1.2.1"
+ "@emotion/weak-memoize" "^0.3.1"
+ "stylis" "4.2.0"
+
+"@emotion/hash@^0.9.1":
+ "integrity" "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ=="
+ "resolved" "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz"
+ "version" "0.9.1"
+
+"@emotion/is-prop-valid@^1.2.0":
+ "integrity" "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw=="
+ "resolved" "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz"
+ "version" "1.2.2"
+ dependencies:
+ "@emotion/memoize" "^0.8.1"
+
+"@emotion/memoize@^0.8.0", "@emotion/memoize@^0.8.1":
+ "integrity" "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA=="
+ "resolved" "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz"
+ "version" "0.8.1"
+
+"@emotion/react@^11.0.0-rc.0", "@emotion/react@^11.4.1", "@emotion/react@^11.5.0", "@emotion/react@^11.9.0", "@emotion/react@>=11.11", "@emotion/react@11.10.5":
+ "integrity" "sha512-TZs6235tCJ/7iF6/rvTaOH4oxQg2gMAcdHemjwLKIjKz4rRuYe1HJ2TQJKnAcRAfOUDdU8XoDadCe1rl72iv8A=="
+ "resolved" "https://registry.npmjs.org/@emotion/react/-/react-11.10.5.tgz"
+ "version" "11.10.5"
+ dependencies:
+ "@babel/runtime" "^7.18.3"
+ "@emotion/babel-plugin" "^11.10.5"
+ "@emotion/cache" "^11.10.5"
+ "@emotion/serialize" "^1.1.1"
+ "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0"
+ "@emotion/utils" "^1.2.0"
+ "@emotion/weak-memoize" "^0.3.0"
+ "hoist-non-react-statics" "^3.3.1"
+
+"@emotion/serialize@^1.1.1", "@emotion/serialize@^1.1.2":
+ "integrity" "sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ=="
+ "resolved" "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.4.tgz"
+ "version" "1.1.4"
+ dependencies:
+ "@emotion/hash" "^0.9.1"
+ "@emotion/memoize" "^0.8.1"
+ "@emotion/unitless" "^0.8.1"
+ "@emotion/utils" "^1.2.1"
+ "csstype" "^3.0.2"
+
+"@emotion/server@11.10.0":
+ "integrity" "sha512-MTvJ21JPo9aS02GdjFW4nhdwOi2tNNpMmAM/YED0pkxzjDNi5WbiTwXqaCnvLc2Lr8NFtjhT0az1vTJyLIHYcw=="
+ "resolved" "https://registry.npmjs.org/@emotion/server/-/server-11.10.0.tgz"
+ "version" "11.10.0"
+ dependencies:
+ "@emotion/utils" "^1.2.0"
+ "html-tokenize" "^2.0.0"
+ "multipipe" "^1.0.2"
+ "through" "^2.3.8"
+
+"@emotion/sheet@^1.2.1", "@emotion/sheet@^1.2.2":
+ "integrity" "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA=="
+ "resolved" "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz"
+ "version" "1.2.2"
+
+"@emotion/styled@^11.3.0", "@emotion/styled@^11.8.1", "@emotion/styled@>=11.11", "@emotion/styled@11.10.5":
+ "integrity" "sha512-8EP6dD7dMkdku2foLoruPCNkRevzdcBaY6q0l0OsbyJK+x8D9HWjX27ARiSIKNF634hY9Zdoedh8bJCiva8yZw=="
+ "resolved" "https://registry.npmjs.org/@emotion/styled/-/styled-11.10.5.tgz"
+ "version" "11.10.5"
+ dependencies:
+ "@babel/runtime" "^7.18.3"
+ "@emotion/babel-plugin" "^11.10.5"
+ "@emotion/is-prop-valid" "^1.2.0"
+ "@emotion/serialize" "^1.1.1"
+ "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0"
+ "@emotion/utils" "^1.2.0"
+
+"@emotion/unitless@^0.8.1":
+ "integrity" "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ=="
+ "resolved" "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz"
+ "version" "0.8.1"
+
+"@emotion/use-insertion-effect-with-fallbacks@^1.0.0":
+ "integrity" "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw=="
+ "resolved" "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz"
+ "version" "1.0.1"
+
+"@emotion/utils@^1.2.0", "@emotion/utils@^1.2.1":
+ "integrity" "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg=="
+ "resolved" "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz"
+ "version" "1.2.1"
+
+"@emotion/weak-memoize@^0.3.0", "@emotion/weak-memoize@^0.3.1":
+ "integrity" "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww=="
+ "resolved" "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz"
+ "version" "0.3.1"
+
+"@eslint/eslintrc@^1.4.1":
+ "integrity" "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA=="
+ "resolved" "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz"
+ "version" "1.4.1"
+ dependencies:
+ "ajv" "^6.12.4"
+ "debug" "^4.3.2"
+ "espree" "^9.4.0"
+ "globals" "^13.19.0"
+ "ignore" "^5.2.0"
+ "import-fresh" "^3.2.1"
+ "js-yaml" "^4.1.0"
+ "minimatch" "^3.1.2"
+ "strip-json-comments" "^3.1.1"
+
+"@heroicons/react@2.0.15":
+ "integrity" "sha512-CZ2dGWgWG3/z5LEoD5D3MEr1syn45JM/OB2aDpw531Ryecgkz2V7TWQ808P0lva7zP003PVW6WlwbofsYyga3A=="
+ "resolved" "https://registry.npmjs.org/@heroicons/react/-/react-2.0.15.tgz"
+ "version" "2.0.15"
+
+"@humanwhocodes/config-array@^0.11.8":
+ "integrity" "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg=="
+ "resolved" "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz"
+ "version" "0.11.14"
+ dependencies:
+ "@humanwhocodes/object-schema" "^2.0.2"
+ "debug" "^4.3.1"
+ "minimatch" "^3.0.5"
+
+"@humanwhocodes/module-importer@^1.0.1":
+ "integrity" "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="
+ "resolved" "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz"
+ "version" "1.0.1"
+
+"@humanwhocodes/object-schema@^2.0.2":
+ "integrity" "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA=="
+ "resolved" "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz"
+ "version" "2.0.3"
+
+"@jridgewell/gen-mapping@^0.3.5":
+ "integrity" "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg=="
+ "resolved" "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz"
+ "version" "0.3.5"
+ dependencies:
+ "@jridgewell/set-array" "^1.2.1"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+ "@jridgewell/trace-mapping" "^0.3.24"
+
+"@jridgewell/resolve-uri@^3.1.0":
+ "integrity" "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="
+ "resolved" "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz"
+ "version" "3.1.2"
+
+"@jridgewell/set-array@^1.2.1":
+ "integrity" "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="
+ "resolved" "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz"
+ "version" "1.2.1"
+
+"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14":
+ "integrity" "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="
+ "resolved" "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz"
+ "version" "1.5.0"
+
+"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25":
+ "integrity" "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="
+ "resolved" "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz"
+ "version" "0.3.25"
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.1.0"
+ "@jridgewell/sourcemap-codec" "^1.4.14"
+
+"@mui/base@5.0.0-alpha.118":
+ "integrity" "sha512-GAEpqhnuHjRaAZLdxFNuOf2GDTp9sUawM46oHZV4VnYPFjXJDkIYFWfIQLONb0nga92OiqS5DD/scGzVKCL0Mw=="
+ "resolved" "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.118.tgz"
+ "version" "5.0.0-alpha.118"
+ dependencies:
+ "@babel/runtime" "^7.20.13"
+ "@emotion/is-prop-valid" "^1.2.0"
+ "@mui/types" "^7.2.3"
+ "@mui/utils" "^5.11.9"
+ "@popperjs/core" "^2.11.6"
+ "clsx" "^1.2.1"
+ "prop-types" "^15.8.1"
+ "react-is" "^18.2.0"
+
+"@mui/core-downloads-tracker@^5.11.9":
+ "integrity" "sha512-62Jq7ACYi/55Kjkh/nVfEL3F3ytTYTsdB8MGJ9iI+eRQv+Aoem5CPUAzQihUo25qqh1VkVu9/jQn3dFbyrXHgw=="
+ "resolved" "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.1.tgz"
+ "version" "5.16.1"
+
+"@mui/icons-material@>=5.11", "@mui/icons-material@5.11.9":
+ "integrity" "sha512-SPANMk6K757Q1x48nCwPGdSNb8B71d+2hPMJ0V12VWerpSsbjZtvAPi5FAn13l2O5mwWkvI0Kne+0tCgnNxMNw=="
+ "resolved" "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.11.9.tgz"
+ "version" "5.11.9"
+ dependencies:
+ "@babel/runtime" "^7.20.13"
+
+"@mui/lab@5.0.0-alpha.120":
+ "integrity" "sha512-vjlF2jTKSZnNxtUO0xxHEDfpL5cG0LLNRsfKv8TYOiPs0Q1bbqO3YfqJsqxv8yh+wx7EFZc8lwJ4NSAQdenW3A=="
+ "resolved" "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.120.tgz"
+ "version" "5.0.0-alpha.120"
+ dependencies:
+ "@babel/runtime" "^7.20.13"
+ "@mui/base" "5.0.0-alpha.118"
+ "@mui/system" "^5.11.9"
+ "@mui/types" "^7.2.3"
+ "@mui/utils" "^5.11.9"
+ "clsx" "^1.2.1"
+ "prop-types" "^15.8.1"
+ "react-is" "^18.2.0"
+
+"@mui/material@^5.0.0", "@mui/material@^5.4.1", "@mui/material@>=5.13", "@mui/material@5.11.9":
+ "integrity" "sha512-Wb3WzjzYyi/WKSl/XlF7aC8kk2NE21IoHMF7hNQMkPb0GslbWwR4OUjlBpxtG+RSZn44wMZkEDNB9Hw0TDsd8g=="
+ "resolved" "https://registry.npmjs.org/@mui/material/-/material-5.11.9.tgz"
+ "version" "5.11.9"
+ dependencies:
+ "@babel/runtime" "^7.20.13"
+ "@mui/base" "5.0.0-alpha.118"
+ "@mui/core-downloads-tracker" "^5.11.9"
+ "@mui/system" "^5.11.9"
+ "@mui/types" "^7.2.3"
+ "@mui/utils" "^5.11.9"
+ "@types/react-transition-group" "^4.4.5"
+ "clsx" "^1.2.1"
+ "csstype" "^3.1.1"
+ "prop-types" "^15.8.1"
+ "react-is" "^18.2.0"
+ "react-transition-group" "^4.4.5"
+
+"@mui/private-theming@^5.11.9":
+ "integrity" "sha512-2EGCKnAlq9vRIFj61jNWNXlKAxXp56577OVvsts7fAqRx+G1y6F+N7Q198SBaz8jYQeGKSz8ZMXK/M3FqjdEyw=="
+ "resolved" "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.16.1.tgz"
+ "version" "5.16.1"
+ dependencies:
+ "@babel/runtime" "^7.23.9"
+ "@mui/utils" "^5.16.1"
+ "prop-types" "^15.8.1"
+
+"@mui/styled-engine@^5.11.9":
+ "integrity" "sha512-JwWUBaYR8HHCFefSeos0z6JoTbu0MnjAuNHu4QoDgPxl2EE70XH38CsKay66Iy0QkNWmGTRXVU2sVFgUOPL/Dw=="
+ "resolved" "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.16.1.tgz"
+ "version" "5.16.1"
+ dependencies:
+ "@babel/runtime" "^7.23.9"
+ "@emotion/cache" "^11.11.0"
+ "csstype" "^3.1.3"
+ "prop-types" "^15.8.1"
+
+"@mui/system@^5.11.9", "@mui/system@^5.4.1", "@mui/system@5.11.9":
+ "integrity" "sha512-h6uarf+l3FO6l75Nf7yO+qDGrIoa1DM9nAMCUFZQsNCDKOInRzcptnm8M1w/Z3gVetfeeGoIGAYuYKbft6KZZA=="
+ "resolved" "https://registry.npmjs.org/@mui/system/-/system-5.11.9.tgz"
+ "version" "5.11.9"
+ dependencies:
+ "@babel/runtime" "^7.20.13"
+ "@mui/private-theming" "^5.11.9"
+ "@mui/styled-engine" "^5.11.9"
+ "@mui/types" "^7.2.3"
+ "@mui/utils" "^5.11.9"
+ "clsx" "^1.2.1"
+ "csstype" "^3.1.1"
+ "prop-types" "^15.8.1"
+
+"@mui/types@^7.2.3":
+ "integrity" "sha512-nbo7yPhtKJkdf9kcVOF8JZHPZTmqXjJ/tI0bdWgHg5tp9AnIN4Y7f7wm9T+0SyGYJk76+GYZ8Q5XaTYAsUHN0Q=="
+ "resolved" "https://registry.npmjs.org/@mui/types/-/types-7.2.15.tgz"
+ "version" "7.2.15"
+
+"@mui/utils@^5.10.3", "@mui/utils@^5.11.9", "@mui/utils@^5.16.1":
+ "integrity" "sha512-4UQzK46tAEYs2xZv79hRiIc3GxZScd00kGPDadNrGztAEZlmSaUY8cb9ITd2xCiTfzsx5AN6DH8aaQ8QEKJQeQ=="
+ "resolved" "https://registry.npmjs.org/@mui/utils/-/utils-5.16.1.tgz"
+ "version" "5.16.1"
+ dependencies:
+ "@babel/runtime" "^7.23.9"
+ "@types/prop-types" "^15.7.12"
+ "prop-types" "^15.8.1"
+ "react-is" "^18.3.1"
+
+"@mui/x-date-pickers@>=6.15.0", "@mui/x-date-pickers@5.0.18":
+ "integrity" "sha512-kla/XJ+li+I0BGvFH/SCdC2FOovalPyTIaY1GwXzktk9LxT6j2Ylud1enfz5jymQgkadI9UbwL/XZuRNl54cAw=="
+ "resolved" "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-5.0.18.tgz"
+ "version" "5.0.18"
+ 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"
+ "@types/react-transition-group" "^4.4.5"
+ "clsx" "^1.2.1"
+ "prop-types" "^15.7.2"
+ "react-transition-group" "^4.4.5"
+ "rifm" "^0.12.1"
+
+"@next/env@13.1.6":
+ "integrity" "sha512-s+W9Fdqh5MFk6ECrbnVmmAOwxKQuhGMT7xXHrkYIBMBcTiOqNWhv5KbJIboKR5STXxNXl32hllnvKaffzFaWQg=="
+ "resolved" "https://registry.npmjs.org/@next/env/-/env-13.1.6.tgz"
+ "version" "13.1.6"
+
+"@next/eslint-plugin-next@13.1.6":
+ "integrity" "sha512-o7cauUYsXjzSJkay8wKjpKJf2uLzlggCsGUkPu3lP09Pv97jYlekTC20KJrjQKmSv5DXV0R/uks2ZXhqjNkqAw=="
+ "resolved" "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.1.6.tgz"
+ "version" "13.1.6"
+ dependencies:
+ "glob" "7.1.7"
+
+"@next/swc-win32-x64-msvc@13.1.6":
+ "integrity" "sha512-Ls2OL9hi3YlJKGNdKv8k3X/lLgc3VmLG3a/DeTkAd+lAituJp8ZHmRmm9f9SL84fT3CotlzcgbdaCDfFwFA6bA=="
+ "resolved" "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.1.6.tgz"
+ "version" "13.1.6"
+
+"@nodelib/fs.scandir@2.1.5":
+ "integrity" "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="
+ "resolved" "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz"
+ "version" "2.1.5"
+ dependencies:
+ "@nodelib/fs.stat" "2.0.5"
+ "run-parallel" "^1.1.9"
+
+"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5":
+ "integrity" "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="
+ "resolved" "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
+ "version" "2.0.5"
+
+"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8":
+ "integrity" "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="
+ "resolved" "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz"
+ "version" "1.2.8"
+ dependencies:
+ "@nodelib/fs.scandir" "2.1.5"
+ "fastq" "^1.6.0"
+
+"@popperjs/core@^2.11.6":
+ "integrity" "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A=="
+ "resolved" "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz"
+ "version" "2.11.8"
+
+"@react-pdf/fns@2.2.1":
+ "integrity" "sha512-s78aDg0vDYaijU5lLOCsUD+qinQbfOvcNeaoX9AiE7+kZzzCo6B/nX+l48cmt9OosJmvZvE9DWR9cLhrhOi2pA=="
+ "resolved" "https://registry.npmjs.org/@react-pdf/fns/-/fns-2.2.1.tgz"
+ "version" "2.2.1"
+ dependencies:
+ "@babel/runtime" "^7.20.13"
+
+"@react-pdf/font@^2.3.1":
+ "integrity" "sha512-Hyb2zBb92Glc3lvhmJfy4dO2Mj29KB26Uk12Ua9EhKAdiuCTLBqgP8Oe1cGwrvDI7xA4OOcwvBMdYh0vhOUHzA=="
+ "resolved" "https://registry.npmjs.org/@react-pdf/font/-/font-2.5.1.tgz"
+ "version" "2.5.1"
+ dependencies:
+ "@babel/runtime" "^7.20.13"
+ "@react-pdf/types" "^2.5.0"
+ "cross-fetch" "^3.1.5"
+ "fontkit" "^2.0.2"
+ "is-url" "^1.2.4"
+
+"@react-pdf/image@^2.3.6":
+ "integrity" "sha512-7iZDYZrZlJqNzS6huNl2XdMcLFUo68e6mOdzQeJ63d5eApdthhSHBnkGzHfLhH5t8DCpZNtClmklzuLL63ADfw=="
+ "resolved" "https://registry.npmjs.org/@react-pdf/image/-/image-2.3.6.tgz"
+ "version" "2.3.6"
+ dependencies:
+ "@babel/runtime" "^7.20.13"
+ "@react-pdf/png-js" "^2.3.1"
+ "cross-fetch" "^3.1.5"
+ "jay-peg" "^1.0.2"
+
+"@react-pdf/layout@^3.3.0":
+ "integrity" "sha512-BxSeykDxvADlpe4OGtQ7NH46QXq3uImAYsTHOPLCwbXMniQ1O3uCBx7H+HthxkCNshgYVPp9qS3KyvQv/oIZwg=="
+ "resolved" "https://registry.npmjs.org/@react-pdf/layout/-/layout-3.12.1.tgz"
+ "version" "3.12.1"
+ dependencies:
+ "@babel/runtime" "^7.20.13"
+ "@react-pdf/fns" "2.2.1"
+ "@react-pdf/image" "^2.3.6"
+ "@react-pdf/pdfkit" "^3.1.10"
+ "@react-pdf/primitives" "^3.1.1"
+ "@react-pdf/stylesheet" "^4.2.5"
+ "@react-pdf/textkit" "^4.4.1"
+ "@react-pdf/types" "^2.5.0"
+ "cross-fetch" "^3.1.5"
+ "emoji-regex" "^10.3.0"
+ "queue" "^6.0.1"
+ "yoga-layout" "^2.0.1"
+
+"@react-pdf/pdfkit@^3.0.1", "@react-pdf/pdfkit@^3.1.10":
+ "integrity" "sha512-P/qPBtCFo2HDJD0i6NfbmoBRrsOVO8CIogYsefwG4fklTo50zNgnMM5U1WLckTuX8Qt1ThiQuokmTG5arheblA=="
+ "resolved" "https://registry.npmjs.org/@react-pdf/pdfkit/-/pdfkit-3.1.10.tgz"
+ "version" "3.1.10"
+ dependencies:
+ "@babel/runtime" "^7.20.13"
+ "@react-pdf/png-js" "^2.3.1"
+ "browserify-zlib" "^0.2.0"
+ "crypto-js" "^4.2.0"
+ "fontkit" "^2.0.2"
+ "jay-peg" "^1.0.2"
+ "vite-compatible-readable-stream" "^3.6.1"
+
+"@react-pdf/png-js@^2.3.1":
+ "integrity" "sha512-pEZ18I4t1vAUS4lmhvXPmXYP4PHeblpWP/pAlMMRkEyP7tdAeHUN7taQl9sf9OPq7YITMY3lWpYpJU6t4CZgZg=="
+ "resolved" "https://registry.npmjs.org/@react-pdf/png-js/-/png-js-2.3.1.tgz"
+ "version" "2.3.1"
+ dependencies:
+ "browserify-zlib" "^0.2.0"
+
+"@react-pdf/primitives@^3.0.0", "@react-pdf/primitives@^3.1.1":
+ "integrity" "sha512-miwjxLwTnO3IjoqkTVeTI+9CdyDggwekmSLhVCw+a/7FoQc+gF3J2dSKwsHvAcVFM0gvU8mzCeTofgw0zPDq0w=="
+ "resolved" "https://registry.npmjs.org/@react-pdf/primitives/-/primitives-3.1.1.tgz"
+ "version" "3.1.1"
+
+"@react-pdf/render@^3.2.1":
+ "integrity" "sha512-CfGxWmVgrY3JgmB1iMnz2W6Ck+8pisZeFt8vGlxP+JfT+0onr208pQvGSV5KwA9LGhAdABxqc/+y17V3vtKdFA=="
+ "resolved" "https://registry.npmjs.org/@react-pdf/render/-/render-3.4.4.tgz"
+ "version" "3.4.4"
+ dependencies:
+ "@babel/runtime" "^7.20.13"
+ "@react-pdf/fns" "2.2.1"
+ "@react-pdf/primitives" "^3.1.1"
+ "@react-pdf/textkit" "^4.4.1"
+ "@react-pdf/types" "^2.5.0"
+ "abs-svg-path" "^0.1.1"
+ "color-string" "^1.9.1"
+ "normalize-svg-path" "^1.1.0"
+ "parse-svg-path" "^0.1.2"
+ "svg-arc-to-cubic-bezier" "^3.2.0"
+
+"@react-pdf/renderer@3.1.2":
+ "integrity" "sha512-r6L4PISzPDI59PU8e59cotTApiIZeUqkCy1ZluveJBGTsjE9qMhnKAtDFp1Ml3iKew0dyNkbgAOGAZOttiQxvQ=="
+ "resolved" "https://registry.npmjs.org/@react-pdf/renderer/-/renderer-3.1.2.tgz"
+ "version" "3.1.2"
+ dependencies:
+ "@babel/runtime" "^7.16.4"
+ "@react-pdf/font" "^2.3.1"
+ "@react-pdf/layout" "^3.3.0"
+ "@react-pdf/pdfkit" "^3.0.1"
+ "@react-pdf/primitives" "^3.0.0"
+ "@react-pdf/render" "^3.2.1"
+ "@react-pdf/types" "^2.2.0"
+ "loose-envify" "^1.1.0"
+ "object-assign" "^4.1.1"
+ "prop-types" "^15.6.2"
+ "queue" "^6.0.1"
+ "scheduler" "^0.17.0"
+
+"@react-pdf/stylesheet@^4.2.5":
+ "integrity" "sha512-XnmapeCW+hDuNdVwpuvO04WKv71wAs8aH+saIq29Bo2fp1SxznHTcQArTZtK6Wgr/E9BHXeB2iAPpUZuI6G+xA=="
+ "resolved" "https://registry.npmjs.org/@react-pdf/stylesheet/-/stylesheet-4.2.5.tgz"
+ "version" "4.2.5"
+ dependencies:
+ "@babel/runtime" "^7.20.13"
+ "@react-pdf/fns" "2.2.1"
+ "@react-pdf/types" "^2.5.0"
+ "color-string" "^1.9.1"
+ "hsl-to-hex" "^1.0.0"
+ "media-engine" "^1.0.3"
+ "postcss-value-parser" "^4.1.0"
+
+"@react-pdf/textkit@^4.4.1":
+ "integrity" "sha512-Jl9wdTqIvJ5pX+vAGz0EOhP7ut5Two9H6CzTKo/YYPeD79cM2yTXF3JzTERBC28y7LR0Waq9D2LHQjI+b/EYUQ=="
+ "resolved" "https://registry.npmjs.org/@react-pdf/textkit/-/textkit-4.4.1.tgz"
+ "version" "4.4.1"
+ dependencies:
+ "@babel/runtime" "^7.20.13"
+ "@react-pdf/fns" "2.2.1"
+ "bidi-js" "^1.0.2"
+ "hyphen" "^1.6.4"
+ "unicode-properties" "^1.4.1"
+
+"@react-pdf/types@^2.2.0", "@react-pdf/types@^2.5.0":
+ "integrity" "sha512-XsVRkt0hQ60I4e3leAVt+aZR3KJCaJd179BfJHAv4F4x6Vq3yqkry8lcbUWKGKDw1j3/8sW4FsgGR41SFvsG9A=="
+ "resolved" "https://registry.npmjs.org/@react-pdf/types/-/types-2.5.0.tgz"
+ "version" "2.5.0"
+
+"@reduxjs/toolkit@1.9.2":
+ "integrity" "sha512-5ZAZ7hwAKWSii5T6NTPmgIBUqyVdlDs+6JjThz6J6dmHLDm6zCzv2OjHIFAi3Vvs1qjmXU0bm6eBojukYXjVMQ=="
+ "resolved" "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.2.tgz"
+ "version" "1.9.2"
+ dependencies:
+ "immer" "^9.0.16"
+ "redux" "^4.2.0"
+ "redux-thunk" "^2.4.2"
+ "reselect" "^4.1.7"
+
+"@rushstack/eslint-patch@^1.1.3":
+ "integrity" "sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg=="
+ "resolved" "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.3.tgz"
+ "version" "1.10.3"
+
+"@svgr/babel-plugin-add-jsx-attribute@^6.5.1":
+ "integrity" "sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ=="
+ "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz"
+ "version" "6.5.1"
+
+"@svgr/babel-plugin-remove-jsx-attribute@*":
+ "integrity" "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA=="
+ "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz"
+ "version" "8.0.0"
+
+"@svgr/babel-plugin-remove-jsx-empty-expression@*":
+ "integrity" "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA=="
+ "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz"
+ "version" "8.0.0"
+
+"@svgr/babel-plugin-replace-jsx-attribute-value@^6.5.1":
+ "integrity" "sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg=="
+ "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz"
+ "version" "6.5.1"
+
+"@svgr/babel-plugin-svg-dynamic-title@^6.5.1":
+ "integrity" "sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw=="
+ "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz"
+ "version" "6.5.1"
+
+"@svgr/babel-plugin-svg-em-dimensions@^6.5.1":
+ "integrity" "sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA=="
+ "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz"
+ "version" "6.5.1"
+
+"@svgr/babel-plugin-transform-react-native-svg@^6.5.1":
+ "integrity" "sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg=="
+ "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz"
+ "version" "6.5.1"
+
+"@svgr/babel-plugin-transform-svg-component@^6.5.1":
+ "integrity" "sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ=="
+ "resolved" "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz"
+ "version" "6.5.1"
+
+"@svgr/babel-preset@^6.5.1":
+ "integrity" "sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw=="
+ "resolved" "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz"
+ "version" "6.5.1"
+ dependencies:
+ "@svgr/babel-plugin-add-jsx-attribute" "^6.5.1"
+ "@svgr/babel-plugin-remove-jsx-attribute" "*"
+ "@svgr/babel-plugin-remove-jsx-empty-expression" "*"
+ "@svgr/babel-plugin-replace-jsx-attribute-value" "^6.5.1"
+ "@svgr/babel-plugin-svg-dynamic-title" "^6.5.1"
+ "@svgr/babel-plugin-svg-em-dimensions" "^6.5.1"
+ "@svgr/babel-plugin-transform-react-native-svg" "^6.5.1"
+ "@svgr/babel-plugin-transform-svg-component" "^6.5.1"
+
+"@svgr/core@*", "@svgr/core@^6.0.0", "@svgr/core@^6.5.1":
+ "integrity" "sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw=="
+ "resolved" "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz"
+ "version" "6.5.1"
+ dependencies:
+ "@babel/core" "^7.19.6"
+ "@svgr/babel-preset" "^6.5.1"
+ "@svgr/plugin-jsx" "^6.5.1"
+ "camelcase" "^6.2.0"
+ "cosmiconfig" "^7.0.1"
+
+"@svgr/hast-util-to-babel-ast@^6.5.1":
+ "integrity" "sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw=="
+ "resolved" "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz"
+ "version" "6.5.1"
+ dependencies:
+ "@babel/types" "^7.20.0"
+ "entities" "^4.4.0"
+
+"@svgr/plugin-jsx@^6.5.1":
+ "integrity" "sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw=="
+ "resolved" "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz"
+ "version" "6.5.1"
+ dependencies:
+ "@babel/core" "^7.19.6"
+ "@svgr/babel-preset" "^6.5.1"
+ "@svgr/hast-util-to-babel-ast" "^6.5.1"
+ "svg-parser" "^2.0.4"
+
+"@svgr/plugin-svgo@^6.5.1":
+ "integrity" "sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ=="
+ "resolved" "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz"
+ "version" "6.5.1"
+ dependencies:
+ "cosmiconfig" "^7.0.1"
+ "deepmerge" "^4.2.2"
+ "svgo" "^2.8.0"
+
+"@svgr/webpack@6.5.1":
+ "integrity" "sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA=="
+ "resolved" "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.1.tgz"
+ "version" "6.5.1"
+ dependencies:
+ "@babel/core" "^7.19.6"
+ "@babel/plugin-transform-react-constant-elements" "^7.18.12"
+ "@babel/preset-env" "^7.19.4"
+ "@babel/preset-react" "^7.18.6"
+ "@babel/preset-typescript" "^7.18.6"
+ "@svgr/core" "^6.5.1"
+ "@svgr/plugin-jsx" "^6.5.1"
+ "@svgr/plugin-svgo" "^6.5.1"
+
+"@swc/helpers@^0.4.2":
+ "integrity" "sha512-5lxnyLEYFskErRPenYItLRSge5DjrJngYKdVjRSrWfza9G6KkgHEXi0vUZiyUeMU5JfXH1YnvXZzSp8ul88o2Q=="
+ "resolved" "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.36.tgz"
+ "version" "0.4.36"
+ dependencies:
+ "legacy-swc-helpers" "npm:@swc/helpers@=0.4.14"
+ "tslib" "^2.4.0"
+
+"@swc/helpers@0.4.14":
+ "integrity" "sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw=="
+ "resolved" "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.14.tgz"
+ "version" "0.4.14"
+ dependencies:
+ "tslib" "^2.4.0"
+
+"@tanstack/match-sorter-utils@8.15.1":
+ "integrity" "sha512-PnVV3d2poenUM31ZbZi/yXkBu3J7kd5k2u51CGwwNojag451AjTH9N6n41yjXz2fpLeewleyLBmNS6+HcGDlXw=="
+ "resolved" "https://registry.npmjs.org/@tanstack/match-sorter-utils/-/match-sorter-utils-8.15.1.tgz"
+ "version" "8.15.1"
+ dependencies:
+ "remove-accents" "0.5.0"
+
+"@tanstack/query-core@5.51.9":
+ "integrity" "sha512-HsAwaY5J19MD18ykZDS3aVVh+bAt0i7m6uQlFC2b77DLV9djo+xEN7MWQAQQTR8IM+7r/zbozTQ7P0xr0bHuew=="
+ "resolved" "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.51.9.tgz"
+ "version" "5.51.9"
+
+"@tanstack/query-devtools@5.51.9":
+ "integrity" "sha512-FQqJynaEDuwQxoFLP3/i10HQwNYh4wxgs0NeSoL24BLWvpUdstgHqUm2zgwRov8Tmh5kjndPIWaXenwl0D47EA=="
+ "resolved" "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.51.9.tgz"
+ "version" "5.51.9"
+
+"@tanstack/react-query-devtools@^5.51.11":
+ "integrity" "sha512-8nQRbhdtvl/J9bO+bk/kPQesCOtDgk+oI4AmZJDnkf5OfKTJL3J4tTe+fhuXph7KP4DUOS+ge9o9TGt0OgWFHw=="
+ "resolved" "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.51.11.tgz"
+ "version" "5.51.11"
+ dependencies:
+ "@tanstack/query-devtools" "5.51.9"
+
+"@tanstack/react-query@^5.51.11":
+ "integrity" "sha512-4Kq2x0XpDlpvSnaLG+8pHNH60zEc3mBvb3B2tOMDjcPCi/o+Du3p/9qpPLwJOTliVxxPJAP27fuIhLrsRdCr7A=="
+ "resolved" "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.51.11.tgz"
+ "version" "5.51.11"
+ dependencies:
+ "@tanstack/query-core" "5.51.9"
+
+"@tanstack/react-table@^8.19.2":
+ "integrity" "sha512-MtgPZc4y+cCRtU16y1vh1myuyZ2OdkWgMEBzyjYsoMWMicKZGZvcDnub3Zwb6XF2pj9iRMvm1SO1n57lS0vXLw=="
+ "resolved" "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.19.3.tgz"
+ "version" "8.19.3"
+ dependencies:
+ "@tanstack/table-core" "8.19.3"
+
+"@tanstack/react-table@8.16.0":
+ "integrity" "sha512-rKRjnt8ostqN2fercRVOIH/dq7MAmOENCMvVlKx6P9Iokhh6woBGnIZEkqsY/vEJf1jN3TqLOb34xQGLVRuhAg=="
+ "resolved" "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.16.0.tgz"
+ "version" "8.16.0"
+ dependencies:
+ "@tanstack/table-core" "8.16.0"
+
+"@tanstack/react-virtual@3.3.0":
+ "integrity" "sha512-QFxmTSZBniq15S0vSZ55P4ToXquMXwJypPXyX/ux7sYo6a2FX3/zWoRLLc4eIOGWTjvzqcIVNKhcuFb+OZL3aQ=="
+ "resolved" "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.3.0.tgz"
+ "version" "3.3.0"
+ dependencies:
+ "@tanstack/virtual-core" "3.3.0"
+
+"@tanstack/table-core@8.16.0":
+ "integrity" "sha512-dCG8vQGk4js5v88/k83tTedWOwjGnIyONrKpHpfmSJB8jwFHl8GSu1sBBxbtACVAPtAQgwNxl0rw1d3RqRM1Tg=="
+ "resolved" "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.16.0.tgz"
+ "version" "8.16.0"
+
+"@tanstack/table-core@8.19.3":
+ "integrity" "sha512-IqREj9ADoml9zCAouIG/5kCGoyIxPFdqdyoxis9FisXFi5vT+iYfEfLosq4xkU/iDbMcEuAj+X8dWRLvKYDNoQ=="
+ "resolved" "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.19.3.tgz"
+ "version" "8.19.3"
+
+"@tanstack/virtual-core@3.3.0":
+ "integrity" "sha512-A0004OAa1FcUkPHeeGoKgBrAgjH+uHdDPrw1L7RpkwnODYqRvoilqsHPs8cyTjMg1byZBbiNpQAq2TlFLIaQag=="
+ "resolved" "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.3.0.tgz"
+ "version" "3.3.0"
+
+"@trysound/sax@0.2.0":
+ "integrity" "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA=="
+ "resolved" "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz"
+ "version" "0.2.0"
+
+"@types/debug@^4.0.0":
+ "integrity" "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="
+ "resolved" "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz"
+ "version" "4.1.12"
+ dependencies:
+ "@types/ms" "*"
+
+"@types/hast@^2.0.0":
+ "integrity" "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw=="
+ "resolved" "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz"
+ "version" "2.3.10"
+ dependencies:
+ "@types/unist" "^2"
+
+"@types/hoist-non-react-statics@^3.3.0", "@types/hoist-non-react-statics@^3.3.1":
+ "integrity" "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg=="
+ "resolved" "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz"
+ "version" "3.3.5"
+ dependencies:
+ "@types/react" "*"
+ "hoist-non-react-statics" "^3.3.0"
+
+"@types/json5@^0.0.29":
+ "integrity" "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="
+ "resolved" "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz"
+ "version" "0.0.29"
+
+"@types/lodash-es@^4.17.6":
+ "integrity" "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ=="
+ "resolved" "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz"
+ "version" "4.17.12"
+ dependencies:
+ "@types/lodash" "*"
+
+"@types/lodash@*", "@types/lodash@^4.14.175":
+ "integrity" "sha512-OpXEVoCKSS3lQqjx9GGGOapBeuW5eUboYHRlHP9urXPX25IKZ6AnP5ZRxtVf63iieUbsHxLn8NQ5Nlftc6yzAA=="
+ "resolved" "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.6.tgz"
+ "version" "4.17.6"
+
+"@types/mdast@^3.0.0":
+ "integrity" "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ=="
+ "resolved" "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz"
+ "version" "3.0.15"
+ dependencies:
+ "@types/unist" "^2"
+
+"@types/ms@*":
+ "integrity" "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g=="
+ "resolved" "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz"
+ "version" "0.7.34"
+
+"@types/node@*":
+ "integrity" "sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA=="
+ "resolved" "https://registry.npmjs.org/@types/node/-/node-20.14.11.tgz"
+ "version" "20.14.11"
+ dependencies:
+ "undici-types" "~5.26.4"
+
+"@types/papaparse@^5.3.9":
+ "integrity" "sha512-LxJ4iEFcpqc6METwp9f6BV6VVc43m6MfH0VqFosHvrUgfXiFe6ww7R3itkOQ+TCK6Y+Iv/+RnnvtRZnkc5Kc9g=="
+ "resolved" "https://registry.npmjs.org/@types/papaparse/-/papaparse-5.3.14.tgz"
+ "version" "5.3.14"
+ dependencies:
+ "@types/node" "*"
+
+"@types/parse-json@^4.0.0":
+ "integrity" "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw=="
+ "resolved" "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz"
+ "version" "4.0.2"
+
+"@types/prop-types@*", "@types/prop-types@^15.0.0", "@types/prop-types@^15.7.12":
+ "integrity" "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q=="
+ "resolved" "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz"
+ "version" "15.7.12"
+
+"@types/quill@^1.3.10":
+ "integrity" "sha512-IhW3fPW+bkt9MLNlycw8u8fWb7oO7W5URC9MfZYHBlA24rex9rs23D5DETChu1zvgVdc5ka64ICjJOgQMr6Shw=="
+ "resolved" "https://registry.npmjs.org/@types/quill/-/quill-1.3.10.tgz"
+ "version" "1.3.10"
+ dependencies:
+ "parchment" "^1.1.2"
+
+"@types/raf@^3.4.0":
+ "integrity" "sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw=="
+ "resolved" "https://registry.npmjs.org/@types/raf/-/raf-3.4.3.tgz"
+ "version" "3.4.3"
+
+"@types/react-redux@^7.1.20":
+ "integrity" "sha512-NF8m5AjWCkert+fosDsN3hAlHzpjSiXlVy9EgQEmLoBhaNXbmyeGs/aj5dQzKuF+/q+S7JQagorGDW8pJ28Hmg=="
+ "resolved" "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.33.tgz"
+ "version" "7.1.33"
+ dependencies:
+ "@types/hoist-non-react-statics" "^3.3.0"
+ "@types/react" "*"
+ "hoist-non-react-statics" "^3.3.0"
+ "redux" "^4.0.0"
+
+"@types/react-transition-group@^4.4.5":
+ "integrity" "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q=="
+ "resolved" "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz"
+ "version" "4.4.10"
+ dependencies:
+ "@types/react" "*"
+
+"@types/react@*", "@types/react@^16.8 || ^17.0 || ^18.0", "@types/react@^17.0.0 || ^18.0.0", "@types/react@>=16":
+ "integrity" "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw=="
+ "resolved" "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz"
+ "version" "18.3.3"
+ dependencies:
+ "@types/prop-types" "*"
+ "csstype" "^3.0.2"
+
+"@types/unist@^2", "@types/unist@^2.0.0":
+ "integrity" "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
+ "resolved" "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz"
+ "version" "2.0.10"
+
+"@types/use-sync-external-store@^0.0.3":
+ "integrity" "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA=="
+ "resolved" "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz"
+ "version" "0.0.3"
+
+"@typescript-eslint/parser@^5.42.0":
+ "integrity" "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA=="
+ "resolved" "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz"
+ "version" "5.62.0"
+ dependencies:
+ "@typescript-eslint/scope-manager" "5.62.0"
+ "@typescript-eslint/types" "5.62.0"
+ "@typescript-eslint/typescript-estree" "5.62.0"
+ "debug" "^4.3.4"
+
+"@typescript-eslint/scope-manager@5.62.0":
+ "integrity" "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w=="
+ "resolved" "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz"
+ "version" "5.62.0"
+ dependencies:
+ "@typescript-eslint/types" "5.62.0"
+ "@typescript-eslint/visitor-keys" "5.62.0"
+
+"@typescript-eslint/types@5.62.0":
+ "integrity" "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ=="
+ "resolved" "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz"
+ "version" "5.62.0"
+
+"@typescript-eslint/typescript-estree@5.62.0":
+ "integrity" "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA=="
+ "resolved" "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz"
+ "version" "5.62.0"
+ dependencies:
+ "@typescript-eslint/types" "5.62.0"
+ "@typescript-eslint/visitor-keys" "5.62.0"
+ "debug" "^4.3.4"
+ "globby" "^11.1.0"
+ "is-glob" "^4.0.3"
+ "semver" "^7.3.7"
+ "tsutils" "^3.21.0"
+
+"@typescript-eslint/visitor-keys@5.62.0":
+ "integrity" "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw=="
+ "resolved" "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz"
+ "version" "5.62.0"
+ dependencies:
+ "@typescript-eslint/types" "5.62.0"
+ "eslint-visitor-keys" "^3.3.0"
+
+"abs-svg-path@^0.1.1":
+ "integrity" "sha512-d8XPSGjfyzlXC3Xx891DJRyZfqk5JU0BJrDQcsWomFIV1/BIzPW5HDH5iDdWpqWaav0YVIEzT1RHTwWr0FFshA=="
+ "resolved" "https://registry.npmjs.org/abs-svg-path/-/abs-svg-path-0.1.1.tgz"
+ "version" "0.1.1"
+
+"acorn-jsx@^5.3.2":
+ "integrity" "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="
+ "resolved" "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz"
+ "version" "5.3.2"
+
+"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", "acorn@^8.9.0":
+ "integrity" "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg=="
+ "resolved" "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz"
+ "version" "8.12.1"
+
+"ajv@^6.10.0", "ajv@^6.12.4":
+ "integrity" "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="
+ "resolved" "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz"
+ "version" "6.12.6"
+ dependencies:
+ "fast-deep-equal" "^3.1.1"
+ "fast-json-stable-stringify" "^2.0.0"
+ "json-schema-traverse" "^0.4.1"
+ "uri-js" "^4.2.2"
+
+"ansi-regex@^5.0.1":
+ "integrity" "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
+ "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz"
+ "version" "5.0.1"
+
+"ansi-styles@^3.2.1":
+ "integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="
+ "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz"
+ "version" "3.2.1"
+ dependencies:
+ "color-convert" "^1.9.0"
+
+"ansi-styles@^4.1.0":
+ "integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="
+ "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz"
+ "version" "4.3.0"
+ dependencies:
+ "color-convert" "^2.0.1"
+
+"apexcharts@^3.18.0", "apexcharts@3.36.3":
+ "integrity" "sha512-8/FXEs0ohXMff07Gv28XjhPwEJphIUdq2/wii/pcvi54Tw6z1mjrV8ydN8rlWi/ve8BAPBefJkLmRWv7UOBsLw=="
+ "resolved" "https://registry.npmjs.org/apexcharts/-/apexcharts-3.36.3.tgz"
+ "version" "3.36.3"
+ dependencies:
+ "svg.draggable.js" "^2.2.2"
+ "svg.easing.js" "^2.0.0"
+ "svg.filter.js" "^2.0.2"
+ "svg.pathmorphing.js" "^0.1.3"
+ "svg.resize.js" "^1.4.3"
+ "svg.select.js" "^3.0.1"
+
+"argparse@^1.0.7":
+ "integrity" "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="
+ "resolved" "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz"
+ "version" "1.0.10"
+ dependencies:
+ "sprintf-js" "~1.0.2"
+
+"argparse@^2.0.1":
+ "integrity" "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
+ "resolved" "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz"
+ "version" "2.0.1"
+
+"aria-query@~5.1.3":
+ "integrity" "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ=="
+ "resolved" "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz"
+ "version" "5.1.3"
+ dependencies:
+ "deep-equal" "^2.0.5"
+
+"array-buffer-byte-length@^1.0.0", "array-buffer-byte-length@^1.0.1":
+ "integrity" "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg=="
+ "resolved" "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz"
+ "version" "1.0.1"
+ dependencies:
+ "call-bind" "^1.0.5"
+ "is-array-buffer" "^3.0.4"
+
+"array-includes@^3.1.6", "array-includes@^3.1.7", "array-includes@^3.1.8":
+ "integrity" "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ=="
+ "resolved" "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz"
+ "version" "3.1.8"
+ dependencies:
+ "call-bind" "^1.0.7"
+ "define-properties" "^1.2.1"
+ "es-abstract" "^1.23.2"
+ "es-object-atoms" "^1.0.0"
+ "get-intrinsic" "^1.2.4"
+ "is-string" "^1.0.7"
+
+"array-union@^2.1.0":
+ "integrity" "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="
+ "resolved" "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz"
+ "version" "2.1.0"
+
+"array.prototype.findlast@^1.2.5":
+ "integrity" "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ=="
+ "resolved" "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz"
+ "version" "1.2.5"
+ dependencies:
+ "call-bind" "^1.0.7"
+ "define-properties" "^1.2.1"
+ "es-abstract" "^1.23.2"
+ "es-errors" "^1.3.0"
+ "es-object-atoms" "^1.0.0"
+ "es-shim-unscopables" "^1.0.2"
+
+"array.prototype.findlastindex@^1.2.3":
+ "integrity" "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ=="
+ "resolved" "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz"
+ "version" "1.2.5"
+ dependencies:
+ "call-bind" "^1.0.7"
+ "define-properties" "^1.2.1"
+ "es-abstract" "^1.23.2"
+ "es-errors" "^1.3.0"
+ "es-object-atoms" "^1.0.0"
+ "es-shim-unscopables" "^1.0.2"
+
+"array.prototype.flat@^1.3.1", "array.prototype.flat@^1.3.2":
+ "integrity" "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA=="
+ "resolved" "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz"
+ "version" "1.3.2"
+ dependencies:
+ "call-bind" "^1.0.2"
+ "define-properties" "^1.2.0"
+ "es-abstract" "^1.22.1"
+ "es-shim-unscopables" "^1.0.0"
+
+"array.prototype.flatmap@^1.3.2":
+ "integrity" "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ=="
+ "resolved" "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz"
+ "version" "1.3.2"
+ dependencies:
+ "call-bind" "^1.0.2"
+ "define-properties" "^1.2.0"
+ "es-abstract" "^1.22.1"
+ "es-shim-unscopables" "^1.0.0"
+
+"array.prototype.toreversed@^1.1.2":
+ "integrity" "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA=="
+ "resolved" "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz"
+ "version" "1.1.2"
+ dependencies:
+ "call-bind" "^1.0.2"
+ "define-properties" "^1.2.0"
+ "es-abstract" "^1.22.1"
+ "es-shim-unscopables" "^1.0.0"
+
+"array.prototype.tosorted@^1.1.4":
+ "integrity" "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA=="
+ "resolved" "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz"
+ "version" "1.1.4"
+ dependencies:
+ "call-bind" "^1.0.7"
+ "define-properties" "^1.2.1"
+ "es-abstract" "^1.23.3"
+ "es-errors" "^1.3.0"
+ "es-shim-unscopables" "^1.0.2"
+
+"arraybuffer.prototype.slice@^1.0.3":
+ "integrity" "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A=="
+ "resolved" "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz"
+ "version" "1.0.3"
+ dependencies:
+ "array-buffer-byte-length" "^1.0.1"
+ "call-bind" "^1.0.5"
+ "define-properties" "^1.2.1"
+ "es-abstract" "^1.22.3"
+ "es-errors" "^1.2.1"
+ "get-intrinsic" "^1.2.3"
+ "is-array-buffer" "^3.0.4"
+ "is-shared-array-buffer" "^1.0.2"
+
+"ast-types-flow@^0.0.8":
+ "integrity" "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ=="
+ "resolved" "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz"
+ "version" "0.0.8"
+
+"asynckit@^0.4.0":
+ "integrity" "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ "resolved" "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz"
+ "version" "0.4.0"
+
+"atob@^2.1.2":
+ "integrity" "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="
+ "resolved" "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz"
+ "version" "2.1.2"
+
+"attr-accept@^2.2.2":
+ "integrity" "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg=="
+ "resolved" "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz"
+ "version" "2.2.2"
+
+"available-typed-arrays@^1.0.7":
+ "integrity" "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="
+ "resolved" "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz"
+ "version" "1.0.7"
+ dependencies:
+ "possible-typed-array-names" "^1.0.0"
+
+"axe-core@^4.9.1":
+ "integrity" "sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw=="
+ "resolved" "https://registry.npmjs.org/axe-core/-/axe-core-4.9.1.tgz"
+ "version" "4.9.1"
+
+"axios@^1.7.2":
+ "integrity" "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw=="
+ "resolved" "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz"
+ "version" "1.7.2"
+ dependencies:
+ "follow-redirects" "^1.15.6"
+ "form-data" "^4.0.0"
+ "proxy-from-env" "^1.1.0"
+
+"axobject-query@~3.1.1":
+ "integrity" "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg=="
+ "resolved" "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz"
+ "version" "3.1.1"
+ dependencies:
+ "deep-equal" "^2.0.5"
+
+"babel-plugin-macros@^3.1.0":
+ "integrity" "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg=="
+ "resolved" "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz"
+ "version" "3.1.0"
+ dependencies:
+ "@babel/runtime" "^7.12.5"
+ "cosmiconfig" "^7.0.0"
+ "resolve" "^1.19.0"
+
+"babel-plugin-polyfill-corejs2@^0.4.10":
+ "integrity" "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q=="
+ "resolved" "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz"
+ "version" "0.4.11"
+ dependencies:
+ "@babel/compat-data" "^7.22.6"
+ "@babel/helper-define-polyfill-provider" "^0.6.2"
+ "semver" "^6.3.1"
+
+"babel-plugin-polyfill-corejs3@^0.10.4":
+ "integrity" "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg=="
+ "resolved" "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz"
+ "version" "0.10.4"
+ dependencies:
+ "@babel/helper-define-polyfill-provider" "^0.6.1"
+ "core-js-compat" "^3.36.1"
+
+"babel-plugin-polyfill-regenerator@^0.6.1":
+ "integrity" "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg=="
+ "resolved" "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz"
+ "version" "0.6.2"
+ dependencies:
+ "@babel/helper-define-polyfill-provider" "^0.6.2"
+
+"bail@^2.0.0":
+ "integrity" "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="
+ "resolved" "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz"
+ "version" "2.0.2"
+
+"balanced-match@^1.0.0":
+ "integrity" "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ "resolved" "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz"
+ "version" "1.0.2"
+
+"base64-arraybuffer@^1.0.2":
+ "integrity" "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ=="
+ "resolved" "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz"
+ "version" "1.0.2"
+
+"base64-js@^1.1.2", "base64-js@^1.3.0":
+ "integrity" "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
+ "resolved" "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz"
+ "version" "1.5.1"
+
+"bidi-js@^1.0.2":
+ "integrity" "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw=="
+ "resolved" "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz"
+ "version" "1.0.3"
+ dependencies:
+ "require-from-string" "^2.0.2"
+
+"boolbase@^1.0.0":
+ "integrity" "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="
+ "resolved" "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz"
+ "version" "1.0.0"
+
+"brace-expansion@^1.1.7":
+ "integrity" "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="
+ "resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz"
+ "version" "1.1.11"
+ dependencies:
+ "balanced-match" "^1.0.0"
+ "concat-map" "0.0.1"
+
+"braces@^3.0.3":
+ "integrity" "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="
+ "resolved" "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz"
+ "version" "3.0.3"
+ dependencies:
+ "fill-range" "^7.1.1"
+
+"brotli@^1.3.2":
+ "integrity" "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg=="
+ "resolved" "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz"
+ "version" "1.3.3"
+ dependencies:
+ "base64-js" "^1.1.2"
+
+"browserify-zlib@^0.2.0":
+ "integrity" "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA=="
+ "resolved" "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz"
+ "version" "0.2.0"
+ dependencies:
+ "pako" "~1.0.5"
+
+"browserslist@^4.23.0", "browserslist@^4.23.1", "browserslist@>= 4.21.0":
+ "integrity" "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA=="
+ "resolved" "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz"
+ "version" "4.23.2"
+ dependencies:
+ "caniuse-lite" "^1.0.30001640"
+ "electron-to-chromium" "^1.4.820"
+ "node-releases" "^2.0.14"
+ "update-browserslist-db" "^1.1.0"
+
+"btoa@^1.2.1":
+ "integrity" "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g=="
+ "resolved" "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz"
+ "version" "1.2.1"
+
+"buffer-from@~0.1.1":
+ "integrity" "sha512-RiWIenusJsmI2KcvqQABB83tLxCByE3upSP8QU3rJDMVFGPWLvPQJt/O1Su9moRWeH7d+Q2HYb68f6+v+tw2vg=="
+ "resolved" "https://registry.npmjs.org/buffer-from/-/buffer-from-0.1.2.tgz"
+ "version" "0.1.2"
+
+"call-bind@^1.0.2", "call-bind@^1.0.5", "call-bind@^1.0.6", "call-bind@^1.0.7":
+ "integrity" "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w=="
+ "resolved" "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz"
+ "version" "1.0.7"
+ dependencies:
+ "es-define-property" "^1.0.0"
+ "es-errors" "^1.3.0"
+ "function-bind" "^1.1.2"
+ "get-intrinsic" "^1.2.4"
+ "set-function-length" "^1.2.1"
+
+"callsites@^3.0.0":
+ "integrity" "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
+ "resolved" "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz"
+ "version" "3.1.0"
+
+"camelcase@^6.2.0":
+ "integrity" "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="
+ "resolved" "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz"
+ "version" "6.3.0"
+
+"can-use-dom@^0.1.0":
+ "integrity" "sha512-ceOhN1DL7Y4O6M0j9ICgmTYziV89WMd96SvSl0REd8PMgrY0B/WBOPoed5S1KUmJqXgUXh8gzSe6E3ae27upsQ=="
+ "resolved" "https://registry.npmjs.org/can-use-dom/-/can-use-dom-0.1.0.tgz"
+ "version" "0.1.0"
+
+"caniuse-lite@^1.0.30001406", "caniuse-lite@^1.0.30001640":
+ "integrity" "sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA=="
+ "resolved" "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001642.tgz"
+ "version" "1.0.30001642"
+
+"canvg@^3.0.6":
+ "integrity" "sha512-qwR2FRNO9NlzTeKIPIKpnTY6fqwuYSequ8Ru8c0YkYU7U0oW+hLUvWadLvAu1Rl72OMNiFhoLu4f8eUjQ7l/+Q=="
+ "resolved" "https://registry.npmjs.org/canvg/-/canvg-3.0.10.tgz"
+ "version" "3.0.10"
+ dependencies:
+ "@babel/runtime" "^7.12.5"
+ "@types/raf" "^3.4.0"
+ "core-js" "^3.8.3"
+ "raf" "^3.4.1"
+ "regenerator-runtime" "^0.13.7"
+ "rgbcolor" "^1.0.1"
+ "stackblur-canvas" "^2.0.0"
+ "svg-pathdata" "^6.0.3"
+
+"chalk@^2.4.2":
+ "integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="
+ "resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz"
+ "version" "2.4.2"
+ dependencies:
+ "ansi-styles" "^3.2.1"
+ "escape-string-regexp" "^1.0.5"
+ "supports-color" "^5.3.0"
+
+"chalk@^4.0.0":
+ "integrity" "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="
+ "resolved" "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz"
+ "version" "4.1.2"
+ dependencies:
+ "ansi-styles" "^4.1.0"
+ "supports-color" "^7.1.0"
+
+"character-entities-legacy@^1.0.0":
+ "integrity" "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA=="
+ "resolved" "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz"
+ "version" "1.1.4"
+
+"character-entities@^1.0.0":
+ "integrity" "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw=="
+ "resolved" "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz"
+ "version" "1.2.4"
+
+"character-entities@^2.0.0":
+ "integrity" "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="
+ "resolved" "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz"
+ "version" "2.0.2"
+
+"character-reference-invalid@^1.0.0":
+ "integrity" "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg=="
+ "resolved" "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz"
+ "version" "1.1.4"
+
+"client-only@0.0.1":
+ "integrity" "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="
+ "resolved" "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz"
+ "version" "0.0.1"
+
+"clone@^2.1.1", "clone@^2.1.2":
+ "integrity" "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w=="
+ "resolved" "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz"
+ "version" "2.1.2"
+
+"clsx@^1.2.1":
+ "integrity" "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg=="
+ "resolved" "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz"
+ "version" "1.2.1"
+
+"color-convert@^1.9.0":
+ "integrity" "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="
+ "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz"
+ "version" "1.9.3"
+ dependencies:
+ "color-name" "1.1.3"
+
+"color-convert@^2.0.1":
+ "integrity" "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="
+ "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz"
+ "version" "2.0.1"
+ dependencies:
+ "color-name" "~1.1.4"
+
+"color-name@^1.0.0", "color-name@1.1.3":
+ "integrity" "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
+ "version" "1.1.3"
+
+"color-name@~1.1.4":
+ "integrity" "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
+ "version" "1.1.4"
+
+"color-string@^1.9.1":
+ "integrity" "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg=="
+ "resolved" "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz"
+ "version" "1.9.1"
+ dependencies:
+ "color-name" "^1.0.0"
+ "simple-swizzle" "^0.2.2"
+
+"combined-stream@^1.0.8":
+ "integrity" "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="
+ "resolved" "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz"
+ "version" "1.0.8"
+ dependencies:
+ "delayed-stream" "~1.0.0"
+
+"comma-separated-tokens@^1.0.0":
+ "integrity" "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw=="
+ "resolved" "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz"
+ "version" "1.0.8"
+
+"comma-separated-tokens@^2.0.0":
+ "integrity" "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="
+ "resolved" "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz"
+ "version" "2.0.3"
+
+"commander@^7.2.0":
+ "integrity" "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="
+ "resolved" "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz"
+ "version" "7.2.0"
+
+"concat-map@0.0.1":
+ "integrity" "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+ "resolved" "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
+ "version" "0.0.1"
+
+"convert-source-map@^1.5.0":
+ "integrity" "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="
+ "resolved" "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz"
+ "version" "1.9.0"
+
+"convert-source-map@^2.0.0":
+ "integrity" "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="
+ "resolved" "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz"
+ "version" "2.0.0"
+
+"copy-to-clipboard@^3.3.1":
+ "integrity" "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA=="
+ "resolved" "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz"
+ "version" "3.3.3"
+ dependencies:
+ "toggle-selection" "^1.0.6"
+
+"core-js-compat@^3.36.1", "core-js-compat@^3.37.1":
+ "integrity" "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg=="
+ "resolved" "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz"
+ "version" "3.37.1"
+ dependencies:
+ "browserslist" "^4.23.0"
+
+"core-js@^3.6.0", "core-js@^3.8.3":
+ "integrity" "sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw=="
+ "resolved" "https://registry.npmjs.org/core-js/-/core-js-3.37.1.tgz"
+ "version" "3.37.1"
+
+"core-util-is@~1.0.0":
+ "integrity" "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
+ "resolved" "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz"
+ "version" "1.0.3"
+
+"cosmiconfig@^7.0.0", "cosmiconfig@^7.0.1":
+ "integrity" "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA=="
+ "resolved" "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz"
+ "version" "7.1.0"
+ dependencies:
+ "@types/parse-json" "^4.0.0"
+ "import-fresh" "^3.2.1"
+ "parse-json" "^5.0.0"
+ "path-type" "^4.0.0"
+ "yaml" "^1.10.0"
+
+"cross-fetch@^3.1.5":
+ "integrity" "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg=="
+ "resolved" "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz"
+ "version" "3.1.8"
+ dependencies:
+ "node-fetch" "^2.6.12"
+
+"cross-spawn@^7.0.2":
+ "integrity" "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w=="
+ "resolved" "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz"
+ "version" "7.0.3"
+ dependencies:
+ "path-key" "^3.1.0"
+ "shebang-command" "^2.0.0"
+ "which" "^2.0.1"
+
+"crypto-js@^4.2.0":
+ "integrity" "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q=="
+ "resolved" "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz"
+ "version" "4.2.0"
+
+"css-box-model@^1.2.0":
+ "integrity" "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw=="
+ "resolved" "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz"
+ "version" "1.2.1"
+ dependencies:
+ "tiny-invariant" "^1.0.6"
+
+"css-line-break@^2.1.0":
+ "integrity" "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w=="
+ "resolved" "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz"
+ "version" "2.1.0"
+ dependencies:
+ "utrie" "^1.0.2"
+
+"css-select@^4.1.3":
+ "integrity" "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ=="
+ "resolved" "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz"
+ "version" "4.3.0"
+ dependencies:
+ "boolbase" "^1.0.0"
+ "css-what" "^6.0.1"
+ "domhandler" "^4.3.1"
+ "domutils" "^2.8.0"
+ "nth-check" "^2.0.1"
+
+"css-tree@^1.1.2", "css-tree@^1.1.3":
+ "integrity" "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q=="
+ "resolved" "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz"
+ "version" "1.1.3"
+ dependencies:
+ "mdn-data" "2.0.14"
+ "source-map" "^0.6.1"
+
+"css-what@^6.0.1":
+ "integrity" "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw=="
+ "resolved" "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz"
+ "version" "6.1.0"
+
+"cssjanus@^2.0.1":
+ "integrity" "sha512-kAijbny3GmdOi9k+QT6DGIXqFvL96aksNlGr4Rhk9qXDZYWUojU4bRc3IHWxdaLNOqgEZHuXoe5Wl2l7dxLW5g=="
+ "resolved" "https://registry.npmjs.org/cssjanus/-/cssjanus-2.1.0.tgz"
+ "version" "2.1.0"
+
+"csso@^4.2.0":
+ "integrity" "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA=="
+ "resolved" "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz"
+ "version" "4.2.0"
+ dependencies:
+ "css-tree" "^1.1.2"
+
+"csstype@^3.0.10", "csstype@^3.0.2", "csstype@^3.1.1", "csstype@^3.1.3":
+ "integrity" "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
+ "resolved" "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz"
+ "version" "3.1.3"
+
+"damerau-levenshtein@^1.0.8":
+ "integrity" "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA=="
+ "resolved" "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz"
+ "version" "1.0.8"
+
+"data-view-buffer@^1.0.1":
+ "integrity" "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA=="
+ "resolved" "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz"
+ "version" "1.0.1"
+ dependencies:
+ "call-bind" "^1.0.6"
+ "es-errors" "^1.3.0"
+ "is-data-view" "^1.0.1"
+
+"data-view-byte-length@^1.0.1":
+ "integrity" "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ=="
+ "resolved" "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz"
+ "version" "1.0.1"
+ dependencies:
+ "call-bind" "^1.0.7"
+ "es-errors" "^1.3.0"
+ "is-data-view" "^1.0.1"
+
+"data-view-byte-offset@^1.0.0":
+ "integrity" "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA=="
+ "resolved" "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz"
+ "version" "1.0.0"
+ dependencies:
+ "call-bind" "^1.0.6"
+ "es-errors" "^1.3.0"
+ "is-data-view" "^1.0.1"
+
+"date-fns@^2.0.0", "date-fns@^2.25.0", "date-fns@2.29.3":
+ "integrity" "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA=="
+ "resolved" "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz"
+ "version" "2.29.3"
+
+"debug@^3.2.7":
+ "integrity" "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="
+ "resolved" "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz"
+ "version" "3.2.7"
+ dependencies:
+ "ms" "^2.1.1"
+
+"debug@^4.0.0", "debug@^4.1.0", "debug@^4.1.1", "debug@^4.3.1", "debug@^4.3.2", "debug@^4.3.4":
+ "integrity" "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg=="
+ "resolved" "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz"
+ "version" "4.3.5"
+ dependencies:
+ "ms" "2.1.2"
+
+"decode-named-character-reference@^1.0.0":
+ "integrity" "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg=="
+ "resolved" "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz"
+ "version" "1.0.2"
+ dependencies:
+ "character-entities" "^2.0.0"
+
+"deep-equal@^1.0.1":
+ "integrity" "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg=="
+ "resolved" "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz"
+ "version" "1.1.2"
+ dependencies:
+ "is-arguments" "^1.1.1"
+ "is-date-object" "^1.0.5"
+ "is-regex" "^1.1.4"
+ "object-is" "^1.1.5"
+ "object-keys" "^1.1.1"
+ "regexp.prototype.flags" "^1.5.1"
+
+"deep-equal@^2.0.5":
+ "integrity" "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA=="
+ "resolved" "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz"
+ "version" "2.2.3"
+ dependencies:
+ "array-buffer-byte-length" "^1.0.0"
+ "call-bind" "^1.0.5"
+ "es-get-iterator" "^1.1.3"
+ "get-intrinsic" "^1.2.2"
+ "is-arguments" "^1.1.1"
+ "is-array-buffer" "^3.0.2"
+ "is-date-object" "^1.0.5"
+ "is-regex" "^1.1.4"
+ "is-shared-array-buffer" "^1.0.2"
+ "isarray" "^2.0.5"
+ "object-is" "^1.1.5"
+ "object-keys" "^1.1.1"
+ "object.assign" "^4.1.4"
+ "regexp.prototype.flags" "^1.5.1"
+ "side-channel" "^1.0.4"
+ "which-boxed-primitive" "^1.0.2"
+ "which-collection" "^1.0.1"
+ "which-typed-array" "^1.1.13"
+
+"deep-is@^0.1.3":
+ "integrity" "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="
+ "resolved" "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz"
+ "version" "0.1.4"
+
+"deepmerge@^2.1.1":
+ "integrity" "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA=="
+ "resolved" "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz"
+ "version" "2.2.1"
+
+"deepmerge@^4.2.2":
+ "integrity" "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="
+ "resolved" "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz"
+ "version" "4.3.1"
+
+"define-data-property@^1.0.1", "define-data-property@^1.1.4":
+ "integrity" "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="
+ "resolved" "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz"
+ "version" "1.1.4"
+ dependencies:
+ "es-define-property" "^1.0.0"
+ "es-errors" "^1.3.0"
+ "gopd" "^1.0.1"
+
+"define-properties@^1.1.3", "define-properties@^1.2.0", "define-properties@^1.2.1":
+ "integrity" "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="
+ "resolved" "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz"
+ "version" "1.2.1"
+ dependencies:
+ "define-data-property" "^1.0.1"
+ "has-property-descriptors" "^1.0.0"
+ "object-keys" "^1.1.1"
+
+"delayed-stream@~1.0.0":
+ "integrity" "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
+ "resolved" "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz"
+ "version" "1.0.0"
+
+"dequal@^2.0.0":
+ "integrity" "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="
+ "resolved" "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz"
+ "version" "2.0.3"
+
+"dfa@^1.2.0":
+ "integrity" "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q=="
+ "resolved" "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz"
+ "version" "1.2.0"
+
+"diff@^5.0.0":
+ "integrity" "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A=="
+ "resolved" "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz"
+ "version" "5.2.0"
+
+"dir-glob@^3.0.1":
+ "integrity" "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="
+ "resolved" "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz"
+ "version" "3.0.1"
+ dependencies:
+ "path-type" "^4.0.0"
+
+"doctrine@^2.1.0":
+ "integrity" "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="
+ "resolved" "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz"
+ "version" "2.1.0"
+ dependencies:
+ "esutils" "^2.0.2"
+
+"doctrine@^3.0.0":
+ "integrity" "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="
+ "resolved" "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "esutils" "^2.0.2"
+
+"dom-helpers@^5.0.1":
+ "integrity" "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA=="
+ "resolved" "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz"
+ "version" "5.2.1"
+ dependencies:
+ "@babel/runtime" "^7.8.7"
+ "csstype" "^3.0.2"
+
+"dom-serializer@^1.0.1":
+ "integrity" "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag=="
+ "resolved" "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz"
+ "version" "1.4.1"
+ dependencies:
+ "domelementtype" "^2.0.1"
+ "domhandler" "^4.2.0"
+ "entities" "^2.0.0"
+
+"domelementtype@^2.0.1", "domelementtype@^2.2.0":
+ "integrity" "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="
+ "resolved" "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz"
+ "version" "2.3.0"
+
+"domhandler@^4.2.0", "domhandler@^4.3.1":
+ "integrity" "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ=="
+ "resolved" "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz"
+ "version" "4.3.1"
+ dependencies:
+ "domelementtype" "^2.2.0"
+
+"dompurify@^2.2.0":
+ "integrity" "sha512-zUTaUBO8pY4+iJMPE1B9XlO2tXVYIcEA4SNGtvDELzTSCQO7RzH+j7S180BmhmJId78lqGU2z19vgVx2Sxs/PQ=="
+ "resolved" "https://registry.npmjs.org/dompurify/-/dompurify-2.5.6.tgz"
+ "version" "2.5.6"
+
+"domutils@^2.8.0":
+ "integrity" "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A=="
+ "resolved" "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz"
+ "version" "2.8.0"
+ dependencies:
+ "dom-serializer" "^1.0.1"
+ "domelementtype" "^2.2.0"
+ "domhandler" "^4.2.0"
+
+"duplexer2@^0.1.2":
+ "integrity" "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA=="
+ "resolved" "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz"
+ "version" "0.1.4"
+ dependencies:
+ "readable-stream" "^2.0.2"
+
+"electron-to-chromium@^1.4.820":
+ "integrity" "sha512-VY+J0e4SFcNfQy19MEoMdaIcZLmDCprqvBtkii1WTCTQHpRvf5N8+3kTYCgL/PcntvwQvmMJWTuDPsq+IlhWKQ=="
+ "resolved" "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.827.tgz"
+ "version" "1.4.827"
+
+"emoji-regex@^10.3.0":
+ "integrity" "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw=="
+ "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz"
+ "version" "10.3.0"
+
+"emoji-regex@^9.2.2":
+ "integrity" "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="
+ "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz"
+ "version" "9.2.2"
+
+"enhanced-resolve@^5.12.0":
+ "integrity" "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA=="
+ "resolved" "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz"
+ "version" "5.17.0"
+ dependencies:
+ "graceful-fs" "^4.2.4"
+ "tapable" "^2.2.0"
+
+"entities@^2.0.0":
+ "integrity" "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="
+ "resolved" "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz"
+ "version" "2.2.0"
+
+"entities@^4.4.0":
+ "integrity" "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="
+ "resolved" "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz"
+ "version" "4.5.0"
+
+"error-ex@^1.3.1":
+ "integrity" "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g=="
+ "resolved" "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz"
+ "version" "1.3.2"
+ dependencies:
+ "is-arrayish" "^0.2.1"
+
+"es-abstract@^1.17.5", "es-abstract@^1.22.1", "es-abstract@^1.22.3", "es-abstract@^1.23.0", "es-abstract@^1.23.1", "es-abstract@^1.23.2", "es-abstract@^1.23.3":
+ "integrity" "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A=="
+ "resolved" "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz"
+ "version" "1.23.3"
+ dependencies:
+ "array-buffer-byte-length" "^1.0.1"
+ "arraybuffer.prototype.slice" "^1.0.3"
+ "available-typed-arrays" "^1.0.7"
+ "call-bind" "^1.0.7"
+ "data-view-buffer" "^1.0.1"
+ "data-view-byte-length" "^1.0.1"
+ "data-view-byte-offset" "^1.0.0"
+ "es-define-property" "^1.0.0"
+ "es-errors" "^1.3.0"
+ "es-object-atoms" "^1.0.0"
+ "es-set-tostringtag" "^2.0.3"
+ "es-to-primitive" "^1.2.1"
+ "function.prototype.name" "^1.1.6"
+ "get-intrinsic" "^1.2.4"
+ "get-symbol-description" "^1.0.2"
+ "globalthis" "^1.0.3"
+ "gopd" "^1.0.1"
+ "has-property-descriptors" "^1.0.2"
+ "has-proto" "^1.0.3"
+ "has-symbols" "^1.0.3"
+ "hasown" "^2.0.2"
+ "internal-slot" "^1.0.7"
+ "is-array-buffer" "^3.0.4"
+ "is-callable" "^1.2.7"
+ "is-data-view" "^1.0.1"
+ "is-negative-zero" "^2.0.3"
+ "is-regex" "^1.1.4"
+ "is-shared-array-buffer" "^1.0.3"
+ "is-string" "^1.0.7"
+ "is-typed-array" "^1.1.13"
+ "is-weakref" "^1.0.2"
+ "object-inspect" "^1.13.1"
+ "object-keys" "^1.1.1"
+ "object.assign" "^4.1.5"
+ "regexp.prototype.flags" "^1.5.2"
+ "safe-array-concat" "^1.1.2"
+ "safe-regex-test" "^1.0.3"
+ "string.prototype.trim" "^1.2.9"
+ "string.prototype.trimend" "^1.0.8"
+ "string.prototype.trimstart" "^1.0.8"
+ "typed-array-buffer" "^1.0.2"
+ "typed-array-byte-length" "^1.0.1"
+ "typed-array-byte-offset" "^1.0.2"
+ "typed-array-length" "^1.0.6"
+ "unbox-primitive" "^1.0.2"
+ "which-typed-array" "^1.1.15"
+
+"es-define-property@^1.0.0":
+ "integrity" "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ=="
+ "resolved" "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz"
+ "version" "1.0.0"
+ dependencies:
+ "get-intrinsic" "^1.2.4"
+
+"es-errors@^1.2.1", "es-errors@^1.3.0":
+ "integrity" "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="
+ "resolved" "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz"
+ "version" "1.3.0"
+
+"es-get-iterator@^1.1.3":
+ "integrity" "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw=="
+ "resolved" "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz"
+ "version" "1.1.3"
+ dependencies:
+ "call-bind" "^1.0.2"
+ "get-intrinsic" "^1.1.3"
+ "has-symbols" "^1.0.3"
+ "is-arguments" "^1.1.1"
+ "is-map" "^2.0.2"
+ "is-set" "^2.0.2"
+ "is-string" "^1.0.7"
+ "isarray" "^2.0.5"
+ "stop-iteration-iterator" "^1.0.0"
+
+"es-iterator-helpers@^1.0.19":
+ "integrity" "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw=="
+ "resolved" "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz"
+ "version" "1.0.19"
+ dependencies:
+ "call-bind" "^1.0.7"
+ "define-properties" "^1.2.1"
+ "es-abstract" "^1.23.3"
+ "es-errors" "^1.3.0"
+ "es-set-tostringtag" "^2.0.3"
+ "function-bind" "^1.1.2"
+ "get-intrinsic" "^1.2.4"
+ "globalthis" "^1.0.3"
+ "has-property-descriptors" "^1.0.2"
+ "has-proto" "^1.0.3"
+ "has-symbols" "^1.0.3"
+ "internal-slot" "^1.0.7"
+ "iterator.prototype" "^1.1.2"
+ "safe-array-concat" "^1.1.2"
+
+"es-object-atoms@^1.0.0":
+ "integrity" "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw=="
+ "resolved" "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz"
+ "version" "1.0.0"
+ dependencies:
+ "es-errors" "^1.3.0"
+
+"es-set-tostringtag@^2.0.3":
+ "integrity" "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ=="
+ "resolved" "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz"
+ "version" "2.0.3"
+ dependencies:
+ "get-intrinsic" "^1.2.4"
+ "has-tostringtag" "^1.0.2"
+ "hasown" "^2.0.1"
+
+"es-shim-unscopables@^1.0.0", "es-shim-unscopables@^1.0.2":
+ "integrity" "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw=="
+ "resolved" "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz"
+ "version" "1.0.2"
+ dependencies:
+ "hasown" "^2.0.0"
+
+"es-to-primitive@^1.2.1":
+ "integrity" "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA=="
+ "resolved" "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz"
+ "version" "1.2.1"
+ dependencies:
+ "is-callable" "^1.1.4"
+ "is-date-object" "^1.0.1"
+ "is-symbol" "^1.0.2"
+
+"escalade@^3.1.2":
+ "integrity" "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA=="
+ "resolved" "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz"
+ "version" "3.1.2"
+
+"escape-string-regexp@^1.0.5":
+ "integrity" "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="
+ "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
+ "version" "1.0.5"
+
+"escape-string-regexp@^4.0.0":
+ "integrity" "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="
+ "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz"
+ "version" "4.0.0"
+
+"eslint-config-next@13.1.6":
+ "integrity" "sha512-0cg7h5wztg/SoLAlxljZ0ZPUQ7i6QKqRiP4M2+MgTZtxWwNKb2JSwNc18nJ6/kXBI6xYvPraTbQSIhAuVw6czw=="
+ "resolved" "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.1.6.tgz"
+ "version" "13.1.6"
+ dependencies:
+ "@next/eslint-plugin-next" "13.1.6"
+ "@rushstack/eslint-patch" "^1.1.3"
+ "@typescript-eslint/parser" "^5.42.0"
+ "eslint-import-resolver-node" "^0.3.6"
+ "eslint-import-resolver-typescript" "^3.5.2"
+ "eslint-plugin-import" "^2.26.0"
+ "eslint-plugin-jsx-a11y" "^6.5.1"
+ "eslint-plugin-react" "^7.31.7"
+ "eslint-plugin-react-hooks" "^4.5.0"
+
+"eslint-import-resolver-node@^0.3.6", "eslint-import-resolver-node@^0.3.9":
+ "integrity" "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g=="
+ "resolved" "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz"
+ "version" "0.3.9"
+ dependencies:
+ "debug" "^3.2.7"
+ "is-core-module" "^2.13.0"
+ "resolve" "^1.22.4"
+
+"eslint-import-resolver-typescript@^3.5.2":
+ "integrity" "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg=="
+ "resolved" "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz"
+ "version" "3.6.1"
+ dependencies:
+ "debug" "^4.3.4"
+ "enhanced-resolve" "^5.12.0"
+ "eslint-module-utils" "^2.7.4"
+ "fast-glob" "^3.3.1"
+ "get-tsconfig" "^4.5.0"
+ "is-core-module" "^2.11.0"
+ "is-glob" "^4.0.3"
+
+"eslint-module-utils@^2.7.4", "eslint-module-utils@^2.8.0":
+ "integrity" "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q=="
+ "resolved" "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz"
+ "version" "2.8.1"
+ dependencies:
+ "debug" "^3.2.7"
+
+"eslint-plugin-import@*", "eslint-plugin-import@^2.26.0":
+ "integrity" "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw=="
+ "resolved" "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz"
+ "version" "2.29.1"
+ dependencies:
+ "array-includes" "^3.1.7"
+ "array.prototype.findlastindex" "^1.2.3"
+ "array.prototype.flat" "^1.3.2"
+ "array.prototype.flatmap" "^1.3.2"
+ "debug" "^3.2.7"
+ "doctrine" "^2.1.0"
+ "eslint-import-resolver-node" "^0.3.9"
+ "eslint-module-utils" "^2.8.0"
+ "hasown" "^2.0.0"
+ "is-core-module" "^2.13.1"
+ "is-glob" "^4.0.3"
+ "minimatch" "^3.1.2"
+ "object.fromentries" "^2.0.7"
+ "object.groupby" "^1.0.1"
+ "object.values" "^1.1.7"
+ "semver" "^6.3.1"
+ "tsconfig-paths" "^3.15.0"
+
+"eslint-plugin-jsx-a11y@^6.5.1":
+ "integrity" "sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g=="
+ "resolved" "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz"
+ "version" "6.9.0"
+ dependencies:
+ "aria-query" "~5.1.3"
+ "array-includes" "^3.1.8"
+ "array.prototype.flatmap" "^1.3.2"
+ "ast-types-flow" "^0.0.8"
+ "axe-core" "^4.9.1"
+ "axobject-query" "~3.1.1"
+ "damerau-levenshtein" "^1.0.8"
+ "emoji-regex" "^9.2.2"
+ "es-iterator-helpers" "^1.0.19"
+ "hasown" "^2.0.2"
+ "jsx-ast-utils" "^3.3.5"
+ "language-tags" "^1.0.9"
+ "minimatch" "^3.1.2"
+ "object.fromentries" "^2.0.8"
+ "safe-regex-test" "^1.0.3"
+ "string.prototype.includes" "^2.0.0"
+
+"eslint-plugin-react-hooks@^4.5.0":
+ "integrity" "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ=="
+ "resolved" "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz"
+ "version" "4.6.2"
+
+"eslint-plugin-react@^7.31.7":
+ "integrity" "sha512-Np+jo9bUwJNxCsT12pXtrGhJgT3T44T1sHhn1Ssr42XFn8TES0267wPGo5nNrMHi8qkyimDAX2BUmkf9pSaVzA=="
+ "resolved" "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.4.tgz"
+ "version" "7.34.4"
+ dependencies:
+ "array-includes" "^3.1.8"
+ "array.prototype.findlast" "^1.2.5"
+ "array.prototype.flatmap" "^1.3.2"
+ "array.prototype.toreversed" "^1.1.2"
+ "array.prototype.tosorted" "^1.1.4"
+ "doctrine" "^2.1.0"
+ "es-iterator-helpers" "^1.0.19"
+ "estraverse" "^5.3.0"
+ "hasown" "^2.0.2"
+ "jsx-ast-utils" "^2.4.1 || ^3.0.0"
+ "minimatch" "^3.1.2"
+ "object.entries" "^1.1.8"
+ "object.fromentries" "^2.0.8"
+ "object.values" "^1.2.0"
+ "prop-types" "^15.8.1"
+ "resolve" "^2.0.0-next.5"
+ "semver" "^6.3.1"
+ "string.prototype.matchall" "^4.0.11"
+ "string.prototype.repeat" "^1.0.0"
+
+"eslint-scope@^7.1.1":
+ "integrity" "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg=="
+ "resolved" "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz"
+ "version" "7.2.2"
+ dependencies:
+ "esrecurse" "^4.3.0"
+ "estraverse" "^5.2.0"
+
+"eslint-utils@^3.0.0":
+ "integrity" "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA=="
+ "resolved" "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "eslint-visitor-keys" "^2.0.0"
+
+"eslint-visitor-keys@^2.0.0":
+ "integrity" "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw=="
+ "resolved" "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz"
+ "version" "2.1.0"
+
+"eslint-visitor-keys@^3.3.0", "eslint-visitor-keys@^3.4.1":
+ "integrity" "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="
+ "resolved" "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz"
+ "version" "3.4.3"
+
+"eslint@*", "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^7.23.0 || ^8.0.0", "eslint@>=5", "eslint@8.32.0":
+ "integrity" "sha512-nETVXpnthqKPFyuY2FNjz/bEd6nbosRgKbkgS/y1C7LJop96gYHWpiguLecMHQ2XCPxn77DS0P+68WzG6vkZSQ=="
+ "resolved" "https://registry.npmjs.org/eslint/-/eslint-8.32.0.tgz"
+ "version" "8.32.0"
+ dependencies:
+ "@eslint/eslintrc" "^1.4.1"
+ "@humanwhocodes/config-array" "^0.11.8"
+ "@humanwhocodes/module-importer" "^1.0.1"
+ "@nodelib/fs.walk" "^1.2.8"
+ "ajv" "^6.10.0"
+ "chalk" "^4.0.0"
+ "cross-spawn" "^7.0.2"
+ "debug" "^4.3.2"
+ "doctrine" "^3.0.0"
+ "escape-string-regexp" "^4.0.0"
+ "eslint-scope" "^7.1.1"
+ "eslint-utils" "^3.0.0"
+ "eslint-visitor-keys" "^3.3.0"
+ "espree" "^9.4.0"
+ "esquery" "^1.4.0"
+ "esutils" "^2.0.2"
+ "fast-deep-equal" "^3.1.3"
+ "file-entry-cache" "^6.0.1"
+ "find-up" "^5.0.0"
+ "glob-parent" "^6.0.2"
+ "globals" "^13.19.0"
+ "grapheme-splitter" "^1.0.4"
+ "ignore" "^5.2.0"
+ "import-fresh" "^3.0.0"
+ "imurmurhash" "^0.1.4"
+ "is-glob" "^4.0.0"
+ "is-path-inside" "^3.0.3"
+ "js-sdsl" "^4.1.4"
+ "js-yaml" "^4.1.0"
+ "json-stable-stringify-without-jsonify" "^1.0.1"
+ "levn" "^0.4.1"
+ "lodash.merge" "^4.6.2"
+ "minimatch" "^3.1.2"
+ "natural-compare" "^1.4.0"
+ "optionator" "^0.9.1"
+ "regexpp" "^3.2.0"
+ "strip-ansi" "^6.0.1"
+ "strip-json-comments" "^3.1.0"
+ "text-table" "^0.2.0"
+
+"espree@^9.4.0":
+ "integrity" "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ=="
+ "resolved" "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz"
+ "version" "9.6.1"
+ dependencies:
+ "acorn" "^8.9.0"
+ "acorn-jsx" "^5.3.2"
+ "eslint-visitor-keys" "^3.4.1"
+
+"esprima@^4.0.0":
+ "integrity" "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
+ "resolved" "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz"
+ "version" "4.0.1"
+
+"esquery@^1.4.0":
+ "integrity" "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="
+ "resolved" "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz"
+ "version" "1.6.0"
+ dependencies:
+ "estraverse" "^5.1.0"
+
+"esrecurse@^4.3.0":
+ "integrity" "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="
+ "resolved" "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz"
+ "version" "4.3.0"
+ dependencies:
+ "estraverse" "^5.2.0"
+
+"estraverse@^5.1.0", "estraverse@^5.2.0", "estraverse@^5.3.0":
+ "integrity" "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="
+ "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz"
+ "version" "5.3.0"
+
+"esutils@^2.0.2":
+ "integrity" "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
+ "resolved" "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz"
+ "version" "2.0.3"
+
+"eventemitter3@^2.0.3":
+ "integrity" "sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg=="
+ "resolved" "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz"
+ "version" "2.0.3"
+
+"export-to-csv@^1.3.0":
+ "integrity" "sha512-msPjbfozZdYzDghAEKmCVH5veMeKHNacplE6noXvGiA8AeV1qa/SOxp6JXDjF9R8Kf6v3ypI6jskiY19dkhZeA=="
+ "resolved" "https://registry.npmjs.org/export-to-csv/-/export-to-csv-1.3.0.tgz"
+ "version" "1.3.0"
+
+"extend-shallow@^2.0.1":
+ "integrity" "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="
+ "resolved" "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz"
+ "version" "2.0.1"
+ dependencies:
+ "is-extendable" "^0.1.0"
+
+"extend@^3.0.0", "extend@^3.0.2":
+ "integrity" "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+ "resolved" "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz"
+ "version" "3.0.2"
+
+"fast-deep-equal@^3.1.1", "fast-deep-equal@^3.1.3":
+ "integrity" "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+ "resolved" "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz"
+ "version" "3.1.3"
+
+"fast-diff@1.1.2":
+ "integrity" "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig=="
+ "resolved" "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz"
+ "version" "1.1.2"
+
+"fast-glob@^3.2.9", "fast-glob@^3.3.1":
+ "integrity" "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow=="
+ "resolved" "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz"
+ "version" "3.3.2"
+ dependencies:
+ "@nodelib/fs.stat" "^2.0.2"
+ "@nodelib/fs.walk" "^1.2.3"
+ "glob-parent" "^5.1.2"
+ "merge2" "^1.3.0"
+ "micromatch" "^4.0.4"
+
+"fast-json-stable-stringify@^2.0.0":
+ "integrity" "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+ "resolved" "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz"
+ "version" "2.1.0"
+
+"fast-levenshtein@^2.0.6":
+ "integrity" "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="
+ "resolved" "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz"
+ "version" "2.0.6"
+
+"fastq@^1.6.0":
+ "integrity" "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w=="
+ "resolved" "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz"
+ "version" "1.17.1"
+ dependencies:
+ "reusify" "^1.0.4"
+
+"fault@^1.0.0":
+ "integrity" "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA=="
+ "resolved" "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz"
+ "version" "1.0.4"
+ dependencies:
+ "format" "^0.2.0"
+
+"fflate@^0.4.8":
+ "integrity" "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA=="
+ "resolved" "https://registry.npmjs.org/fflate/-/fflate-0.4.8.tgz"
+ "version" "0.4.8"
+
+"file-entry-cache@^6.0.1":
+ "integrity" "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg=="
+ "resolved" "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz"
+ "version" "6.0.1"
+ dependencies:
+ "flat-cache" "^3.0.4"
+
+"file-selector@^0.6.0":
+ "integrity" "sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw=="
+ "resolved" "https://registry.npmjs.org/file-selector/-/file-selector-0.6.0.tgz"
+ "version" "0.6.0"
+ dependencies:
+ "tslib" "^2.4.0"
+
+"fill-range@^7.1.1":
+ "integrity" "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="
+ "resolved" "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz"
+ "version" "7.1.1"
+ dependencies:
+ "to-regex-range" "^5.0.1"
+
+"find-root@^1.1.0":
+ "integrity" "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="
+ "resolved" "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz"
+ "version" "1.1.0"
+
+"find-up@^5.0.0":
+ "integrity" "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="
+ "resolved" "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz"
+ "version" "5.0.0"
+ dependencies:
+ "locate-path" "^6.0.0"
+ "path-exists" "^4.0.0"
+
+"flat-cache@^3.0.4":
+ "integrity" "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw=="
+ "resolved" "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz"
+ "version" "3.2.0"
+ dependencies:
+ "flatted" "^3.2.9"
+ "keyv" "^4.5.3"
+ "rimraf" "^3.0.2"
+
+"flatted@^3.2.9":
+ "integrity" "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw=="
+ "resolved" "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz"
+ "version" "3.3.1"
+
+"follow-redirects@^1.15.6":
+ "integrity" "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA=="
+ "resolved" "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz"
+ "version" "1.15.6"
+
+"fontkit@^2.0.2":
+ "integrity" "sha512-jc4k5Yr8iov8QfS6u8w2CnHWVmbOGtdBtOXMze5Y+QD966Rx6PEVWXSEGwXlsDlKtu1G12cJjcsybnqhSk/+LA=="
+ "resolved" "https://registry.npmjs.org/fontkit/-/fontkit-2.0.2.tgz"
+ "version" "2.0.2"
+ dependencies:
+ "@swc/helpers" "^0.4.2"
+ "brotli" "^1.3.2"
+ "clone" "^2.1.2"
+ "dfa" "^1.2.0"
+ "fast-deep-equal" "^3.1.3"
+ "restructure" "^3.0.0"
+ "tiny-inflate" "^1.0.3"
+ "unicode-properties" "^1.4.0"
+ "unicode-trie" "^2.0.0"
+
+"for-each@^0.3.3":
+ "integrity" "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw=="
+ "resolved" "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz"
+ "version" "0.3.3"
+ dependencies:
+ "is-callable" "^1.1.3"
+
+"form-data@^4.0.0":
+ "integrity" "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww=="
+ "resolved" "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz"
+ "version" "4.0.0"
+ dependencies:
+ "asynckit" "^0.4.0"
+ "combined-stream" "^1.0.8"
+ "mime-types" "^2.1.12"
+
+"format@^0.2.0":
+ "integrity" "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww=="
+ "resolved" "https://registry.npmjs.org/format/-/format-0.2.2.tgz"
+ "version" "0.2.2"
+
+"formik@2.2.9":
+ "integrity" "sha512-LQLcISMmf1r5at4/gyJigGn0gOwFbeEAlji+N9InZF6LIMXnFNkO42sCI8Jt84YZggpD4cPWObAZaxpEFtSzNA=="
+ "resolved" "https://registry.npmjs.org/formik/-/formik-2.2.9.tgz"
+ "version" "2.2.9"
+ dependencies:
+ "deepmerge" "^2.1.1"
+ "hoist-non-react-statics" "^3.3.0"
+ "lodash" "^4.17.21"
+ "lodash-es" "^4.17.21"
+ "react-fast-compare" "^2.0.1"
+ "tiny-warning" "^1.0.2"
+ "tslib" "^1.10.0"
+
+"fs.realpath@^1.0.0":
+ "integrity" "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
+ "resolved" "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"
+ "version" "1.0.0"
+
+"function-bind@^1.1.2":
+ "integrity" "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="
+ "resolved" "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz"
+ "version" "1.1.2"
+
+"function.prototype.name@^1.1.5", "function.prototype.name@^1.1.6":
+ "integrity" "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg=="
+ "resolved" "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz"
+ "version" "1.1.6"
+ dependencies:
+ "call-bind" "^1.0.2"
+ "define-properties" "^1.2.0"
+ "es-abstract" "^1.22.1"
+ "functions-have-names" "^1.2.3"
+
+"functions-have-names@^1.2.3":
+ "integrity" "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="
+ "resolved" "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz"
+ "version" "1.2.3"
+
+"gensync@^1.0.0-beta.2":
+ "integrity" "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="
+ "resolved" "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz"
+ "version" "1.0.0-beta.2"
+
+"get-intrinsic@^1.1.3", "get-intrinsic@^1.2.1", "get-intrinsic@^1.2.2", "get-intrinsic@^1.2.3", "get-intrinsic@^1.2.4":
+ "integrity" "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ=="
+ "resolved" "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz"
+ "version" "1.2.4"
+ dependencies:
+ "es-errors" "^1.3.0"
+ "function-bind" "^1.1.2"
+ "has-proto" "^1.0.1"
+ "has-symbols" "^1.0.3"
+ "hasown" "^2.0.0"
+
+"get-symbol-description@^1.0.2":
+ "integrity" "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg=="
+ "resolved" "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz"
+ "version" "1.0.2"
+ dependencies:
+ "call-bind" "^1.0.5"
+ "es-errors" "^1.3.0"
+ "get-intrinsic" "^1.2.4"
+
+"get-tsconfig@^4.5.0":
+ "integrity" "sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw=="
+ "resolved" "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz"
+ "version" "4.7.5"
+ dependencies:
+ "resolve-pkg-maps" "^1.0.0"
+
+"glob-parent@^5.1.2":
+ "integrity" "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="
+ "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz"
+ "version" "5.1.2"
+ dependencies:
+ "is-glob" "^4.0.1"
+
+"glob-parent@^6.0.2":
+ "integrity" "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="
+ "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz"
+ "version" "6.0.2"
+ dependencies:
+ "is-glob" "^4.0.3"
+
+"glob@^7.1.3", "glob@7.1.7":
+ "integrity" "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ=="
+ "resolved" "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz"
+ "version" "7.1.7"
+ dependencies:
+ "fs.realpath" "^1.0.0"
+ "inflight" "^1.0.4"
+ "inherits" "2"
+ "minimatch" "^3.0.4"
+ "once" "^1.3.0"
+ "path-is-absolute" "^1.0.0"
+
+"globals@^11.1.0":
+ "integrity" "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="
+ "resolved" "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz"
+ "version" "11.12.0"
+
+"globals@^13.19.0":
+ "integrity" "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ=="
+ "resolved" "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz"
+ "version" "13.24.0"
+ dependencies:
+ "type-fest" "^0.20.2"
+
+"globalthis@^1.0.3":
+ "integrity" "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="
+ "resolved" "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz"
+ "version" "1.0.4"
+ dependencies:
+ "define-properties" "^1.2.1"
+ "gopd" "^1.0.1"
+
+"globby@^11.1.0":
+ "integrity" "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="
+ "resolved" "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz"
+ "version" "11.1.0"
+ dependencies:
+ "array-union" "^2.1.0"
+ "dir-glob" "^3.0.1"
+ "fast-glob" "^3.2.9"
+ "ignore" "^5.2.0"
+ "merge2" "^1.4.1"
+ "slash" "^3.0.0"
+
+"goober@^2.1.10":
+ "integrity" "sha512-4UpC0NdGyAFqLNPnhCT2iHpza2q+RAY3GV85a/mRPdzyPQMsj0KmMMuetdIkzWRbJ+Hgau1EZztq8ImmiMGhsg=="
+ "resolved" "https://registry.npmjs.org/goober/-/goober-2.1.14.tgz"
+ "version" "2.1.14"
+
+"gopd@^1.0.1":
+ "integrity" "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA=="
+ "resolved" "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz"
+ "version" "1.0.1"
+ dependencies:
+ "get-intrinsic" "^1.1.3"
+
+"graceful-fs@^4.2.4":
+ "integrity" "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
+ "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz"
+ "version" "4.2.11"
+
+"grapheme-splitter@^1.0.4":
+ "integrity" "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ=="
+ "resolved" "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz"
+ "version" "1.0.4"
+
+"gray-matter@4.0.3":
+ "integrity" "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q=="
+ "resolved" "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz"
+ "version" "4.0.3"
+ dependencies:
+ "js-yaml" "^3.13.1"
+ "kind-of" "^6.0.2"
+ "section-matter" "^1.0.0"
+ "strip-bom-string" "^1.0.0"
+
+"has-bigints@^1.0.1", "has-bigints@^1.0.2":
+ "integrity" "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ=="
+ "resolved" "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz"
+ "version" "1.0.2"
+
+"has-flag@^3.0.0":
+ "integrity" "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="
+ "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz"
+ "version" "3.0.0"
+
+"has-flag@^4.0.0":
+ "integrity" "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz"
+ "version" "4.0.0"
+
+"has-property-descriptors@^1.0.0", "has-property-descriptors@^1.0.2":
+ "integrity" "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="
+ "resolved" "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz"
+ "version" "1.0.2"
+ dependencies:
+ "es-define-property" "^1.0.0"
+
+"has-proto@^1.0.1", "has-proto@^1.0.3":
+ "integrity" "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q=="
+ "resolved" "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz"
+ "version" "1.0.3"
+
+"has-symbols@^1.0.2", "has-symbols@^1.0.3":
+ "integrity" "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
+ "resolved" "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz"
+ "version" "1.0.3"
+
+"has-tostringtag@^1.0.0", "has-tostringtag@^1.0.2":
+ "integrity" "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="
+ "resolved" "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz"
+ "version" "1.0.2"
+ dependencies:
+ "has-symbols" "^1.0.3"
+
+"hasown@^2.0.0", "hasown@^2.0.1", "hasown@^2.0.2":
+ "integrity" "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="
+ "resolved" "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz"
+ "version" "2.0.2"
+ dependencies:
+ "function-bind" "^1.1.2"
+
+"hast-util-parse-selector@^2.0.0":
+ "integrity" "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ=="
+ "resolved" "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz"
+ "version" "2.2.5"
+
+"hast-util-whitespace@^2.0.0":
+ "integrity" "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng=="
+ "resolved" "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz"
+ "version" "2.0.1"
+
+"hastscript@^6.0.0":
+ "integrity" "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w=="
+ "resolved" "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz"
+ "version" "6.0.0"
+ dependencies:
+ "@types/hast" "^2.0.0"
+ "comma-separated-tokens" "^1.0.0"
+ "hast-util-parse-selector" "^2.0.0"
+ "property-information" "^5.0.0"
+ "space-separated-tokens" "^1.0.0"
+
+"highlight-words@1.2.2":
+ "integrity" "sha512-Mf4xfPXYm8Ay1wTibCrHpNWeR2nUMynMVFkXCi4mbl+TEgmNOe+I4hV7W3OCZcSvzGL6kupaqpfHOemliMTGxQ=="
+ "resolved" "https://registry.npmjs.org/highlight-words/-/highlight-words-1.2.2.tgz"
+ "version" "1.2.2"
+
+"highlight.js@^10.4.1", "highlight.js@~10.7.0":
+ "integrity" "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A=="
+ "resolved" "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz"
+ "version" "10.7.3"
+
+"hoist-non-react-statics@^3.3.0", "hoist-non-react-statics@^3.3.1", "hoist-non-react-statics@^3.3.2":
+ "integrity" "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw=="
+ "resolved" "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz"
+ "version" "3.3.2"
+ dependencies:
+ "react-is" "^16.7.0"
+
+"hsl-to-hex@^1.0.0":
+ "integrity" "sha512-K6GVpucS5wFf44X0h2bLVRDsycgJmf9FF2elg+CrqD8GcFU8c6vYhgXn8NjUkFCwj+xDFb70qgLbTUm6sxwPmA=="
+ "resolved" "https://registry.npmjs.org/hsl-to-hex/-/hsl-to-hex-1.0.0.tgz"
+ "version" "1.0.0"
+ dependencies:
+ "hsl-to-rgb-for-reals" "^1.1.0"
+
+"hsl-to-rgb-for-reals@^1.1.0":
+ "integrity" "sha512-LgOWAkrN0rFaQpfdWBQlv/VhkOxb5AsBjk6NQVx4yEzWS923T07X0M1Y0VNko2H52HeSpZrZNNMJ0aFqsdVzQg=="
+ "resolved" "https://registry.npmjs.org/hsl-to-rgb-for-reals/-/hsl-to-rgb-for-reals-1.1.1.tgz"
+ "version" "1.1.1"
+
+"html-parse-stringify@^3.0.1":
+ "integrity" "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg=="
+ "resolved" "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz"
+ "version" "3.0.1"
+ dependencies:
+ "void-elements" "3.1.0"
+
+"html-tokenize@^2.0.0":
+ "integrity" "sha512-QY6S+hZ0f5m1WT8WffYN+Hg+xm/w5I8XeUcAq/ZYP5wVC8xbKi4Whhru3FtrAebD5EhBW8rmFzkDI6eCAuFe2w=="
+ "resolved" "https://registry.npmjs.org/html-tokenize/-/html-tokenize-2.0.1.tgz"
+ "version" "2.0.1"
+ dependencies:
+ "buffer-from" "~0.1.1"
+ "inherits" "~2.0.1"
+ "minimist" "~1.2.5"
+ "readable-stream" "~1.0.27-1"
+ "through2" "~0.4.1"
+
+"html2canvas@^1.0.0-rc.5":
+ "integrity" "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA=="
+ "resolved" "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz"
+ "version" "1.4.1"
+ dependencies:
+ "css-line-break" "^2.1.0"
+ "text-segmentation" "^1.0.3"
+
+"hyphen@^1.6.4":
+ "integrity" "sha512-SejXzIpv9gOVdDWXd4suM1fdF1k2dxZGvuTdkOVLoazYfK7O4DykIQbdrvuyG+EaTNlXAGhMndtKrhykgbt0gg=="
+ "resolved" "https://registry.npmjs.org/hyphen/-/hyphen-1.10.4.tgz"
+ "version" "1.10.4"
+
+"i18next@>= 19.0.0", "i18next@22.4.9":
+ "integrity" "sha512-8gWMmUz460KJDQp/ob3MNUX84cVuDRY9PLFPnV8d+Qezz/6dkjxwOaH70xjrCNDO+JrUL25iXfAIN9wUkInNZw=="
+ "resolved" "https://registry.npmjs.org/i18next/-/i18next-22.4.9.tgz"
+ "version" "22.4.9"
+ dependencies:
+ "@babel/runtime" "^7.20.6"
+
+"ignore@^5.2.0":
+ "integrity" "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw=="
+ "resolved" "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz"
+ "version" "5.3.1"
+
+"immer@^9.0.16":
+ "integrity" "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA=="
+ "resolved" "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz"
+ "version" "9.0.21"
+
+"import-fresh@^3.0.0", "import-fresh@^3.2.1":
+ "integrity" "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw=="
+ "resolved" "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz"
+ "version" "3.3.0"
+ dependencies:
+ "parent-module" "^1.0.0"
+ "resolve-from" "^4.0.0"
+
+"imurmurhash@^0.1.4":
+ "integrity" "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="
+ "resolved" "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz"
+ "version" "0.1.4"
+
+"inflight@^1.0.4":
+ "integrity" "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="
+ "resolved" "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz"
+ "version" "1.0.6"
+ dependencies:
+ "once" "^1.3.0"
+ "wrappy" "1"
+
+"inherits@^2.0.3", "inherits@~2.0.1", "inherits@~2.0.3", "inherits@2":
+ "integrity" "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
+ "version" "2.0.4"
+
+"inline-style-parser@0.1.1":
+ "integrity" "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q=="
+ "resolved" "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz"
+ "version" "0.1.1"
+
+"internal-slot@^1.0.4", "internal-slot@^1.0.7":
+ "integrity" "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g=="
+ "resolved" "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz"
+ "version" "1.0.7"
+ dependencies:
+ "es-errors" "^1.3.0"
+ "hasown" "^2.0.0"
+ "side-channel" "^1.0.4"
+
+"is-alphabetical@^1.0.0":
+ "integrity" "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg=="
+ "resolved" "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz"
+ "version" "1.0.4"
+
+"is-alphanumerical@^1.0.0":
+ "integrity" "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A=="
+ "resolved" "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz"
+ "version" "1.0.4"
+ dependencies:
+ "is-alphabetical" "^1.0.0"
+ "is-decimal" "^1.0.0"
+
+"is-arguments@^1.1.1":
+ "integrity" "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA=="
+ "resolved" "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz"
+ "version" "1.1.1"
+ dependencies:
+ "call-bind" "^1.0.2"
+ "has-tostringtag" "^1.0.0"
+
+"is-array-buffer@^3.0.2", "is-array-buffer@^3.0.4":
+ "integrity" "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw=="
+ "resolved" "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz"
+ "version" "3.0.4"
+ dependencies:
+ "call-bind" "^1.0.2"
+ "get-intrinsic" "^1.2.1"
+
+"is-arrayish@^0.2.1":
+ "integrity" "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="
+ "resolved" "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz"
+ "version" "0.2.1"
+
+"is-arrayish@^0.3.1":
+ "integrity" "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
+ "resolved" "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz"
+ "version" "0.3.2"
+
+"is-async-function@^2.0.0":
+ "integrity" "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA=="
+ "resolved" "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "has-tostringtag" "^1.0.0"
+
+"is-bigint@^1.0.1":
+ "integrity" "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg=="
+ "resolved" "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz"
+ "version" "1.0.4"
+ dependencies:
+ "has-bigints" "^1.0.1"
+
+"is-boolean-object@^1.1.0":
+ "integrity" "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA=="
+ "resolved" "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz"
+ "version" "1.1.2"
+ dependencies:
+ "call-bind" "^1.0.2"
+ "has-tostringtag" "^1.0.0"
+
+"is-buffer@^2.0.0":
+ "integrity" "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ=="
+ "resolved" "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz"
+ "version" "2.0.5"
+
+"is-callable@^1.1.3", "is-callable@^1.1.4", "is-callable@^1.2.7":
+ "integrity" "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="
+ "resolved" "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz"
+ "version" "1.2.7"
+
+"is-core-module@^2.11.0", "is-core-module@^2.13.0", "is-core-module@^2.13.1":
+ "integrity" "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A=="
+ "resolved" "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz"
+ "version" "2.14.0"
+ dependencies:
+ "hasown" "^2.0.2"
+
+"is-data-view@^1.0.1":
+ "integrity" "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w=="
+ "resolved" "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz"
+ "version" "1.0.1"
+ dependencies:
+ "is-typed-array" "^1.1.13"
+
+"is-date-object@^1.0.1", "is-date-object@^1.0.5":
+ "integrity" "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ=="
+ "resolved" "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz"
+ "version" "1.0.5"
+ dependencies:
+ "has-tostringtag" "^1.0.0"
+
+"is-decimal@^1.0.0":
+ "integrity" "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw=="
+ "resolved" "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz"
+ "version" "1.0.4"
+
+"is-extendable@^0.1.0":
+ "integrity" "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="
+ "resolved" "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz"
+ "version" "0.1.1"
+
+"is-extglob@^2.1.1":
+ "integrity" "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="
+ "resolved" "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz"
+ "version" "2.1.1"
+
+"is-finalizationregistry@^1.0.2":
+ "integrity" "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw=="
+ "resolved" "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz"
+ "version" "1.0.2"
+ dependencies:
+ "call-bind" "^1.0.2"
+
+"is-generator-function@^1.0.10":
+ "integrity" "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A=="
+ "resolved" "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz"
+ "version" "1.0.10"
+ dependencies:
+ "has-tostringtag" "^1.0.0"
+
+"is-glob@^4.0.0", "is-glob@^4.0.1", "is-glob@^4.0.3":
+ "integrity" "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="
+ "resolved" "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz"
+ "version" "4.0.3"
+ dependencies:
+ "is-extglob" "^2.1.1"
+
+"is-hexadecimal@^1.0.0":
+ "integrity" "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw=="
+ "resolved" "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz"
+ "version" "1.0.4"
+
+"is-map@^2.0.2", "is-map@^2.0.3":
+ "integrity" "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw=="
+ "resolved" "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz"
+ "version" "2.0.3"
+
+"is-negative-zero@^2.0.3":
+ "integrity" "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw=="
+ "resolved" "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz"
+ "version" "2.0.3"
+
+"is-number-object@^1.0.4":
+ "integrity" "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ=="
+ "resolved" "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz"
+ "version" "1.0.7"
+ dependencies:
+ "has-tostringtag" "^1.0.0"
+
+"is-number@^7.0.0":
+ "integrity" "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
+ "resolved" "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz"
+ "version" "7.0.0"
+
+"is-path-inside@^3.0.3":
+ "integrity" "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ=="
+ "resolved" "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz"
+ "version" "3.0.3"
+
+"is-plain-obj@^4.0.0":
+ "integrity" "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="
+ "resolved" "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz"
+ "version" "4.1.0"
+
+"is-regex@^1.1.4":
+ "integrity" "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg=="
+ "resolved" "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz"
+ "version" "1.1.4"
+ dependencies:
+ "call-bind" "^1.0.2"
+ "has-tostringtag" "^1.0.0"
+
+"is-set@^2.0.2", "is-set@^2.0.3":
+ "integrity" "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg=="
+ "resolved" "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz"
+ "version" "2.0.3"
+
+"is-shared-array-buffer@^1.0.2", "is-shared-array-buffer@^1.0.3":
+ "integrity" "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg=="
+ "resolved" "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz"
+ "version" "1.0.3"
+ dependencies:
+ "call-bind" "^1.0.7"
+
+"is-string@^1.0.5", "is-string@^1.0.7":
+ "integrity" "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg=="
+ "resolved" "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz"
+ "version" "1.0.7"
+ dependencies:
+ "has-tostringtag" "^1.0.0"
+
+"is-symbol@^1.0.2", "is-symbol@^1.0.3":
+ "integrity" "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg=="
+ "resolved" "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz"
+ "version" "1.0.4"
+ dependencies:
+ "has-symbols" "^1.0.2"
+
+"is-typed-array@^1.1.13":
+ "integrity" "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw=="
+ "resolved" "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz"
+ "version" "1.1.13"
+ dependencies:
+ "which-typed-array" "^1.1.14"
+
+"is-url@^1.2.4":
+ "integrity" "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww=="
+ "resolved" "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz"
+ "version" "1.2.4"
+
+"is-weakmap@^2.0.2":
+ "integrity" "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w=="
+ "resolved" "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz"
+ "version" "2.0.2"
+
+"is-weakref@^1.0.2":
+ "integrity" "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ=="
+ "resolved" "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz"
+ "version" "1.0.2"
+ dependencies:
+ "call-bind" "^1.0.2"
+
+"is-weakset@^2.0.3":
+ "integrity" "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ=="
+ "resolved" "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz"
+ "version" "2.0.3"
+ dependencies:
+ "call-bind" "^1.0.7"
+ "get-intrinsic" "^1.2.4"
+
+"isarray@^2.0.5":
+ "integrity" "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="
+ "resolved" "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz"
+ "version" "2.0.5"
+
+"isarray@~1.0.0":
+ "integrity" "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
+ "resolved" "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz"
+ "version" "1.0.0"
+
+"isarray@0.0.1":
+ "integrity" "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="
+ "resolved" "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz"
+ "version" "0.0.1"
+
+"isexe@^2.0.0":
+ "integrity" "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
+ "resolved" "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz"
+ "version" "2.0.0"
+
+"iterator.prototype@^1.1.2":
+ "integrity" "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w=="
+ "resolved" "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz"
+ "version" "1.1.2"
+ dependencies:
+ "define-properties" "^1.2.1"
+ "get-intrinsic" "^1.2.1"
+ "has-symbols" "^1.0.3"
+ "reflect.getprototypeof" "^1.0.4"
+ "set-function-name" "^2.0.1"
+
+"jay-peg@^1.0.2":
+ "integrity" "sha512-fyV3NVvv6pTys/3BTapBUGAWAuU9rM2gRcgijZHzptd5KKL+s+S7hESFN+wOsbDH1MzFwdlRAXi0aGxS6uiMKg=="
+ "resolved" "https://registry.npmjs.org/jay-peg/-/jay-peg-1.0.2.tgz"
+ "version" "1.0.2"
+ dependencies:
+ "restructure" "^3.0.0"
+
+"js-sdsl@^4.1.4":
+ "integrity" "sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w=="
+ "resolved" "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.2.tgz"
+ "version" "4.4.2"
+
+"js-tokens@^3.0.0 || ^4.0.0", "js-tokens@^4.0.0":
+ "integrity" "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+ "resolved" "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
+ "version" "4.0.0"
+
+"js-yaml@^3.13.1":
+ "integrity" "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g=="
+ "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz"
+ "version" "3.14.1"
+ dependencies:
+ "argparse" "^1.0.7"
+ "esprima" "^4.0.0"
+
+"js-yaml@^4.1.0":
+ "integrity" "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="
+ "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz"
+ "version" "4.1.0"
+ dependencies:
+ "argparse" "^2.0.1"
+
+"jsesc@^2.5.1":
+ "integrity" "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="
+ "resolved" "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz"
+ "version" "2.5.2"
+
+"jsesc@~0.5.0":
+ "integrity" "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA=="
+ "resolved" "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz"
+ "version" "0.5.0"
+
+"json-buffer@3.0.1":
+ "integrity" "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="
+ "resolved" "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz"
+ "version" "3.0.1"
+
+"json-parse-even-better-errors@^2.3.0":
+ "integrity" "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
+ "resolved" "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz"
+ "version" "2.3.1"
+
+"json-schema-traverse@^0.4.1":
+ "integrity" "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+ "resolved" "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz"
+ "version" "0.4.1"
+
+"json-stable-stringify-without-jsonify@^1.0.1":
+ "integrity" "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="
+ "resolved" "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz"
+ "version" "1.0.1"
+
+"json5@^1.0.2":
+ "integrity" "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="
+ "resolved" "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz"
+ "version" "1.0.2"
+ dependencies:
+ "minimist" "^1.2.0"
+
+"json5@^2.2.3":
+ "integrity" "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="
+ "resolved" "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz"
+ "version" "2.2.3"
+
+"jspdf-autotable@^3.8.2":
+ "integrity" "sha512-zW1ix99/mtR4MbIni7IqvrpfHmuTaICl6iv6wqjRN86Nxtwaw/QtOeDbpXqYSzHIJK9JvgtLM283sc5x+ipkJg=="
+ "resolved" "https://registry.npmjs.org/jspdf-autotable/-/jspdf-autotable-3.8.2.tgz"
+ "version" "3.8.2"
+
+"jspdf@^2.5.1":
+ "integrity" "sha512-hXObxz7ZqoyhxET78+XR34Xu2qFGrJJ2I2bE5w4SM8eFaFEkW2xcGRVUss360fYelwRSid/jT078kbNvmoW0QA=="
+ "resolved" "https://registry.npmjs.org/jspdf/-/jspdf-2.5.1.tgz"
+ "version" "2.5.1"
+ dependencies:
+ "@babel/runtime" "^7.14.0"
+ "atob" "^2.1.2"
+ "btoa" "^1.2.1"
+ "fflate" "^0.4.8"
+ optionalDependencies:
+ "canvg" "^3.0.6"
+ "core-js" "^3.6.0"
+ "dompurify" "^2.2.0"
+ "html2canvas" "^1.0.0-rc.5"
+
+"jsx-ast-utils@^2.4.1 || ^3.0.0", "jsx-ast-utils@^3.3.5":
+ "integrity" "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ=="
+ "resolved" "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz"
+ "version" "3.3.5"
+ dependencies:
+ "array-includes" "^3.1.6"
+ "array.prototype.flat" "^1.3.1"
+ "object.assign" "^4.1.4"
+ "object.values" "^1.1.6"
+
+"keyv@^4.5.3":
+ "integrity" "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="
+ "resolved" "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz"
+ "version" "4.5.4"
+ dependencies:
+ "json-buffer" "3.0.1"
+
+"kind-of@^6.0.0", "kind-of@^6.0.2":
+ "integrity" "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="
+ "resolved" "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz"
+ "version" "6.0.3"
+
+"kleur@^4.0.3":
+ "integrity" "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="
+ "resolved" "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz"
+ "version" "4.1.5"
+
+"language-subtag-registry@^0.3.20":
+ "integrity" "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ=="
+ "resolved" "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz"
+ "version" "0.3.23"
+
+"language-tags@^1.0.9":
+ "integrity" "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA=="
+ "resolved" "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz"
+ "version" "1.0.9"
+ dependencies:
+ "language-subtag-registry" "^0.3.20"
+
+"legacy-swc-helpers@npm:@swc/helpers@=0.4.14":
+ "integrity" "sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw=="
+ "resolved" "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.14.tgz"
+ "version" "0.4.14"
+ dependencies:
+ "tslib" "^2.4.0"
+
+"levn@^0.4.1":
+ "integrity" "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="
+ "resolved" "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz"
+ "version" "0.4.1"
+ dependencies:
+ "prelude-ls" "^1.2.1"
+ "type-check" "~0.4.0"
+
+"lines-and-columns@^1.1.6":
+ "integrity" "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
+ "resolved" "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz"
+ "version" "1.2.4"
+
+"locate-path@^6.0.0":
+ "integrity" "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="
+ "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz"
+ "version" "6.0.0"
+ dependencies:
+ "p-locate" "^5.0.0"
+
+"lodash-es@^4.17.21":
+ "integrity" "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
+ "resolved" "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz"
+ "version" "4.17.21"
+
+"lodash.debounce@^4.0.8":
+ "integrity" "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
+ "resolved" "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz"
+ "version" "4.0.8"
+
+"lodash.isequal@4.5.0":
+ "integrity" "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="
+ "resolved" "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz"
+ "version" "4.5.0"
+
+"lodash.merge@^4.6.2":
+ "integrity" "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="
+ "resolved" "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz"
+ "version" "4.6.2"
+
+"lodash@^4.17.21", "lodash@^4.17.4":
+ "integrity" "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ "resolved" "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz"
+ "version" "4.17.21"
+
+"loose-envify@^1.1.0", "loose-envify@^1.4.0":
+ "integrity" "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="
+ "resolved" "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz"
+ "version" "1.4.0"
+ dependencies:
+ "js-tokens" "^3.0.0 || ^4.0.0"
+
+"lowlight@^1.17.0":
+ "integrity" "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw=="
+ "resolved" "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz"
+ "version" "1.20.0"
+ dependencies:
+ "fault" "^1.0.0"
+ "highlight.js" "~10.7.0"
+
+"lru-cache@^5.1.1":
+ "integrity" "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="
+ "resolved" "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz"
+ "version" "5.1.1"
+ dependencies:
+ "yallist" "^3.0.2"
+
+"material-react-table@^2.13.0":
+ "integrity" "sha512-ds4/cupDsXvoz8K8OpM3UqUyqKoAMkVdvmvP/+ovuWA23fPcjYvFFkUpBxtnZq5GKWM0+SZWzr14KQ1DgKCaFQ=="
+ "resolved" "https://registry.npmjs.org/material-react-table/-/material-react-table-2.13.0.tgz"
+ "version" "2.13.0"
+ dependencies:
+ "@tanstack/match-sorter-utils" "8.15.1"
+ "@tanstack/react-table" "8.16.0"
+ "@tanstack/react-virtual" "3.3.0"
+ "highlight-words" "1.2.2"
+
+"mdast-util-definitions@^5.0.0":
+ "integrity" "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA=="
+ "resolved" "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz"
+ "version" "5.1.2"
+ dependencies:
+ "@types/mdast" "^3.0.0"
+ "@types/unist" "^2.0.0"
+ "unist-util-visit" "^4.0.0"
+
+"mdast-util-from-markdown@^1.0.0":
+ "integrity" "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww=="
+ "resolved" "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz"
+ "version" "1.3.1"
+ dependencies:
+ "@types/mdast" "^3.0.0"
+ "@types/unist" "^2.0.0"
+ "decode-named-character-reference" "^1.0.0"
+ "mdast-util-to-string" "^3.1.0"
+ "micromark" "^3.0.0"
+ "micromark-util-decode-numeric-character-reference" "^1.0.0"
+ "micromark-util-decode-string" "^1.0.0"
+ "micromark-util-normalize-identifier" "^1.0.0"
+ "micromark-util-symbol" "^1.0.0"
+ "micromark-util-types" "^1.0.0"
+ "unist-util-stringify-position" "^3.0.0"
+ "uvu" "^0.5.0"
+
+"mdast-util-to-hast@^12.1.0":
+ "integrity" "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw=="
+ "resolved" "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz"
+ "version" "12.3.0"
+ dependencies:
+ "@types/hast" "^2.0.0"
+ "@types/mdast" "^3.0.0"
+ "mdast-util-definitions" "^5.0.0"
+ "micromark-util-sanitize-uri" "^1.1.0"
+ "trim-lines" "^3.0.0"
+ "unist-util-generated" "^2.0.0"
+ "unist-util-position" "^4.0.0"
+ "unist-util-visit" "^4.0.0"
+
+"mdast-util-to-string@^3.1.0":
+ "integrity" "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg=="
+ "resolved" "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz"
+ "version" "3.2.0"
+ dependencies:
+ "@types/mdast" "^3.0.0"
+
+"mdn-data@2.0.14":
+ "integrity" "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow=="
+ "resolved" "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz"
+ "version" "2.0.14"
+
+"media-engine@^1.0.3":
+ "integrity" "sha512-aa5tG6sDoK+k70B9iEX1NeyfT8ObCKhNDs6lJVpwF6r8vhUfuKMslIcirq6HIUYuuUYLefcEQOn9bSBOvawtwg=="
+ "resolved" "https://registry.npmjs.org/media-engine/-/media-engine-1.0.3.tgz"
+ "version" "1.0.3"
+
+"memoize-one@^5.1.1":
+ "integrity" "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q=="
+ "resolved" "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz"
+ "version" "5.2.1"
+
+"merge2@^1.3.0", "merge2@^1.4.1":
+ "integrity" "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="
+ "resolved" "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz"
+ "version" "1.4.1"
+
+"micromark-core-commonmark@^1.0.1":
+ "integrity" "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw=="
+ "resolved" "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz"
+ "version" "1.1.0"
+ dependencies:
+ "decode-named-character-reference" "^1.0.0"
+ "micromark-factory-destination" "^1.0.0"
+ "micromark-factory-label" "^1.0.0"
+ "micromark-factory-space" "^1.0.0"
+ "micromark-factory-title" "^1.0.0"
+ "micromark-factory-whitespace" "^1.0.0"
+ "micromark-util-character" "^1.0.0"
+ "micromark-util-chunked" "^1.0.0"
+ "micromark-util-classify-character" "^1.0.0"
+ "micromark-util-html-tag-name" "^1.0.0"
+ "micromark-util-normalize-identifier" "^1.0.0"
+ "micromark-util-resolve-all" "^1.0.0"
+ "micromark-util-subtokenize" "^1.0.0"
+ "micromark-util-symbol" "^1.0.0"
+ "micromark-util-types" "^1.0.1"
+ "uvu" "^0.5.0"
+
+"micromark-factory-destination@^1.0.0":
+ "integrity" "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg=="
+ "resolved" "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz"
+ "version" "1.1.0"
+ dependencies:
+ "micromark-util-character" "^1.0.0"
+ "micromark-util-symbol" "^1.0.0"
+ "micromark-util-types" "^1.0.0"
+
+"micromark-factory-label@^1.0.0":
+ "integrity" "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w=="
+ "resolved" "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz"
+ "version" "1.1.0"
+ dependencies:
+ "micromark-util-character" "^1.0.0"
+ "micromark-util-symbol" "^1.0.0"
+ "micromark-util-types" "^1.0.0"
+ "uvu" "^0.5.0"
+
+"micromark-factory-space@^1.0.0":
+ "integrity" "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ=="
+ "resolved" "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz"
+ "version" "1.1.0"
+ dependencies:
+ "micromark-util-character" "^1.0.0"
+ "micromark-util-types" "^1.0.0"
+
+"micromark-factory-title@^1.0.0":
+ "integrity" "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ=="
+ "resolved" "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz"
+ "version" "1.1.0"
+ dependencies:
+ "micromark-factory-space" "^1.0.0"
+ "micromark-util-character" "^1.0.0"
+ "micromark-util-symbol" "^1.0.0"
+ "micromark-util-types" "^1.0.0"
+
+"micromark-factory-whitespace@^1.0.0":
+ "integrity" "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ=="
+ "resolved" "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz"
+ "version" "1.1.0"
+ dependencies:
+ "micromark-factory-space" "^1.0.0"
+ "micromark-util-character" "^1.0.0"
+ "micromark-util-symbol" "^1.0.0"
+ "micromark-util-types" "^1.0.0"
+
+"micromark-util-character@^1.0.0":
+ "integrity" "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg=="
+ "resolved" "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz"
+ "version" "1.2.0"
+ dependencies:
+ "micromark-util-symbol" "^1.0.0"
+ "micromark-util-types" "^1.0.0"
+
+"micromark-util-chunked@^1.0.0":
+ "integrity" "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ=="
+ "resolved" "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz"
+ "version" "1.1.0"
+ dependencies:
+ "micromark-util-symbol" "^1.0.0"
+
+"micromark-util-classify-character@^1.0.0":
+ "integrity" "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw=="
+ "resolved" "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz"
+ "version" "1.1.0"
+ dependencies:
+ "micromark-util-character" "^1.0.0"
+ "micromark-util-symbol" "^1.0.0"
+ "micromark-util-types" "^1.0.0"
+
+"micromark-util-combine-extensions@^1.0.0":
+ "integrity" "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA=="
+ "resolved" "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz"
+ "version" "1.1.0"
+ dependencies:
+ "micromark-util-chunked" "^1.0.0"
+ "micromark-util-types" "^1.0.0"
+
+"micromark-util-decode-numeric-character-reference@^1.0.0":
+ "integrity" "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw=="
+ "resolved" "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz"
+ "version" "1.1.0"
+ dependencies:
+ "micromark-util-symbol" "^1.0.0"
+
+"micromark-util-decode-string@^1.0.0":
+ "integrity" "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ=="
+ "resolved" "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz"
+ "version" "1.1.0"
+ dependencies:
+ "decode-named-character-reference" "^1.0.0"
+ "micromark-util-character" "^1.0.0"
+ "micromark-util-decode-numeric-character-reference" "^1.0.0"
+ "micromark-util-symbol" "^1.0.0"
+
+"micromark-util-encode@^1.0.0":
+ "integrity" "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw=="
+ "resolved" "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz"
+ "version" "1.1.0"
+
+"micromark-util-html-tag-name@^1.0.0":
+ "integrity" "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q=="
+ "resolved" "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz"
+ "version" "1.2.0"
+
+"micromark-util-normalize-identifier@^1.0.0":
+ "integrity" "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q=="
+ "resolved" "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz"
+ "version" "1.1.0"
+ dependencies:
+ "micromark-util-symbol" "^1.0.0"
+
+"micromark-util-resolve-all@^1.0.0":
+ "integrity" "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA=="
+ "resolved" "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz"
+ "version" "1.1.0"
+ dependencies:
+ "micromark-util-types" "^1.0.0"
+
+"micromark-util-sanitize-uri@^1.0.0", "micromark-util-sanitize-uri@^1.1.0":
+ "integrity" "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A=="
+ "resolved" "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz"
+ "version" "1.2.0"
+ dependencies:
+ "micromark-util-character" "^1.0.0"
+ "micromark-util-encode" "^1.0.0"
+ "micromark-util-symbol" "^1.0.0"
+
+"micromark-util-subtokenize@^1.0.0":
+ "integrity" "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A=="
+ "resolved" "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz"
+ "version" "1.1.0"
+ dependencies:
+ "micromark-util-chunked" "^1.0.0"
+ "micromark-util-symbol" "^1.0.0"
+ "micromark-util-types" "^1.0.0"
+ "uvu" "^0.5.0"
+
+"micromark-util-symbol@^1.0.0":
+ "integrity" "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag=="
+ "resolved" "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz"
+ "version" "1.1.0"
+
+"micromark-util-types@^1.0.0", "micromark-util-types@^1.0.1":
+ "integrity" "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg=="
+ "resolved" "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz"
+ "version" "1.1.0"
+
+"micromark@^3.0.0":
+ "integrity" "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA=="
+ "resolved" "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz"
+ "version" "3.2.0"
+ dependencies:
+ "@types/debug" "^4.0.0"
+ "debug" "^4.0.0"
+ "decode-named-character-reference" "^1.0.0"
+ "micromark-core-commonmark" "^1.0.1"
+ "micromark-factory-space" "^1.0.0"
+ "micromark-util-character" "^1.0.0"
+ "micromark-util-chunked" "^1.0.0"
+ "micromark-util-combine-extensions" "^1.0.0"
+ "micromark-util-decode-numeric-character-reference" "^1.0.0"
+ "micromark-util-encode" "^1.0.0"
+ "micromark-util-normalize-identifier" "^1.0.0"
+ "micromark-util-resolve-all" "^1.0.0"
+ "micromark-util-sanitize-uri" "^1.0.0"
+ "micromark-util-subtokenize" "^1.0.0"
+ "micromark-util-symbol" "^1.0.0"
+ "micromark-util-types" "^1.0.1"
+ "uvu" "^0.5.0"
+
+"micromatch@^4.0.4":
+ "integrity" "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q=="
+ "resolved" "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz"
+ "version" "4.0.7"
+ dependencies:
+ "braces" "^3.0.3"
+ "picomatch" "^2.3.1"
+
+"mime-db@1.52.0":
+ "integrity" "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
+ "resolved" "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz"
+ "version" "1.52.0"
+
+"mime-types@^2.1.12":
+ "integrity" "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="
+ "resolved" "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz"
+ "version" "2.1.35"
+ dependencies:
+ "mime-db" "1.52.0"
+
+"minimatch@^3.0.4", "minimatch@^3.0.5", "minimatch@^3.1.2":
+ "integrity" "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="
+ "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz"
+ "version" "3.1.2"
+ dependencies:
+ "brace-expansion" "^1.1.7"
+
+"minimist@^1.2.0", "minimist@^1.2.6", "minimist@~1.2.5":
+ "integrity" "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="
+ "resolved" "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz"
+ "version" "1.2.8"
+
+"mri@^1.1.0":
+ "integrity" "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="
+ "resolved" "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz"
+ "version" "1.2.0"
+
+"ms@^2.1.1", "ms@2.1.2":
+ "integrity" "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"
+ "version" "2.1.2"
+
+"multipipe@^1.0.2":
+ "integrity" "sha512-6uiC9OvY71vzSGX8lZvSqscE7ft9nPupJ8fMjrCNRAUy2LREUW42UL+V/NTrogr6rFgRydUrCX4ZitfpSNkSCQ=="
+ "resolved" "https://registry.npmjs.org/multipipe/-/multipipe-1.0.2.tgz"
+ "version" "1.0.2"
+ dependencies:
+ "duplexer2" "^0.1.2"
+ "object-assign" "^4.1.0"
+
+"nanoclone@^0.2.1":
+ "integrity" "sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA=="
+ "resolved" "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz"
+ "version" "0.2.1"
+
+"nanoid@^3.3.4":
+ "integrity" "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g=="
+ "resolved" "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz"
+ "version" "3.3.7"
+
+"natural-compare@^1.4.0":
+ "integrity" "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="
+ "resolved" "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz"
+ "version" "1.4.0"
+
+"next@13.1.6":
+ "integrity" "sha512-hHlbhKPj9pW+Cymvfzc15lvhaOZ54l+8sXDXJWm3OBNBzgrVj6hwGPmqqsXg40xO1Leq+kXpllzRPuncpC0Phw=="
+ "resolved" "https://registry.npmjs.org/next/-/next-13.1.6.tgz"
+ "version" "13.1.6"
+ dependencies:
+ "@next/env" "13.1.6"
+ "@swc/helpers" "0.4.14"
+ "caniuse-lite" "^1.0.30001406"
+ "postcss" "8.4.14"
+ "styled-jsx" "5.1.1"
+ optionalDependencies:
+ "@next/swc-android-arm-eabi" "13.1.6"
+ "@next/swc-android-arm64" "13.1.6"
+ "@next/swc-darwin-arm64" "13.1.6"
+ "@next/swc-darwin-x64" "13.1.6"
+ "@next/swc-freebsd-x64" "13.1.6"
+ "@next/swc-linux-arm-gnueabihf" "13.1.6"
+ "@next/swc-linux-arm64-gnu" "13.1.6"
+ "@next/swc-linux-arm64-musl" "13.1.6"
+ "@next/swc-linux-x64-gnu" "13.1.6"
+ "@next/swc-linux-x64-musl" "13.1.6"
+ "@next/swc-win32-arm64-msvc" "13.1.6"
+ "@next/swc-win32-ia32-msvc" "13.1.6"
+ "@next/swc-win32-x64-msvc" "13.1.6"
+
+"node-fetch@^2.6.12":
+ "integrity" "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="
+ "resolved" "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz"
+ "version" "2.7.0"
+ dependencies:
+ "whatwg-url" "^5.0.0"
+
+"node-releases@^2.0.14":
+ "integrity" "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw=="
+ "resolved" "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz"
+ "version" "2.0.14"
+
+"normalize-svg-path@^1.1.0":
+ "integrity" "sha512-r9KHKG2UUeB5LoTouwDzBy2VxXlHsiM6fyLQvnJa0S5hrhzqElH/CH7TUGhT1fVvIYBIKf3OpY4YJ4CK+iaqHg=="
+ "resolved" "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-1.1.0.tgz"
+ "version" "1.1.0"
+ dependencies:
+ "svg-arc-to-cubic-bezier" "^3.0.0"
+
+"nprogress@0.2.0":
+ "integrity" "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA=="
+ "resolved" "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz"
+ "version" "0.2.0"
+
+"nth-check@^2.0.1":
+ "integrity" "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="
+ "resolved" "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz"
+ "version" "2.1.1"
+ dependencies:
+ "boolbase" "^1.0.0"
+
+"numeral@2.0.6":
+ "integrity" "sha512-qaKRmtYPZ5qdw4jWJD6bxEf1FJEqllJrwxCLIm0sQU/A7v2/czigzOb+C2uSiFsa9lBUzeH7M1oK+Q+OLxL3kA=="
+ "resolved" "https://registry.npmjs.org/numeral/-/numeral-2.0.6.tgz"
+ "version" "2.0.6"
+
+"object-assign@^4.1.0", "object-assign@^4.1.1":
+ "integrity" "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="
+ "resolved" "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz"
+ "version" "4.1.1"
+
+"object-inspect@^1.13.1":
+ "integrity" "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g=="
+ "resolved" "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz"
+ "version" "1.13.2"
+
+"object-is@^1.1.5":
+ "integrity" "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q=="
+ "resolved" "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz"
+ "version" "1.1.6"
+ dependencies:
+ "call-bind" "^1.0.7"
+ "define-properties" "^1.2.1"
+
+"object-keys@^1.1.1":
+ "integrity" "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
+ "resolved" "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz"
+ "version" "1.1.1"
+
+"object-keys@~0.4.0":
+ "integrity" "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw=="
+ "resolved" "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz"
+ "version" "0.4.0"
+
+"object.assign@^4.1.4", "object.assign@^4.1.5":
+ "integrity" "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ=="
+ "resolved" "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz"
+ "version" "4.1.5"
+ dependencies:
+ "call-bind" "^1.0.5"
+ "define-properties" "^1.2.1"
+ "has-symbols" "^1.0.3"
+ "object-keys" "^1.1.1"
+
+"object.entries@^1.1.8":
+ "integrity" "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ=="
+ "resolved" "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz"
+ "version" "1.1.8"
+ dependencies:
+ "call-bind" "^1.0.7"
+ "define-properties" "^1.2.1"
+ "es-object-atoms" "^1.0.0"
+
+"object.fromentries@^2.0.7", "object.fromentries@^2.0.8":
+ "integrity" "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ=="
+ "resolved" "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz"
+ "version" "2.0.8"
+ dependencies:
+ "call-bind" "^1.0.7"
+ "define-properties" "^1.2.1"
+ "es-abstract" "^1.23.2"
+ "es-object-atoms" "^1.0.0"
+
+"object.groupby@^1.0.1":
+ "integrity" "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ=="
+ "resolved" "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz"
+ "version" "1.0.3"
+ dependencies:
+ "call-bind" "^1.0.7"
+ "define-properties" "^1.2.1"
+ "es-abstract" "^1.23.2"
+
+"object.values@^1.1.6", "object.values@^1.1.7", "object.values@^1.2.0":
+ "integrity" "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ=="
+ "resolved" "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz"
+ "version" "1.2.0"
+ dependencies:
+ "call-bind" "^1.0.7"
+ "define-properties" "^1.2.1"
+ "es-object-atoms" "^1.0.0"
+
+"once@^1.3.0":
+ "integrity" "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="
+ "resolved" "https://registry.npmjs.org/once/-/once-1.4.0.tgz"
+ "version" "1.4.0"
+ dependencies:
+ "wrappy" "1"
+
+"optionator@^0.9.1":
+ "integrity" "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="
+ "resolved" "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz"
+ "version" "0.9.4"
+ dependencies:
+ "deep-is" "^0.1.3"
+ "fast-levenshtein" "^2.0.6"
+ "levn" "^0.4.1"
+ "prelude-ls" "^1.2.1"
+ "type-check" "^0.4.0"
+ "word-wrap" "^1.2.5"
+
+"p-limit@^3.0.2":
+ "integrity" "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="
+ "resolved" "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz"
+ "version" "3.1.0"
+ dependencies:
+ "yocto-queue" "^0.1.0"
+
+"p-locate@^5.0.0":
+ "integrity" "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="
+ "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz"
+ "version" "5.0.0"
+ dependencies:
+ "p-limit" "^3.0.2"
+
+"pako@^0.2.5":
+ "integrity" "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA=="
+ "resolved" "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz"
+ "version" "0.2.9"
+
+"pako@~1.0.5":
+ "integrity" "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
+ "resolved" "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz"
+ "version" "1.0.11"
+
+"papaparse@^5.4.1":
+ "integrity" "sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw=="
+ "resolved" "https://registry.npmjs.org/papaparse/-/papaparse-5.4.1.tgz"
+ "version" "5.4.1"
+
+"parchment@^1.1.2", "parchment@^1.1.4":
+ "integrity" "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg=="
+ "resolved" "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz"
+ "version" "1.1.4"
+
+"parent-module@^1.0.0":
+ "integrity" "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="
+ "resolved" "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz"
+ "version" "1.0.1"
+ dependencies:
+ "callsites" "^3.0.0"
+
+"parse-entities@^2.0.0":
+ "integrity" "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ=="
+ "resolved" "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "character-entities" "^1.0.0"
+ "character-entities-legacy" "^1.0.0"
+ "character-reference-invalid" "^1.0.0"
+ "is-alphanumerical" "^1.0.0"
+ "is-decimal" "^1.0.0"
+ "is-hexadecimal" "^1.0.0"
+
+"parse-json@^5.0.0":
+ "integrity" "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="
+ "resolved" "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz"
+ "version" "5.2.0"
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ "error-ex" "^1.3.1"
+ "json-parse-even-better-errors" "^2.3.0"
+ "lines-and-columns" "^1.1.6"
+
+"parse-svg-path@^0.1.2":
+ "integrity" "sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ=="
+ "resolved" "https://registry.npmjs.org/parse-svg-path/-/parse-svg-path-0.1.2.tgz"
+ "version" "0.1.2"
+
+"path-exists@^4.0.0":
+ "integrity" "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
+ "resolved" "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz"
+ "version" "4.0.0"
+
+"path-is-absolute@^1.0.0":
+ "integrity" "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="
+ "resolved" "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz"
+ "version" "1.0.1"
+
+"path-key@^3.1.0":
+ "integrity" "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
+ "resolved" "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz"
+ "version" "3.1.1"
+
+"path-parse@^1.0.7":
+ "integrity" "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
+ "resolved" "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz"
+ "version" "1.0.7"
+
+"path-type@^4.0.0":
+ "integrity" "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
+ "resolved" "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz"
+ "version" "4.0.0"
+
+"performance-now@^2.1.0":
+ "integrity" "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="
+ "resolved" "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz"
+ "version" "2.1.0"
+
+"picocolors@^1.0.0", "picocolors@^1.0.1":
+ "integrity" "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew=="
+ "resolved" "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz"
+ "version" "1.0.1"
+
+"picomatch@^2.3.1":
+ "integrity" "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="
+ "resolved" "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz"
+ "version" "2.3.1"
+
+"possible-typed-array-names@^1.0.0":
+ "integrity" "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q=="
+ "resolved" "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz"
+ "version" "1.0.0"
+
+"postcss-value-parser@^4.1.0":
+ "integrity" "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="
+ "resolved" "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz"
+ "version" "4.2.0"
+
+"postcss@8.4.14":
+ "integrity" "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig=="
+ "resolved" "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz"
+ "version" "8.4.14"
+ dependencies:
+ "nanoid" "^3.3.4"
+ "picocolors" "^1.0.0"
+ "source-map-js" "^1.0.2"
+
+"prelude-ls@^1.2.1":
+ "integrity" "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="
+ "resolved" "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz"
+ "version" "1.2.1"
+
+"prismjs@^1.27.0":
+ "integrity" "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q=="
+ "resolved" "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz"
+ "version" "1.29.0"
+
+"prismjs@~1.27.0":
+ "integrity" "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA=="
+ "resolved" "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz"
+ "version" "1.27.0"
+
+"process-nextick-args@~2.0.0":
+ "integrity" "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+ "resolved" "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz"
+ "version" "2.0.1"
+
+"prop-types@^15.0.0", "prop-types@^15.5.7", "prop-types@^15.6.2", "prop-types@^15.7.2", "prop-types@^15.8.1", "prop-types@15.8.1":
+ "integrity" "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="
+ "resolved" "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz"
+ "version" "15.8.1"
+ dependencies:
+ "loose-envify" "^1.4.0"
+ "object-assign" "^4.1.1"
+ "react-is" "^16.13.1"
+
+"property-expr@^2.0.4":
+ "integrity" "sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA=="
+ "resolved" "https://registry.npmjs.org/property-expr/-/property-expr-2.0.6.tgz"
+ "version" "2.0.6"
+
+"property-information@^5.0.0":
+ "integrity" "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA=="
+ "resolved" "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz"
+ "version" "5.6.0"
+ dependencies:
+ "xtend" "^4.0.0"
+
+"property-information@^6.0.0":
+ "integrity" "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig=="
+ "resolved" "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz"
+ "version" "6.5.0"
+
+"proxy-from-env@^1.1.0":
+ "integrity" "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+ "resolved" "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz"
+ "version" "1.1.0"
+
+"punycode@^2.1.0":
+ "integrity" "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="
+ "resolved" "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz"
+ "version" "2.3.1"
+
+"queue-microtask@^1.2.2":
+ "integrity" "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="
+ "resolved" "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz"
+ "version" "1.2.3"
+
+"queue@^6.0.1":
+ "integrity" "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA=="
+ "resolved" "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz"
+ "version" "6.0.2"
+ dependencies:
+ "inherits" "~2.0.3"
+
+"quill-delta@^3.6.2":
+ "integrity" "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg=="
+ "resolved" "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz"
+ "version" "3.6.3"
+ dependencies:
+ "deep-equal" "^1.0.1"
+ "extend" "^3.0.2"
+ "fast-diff" "1.1.2"
+
+"quill@^1.3.7":
+ "integrity" "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g=="
+ "resolved" "https://registry.npmjs.org/quill/-/quill-1.3.7.tgz"
+ "version" "1.3.7"
+ dependencies:
+ "clone" "^2.1.1"
+ "deep-equal" "^1.0.1"
+ "eventemitter3" "^2.0.3"
+ "extend" "^3.0.2"
+ "parchment" "^1.1.4"
+ "quill-delta" "^3.6.2"
+
+"raf-schd@^4.0.2":
+ "integrity" "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ=="
+ "resolved" "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz"
+ "version" "4.0.3"
+
+"raf@^3.4.1":
+ "integrity" "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA=="
+ "resolved" "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz"
+ "version" "3.4.1"
+ dependencies:
+ "performance-now" "^2.1.0"
+
+"react-apexcharts@1.4.0":
+ "integrity" "sha512-DrcMV4aAMrUG+n6412yzyATWEyCDWlpPBBhVbpzBC4PDeuYU6iF84SmExbck+jx5MUm4U5PM3/T307Mc3kzc9Q=="
+ "resolved" "https://registry.npmjs.org/react-apexcharts/-/react-apexcharts-1.4.0.tgz"
+ "version" "1.4.0"
+ dependencies:
+ "prop-types" "^15.5.7"
+
+"react-beautiful-dnd@13.1.1":
+ "integrity" "sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ=="
+ "resolved" "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz"
+ "version" "13.1.1"
+ dependencies:
+ "@babel/runtime" "^7.9.2"
+ "css-box-model" "^1.2.0"
+ "memoize-one" "^5.1.1"
+ "raf-schd" "^4.0.2"
+ "react-redux" "^7.2.0"
+ "redux" "^4.0.4"
+ "use-memo-one" "^1.1.1"
+
+"react-copy-to-clipboard@^5.1.0":
+ "integrity" "sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A=="
+ "resolved" "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz"
+ "version" "5.1.0"
+ dependencies:
+ "copy-to-clipboard" "^3.3.1"
+ "prop-types" "^15.8.1"
+
+"react-dom@^16 || ^17 || ^18", "react-dom@^16.8 || ^17.0 || ^18.0", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.8.5 || ^17.0.0 || ^18.0.0", "react-dom@^17.0.0 || ^18.0.0", "react-dom@^17.0.2 || ^18.0.0", "react-dom@^18.2.0", "react-dom@>=16", "react-dom@>=16.6.0", "react-dom@>=16.8", "react-dom@>=17.0", "react-dom@18.2.0":
+ "integrity" "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g=="
+ "resolved" "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz"
+ "version" "18.2.0"
+ dependencies:
+ "loose-envify" "^1.1.0"
+ "scheduler" "^0.23.0"
+
+"react-dropzone@14.2.3":
+ "integrity" "sha512-O3om8I+PkFKbxCukfIR3QAGftYXDZfOE2N1mr/7qebQJHs7U+/RSL/9xomJNpRg9kM5h9soQSdf0Gc7OHF5Fug=="
+ "resolved" "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.3.tgz"
+ "version" "14.2.3"
+ dependencies:
+ "attr-accept" "^2.2.2"
+ "file-selector" "^0.6.0"
+ "prop-types" "^15.8.1"
+
+"react-fast-compare@^2.0.1":
+ "integrity" "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw=="
+ "resolved" "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz"
+ "version" "2.0.4"
+
+"react-hot-toast@2.4.0":
+ "integrity" "sha512-qnnVbXropKuwUpriVVosgo8QrB+IaPJCpL8oBI6Ov84uvHZ5QQcTp2qg6ku2wNfgJl6rlQXJIQU5q+5lmPOutA=="
+ "resolved" "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.4.0.tgz"
+ "version" "2.4.0"
+ dependencies:
+ "goober" "^2.1.10"
+
+"react-i18next@12.1.4":
+ "integrity" "sha512-XQND7jYtgM7ht5PH3yIZljCRpAMTlH/zmngM9ZjToqa+0BR6xuu8c7QF0WIIOEjcMTB2S3iOfpN/xG/ZrAnO6g=="
+ "resolved" "https://registry.npmjs.org/react-i18next/-/react-i18next-12.1.4.tgz"
+ "version" "12.1.4"
+ dependencies:
+ "@babel/runtime" "^7.20.6"
+ "html-parse-stringify" "^3.0.1"
+
+"react-is@^16.13.1":
+ "integrity" "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+ "resolved" "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz"
+ "version" "16.13.1"
+
+"react-is@^16.7.0":
+ "integrity" "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+ "resolved" "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz"
+ "version" "16.13.1"
+
+"react-is@^17.0.2":
+ "integrity" "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="
+ "resolved" "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz"
+ "version" "17.0.2"
+
+"react-is@^18.0.0", "react-is@^18.2.0", "react-is@^18.3.1":
+ "integrity" "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="
+ "resolved" "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz"
+ "version" "18.3.1"
+
+"react-markdown@8.0.5":
+ "integrity" "sha512-jGJolWWmOWAvzf+xMdB9zwStViODyyFQhNB/bwCerbBKmrTmgmA599CGiOlP58OId1IMoIRsA8UdI1Lod4zb5A=="
+ "resolved" "https://registry.npmjs.org/react-markdown/-/react-markdown-8.0.5.tgz"
+ "version" "8.0.5"
+ dependencies:
+ "@types/hast" "^2.0.0"
+ "@types/prop-types" "^15.0.0"
+ "@types/unist" "^2.0.0"
+ "comma-separated-tokens" "^2.0.0"
+ "hast-util-whitespace" "^2.0.0"
+ "prop-types" "^15.0.0"
+ "property-information" "^6.0.0"
+ "react-is" "^18.0.0"
+ "remark-parse" "^10.0.0"
+ "remark-rehype" "^10.0.0"
+ "space-separated-tokens" "^2.0.0"
+ "style-to-object" "^0.4.0"
+ "unified" "^10.0.0"
+ "unist-util-visit" "^4.0.0"
+ "vfile" "^5.0.0"
+
+"react-papaparse@^4.4.0":
+ "integrity" "sha512-xTEwHZYJ+1dh9mQDQjjwJXmWyX20DdZ52u+ddw75V+Xm5qsjXSvWmC7c8K82vRwMjKAOH2S9uFyGpHEyEztkUQ=="
+ "resolved" "https://registry.npmjs.org/react-papaparse/-/react-papaparse-4.4.0.tgz"
+ "version" "4.4.0"
+ dependencies:
+ "@types/papaparse" "^5.3.9"
+ "papaparse" "^5.4.1"
+
+"react-quill@2.0.0":
+ "integrity" "sha512-4qQtv1FtCfLgoD3PXAur5RyxuUbPXQGOHgTlFie3jtxp43mXDtzCKaOgQ3mLyZfi1PUlyjycfivKelFhy13QUg=="
+ "resolved" "https://registry.npmjs.org/react-quill/-/react-quill-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "@types/quill" "^1.3.10"
+ "lodash" "^4.17.4"
+ "quill" "^1.3.7"
+
+"react-redux@^7.2.0":
+ "integrity" "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ=="
+ "resolved" "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz"
+ "version" "7.2.9"
+ dependencies:
+ "@babel/runtime" "^7.15.4"
+ "@types/react-redux" "^7.1.20"
+ "hoist-non-react-statics" "^3.3.2"
+ "loose-envify" "^1.4.0"
+ "prop-types" "^15.7.2"
+ "react-is" "^17.0.2"
+
+"react-redux@^7.2.1 || ^8.0.2", "react-redux@8.0.5":
+ "integrity" "sha512-Q2f6fCKxPFpkXt1qNRZdEDLlScsDWyrgSj0mliK59qU6W5gvBiKkdMEG2lJzhd1rCctf0hb6EtePPLZ2e0m1uw=="
+ "resolved" "https://registry.npmjs.org/react-redux/-/react-redux-8.0.5.tgz"
+ "version" "8.0.5"
+ dependencies:
+ "@babel/runtime" "^7.12.1"
+ "@types/hoist-non-react-statics" "^3.3.1"
+ "@types/use-sync-external-store" "^0.0.3"
+ "hoist-non-react-statics" "^3.3.2"
+ "react-is" "^18.0.0"
+ "use-sync-external-store" "^1.0.0"
+
+"react-syntax-highlighter@15.5.0":
+ "integrity" "sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg=="
+ "resolved" "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz"
+ "version" "15.5.0"
+ dependencies:
+ "@babel/runtime" "^7.3.1"
+ "highlight.js" "^10.4.1"
+ "lowlight" "^1.17.0"
+ "prismjs" "^1.27.0"
+ "refractor" "^3.6.0"
+
+"react-transition-group@^4.4.5":
+ "integrity" "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g=="
+ "resolved" "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz"
+ "version" "4.4.5"
+ dependencies:
+ "@babel/runtime" "^7.5.5"
+ "dom-helpers" "^5.0.1"
+ "loose-envify" "^1.4.0"
+ "prop-types" "^15.6.2"
+
+"react@^15.3.0 || 16 || 17 || 18", "react@^16 || ^17 || ^18", "react@^16.8 || ^17.0 || ^18.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.8.3 || ^17 || ^18", "react@^16.8.5 || ^17.0.0 || ^18.0.0", "react@^16.8.6 || ^17.0.0 || ^18.0.0", "react@^16.9.0 || ^17.0.0 || ^18", "react@^17.0.0 || ^18.0.0", "react@^17.0.2 || ^18.0.0", "react@^18 || ^19", "react@^18.0.0", "react@^18.2.0", "react@>= 0.14.0", "react@>= 16", "react@>= 16.8 || 18.0.0", "react@>= 16.8.0", "react@>= 16.8.0 || 17.x.x || ^18.0.0-0", "react@>=0.13", "react@>=16", "react@>=16.6.0", "react@>=16.8", "react@>=16.8.0", "react@>=17.0", "react@18.2.0":
+ "integrity" "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ=="
+ "resolved" "https://registry.npmjs.org/react/-/react-18.2.0.tgz"
+ "version" "18.2.0"
+ dependencies:
+ "loose-envify" "^1.1.0"
+
+"readable-stream@^2.0.2":
+ "integrity" "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="
+ "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz"
+ "version" "2.3.8"
+ dependencies:
+ "core-util-is" "~1.0.0"
+ "inherits" "~2.0.3"
+ "isarray" "~1.0.0"
+ "process-nextick-args" "~2.0.0"
+ "safe-buffer" "~5.1.1"
+ "string_decoder" "~1.1.1"
+ "util-deprecate" "~1.0.1"
+
+"readable-stream@~1.0.17", "readable-stream@~1.0.27-1":
+ "integrity" "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg=="
+ "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz"
+ "version" "1.0.34"
+ dependencies:
+ "core-util-is" "~1.0.0"
+ "inherits" "~2.0.1"
+ "isarray" "0.0.1"
+ "string_decoder" "~0.10.x"
+
+"redux-devtools-extension@2.13.9":
+ "integrity" "sha512-cNJ8Q/EtjhQaZ71c8I9+BPySIBVEKssbPpskBfsXqb8HJ002A3KRVHfeRzwRo6mGPqsm7XuHTqNSNeS1Khig0A=="
+ "resolved" "https://registry.npmjs.org/redux-devtools-extension/-/redux-devtools-extension-2.13.9.tgz"
+ "version" "2.13.9"
+
+"redux-persist@^6.0.0":
+ "integrity" "sha512-71LLMbUq2r02ng2We9S215LtPu3fY0KgaGE0k8WRgl6RkqxtGfl7HUozz1Dftwsb0D/5mZ8dwAaPbtnzfvbEwQ=="
+ "resolved" "https://registry.npmjs.org/redux-persist/-/redux-persist-6.0.0.tgz"
+ "version" "6.0.0"
+
+"redux-thunk@^2.4.2", "redux-thunk@2.4.2":
+ "integrity" "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q=="
+ "resolved" "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz"
+ "version" "2.4.2"
+
+"redux@^3.1.0 || ^4.0.0", "redux@^4", "redux@^4.0.0", "redux@^4.0.4", "redux@^4.2.0", "redux@>4.0.0", "redux@4.2.1":
+ "integrity" "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w=="
+ "resolved" "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz"
+ "version" "4.2.1"
+ dependencies:
+ "@babel/runtime" "^7.9.2"
+
+"reflect.getprototypeof@^1.0.4":
+ "integrity" "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg=="
+ "resolved" "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz"
+ "version" "1.0.6"
+ dependencies:
+ "call-bind" "^1.0.7"
+ "define-properties" "^1.2.1"
+ "es-abstract" "^1.23.1"
+ "es-errors" "^1.3.0"
+ "get-intrinsic" "^1.2.4"
+ "globalthis" "^1.0.3"
+ "which-builtin-type" "^1.1.3"
+
+"refractor@^3.6.0":
+ "integrity" "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA=="
+ "resolved" "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz"
+ "version" "3.6.0"
+ dependencies:
+ "hastscript" "^6.0.0"
+ "parse-entities" "^2.0.0"
+ "prismjs" "~1.27.0"
+
+"regenerate-unicode-properties@^10.1.0":
+ "integrity" "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q=="
+ "resolved" "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz"
+ "version" "10.1.1"
+ dependencies:
+ "regenerate" "^1.4.2"
+
+"regenerate@^1.4.2":
+ "integrity" "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A=="
+ "resolved" "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz"
+ "version" "1.4.2"
+
+"regenerator-runtime@^0.13.7":
+ "integrity" "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
+ "resolved" "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz"
+ "version" "0.13.11"
+
+"regenerator-runtime@^0.14.0":
+ "integrity" "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
+ "resolved" "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz"
+ "version" "0.14.1"
+
+"regenerator-transform@^0.15.2":
+ "integrity" "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg=="
+ "resolved" "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz"
+ "version" "0.15.2"
+ dependencies:
+ "@babel/runtime" "^7.8.4"
+
+"regexp.prototype.flags@^1.5.1", "regexp.prototype.flags@^1.5.2":
+ "integrity" "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw=="
+ "resolved" "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz"
+ "version" "1.5.2"
+ dependencies:
+ "call-bind" "^1.0.6"
+ "define-properties" "^1.2.1"
+ "es-errors" "^1.3.0"
+ "set-function-name" "^2.0.1"
+
+"regexpp@^3.2.0":
+ "integrity" "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg=="
+ "resolved" "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz"
+ "version" "3.2.0"
+
+"regexpu-core@^5.3.1":
+ "integrity" "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ=="
+ "resolved" "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz"
+ "version" "5.3.2"
+ dependencies:
+ "@babel/regjsgen" "^0.8.0"
+ "regenerate" "^1.4.2"
+ "regenerate-unicode-properties" "^10.1.0"
+ "regjsparser" "^0.9.1"
+ "unicode-match-property-ecmascript" "^2.0.0"
+ "unicode-match-property-value-ecmascript" "^2.1.0"
+
+"regjsparser@^0.9.1":
+ "integrity" "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ=="
+ "resolved" "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz"
+ "version" "0.9.1"
+ dependencies:
+ "jsesc" "~0.5.0"
+
+"remark-parse@^10.0.0":
+ "integrity" "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw=="
+ "resolved" "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz"
+ "version" "10.0.2"
+ dependencies:
+ "@types/mdast" "^3.0.0"
+ "mdast-util-from-markdown" "^1.0.0"
+ "unified" "^10.0.0"
+
+"remark-rehype@^10.0.0":
+ "integrity" "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw=="
+ "resolved" "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz"
+ "version" "10.1.0"
+ dependencies:
+ "@types/hast" "^2.0.0"
+ "@types/mdast" "^3.0.0"
+ "mdast-util-to-hast" "^12.1.0"
+ "unified" "^10.0.0"
+
+"remove-accents@0.5.0":
+ "integrity" "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A=="
+ "resolved" "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz"
+ "version" "0.5.0"
+
+"require-from-string@^2.0.2":
+ "integrity" "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="
+ "resolved" "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz"
+ "version" "2.0.2"
+
+"reselect@^4.1.7":
+ "integrity" "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ=="
+ "resolved" "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz"
+ "version" "4.1.8"
+
+"resolve-from@^4.0.0":
+ "integrity" "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="
+ "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz"
+ "version" "4.0.0"
+
+"resolve-pkg-maps@^1.0.0":
+ "integrity" "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="
+ "resolved" "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz"
+ "version" "1.0.0"
+
+"resolve@^1.14.2", "resolve@^1.19.0", "resolve@^1.22.4":
+ "integrity" "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw=="
+ "resolved" "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz"
+ "version" "1.22.8"
+ dependencies:
+ "is-core-module" "^2.13.0"
+ "path-parse" "^1.0.7"
+ "supports-preserve-symlinks-flag" "^1.0.0"
+
+"resolve@^2.0.0-next.5":
+ "integrity" "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA=="
+ "resolved" "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz"
+ "version" "2.0.0-next.5"
+ dependencies:
+ "is-core-module" "^2.13.0"
+ "path-parse" "^1.0.7"
+ "supports-preserve-symlinks-flag" "^1.0.0"
+
+"restructure@^3.0.0":
+ "integrity" "sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw=="
+ "resolved" "https://registry.npmjs.org/restructure/-/restructure-3.0.2.tgz"
+ "version" "3.0.2"
+
+"reusify@^1.0.4":
+ "integrity" "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="
+ "resolved" "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz"
+ "version" "1.0.4"
+
+"rgbcolor@^1.0.1":
+ "integrity" "sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw=="
+ "resolved" "https://registry.npmjs.org/rgbcolor/-/rgbcolor-1.0.1.tgz"
+ "version" "1.0.1"
+
+"rifm@^0.12.1":
+ "integrity" "sha512-OGA1Bitg/dSJtI/c4dh90svzaUPt228kzFsUkJbtA2c964IqEAwWXeL9ZJi86xWv3j5SMqRvGULl7bA6cK0Bvg=="
+ "resolved" "https://registry.npmjs.org/rifm/-/rifm-0.12.1.tgz"
+ "version" "0.12.1"
+
+"rimraf@^3.0.2":
+ "integrity" "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="
+ "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz"
+ "version" "3.0.2"
+ dependencies:
+ "glob" "^7.1.3"
+
+"run-parallel@^1.1.9":
+ "integrity" "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="
+ "resolved" "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz"
+ "version" "1.2.0"
+ dependencies:
+ "queue-microtask" "^1.2.2"
+
+"sade@^1.7.3":
+ "integrity" "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="
+ "resolved" "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz"
+ "version" "1.8.1"
+ dependencies:
+ "mri" "^1.1.0"
+
+"safe-array-concat@^1.1.2":
+ "integrity" "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q=="
+ "resolved" "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz"
+ "version" "1.1.2"
+ dependencies:
+ "call-bind" "^1.0.7"
+ "get-intrinsic" "^1.2.4"
+ "has-symbols" "^1.0.3"
+ "isarray" "^2.0.5"
+
+"safe-buffer@~5.1.0", "safe-buffer@~5.1.1":
+ "integrity" "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz"
+ "version" "5.1.2"
+
+"safe-buffer@~5.2.0":
+ "integrity" "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+ "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
+ "version" "5.2.1"
+
+"safe-regex-test@^1.0.3":
+ "integrity" "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw=="
+ "resolved" "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz"
+ "version" "1.0.3"
+ dependencies:
+ "call-bind" "^1.0.6"
+ "es-errors" "^1.3.0"
+ "is-regex" "^1.1.4"
+
+"scheduler@^0.17.0":
+ "integrity" "sha512-7rro8Io3tnCPuY4la/NuI5F2yfESpnfZyT6TtkXnSWVkcu0BCDJ+8gk5ozUaFaxpIyNuWAPXrH0yFcSi28fnDA=="
+ "resolved" "https://registry.npmjs.org/scheduler/-/scheduler-0.17.0.tgz"
+ "version" "0.17.0"
+ dependencies:
+ "loose-envify" "^1.1.0"
+ "object-assign" "^4.1.1"
+
+"scheduler@^0.23.0":
+ "integrity" "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="
+ "resolved" "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz"
+ "version" "0.23.2"
+ dependencies:
+ "loose-envify" "^1.1.0"
+
+"section-matter@^1.0.0":
+ "integrity" "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA=="
+ "resolved" "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz"
+ "version" "1.0.0"
+ dependencies:
+ "extend-shallow" "^2.0.1"
+ "kind-of" "^6.0.0"
+
+"semver@^6.3.1":
+ "integrity" "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="
+ "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz"
+ "version" "6.3.1"
+
+"semver@^7.3.7":
+ "integrity" "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w=="
+ "resolved" "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz"
+ "version" "7.6.2"
+
+"set-function-length@^1.2.1":
+ "integrity" "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="
+ "resolved" "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz"
+ "version" "1.2.2"
+ dependencies:
+ "define-data-property" "^1.1.4"
+ "es-errors" "^1.3.0"
+ "function-bind" "^1.1.2"
+ "get-intrinsic" "^1.2.4"
+ "gopd" "^1.0.1"
+ "has-property-descriptors" "^1.0.2"
+
+"set-function-name@^2.0.1", "set-function-name@^2.0.2":
+ "integrity" "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ=="
+ "resolved" "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz"
+ "version" "2.0.2"
+ dependencies:
+ "define-data-property" "^1.1.4"
+ "es-errors" "^1.3.0"
+ "functions-have-names" "^1.2.3"
+ "has-property-descriptors" "^1.0.2"
+
+"shebang-command@^2.0.0":
+ "integrity" "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="
+ "resolved" "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "shebang-regex" "^3.0.0"
+
+"shebang-regex@^3.0.0":
+ "integrity" "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
+ "resolved" "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz"
+ "version" "3.0.0"
+
+"side-channel@^1.0.4", "side-channel@^1.0.6":
+ "integrity" "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA=="
+ "resolved" "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz"
+ "version" "1.0.6"
+ dependencies:
+ "call-bind" "^1.0.7"
+ "es-errors" "^1.3.0"
+ "get-intrinsic" "^1.2.4"
+ "object-inspect" "^1.13.1"
+
+"simple-swizzle@^0.2.2":
+ "integrity" "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg=="
+ "resolved" "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz"
+ "version" "0.2.2"
+ dependencies:
+ "is-arrayish" "^0.3.1"
+
+"simplebar-core@^1.2.0":
+ "integrity" "sha512-H5NYU+O+uvqOH5VXw3+lgoc1vTI6jL8LOZJsw4xgRpV7uIPjRpmLPdz0TrouxwKHBhpVLzVIlyKhaRLelIThMw=="
+ "resolved" "https://registry.npmjs.org/simplebar-core/-/simplebar-core-1.2.6.tgz"
+ "version" "1.2.6"
+ dependencies:
+ "@types/lodash-es" "^4.17.6"
+ "lodash" "^4.17.21"
+ "lodash-es" "^4.17.21"
+
+"simplebar-react@3.2.0":
+ "integrity" "sha512-rsKUAAARhZ/w5f/uoUf3PWjNVQN7CsFrOPMqJSsXtM2lTyXmiN5femuPLHeY0+95EF2QcQigKQABq9A2a6EvJg=="
+ "resolved" "https://registry.npmjs.org/simplebar-react/-/simplebar-react-3.2.0.tgz"
+ "version" "3.2.0"
+ dependencies:
+ "simplebar-core" "^1.2.0"
+
+"simplebar@6.2.0":
+ "integrity" "sha512-KiXO9hGg0wK7Oh5zbcdHKEPGlyem3IWA27HLKqolrhpToP0SA8iLf5tbXFBS4qRH4QTXiUn87wh9zCd4GnCZeQ=="
+ "resolved" "https://registry.npmjs.org/simplebar/-/simplebar-6.2.0.tgz"
+ "version" "6.2.0"
+ dependencies:
+ "can-use-dom" "^0.1.0"
+ "simplebar-core" "^1.2.0"
+
+"slash@^3.0.0":
+ "integrity" "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="
+ "resolved" "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz"
+ "version" "3.0.0"
+
+"source-map-js@^1.0.2":
+ "integrity" "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg=="
+ "resolved" "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz"
+ "version" "1.2.0"
+
+"source-map@^0.5.7":
+ "integrity" "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="
+ "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz"
+ "version" "0.5.7"
+
+"source-map@^0.6.1":
+ "integrity" "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz"
+ "version" "0.6.1"
+
+"space-separated-tokens@^1.0.0":
+ "integrity" "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA=="
+ "resolved" "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz"
+ "version" "1.1.5"
+
+"space-separated-tokens@^2.0.0":
+ "integrity" "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="
+ "resolved" "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz"
+ "version" "2.0.2"
+
+"sprintf-js@~1.0.2":
+ "integrity" "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="
+ "resolved" "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz"
+ "version" "1.0.3"
+
+"stable@^0.1.8":
+ "integrity" "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w=="
+ "resolved" "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz"
+ "version" "0.1.8"
+
+"stackblur-canvas@^2.0.0":
+ "integrity" "sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ=="
+ "resolved" "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.7.0.tgz"
+ "version" "2.7.0"
+
+"stop-iteration-iterator@^1.0.0":
+ "integrity" "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ=="
+ "resolved" "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz"
+ "version" "1.0.0"
+ dependencies:
+ "internal-slot" "^1.0.4"
+
+"string_decoder@^1.1.1":
+ "integrity" "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="
+ "resolved" "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz"
+ "version" "1.3.0"
+ dependencies:
+ "safe-buffer" "~5.2.0"
+
+"string_decoder@~0.10.x":
+ "integrity" "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="
+ "resolved" "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz"
+ "version" "0.10.31"
+
+"string_decoder@~1.1.1":
+ "integrity" "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="
+ "resolved" "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz"
+ "version" "1.1.1"
+ dependencies:
+ "safe-buffer" "~5.1.0"
+
+"string.prototype.includes@^2.0.0":
+ "integrity" "sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg=="
+ "resolved" "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "define-properties" "^1.1.3"
+ "es-abstract" "^1.17.5"
+
+"string.prototype.matchall@^4.0.11":
+ "integrity" "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg=="
+ "resolved" "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz"
+ "version" "4.0.11"
+ dependencies:
+ "call-bind" "^1.0.7"
+ "define-properties" "^1.2.1"
+ "es-abstract" "^1.23.2"
+ "es-errors" "^1.3.0"
+ "es-object-atoms" "^1.0.0"
+ "get-intrinsic" "^1.2.4"
+ "gopd" "^1.0.1"
+ "has-symbols" "^1.0.3"
+ "internal-slot" "^1.0.7"
+ "regexp.prototype.flags" "^1.5.2"
+ "set-function-name" "^2.0.2"
+ "side-channel" "^1.0.6"
+
+"string.prototype.repeat@^1.0.0":
+ "integrity" "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w=="
+ "resolved" "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz"
+ "version" "1.0.0"
+ dependencies:
+ "define-properties" "^1.1.3"
+ "es-abstract" "^1.17.5"
+
+"string.prototype.trim@^1.2.9":
+ "integrity" "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw=="
+ "resolved" "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz"
+ "version" "1.2.9"
+ dependencies:
+ "call-bind" "^1.0.7"
+ "define-properties" "^1.2.1"
+ "es-abstract" "^1.23.0"
+ "es-object-atoms" "^1.0.0"
+
+"string.prototype.trimend@^1.0.8":
+ "integrity" "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ=="
+ "resolved" "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz"
+ "version" "1.0.8"
+ dependencies:
+ "call-bind" "^1.0.7"
+ "define-properties" "^1.2.1"
+ "es-object-atoms" "^1.0.0"
+
+"string.prototype.trimstart@^1.0.8":
+ "integrity" "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg=="
+ "resolved" "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz"
+ "version" "1.0.8"
+ dependencies:
+ "call-bind" "^1.0.7"
+ "define-properties" "^1.2.1"
+ "es-object-atoms" "^1.0.0"
+
+"strip-ansi@^6.0.1":
+ "integrity" "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="
+ "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz"
+ "version" "6.0.1"
+ dependencies:
+ "ansi-regex" "^5.0.1"
+
+"strip-bom-string@^1.0.0":
+ "integrity" "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g=="
+ "resolved" "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz"
+ "version" "1.0.0"
+
+"strip-bom@^3.0.0":
+ "integrity" "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="
+ "resolved" "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz"
+ "version" "3.0.0"
+
+"strip-json-comments@^3.1.0", "strip-json-comments@^3.1.1":
+ "integrity" "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="
+ "resolved" "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz"
+ "version" "3.1.1"
+
+"style-to-object@^0.4.0":
+ "integrity" "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg=="
+ "resolved" "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz"
+ "version" "0.4.4"
+ dependencies:
+ "inline-style-parser" "0.1.1"
+
+"styled-jsx@5.1.1":
+ "integrity" "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw=="
+ "resolved" "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz"
+ "version" "5.1.1"
+ dependencies:
+ "client-only" "0.0.1"
+
+"stylis-plugin-rtl@2.1.1":
+ "integrity" "sha512-q6xIkri6fBufIO/sV55md2CbgS5c6gg9EhSVATtHHCdOnbN/jcI0u3lYhNVeuI65c4lQPo67g8xmq5jrREvzlg=="
+ "resolved" "https://registry.npmjs.org/stylis-plugin-rtl/-/stylis-plugin-rtl-2.1.1.tgz"
+ "version" "2.1.1"
+ dependencies:
+ "cssjanus" "^2.0.1"
+
+"stylis@4.1.3":
+ "integrity" "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA=="
+ "resolved" "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz"
+ "version" "4.1.3"
+
+"stylis@4.2.0":
+ "integrity" "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw=="
+ "resolved" "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz"
+ "version" "4.2.0"
+
+"stylis@4.x":
+ "integrity" "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg=="
+ "resolved" "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz"
+ "version" "4.3.2"
+
+"supports-color@^5.3.0":
+ "integrity" "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="
+ "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz"
+ "version" "5.5.0"
+ dependencies:
+ "has-flag" "^3.0.0"
+
+"supports-color@^7.1.0":
+ "integrity" "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="
+ "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz"
+ "version" "7.2.0"
+ dependencies:
+ "has-flag" "^4.0.0"
+
+"supports-preserve-symlinks-flag@^1.0.0":
+ "integrity" "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="
+ "resolved" "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz"
+ "version" "1.0.0"
+
+"svg-arc-to-cubic-bezier@^3.0.0", "svg-arc-to-cubic-bezier@^3.2.0":
+ "integrity" "sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g=="
+ "resolved" "https://registry.npmjs.org/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.0.tgz"
+ "version" "3.2.0"
+
+"svg-parser@^2.0.4":
+ "integrity" "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ=="
+ "resolved" "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz"
+ "version" "2.0.4"
+
+"svg-pathdata@^6.0.3":
+ "integrity" "sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw=="
+ "resolved" "https://registry.npmjs.org/svg-pathdata/-/svg-pathdata-6.0.3.tgz"
+ "version" "6.0.3"
+
+"svg.draggable.js@^2.2.2":
+ "integrity" "sha512-JzNHBc2fLQMzYCZ90KZHN2ohXL0BQJGQimK1kGk6AvSeibuKcIdDX9Kr0dT9+UJ5O8nYA0RB839Lhvk4CY4MZw=="
+ "resolved" "https://registry.npmjs.org/svg.draggable.js/-/svg.draggable.js-2.2.2.tgz"
+ "version" "2.2.2"
+ dependencies:
+ "svg.js" "^2.0.1"
+
+"svg.easing.js@^2.0.0":
+ "integrity" "sha512-//ctPdJMGy22YoYGV+3HEfHbm6/69LJUTAqI2/5qBvaNHZ9uUFVC82B0Pl299HzgH13rKrBgi4+XyXXyVWWthA=="
+ "resolved" "https://registry.npmjs.org/svg.easing.js/-/svg.easing.js-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "svg.js" ">=2.3.x"
+
+"svg.filter.js@^2.0.2":
+ "integrity" "sha512-xkGBwU+dKBzqg5PtilaTb0EYPqPfJ9Q6saVldX+5vCRy31P6TlRCP3U9NxH3HEufkKkpNgdTLBJnmhDHeTqAkw=="
+ "resolved" "https://registry.npmjs.org/svg.filter.js/-/svg.filter.js-2.0.2.tgz"
+ "version" "2.0.2"
+ dependencies:
+ "svg.js" "^2.2.5"
+
+"svg.js@^2.0.1", "svg.js@^2.2.5", "svg.js@^2.4.0", "svg.js@^2.6.5", "svg.js@>=2.3.x":
+ "integrity" "sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA=="
+ "resolved" "https://registry.npmjs.org/svg.js/-/svg.js-2.7.1.tgz"
+ "version" "2.7.1"
+
+"svg.pathmorphing.js@^0.1.3":
+ "integrity" "sha512-49HWI9X4XQR/JG1qXkSDV8xViuTLIWm/B/7YuQELV5KMOPtXjiwH4XPJvr/ghEDibmLQ9Oc22dpWpG0vUDDNww=="
+ "resolved" "https://registry.npmjs.org/svg.pathmorphing.js/-/svg.pathmorphing.js-0.1.3.tgz"
+ "version" "0.1.3"
+ dependencies:
+ "svg.js" "^2.4.0"
+
+"svg.resize.js@^1.4.3":
+ "integrity" "sha512-9k5sXJuPKp+mVzXNvxz7U0uC9oVMQrrf7cFsETznzUDDm0x8+77dtZkWdMfRlmbkEEYvUn9btKuZ3n41oNA+uw=="
+ "resolved" "https://registry.npmjs.org/svg.resize.js/-/svg.resize.js-1.4.3.tgz"
+ "version" "1.4.3"
+ dependencies:
+ "svg.js" "^2.6.5"
+ "svg.select.js" "^2.1.2"
+
+"svg.select.js@^2.1.2":
+ "integrity" "sha512-tH6ABEyJsAOVAhwcCjF8mw4crjXSI1aa7j2VQR8ZuJ37H2MBUbyeqYr5nEO7sSN3cy9AR9DUwNg0t/962HlDbQ=="
+ "resolved" "https://registry.npmjs.org/svg.select.js/-/svg.select.js-2.1.2.tgz"
+ "version" "2.1.2"
+ dependencies:
+ "svg.js" "^2.2.5"
+
+"svg.select.js@^3.0.1":
+ "integrity" "sha512-h5IS/hKkuVCbKSieR9uQCj9w+zLHoPh+ce19bBYyqF53g6mnPB8sAtIbe1s9dh2S2fCmYX2xel1Ln3PJBbK4kw=="
+ "resolved" "https://registry.npmjs.org/svg.select.js/-/svg.select.js-3.0.1.tgz"
+ "version" "3.0.1"
+ dependencies:
+ "svg.js" "^2.6.5"
+
+"svgo@^2.8.0":
+ "integrity" "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg=="
+ "resolved" "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz"
+ "version" "2.8.0"
+ dependencies:
+ "@trysound/sax" "0.2.0"
+ "commander" "^7.2.0"
+ "css-select" "^4.1.3"
+ "css-tree" "^1.1.3"
+ "csso" "^4.2.0"
+ "picocolors" "^1.0.0"
+ "stable" "^0.1.8"
+
+"tapable@^2.2.0":
+ "integrity" "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ=="
+ "resolved" "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz"
+ "version" "2.2.1"
+
+"text-segmentation@^1.0.3":
+ "integrity" "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw=="
+ "resolved" "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz"
+ "version" "1.0.3"
+ dependencies:
+ "utrie" "^1.0.2"
+
+"text-table@^0.2.0":
+ "integrity" "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="
+ "resolved" "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz"
+ "version" "0.2.0"
+
+"through@^2.3.8":
+ "integrity" "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="
+ "resolved" "https://registry.npmjs.org/through/-/through-2.3.8.tgz"
+ "version" "2.3.8"
+
+"through2@~0.4.1":
+ "integrity" "sha512-45Llu+EwHKtAZYTPPVn3XZHBgakWMN3rokhEv5hu596XP+cNgplMg+Gj+1nmAvj+L0K7+N49zBKx5rah5u0QIQ=="
+ "resolved" "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz"
+ "version" "0.4.2"
+ dependencies:
+ "readable-stream" "~1.0.17"
+ "xtend" "~2.1.1"
+
+"tiny-inflate@^1.0.0", "tiny-inflate@^1.0.3":
+ "integrity" "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="
+ "resolved" "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz"
+ "version" "1.0.3"
+
+"tiny-invariant@^1.0.6":
+ "integrity" "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="
+ "resolved" "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz"
+ "version" "1.3.3"
+
+"tiny-warning@^1.0.2":
+ "integrity" "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="
+ "resolved" "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz"
+ "version" "1.0.3"
+
+"to-fast-properties@^2.0.0":
+ "integrity" "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog=="
+ "resolved" "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz"
+ "version" "2.0.0"
+
+"to-regex-range@^5.0.1":
+ "integrity" "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="
+ "resolved" "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz"
+ "version" "5.0.1"
+ dependencies:
+ "is-number" "^7.0.0"
+
+"toggle-selection@^1.0.6":
+ "integrity" "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ=="
+ "resolved" "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz"
+ "version" "1.0.6"
+
+"toposort@^2.0.2":
+ "integrity" "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg=="
+ "resolved" "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz"
+ "version" "2.0.2"
+
+"tr46@~0.0.3":
+ "integrity" "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
+ "resolved" "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz"
+ "version" "0.0.3"
+
+"trim-lines@^3.0.0":
+ "integrity" "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="
+ "resolved" "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz"
+ "version" "3.0.1"
+
+"trough@^2.0.0":
+ "integrity" "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="
+ "resolved" "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz"
+ "version" "2.2.0"
+
+"tsconfig-paths@^3.15.0":
+ "integrity" "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="
+ "resolved" "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz"
+ "version" "3.15.0"
+ dependencies:
+ "@types/json5" "^0.0.29"
+ "json5" "^1.0.2"
+ "minimist" "^1.2.6"
+ "strip-bom" "^3.0.0"
+
+"tslib@^1.10.0":
+ "integrity" "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ "resolved" "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz"
+ "version" "1.14.1"
+
+"tslib@^1.8.1":
+ "integrity" "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ "resolved" "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz"
+ "version" "1.14.1"
+
+"tslib@^2.4.0":
+ "integrity" "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ=="
+ "resolved" "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz"
+ "version" "2.6.3"
+
+"tsutils@^3.21.0":
+ "integrity" "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA=="
+ "resolved" "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz"
+ "version" "3.21.0"
+ dependencies:
+ "tslib" "^1.8.1"
+
+"type-check@^0.4.0", "type-check@~0.4.0":
+ "integrity" "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="
+ "resolved" "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz"
+ "version" "0.4.0"
+ dependencies:
+ "prelude-ls" "^1.2.1"
+
+"type-fest@^0.20.2":
+ "integrity" "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="
+ "resolved" "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz"
+ "version" "0.20.2"
+
+"typed-array-buffer@^1.0.2":
+ "integrity" "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ=="
+ "resolved" "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz"
+ "version" "1.0.2"
+ dependencies:
+ "call-bind" "^1.0.7"
+ "es-errors" "^1.3.0"
+ "is-typed-array" "^1.1.13"
+
+"typed-array-byte-length@^1.0.1":
+ "integrity" "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw=="
+ "resolved" "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz"
+ "version" "1.0.1"
+ dependencies:
+ "call-bind" "^1.0.7"
+ "for-each" "^0.3.3"
+ "gopd" "^1.0.1"
+ "has-proto" "^1.0.3"
+ "is-typed-array" "^1.1.13"
+
+"typed-array-byte-offset@^1.0.2":
+ "integrity" "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA=="
+ "resolved" "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz"
+ "version" "1.0.2"
+ dependencies:
+ "available-typed-arrays" "^1.0.7"
+ "call-bind" "^1.0.7"
+ "for-each" "^0.3.3"
+ "gopd" "^1.0.1"
+ "has-proto" "^1.0.3"
+ "is-typed-array" "^1.1.13"
+
+"typed-array-length@^1.0.6":
+ "integrity" "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g=="
+ "resolved" "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz"
+ "version" "1.0.6"
+ dependencies:
+ "call-bind" "^1.0.7"
+ "for-each" "^0.3.3"
+ "gopd" "^1.0.1"
+ "has-proto" "^1.0.3"
+ "is-typed-array" "^1.1.13"
+ "possible-typed-array-names" "^1.0.0"
+
+"typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", "typescript@>=3.3.1", "typescript@4.9.4":
+ "integrity" "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg=="
+ "resolved" "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz"
+ "version" "4.9.4"
+
+"unbox-primitive@^1.0.2":
+ "integrity" "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw=="
+ "resolved" "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz"
+ "version" "1.0.2"
+ dependencies:
+ "call-bind" "^1.0.2"
+ "has-bigints" "^1.0.2"
+ "has-symbols" "^1.0.3"
+ "which-boxed-primitive" "^1.0.2"
+
+"undici-types@~5.26.4":
+ "integrity" "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
+ "resolved" "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz"
+ "version" "5.26.5"
+
+"unicode-canonical-property-names-ecmascript@^2.0.0":
+ "integrity" "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ=="
+ "resolved" "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz"
+ "version" "2.0.0"
+
+"unicode-match-property-ecmascript@^2.0.0":
+ "integrity" "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q=="
+ "resolved" "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "unicode-canonical-property-names-ecmascript" "^2.0.0"
+ "unicode-property-aliases-ecmascript" "^2.0.0"
+
+"unicode-match-property-value-ecmascript@^2.1.0":
+ "integrity" "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA=="
+ "resolved" "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz"
+ "version" "2.1.0"
+
+"unicode-properties@^1.4.0", "unicode-properties@^1.4.1":
+ "integrity" "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg=="
+ "resolved" "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz"
+ "version" "1.4.1"
+ dependencies:
+ "base64-js" "^1.3.0"
+ "unicode-trie" "^2.0.0"
+
+"unicode-property-aliases-ecmascript@^2.0.0":
+ "integrity" "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w=="
+ "resolved" "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz"
+ "version" "2.1.0"
+
+"unicode-trie@^2.0.0":
+ "integrity" "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ=="
+ "resolved" "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "pako" "^0.2.5"
+ "tiny-inflate" "^1.0.0"
+
+"unified@^10.0.0":
+ "integrity" "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q=="
+ "resolved" "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz"
+ "version" "10.1.2"
+ dependencies:
+ "@types/unist" "^2.0.0"
+ "bail" "^2.0.0"
+ "extend" "^3.0.0"
+ "is-buffer" "^2.0.0"
+ "is-plain-obj" "^4.0.0"
+ "trough" "^2.0.0"
+ "vfile" "^5.0.0"
+
+"unist-util-generated@^2.0.0":
+ "integrity" "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A=="
+ "resolved" "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz"
+ "version" "2.0.1"
+
+"unist-util-is@^5.0.0":
+ "integrity" "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw=="
+ "resolved" "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz"
+ "version" "5.2.1"
+ dependencies:
+ "@types/unist" "^2.0.0"
+
+"unist-util-position@^4.0.0":
+ "integrity" "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg=="
+ "resolved" "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz"
+ "version" "4.0.4"
+ dependencies:
+ "@types/unist" "^2.0.0"
+
+"unist-util-stringify-position@^3.0.0":
+ "integrity" "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg=="
+ "resolved" "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz"
+ "version" "3.0.3"
+ dependencies:
+ "@types/unist" "^2.0.0"
+
+"unist-util-visit-parents@^5.1.1":
+ "integrity" "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg=="
+ "resolved" "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz"
+ "version" "5.1.3"
+ dependencies:
+ "@types/unist" "^2.0.0"
+ "unist-util-is" "^5.0.0"
+
+"unist-util-visit@^4.0.0":
+ "integrity" "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg=="
+ "resolved" "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz"
+ "version" "4.1.2"
+ dependencies:
+ "@types/unist" "^2.0.0"
+ "unist-util-is" "^5.0.0"
+ "unist-util-visit-parents" "^5.1.1"
+
+"update-browserslist-db@^1.1.0":
+ "integrity" "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ=="
+ "resolved" "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz"
+ "version" "1.1.0"
+ dependencies:
+ "escalade" "^3.1.2"
+ "picocolors" "^1.0.1"
+
+"uri-js@^4.2.2":
+ "integrity" "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="
+ "resolved" "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz"
+ "version" "4.4.1"
+ dependencies:
+ "punycode" "^2.1.0"
+
+"use-memo-one@^1.1.1":
+ "integrity" "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ=="
+ "resolved" "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz"
+ "version" "1.1.3"
+
+"use-sync-external-store@^1.0.0":
+ "integrity" "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw=="
+ "resolved" "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz"
+ "version" "1.2.2"
+
+"util-deprecate@^1.0.1", "util-deprecate@~1.0.1":
+ "integrity" "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+ "resolved" "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
+ "version" "1.0.2"
+
+"utrie@^1.0.2":
+ "integrity" "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw=="
+ "resolved" "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz"
+ "version" "1.0.2"
+ dependencies:
+ "base64-arraybuffer" "^1.0.2"
+
+"uvu@^0.5.0":
+ "integrity" "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA=="
+ "resolved" "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz"
+ "version" "0.5.6"
+ dependencies:
+ "dequal" "^2.0.0"
+ "diff" "^5.0.0"
+ "kleur" "^4.0.3"
+ "sade" "^1.7.3"
+
+"vfile-message@^3.0.0":
+ "integrity" "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw=="
+ "resolved" "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz"
+ "version" "3.1.4"
+ dependencies:
+ "@types/unist" "^2.0.0"
+ "unist-util-stringify-position" "^3.0.0"
+
+"vfile@^5.0.0":
+ "integrity" "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g=="
+ "resolved" "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz"
+ "version" "5.3.7"
+ dependencies:
+ "@types/unist" "^2.0.0"
+ "is-buffer" "^2.0.0"
+ "unist-util-stringify-position" "^3.0.0"
+ "vfile-message" "^3.0.0"
+
+"vite-compatible-readable-stream@^3.6.1":
+ "integrity" "sha512-t20zYkrSf868+j/p31cRIGN28Phrjm3nRSLR2fyc2tiWi4cZGVdv68yNlwnIINTkMTmPoMiSlc0OadaO7DXZaQ=="
+ "resolved" "https://registry.npmjs.org/vite-compatible-readable-stream/-/vite-compatible-readable-stream-3.6.1.tgz"
+ "version" "3.6.1"
+ dependencies:
+ "inherits" "^2.0.3"
+ "string_decoder" "^1.1.1"
+ "util-deprecate" "^1.0.1"
+
+"void-elements@3.1.0":
+ "integrity" "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w=="
+ "resolved" "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz"
+ "version" "3.1.0"
+
+"webidl-conversions@^3.0.0":
+ "integrity" "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
+ "resolved" "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz"
+ "version" "3.0.1"
+
+"whatwg-url@^5.0.0":
+ "integrity" "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="
+ "resolved" "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz"
+ "version" "5.0.0"
+ dependencies:
+ "tr46" "~0.0.3"
+ "webidl-conversions" "^3.0.0"
+
+"which-boxed-primitive@^1.0.2":
+ "integrity" "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg=="
+ "resolved" "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz"
+ "version" "1.0.2"
+ dependencies:
+ "is-bigint" "^1.0.1"
+ "is-boolean-object" "^1.1.0"
+ "is-number-object" "^1.0.4"
+ "is-string" "^1.0.5"
+ "is-symbol" "^1.0.3"
+
+"which-builtin-type@^1.1.3":
+ "integrity" "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw=="
+ "resolved" "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz"
+ "version" "1.1.3"
+ dependencies:
+ "function.prototype.name" "^1.1.5"
+ "has-tostringtag" "^1.0.0"
+ "is-async-function" "^2.0.0"
+ "is-date-object" "^1.0.5"
+ "is-finalizationregistry" "^1.0.2"
+ "is-generator-function" "^1.0.10"
+ "is-regex" "^1.1.4"
+ "is-weakref" "^1.0.2"
+ "isarray" "^2.0.5"
+ "which-boxed-primitive" "^1.0.2"
+ "which-collection" "^1.0.1"
+ "which-typed-array" "^1.1.9"
+
+"which-collection@^1.0.1":
+ "integrity" "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw=="
+ "resolved" "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz"
+ "version" "1.0.2"
+ dependencies:
+ "is-map" "^2.0.3"
+ "is-set" "^2.0.3"
+ "is-weakmap" "^2.0.2"
+ "is-weakset" "^2.0.3"
+
+"which-typed-array@^1.1.13", "which-typed-array@^1.1.14", "which-typed-array@^1.1.15", "which-typed-array@^1.1.9":
+ "integrity" "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA=="
+ "resolved" "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz"
+ "version" "1.1.15"
+ dependencies:
+ "available-typed-arrays" "^1.0.7"
+ "call-bind" "^1.0.7"
+ "for-each" "^0.3.3"
+ "gopd" "^1.0.1"
+ "has-tostringtag" "^1.0.2"
+
+"which@^2.0.1":
+ "integrity" "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="
+ "resolved" "https://registry.npmjs.org/which/-/which-2.0.2.tgz"
+ "version" "2.0.2"
+ dependencies:
+ "isexe" "^2.0.0"
+
+"word-wrap@^1.2.5":
+ "integrity" "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="
+ "resolved" "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz"
+ "version" "1.2.5"
+
+"wrappy@1":
+ "integrity" "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+ "resolved" "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"
+ "version" "1.0.2"
+
+"xtend@^4.0.0":
+ "integrity" "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
+ "resolved" "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz"
+ "version" "4.0.2"
+
+"xtend@~2.1.1":
+ "integrity" "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ=="
+ "resolved" "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz"
+ "version" "2.1.2"
+ dependencies:
+ "object-keys" "~0.4.0"
+
+"yallist@^3.0.2":
+ "integrity" "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
+ "resolved" "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz"
+ "version" "3.1.1"
+
+"yaml@^1.10.0":
+ "integrity" "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="
+ "resolved" "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz"
+ "version" "1.10.2"
+
+"yocto-queue@^0.1.0":
+ "integrity" "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="
+ "resolved" "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz"
+ "version" "0.1.0"
+
+"yoga-layout@^2.0.1":
+ "integrity" "sha512-tT/oChyDXelLo2A+UVnlW9GU7CsvFMaEnd9kVFsaiCQonFAXd3xrHhkLYu+suwwosrAEQ746xBU+HvYtm1Zs2Q=="
+ "resolved" "https://registry.npmjs.org/yoga-layout/-/yoga-layout-2.0.1.tgz"
+ "version" "2.0.1"
+
+"yup@0.32.11":
+ "integrity" "sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg=="
+ "resolved" "https://registry.npmjs.org/yup/-/yup-0.32.11.tgz"
+ "version" "0.32.11"
+ dependencies:
+ "@babel/runtime" "^7.15.4"
+ "@types/lodash" "^4.14.175"
+ "lodash" "^4.17.21"
+ "lodash-es" "^4.17.21"
+ "nanoclone" "^0.2.1"
+ "property-expr" "^2.0.4"
+ "toposort" "^2.0.2"