From 2fdd8225f3d86fded0cd99e89bd76fc869f4ce98 Mon Sep 17 00:00:00 2001 From: Giovambattista Fazioli Date: Mon, 18 Dec 2023 14:27:34 +0100 Subject: [PATCH 1/7] feat: adds dragging and toggling --- docs/config.ts | 5 + docs/examples/DraggingExample.tsx | 27 +++ .../DraggingTogglingComplexExample.tsx | 57 +++++ .../examples/DraggingTogglingResetExample.tsx | 41 ++++ docs/examples/TogglingExample.tsx | 26 +++ docs/pages/examples/dragging-toggling.tsx | 86 ++++++++ package/DataTable.tsx | 51 +++-- package/DataTableDragToggleColumns.context.ts | 28 +++ .../DataTableDragToggleColumnsProvider.tsx | 68 ++++++ package/DataTableHeader.tsx | 4 + package/DataTableHeaderCell.tsx | 205 +++++++++++++++++- package/hooks.ts | 84 ++++++- package/index.ts | 1 + package/types/DataTableColumn.ts | 17 +- package/types/DataTableProps.ts | 6 + 15 files changed, 676 insertions(+), 30 deletions(-) create mode 100644 docs/examples/DraggingExample.tsx create mode 100644 docs/examples/DraggingTogglingComplexExample.tsx create mode 100644 docs/examples/DraggingTogglingResetExample.tsx create mode 100644 docs/examples/TogglingExample.tsx create mode 100644 docs/pages/examples/dragging-toggling.tsx create mode 100644 package/DataTableDragToggleColumns.context.ts create mode 100644 package/DataTableDragToggleColumnsProvider.tsx diff --git a/docs/config.ts b/docs/config.ts index 4f098be..b9f9b00 100644 --- a/docs/config.ts +++ b/docs/config.ts @@ -126,6 +126,11 @@ export const PAGES: ({ external?: true; title: string; color?: MantineColor; des title: 'Sorting', description: 'Example: sorting data with Mantine DataTable', }, + { + path: 'dragging-toggling', + title: 'Dragging & Toggling', + description: `Example: dragging & toggling columns with Mantine DataTable`, + }, { path: 'infinite-scrolling', title: 'Implementing infinite scrolling', diff --git a/docs/examples/DraggingExample.tsx b/docs/examples/DraggingExample.tsx new file mode 100644 index 0000000..8ae4c21 --- /dev/null +++ b/docs/examples/DraggingExample.tsx @@ -0,0 +1,27 @@ +import { DataTable, useDragToggleColumns } from 'mantine-datatable'; +import { companies, type Company } from '~/data'; + +import { Button, Group, Stack } from '@mantine/core'; + +export default function DraggingExample() { + const key = 'draggable-example'; + + const { effectiveColumns, resetColumnsOrder } = useDragToggleColumns({ + key, + columns: [ + { accessor: 'name', width: '40%', draggable: true }, + { accessor: 'streetAddress', width: '60%', draggable: true }, + { accessor: 'city', width: 160, draggable: true }, + { accessor: 'state' }, + ], + }); + + return ( + + + + + + + ); +} diff --git a/docs/examples/DraggingTogglingComplexExample.tsx b/docs/examples/DraggingTogglingComplexExample.tsx new file mode 100644 index 0000000..6be1521 --- /dev/null +++ b/docs/examples/DraggingTogglingComplexExample.tsx @@ -0,0 +1,57 @@ +import { IconColumnRemove, IconColumns1 } from '@tabler/icons-react'; +import sortBy from 'lodash/sortBy'; +import { DataTable, DataTableSortStatus, useDragToggleColumns } from 'mantine-datatable'; +import { useEffect, useState } from 'react'; +import { companies, type Company } from '~/data'; + +export default function DraggingTogglingComplexExample() { + const key = 'draggable-toggleable-complex-example'; + + const [sortStatus, setSortStatus] = useState({ + columnAccessor: 'name', + direction: 'asc', + }); + + const [records, setRecords] = useState(sortBy(companies, 'name')); + + useEffect(() => { + const data = sortBy(companies, sortStatus.columnAccessor) as Company[]; + setRecords(sortStatus.direction === 'desc' ? data.reverse() : data); + }, [sortStatus]); + + const { effectiveColumns, resetColumnsOrder, resetColumnsToggle } = useDragToggleColumns({ + key, + columns: [ + { accessor: 'name', width: '40%', toggleable: true, draggable: true, sortable: true }, + { accessor: 'streetAddress', width: '60%', toggleable: true, draggable: true }, + { accessor: 'city', width: 160, toggleable: true, draggable: true }, + { accessor: 'state' }, + ], + }); + + return ( + [ + { + key: 'reset-columns.toggled', + icon: , + onClick: resetColumnsToggle, + }, + { + key: 'reset-columns-order', + icon: , + onClick: resetColumnsOrder, + }, + ], + }} + /> + ); +} diff --git a/docs/examples/DraggingTogglingResetExample.tsx b/docs/examples/DraggingTogglingResetExample.tsx new file mode 100644 index 0000000..b3d1052 --- /dev/null +++ b/docs/examples/DraggingTogglingResetExample.tsx @@ -0,0 +1,41 @@ +import { IconColumnRemove, IconColumns1 } from '@tabler/icons-react'; +import { DataTable, useDragToggleColumns } from 'mantine-datatable'; +import { companies } from '~/data'; + +export default function DraggingTogglingResetExample() { + const key = 'toggleable-reset-example'; + + const { effectiveColumns, resetColumnsOrder, resetColumnsToggle } = useDragToggleColumns({ + key, + columns: [ + { accessor: 'name', width: '40%', toggleable: true, draggable: true }, + { accessor: 'streetAddress', width: '60%', toggleable: true, draggable: true }, + { accessor: 'city', width: 160, toggleable: true, draggable: true }, + { accessor: 'state' }, + ], + }); + + return ( + [ + { + key: 'reset-columns.toggled', + icon: , + onClick: resetColumnsToggle, + }, + { + key: 'reset-columns-order', + icon: , + onClick: resetColumnsOrder, + }, + ], + }} + /> + ); +} diff --git a/docs/examples/TogglingExample.tsx b/docs/examples/TogglingExample.tsx new file mode 100644 index 0000000..ae4b61b --- /dev/null +++ b/docs/examples/TogglingExample.tsx @@ -0,0 +1,26 @@ +import { Button, Group, Stack } from '@mantine/core'; +import { DataTable, useDragToggleColumns } from 'mantine-datatable'; +import { companies } from '~/data'; + +export default function TogglingExample() { + const key = 'toggleable-example'; + + const { effectiveColumns, resetColumnsToggle } = useDragToggleColumns({ + key, + columns: [ + { accessor: 'name', width: '40%', toggleable: true }, + { accessor: 'streetAddress', width: '60%', toggleable: true }, + { accessor: 'city', width: 160, toggleable: true }, + { accessor: 'state' }, + ], + }); + + return ( + + + + + + + ); +} diff --git a/docs/pages/examples/dragging-toggling.tsx b/docs/pages/examples/dragging-toggling.tsx new file mode 100644 index 0000000..d1f4959 --- /dev/null +++ b/docs/pages/examples/dragging-toggling.tsx @@ -0,0 +1,86 @@ +import { Code, Container } from '@mantine/core'; +import { GetStaticProps, InferGetStaticPropsType } from 'next'; +import CodeBlock from '~/components/CodeBlock'; +import PageNavigation from '~/components/PageNavigation'; +import PageSubtitle from '~/components/PageSubtitle'; +import PageText from '~/components/PageText'; +import PageTitle from '~/components/PageTitle'; +import DraggingExample from '~/examples/DraggingExample'; +import DraggingTogglingComplexExample from '~/examples/DraggingTogglingComplexExample'; +import DraggingTogglingResetExample from '~/examples/DraggingTogglingResetExample'; +import TogglingExample from '~/examples/TogglingExample'; +import allPromiseProps from '~/lib/allPromiseProps'; +import readCodeExample from '~/lib/readCodeExample'; + +const PATH = 'examples/dragging-toggling'; + +export const getStaticProps: GetStaticProps<{ + code: Record<'default' | 'toggling' | 'reset' | 'complex', string>; +}> = async () => ({ + props: { + code: await allPromiseProps({ + default: readCodeExample('examples/DraggingExample.tsx') as Promise, + toggling: readCodeExample('examples/TogglingExample.tsx') as Promise, + reset: readCodeExample('examples/DraggingTogglingResetExample.tsx') as Promise, + complex: readCodeExample('examples/DraggingTogglingComplexExample.tsx') as Promise, + }), + }, +}); + +export default function Page({ code }: InferGetStaticPropsType) { + return ( + + + + + In order to enable Dragging you’ll have to: +
    +
  • + add a storeColumnsKey: your_key property to the DataTable; +
  • +
  • + add a draggable: true property to each Dragging candidate column; +
  • +
  • + use useDragToggleColumns() hook to get the sorted columns. +
  • +
+
+ + + The default order of the columns is the order in which they are defined in the columns prop. + + + + + + + + In order to enable Toggling you’ll have to: +
    +
  • + add a storeColumnsKey: your_key property to the DataTable; +
  • +
  • + add a toggleable: true property to each Toggling candidate column; +
  • +
  • + use useDragToggleColumns() hook to get the sorted columns. +
  • +
+
+ + + + + + + + + + + + +
+ ); +} diff --git a/package/DataTable.tsx b/package/DataTable.tsx index a8df8d3..11346ab 100644 --- a/package/DataTable.tsx +++ b/package/DataTable.tsx @@ -9,6 +9,7 @@ import { type Key, type MouseEventHandler, } from 'react'; +import { DataTableDragToggleColumnsProvider } from './DataTableDragToggleColumnsProvider'; import DataTableEmptyRow from './DataTableEmptyRow'; import DataTableEmptyState from './DataTableEmptyState'; import DataTableFooter from './DataTableFooter'; @@ -20,7 +21,13 @@ import DataTableRowMenu from './DataTableRowMenu'; import DataTableRowMenuDivider from './DataTableRowMenuDivider'; import DataTableRowMenuItem from './DataTableRowMenuItem'; import DataTableScrollArea from './DataTableScrollArea'; -import { useElementOuterSize, useLastSelectionChangeIndex, useRowContextMenu, useRowExpansion } from './hooks'; +import { + useDragToggleColumns, + useElementOuterSize, + useLastSelectionChangeIndex, + useRowContextMenu, + useRowExpansion, +} from './hooks'; import type { DataTableProps } from './types'; import { differenceBy, getRecordId, humanize, uniqBy, useIsomorphicLayoutEffect } from './utils'; @@ -154,6 +161,7 @@ export default function DataTable({ verticalAlignment = 'center', fetching, columns, + storeColumnsKey, groups, pinLastColumn, defaultColumnProps, @@ -238,6 +246,11 @@ export default function DataTable({ return groups?.flatMap((group) => group.columns) ?? columns!; }, [columns, groups]); + const dragToggle = useDragToggleColumns({ + key: storeColumnsKey, + columns: effectiveColumns, + }); + const { ref: headerRef, height: headerHeight } = useElementOuterSize(); const { ref: tableRef, width: tableWidth, height: tableHeight } = useElementOuterSize(); const { ref: footerRef, height: footerHeight } = useElementOuterSize(); @@ -392,23 +405,25 @@ export default function DataTable({ {...otherProps} > {withoutHeader ? null : ( - - ref={headerRef} - className={classNames?.header} - style={styleProperties?.header} - columns={effectiveColumns} - defaultColumnProps={defaultColumnProps} - groups={groups} - sortStatus={sortStatus} - sortIcons={sortIcons} - onSortStatusChange={onSortStatusChange} - selectionVisible={selectionColumnVisible} - selectionChecked={allSelectableRecordsSelected} - selectionIndeterminate={someRecordsSelected && !allSelectableRecordsSelected} - onSelectionChange={handleHeaderSelectionChange} - selectionCheckboxProps={allRecordsSelectionCheckboxProps} - leftShadowVisible={selectionVisibleAndNotScrolledToLeft} - /> + + + ref={headerRef} + className={classNames?.header} + style={styleProperties?.header} + columns={effectiveColumns} + defaultColumnProps={defaultColumnProps} + groups={groups} + sortStatus={sortStatus} + sortIcons={sortIcons} + onSortStatusChange={onSortStatusChange} + selectionVisible={selectionColumnVisible} + selectionChecked={allSelectableRecordsSelected} + selectionIndeterminate={someRecordsSelected && !allSelectableRecordsSelected} + onSelectionChange={handleHeaderSelectionChange} + selectionCheckboxProps={allRecordsSelectionCheckboxProps} + leftShadowVisible={selectionVisibleAndNotScrolledToLeft} + /> + )} {recordsLength ? ( diff --git a/package/DataTableDragToggleColumns.context.ts b/package/DataTableDragToggleColumns.context.ts new file mode 100644 index 0000000..05b9069 --- /dev/null +++ b/package/DataTableDragToggleColumns.context.ts @@ -0,0 +1,28 @@ +import { createSafeContext } from '@mantine/utils'; +import { Dispatch, SetStateAction } from 'react'; +import { DataTableColumnToggle } from './hooks'; + +interface DataTableDragToggleColumnsContext { + // accessor of the column which is currently dragged + sourceColumn: string; + setSourceColumn: Dispatch>; + + // accessor of the column which is currently hovered + targetColumn: string; + setTargetColumn: Dispatch>; + + // swap the source column with the target column + swapColumns: () => void; + + // reset to the default columns order + resetColumnsOrder: () => void; + + columnsToggle: DataTableColumnToggle[]; + setColumnsToggle: Dispatch>; + resetColumnsToggle: () => void; +} + +export const [DataTableDragToggleColumnsContextProvider, useDataTableDragToggleColumnsContext] = + createSafeContext( + 'useDataTableDragToggleColumnsContext must be used within DataTableDragToggleColumnOrdersProvider' + ); diff --git a/package/DataTableDragToggleColumnsProvider.tsx b/package/DataTableDragToggleColumnsProvider.tsx new file mode 100644 index 0000000..f635a97 --- /dev/null +++ b/package/DataTableDragToggleColumnsProvider.tsx @@ -0,0 +1,68 @@ +import { Dispatch, SetStateAction, useState } from 'react'; +import { DataTableDragToggleColumnsContextProvider } from './DataTableDragToggleColumns.context'; +import { DataTableColumnToggle } from './hooks'; + +type DataTableDragToggleColumnsProviderProps = { + // React children + children: React.ReactNode; + + columnsOrder: string[]; + setColumnsOrder: Dispatch>; + resetColumnsOrder: () => void; + + columnsToggle: DataTableColumnToggle[]; + setColumnsToggle: Dispatch>; + resetColumnsToggle: () => void; +}; + +export const DataTableDragToggleColumnsProvider = (props: DataTableDragToggleColumnsProviderProps) => { + const { + children, + columnsOrder, + setColumnsOrder, + columnsToggle, + setColumnsToggle, + + resetColumnsOrder, + resetColumnsToggle, + } = props; + + const [sourceColumn, setSourceColumn] = useState(''); + + const [targetColumn, setTargetColumn] = useState(''); + + const swapColumns = () => { + if (!columnsOrder || !setColumnsOrder || !sourceColumn || !targetColumn) { + return; + } + const sourceIndex = columnsOrder.indexOf(sourceColumn); + const targetIndex = columnsOrder.indexOf(targetColumn); + + if (sourceIndex !== -1 && targetIndex !== -1) { + const removedColumn = columnsOrder.splice(sourceIndex, 1)[0]; + + columnsOrder.splice(targetIndex, 0, removedColumn); + + // update the columns order + setColumnsOrder([...columnsOrder]); + } + }; + + return ( + + {children} + + ); +}; diff --git a/package/DataTableHeader.tsx b/package/DataTableHeader.tsx index 174350c..3eeee05 100644 --- a/package/DataTableHeader.tsx +++ b/package/DataTableHeader.tsx @@ -88,6 +88,8 @@ export default forwardRef(function DataTableHeader( width, title, sortable, + draggable, + toggleable, titleClassName, titleStyle, titleSx, @@ -107,6 +109,8 @@ export default forwardRef(function DataTableHeader( width={width} title={title} sortable={sortable} + draggable={draggable} + toggleable={toggleable} sortStatus={sortStatus} sortIcons={sortIcons} onSortStatusChange={onSortStatusChange} diff --git a/package/DataTableHeaderCell.tsx b/package/DataTableHeaderCell.tsx index 3da4f7c..9144567 100644 --- a/package/DataTableHeaderCell.tsx +++ b/package/DataTableHeaderCell.tsx @@ -1,7 +1,22 @@ -import { Box, Center, Group, createStyles, type MantineTheme, type Sx } from '@mantine/core'; -import { IconArrowUp, IconArrowsVertical } from '@tabler/icons-react'; -import type { BaseSyntheticEvent, CSSProperties, ReactNode } from 'react'; +import { + ActionIcon, + Box, + Center, + Checkbox, + Flex, + Group, + Popover, + Stack, + createStyles, + getStylesRef, + type MantineTheme, + type Sx, +} from '@mantine/core'; +import { IconArrowUp, IconArrowsVertical, IconGripVertical, IconX } from '@tabler/icons-react'; +import { useState, type BaseSyntheticEvent, type CSSProperties, type ReactNode } from 'react'; +import { useDataTableDragToggleColumnsContext } from './DataTableDragToggleColumns.context'; import DataTableHeaderCellFilter from './DataTableHeaderCellFilter'; +import { DataTableColumnToggle } from './hooks'; import type { DataTableColumn, DataTableSortProps } from './types'; import { humanize, useMediaQueryStringOrFunction } from './utils'; @@ -13,6 +28,36 @@ const useStyles = createStyles((theme) => ({ background: theme.colorScheme === 'dark' ? theme.colors.dark[6] : theme.colors.gray[0], }, }, + draggableColumnHeader: { + cursor: 'grab', + borderRadius: 6, + transition: 'all 0.2s', + '&:active': { + cursor: 'grabbing', + }, + '&:hover:not(:has(button:hover))': { + background: theme.colorScheme === 'dark' ? theme.colors.dark[6] : theme.colors.gray[2], + }, + }, + draggableColumnHeaderIcon: { + cursor: 'inherit', + margin: '-2px 2px 0', + }, + draggableColumnHeaderOver: { + background: theme.colorScheme === 'dark' ? theme.colors.dark[6] : theme.colors.gray[2], + }, + toggleableColumnHeaderIcon: { + ref: getStylesRef('toggleableColumnHeaderIcon'), + transition: 'opacity 0.2s', + opacity: '0.1', + }, + toggleableColumnHeader: { + '&:hover': { + [`& .${getStylesRef('toggleableColumnHeaderIcon')}`]: { + opacity: 1, + }, + }, + }, sortableColumnHeaderGroup: { gap: '0.25em', }, @@ -49,7 +94,10 @@ type DataTableHeaderCellProps = { sortStatus: DataTableSortProps['sortStatus']; sortIcons: DataTableSortProps['sortIcons']; onSortStatusChange: DataTableSortProps['onSortStatusChange']; -} & Pick, 'accessor' | 'sortable' | 'textAlignment' | 'width' | 'filter' | 'filtering'>; +} & Pick< + DataTableColumn, + 'accessor' | 'sortable' | 'draggable' | 'toggleable' | 'textAlignment' | 'width' | 'filter' | 'filtering' +>; export default function DataTableHeaderCell({ className, @@ -59,6 +107,8 @@ export default function DataTableHeaderCell({ visibleMediaQuery, title, sortable, + draggable, + toggleable, sortIcons, textAlignment, width, @@ -67,10 +117,21 @@ export default function DataTableHeaderCell({ filter, filtering, }: DataTableHeaderCellProps) { + const { setSourceColumn, setTargetColumn, swapColumns, columnsToggle, setColumnsToggle } = + useDataTableDragToggleColumnsContext(); + + const [dragOver, setDragOver] = useState(false); + + const [columnsPopoverOpened, setColumnsPopoverOpened] = useState(false); + const { cx, classes } = useStyles(); + if (!useMediaQueryStringOrFunction(visibleMediaQuery)) return null; + const text = title ?? humanize(accessor); + const tooltip = typeof text === 'string' ? text : undefined; + const sortAction = sortable && onSortStatusChange ? (e?: BaseSyntheticEvent) => { @@ -87,10 +148,56 @@ export default function DataTableHeaderCell({ }); } : undefined; + + const handleColumnDragStart = (e: React.DragEvent) => { + e.stopPropagation(); + setSourceColumn(accessor as string); + setDragOver(false); + }; + + const handleColumnDragOver = (e: React.DragEvent) => { + e.preventDefault(); + setTargetColumn(accessor as string); + setDragOver(true); + }; + + const handleColumnDrop = () => { + setTargetColumn(accessor as string); + setDragOver(false); + swapColumns(); + }; + + const handleColumnDragEnter = () => { + setDragOver(true); + }; + + const handleColumnDragLeave = () => { + setDragOver(false); + }; + + const handleColumnToggle = (e: React.MouseEvent) => { + e.stopPropagation(); + + setColumnsToggle((columnsToggle) => + columnsToggle.map((c) => { + if (c.accessor === accessor) { + return { ...c, toggled: false }; + } + return c; + }) + ); + }; + return ( ({ role={sortable ? 'button' : undefined} tabIndex={sortable ? 0 : undefined} onClick={sortAction} + onContextMenu={(e) => { + if (toggleable) { + e.preventDefault(); + setColumnsPopoverOpened(true); + } + }} onKeyDown={(e) => e.key === 'Enter' && sortAction?.()} > - - {text} - + + + + {draggable ? ( +
+ ) => { + e.stopPropagation(); + }} + > + + +
+ ) : null} + + + {text} + +
+
+ + + {columnsToggle + .filter((column) => column.toggleable) + .map((column: DataTableColumnToggle) => { + return ( + + { + setColumnsToggle( + columnsToggle.map((c: DataTableColumnToggle) => { + if (c.accessor === column.accessor) { + return { ...c, toggled: e.currentTarget.checked }; + } + return c; + }) + ); + }} + /> + + ); + })} + + +
+ {toggleable ? ( +
+ + + +
+ ) : null} + {sortable || sortStatus?.columnAccessor === accessor ? ( <> {sortStatus?.columnAccessor === accessor ? ( diff --git a/package/hooks.ts b/package/hooks.ts index a8dce25..b17582d 100644 --- a/package/hooks.ts +++ b/package/hooks.ts @@ -1,6 +1,6 @@ -import { useResizeObserver, useTimeout } from '@mantine/hooks'; -import { useEffect, useState, type Key } from 'react'; -import type { DataTableRowExpansionProps } from './types'; +import { useLocalStorage, useResizeObserver, useTimeout } from '@mantine/hooks'; +import { useEffect, useMemo, useState, type Key } from 'react'; +import type { DataTableColumn, DataTableRowExpansionProps } from './types'; import { getRecordId } from './utils'; export function useLastSelectionChangeIndex(recordIds: unknown[] | undefined) { @@ -106,3 +106,81 @@ export function useElementOuterSize() { const { width, height } = ref.current?.getBoundingClientRect() || { width: 0, height: 0 }; return { ref, width, height }; } + +export type DataTableColumnToggle = { + accessor: string | undefined; + defaultToggle: boolean; + toggleable: boolean; + toggled: boolean; +}; + +export const useDragToggleColumns = ({ + key, + columns = [], +}: { + key: string | undefined; + columns: DataTableColumn[]; +}) => { + // Default columns id ordered is the order of the columns in the array + const defaultColumnsOrder = (columns && columns.map((column) => column.accessor)) || []; + + // Default columns id toggled is the array of columns which have the toggleable property set to true + const defaultColumnsToggle = + columns && + columns.map((column) => ({ + accessor: column.accessor, + defaultToggle: column.defaultToggle || true, + toggleable: column.toggleable, + toggled: column.defaultToggle || true, + })); + + // Store the columns order in localStorage + const [columnsOrder, setColumnsOrder] = useLocalStorage({ + key: `${key}-columns-order`, + defaultValue: defaultColumnsOrder as string[], + getInitialValueInEffect: true, + }); + + // Store the columns toggle in localStorage + const [columnsToggle, setColumnsToggle] = useLocalStorage({ + key: `${key}-columns-toggle`, + defaultValue: defaultColumnsToggle as DataTableColumnToggle[], + getInitialValueInEffect: true, + }); + + // we won't use the "remove" function from useLocalStorage() because + // we got issue with rendering + const resetColumnsOrder = () => setColumnsOrder(defaultColumnsOrder as string[]); + + const resetColumnsToggle = () => setColumnsToggle(defaultColumnsToggle as DataTableColumnToggle[]); + + const effectiveColumns = useMemo(() => { + if (!columnsOrder) { + return columns; + } + + const result = columnsOrder + .map((order) => columns.find((column) => column.accessor === order)) + .filter((column) => { + return columnsToggle.find((toggle) => { + return toggle.accessor === column?.accessor; + })?.toggled; + }); + + return result; + }, [columns, columnsOrder, columnsToggle]); + + return { + effectiveColumns: effectiveColumns as DataTableColumn[], + + // Order handling + setColumnsOrder, + columnsOrder: columnsOrder as string[], + resetColumnsOrder, + + // Toggle handling + columnsToggle: columnsToggle as DataTableColumnToggle[], + setColumnsToggle, + resetColumnsToggle, + } as const; +}; diff --git a/package/index.ts b/package/index.ts index 8bbc378..d735eb1 100644 --- a/package/index.ts +++ b/package/index.ts @@ -1,3 +1,4 @@ export { default as DataTable } from './DataTable'; +export { useDragToggleColumns } from './hooks'; export * from './types'; export { differenceBy, getValueAtPath, humanize, uniqBy } from './utils'; diff --git a/package/types/DataTableColumn.ts b/package/types/DataTableColumn.ts index 9d67b8c..4543d15 100644 --- a/package/types/DataTableColumn.ts +++ b/package/types/DataTableColumn.ts @@ -31,13 +31,28 @@ export type DataTableColumn = { */ sortable?: boolean; + /** + * If set to true, the column can be dragged. + */ + draggable?: boolean; + + /** + * If set to true, the column can be toggled. + */ + toggleable?: boolean; + + /** + * If set to true, the column will be toggled by default. + */ + defaultToggle?: boolean; + /** * Optional node providing the user with filtering options. * If present, a filter button will be added to the column's header. Upon clicking that button, * a pop-over showing the provided node will be opened. * * Alternatively, a function returning a node can be provided. The function receives props with a `close` - * method which allows programatically closing the pop-over. + * method which allows programmatically closing the pop-over. * * ```tsx * // … diff --git a/package/types/DataTableProps.ts b/package/types/DataTableProps.ts index bedb227..52929bd 100644 --- a/package/types/DataTableProps.ts +++ b/package/types/DataTableProps.ts @@ -74,6 +74,12 @@ export type DataTableProps = { */ defaultColumnProps?: DataTableDefaultColumnProps; + /** + * If you want to use drag and drop as well as toggle to reorder and toggle columns + * provide a unique key which will be used to store the column order in localStorage. + */ + storeColumnsKey?: string | undefined; + /** * A default render function for all columns; accepts the current record, its index in `records` * and the column accessor From cdd5fb4aa23779341cf8cf5ba6ed570081a79ddc Mon Sep 17 00:00:00 2001 From: Giovambattista Fazioli Date: Mon, 18 Dec 2023 16:21:57 +0100 Subject: [PATCH 2/7] feat: adds resizing columns --- docs/config.ts | 5 + docs/examples/ResizingComplexExample.tsx | 68 +++ docs/examples/ResizingExample.tsx | 52 ++ docs/pages/examples/resizing.tsx | 67 +++ package/DataTable.tsx | 479 +++++++++--------- package/DataTableDragToggleColumns.context.ts | 3 + .../DataTableDragToggleColumnsProvider.tsx | 8 + package/DataTableHeader.tsx | 6 +- package/DataTableHeaderCell.tsx | 30 +- package/DataTableResizableHeaderKnob.tsx | 101 ++++ package/hooks.ts | 47 +- package/types/DataTableColumn.ts | 5 + 12 files changed, 635 insertions(+), 236 deletions(-) create mode 100644 docs/examples/ResizingComplexExample.tsx create mode 100644 docs/examples/ResizingExample.tsx create mode 100644 docs/pages/examples/resizing.tsx create mode 100644 package/DataTableResizableHeaderKnob.tsx diff --git a/docs/config.ts b/docs/config.ts index b9f9b00..69105cc 100644 --- a/docs/config.ts +++ b/docs/config.ts @@ -131,6 +131,11 @@ export const PAGES: ({ external?: true; title: string; color?: MantineColor; des title: 'Dragging & Toggling', description: `Example: dragging & toggling columns with Mantine DataTable`, }, + { + path: 'resizing', + title: 'Column resizing', + description: `Example: resizing Mantine DataTable columns`, + }, { path: 'infinite-scrolling', title: 'Implementing infinite scrolling', diff --git a/docs/examples/ResizingComplexExample.tsx b/docs/examples/ResizingComplexExample.tsx new file mode 100644 index 0000000..d141f1e --- /dev/null +++ b/docs/examples/ResizingComplexExample.tsx @@ -0,0 +1,68 @@ +import { Button, Group, Stack, Switch } from '@mantine/core'; +import { DataTable, useDragToggleColumns } from 'mantine-datatable'; +import { useState } from 'react'; +import { companies, type Company } from '~/data'; + +export default function ResizingComplexExample() { + const key = 'resize-complex-example'; + + const [withTableBorder, setWithTableBorder] = useState(true); + + const [withColumnBorders, setWithColumnBorders] = useState(true); + + const props = { + resizable: true, + sortable: true, + toggleable: true, + draggable: true, + }; + + const { effectiveColumns, resetColumnsWidth, resetColumnsOrder, resetColumnsToggle } = useDragToggleColumns({ + key, + columns: [ + { accessor: 'name', ...props }, + { accessor: 'streetAddress', ...props }, + { accessor: 'city', ...props }, + { accessor: 'state', ...props }, + ], + }); + + return ( + + + + + setWithTableBorder(event.currentTarget.checked)} + labelPosition="left" + label="Table Border" + /> + setWithColumnBorders(event.currentTarget.checked)} + labelPosition="left" + label="Column Borders" + /> + + + + + + + + + ); +} diff --git a/docs/examples/ResizingExample.tsx b/docs/examples/ResizingExample.tsx new file mode 100644 index 0000000..bf1d863 --- /dev/null +++ b/docs/examples/ResizingExample.tsx @@ -0,0 +1,52 @@ +import { Button, Group, Stack, Switch } from '@mantine/core'; +import { DataTable, useDragToggleColumns } from 'mantine-datatable'; +import { useState } from 'react'; +import { companies, type Company } from '~/data'; + +export default function ResizingExample() { + const key = 'resize-example'; + + const [withTableBorder, setWithTableBorder] = useState(true); + const [withColumnBorders, setWithColumnBorders] = useState(true); + + const { effectiveColumns, resetColumnsWidth } = useDragToggleColumns({ + key, + columns: [ + { accessor: 'name', width: 100, resizable: true }, + { accessor: 'streetAddress', resizable: true }, + { accessor: 'city', resizable: true }, + { accessor: 'state' }, + ], + }); + + return ( + + + + + setWithTableBorder(event.currentTarget.checked)} + labelPosition="left" + label="Table Border" + /> + setWithColumnBorders(event.currentTarget.checked)} + labelPosition="left" + label="Column Borders" + /> + + + + + + + ); +} diff --git a/docs/pages/examples/resizing.tsx b/docs/pages/examples/resizing.tsx new file mode 100644 index 0000000..640e902 --- /dev/null +++ b/docs/pages/examples/resizing.tsx @@ -0,0 +1,67 @@ +import { Code, Container } from '@mantine/core'; +import { GetStaticProps, InferGetStaticPropsType } from 'next'; +import CodeBlock from '~/components/CodeBlock'; +import PageNavigation from '~/components/PageNavigation'; +import PageSubtitle from '~/components/PageSubtitle'; +import PageText from '~/components/PageText'; +import PageTitle from '~/components/PageTitle'; +import ResizingComplexExample from '~/examples/ResizingComplexExample'; +import ResizingExample from '~/examples/ResizingExample'; +import allPromiseProps from '~/lib/allPromiseProps'; +import readCodeExample from '~/lib/readCodeExample'; + +const PATH = 'examples/resizing'; + +export const getStaticProps: GetStaticProps<{ + code: Record<'default' | 'complex', string>; +}> = async () => ({ + props: { + code: await allPromiseProps({ + default: readCodeExample('examples/ResizingExample.tsx') as Promise, + complex: readCodeExample('examples/ResizingComplexExample.tsx') as Promise, + }), + }, +}); + +export default function Page({ code }: InferGetStaticPropsType) { + return ( + + + + + In order to enable column resizing you’ll have to: +
    +
  • + add a storeColumnsKey: your_key property to the DataTable (since the order of the columns is + persisted in the local storage); +
  • +
  • + add a resizable: true property to each resizing candidate column; +
  • +
  • + use useDragToggleColumns() hook to get the effective columns. +
  • +
+
+ + + + The default width of the columns is the width in which they are defined in the columns{' '} + prop. + + + + Of course, you can reset the column width to the default value by using the resetColumnsWidth(){' '} + function. +
+ You may also set up the column with to initial by double-clicking on the resize handle. +
+ + + + + + +
+ ); +} diff --git a/package/DataTable.tsx b/package/DataTable.tsx index 11346ab..df15d5b 100644 --- a/package/DataTable.tsx +++ b/package/DataTable.tsx @@ -1,4 +1,14 @@ -import { Box, MantineSize, Portal, Table, createStyles, packSx, px, type MantineTheme } from '@mantine/core'; +import { + Box, + MantineSize, + Portal, + Table, + createStyles, + getStylesRef, + packSx, + px, + type MantineTheme, +} from '@mantine/core'; import { useMergedRef } from '@mantine/hooks'; import { useCallback, @@ -81,6 +91,11 @@ const useStyles = createStyles( tableWithBorder: { border: `1px solid ${borderColorValue}`, }, + resizableColumnHeaderKnobTransparent: { + [`& .${getStylesRef('resizableColumnHeaderKnob')}`]: { + background: 'transparent', + }, + }, tableWithColumnBorders: { '&&': { 'th, td': { @@ -363,49 +378,57 @@ export default function DataTable({ const styleProperties = typeof styles === 'function' ? styles(theme, EMPTY_OBJECT, EMPTY_OBJECT) : styles; return ( - ({ - borderRadius: theme.radius[borderRadius as MantineSize] || borderRadius, - boxShadow: theme.shadows[shadow as MantineSize] || shadow, - height, - minHeight, - }), - ...packSx(sx), - ]} - style={{ ...styleProperties?.root, ...style } as CSSProperties} - > - + ({ + borderRadius: theme.radius[borderRadius as MantineSize] || borderRadius, + boxShadow: theme.shadows[shadow as MantineSize] || shadow, + height, + minHeight, + }), + ...packSx(sx), + ]} + style={{ ...styleProperties?.root, ...style } as CSSProperties} > - - {withoutHeader ? null : ( - +
+ {withoutHeader ? null : ( ref={headerRef} className={classNames?.header} @@ -423,201 +446,201 @@ export default function DataTable({ selectionCheckboxProps={allRecordsSelectionCheckboxProps} leftShadowVisible={selectionVisibleAndNotScrolledToLeft} /> - - )} - - {recordsLength ? ( - records.map((record, recordIndex) => { - const recordId = getRecordId(record, idAccessor); - const isSelected = selectedRecordIds?.includes(recordId) || false; + )} + + {recordsLength ? ( + records.map((record, recordIndex) => { + const recordId = getRecordId(record, idAccessor); + const isSelected = selectedRecordIds?.includes(recordId) || false; - let showContextMenuOnClick = false; - let showContextMenuOnRightClick = false; - if (rowContextMenu) { - const { hidden } = rowContextMenu; - if (!hidden || !(typeof hidden === 'function' ? hidden(record, recordIndex) : hidden)) { - if (rowContextMenu.trigger === 'click') { - showContextMenuOnClick = true; - } else { - showContextMenuOnRightClick = true; + let showContextMenuOnClick = false; + let showContextMenuOnRightClick = false; + if (rowContextMenu) { + const { hidden } = rowContextMenu; + if (!hidden || !(typeof hidden === 'function' ? hidden(record, recordIndex) : hidden)) { + if (rowContextMenu.trigger === 'click') { + showContextMenuOnClick = true; + } else { + showContextMenuOnRightClick = true; + } } } - } - let handleSelectionChange: ChangeEventHandler | undefined; - if (onSelectedRecordsChange && selectedRecords) { - handleSelectionChange = (e) => { - if ((e.nativeEvent as PointerEvent).shiftKey && lastSelectionChangeIndex !== null) { - const targetRecords = records.filter( - recordIndex > lastSelectionChangeIndex - ? (r, index) => - index >= lastSelectionChangeIndex && - index <= recordIndex && - (isRecordSelectable ? isRecordSelectable(r, index) : true) - : (r, index) => - index >= recordIndex && - index <= lastSelectionChangeIndex && - (isRecordSelectable ? isRecordSelectable(r, index) : true) - ); - onSelectedRecordsChange( - isSelected - ? differenceBy(selectedRecords, targetRecords, (r) => getRecordId(r, idAccessor)) - : uniqBy([...selectedRecords, ...targetRecords], (r) => getRecordId(r, idAccessor)) - ); - } else { - onSelectedRecordsChange( - isSelected - ? selectedRecords.filter((record) => getRecordId(record, idAccessor) !== recordId) - : uniqBy([...selectedRecords, record], (record) => getRecordId(record, idAccessor)) - ); - } - setLastSelectionChangeIndex(recordIndex); - }; - } + let handleSelectionChange: ChangeEventHandler | undefined; + if (onSelectedRecordsChange && selectedRecords) { + handleSelectionChange = (e) => { + if ((e.nativeEvent as PointerEvent).shiftKey && lastSelectionChangeIndex !== null) { + const targetRecords = records.filter( + recordIndex > lastSelectionChangeIndex + ? (r, index) => + index >= lastSelectionChangeIndex && + index <= recordIndex && + (isRecordSelectable ? isRecordSelectable(r, index) : true) + : (r, index) => + index >= recordIndex && + index <= lastSelectionChangeIndex && + (isRecordSelectable ? isRecordSelectable(r, index) : true) + ); + onSelectedRecordsChange( + isSelected + ? differenceBy(selectedRecords, targetRecords, (r) => getRecordId(r, idAccessor)) + : uniqBy([...selectedRecords, ...targetRecords], (r) => getRecordId(r, idAccessor)) + ); + } else { + onSelectedRecordsChange( + isSelected + ? selectedRecords.filter((record) => getRecordId(record, idAccessor) !== recordId) + : uniqBy([...selectedRecords, record], (record) => getRecordId(record, idAccessor)) + ); + } + setLastSelectionChangeIndex(recordIndex); + }; + } - let handleClick: MouseEventHandler | undefined; - if (showContextMenuOnClick) { - handleClick = (e) => { - setRowContextMenuInfo({ y: e.clientY, x: e.clientX, record, recordIndex }); - onRowClick?.(record, recordIndex, e); - }; - } else if (onRowClick) { - handleClick = (e) => { - onRowClick(record, recordIndex, e); - }; - } + let handleClick: MouseEventHandler | undefined; + if (showContextMenuOnClick) { + handleClick = (e) => { + setRowContextMenuInfo({ y: e.clientY, x: e.clientX, record, recordIndex }); + onRowClick?.(record, recordIndex, e); + }; + } else if (onRowClick) { + handleClick = (e) => { + onRowClick(record, recordIndex, e); + }; + } - let handleContextMenu: MouseEventHandler | undefined; - if (showContextMenuOnRightClick) { - handleContextMenu = (e) => { - e.preventDefault(); - setRowContextMenuInfo({ y: e.clientY, x: e.clientX, record, recordIndex }); - }; - } + let handleContextMenu: MouseEventHandler | undefined; + if (showContextMenuOnRightClick) { + handleContextMenu = (e) => { + e.preventDefault(); + setRowContextMenuInfo({ y: e.clientY, x: e.clientX, record, recordIndex }); + }; + } - return ( - - key={recordId as Key} - record={record} - recordIndex={recordIndex} - columns={effectiveColumns} - defaultColumnProps={defaultColumnProps} - defaultColumnRender={defaultColumnRender} - selectionVisible={selectionColumnVisible} - selectionChecked={isSelected} - onSelectionChange={handleSelectionChange} - isRecordSelectable={isRecordSelectable} - getSelectionCheckboxProps={getRecordSelectionCheckboxProps} - onClick={handleClick} - onCellClick={onCellClick} - onContextMenu={handleContextMenu} - contextMenuVisible={ - rowContextMenuInfo ? getRecordId(rowContextMenuInfo.record, idAccessor) === recordId : false - } - expansion={rowExpansionInfo} - className={rowClassName} - style={rowStyle} - sx={rowSx} - customAttributes={customRowAttributes} - leftShadowVisible={selectionVisibleAndNotScrolledToLeft} - /> - ); - }) - ) : ( - + return ( + + key={recordId as Key} + record={record} + recordIndex={recordIndex} + columns={effectiveColumns} + defaultColumnProps={defaultColumnProps} + defaultColumnRender={defaultColumnRender} + selectionVisible={selectionColumnVisible} + selectionChecked={isSelected} + onSelectionChange={handleSelectionChange} + isRecordSelectable={isRecordSelectable} + getSelectionCheckboxProps={getRecordSelectionCheckboxProps} + onClick={handleClick} + onCellClick={onCellClick} + onContextMenu={handleContextMenu} + contextMenuVisible={ + rowContextMenuInfo ? getRecordId(rowContextMenuInfo.record, idAccessor) === recordId : false + } + expansion={rowExpansionInfo} + className={rowClassName} + style={rowStyle} + sx={rowSx} + customAttributes={customRowAttributes} + leftShadowVisible={selectionVisibleAndNotScrolledToLeft} + /> + ); + }) + ) : ( + + )} + + {effectiveColumns.some(({ footer }) => footer) && ( + + ref={footerRef} + className={classNames?.footer} + style={styleProperties?.footer} + borderColor={borderColor} + columns={effectiveColumns} + defaultColumnProps={defaultColumnProps} + selectionVisible={selectionColumnVisible} + leftShadowVisible={selectionVisibleAndNotScrolledToLeft} + scrollDiff={tableHeight - scrollViewportHeight} + /> )} - - {effectiveColumns.some(({ footer }) => footer) && ( - - ref={footerRef} - className={classNames?.footer} - style={styleProperties?.footer} - borderColor={borderColor} - columns={effectiveColumns} - defaultColumnProps={defaultColumnProps} - selectionVisible={selectionColumnVisible} - leftShadowVisible={selectionVisibleAndNotScrolledToLeft} - scrollDiff={tableHeight - scrollViewportHeight} - /> - )} -
-
- {page && ( - + + {page && ( + + )} + - )} - - - {emptyState} - - {rowContextMenu && rowContextMenuInfo && ( - - setRowContextMenuInfo(null)} - > - {rowContextMenu - .items(rowContextMenuInfo.record, rowContextMenuInfo.recordIndex) - .map(({ divider, key, title, icon, color, hidden, disabled, onClick }) => - divider ? ( - - ) : hidden ? null : ( - { - setRowContextMenuInfo(null); - onClick(); - }} - /> - ) - )} - - - )} -
+ + {emptyState} + + {rowContextMenu && rowContextMenuInfo && ( + + setRowContextMenuInfo(null)} + > + {rowContextMenu + .items(rowContextMenuInfo.record, rowContextMenuInfo.recordIndex) + .map(({ divider, key, title, icon, color, hidden, disabled, onClick }) => + divider ? ( + + ) : hidden ? null : ( + { + setRowContextMenuInfo(null); + onClick(); + }} + /> + ) + )} + + + )} +
+ ); } diff --git a/package/DataTableDragToggleColumns.context.ts b/package/DataTableDragToggleColumns.context.ts index 05b9069..69ef998 100644 --- a/package/DataTableDragToggleColumns.context.ts +++ b/package/DataTableDragToggleColumns.context.ts @@ -20,6 +20,9 @@ interface DataTableDragToggleColumnsContext { columnsToggle: DataTableColumnToggle[]; setColumnsToggle: Dispatch>; resetColumnsToggle: () => void; + + setColumnWidth: (accessor: string, width: string | number) => void; + resetColumnsWidth: () => void; } export const [DataTableDragToggleColumnsContextProvider, useDataTableDragToggleColumnsContext] = diff --git a/package/DataTableDragToggleColumnsProvider.tsx b/package/DataTableDragToggleColumnsProvider.tsx index f635a97..780808f 100644 --- a/package/DataTableDragToggleColumnsProvider.tsx +++ b/package/DataTableDragToggleColumnsProvider.tsx @@ -13,6 +13,9 @@ type DataTableDragToggleColumnsProviderProps = { columnsToggle: DataTableColumnToggle[]; setColumnsToggle: Dispatch>; resetColumnsToggle: () => void; + + setColumnWidth: (accessor: string, width: string | number) => void; + resetColumnsWidth: () => void; }; export const DataTableDragToggleColumnsProvider = (props: DataTableDragToggleColumnsProviderProps) => { @@ -25,6 +28,9 @@ export const DataTableDragToggleColumnsProvider = (props: DataTableDragToggleCol resetColumnsOrder, resetColumnsToggle, + + setColumnWidth, + resetColumnsWidth, } = props; const [sourceColumn, setSourceColumn] = useState(''); @@ -60,6 +66,8 @@ export const DataTableDragToggleColumnsProvider = (props: DataTableDragToggleCol swapColumns, resetColumnsOrder, resetColumnsToggle, + setColumnWidth, + resetColumnsWidth, }} > {children} diff --git a/package/DataTableHeader.tsx b/package/DataTableHeader.tsx index 3eeee05..aa3eb87 100644 --- a/package/DataTableHeader.tsx +++ b/package/DataTableHeader.tsx @@ -78,7 +78,7 @@ export default forwardRef(function DataTableHeader( )} {!groups && allRecordsSelectorCell} - {columns.map(({ hidden, ...columnProps }) => { + {columns.map(({ hidden, ...columnProps }, index) => { if (hidden) return null; const { @@ -90,6 +90,7 @@ export default forwardRef(function DataTableHeader( sortable, draggable, toggleable, + resizable, titleClassName, titleStyle, titleSx, @@ -110,6 +111,9 @@ export default forwardRef(function DataTableHeader( title={title} sortable={sortable} draggable={draggable} + // we won't display the resize handle for the last column + // to avoid overflow render issues + resizable={resizable && index < columns.length - 1} toggleable={toggleable} sortStatus={sortStatus} sortIcons={sortIcons} diff --git a/package/DataTableHeaderCell.tsx b/package/DataTableHeaderCell.tsx index 9144567..304e815 100644 --- a/package/DataTableHeaderCell.tsx +++ b/package/DataTableHeaderCell.tsx @@ -13,9 +13,10 @@ import { type Sx, } from '@mantine/core'; import { IconArrowUp, IconArrowsVertical, IconGripVertical, IconX } from '@tabler/icons-react'; -import { useState, type BaseSyntheticEvent, type CSSProperties, type ReactNode } from 'react'; +import { useRef, useState, type BaseSyntheticEvent, type CSSProperties, type ReactNode } from 'react'; import { useDataTableDragToggleColumnsContext } from './DataTableDragToggleColumns.context'; import DataTableHeaderCellFilter from './DataTableHeaderCellFilter'; +import { DataTableResizableHeaderKnob } from './DataTableResizableHeaderKnob'; import { DataTableColumnToggle } from './hooks'; import type { DataTableColumn, DataTableSortProps } from './types'; import { humanize, useMediaQueryStringOrFunction } from './utils'; @@ -58,6 +59,12 @@ const useStyles = createStyles((theme) => ({ }, }, }, + resizableColumnHeader: { + position: 'relative', + }, + resizableColumnHeaderKnob: { + position: 'relative', + }, sortableColumnHeaderGroup: { gap: '0.25em', }, @@ -96,7 +103,15 @@ type DataTableHeaderCellProps = { onSortStatusChange: DataTableSortProps['onSortStatusChange']; } & Pick< DataTableColumn, - 'accessor' | 'sortable' | 'draggable' | 'toggleable' | 'textAlignment' | 'width' | 'filter' | 'filtering' + | 'accessor' + | 'sortable' + | 'draggable' + | 'toggleable' + | 'resizable' + | 'textAlignment' + | 'width' + | 'filter' + | 'filtering' >; export default function DataTableHeaderCell({ @@ -109,6 +124,7 @@ export default function DataTableHeaderCell({ sortable, draggable, toggleable, + resizable, sortIcons, textAlignment, width, @@ -122,6 +138,8 @@ export default function DataTableHeaderCell({ const [dragOver, setDragOver] = useState(false); + const columnRef = useRef(null); + const [columnsPopoverOpened, setColumnsPopoverOpened] = useState(false); const { cx, classes } = useStyles(); @@ -195,15 +213,15 @@ export default function DataTableHeaderCell({ { [classes.sortableColumnHeader]: sortable, [classes.toggleableColumnHeader]: toggleable, + [classes.resizableColumnHeader]: resizable, }, className )} sx={[ { '&&': { textAlign: textAlignment }, - width, - minWidth: width, - maxWidth: width, + width: `${width} !important`, + ...(!resizable ? { minWidth: width, maxWidth: width } : { minWidth: '1px' }), }, sx, ]} @@ -218,6 +236,7 @@ export default function DataTableHeaderCell({ } }} onKeyDown={(e) => e.key === 'Enter' && sortAction?.()} + ref={columnRef} > ({ ) : null} {filter ? {filter} : null} + {resizable ? : null} ); } diff --git a/package/DataTableResizableHeaderKnob.tsx b/package/DataTableResizableHeaderKnob.tsx new file mode 100644 index 0000000..485e04a --- /dev/null +++ b/package/DataTableResizableHeaderKnob.tsx @@ -0,0 +1,101 @@ +import { createStyles, getStylesRef } from '@mantine/core'; +import { MutableRefObject, useRef, useState } from 'react'; +import { useDataTableDragToggleColumnsContext } from './DataTableDragToggleColumns.context'; + +type DataTableResizableHeaderCellProps = { + accessor: string; + columnRef: MutableRefObject; +}; + +const useStyles = createStyles((theme) => ({ + resizableColumnHeaderKnob: { + ref: getStylesRef('resizableColumnHeaderKnob'), + position: 'absolute', + cursor: 'col-resize', + top: '1px', + bottom: '1px', + width: '2px', + zIndex: 1, + backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[6] : theme.colors.gray[3], + }, +})); + +export const DataTableResizableHeaderKnob = (props: DataTableResizableHeaderCellProps) => { + const { accessor, columnRef } = props; + + const { classes } = useStyles(); + + const dragRef = useRef(null); + + const [deltaX, setDeltaX] = useState(0); + + const { setColumnWidth } = useDataTableDragToggleColumnsContext(); + + const handleDragStart = (event: React.DragEvent) => { + event.preventDefault(); + event.stopPropagation(); + + document.addEventListener('mousemove', handleMouseMove); + document.addEventListener('mouseup', handleMouseUp); + + document.body.style.cursor = 'col-resize'; + }; + + const handleMouseMove = (event: MouseEvent) => { + if (!columnRef.current) return; + + const delta = event.clientX - columnRef.current.getBoundingClientRect().right; + + const width = columnRef.current.getBoundingClientRect().width + delta; + + const widthString = `${width}px`; + + columnRef.current.style.width = widthString; + + // we have to set (store) the width in the context and in the + // local storage, otherwise the resizing won't work for small sizes + setColumnWidth(accessor, columnRef.current.style.width as string); + + setDeltaX(-delta); + }; + + const handleMouseUp = () => { + if (!columnRef.current) return; + + document.removeEventListener('mousemove', handleMouseMove); + document.removeEventListener('mouseup', handleMouseUp); + + document.body.style.cursor = 'initial'; + + setColumnWidth(accessor, columnRef.current.style.width as string); + + columnRef.current.style.width = ''; + + setDeltaX(0); + }; + + /** + * Reset the column width to the default value + */ + const handleDoubleClick = () => { + if (!columnRef.current) return; + + columnRef.current.style.maxWidth = 'initial'; + columnRef.current.style.minWidth = 'initial'; + columnRef.current.style.width = 'initial'; + + setColumnWidth(accessor, 'initial'); + }; + + return ( +
+ ); +}; diff --git a/package/hooks.ts b/package/hooks.ts index b17582d..852e218 100644 --- a/package/hooks.ts +++ b/package/hooks.ts @@ -114,6 +114,8 @@ export type DataTableColumnToggle = { toggled: boolean; }; +type DataTableColumnWidth = Record; + export const useDragToggleColumns = ({ key, columns = [], @@ -124,6 +126,10 @@ export const useDragToggleColumns = ({ // Default columns id ordered is the order of the columns in the array const defaultColumnsOrder = (columns && columns.map((column) => column.accessor)) || []; + // create an array of object with key = accessor and value = width + const defaultColumnsWidth = + (columns && columns.map((column) => ({ [column.accessor]: column.width ?? 'auto' }))) || []; + // Default columns id toggled is the array of columns which have the toggleable property set to true const defaultColumnsToggle = columns && @@ -148,12 +154,21 @@ export const useDragToggleColumns = ({ getInitialValueInEffect: true, }); + // Store the columns with in localStorage + const [columnsWidth, setColumnsWidth] = useLocalStorage({ + key: `${key}-columns-width`, + defaultValue: defaultColumnsWidth as DataTableColumnWidth[], + getInitialValueInEffect: true, + }); + // we won't use the "remove" function from useLocalStorage() because // we got issue with rendering const resetColumnsOrder = () => setColumnsOrder(defaultColumnsOrder as string[]); const resetColumnsToggle = () => setColumnsToggle(defaultColumnsToggle as DataTableColumnToggle[]); + const resetColumnsWidth = () => setColumnsWidth(defaultColumnsWidth as DataTableColumnWidth[]); + const effectiveColumns = useMemo(() => { if (!columnsOrder) { return columns; @@ -167,8 +182,30 @@ export const useDragToggleColumns = ({ })?.toggled; }); - return result; - }, [columns, columnsOrder, columnsToggle]); + const newWith = result.map((column) => { + return { + ...column, + width: columnsWidth.find((width) => { + return width[column?.accessor as string]; + })?.[column?.accessor as string], + }; + }); + + return newWith; + }, [columns, columnsOrder, columnsToggle, columnsWidth]); + + const setColumnWidth = (accessor: string, width: string | number) => { + const newColumnsWidth = columnsWidth.map((column) => { + if (!column[accessor]) { + return column; + } + return { + [accessor]: width, + }; + }); + + setColumnsWidth(newColumnsWidth); + }; return { effectiveColumns: effectiveColumns as DataTableColumn[], @@ -182,5 +219,11 @@ export const useDragToggleColumns = ({ columnsToggle: columnsToggle as DataTableColumnToggle[], setColumnsToggle, resetColumnsToggle, + + // Resize handling + columnsWidth, + setColumnsWidth, + setColumnWidth, + resetColumnsWidth, } as const; }; diff --git a/package/types/DataTableColumn.ts b/package/types/DataTableColumn.ts index 4543d15..164f174 100644 --- a/package/types/DataTableColumn.ts +++ b/package/types/DataTableColumn.ts @@ -41,6 +41,11 @@ export type DataTableColumn = { */ toggleable?: boolean; + /** + * If set to true, the column can be resized. + */ + resizable?: boolean; + /** * If set to true, the column will be toggled by default. */ From 2efdb117a5496a488101aaced8332d89743158db Mon Sep 17 00:00:00 2001 From: Ionut-Cristian Florescu Date: Sat, 23 Dec 2023 12:39:29 +0200 Subject: [PATCH 3/7] About the same refactorings & fixes as in V7 --- docs/examples/DraggingExample.tsx | 6 ++-- .../DraggingTogglingComplexExample.tsx | 6 ++-- .../examples/DraggingTogglingResetExample.tsx | 6 ++-- docs/examples/ResizingComplexExample.tsx | 23 +++++++++--- docs/examples/ResizingExample.tsx | 4 +-- docs/examples/TogglingExample.tsx | 4 +-- docs/pages/examples/dragging-toggling.tsx | 4 +-- docs/pages/examples/resizing.tsx | 2 +- package/DataTable.tsx | 4 +-- package/DataTableHeaderCell.tsx | 4 +-- ...tsx => DataTableResizableHeaderHandle.tsx} | 35 ++++++++++++++----- package/hooks.ts | 2 +- package/index.ts | 2 +- 13 files changed, 67 insertions(+), 35 deletions(-) rename package/{DataTableResizableHeaderKnob.tsx => DataTableResizableHeaderHandle.tsx} (73%) diff --git a/docs/examples/DraggingExample.tsx b/docs/examples/DraggingExample.tsx index 8ae4c21..8f15c98 100644 --- a/docs/examples/DraggingExample.tsx +++ b/docs/examples/DraggingExample.tsx @@ -1,4 +1,4 @@ -import { DataTable, useDragToggleColumns } from 'mantine-datatable'; +import { DataTable, useDataTableColumns } from 'mantine-datatable'; import { companies, type Company } from '~/data'; import { Button, Group, Stack } from '@mantine/core'; @@ -6,12 +6,12 @@ import { Button, Group, Stack } from '@mantine/core'; export default function DraggingExample() { const key = 'draggable-example'; - const { effectiveColumns, resetColumnsOrder } = useDragToggleColumns({ + const { effectiveColumns, resetColumnsOrder } = useDataTableColumns({ key, columns: [ { accessor: 'name', width: '40%', draggable: true }, { accessor: 'streetAddress', width: '60%', draggable: true }, - { accessor: 'city', width: 160, draggable: true }, + { accessor: 'city', width: 160, ellipsis: true, draggable: true }, { accessor: 'state' }, ], }); diff --git a/docs/examples/DraggingTogglingComplexExample.tsx b/docs/examples/DraggingTogglingComplexExample.tsx index 6be1521..ffaaac0 100644 --- a/docs/examples/DraggingTogglingComplexExample.tsx +++ b/docs/examples/DraggingTogglingComplexExample.tsx @@ -1,6 +1,6 @@ import { IconColumnRemove, IconColumns1 } from '@tabler/icons-react'; import sortBy from 'lodash/sortBy'; -import { DataTable, DataTableSortStatus, useDragToggleColumns } from 'mantine-datatable'; +import { DataTable, DataTableSortStatus, useDataTableColumns } from 'mantine-datatable'; import { useEffect, useState } from 'react'; import { companies, type Company } from '~/data'; @@ -19,12 +19,12 @@ export default function DraggingTogglingComplexExample() { setRecords(sortStatus.direction === 'desc' ? data.reverse() : data); }, [sortStatus]); - const { effectiveColumns, resetColumnsOrder, resetColumnsToggle } = useDragToggleColumns({ + const { effectiveColumns, resetColumnsOrder, resetColumnsToggle } = useDataTableColumns({ key, columns: [ { accessor: 'name', width: '40%', toggleable: true, draggable: true, sortable: true }, { accessor: 'streetAddress', width: '60%', toggleable: true, draggable: true }, - { accessor: 'city', width: 160, toggleable: true, draggable: true }, + { accessor: 'city', width: 160, ellipsis: true, toggleable: true, draggable: true }, { accessor: 'state' }, ], }); diff --git a/docs/examples/DraggingTogglingResetExample.tsx b/docs/examples/DraggingTogglingResetExample.tsx index b3d1052..386a46c 100644 --- a/docs/examples/DraggingTogglingResetExample.tsx +++ b/docs/examples/DraggingTogglingResetExample.tsx @@ -1,16 +1,16 @@ import { IconColumnRemove, IconColumns1 } from '@tabler/icons-react'; -import { DataTable, useDragToggleColumns } from 'mantine-datatable'; +import { DataTable, useDataTableColumns } from 'mantine-datatable'; import { companies } from '~/data'; export default function DraggingTogglingResetExample() { const key = 'toggleable-reset-example'; - const { effectiveColumns, resetColumnsOrder, resetColumnsToggle } = useDragToggleColumns({ + const { effectiveColumns, resetColumnsOrder, resetColumnsToggle } = useDataTableColumns({ key, columns: [ { accessor: 'name', width: '40%', toggleable: true, draggable: true }, { accessor: 'streetAddress', width: '60%', toggleable: true, draggable: true }, - { accessor: 'city', width: 160, toggleable: true, draggable: true }, + { accessor: 'city', width: 160, ellipsis: true, toggleable: true, draggable: true }, { accessor: 'state' }, ], }); diff --git a/docs/examples/ResizingComplexExample.tsx b/docs/examples/ResizingComplexExample.tsx index d141f1e..c24dd6d 100644 --- a/docs/examples/ResizingComplexExample.tsx +++ b/docs/examples/ResizingComplexExample.tsx @@ -1,6 +1,7 @@ import { Button, Group, Stack, Switch } from '@mantine/core'; -import { DataTable, useDragToggleColumns } from 'mantine-datatable'; -import { useState } from 'react'; +import { sortBy } from 'lodash'; +import { DataTable, DataTableSortStatus, useDataTableColumns } from 'mantine-datatable'; +import { useEffect, useState } from 'react'; import { companies, type Company } from '~/data'; export default function ResizingComplexExample() { @@ -17,7 +18,7 @@ export default function ResizingComplexExample() { draggable: true, }; - const { effectiveColumns, resetColumnsWidth, resetColumnsOrder, resetColumnsToggle } = useDragToggleColumns({ + const { effectiveColumns, resetColumnsWidth, resetColumnsOrder, resetColumnsToggle } = useDataTableColumns({ key, columns: [ { accessor: 'name', ...props }, @@ -27,14 +28,28 @@ export default function ResizingComplexExample() { ], }); + const [sortStatus, setSortStatus] = useState({ + columnAccessor: 'name', + direction: 'asc', + }); + + const [records, setRecords] = useState(sortBy(companies, 'name')); + + useEffect(() => { + const data = sortBy(companies, sortStatus.columnAccessor) as Company[]; + setRecords(sortStatus.direction === 'desc' ? data.reverse() : data); + }, [sortStatus]); + return ( diff --git a/docs/examples/ResizingExample.tsx b/docs/examples/ResizingExample.tsx index bf1d863..833ebc8 100644 --- a/docs/examples/ResizingExample.tsx +++ b/docs/examples/ResizingExample.tsx @@ -1,5 +1,5 @@ import { Button, Group, Stack, Switch } from '@mantine/core'; -import { DataTable, useDragToggleColumns } from 'mantine-datatable'; +import { DataTable, useDataTableColumns } from 'mantine-datatable'; import { useState } from 'react'; import { companies, type Company } from '~/data'; @@ -9,7 +9,7 @@ export default function ResizingExample() { const [withTableBorder, setWithTableBorder] = useState(true); const [withColumnBorders, setWithColumnBorders] = useState(true); - const { effectiveColumns, resetColumnsWidth } = useDragToggleColumns({ + const { effectiveColumns, resetColumnsWidth } = useDataTableColumns({ key, columns: [ { accessor: 'name', width: 100, resizable: true }, diff --git a/docs/examples/TogglingExample.tsx b/docs/examples/TogglingExample.tsx index ae4b61b..0670058 100644 --- a/docs/examples/TogglingExample.tsx +++ b/docs/examples/TogglingExample.tsx @@ -1,11 +1,11 @@ import { Button, Group, Stack } from '@mantine/core'; -import { DataTable, useDragToggleColumns } from 'mantine-datatable'; +import { DataTable, useDataTableColumns } from 'mantine-datatable'; import { companies } from '~/data'; export default function TogglingExample() { const key = 'toggleable-example'; - const { effectiveColumns, resetColumnsToggle } = useDragToggleColumns({ + const { effectiveColumns, resetColumnsToggle } = useDataTableColumns({ key, columns: [ { accessor: 'name', width: '40%', toggleable: true }, diff --git a/docs/pages/examples/dragging-toggling.tsx b/docs/pages/examples/dragging-toggling.tsx index d1f4959..3964a05 100644 --- a/docs/pages/examples/dragging-toggling.tsx +++ b/docs/pages/examples/dragging-toggling.tsx @@ -42,7 +42,7 @@ export default function Page({ code }: InferGetStaticPropsTypedraggable: true property to each Dragging candidate column;
  • - use useDragToggleColumns() hook to get the sorted columns. + use the useDataTableColumns() hook to get the sorted columns.
  • @@ -65,7 +65,7 @@ export default function Page({ code }: InferGetStaticPropsTypetoggleable: true property to each Toggling candidate column;
  • - use useDragToggleColumns() hook to get the sorted columns. + use the useDataTableColumns() hook to get the sorted columns.
  • diff --git a/docs/pages/examples/resizing.tsx b/docs/pages/examples/resizing.tsx index 640e902..db1fe57 100644 --- a/docs/pages/examples/resizing.tsx +++ b/docs/pages/examples/resizing.tsx @@ -39,7 +39,7 @@ export default function Page({ code }: InferGetStaticPropsTyperesizable: true property to each resizing candidate column;
  • - use useDragToggleColumns() hook to get the effective columns. + use the useDataTableColumns() hook to get the effective columns.
  • diff --git a/package/DataTable.tsx b/package/DataTable.tsx index df15d5b..741902b 100644 --- a/package/DataTable.tsx +++ b/package/DataTable.tsx @@ -32,7 +32,7 @@ import DataTableRowMenuDivider from './DataTableRowMenuDivider'; import DataTableRowMenuItem from './DataTableRowMenuItem'; import DataTableScrollArea from './DataTableScrollArea'; import { - useDragToggleColumns, + useDataTableColumns, useElementOuterSize, useLastSelectionChangeIndex, useRowContextMenu, @@ -261,7 +261,7 @@ export default function DataTable({ return groups?.flatMap((group) => group.columns) ?? columns!; }, [columns, groups]); - const dragToggle = useDragToggleColumns({ + const dragToggle = useDataTableColumns({ key: storeColumnsKey, columns: effectiveColumns, }); diff --git a/package/DataTableHeaderCell.tsx b/package/DataTableHeaderCell.tsx index 304e815..ea0239f 100644 --- a/package/DataTableHeaderCell.tsx +++ b/package/DataTableHeaderCell.tsx @@ -16,7 +16,7 @@ import { IconArrowUp, IconArrowsVertical, IconGripVertical, IconX } from '@table import { useRef, useState, type BaseSyntheticEvent, type CSSProperties, type ReactNode } from 'react'; import { useDataTableDragToggleColumnsContext } from './DataTableDragToggleColumns.context'; import DataTableHeaderCellFilter from './DataTableHeaderCellFilter'; -import { DataTableResizableHeaderKnob } from './DataTableResizableHeaderKnob'; +import { DataTableResizableHeaderHandle } from './DataTableResizableHeaderHandle'; import { DataTableColumnToggle } from './hooks'; import type { DataTableColumn, DataTableSortProps } from './types'; import { humanize, useMediaQueryStringOrFunction } from './utils'; @@ -339,7 +339,7 @@ export default function DataTableHeaderCell({ ) : null} {filter ? {filter} : null}
    - {resizable ? : null} + {resizable ? : null} ); } diff --git a/package/DataTableResizableHeaderKnob.tsx b/package/DataTableResizableHeaderHandle.tsx similarity index 73% rename from package/DataTableResizableHeaderKnob.tsx rename to package/DataTableResizableHeaderHandle.tsx index 485e04a..cc7a009 100644 --- a/package/DataTableResizableHeaderKnob.tsx +++ b/package/DataTableResizableHeaderHandle.tsx @@ -2,25 +2,41 @@ import { createStyles, getStylesRef } from '@mantine/core'; import { MutableRefObject, useRef, useState } from 'react'; import { useDataTableDragToggleColumnsContext } from './DataTableDragToggleColumns.context'; -type DataTableResizableHeaderCellProps = { +type DataTableResizableHeaderHandleProps = { accessor: string; columnRef: MutableRefObject; }; const useStyles = createStyles((theme) => ({ - resizableColumnHeaderKnob: { - ref: getStylesRef('resizableColumnHeaderKnob'), + resizableColumnHeaderHandle: { + ref: getStylesRef('resizableColumnHeaderHandle'), position: 'absolute', cursor: 'col-resize', - top: '1px', - bottom: '1px', - width: '2px', + top: 0, + bottom: 0, + width: '7px', + transform: 'translateX(4px)', zIndex: 1, - backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[6] : theme.colors.gray[3], + '::after': { + content: '""', + position: 'absolute', + top: '1px', + left: '2px', + bottom: '1px', + background: 'inherit', + borderLeft: `3px dotted ${theme.colorScheme === 'dark' ? theme.colors.dark[3] : theme.colors.gray[3]}`, + opacity: 0, + }, + '&:hover::after': { + borderLeftColor: theme.colors[theme.primaryColor][theme.colorScheme === 'dark' ? 6 : 4], + }, + 'tr:hover &::after': { + opacity: 1, + }, }, })); -export const DataTableResizableHeaderKnob = (props: DataTableResizableHeaderCellProps) => { +export const DataTableResizableHeaderHandle = (props: DataTableResizableHeaderHandleProps) => { const { accessor, columnRef } = props; const { classes } = useStyles(); @@ -90,9 +106,10 @@ export const DataTableResizableHeaderKnob = (props: DataTableResizableHeaderCell return (
    event.stopPropagation()} onMouseDown={handleDragStart} onDoubleClick={handleDoubleClick} - className={classes.resizableColumnHeaderKnob} + className={classes.resizableColumnHeaderHandle} style={{ right: deltaX, }} diff --git a/package/hooks.ts b/package/hooks.ts index 852e218..4941b45 100644 --- a/package/hooks.ts +++ b/package/hooks.ts @@ -116,7 +116,7 @@ export type DataTableColumnToggle = { type DataTableColumnWidth = Record; -export const useDragToggleColumns = ({ +export const useDataTableColumns = ({ key, columns = [], }: { diff --git a/package/index.ts b/package/index.ts index d735eb1..2c15942 100644 --- a/package/index.ts +++ b/package/index.ts @@ -1,4 +1,4 @@ export { default as DataTable } from './DataTable'; -export { useDragToggleColumns } from './hooks'; +export { useDataTableColumns } from './hooks'; export * from './types'; export { differenceBy, getValueAtPath, humanize, uniqBy } from './utils'; From 713c70834a15d079b8746a0c40b9ff0876b379eb Mon Sep 17 00:00:00 2001 From: Ionut-Cristian Florescu Date: Sat, 23 Dec 2023 12:42:16 +0200 Subject: [PATCH 4/7] Update changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 362abce..da6c4dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ The following is a list of notable changes to the Mantine DataTable component. Minor versions that are not listed in the changelog are bug fixes and small improvements. +## 6.0.6 (2023-12-23) + +- Implement column drag-to-reorder, toggling and resizing features (see PR [#9](https://github.com/icflorescu/mantine-datatable-v6/pull/9) by [Giovambattista Fazioli](https://github.com/gfazioli)) + ## 6.0.5 (2023-11-07) - Implement `pinLastColumn` feature From b6709807417e184e077ff3ea6d2c143b9ddba5ff Mon Sep 17 00:00:00 2001 From: Ionut-Cristian Florescu Date: Sat, 23 Dec 2023 12:44:11 +0200 Subject: [PATCH 5/7] Bump package version --- docs/package.json | 2 +- package.json | 2 +- package/package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/package.json b/docs/package.json index 62ee5cc..16cf0cd 100644 --- a/docs/package.json +++ b/docs/package.json @@ -1,6 +1,6 @@ { "name": "mantine-datatable-docs", - "version": "6.0.5", + "version": "6.0.6", "description": "Docs website for mantine-datatable; see ../package/package.json for more info", "private": true, "scripts": { diff --git a/package.json b/package.json index 1d1d957..5eb8ff9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mantine-datatable-turborepo", - "version": "6.0.5", + "version": "6.0.6", "description": "Monorepo for mantine-datatable; see package/package.json for more info", "private": true, "workspaces": [ diff --git a/package/package.json b/package/package.json index 8a99bbf..0bd91b3 100644 --- a/package/package.json +++ b/package/package.json @@ -1,6 +1,6 @@ { "name": "mantine-datatable", - "version": "6.0.5", + "version": "6.0.6", "description": "The dependency-free datatable component for Mantine UI, featuring asynchronous data loading support, pagination, multple rows selection, column sorting, custom cell data rendering, row context menu, row expansion and more", "keywords": [ "mantine", From a73d79c8a18f7d1916aa288cfac526377b809ed8 Mon Sep 17 00:00:00 2001 From: Ionut-Cristian Florescu Date: Sat, 23 Dec 2023 12:48:10 +0200 Subject: [PATCH 6/7] Update deps --- docs/package.json | 16 +- package.json | 28 +- package/package.json | 10 +- yarn.lock | 941 ++++++++++++++++++++++++------------------- 4 files changed, 548 insertions(+), 447 deletions(-) diff --git a/docs/package.json b/docs/package.json index 16cf0cd..7899c86 100644 --- a/docs/package.json +++ b/docs/package.json @@ -10,10 +10,10 @@ }, "dependencies": { "@docsearch/react": "^3.5.2", - "@ducanh2912/next-pwa": "^9.7.2", + "@ducanh2912/next-pwa": "^10.0.0", "@emotion/react": "^11.11.1", "@emotion/server": "^11.11.0", - "@faker-js/faker": "^8.2.0", + "@faker-js/faker": "^8.3.1", "@formkit/auto-animate": "^0.8.1", "@mantine/core": "^6.0.21", "@mantine/dates": "^6.0.21", @@ -22,21 +22,21 @@ "@mantine/next": "^6.0.21", "@mantine/notifications": "^6.0.21", "@mantine/prism": "^6.0.21", - "@tabler/icons-react": "^2.40.0", + "@tabler/icons-react": "^2.44.0", "@tanstack/react-query": "^4.36.1", "dayjs": "^1.11.10", "lodash": "^4.17.21", "mantine-datatable": "*", - "next": "^14.0.1", + "next": "^14.0.4", "next-sitemap": "^4.2.3", "react": "^18.2.0", "react-dom": "^18.2.0" }, "devDependencies": { - "@types/lodash": "^4.14.200", - "@types/node": "^20.8.10", - "@types/react": "^18.2.36", - "typescript": "^5.2.2", + "@types/lodash": "^4.14.202", + "@types/node": "^20.10.5", + "@types/react": "^18.2.45", + "typescript": "^5.3.3", "webpack": "^5.89.0" } } diff --git a/package.json b/package.json index 5eb8ff9..7cacabc 100644 --- a/package.json +++ b/package.json @@ -19,25 +19,25 @@ "test:watch": "turbo run test:watch" }, "devDependencies": { - "@babel/preset-react": "^7.22.15", - "@babel/preset-typescript": "^7.23.2", - "@faker-js/faker": "^8.2.0", - "@testing-library/jest-dom": "^6.1.4", - "@testing-library/react": "^14.0.0", + "@babel/preset-react": "^7.23.3", + "@babel/preset-typescript": "^7.23.3", + "@faker-js/faker": "^8.3.1", + "@testing-library/jest-dom": "^6.1.5", + "@testing-library/react": "^14.1.2", "@testing-library/react-hooks": "^8.0.1", "@testing-library/user-event": "^14.5.1", - "@types/jest": "^29.5.7", - "@typescript-eslint/eslint-plugin": "^6.10.0", - "@typescript-eslint/parser": "^6.10.0", + "@types/jest": "^29.5.11", + "@typescript-eslint/eslint-plugin": "^6.15.0", + "@typescript-eslint/parser": "^6.15.0", "babel-jest": "^29.7.0", - "eslint": "^8.53.0", - "eslint-config-next": "^14.0.1", - "eslint-config-prettier": "^9.0.0", + "eslint": "^8.56.0", + "eslint-config-next": "^14.0.4", + "eslint-config-prettier": "^9.1.0", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", - "prettier": "^3.0.3", - "turbo": "^1.10.16", - "typescript": "^5.2.2" + "prettier": "^3.1.1", + "turbo": "^1.11.2", + "typescript": "^5.3.3" }, "engines": { "npm": ">=9.5.1", diff --git a/package/package.json b/package/package.json index 0bd91b3..0463406 100644 --- a/package/package.json +++ b/package/package.json @@ -58,12 +58,12 @@ "devDependencies": { "@mantine/core": "^6.0.21", "@mantine/hooks": "^6.0.21", - "@tabler/icons-react": "^2.40.0", - "@types/react": "^18.2.36", - "@types/react-dom": "^18.2.14", - "esbuild": "^0.19.5", + "@tabler/icons-react": "^2.44.0", + "@types/react": "^18.2.45", + "@types/react-dom": "^18.2.18", + "esbuild": "^0.19.10", "react": "^18.2.0", - "typescript": "^5.2.2" + "typescript": "^5.3.3" }, "peerDependencies": { "@mantine/core": ">=6 <=6.0.17 || >=6.0.19 < 7", diff --git a/yarn.lock b/yarn.lock index 9c3899e..0edb116 100644 --- a/yarn.lock +++ b/yarn.lock @@ -168,6 +168,14 @@ "@babel/highlight" "^7.22.10" chalk "^2.4.2" +"@babel/code-frame@^7.22.13": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" + integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== + dependencies: + "@babel/highlight" "^7.23.4" + chalk "^2.4.2" + "@babel/compat-data@^7.22.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": version "7.22.9" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" @@ -229,32 +237,32 @@ lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz#97a61b385e57fe458496fad19f8e63b63c867de4" - integrity sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg== +"@babel/helper-create-class-features-plugin@^7.22.5": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.10.tgz#dd2612d59eac45588021ac3d6fa976d08f4e95a3" + integrity sha512-5IBb77txKYQPpOEdUdIhBx8VrZyDCQ+H82H0+5dX1TmuscP5vJKEE3cKurjtIw/vFwzbVH48VweE78kVDBrqjA== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-function-name" "^7.22.5" - "@babel/helper-member-expression-to-functions" "^7.22.15" + "@babel/helper-member-expression-to-functions" "^7.22.5" "@babel/helper-optimise-call-expression" "^7.22.5" "@babel/helper-replace-supers" "^7.22.9" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.22.5": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.10.tgz#dd2612d59eac45588021ac3d6fa976d08f4e95a3" - integrity sha512-5IBb77txKYQPpOEdUdIhBx8VrZyDCQ+H82H0+5dX1TmuscP5vJKEE3cKurjtIw/vFwzbVH48VweE78kVDBrqjA== +"@babel/helper-create-class-features-plugin@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.6.tgz#b04d915ce92ce363666f816a884cdcfc9be04953" + integrity sha512-cBXU1vZni/CpGF29iTu4YRbOZt3Wat6zCoMDxRF1MayiEc4URxOj31tT65HUM0CRpMowA3HCJaAOVOUnMf96cw== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-member-expression-to-functions" "^7.23.0" "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-replace-supers" "^7.22.20" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" semver "^6.3.1" @@ -297,6 +305,14 @@ "@babel/template" "^7.22.5" "@babel/types" "^7.22.5" +"@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" + "@babel/helper-hoist-variables@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" @@ -318,6 +334,13 @@ dependencies: "@babel/types" "^7.22.5" +"@babel/helper-member-expression-to-functions@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" + integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== + dependencies: + "@babel/types" "^7.23.0" + "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" @@ -343,10 +366,10 @@ "@babel/helper-split-export-declaration" "^7.22.6" "@babel/helper-validator-identifier" "^7.22.5" -"@babel/helper-module-transforms@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e" - integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw== +"@babel/helper-module-transforms@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" + integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== dependencies: "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-module-imports" "^7.22.15" @@ -375,6 +398,15 @@ "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-wrap-function" "^7.22.9" +"@babel/helper-replace-supers@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793" + integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-member-expression-to-functions" "^7.22.15" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": version "7.22.9" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz#cbdc27d6d8d18cd22c81ae4293765a5d9afd0779" @@ -410,6 +442,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== +"@babel/helper-string-parser@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" + integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== + "@babel/helper-validator-identifier@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz#601fa28e4cc06786c18912dca138cec73b882044" @@ -462,11 +499,25 @@ chalk "^2.4.2" js-tokens "^4.0.0" +"@babel/highlight@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" + integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.10", "@babel/parser@^7.22.5": version "7.22.10" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.10.tgz#e37634f9a12a1716136c44624ef54283cabd3f55" integrity sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ== +"@babel/parser@^7.22.15": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.6.tgz#ba1c9e512bda72a47e285ae42aff9d2a635a9e3b" + integrity sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ== + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz#87245a21cd69a73b0b81bcda98d443d6df08f05e" @@ -565,6 +616,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" +"@babel/plugin-syntax-jsx@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz#8f2e4f8a9b5f9aa16067e142c1ac9cd9f810f473" + integrity sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" @@ -621,7 +679,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.22.5", "@babel/plugin-syntax-typescript@^7.7.2": +"@babel/plugin-syntax-typescript@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz#24f460c85dbbc983cd2b9c4994178bcc01df958f" + integrity sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-typescript@^7.7.2": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272" integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== @@ -825,12 +890,12 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-simple-access" "^7.22.5" -"@babel/plugin-transform-modules-commonjs@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz#b3dba4757133b2762c00f4f94590cf6d52602481" - integrity sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ== +"@babel/plugin-transform-modules-commonjs@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz#661ae831b9577e52be57dd8356b734f9700b53b4" + integrity sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA== dependencies: - "@babel/helper-module-transforms" "^7.23.0" + "@babel/helper-module-transforms" "^7.23.3" "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-simple-access" "^7.22.5" @@ -951,10 +1016,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-react-display-name@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz#3c4326f9fce31c7968d6cb9debcaf32d9e279a2b" - integrity sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw== +"@babel/plugin-transform-react-display-name@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz#70529f034dd1e561045ad3c8152a267f0d7b6200" + integrity sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -987,10 +1052,10 @@ "@babel/plugin-syntax-jsx" "^7.22.5" "@babel/types" "^7.22.5" -"@babel/plugin-transform-react-pure-annotations@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz#1f58363eef6626d6fa517b95ac66fe94685e32c0" - integrity sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA== +"@babel/plugin-transform-react-pure-annotations@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz#fabedbdb8ee40edf5da96f3ecfc6958e3783b93c" + integrity sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" @@ -1046,15 +1111,15 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-typescript@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz#15adef906451d86349eb4b8764865c960eb54127" - integrity sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA== +"@babel/plugin-transform-typescript@^7.23.3": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz#aa36a94e5da8d94339ae3a4e22d40ed287feb34c" + integrity sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-create-class-features-plugin" "^7.23.6" "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-typescript" "^7.22.5" + "@babel/plugin-syntax-typescript" "^7.23.3" "@babel/plugin-transform-unicode-escapes@^7.22.10": version "7.22.10" @@ -1182,28 +1247,28 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-react@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.22.15.tgz#9a776892b648e13cc8ca2edf5ed1264eea6b6afc" - integrity sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w== +"@babel/preset-react@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.23.3.tgz#f73ca07e7590f977db07eb54dbe46538cc015709" + integrity sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-validator-option" "^7.22.15" - "@babel/plugin-transform-react-display-name" "^7.22.5" + "@babel/plugin-transform-react-display-name" "^7.23.3" "@babel/plugin-transform-react-jsx" "^7.22.15" "@babel/plugin-transform-react-jsx-development" "^7.22.5" - "@babel/plugin-transform-react-pure-annotations" "^7.22.5" + "@babel/plugin-transform-react-pure-annotations" "^7.23.3" -"@babel/preset-typescript@^7.23.2": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.23.2.tgz#c8de488130b7081f7e1482936ad3de5b018beef4" - integrity sha512-u4UJc1XsS1GhIGteM8rnGiIvf9rJpiVgMEeCnwlLA7WJPC+jcXWJAGxYmeqs5hOZD8BbAfnV5ezBOxQbb4OUxA== +"@babel/preset-typescript@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz#14534b34ed5b6d435aa05f1ae1c5e7adcc01d913" + integrity sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-validator-option" "^7.22.15" - "@babel/plugin-syntax-jsx" "^7.22.5" - "@babel/plugin-transform-modules-commonjs" "^7.23.0" - "@babel/plugin-transform-typescript" "^7.22.15" + "@babel/plugin-syntax-jsx" "^7.23.3" + "@babel/plugin-transform-modules-commonjs" "^7.23.3" + "@babel/plugin-transform-typescript" "^7.23.3" "@babel/regjsgen@^0.8.0": version "0.8.0" @@ -1217,6 +1282,15 @@ dependencies: regenerator-runtime "^0.14.0" +"@babel/template@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" + "@babel/template@^7.22.5", "@babel/template@^7.3.3": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" @@ -1260,6 +1334,15 @@ "@babel/helper-validator-identifier" "^7.22.15" to-fast-properties "^2.0.0" +"@babel/types@^7.23.0": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.6.tgz#be33fdb151e1f5a56877d704492c240fc71c7ccd" + integrity sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg== + dependencies: + "@babel/helper-string-parser" "^7.23.4" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -1285,13 +1368,13 @@ "@docsearch/css" "3.5.2" algoliasearch "^4.19.1" -"@ducanh2912/next-pwa@^9.7.2": - version "9.7.2" - resolved "https://registry.yarnpkg.com/@ducanh2912/next-pwa/-/next-pwa-9.7.2.tgz#72160e294e787cf5df5c59de2bfa8d9807e025ee" - integrity sha512-KNdWIr8297L6TRyEeJQUzZqgP+m10GmaV6tacZ6wIcON9J+b6Nz34eLx6B5Q5mQKxqbYHTDayVoMRc2uuA/Ahg== +"@ducanh2912/next-pwa@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@ducanh2912/next-pwa/-/next-pwa-10.0.0.tgz#d56c92c32ab74a7eff0af8e367c49791fc2e1a6c" + integrity sha512-6VWpF0IzP9Az9n0jmqL9XH8iWA6LYJrC72b8GDEn7Swfi1mR+hYPItNFKJnraqwJheIqeeZXIHAqs5/VdyDF5A== dependencies: clean-webpack-plugin "4.0.0" - fast-glob "3.3.1" + fast-glob "3.3.2" semver "7.5.4" terser-webpack-plugin "5.3.9" workbox-build "7.0.0" @@ -1397,115 +1480,120 @@ resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz#d0fce5d07b0620caa282b5131c297bb60f9d87e6" integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww== -"@esbuild/android-arm64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.5.tgz#276c5f99604054d3dbb733577e09adae944baa90" - integrity sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ== - -"@esbuild/android-arm@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.5.tgz#4a3cbf14758166abaae8ba9c01a80e68342a4eec" - integrity sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA== - -"@esbuild/android-x64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.5.tgz#21a3d11cd4613d2d3c5ccb9e746c254eb9265b0a" - integrity sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA== - -"@esbuild/darwin-arm64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.5.tgz#714cb839f467d6a67b151ee8255886498e2b9bf6" - integrity sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw== - -"@esbuild/darwin-x64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.5.tgz#2c553e97a6d2b4ae76a884e35e6cbab85a990bbf" - integrity sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA== - -"@esbuild/freebsd-arm64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.5.tgz#d554f556718adb31917a0da24277bf84b6ee87f3" - integrity sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ== - -"@esbuild/freebsd-x64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.5.tgz#288f7358a3bb15d99e73c65c9adaa3dabb497432" - integrity sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ== - -"@esbuild/linux-arm64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.5.tgz#95933ae86325c93cb6b5e8333d22120ecfdc901b" - integrity sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA== - -"@esbuild/linux-arm@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.5.tgz#0acef93aa3e0579e46d33b666627bddb06636664" - integrity sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ== - -"@esbuild/linux-ia32@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.5.tgz#b6e5c9e80b42131cbd6b1ddaa48c92835f1ed67f" - integrity sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ== - -"@esbuild/linux-loong64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.5.tgz#e5f0cf95a180158b01ff5f417da796a1c09dfbea" - integrity sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw== - -"@esbuild/linux-mips64el@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.5.tgz#ae36fb86c7d5f641f3a0c8472e83dcb6ea36a408" - integrity sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg== - -"@esbuild/linux-ppc64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.5.tgz#7960cb1666f0340ddd9eef7b26dcea3835d472d0" - integrity sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q== - -"@esbuild/linux-riscv64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.5.tgz#32207df26af60a3a9feea1783fc21b9817bade19" - integrity sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag== - -"@esbuild/linux-s390x@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.5.tgz#b38d5681db89a3723862dfa792812397b1510a7d" - integrity sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw== - -"@esbuild/linux-x64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.5.tgz#46feba2ad041a241379d150f415b472fe3885075" - integrity sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A== - -"@esbuild/netbsd-x64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.5.tgz#3b5c1fb068f26bfc681d31f682adf1bea4ef0702" - integrity sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g== - -"@esbuild/openbsd-x64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.5.tgz#ca6830316ca68056c5c88a875f103ad3235e00db" - integrity sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA== - -"@esbuild/sunos-x64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.5.tgz#9efc4eb9539a7be7d5a05ada52ee43cda0d8e2dd" - integrity sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg== - -"@esbuild/win32-arm64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.5.tgz#29f8184afa7a02a956ebda4ed638099f4b8ff198" - integrity sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg== - -"@esbuild/win32-ia32@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.5.tgz#f3de07afb292ecad651ae4bb8727789de2d95b05" - integrity sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw== - -"@esbuild/win32-x64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.5.tgz#faad84c41ba12e3a0acb52571df9bff37bee75f6" - integrity sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw== +"@esbuild/aix-ppc64@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.10.tgz#fb3922a0183d27446de00cf60d4f7baaadf98d84" + integrity sha512-Q+mk96KJ+FZ30h9fsJl+67IjNJm3x2eX+GBWGmocAKgzp27cowCOOqSdscX80s0SpdFXZnIv/+1xD1EctFx96Q== + +"@esbuild/android-arm64@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.10.tgz#ef31015416dd79398082409b77aaaa2ade4d531a" + integrity sha512-1X4CClKhDgC3by7k8aOWZeBXQX8dHT5QAMCAQDArCLaYfkppoARvh0fit3X2Qs+MXDngKcHv6XXyQCpY0hkK1Q== + +"@esbuild/android-arm@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.10.tgz#1c23c7e75473aae9fb323be5d9db225142f47f52" + integrity sha512-7W0bK7qfkw1fc2viBfrtAEkDKHatYfHzr/jKAHNr9BvkYDXPcC6bodtm8AyLJNNuqClLNaeTLuwURt4PRT9d7w== + +"@esbuild/android-x64@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.10.tgz#df6a4e6d6eb8da5595cfce16d4e3f6bc24464707" + integrity sha512-O/nO/g+/7NlitUxETkUv/IvADKuZXyH4BHf/g/7laqKC4i/7whLpB0gvpPc2zpF0q9Q6FXS3TS75QHac9MvVWw== + +"@esbuild/darwin-arm64@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.10.tgz#8462a55db07c1b2fad61c8244ce04469ef1043be" + integrity sha512-YSRRs2zOpwypck+6GL3wGXx2gNP7DXzetmo5pHXLrY/VIMsS59yKfjPizQ4lLt5vEI80M41gjm2BxrGZ5U+VMA== + +"@esbuild/darwin-x64@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.10.tgz#d1de20bfd41bb75b955ba86a6b1004539e8218c1" + integrity sha512-alfGtT+IEICKtNE54hbvPg13xGBe4GkVxyGWtzr+yHO7HIiRJppPDhOKq3zstTcVf8msXb/t4eavW3jCDpMSmA== + +"@esbuild/freebsd-arm64@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.10.tgz#16904879e34c53a2e039d1284695d2db3e664d57" + integrity sha512-dMtk1wc7FSH8CCkE854GyGuNKCewlh+7heYP/sclpOG6Cectzk14qdUIY5CrKDbkA/OczXq9WesqnPl09mj5dg== + +"@esbuild/freebsd-x64@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.10.tgz#8ad9e5ca9786ca3f1ef1411bfd10b08dcd9d4cef" + integrity sha512-G5UPPspryHu1T3uX8WiOEUa6q6OlQh6gNl4CO4Iw5PS+Kg5bVggVFehzXBJY6X6RSOMS8iXDv2330VzaObm4Ag== + +"@esbuild/linux-arm64@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.10.tgz#d82cf2c590faece82d28bbf1cfbe36f22ae25bd2" + integrity sha512-QxaouHWZ+2KWEj7cGJmvTIHVALfhpGxo3WLmlYfJ+dA5fJB6lDEIg+oe/0//FuyVHuS3l79/wyBxbHr0NgtxJQ== + +"@esbuild/linux-arm@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.10.tgz#477b8e7c7bcd34369717b04dd9ee6972c84f4029" + integrity sha512-j6gUW5aAaPgD416Hk9FHxn27On28H4eVI9rJ4az7oCGTFW48+LcgNDBN+9f8rKZz7EEowo889CPKyeaD0iw9Kg== + +"@esbuild/linux-ia32@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.10.tgz#d55ff822cf5b0252a57112f86857ff23be6cab0e" + integrity sha512-4ub1YwXxYjj9h1UIZs2hYbnTZBtenPw5NfXCRgEkGb0b6OJ2gpkMvDqRDYIDRjRdWSe/TBiZltm3Y3Q8SN1xNg== + +"@esbuild/linux-loong64@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.10.tgz#a9ad057d7e48d6c9f62ff50f6f208e331c4543c7" + integrity sha512-lo3I9k+mbEKoxtoIbM0yC/MZ1i2wM0cIeOejlVdZ3D86LAcFXFRdeuZmh91QJvUTW51bOK5W2BznGNIl4+mDaA== + +"@esbuild/linux-mips64el@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.10.tgz#b011a96924773d60ebab396fbd7a08de66668179" + integrity sha512-J4gH3zhHNbdZN0Bcr1QUGVNkHTdpijgx5VMxeetSk6ntdt+vR1DqGmHxQYHRmNb77tP6GVvD+K0NyO4xjd7y4A== + +"@esbuild/linux-ppc64@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.10.tgz#5d8b59929c029811e473f2544790ea11d588d4dd" + integrity sha512-tgT/7u+QhV6ge8wFMzaklOY7KqiyitgT1AUHMApau32ZlvTB/+efeCtMk4eXS+uEymYK249JsoiklZN64xt6oQ== + +"@esbuild/linux-riscv64@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.10.tgz#292b06978375b271bd8bc0a554e0822957508d22" + integrity sha512-0f/spw0PfBMZBNqtKe5FLzBDGo0SKZKvMl5PHYQr3+eiSscfJ96XEknCe+JoOayybWUFQbcJTrk946i3j9uYZA== + +"@esbuild/linux-s390x@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.10.tgz#d30af63530f8d4fa96930374c9dd0d62bf59e069" + integrity sha512-pZFe0OeskMHzHa9U38g+z8Yx5FNCLFtUnJtQMpwhS+r4S566aK2ci3t4NCP4tjt6d5j5uo4h7tExZMjeKoehAA== + +"@esbuild/linux-x64@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.10.tgz#898c72eeb74d9f2fb43acf316125b475548b75ce" + integrity sha512-SpYNEqg/6pZYoc+1zLCjVOYvxfZVZj6w0KROZ3Fje/QrM3nfvT2llI+wmKSrWuX6wmZeTapbarvuNNK/qepSgA== + +"@esbuild/netbsd-x64@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.10.tgz#fd473a5ae261b43eab6dad4dbd5a3155906e6c91" + integrity sha512-ACbZ0vXy9zksNArWlk2c38NdKg25+L9pr/mVaj9SUq6lHZu/35nx2xnQVRGLrC1KKQqJKRIB0q8GspiHI3J80Q== + +"@esbuild/openbsd-x64@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.10.tgz#96eb8992e526717b5272321eaad3e21f3a608e46" + integrity sha512-PxcgvjdSjtgPMiPQrM3pwSaG4kGphP+bLSb+cihuP0LYdZv1epbAIecHVl5sD3npkfYBZ0ZnOjR878I7MdJDFg== + +"@esbuild/sunos-x64@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.10.tgz#c16ee1c167f903eaaa6acf7372bee42d5a89c9bc" + integrity sha512-ZkIOtrRL8SEJjr+VHjmW0znkPs+oJXhlJbNwfI37rvgeMtk3sxOQevXPXjmAPZPigVTncvFqLMd+uV0IBSEzqA== + +"@esbuild/win32-arm64@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.10.tgz#7e417d1971dbc7e469b4eceb6a5d1d667b5e3dcc" + integrity sha512-+Sa4oTDbpBfGpl3Hn3XiUe4f8TU2JF7aX8cOfqFYMMjXp6ma6NJDztl5FDG8Ezx0OjwGikIHw+iA54YLDNNVfw== + +"@esbuild/win32-ia32@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.10.tgz#2b52dfec6cd061ecb36171c13bae554888b439e5" + integrity sha512-EOGVLK1oWMBXgfttJdPHDTiivYSjX6jDNaATeNOaCOFEVcfMjtbx7WVQwPSE1eIfCp/CaSF2nSrDtzc4I9f8TQ== + +"@esbuild/win32-x64@0.19.10": + version "0.19.10" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.10.tgz#bd123a74f243d2f3a1f046447bb9b363ee25d072" + integrity sha512-whqLG6Sc70AbU73fFYvuYzaE4MNMBIlR1Y/IrUeOXFrWHxBEjjbZaQ3IXIQS8wJdAzue2GwYZCjOrgrU1oUHoA== "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" @@ -1519,10 +1607,10 @@ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.6.2.tgz#1816b5f6948029c5eaacb0703b850ee0cb37d8f8" integrity sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw== -"@eslint/eslintrc@^2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.3.tgz#797470a75fe0fbd5a53350ee715e85e87baff22d" - integrity sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA== +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== dependencies: ajv "^6.12.4" debug "^4.3.2" @@ -1534,15 +1622,15 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.53.0": - version "8.53.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.53.0.tgz#bea56f2ed2b5baea164348ff4d5a879f6f81f20d" - integrity sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w== +"@eslint/js@8.56.0": + version "8.56.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.56.0.tgz#ef20350fec605a7f7035a01764731b2de0f3782b" + integrity sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A== -"@faker-js/faker@^8.2.0": - version "8.2.0" - resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-8.2.0.tgz#d4656d2cb485fe6ec4e7b340da9f16fac2c36c4a" - integrity sha512-VacmzZqVxdWdf9y64lDOMZNDMM/FQdtM9IsaOPKOm2suYwEatb8VkdHqOzXcDnZbk7YDE2BmsJmy/2Hmkn563g== +"@faker-js/faker@^8.3.1": + version "8.3.1" + resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-8.3.1.tgz#7753df0cb88d7649becf984a96dd1bd0a26f43e3" + integrity sha512-FdgpFxY6V6rLZE9mmIBb9hM0xpfvQOSNOLnzolzKwsE1DH+gC7lEKV1p1IbR0lAYyvYd5a4u3qWJzowUkw1bIw== "@floating-ui/core@^1.4.1": version "1.4.1" @@ -1954,67 +2042,67 @@ resolved "https://registry.yarnpkg.com/@mantine/utils/-/utils-6.0.21.tgz#6185506e91cba3e308aaa8ea9ababc8e767995d6" integrity sha512-33RVDRop5jiWFao3HKd3Yp7A9mEq4HAJxJPTuYm1NkdqX6aTKOQK7wT8v8itVodBp+sb4cJK6ZVdD1UurK/txQ== -"@next/env@14.0.1": - version "14.0.1" - resolved "https://registry.yarnpkg.com/@next/env/-/env-14.0.1.tgz#7d03c9042c205a320aef2ea3f83c2d16b6825563" - integrity sha512-Ms8ZswqY65/YfcjrlcIwMPD7Rg/dVjdLapMcSHG26W6O67EJDF435ShW4H4LXi1xKO1oRc97tLXUpx8jpLe86A== +"@next/env@14.0.4": + version "14.0.4" + resolved "https://registry.yarnpkg.com/@next/env/-/env-14.0.4.tgz#d5cda0c4a862d70ae760e58c0cd96a8899a2e49a" + integrity sha512-irQnbMLbUNQpP1wcE5NstJtbuA/69kRfzBrpAD7Gsn8zm/CY6YQYc3HQBz8QPxwISG26tIm5afvvVbu508oBeQ== "@next/env@^13.4.3": version "13.4.13" resolved "https://registry.yarnpkg.com/@next/env/-/env-13.4.13.tgz#50250cec7626904b93a4a934933d6a747763259d" integrity sha512-fwz2QgVg08v7ZL7KmbQBLF2PubR/6zQdKBgmHEl3BCyWTEDsAQEijjw2gbFhI1tcKfLdOOJUXntz5vZ4S0Polg== -"@next/eslint-plugin-next@14.0.1": - version "14.0.1" - resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.0.1.tgz#6e587b76588a02d77267945b5d1f059a6c8fd9ca" - integrity sha512-bLjJMwXdzvhnQOnxvHoTTUh/+PYk6FF/DCgHi4BXwXCINer+o1ZYfL9aVeezj/oI7wqGJOqwGIXrlBvPbAId3w== +"@next/eslint-plugin-next@14.0.4": + version "14.0.4" + resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.0.4.tgz#474fd88d92209270021186043513fbdc4203f5ec" + integrity sha512-U3qMNHmEZoVmHA0j/57nRfi3AscXNvkOnxDmle/69Jz/G0o/gWjXTDdlgILZdrxQ0Lw/jv2mPW8PGy0EGIHXhQ== dependencies: glob "7.1.7" -"@next/swc-darwin-arm64@14.0.1": - version "14.0.1" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.0.1.tgz#75a5f872c4077ecd536d7496bc24f3d312d5dcd0" - integrity sha512-JyxnGCS4qT67hdOKQ0CkgFTp+PXub5W1wsGvIq98TNbF3YEIN7iDekYhYsZzc8Ov0pWEsghQt+tANdidITCLaw== - -"@next/swc-darwin-x64@14.0.1": - version "14.0.1" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.0.1.tgz#7d8498fc680cc8b4d5181bee336818c63779bc5e" - integrity sha512-625Z7bb5AyIzswF9hvfZWa+HTwFZw+Jn3lOBNZB87lUS0iuCYDHqk3ujuHCkiyPtSC0xFBtYDLcrZ11mF/ap3w== - -"@next/swc-linux-arm64-gnu@14.0.1": - version "14.0.1" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.0.1.tgz#184286794e67bed192de7dbb10d7f040c996f965" - integrity sha512-iVpn3KG3DprFXzVHM09kvb//4CNNXBQ9NB/pTm8LO+vnnnaObnzFdS5KM+w1okwa32xH0g8EvZIhoB3fI3mS1g== - -"@next/swc-linux-arm64-musl@14.0.1": - version "14.0.1" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.0.1.tgz#e8121b860ebc97a8d2a9113e5a42878430e749d5" - integrity sha512-mVsGyMxTLWZXyD5sen6kGOTYVOO67lZjLApIj/JsTEEohDDt1im2nkspzfV5MvhfS7diDw6Rp/xvAQaWZTv1Ww== - -"@next/swc-linux-x64-gnu@14.0.1": - version "14.0.1" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.0.1.tgz#cdc4276b11a10c892fd1cb7dd31e024064db9c3b" - integrity sha512-wMqf90uDWN001NqCM/auRl3+qVVeKfjJdT9XW+RMIOf+rhUzadmYJu++tp2y+hUbb6GTRhT+VjQzcgg/QTD9NQ== - -"@next/swc-linux-x64-musl@14.0.1": - version "14.0.1" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.0.1.tgz#4a194a484ceb34fd370e8d1af571493859fb2542" - integrity sha512-ol1X1e24w4j4QwdeNjfX0f+Nza25n+ymY0T2frTyalVczUmzkVD7QGgPTZMHfR1aLrO69hBs0G3QBYaj22J5GQ== - -"@next/swc-win32-arm64-msvc@14.0.1": - version "14.0.1" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.0.1.tgz#71923debee50f98ef166b28cdb3ad7e7463e6598" - integrity sha512-WEmTEeWs6yRUEnUlahTgvZteh5RJc4sEjCQIodJlZZ5/VJwVP8p2L7l6VhzQhT4h7KvLx/Ed4UViBdne6zpIsw== - -"@next/swc-win32-ia32-msvc@14.0.1": - version "14.0.1" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.0.1.tgz#b8f46da899c279fd65db76f0951849290c480ef9" - integrity sha512-oFpHphN4ygAgZUKjzga7SoH2VGbEJXZa/KL8bHCAwCjDWle6R1SpiGOdUdA8EJ9YsG1TYWpzY6FTbUA+iAJeww== - -"@next/swc-win32-x64-msvc@14.0.1": - version "14.0.1" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.0.1.tgz#be3dd8b3729ec51c99ff04b51e2b235756d02b6e" - integrity sha512-FFp3nOJ/5qSpeWT0BZQ+YE1pSMk4IMpkME/1DwKBwhg4mJLB9L+6EXuJi4JEwaJdl5iN+UUlmUD3IsR1kx5fAg== +"@next/swc-darwin-arm64@14.0.4": + version "14.0.4" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.0.4.tgz#27b1854c2cd04eb1d5e75081a1a792ad91526618" + integrity sha512-mF05E/5uPthWzyYDyptcwHptucf/jj09i2SXBPwNzbgBNc+XnwzrL0U6BmPjQeOL+FiB+iG1gwBeq7mlDjSRPg== + +"@next/swc-darwin-x64@14.0.4": + version "14.0.4" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.0.4.tgz#9940c449e757d0ee50bb9e792d2600cc08a3eb3b" + integrity sha512-IZQ3C7Bx0k2rYtrZZxKKiusMTM9WWcK5ajyhOZkYYTCc8xytmwSzR1skU7qLgVT/EY9xtXDG0WhY6fyujnI3rw== + +"@next/swc-linux-arm64-gnu@14.0.4": + version "14.0.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.0.4.tgz#0eafd27c8587f68ace7b4fa80695711a8434de21" + integrity sha512-VwwZKrBQo/MGb1VOrxJ6LrKvbpo7UbROuyMRvQKTFKhNaXjUmKTu7wxVkIuCARAfiI8JpaWAnKR+D6tzpCcM4w== + +"@next/swc-linux-arm64-musl@14.0.4": + version "14.0.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.0.4.tgz#2b0072adb213f36dada5394ea67d6e82069ae7dd" + integrity sha512-8QftwPEW37XxXoAwsn+nXlodKWHfpMaSvt81W43Wh8dv0gkheD+30ezWMcFGHLI71KiWmHK5PSQbTQGUiidvLQ== + +"@next/swc-linux-x64-gnu@14.0.4": + version "14.0.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.0.4.tgz#68c67d20ebc8e3f6ced6ff23a4ba2a679dbcec32" + integrity sha512-/s/Pme3VKfZAfISlYVq2hzFS8AcAIOTnoKupc/j4WlvF6GQ0VouS2Q2KEgPuO1eMBwakWPB1aYFIA4VNVh667A== + +"@next/swc-linux-x64-musl@14.0.4": + version "14.0.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.0.4.tgz#67cd81b42fb2caf313f7992fcf6d978af55a1247" + integrity sha512-m8z/6Fyal4L9Bnlxde5g2Mfa1Z7dasMQyhEhskDATpqr+Y0mjOBZcXQ7G5U+vgL22cI4T7MfvgtrM2jdopqWaw== + +"@next/swc-win32-arm64-msvc@14.0.4": + version "14.0.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.0.4.tgz#be06585906b195d755ceda28f33c633e1443f1a3" + integrity sha512-7Wv4PRiWIAWbm5XrGz3D8HUkCVDMMz9igffZG4NB1p4u1KoItwx9qjATHz88kwCEal/HXmbShucaslXCQXUM5w== + +"@next/swc-win32-ia32-msvc@14.0.4": + version "14.0.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.0.4.tgz#e76cabefa9f2d891599c3d85928475bd8d3f6600" + integrity sha512-zLeNEAPULsl0phfGb4kdzF/cAVIfaC7hY+kt0/d+y9mzcZHsMS3hAS829WbJ31DkSlVKQeHEjZHIdhN+Pg7Gyg== + +"@next/swc-win32-x64-msvc@14.0.4": + version "14.0.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.0.4.tgz#e74892f1a9ccf41d3bf5979ad6d3d77c07b9cba1" + integrity sha512-yEh2+R8qDlDCjxVpzOTEpBLQTEFAcP2A8fUFLaWNap9GitYKkKv1//y2S6XY6zsR4rCOPRpU7plYDR+az2n30A== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -2205,18 +2293,18 @@ dependencies: tslib "^2.4.0" -"@tabler/icons-react@^2.40.0": - version "2.40.0" - resolved "https://registry.yarnpkg.com/@tabler/icons-react/-/icons-react-2.40.0.tgz#14efb60f0d841689c1ddf5691646dbfc3fa01901" - integrity sha512-C+dDOZowFbwI3LGQP0fdua+hOPkGkW7XeMcRXTSdEKc5fD75W6zRO5nXnWivIMRKsi/Y26EDmnQo15N8JX378w== +"@tabler/icons-react@^2.44.0": + version "2.44.0" + resolved "https://registry.yarnpkg.com/@tabler/icons-react/-/icons-react-2.44.0.tgz#8119d3b6321ebaf98400fba7932e280d008125f8" + integrity sha512-10qwrqJ/QBNgY4YYer9PjWmCwm3wv9aVK8kGAkFKkwu6UJURVLZ2ea+oFh5j6vSXnA1zMtUG+X8anR5fZ67Isw== dependencies: - "@tabler/icons" "2.40.0" + "@tabler/icons" "2.44.0" prop-types "^15.7.2" -"@tabler/icons@2.40.0": - version "2.40.0" - resolved "https://registry.yarnpkg.com/@tabler/icons/-/icons-2.40.0.tgz#96cecc990a03412b88194ce3765280d2e63c1be6" - integrity sha512-VqKsBSX159cLFTnCzkCmGhZtSPJHNN0lM2sC4xe0HPOfPUnjiex7rDHDdut4oe4iKRecDDpwXwM9BcU6xCPlCg== +"@tabler/icons@2.44.0": + version "2.44.0" + resolved "https://registry.yarnpkg.com/@tabler/icons/-/icons-2.44.0.tgz#9f3cf86150b23e84a6eaf9d29ab2b2aaa8c7eed6" + integrity sha512-WPPtihDcAwEm1QZM9MXQw6+r/R2/qx7KMU1eegsi9DsqBLAb0W2kbt6e/syvd6j9c+6XNpRVBW1ziGqSWQAWOg== "@tanstack/query-core@4.36.1": version "4.36.1" @@ -2245,10 +2333,10 @@ lz-string "^1.5.0" pretty-format "^27.0.2" -"@testing-library/jest-dom@^6.1.4": - version "6.1.4" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.1.4.tgz#cf0835c33bc5ef00befb9e672b1e3e6a710e30e3" - integrity sha512-wpoYrCYwSZ5/AxcrjLxJmCU6I5QAJXslEeSiMQqaWmP2Kzpd1LvF/qxmAIW2qposULGWq2gw30GgVNFLSc2Jnw== +"@testing-library/jest-dom@^6.1.5": + version "6.1.5" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.1.5.tgz#0a635d0ad4a1a880089d967299d94e9cfc81fbe1" + integrity sha512-3y04JLW+EceVPy2Em3VwNr95dOKqA8DhR0RJHhHKDZNYXcVXnEK7WIrpj4eYU8SVt/qYZ2aRWt/WgQ+grNES8g== dependencies: "@adobe/css-tools" "^4.3.1" "@babel/runtime" "^7.9.2" @@ -2267,10 +2355,10 @@ "@babel/runtime" "^7.12.5" react-error-boundary "^3.1.0" -"@testing-library/react@^14.0.0": - version "14.0.0" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-14.0.0.tgz#59030392a6792450b9ab8e67aea5f3cc18d6347c" - integrity sha512-S04gSNJbYE30TlIMLTzv6QCTzt9AqIF5y6s6SzVFILNcNvbV/jU96GeiTPillGQo+Ny64M/5PV7klNYYgv5Dfg== +"@testing-library/react@^14.1.2": + version "14.1.2" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-14.1.2.tgz#a2b9e9ee87721ec9ed2d7cfc51cc04e474537c32" + integrity sha512-z4p7DVBTPjKM5qDZ0t5ZjzkpSNb+fZy1u6bzO7kk8oeGagpPCAtgh4cx1syrfp7a+QWkM021jGqjJaxJJnXAZg== dependencies: "@babel/runtime" "^7.12.5" "@testing-library/dom" "^9.0.0" @@ -2384,10 +2472,10 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@^29.5.7": - version "29.5.7" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.7.tgz#2c0dafe2715dd958a455bc10e2ec3e1ec47b5036" - integrity sha512-HLyetab6KVPSiF+7pFcUyMeLsx25LDNDemw9mGsJBkai/oouwrjTycocSDYopMEwFhN2Y4s9oPyOCZNofgSt2g== +"@types/jest@^29.5.11": + version "29.5.11" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.11.tgz#0c13aa0da7d0929f078ab080ae5d4ced80fa2f2c" + integrity sha512-S2mHmYIVe13vrm6q4kN6fLYYAka15ALQki/vgDC3mIukEOx8WJlv0kQPM+d4w8Gp6u0uSdKND04IlTXBv0rwnQ== dependencies: expect "^29.0.0" pretty-format "^29.0.0" @@ -2411,10 +2499,10 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== -"@types/lodash@^4.14.200": - version "4.14.200" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.200.tgz#435b6035c7eba9cdf1e039af8212c9e9281e7149" - integrity sha512-YI/M/4HRImtNf3pJgbF+W6FrXovqj+T+/HpENLTooK9PnkacBsDpeP3IpHab40CClUfhNmdM2WTNP2sa2dni5Q== +"@types/lodash@^4.14.202": + version "4.14.202" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.202.tgz#f09dbd2fb082d507178b2f2a5c7e74bd72ff98f8" + integrity sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ== "@types/minimatch@*": version "5.1.2" @@ -2426,10 +2514,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.9.tgz#c7164e0f8d3f12dfae336af0b1f7fdec8c6b204f" integrity sha512-8e2HYcg7ohnTUbHk8focoklEQYvemQmu9M/f43DZVx43kHn0tE3BY/6gSDxS7k0SprtS0NHvj+L80cGLnoOUcQ== -"@types/node@^20.8.10": - version "20.8.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.10.tgz#a5448b895c753ae929c26ce85cab557c6d4a365e" - integrity sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w== +"@types/node@^20.10.5": + version "20.10.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.5.tgz#47ad460b514096b7ed63a1dae26fad0914ed3ab2" + integrity sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw== dependencies: undici-types "~5.26.4" @@ -2450,10 +2538,10 @@ dependencies: "@types/react" "*" -"@types/react-dom@^18.2.14": - version "18.2.14" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.14.tgz#c01ba40e5bb57fc1dc41569bb3ccdb19eab1c539" - integrity sha512-V835xgdSVmyQmI1KLV2BEIUgqEuinxp9O4G6g3FqO/SqLac049E53aysv0oEFD2kHfejeKU+ZqL2bcFWj9gLAQ== +"@types/react-dom@^18.2.18": + version "18.2.18" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.18.tgz#16946e6cd43971256d874bc3d0a72074bb8571dd" + integrity sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw== dependencies: "@types/react" "*" @@ -2466,10 +2554,10 @@ "@types/scheduler" "*" csstype "^3.0.2" -"@types/react@^18.2.36": - version "18.2.36" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.36.tgz#bc68ffb4408e5d0c419b0760b2eaeec70aeeedb3" - integrity sha512-o9XFsHYLLZ4+sb9CWUYwHqFVoG61SesydF353vFMMsQziiyRu8np4n2OYMUSDZ8XuImxDr9c5tR7gidlH29Vnw== +"@types/react@^18.2.45": + version "18.2.45" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.45.tgz#253f4fac288e7e751ab3dc542000fb687422c15c" + integrity sha512-TtAxCNrlrBp8GoeEp1npd5g+d/OejJHFxS3OWmrPBMFaVQMSN0OFySozJio5BHxTuTeug00AVXVAjfDSfk+lUg== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -2519,16 +2607,16 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^6.10.0": - version "6.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.10.0.tgz#cfe2bd34e26d2289212946b96ab19dcad64b661a" - integrity sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg== +"@typescript-eslint/eslint-plugin@^6.15.0": + version "6.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.15.0.tgz#b0b3e15fa8c3e67ed4386b765cc0ba98ad3a303b" + integrity sha512-j5qoikQqPccq9QoBAupOP+CBu8BaJ8BLjaXSioDISeTZkVO3ig7oSIKh3H+rEpee7xCXtWwSB4KIL5l6hWZzpg== dependencies: "@eslint-community/regexpp" "^4.5.1" - "@typescript-eslint/scope-manager" "6.10.0" - "@typescript-eslint/type-utils" "6.10.0" - "@typescript-eslint/utils" "6.10.0" - "@typescript-eslint/visitor-keys" "6.10.0" + "@typescript-eslint/scope-manager" "6.15.0" + "@typescript-eslint/type-utils" "6.15.0" + "@typescript-eslint/utils" "6.15.0" + "@typescript-eslint/visitor-keys" "6.15.0" debug "^4.3.4" graphemer "^1.4.0" ignore "^5.2.4" @@ -2547,24 +2635,24 @@ "@typescript-eslint/visitor-keys" "6.3.0" debug "^4.3.4" -"@typescript-eslint/parser@^6.10.0": - version "6.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.10.0.tgz#578af79ae7273193b0b6b61a742a2bc8e02f875a" - integrity sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog== +"@typescript-eslint/parser@^6.15.0": + version "6.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.15.0.tgz#1af69741cfa314a13c1434d0bdd5a0c3096699d7" + integrity sha512-MkgKNnsjC6QwcMdlNAel24jjkEO/0hQaMDLqP4S9zq5HBAUJNQB6y+3DwLjX7b3l2b37eNAxMPLwb3/kh8VKdA== dependencies: - "@typescript-eslint/scope-manager" "6.10.0" - "@typescript-eslint/types" "6.10.0" - "@typescript-eslint/typescript-estree" "6.10.0" - "@typescript-eslint/visitor-keys" "6.10.0" + "@typescript-eslint/scope-manager" "6.15.0" + "@typescript-eslint/types" "6.15.0" + "@typescript-eslint/typescript-estree" "6.15.0" + "@typescript-eslint/visitor-keys" "6.15.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@6.10.0": - version "6.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.10.0.tgz#b0276118b13d16f72809e3cecc86a72c93708540" - integrity sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg== +"@typescript-eslint/scope-manager@6.15.0": + version "6.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.15.0.tgz#40e5214a3e9e048aca55ce33381bc61b6b51c32a" + integrity sha512-+BdvxYBltqrmgCNu4Li+fGDIkW9n//NrruzG9X1vBzaNK+ExVXPoGB71kneaVw/Jp+4rH/vaMAGC6JfMbHstVg== dependencies: - "@typescript-eslint/types" "6.10.0" - "@typescript-eslint/visitor-keys" "6.10.0" + "@typescript-eslint/types" "6.15.0" + "@typescript-eslint/visitor-keys" "6.15.0" "@typescript-eslint/scope-manager@6.3.0": version "6.3.0" @@ -2574,33 +2662,33 @@ "@typescript-eslint/types" "6.3.0" "@typescript-eslint/visitor-keys" "6.3.0" -"@typescript-eslint/type-utils@6.10.0": - version "6.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.10.0.tgz#1007faede067c78bdbcef2e8abb31437e163e2e1" - integrity sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg== +"@typescript-eslint/type-utils@6.15.0": + version "6.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.15.0.tgz#c22261bd00566821a300d08f4632533a8f9bed01" + integrity sha512-CnmHKTfX6450Bo49hPg2OkIm/D/TVYV7jO1MCfPYGwf6x3GO0VU8YMO5AYMn+u3X05lRRxA4fWCz87GFQV6yVQ== dependencies: - "@typescript-eslint/typescript-estree" "6.10.0" - "@typescript-eslint/utils" "6.10.0" + "@typescript-eslint/typescript-estree" "6.15.0" + "@typescript-eslint/utils" "6.15.0" debug "^4.3.4" ts-api-utils "^1.0.1" -"@typescript-eslint/types@6.10.0": - version "6.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.10.0.tgz#f4f0a84aeb2ac546f21a66c6e0da92420e921367" - integrity sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg== +"@typescript-eslint/types@6.15.0": + version "6.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.15.0.tgz#a9f7b006aee52b0948be6e03f521814bf435ddd5" + integrity sha512-yXjbt//E4T/ee8Ia1b5mGlbNj9fB9lJP4jqLbZualwpP2BCQ5is6BcWwxpIsY4XKAhmdv3hrW92GdtJbatC6dQ== "@typescript-eslint/types@6.3.0": version "6.3.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.3.0.tgz#84517f1427923e714b8418981e493b6635ab4c9d" integrity sha512-K6TZOvfVyc7MO9j60MkRNWyFSf86IbOatTKGrpTQnzarDZPYPVy0oe3myTMq7VjhfsUAbNUW8I5s+2lZvtx1gg== -"@typescript-eslint/typescript-estree@6.10.0": - version "6.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.10.0.tgz#667381eed6f723a1a8ad7590a31f312e31e07697" - integrity sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg== +"@typescript-eslint/typescript-estree@6.15.0": + version "6.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.15.0.tgz#2f8a513df1ce5e6e1ba8e5c6aa52f392ae023fc5" + integrity sha512-7mVZJN7Hd15OmGuWrp2T9UvqR2Ecg+1j/Bp1jXUEY2GZKV6FXlOIoqVDmLpBiEiq3katvj/2n2mR0SDwtloCew== dependencies: - "@typescript-eslint/types" "6.10.0" - "@typescript-eslint/visitor-keys" "6.10.0" + "@typescript-eslint/types" "6.15.0" + "@typescript-eslint/visitor-keys" "6.15.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" @@ -2620,25 +2708,25 @@ semver "^7.5.4" ts-api-utils "^1.0.1" -"@typescript-eslint/utils@6.10.0": - version "6.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.10.0.tgz#4d76062d94413c30e402c9b0df8c14aef8d77336" - integrity sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg== +"@typescript-eslint/utils@6.15.0": + version "6.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.15.0.tgz#f80dbb79f3b0f569077a8711dd44186a8933fa4c" + integrity sha512-eF82p0Wrrlt8fQSRL0bGXzK5nWPRV2dYQZdajcfzOD9+cQz9O7ugifrJxclB+xVOvWvagXfqS4Es7vpLP4augw== dependencies: "@eslint-community/eslint-utils" "^4.4.0" "@types/json-schema" "^7.0.12" "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "6.10.0" - "@typescript-eslint/types" "6.10.0" - "@typescript-eslint/typescript-estree" "6.10.0" + "@typescript-eslint/scope-manager" "6.15.0" + "@typescript-eslint/types" "6.15.0" + "@typescript-eslint/typescript-estree" "6.15.0" semver "^7.5.4" -"@typescript-eslint/visitor-keys@6.10.0": - version "6.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.10.0.tgz#b9eaf855a1ac7e95633ae1073af43d451e8f84e3" - integrity sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg== +"@typescript-eslint/visitor-keys@6.15.0": + version "6.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.15.0.tgz#5baf97a7bfeec6f4894d400437055155a46b2330" + integrity sha512-1zvtdC1a9h5Tb5jU9x3ADNXO9yjP8rXlaoChu0DQX40vf5ACVpYIVIZhIMZ6d5sDXH7vq4dsZBT1fEGj8D2n2w== dependencies: - "@typescript-eslint/types" "6.10.0" + "@typescript-eslint/types" "6.15.0" eslint-visitor-keys "^3.4.1" "@typescript-eslint/visitor-keys@6.3.0": @@ -3931,33 +4019,34 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -esbuild@^0.19.5: - version "0.19.5" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.5.tgz#53a0e19dfbf61ba6c827d51a80813cf071239a8c" - integrity sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ== +esbuild@^0.19.10: + version "0.19.10" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.10.tgz#55e83e4a6b702e3498b9f872d84bfb4ebcb6d16e" + integrity sha512-S1Y27QGt/snkNYrRcswgRFqZjaTG5a5xM3EQo97uNBnH505pdzSNe/HLBq1v0RO7iK/ngdbhJB6mDAp0OK+iUA== optionalDependencies: - "@esbuild/android-arm" "0.19.5" - "@esbuild/android-arm64" "0.19.5" - "@esbuild/android-x64" "0.19.5" - "@esbuild/darwin-arm64" "0.19.5" - "@esbuild/darwin-x64" "0.19.5" - "@esbuild/freebsd-arm64" "0.19.5" - "@esbuild/freebsd-x64" "0.19.5" - "@esbuild/linux-arm" "0.19.5" - "@esbuild/linux-arm64" "0.19.5" - "@esbuild/linux-ia32" "0.19.5" - "@esbuild/linux-loong64" "0.19.5" - "@esbuild/linux-mips64el" "0.19.5" - "@esbuild/linux-ppc64" "0.19.5" - "@esbuild/linux-riscv64" "0.19.5" - "@esbuild/linux-s390x" "0.19.5" - "@esbuild/linux-x64" "0.19.5" - "@esbuild/netbsd-x64" "0.19.5" - "@esbuild/openbsd-x64" "0.19.5" - "@esbuild/sunos-x64" "0.19.5" - "@esbuild/win32-arm64" "0.19.5" - "@esbuild/win32-ia32" "0.19.5" - "@esbuild/win32-x64" "0.19.5" + "@esbuild/aix-ppc64" "0.19.10" + "@esbuild/android-arm" "0.19.10" + "@esbuild/android-arm64" "0.19.10" + "@esbuild/android-x64" "0.19.10" + "@esbuild/darwin-arm64" "0.19.10" + "@esbuild/darwin-x64" "0.19.10" + "@esbuild/freebsd-arm64" "0.19.10" + "@esbuild/freebsd-x64" "0.19.10" + "@esbuild/linux-arm" "0.19.10" + "@esbuild/linux-arm64" "0.19.10" + "@esbuild/linux-ia32" "0.19.10" + "@esbuild/linux-loong64" "0.19.10" + "@esbuild/linux-mips64el" "0.19.10" + "@esbuild/linux-ppc64" "0.19.10" + "@esbuild/linux-riscv64" "0.19.10" + "@esbuild/linux-s390x" "0.19.10" + "@esbuild/linux-x64" "0.19.10" + "@esbuild/netbsd-x64" "0.19.10" + "@esbuild/openbsd-x64" "0.19.10" + "@esbuild/sunos-x64" "0.19.10" + "@esbuild/win32-arm64" "0.19.10" + "@esbuild/win32-ia32" "0.19.10" + "@esbuild/win32-x64" "0.19.10" escalade@^3.1.1: version "3.1.1" @@ -3990,12 +4079,12 @@ escodegen@^2.0.0: optionalDependencies: source-map "~0.6.1" -eslint-config-next@^14.0.1: - version "14.0.1" - resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.0.1.tgz#4e59cbaa1c1c72f6d7c4d9110b0902630493ef56" - integrity sha512-QfIFK2WD39H4WOespjgf6PLv9Bpsd7KGGelCtmq4l67nGvnlsGpuvj0hIT+aIy6p5gKH+lAChYILsyDlxP52yg== +eslint-config-next@^14.0.4: + version "14.0.4" + resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.0.4.tgz#7cd2c0a3b310203d41cf0dbf9d31f9b0a6235b4a" + integrity sha512-9/xbOHEQOmQtqvQ1UsTQZpnA7SlDMBtuKJ//S4JnoyK3oGLhILKXdBgu/UO7lQo/2xOykQULS1qQ6p2+EpHgAQ== dependencies: - "@next/eslint-plugin-next" "14.0.1" + "@next/eslint-plugin-next" "14.0.4" "@rushstack/eslint-patch" "^1.3.3" "@typescript-eslint/parser" "^5.4.2 || ^6.0.0" eslint-import-resolver-node "^0.3.6" @@ -4005,10 +4094,10 @@ eslint-config-next@^14.0.1: eslint-plugin-react "^7.33.2" eslint-plugin-react-hooks "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" -eslint-config-prettier@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz#eb25485946dd0c66cd216a46232dc05451518d1f" - integrity sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw== +eslint-config-prettier@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz#31af3d94578645966c082fcb71a5846d3c94867f" + integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.7: version "0.3.9" @@ -4137,15 +4226,15 @@ eslint-visitor-keys@^3.4.3: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@^8.53.0: - version "8.53.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.53.0.tgz#14f2c8244298fcae1f46945459577413ba2697ce" - integrity sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag== +eslint@^8.56.0: + version "8.56.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.56.0.tgz#4957ce8da409dc0809f99ab07a1b94832ab74b15" + integrity sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.3" - "@eslint/js" "8.53.0" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.56.0" "@humanwhocodes/config-array" "^0.11.13" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" @@ -4282,7 +4371,18 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@3.3.1, fast-glob@^3.2.12, fast-glob@^3.2.9, fast-glob@^3.3.1: +fast-glob@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + 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-glob@^3.2.12, fast-glob@^3.2.9, fast-glob@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== @@ -4585,7 +4685,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -5911,28 +6011,29 @@ next-sitemap@^4.2.3: fast-glob "^3.2.12" minimist "^1.2.8" -next@^14.0.1: - version "14.0.1" - resolved "https://registry.yarnpkg.com/next/-/next-14.0.1.tgz#1375d94c5dc7af730234af48401be270e975cb22" - integrity sha512-s4YaLpE4b0gmb3ggtmpmV+wt+lPRuGtANzojMQ2+gmBpgX9w5fTbjsy6dXByBuENsdCX5pukZH/GxdFgO62+pA== +next@^14.0.4: + version "14.0.4" + resolved "https://registry.yarnpkg.com/next/-/next-14.0.4.tgz#bf00b6f835b20d10a5057838fa2dfced1d0d84dc" + integrity sha512-qbwypnM7327SadwFtxXnQdGiKpkuhaRLE2uq62/nRul9cj9KhQ5LhHmlziTNqUidZotw/Q1I9OjirBROdUJNgA== dependencies: - "@next/env" "14.0.1" + "@next/env" "14.0.4" "@swc/helpers" "0.5.2" busboy "1.6.0" caniuse-lite "^1.0.30001406" + graceful-fs "^4.2.11" postcss "8.4.31" styled-jsx "5.1.1" watchpack "2.4.0" optionalDependencies: - "@next/swc-darwin-arm64" "14.0.1" - "@next/swc-darwin-x64" "14.0.1" - "@next/swc-linux-arm64-gnu" "14.0.1" - "@next/swc-linux-arm64-musl" "14.0.1" - "@next/swc-linux-x64-gnu" "14.0.1" - "@next/swc-linux-x64-musl" "14.0.1" - "@next/swc-win32-arm64-msvc" "14.0.1" - "@next/swc-win32-ia32-msvc" "14.0.1" - "@next/swc-win32-x64-msvc" "14.0.1" + "@next/swc-darwin-arm64" "14.0.4" + "@next/swc-darwin-x64" "14.0.4" + "@next/swc-linux-arm64-gnu" "14.0.4" + "@next/swc-linux-arm64-musl" "14.0.4" + "@next/swc-linux-x64-gnu" "14.0.4" + "@next/swc-linux-x64-musl" "14.0.4" + "@next/swc-win32-arm64-msvc" "14.0.4" + "@next/swc-win32-ia32-msvc" "14.0.4" + "@next/swc-win32-x64-msvc" "14.0.4" node-int64@^0.4.0: version "0.4.0" @@ -6220,10 +6321,10 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prettier@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.0.3.tgz#432a51f7ba422d1469096c0fdc28e235db8f9643" - integrity sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg== +prettier@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.1.1.tgz#6ba9f23165d690b6cbdaa88cb0807278f7019848" + integrity sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw== pretty-bytes@^5.3.0, pretty-bytes@^5.4.1: version "5.6.0" @@ -7158,47 +7259,47 @@ tslib@^2.0.0, tslib@^2.1.0, tslib@^2.4.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.1.tgz#fd8c9a0ff42590b25703c0acb3de3d3f4ede0410" integrity sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig== -turbo-darwin-64@1.10.16: - version "1.10.16" - resolved "https://registry.yarnpkg.com/turbo-darwin-64/-/turbo-darwin-64-1.10.16.tgz#5a8717c1372f2a75e8cfe0b4b6455119ce410b19" - integrity sha512-+Jk91FNcp9e9NCLYlvDDlp2HwEDp14F9N42IoW3dmHI5ZkGSXzalbhVcrx3DOox3QfiNUHxzWg4d7CnVNCuuMg== - -turbo-darwin-arm64@1.10.16: - version "1.10.16" - resolved "https://registry.yarnpkg.com/turbo-darwin-arm64/-/turbo-darwin-arm64-1.10.16.tgz#19b5b63acf7ee0fce7e1fe5850e093c2ac9c73f5" - integrity sha512-jqGpFZipIivkRp/i+jnL8npX0VssE6IAVNKtu573LXtssZdV/S+fRGYA16tI46xJGxSAivrZ/IcgZrV6Jk80bw== - -turbo-linux-64@1.10.16: - version "1.10.16" - resolved "https://registry.yarnpkg.com/turbo-linux-64/-/turbo-linux-64-1.10.16.tgz#ee97c0011553a96bd7995e7bcc6e65aab8996798" - integrity sha512-PpqEZHwLoizQ6sTUvmImcRmACyRk9EWLXGlqceogPZsJ1jTRK3sfcF9fC2W56zkSIzuLEP07k5kl+ZxJd8JMcg== - -turbo-linux-arm64@1.10.16: - version "1.10.16" - resolved "https://registry.yarnpkg.com/turbo-linux-arm64/-/turbo-linux-arm64-1.10.16.tgz#2723cc2a846d89df7484002161b25673f4f04009" - integrity sha512-TMjFYz8to1QE0fKVXCIvG/4giyfnmqcQIwjdNfJvKjBxn22PpbjeuFuQ5kNXshUTRaTJihFbuuCcb5OYFNx4uw== - -turbo-windows-64@1.10.16: - version "1.10.16" - resolved "https://registry.yarnpkg.com/turbo-windows-64/-/turbo-windows-64-1.10.16.tgz#87c46a78502a86dec73634b255a6b3471285969b" - integrity sha512-+jsf68krs0N66FfC4/zZvioUap/Tq3sPFumnMV+EBo8jFdqs4yehd6+MxIwYTjSQLIcpH8KoNMB0gQYhJRLZzw== - -turbo-windows-arm64@1.10.16: - version "1.10.16" - resolved "https://registry.yarnpkg.com/turbo-windows-arm64/-/turbo-windows-arm64-1.10.16.tgz#a6208c2bc27e5e6ef0aa4a3e64389c4285c3f274" - integrity sha512-sKm3hcMM1bl0B3PLG4ifidicOGfoJmOEacM5JtgBkYM48ncMHjkHfFY7HrJHZHUnXM4l05RQTpLFoOl/uIo2HQ== - -turbo@^1.10.16: - version "1.10.16" - resolved "https://registry.yarnpkg.com/turbo/-/turbo-1.10.16.tgz#51601a65a3aa56d1b9d9cb9a2ab3a5a2eab41e19" - integrity sha512-2CEaK4FIuSZiP83iFa9GqMTQhroW2QryckVqUydmg4tx78baftTOS0O+oDAhvo9r9Nit4xUEtC1RAHoqs6ZEtg== +turbo-darwin-64@1.11.2: + version "1.11.2" + resolved "https://registry.yarnpkg.com/turbo-darwin-64/-/turbo-darwin-64-1.11.2.tgz#fc3d4d74b325a27aef11b6a52a61f07d466846b9" + integrity sha512-toFmRG/adriZY3hOps7nYCfqHAS+Ci6xqgX3fbo82kkLpC6OBzcXnleSwuPqjHVAaRNhVoB83L5njcE9Qwi2og== + +turbo-darwin-arm64@1.11.2: + version "1.11.2" + resolved "https://registry.yarnpkg.com/turbo-darwin-arm64/-/turbo-darwin-arm64-1.11.2.tgz#583a4d0025bc3f953a9eeb7065cb173f481a9965" + integrity sha512-FCsEDZ8BUSFYEOSC3rrARQrj7x2VOrmVcfrMUIhexTxproRh4QyMxLfr6LALk4ymx6jbDCxWa6Szal8ckldFbA== + +turbo-linux-64@1.11.2: + version "1.11.2" + resolved "https://registry.yarnpkg.com/turbo-linux-64/-/turbo-linux-64-1.11.2.tgz#55ef996d856cb397b9fb2855a554ccef1cee9dd7" + integrity sha512-Vzda/o/QyEske5CxLf0wcu7UUS+7zB90GgHZV4tyN+WZtoouTvbwuvZ3V6b5Wgd3OJ/JwWR0CXDK7Sf4VEMr7A== + +turbo-linux-arm64@1.11.2: + version "1.11.2" + resolved "https://registry.yarnpkg.com/turbo-linux-arm64/-/turbo-linux-arm64-1.11.2.tgz#64d6093c9a2f32f410624564fd10685c847d947e" + integrity sha512-bRLwovQRz0yxDZrM4tQEAYV0fBHEaTzUF0JZ8RG1UmZt/CqtpnUrJpYb1VK8hj1z46z9YehARpYCwQ2K0qU4yw== + +turbo-windows-64@1.11.2: + version "1.11.2" + resolved "https://registry.yarnpkg.com/turbo-windows-64/-/turbo-windows-64-1.11.2.tgz#f4164be9c42796c86ca3929e27f1992a4310b9ed" + integrity sha512-LgTWqkHAKgyVuLYcEPxZVGPInTjjeCnN5KQMdJ4uQZ+xMDROvMFS2rM93iQl4ieDJgidwHCxxCxaU9u8c3d/Kg== + +turbo-windows-arm64@1.11.2: + version "1.11.2" + resolved "https://registry.yarnpkg.com/turbo-windows-arm64/-/turbo-windows-arm64-1.11.2.tgz#ca1b4d7ac6fe8c931baef1a270ac07bbd924277b" + integrity sha512-829aVBU7IX0c/B4G7g1VI8KniAGutHhIupkYMgF6xPkYVev2G3MYe6DMS/vsLt9GGM9ulDtdWxWrH5P2ngK8IQ== + +turbo@^1.11.2: + version "1.11.2" + resolved "https://registry.yarnpkg.com/turbo/-/turbo-1.11.2.tgz#7bae6df12c210e9b12973aad8f0e7b077039d4ce" + integrity sha512-jPC7LVQJzebs5gWf8FmEvsvXGNyKbN+O9qpvv98xpNaM59aS0/Irhd0H0KbcqnXfsz7ETlzOC3R+xFWthC4Z8A== optionalDependencies: - turbo-darwin-64 "1.10.16" - turbo-darwin-arm64 "1.10.16" - turbo-linux-64 "1.10.16" - turbo-linux-arm64 "1.10.16" - turbo-windows-64 "1.10.16" - turbo-windows-arm64 "1.10.16" + turbo-darwin-64 "1.11.2" + turbo-darwin-arm64 "1.11.2" + turbo-linux-64 "1.11.2" + turbo-linux-arm64 "1.11.2" + turbo-windows-64 "1.11.2" + turbo-windows-arm64 "1.11.2" type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" @@ -7266,10 +7367,10 @@ typed-array-length@^1.0.4: for-each "^0.3.3" is-typed-array "^1.1.9" -typescript@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" - integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== +typescript@^5.3.3: + version "5.3.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" + integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== unbox-primitive@^1.0.2: version "1.0.2" From 3bf88a17e6175d2f2da4e794818f7b760ecf6248 Mon Sep 17 00:00:00 2001 From: Ionut-Cristian Florescu Date: Sat, 23 Dec 2023 12:55:54 +0200 Subject: [PATCH 7/7] Update docs website --- docs/components/homePage/HomePageSubtitle.tsx | 11 ++++++++--- docs/pages/mantine-v7-support.tsx | 12 ++++++------ 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/docs/components/homePage/HomePageSubtitle.tsx b/docs/components/homePage/HomePageSubtitle.tsx index 306859d..c1edb32 100644 --- a/docs/components/homePage/HomePageSubtitle.tsx +++ b/docs/components/homePage/HomePageSubtitle.tsx @@ -1,6 +1,6 @@ import { Anchor, Text, createStyles } from '@mantine/core'; import { IconArrowDown, IconDiscountCheck, IconExclamationCircle } from '@tabler/icons-react'; -import InternalLink from '../InternalLink'; +import ExternalLink from '../ExternalLink'; const useStyles = createStyles((theme) => ({ root: { @@ -56,8 +56,13 @@ export default function HomePageSubtitle() {
    - supports Mantine V6; support for Mantine V7 is{' '} - under development ⏳ + This version supports Mantine V6. +
    + If you use Mantine V7, check out{' '} + + Mantine DataTable V7 + + .
    diff --git a/docs/pages/mantine-v7-support.tsx b/docs/pages/mantine-v7-support.tsx index b948b0d..2fb02a2 100644 --- a/docs/pages/mantine-v7-support.tsx +++ b/docs/pages/mantine-v7-support.tsx @@ -3,7 +3,7 @@ import ExternalLink from '~/components/ExternalLink'; import PageNavigation from '~/components/PageNavigation'; import PageText from '~/components/PageText'; import PageTitle from '~/components/PageTitle'; -import { MANTINE_LINK, SPONSOR_LINK } from '~/config'; +import { MANTINE_LINK } from '~/config'; const PATH = 'mantine-v7-support'; @@ -11,14 +11,14 @@ export default function Page() { return ( + + If you are using Mantine V7, please use{' '} + Mantine DataTable V7. + Mantine DataTable V6 supports Mantine V6.
    - Mantine V7 support is under development. You can help speed up - the process by sponsoring me on GitHub. -
    - - If you are using Mantine V7, please use{' '} + Mantine V7 is supported by{' '} Mantine DataTable V7.