From 1f9168ad5ce5b679250333f04b61a403791712cb Mon Sep 17 00:00:00 2001 From: Jaleel Bennett Date: Mon, 25 Dec 2023 21:49:59 -0500 Subject: [PATCH] refactor(tag-input): extract subcomponents for improved modularity --- components/sections/hero.tsx | 3 +- components/sections/props.tsx | 2 +- components/sections/variants.tsx | 895 +++++++++++++------------ components/tag-input.tsx | 1054 ------------------------------ components/tag/tag-input.tsx | 423 ++++++++++++ components/ui/command.tsx | 54 +- pnpm-lock.yaml | 462 ++++++++----- 7 files changed, 1232 insertions(+), 1661 deletions(-) delete mode 100644 components/tag-input.tsx create mode 100644 components/tag/tag-input.tsx diff --git a/components/sections/hero.tsx b/components/sections/hero.tsx index 92f0a90..d9ade61 100644 --- a/components/sections/hero.tsx +++ b/components/sections/hero.tsx @@ -7,7 +7,7 @@ import { FormLabel, FormMessage, } from "@/components/ui/form"; -import { Tag, TagInput } from "@/components/tag-input"; +import { Tag, TagInput } from "@/components/tag/tag-input"; import Link from "next/link"; import { Button, buttonVariants } from "@/components/ui/button"; import { z } from "zod"; @@ -97,6 +97,7 @@ export default function Hero() { placeholder="Enter a topic" tags={tags} className="sm:min-w-[450px]" + usePopoverForTags setTags={(newTags) => { setTags(newTags); setValue("topics", newTags as [Tag, ...Tag[]]); diff --git a/components/sections/props.tsx b/components/sections/props.tsx index 0624c53..1dd252f 100644 --- a/components/sections/props.tsx +++ b/components/sections/props.tsx @@ -1,5 +1,5 @@ import React from "react"; -import { Tag, TagInput } from "../tag-input"; +import { Tag, TagInput } from "../tag/tag-input"; import { Label } from "../ui/label"; import { Table, diff --git a/components/sections/variants.tsx b/components/sections/variants.tsx index b63cbbd..7962523 100644 --- a/components/sections/variants.tsx +++ b/components/sections/variants.tsx @@ -1,421 +1,482 @@ -import { - Tabs, - TabsContent, - TabsList, - TabsTrigger, -} from "@/components/ui/tabs" +import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import React from "react"; -import { Tag, TagInput } from "../tag-input"; +import { Tag, TagInput } from "../tag/tag-input"; import { cn } from "@/lib/utils"; -import { v4 as uuid } from 'uuid'; +import { v4 as uuid } from "uuid"; -export default function Variants(){ +export default function Variants() { + const tags: Tag[] = [ + { id: uuid(), text: "Sports" }, + { id: uuid(), text: "Travel" }, + { id: uuid(), text: "Programming" }, + ]; + const [variantTags, setVariantTags] = React.useState(tags); + const [sizeTags, setSizeTags] = React.useState(tags); + const [shapeTags, setShapeTags] = React.useState(tags); + const [borderTags, setBorderTags] = React.useState(tags); + const [textCaseTags, setTextCaseTags] = React.useState(tags); + const [interactionTags, setInteractionTags] = React.useState(tags); + const [animationTags, setAnimationTags] = React.useState(tags); + const [textStyleTags, setTextStyleTags] = React.useState(tags); - const tags: Tag[] = [ - {id: uuid(), text: "Sports"}, - {id: uuid(), text: "Travel"}, - {id: uuid(), text: "Programming"}, - ]; - const [variantTags, setVariantTags] = React.useState(tags); - const [sizeTags, setSizeTags] = React.useState(tags); - const [shapeTags, setShapeTags] = React.useState(tags); - const [borderTags, setBorderTags] = React.useState(tags); - const [textCaseTags, setTextCaseTags] = React.useState(tags); - const [interactionTags, setInteractionTags] = React.useState(tags); - const [animationTags, setAnimationTags] = React.useState(tags); - const [textStyleTags, setTextStyleTags] = React.useState(tags); - - - return ( -
-

Variants

-
-

Variant

-

Choose from different visual styles like default, primary, and destructive.

- - - Default - Primary - Destructive - - - { - setVariantTags(newTags); - }} - /> - - - { - setVariantTags(newTags); - }} - /> - - - { - setVariantTags(newTags); - }} - /> - - -
-
-

Size

-

Adjust the size of the tags.

- - - Small - Medium - Large - X-Large - - - { - setSizeTags(newTags); - }} - /> - - - { - setSizeTags(newTags); - }} - /> - - - { - setSizeTags(newTags); - }} - /> - - - { - setSizeTags(newTags); - }} - /> - - -
-
-

Shape

-

Customize the shape of the tags.

- - - Default - Square - Rounded - Pill - - - { - setShapeTags(newTags); - }} - /> - - - { - setShapeTags(newTags); - }} - /> - - - { - setShapeTags(newTags); - }} - /> - - - { - setShapeTags(newTags); - }} - /> - - -
-
-

Border styles

-

Choose between different border styles or opt for no border at all.

- - - Default - No border - - - { - setBorderTags(newTags); - }} - /> - - - { - setBorderTags(newTags); - }} - /> - - -
-
-

Text case

-

Control the text casing within the tags.

- - - Capitalize - Uppercase - Lowercase - - - { - setTextCaseTags(newTags); - }} - /> - - - { - setTextCaseTags(newTags); - }} - /> - - - { - setTextCaseTags(newTags); - }} - /> - - -
-
-

Interaction

-

Define the interaction style of the tags. Make them clickable or non-clickable.

- - - Clickable - Non-Clickable - - - { - setInteractionTags(newTags); - }} - /> - - - { - setInteractionTags(newTags); - }} - /> - - -
-
-

Animations

-

Add animations on render for tags.

- - - None - Bounce - Fade-in - Slide-in - - - { - setAnimationTags(newTags); - }} - /> - - - { - setAnimationTags(newTags); - }} - /> - - - { - setAnimationTags(newTags); - }} - /> - - - { - setAnimationTags(newTags); - }} - /> - - -
-
-

Text styles

-

Customize the text style within the tags.

- - - Normal - Bold - Italic - Underline - Line through - - - { - setTextStyleTags(newTags); - }} - /> - - - { - setTextStyleTags(newTags); - }} - /> - - - { - setTextStyleTags(newTags); - }} - /> - - - { - setTextStyleTags(newTags); - }} - /> - - - { - setTextStyleTags(newTags); - }} - /> - - -
-
- ) -} \ No newline at end of file + return ( +
+

+ Variants +

+
+

+ Variant +

+

+ Choose from different visual styles like default, primary, and + destructive. +

+ + + Default + Primary + Destructive + + + { + setVariantTags(newTags); + }} + /> + + + { + setVariantTags(newTags); + }} + /> + + + { + setVariantTags(newTags); + }} + /> + + +
+
+

+ Size +

+

+ Adjust the size of the tags. +

+ + + Small + Medium + Large + X-Large + + + { + setSizeTags(newTags); + }} + /> + + + { + setSizeTags(newTags); + }} + /> + + + { + setSizeTags(newTags); + }} + /> + + + { + setSizeTags(newTags); + }} + /> + + +
+
+

+ Shape +

+

+ Customize the shape of the tags. +

+ + + Default + Square + Rounded + Pill + + + { + setShapeTags(newTags); + }} + /> + + + { + setShapeTags(newTags); + }} + /> + + + { + setShapeTags(newTags); + }} + /> + + + { + setShapeTags(newTags); + }} + /> + + +
+
+

+ Border styles +

+

+ Choose between different border styles or opt for no border at all. +

+ + + Default + No border + + + { + setBorderTags(newTags); + }} + /> + + + { + setBorderTags(newTags); + }} + /> + + +
+
+

+ Text case +

+

+ Control the text casing within the tags. +

+ + + Capitalize + Uppercase + Lowercase + + + { + setTextCaseTags(newTags); + }} + /> + + + { + setTextCaseTags(newTags); + }} + /> + + + { + setTextCaseTags(newTags); + }} + /> + + +
+
+

+ Interaction +

+

+ Define the interaction style of the tags. Make them clickable or + non-clickable. +

+ + + Clickable + Non-Clickable + + + { + setInteractionTags(newTags); + }} + /> + + + { + setInteractionTags(newTags); + }} + /> + + +
+
+

+ Animations +

+

+ Add animations on render for tags. +

+ + + None + Bounce + Fade-in + Slide-in + + + { + setAnimationTags(newTags); + }} + /> + + + { + setAnimationTags(newTags); + }} + /> + + + { + setAnimationTags(newTags); + }} + /> + + + { + setAnimationTags(newTags); + }} + /> + + +
+
+

+ Text styles +

+

+ Customize the text style within the tags. +

+ + + Normal + Bold + Italic + Underline + Line through + + + { + setTextStyleTags(newTags); + }} + /> + + + { + setTextStyleTags(newTags); + }} + /> + + + { + setTextStyleTags(newTags); + }} + /> + + + { + setTextStyleTags(newTags); + }} + /> + + + { + setTextStyleTags(newTags); + }} + /> + + +
+
+ ); +} diff --git a/components/tag-input.tsx b/components/tag-input.tsx deleted file mode 100644 index 39e24bc..0000000 --- a/components/tag-input.tsx +++ /dev/null @@ -1,1054 +0,0 @@ -// import React from "react"; -// import { Input } from "./ui/input"; -// import { Button } from "./ui/button"; -// import { X } from "lucide-react"; -// import { cn } from "@/lib/utils"; -// import { cva, type VariantProps } from "class-variance-authority"; -// import { -// Command, -// CommandEmpty, -// CommandGroup, -// CommandInput, -// CommandItem, -// CommandList, -// } from "@/components/ui/command"; -// import { toast } from "./ui/use-toast"; -// import { v4 as uuid } from "uuid"; -// import { Popover, PopoverContent, PopoverTrigger } from "./ui/popover"; - -// const tagVariants = cva( -// "transition-all border inline-flex items-center text-sm pl-2 rounded-md", -// { -// variants: { -// variant: { -// default: "bg-secondary text-secondary-foreground hover:bg-secondary/80", -// primary: -// "bg-primary border-primary text-primary-foreground hover:bg-primary/90", -// destructive: -// "bg-destructive border-destructive text-destructive-foreground hover:bg-destructive/90", -// }, -// size: { -// sm: "text-xs h-7", -// md: "text-sm h-8", -// lg: "text-base h-9", -// xl: "text-lg h-10", -// }, -// shape: { -// default: "rounded-sm", -// rounded: "rounded-lg", -// square: "rounded-none", -// pill: "rounded-full", -// }, -// borderStyle: { -// default: "border-solid", -// none: "border-none", -// }, -// textCase: { -// uppercase: "uppercase", -// lowercase: "lowercase", -// capitalize: "capitalize", -// }, -// interaction: { -// clickable: "cursor-pointer hover:shadow-md", -// nonClickable: "cursor-default", -// }, -// animation: { -// none: "", -// fadeIn: "animate-fadeIn", -// slideIn: "animate-slideIn", -// bounce: "animate-bounce", -// }, -// textStyle: { -// normal: "font-normal", -// bold: "font-bold", -// italic: "italic", -// underline: "underline", -// lineThrough: "line-through", -// }, -// }, -// defaultVariants: { -// variant: "default", -// size: "md", -// shape: "default", -// borderStyle: "default", -// textCase: "capitalize", -// interaction: "nonClickable", -// animation: "fadeIn", -// textStyle: "normal", -// }, -// } -// ); - -// export enum Delimiter { -// Comma = ",", -// Enter = "Enter", -// Space = " ", -// } - -// type OmittedInputProps = Omit< -// React.InputHTMLAttributes, -// "size" | "value" -// >; - -// export type Tag = { -// id: string; -// text: string; -// }; - -// export interface TagInputProps -// extends OmittedInputProps, -// VariantProps { -// placeholder?: string; -// tags: Tag[]; -// setTags: React.Dispatch>; -// enableAutocomplete?: boolean; -// autocompleteOptions?: Tag[]; -// maxTags?: number; -// minTags?: number; -// readOnly?: boolean; -// disabled?: boolean; -// onTagAdd?: (tag: string) => void; -// onTagRemove?: (tag: string) => void; -// allowDuplicates?: boolean; -// validateTag?: (tag: string) => boolean; -// delimiter?: Delimiter; -// showCount?: boolean; -// placeholderWhenFull?: string; -// sortTags?: boolean; -// delimiterList?: string[]; -// truncate?: number; -// minLength?: number; -// maxLength?: number; -// usePopoverForTags?: boolean; -// value?: string | number | readonly string[] | { id: string; text: string }[]; -// autocompleteFilter?: (option: string) => boolean; -// direction?: "row" | "column"; -// onInputChange?: (value: string) => void; -// customTagRenderer?: (tag: Tag) => React.ReactNode; -// onFocus?: React.FocusEventHandler; -// onBlur?: React.FocusEventHandler; -// onTagClick?: (tag: Tag) => void; -// draggable?: boolean; -// inputFieldPostion?: "bottom" | "top" | "inline"; -// clearAll?: boolean; -// onClearAll?: () => void; -// inputProps?: React.InputHTMLAttributes; -// } - -// const TagInput = React.forwardRef( -// (props, ref) => { -// const { -// id, -// placeholder, -// tags, -// setTags, -// variant, -// size, -// shape, -// className, -// enableAutocomplete, -// autocompleteOptions, -// maxTags, -// delimiter = Delimiter.Comma, -// onTagAdd, -// onTagRemove, -// allowDuplicates, -// showCount, -// validateTag, -// placeholderWhenFull = "Max tags reached", -// sortTags, -// delimiterList, -// truncate, -// autocompleteFilter, -// borderStyle, -// textCase, -// interaction, -// animation, -// textStyle, -// minLength, -// maxLength, -// direction = "row", -// onInputChange, -// customTagRenderer, -// onFocus, -// onBlur, -// onTagClick, -// draggable = false, -// inputFieldPostion = "bottom", -// clearAll = false, -// onClearAll, -// usePopoverForTags = false, -// inputProps = {}, -// } = props; - -// const [inputValue, setInputValue] = React.useState(""); -// const [tagCount, setTagCount] = React.useState(Math.max(0, tags.length)); -// const inputRef = React.useRef(null); -// const [draggedTagId, setDraggedTagId] = React.useState(null); - -// if ( -// (maxTags !== undefined && maxTags < 0) || -// (props.minTags !== undefined && props.minTags < 0) -// ) { -// console.warn("maxTags and minTags cannot be less than 0"); -// toast({ -// title: "maxTags and minTags cannot be less than 0", -// description: -// "Please set maxTags and minTags to a value greater than or equal to 0", -// variant: "destructive", -// }); -// return null; -// } - -// const handleInputChange = (e: React.ChangeEvent) => { -// const newValue = e.target.value; -// setInputValue(newValue); -// onInputChange?.(newValue); -// }; - -// const handleKeyDown = (e: React.KeyboardEvent) => { -// if ( -// delimiterList -// ? delimiterList.includes(e.key) -// : e.key === delimiter || e.key === Delimiter.Enter -// ) { -// e.preventDefault(); -// const newTagText = inputValue.trim(); - -// if (validateTag && !validateTag(newTagText)) { -// return; -// } - -// if (minLength && newTagText.length < minLength) { -// console.warn("Tag is too short"); -// toast({ -// title: "Tag is too short", -// description: "Please enter a tag with more characters", -// variant: "destructive", -// }); -// return; -// } - -// // Validate maxLength -// if (maxLength && newTagText.length > maxLength) { -// toast({ -// title: "Tag is too long", -// description: "Please enter a tag with less characters", -// variant: "destructive", -// }); -// console.warn("Tag is too long"); -// return; -// } - -// const newTagId = uuid(); - -// if ( -// newTagText && -// (allowDuplicates || !tags.some((tag) => tag.text === newTagText)) && -// (maxTags === undefined || tags.length < maxTags) -// ) { -// setTags([...tags, { id: newTagId, text: newTagText }]); -// onTagAdd?.(newTagText); -// setTagCount((prevTagCount) => prevTagCount + 1); -// } -// setInputValue(""); -// } -// }; - -// const removeTag = (idToRemove: string) => { -// setTags(tags.filter((tag) => tag.id !== idToRemove)); -// onTagRemove?.(tags.find((tag) => tag.id === idToRemove)?.text || ""); -// setTagCount((prevTagCount) => prevTagCount - 1); -// }; - -// const handleDragStart = (id: string) => { -// setDraggedTagId(id); -// }; - -// const handleDragOver = (e: React.DragEvent) => { -// e.preventDefault(); // Necessary to allow dropping -// }; - -// const handleDrop = (id: string) => { -// if (draggedTagId === null) return; - -// const draggedTagIndex = tags.findIndex((tag) => tag.id === draggedTagId); -// const dropTargetIndex = tags.findIndex((tag) => tag.id === id); - -// if (draggedTagIndex === dropTargetIndex) return; - -// const newTags = [...tags]; -// const [reorderedTag] = newTags.splice(draggedTagIndex, 1); -// newTags.splice(dropTargetIndex, 0, reorderedTag); - -// setTags(newTags); -// setDraggedTagId(null); -// }; - -// const handleClearAll = () => { -// onClearAll?.(); -// }; - -// const filteredAutocompleteOptions = autocompleteFilter -// ? autocompleteOptions?.filter((option) => autocompleteFilter(option.text)) -// : autocompleteOptions; - -// const displayedTags = sortTags ? [...tags].sort() : tags; - -// const truncatedTags = truncate -// ? tags.map((tag) => ({ -// id: tag.id, -// text: -// tag.text?.length > truncate -// ? `${tag.text.substring(0, truncate)}...` -// : tag.text, -// })) -// : displayedTags; - -// const renderTags = () => { -// return ( - -// ) -// } - -// return ( -//
-// {usePopoverForTags ? ( -// -// -//
{"hi"}
-//
-//
-// ) : ( -//
-// {truncatedTags.map((tagObj) => -// customTagRenderer ? ( -// customTagRenderer(tagObj) -// ) : ( -// handleDragStart(tagObj.id)} -// onDragOver={handleDragOver} -// onDrop={() => handleDrop(tagObj.id)} -// className={cn( -// tagVariants({ -// variant, -// size, -// shape, -// borderStyle, -// textCase, -// interaction, -// animation, -// textStyle, -// }), -// { -// "justify-between": direction === "column", -// "cursor-pointer": draggable, -// } -// )} -// onClick={() => onTagClick?.(tagObj)} -// > -// {tagObj.text} -// -// -// ) -// )} -//
-// )} -// {enableAutocomplete ? ( -//
-// -// = maxTags -// ? placeholderWhenFull -// : placeholder -// } -// ref={inputRef} -// value={inputValue} -// disabled={maxTags !== undefined && tags.length >= maxTags} -// onFocus={onFocus} -// onChangeCapture={handleInputChange} -// onKeyDown={handleKeyDown} -// onBlur={onBlur} -// /> -// -// No results found. -// -// {filteredAutocompleteOptions?.map((optionObj) => ( -// = maxTags -// ? "cursor-not-allowed" -// : "cursor-pointer" -// }`} -// > -//
= maxTags -// ? "cursor-not-allowed" -// : "cursor-pointer" -// }`} -// onClick={() => { -// if ( -// optionObj.text && -// (allowDuplicates || -// !tags.some( -// (tag) => tag.text === optionObj.text -// )) && -// (maxTags === undefined || tags.length < maxTags) -// ) { -// setTags([...tags, optionObj]); -// onTagAdd?.(optionObj.text); -// setTagCount((prevTagCount) => prevTagCount + 1); -// } -// }} -// > -// {optionObj.text} -//
-//
-// ))} -//
-//
-//
-// {maxTags && ( -//
-// -// {`${tagCount}`}/{`${maxTags}`} -// -//
-// )} -//
-// ) : ( -//
-// = maxTags -// ? placeholderWhenFull -// : placeholder -// } -// value={inputValue} -// onChange={handleInputChange} -// onKeyDown={handleKeyDown} -// onFocus={onFocus} -// onBlur={onBlur} -// {...inputProps} -// className={className} -// autoComplete={enableAutocomplete ? "on" : "off"} -// list={enableAutocomplete ? "autocomplete-options" : undefined} -// disabled={maxTags !== undefined && tags.length >= maxTags} -// /> -// {showCount && maxTags && ( -//
-// -// {`${tagCount}`}/{`${maxTags}`} -// -//
-// )} -//
-// )} -// {clearAll && ( -// -// )} -//
-// ); -// } -// ); - -// TagInput.displayName = "TagInput"; - -// export { TagInput }; - -import React from "react"; -import { Input } from "./ui/input"; -import { Button } from "./ui/button"; -import { X } from "lucide-react"; -import { cn } from "@/lib/utils"; -import { cva, type VariantProps } from "class-variance-authority"; -import { - Command, - CommandEmpty, - CommandGroup, - CommandInput, - CommandItem, - CommandList, -} from "@/components/ui/command"; -import { toast } from "./ui/use-toast"; -import { v4 as uuid } from "uuid"; -import { Popover, PopoverContent, PopoverTrigger } from "./ui/popover"; - -const tagVariants = cva( - "transition-all border inline-flex items-center text-sm pl-2 rounded-md", - { - variants: { - variant: { - default: "bg-secondary text-secondary-foreground hover:bg-secondary/80", - primary: - "bg-primary border-primary text-primary-foreground hover:bg-primary/90", - destructive: - "bg-destructive border-destructive text-destructive-foreground hover:bg-destructive/90", - }, - size: { - sm: "text-xs h-7", - md: "text-sm h-8", - lg: "text-base h-9", - xl: "text-lg h-10", - }, - shape: { - default: "rounded-sm", - rounded: "rounded-lg", - square: "rounded-none", - pill: "rounded-full", - }, - borderStyle: { - default: "border-solid", - none: "border-none", - }, - textCase: { - uppercase: "uppercase", - lowercase: "lowercase", - capitalize: "capitalize", - }, - interaction: { - clickable: "cursor-pointer hover:shadow-md", - nonClickable: "cursor-default", - }, - animation: { - none: "", - fadeIn: "animate-fadeIn", - slideIn: "animate-slideIn", - bounce: "animate-bounce", - }, - textStyle: { - normal: "font-normal", - bold: "font-bold", - italic: "italic", - underline: "underline", - lineThrough: "line-through", - }, - }, - defaultVariants: { - variant: "default", - size: "md", - shape: "default", - borderStyle: "default", - textCase: "capitalize", - interaction: "nonClickable", - animation: "fadeIn", - textStyle: "normal", - }, - } -); - -export enum Delimiter { - Comma = ",", - Enter = "Enter", - Space = " ", -} - -type OmittedInputProps = Omit< - React.InputHTMLAttributes, - "size" | "value" ->; - -export type Tag = { - id: string; - text: string; -}; - -export interface TagInputProps - extends OmittedInputProps, - VariantProps { - placeholder?: string; - tags: Tag[]; - setTags: React.Dispatch>; - enableAutocomplete?: boolean; - autocompleteOptions?: Tag[]; - maxTags?: number; - minTags?: number; - readOnly?: boolean; - disabled?: boolean; - onTagAdd?: (tag: string) => void; - onTagRemove?: (tag: string) => void; - allowDuplicates?: boolean; - validateTag?: (tag: string) => boolean; - delimiter?: Delimiter; - showCount?: boolean; - placeholderWhenFull?: string; - sortTags?: boolean; - delimiterList?: string[]; - truncate?: number; - minLength?: number; - maxLength?: number; - usePopoverForTags?: boolean; - value?: string | number | readonly string[] | { id: string; text: string }[]; - autocompleteFilter?: (option: string) => boolean; - direction?: "row" | "column"; - onInputChange?: (value: string) => void; - customTagRenderer?: (tag: Tag) => React.ReactNode; - onFocus?: React.FocusEventHandler; - onBlur?: React.FocusEventHandler; - onTagClick?: (tag: Tag) => void; - draggable?: boolean; - inputFieldPostion?: "bottom" | "top" | "inline"; - clearAll?: boolean; - onClearAll?: () => void; - inputProps?: React.InputHTMLAttributes; -} - -const TagInput = React.forwardRef( - (props, ref) => { - const { - id, - placeholder, - tags, - setTags, - variant, - size, - shape, - className, - enableAutocomplete, - autocompleteOptions, - maxTags, - delimiter = Delimiter.Comma, - onTagAdd, - onTagRemove, - allowDuplicates, - showCount, - validateTag, - placeholderWhenFull = "Max tags reached", - sortTags, - delimiterList, - truncate, - autocompleteFilter, - borderStyle, - textCase, - interaction, - animation, - textStyle, - minLength, - maxLength, - direction = "row", - onInputChange, - customTagRenderer, - onFocus, - onBlur, - onTagClick, - draggable = false, - inputFieldPostion = "bottom", - clearAll = false, - onClearAll, - usePopoverForTags = false, - inputProps = {}, - } = props; - - const [inputValue, setInputValue] = React.useState(""); - const [tagCount, setTagCount] = React.useState(Math.max(0, tags.length)); - const inputRef = React.useRef(null); - const [draggedTagId, setDraggedTagId] = React.useState(null); - - if ( - (maxTags !== undefined && maxTags < 0) || - (props.minTags !== undefined && props.minTags < 0) - ) { - console.warn("maxTags and minTags cannot be less than 0"); - toast({ - title: "maxTags and minTags cannot be less than 0", - description: - "Please set maxTags and minTags to a value greater than or equal to 0", - variant: "destructive", - }); - return null; - } - - const handleInputChange = (e: React.ChangeEvent) => { - const newValue = e.target.value; - setInputValue(newValue); - onInputChange?.(newValue); - }; - - const handleKeyDown = (e: React.KeyboardEvent) => { - if ( - delimiterList - ? delimiterList.includes(e.key) - : e.key === delimiter || e.key === Delimiter.Enter - ) { - e.preventDefault(); - const newTagText = inputValue.trim(); - - if (validateTag && !validateTag(newTagText)) { - return; - } - - if (minLength && newTagText.length < minLength) { - console.warn("Tag is too short"); - toast({ - title: "Tag is too short", - description: "Please enter a tag with more characters", - variant: "destructive", - }); - return; - } - - // Validate maxLength - if (maxLength && newTagText.length > maxLength) { - toast({ - title: "Tag is too long", - description: "Please enter a tag with less characters", - variant: "destructive", - }); - console.warn("Tag is too long"); - return; - } - - const newTagId = uuid(); - - if ( - newTagText && - (allowDuplicates || !tags.some((tag) => tag.text === newTagText)) && - (maxTags === undefined || tags.length < maxTags) - ) { - setTags([...tags, { id: newTagId, text: newTagText }]); - onTagAdd?.(newTagText); - setTagCount((prevTagCount) => prevTagCount + 1); - } - setInputValue(""); - } - }; - - const removeTag = (idToRemove: string) => { - setTags(tags.filter((tag) => tag.id !== idToRemove)); - onTagRemove?.(tags.find((tag) => tag.id === idToRemove)?.text || ""); - setTagCount((prevTagCount) => prevTagCount - 1); - }; - - const handleDragStart = (id: string) => { - setDraggedTagId(id); - }; - - const handleDragOver = (e: React.DragEvent) => { - e.preventDefault(); // Necessary to allow dropping - }; - - const handleDrop = (id: string) => { - if (draggedTagId === null) return; - - const draggedTagIndex = tags.findIndex((tag) => tag.id === draggedTagId); - const dropTargetIndex = tags.findIndex((tag) => tag.id === id); - - if (draggedTagIndex === dropTargetIndex) return; - - const newTags = [...tags]; - const [reorderedTag] = newTags.splice(draggedTagIndex, 1); - newTags.splice(dropTargetIndex, 0, reorderedTag); - - setTags(newTags); - setDraggedTagId(null); - }; - - const handleClearAll = () => { - onClearAll?.(); - }; - - const filteredAutocompleteOptions = autocompleteFilter - ? autocompleteOptions?.filter((option) => autocompleteFilter(option.text)) - : autocompleteOptions; - - const displayedTags = sortTags ? [...tags].sort() : tags; - - const truncatedTags = truncate - ? tags.map((tag) => ({ - id: tag.id, - text: - tag.text?.length > truncate - ? `${tag.text.substring(0, truncate)}...` - : tag.text, - })) - : displayedTags; - - const renderTags = () => { - return truncatedTags.map((tagObj) => - customTagRenderer ? ( - customTagRenderer(tagObj) - ) : ( - handleDragStart(tagObj.id)} - onDragOver={handleDragOver} - onDrop={() => handleDrop(tagObj.id)} - className={cn( - tagVariants({ - variant, - size, - shape, - borderStyle, - textCase, - interaction, - animation, - textStyle, - }), - { - "justify-between": direction === "column", - "cursor-pointer": draggable, - } - )} - onClick={() => onTagClick?.(tagObj)} - > - {tagObj.text} - - - ) - ); - }; - - return ( -
- {!usePopoverForTags ? ( -
- {renderTags()} -
- ) : null} - {enableAutocomplete ? ( -
- - {!usePopoverForTags ? ( - = maxTags - ? placeholderWhenFull - : placeholder - } - ref={inputRef} - value={inputValue} - disabled={maxTags !== undefined && tags.length >= maxTags} - onChangeCapture={handleInputChange} - onKeyDown={handleKeyDown} - onFocus={onFocus} - onBlur={onBlur} - /> - ) : ( - - - = maxTags - ? placeholderWhenFull - : placeholder - } - ref={inputRef} - value={inputValue} - disabled={maxTags !== undefined && tags.length >= maxTags} - onChangeCapture={handleInputChange} - onKeyDown={handleKeyDown} - onFocus={onFocus} - onBlur={onBlur} - className="w-full" - /> - - -
-

- Entered Tags -

-

- These are the tags you've entered. -

-
-
- {renderTags()} -
-
-
- )} - - No results found. - - {filteredAutocompleteOptions?.map((optionObj) => ( - = maxTags - ? "cursor-not-allowed" - : "cursor-pointer" - }`} - > -
= maxTags - ? "cursor-not-allowed" - : "cursor-pointer" - }`} - onClick={() => { - if ( - optionObj.text && - (allowDuplicates || - !tags.some( - (tag) => tag.text === optionObj.text - )) && - (maxTags === undefined || tags.length < maxTags) - ) { - setTags([...tags, optionObj]); - onTagAdd?.(optionObj.text); - setTagCount((prevTagCount) => prevTagCount + 1); - } - }} - > - {optionObj.text} -
-
- ))} -
-
-
- {maxTags && ( -
- - {`${tagCount}`}/{`${maxTags}`} - -
- )} -
- ) : ( -
- {!usePopoverForTags ? ( - = maxTags - ? placeholderWhenFull - : placeholder - } - value={inputValue} - onChange={handleInputChange} - onKeyDown={handleKeyDown} - onFocus={onFocus} - onBlur={onBlur} - {...inputProps} - className={className} - autoComplete={enableAutocomplete ? "on" : "off"} - list={enableAutocomplete ? "autocomplete-options" : undefined} - disabled={maxTags !== undefined && tags.length >= maxTags} - /> - ) : ( - - - = maxTags - ? placeholderWhenFull - : placeholder - } - value={inputValue} - onChange={handleInputChange} - onKeyDown={handleKeyDown} - onFocus={onFocus} - onBlur={onBlur} - {...inputProps} - className={className} - autoComplete={enableAutocomplete ? "on" : "off"} - list={ - enableAutocomplete ? "autocomplete-options" : undefined - } - disabled={maxTags !== undefined && tags.length >= maxTags} - /> - - -
-

- Entered Tags -

-

- These are the tags you've entered. -

-
-
- {renderTags()} -
-
-
- )} - {showCount && maxTags && ( -
- - {`${tagCount}`}/{`${maxTags}`} - -
- )} -
- )} - {clearAll && ( - - )} -
- ); - } -); - -TagInput.displayName = "TagInput"; - -export { TagInput }; diff --git a/components/tag/tag-input.tsx b/components/tag/tag-input.tsx new file mode 100644 index 0000000..e644375 --- /dev/null +++ b/components/tag/tag-input.tsx @@ -0,0 +1,423 @@ +"use client"; + +import React from "react"; +import { Input } from "../ui/input"; +import { Button } from "../ui/button"; +import { type VariantProps } from "class-variance-authority"; +import { CommandInput } from "@/components/ui/command"; +import { toast } from "../ui/use-toast"; +import { v4 as uuid } from "uuid"; +import { TagPopover } from "./tag-popover"; +import { TagList } from "./tag-list"; +import { tagVariants } from "./tag"; +import { Autocomplete } from "./auto-complete"; + +export enum Delimiter { + Comma = ",", + Enter = "Enter", + Space = " ", +} + +type OmittedInputProps = Omit< + React.InputHTMLAttributes, + "size" | "value" +>; + +export type Tag = { + id: string; + text: string; +}; + +export interface TagInputProps + extends OmittedInputProps, + VariantProps { + placeholder?: string; + tags: Tag[]; + setTags: React.Dispatch>; + enableAutocomplete?: boolean; + autocompleteOptions?: Tag[]; + maxTags?: number; + minTags?: number; + readOnly?: boolean; + disabled?: boolean; + onTagAdd?: (tag: string) => void; + onTagRemove?: (tag: string) => void; + allowDuplicates?: boolean; + validateTag?: (tag: string) => boolean; + delimiter?: Delimiter; + showCount?: boolean; + placeholderWhenFull?: string; + sortTags?: boolean; + delimiterList?: string[]; + truncate?: number; + minLength?: number; + maxLength?: number; + usePopoverForTags?: boolean; + value?: string | number | readonly string[] | { id: string; text: string }[]; + autocompleteFilter?: (option: string) => boolean; + direction?: "row" | "column"; + onInputChange?: (value: string) => void; + customTagRenderer?: (tag: Tag) => React.ReactNode; + onFocus?: React.FocusEventHandler; + onBlur?: React.FocusEventHandler; + onTagClick?: (tag: Tag) => void; + draggable?: boolean; + inputFieldPostion?: "bottom" | "top" | "inline"; + clearAll?: boolean; + onClearAll?: () => void; + inputProps?: React.InputHTMLAttributes; +} + +const TagInput = React.forwardRef( + (props, ref) => { + const { + id, + placeholder, + tags, + setTags, + variant, + size, + shape, + className, + enableAutocomplete, + autocompleteOptions, + maxTags, + delimiter = Delimiter.Comma, + onTagAdd, + onTagRemove, + allowDuplicates, + showCount, + validateTag, + placeholderWhenFull = "Max tags reached", + sortTags, + delimiterList, + truncate, + autocompleteFilter, + borderStyle, + textCase, + interaction, + animation, + textStyle, + minLength, + maxLength, + direction = "row", + onInputChange, + customTagRenderer, + onFocus, + onBlur, + onTagClick, + draggable = false, + inputFieldPostion = "bottom", + clearAll = false, + onClearAll, + usePopoverForTags = false, + inputProps = {}, + } = props; + + const [inputValue, setInputValue] = React.useState(""); + const [tagCount, setTagCount] = React.useState(Math.max(0, tags.length)); + const inputRef = React.useRef(null); + const [draggedTagId, setDraggedTagId] = React.useState(null); + + if ( + (maxTags !== undefined && maxTags < 0) || + (props.minTags !== undefined && props.minTags < 0) + ) { + console.warn("maxTags and minTags cannot be less than 0"); + toast({ + title: "maxTags and minTags cannot be less than 0", + description: + "Please set maxTags and minTags to a value greater than or equal to 0", + variant: "destructive", + }); + return null; + } + + const handleInputChange = (e: React.ChangeEvent) => { + const newValue = e.target.value; + setInputValue(newValue); + onInputChange?.(newValue); + }; + + const handleKeyDown = (e: React.KeyboardEvent) => { + if ( + delimiterList + ? delimiterList.includes(e.key) + : e.key === delimiter || e.key === Delimiter.Enter + ) { + e.preventDefault(); + const newTagText = inputValue.trim(); + + if (validateTag && !validateTag(newTagText)) { + return; + } + + if (minLength && newTagText.length < minLength) { + console.warn("Tag is too short"); + toast({ + title: "Tag is too short", + description: "Please enter a tag with more characters", + variant: "destructive", + }); + return; + } + + // Validate maxLength + if (maxLength && newTagText.length > maxLength) { + toast({ + title: "Tag is too long", + description: "Please enter a tag with less characters", + variant: "destructive", + }); + console.warn("Tag is too long"); + return; + } + + const newTagId = uuid(); + + if ( + newTagText && + (allowDuplicates || !tags.some((tag) => tag.text === newTagText)) && + (maxTags === undefined || tags.length < maxTags) + ) { + setTags([...tags, { id: newTagId, text: newTagText }]); + onTagAdd?.(newTagText); + setTagCount((prevTagCount) => prevTagCount + 1); + } + setInputValue(""); + } + }; + + const removeTag = (idToRemove: string) => { + setTags(tags.filter((tag) => tag.id !== idToRemove)); + onTagRemove?.(tags.find((tag) => tag.id === idToRemove)?.text || ""); + setTagCount((prevTagCount) => prevTagCount - 1); + }; + + const handleDragStart = (id: string) => { + setDraggedTagId(id); + }; + + const handleDragOver = (e: React.DragEvent) => { + e.preventDefault(); // Necessary to allow dropping + }; + + const handleDrop = (id: string) => { + if (draggedTagId === null) return; + + const draggedTagIndex = tags.findIndex((tag) => tag.id === draggedTagId); + const dropTargetIndex = tags.findIndex((tag) => tag.id === id); + + if (draggedTagIndex === dropTargetIndex) return; + + const newTags = [...tags]; + const [reorderedTag] = newTags.splice(draggedTagIndex, 1); + newTags.splice(dropTargetIndex, 0, reorderedTag); + + setTags(newTags); + setDraggedTagId(null); + }; + + const handleClearAll = () => { + onClearAll?.(); + }; + + const filteredAutocompleteOptions = autocompleteFilter + ? autocompleteOptions?.filter((option) => autocompleteFilter(option.text)) + : autocompleteOptions; + + const displayedTags = sortTags ? [...tags].sort() : tags; + + const truncatedTags = truncate + ? tags.map((tag) => ({ + id: tag.id, + text: + tag.text?.length > truncate + ? `${tag.text.substring(0, truncate)}...` + : tag.text, + })) + : displayedTags; + + return ( +
+ {!usePopoverForTags ? ( + + ) : null} + {enableAutocomplete ? ( +
+ + {!usePopoverForTags ? ( + = maxTags + ? placeholderWhenFull + : placeholder + } + ref={inputRef} + value={inputValue} + disabled={maxTags !== undefined && tags.length >= maxTags} + onChangeCapture={handleInputChange} + onKeyDown={handleKeyDown} + onFocus={onFocus} + onBlur={onBlur} + className="w-full" + /> + ) : ( + + = maxTags + ? placeholderWhenFull + : placeholder + } + ref={inputRef} + value={inputValue} + disabled={maxTags !== undefined && tags.length >= maxTags} + onChangeCapture={handleInputChange} + onKeyDown={handleKeyDown} + onFocus={onFocus} + onBlur={onBlur} + className="w-full" + /> + + )} + +
+ ) : ( +
+ {!usePopoverForTags ? ( + = maxTags + ? placeholderWhenFull + : placeholder + } + value={inputValue} + onChange={handleInputChange} + onKeyDown={handleKeyDown} + onFocus={onFocus} + onBlur={onBlur} + {...inputProps} + className={className} + autoComplete={enableAutocomplete ? "on" : "off"} + list={enableAutocomplete ? "autocomplete-options" : undefined} + disabled={maxTags !== undefined && tags.length >= maxTags} + /> + ) : ( + + = maxTags + ? placeholderWhenFull + : placeholder + } + value={inputValue} + onChange={handleInputChange} + onKeyDown={handleKeyDown} + onFocus={onFocus} + onBlur={onBlur} + {...inputProps} + className={className} + autoComplete={enableAutocomplete ? "on" : "off"} + list={enableAutocomplete ? "autocomplete-options" : undefined} + disabled={maxTags !== undefined && tags.length >= maxTags} + /> + + )} +
+ )} + {showCount && maxTags && ( +
+ + {`${tagCount}`}/{`${maxTags}`} + +
+ )} + {clearAll && ( + + )} +
+ ); + } +); + +TagInput.displayName = "TagInput"; + +export { TagInput }; diff --git a/components/ui/command.tsx b/components/ui/command.tsx index 6e83af0..dbe54a9 100644 --- a/components/ui/command.tsx +++ b/components/ui/command.tsx @@ -1,12 +1,12 @@ -"use client" +"use client"; -import * as React from "react" -import { DialogProps } from "@radix-ui/react-dialog" -import { Command as CommandPrimitive } from "cmdk" -import { Search } from "lucide-react" +import * as React from "react"; +import { DialogProps } from "@radix-ui/react-dialog"; +import { Command as CommandPrimitive } from "cmdk"; +import { Search } from "lucide-react"; -import { cn } from "@/lib/utils" -import { Dialog, DialogContent } from "@/components/ui/dialog" +import { cn } from "@/lib/utils"; +import { Dialog, DialogContent } from "@/components/ui/dialog"; const Command = React.forwardRef< React.ElementRef, @@ -20,8 +20,8 @@ const Command = React.forwardRef< )} {...props} /> -)) -Command.displayName = CommandPrimitive.displayName +)); +Command.displayName = CommandPrimitive.displayName; interface CommandDialogProps extends DialogProps {} @@ -34,8 +34,8 @@ const CommandDialog = ({ children, ...props }: CommandDialogProps) => { - ) -} + ); +}; const CommandInput = React.forwardRef< React.ElementRef, @@ -52,9 +52,9 @@ const CommandInput = React.forwardRef< {...props} /> -)) +)); -CommandInput.displayName = CommandPrimitive.Input.displayName +CommandInput.displayName = CommandPrimitive.Input.displayName; const CommandList = React.forwardRef< React.ElementRef, @@ -65,9 +65,9 @@ const CommandList = React.forwardRef< className={cn("max-h-[300px] overflow-y-auto overflow-x-hidden", className)} {...props} /> -)) +)); -CommandList.displayName = CommandPrimitive.List.displayName +CommandList.displayName = CommandPrimitive.List.displayName; const CommandEmpty = React.forwardRef< React.ElementRef, @@ -78,9 +78,9 @@ const CommandEmpty = React.forwardRef< className="py-6 text-center text-sm" {...props} /> -)) +)); -CommandEmpty.displayName = CommandPrimitive.Empty.displayName +CommandEmpty.displayName = CommandPrimitive.Empty.displayName; const CommandGroup = React.forwardRef< React.ElementRef, @@ -94,9 +94,9 @@ const CommandGroup = React.forwardRef< )} {...props} /> -)) +)); -CommandGroup.displayName = CommandPrimitive.Group.displayName +CommandGroup.displayName = CommandPrimitive.Group.displayName; const CommandSeparator = React.forwardRef< React.ElementRef, @@ -107,8 +107,8 @@ const CommandSeparator = React.forwardRef< className={cn("-mx-1 h-px bg-border", className)} {...props} /> -)) -CommandSeparator.displayName = CommandPrimitive.Separator.displayName +)); +CommandSeparator.displayName = CommandPrimitive.Separator.displayName; const CommandItem = React.forwardRef< React.ElementRef, @@ -122,9 +122,9 @@ const CommandItem = React.forwardRef< )} {...props} /> -)) +)); -CommandItem.displayName = CommandPrimitive.Item.displayName +CommandItem.displayName = CommandPrimitive.Item.displayName; const CommandShortcut = ({ className, @@ -138,9 +138,9 @@ const CommandShortcut = ({ )} {...props} /> - ) -} -CommandShortcut.displayName = "CommandShortcut" + ); +}; +CommandShortcut.displayName = "CommandShortcut"; export { Command, @@ -152,4 +152,4 @@ export { CommandItem, CommandShortcut, CommandSeparator, -} +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8fac48b..04ac981 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,7 +7,7 @@ settings: dependencies: '@hookform/resolvers': specifier: ^3.3.1 - version: 3.3.2(react-hook-form@7.48.2) + version: 3.3.2(react-hook-form@7.49.2) '@radix-ui/react-dialog': specifier: 1.0.4 version: 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) @@ -67,7 +67,7 @@ dependencies: version: 13.4.19(eslint@8.48.0)(typescript@5.2.2) framer-motion: specifier: ^10.16.5 - version: 10.16.5(react-dom@18.2.0)(react@18.2.0) + version: 10.16.16(react-dom@18.2.0)(react@18.2.0) lucide-react: specifier: ^0.274.0 version: 0.274.0(react@18.2.0) @@ -82,7 +82,7 @@ dependencies: version: 8.4.29 prism-react-renderer: specifier: ^2.3.0 - version: 2.3.0(react@18.2.0) + version: 2.3.1(react@18.2.0) react: specifier: 18.2.0 version: 18.2.0 @@ -91,7 +91,7 @@ dependencies: version: 18.2.0(react@18.2.0) react-hook-form: specifier: ^7.45.4 - version: 7.48.2(react@18.2.0) + version: 7.49.2(react@18.2.0) tailwind-merge: specifier: ^1.14.0 version: 1.14.0 @@ -123,11 +123,11 @@ packages: engines: {node: '>=10'} dev: false - /@babel/runtime@7.23.4: - resolution: {integrity: sha512-2Yv65nlWnWlSpe3fXEyX5i7fx5kIKo4Qbcj+hMO0odwaneFjfXw5fdum+4yL20O0QiaHpia0cYQ9xpNMqrBwHg==} + /@babel/runtime@7.23.6: + resolution: {integrity: sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==} engines: {node: '>=6.9.0'} dependencies: - regenerator-runtime: 0.14.0 + regenerator-runtime: 0.14.1 dev: false /@emotion/is-prop-valid@0.8.8: @@ -159,14 +159,14 @@ packages: engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: false - /@eslint/eslintrc@2.1.3: - resolution: {integrity: sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==} + /@eslint/eslintrc@2.1.4: + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 debug: 4.3.4 espree: 9.6.1 - globals: 13.23.0 + globals: 13.24.0 ignore: 5.3.0 import-fresh: 3.3.0 js-yaml: 4.1.0 @@ -181,8 +181,8 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: false - /@floating-ui/core@1.5.0: - resolution: {integrity: sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==} + /@floating-ui/core@1.5.2: + resolution: {integrity: sha512-Ii3MrfY/GAIN3OhXNzpCKaLxHQfJF9qvwq/kEJYdqDxeIHa01K8sldugal6TmeeXl+WMvhv9cnVzUTaFFJF09A==} dependencies: '@floating-ui/utils': 0.1.6 dev: false @@ -190,7 +190,7 @@ packages: /@floating-ui/dom@1.5.3: resolution: {integrity: sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==} dependencies: - '@floating-ui/core': 1.5.0 + '@floating-ui/core': 1.5.2 '@floating-ui/utils': 0.1.6 dev: false @@ -209,12 +209,12 @@ packages: resolution: {integrity: sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==} dev: false - /@hookform/resolvers@3.3.2(react-hook-form@7.48.2): + /@hookform/resolvers@3.3.2(react-hook-form@7.49.2): resolution: {integrity: sha512-Tw+GGPnBp+5DOsSg4ek3LCPgkBOuOgS5DsDV7qsWNH9LZc433kgsWICjlsh2J9p04H2K66hsXPPb9qn9ILdUtA==} peerDependencies: react-hook-form: ^7.0.0 dependencies: - react-hook-form: 7.48.2(react@18.2.0) + react-hook-form: 7.49.2(react@18.2.0) dev: false /@humanwhocodes/config-array@0.11.13: @@ -237,6 +237,18 @@ packages: resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} dev: false + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: false + /@jridgewell/gen-mapping@0.3.3: resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} engines: {node: '>=6.0.0'} @@ -376,19 +388,26 @@ packages: engines: {node: '>= 8'} dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 + fastq: 1.16.0 + dev: false + + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true dev: false + optional: true /@radix-ui/primitive@1.0.0: resolution: {integrity: sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==} dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 dev: false /@radix-ui/primitive@1.0.1: resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 dev: false /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): @@ -404,7 +423,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@types/react': 18.2.21 '@types/react-dom': 18.2.7 @@ -425,7 +444,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) @@ -441,7 +460,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 react: 18.2.0 dev: false @@ -454,7 +473,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@types/react': 18.2.21 react: 18.2.0 dev: false @@ -464,7 +483,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 react: 18.2.0 dev: false @@ -477,7 +496,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@types/react': 18.2.21 react: 18.2.0 dev: false @@ -488,7 +507,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@radix-ui/primitive': 1.0.0 '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) '@radix-ui/react-context': 1.0.0(react@18.2.0) @@ -522,7 +541,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) @@ -552,7 +571,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@types/react': 18.2.21 react: 18.2.0 dev: false @@ -563,7 +582,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@radix-ui/primitive': 1.0.0 '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0)(react@18.2.0) @@ -586,7 +605,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) @@ -611,7 +630,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) @@ -636,7 +655,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) @@ -655,7 +674,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 react: 18.2.0 dev: false @@ -668,7 +687,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@types/react': 18.2.21 react: 18.2.0 dev: false @@ -679,7 +698,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) @@ -700,7 +719,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) @@ -723,7 +742,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) @@ -746,7 +765,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@radix-ui/react-use-layout-effect': 1.0.0(react@18.2.0) react: 18.2.0 dev: false @@ -760,7 +779,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@types/react': 18.2.21 react: 18.2.0 @@ -779,7 +798,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@types/react': 18.2.21 '@types/react-dom': 18.2.7 @@ -800,7 +819,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) @@ -838,7 +857,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) @@ -873,7 +892,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@floating-ui/react-dom': 2.0.4(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) @@ -896,7 +915,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -915,7 +934,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@types/react': 18.2.21 '@types/react-dom': 18.2.7 @@ -936,7 +955,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@types/react': 18.2.21 '@types/react-dom': 18.2.7 @@ -950,7 +969,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) '@radix-ui/react-use-layout-effect': 1.0.0(react@18.2.0) react: 18.2.0 @@ -970,7 +989,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@types/react': 18.2.21 @@ -985,7 +1004,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@radix-ui/react-slot': 1.0.0(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -1004,7 +1023,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@radix-ui/react-slot': 1.0.2(@types/react@18.2.21)(react@18.2.0) '@types/react': 18.2.21 '@types/react-dom': 18.2.7 @@ -1025,7 +1044,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) @@ -1046,7 +1065,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) react: 18.2.0 dev: false @@ -1060,7 +1079,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@types/react': 18.2.21 react: 18.2.0 @@ -1079,7 +1098,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@radix-ui/react-direction': 1.0.1(@types/react@18.2.21)(react@18.2.0) @@ -1107,7 +1126,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) @@ -1131,7 +1150,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 react: 18.2.0 dev: false @@ -1144,7 +1163,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@types/react': 18.2.21 react: 18.2.0 dev: false @@ -1154,7 +1173,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) react: 18.2.0 dev: false @@ -1168,7 +1187,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@types/react': 18.2.21 react: 18.2.0 @@ -1179,7 +1198,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) react: 18.2.0 dev: false @@ -1193,7 +1212,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@types/react': 18.2.21 react: 18.2.0 @@ -1204,7 +1223,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 react: 18.2.0 dev: false @@ -1217,7 +1236,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@types/react': 18.2.21 react: 18.2.0 dev: false @@ -1231,7 +1250,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@radix-ui/rect': 1.0.1 '@types/react': 18.2.21 react: 18.2.0 @@ -1246,7 +1265,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@types/react': 18.2.21 react: 18.2.0 @@ -1265,7 +1284,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@types/react': 18.2.21 '@types/react-dom': 18.2.7 @@ -1276,11 +1295,11 @@ packages: /@radix-ui/rect@1.0.1: resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 dev: false - /@rushstack/eslint-patch@1.6.0: - resolution: {integrity: sha512-2/U3GXA6YiPYQDLGwtGlnNgKYBSwCFIHf8Y9LUY5VATHdtbLlU0Y1R3QoBnT0aB4qv/BEiVVsj7LJXoQCgJ2vA==} + /@rushstack/eslint-patch@1.6.1: + resolution: {integrity: sha512-UY+FGM/2jjMkzQLn8pxcHGMaVLh9aEitG3zY2CiY7XHdLiz3bZOwa6oDxNqEMv7zZkV+cj5DOdz0cQ1BP5Hjgw==} dev: false /@swc/helpers@0.5.1: @@ -1316,7 +1335,7 @@ packages: dependencies: '@types/prop-types': 15.7.11 '@types/scheduler': 0.16.8 - csstype: 3.1.2 + csstype: 3.1.3 dev: false /@types/scheduler@0.16.8: @@ -1327,8 +1346,8 @@ packages: resolution: {integrity: sha512-WUtIVRUZ9i5dYXefDEAI7sh9/O7jGvHg7Df/5O/gtH3Yabe5odI3UWopVR1qbPXQtvOxWu3mM4XxlYeZtMWF4g==} dev: false - /@typescript-eslint/parser@6.12.0(eslint@8.48.0)(typescript@5.2.2): - resolution: {integrity: sha512-s8/jNFPKPNRmXEnNXfuo1gemBdVmpQsK1pcu+QIvuNJuhFzGrpD7WjOcvDc/+uEdfzSYpNu7U/+MmbScjoQ6vg==} + /@typescript-eslint/parser@6.16.0(eslint@8.48.0)(typescript@5.2.2): + resolution: {integrity: sha512-H2GM3eUo12HpKZU9njig3DF5zJ58ja6ahj1GoHEHOgQvYxzoFJJEvC1MQ7T2l9Ha+69ZSOn7RTxOdpC/y3ikMw==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -1337,10 +1356,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 6.12.0 - '@typescript-eslint/types': 6.12.0 - '@typescript-eslint/typescript-estree': 6.12.0(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 6.12.0 + '@typescript-eslint/scope-manager': 6.16.0 + '@typescript-eslint/types': 6.16.0 + '@typescript-eslint/typescript-estree': 6.16.0(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.16.0 debug: 4.3.4 eslint: 8.48.0 typescript: 5.2.2 @@ -1348,21 +1367,21 @@ packages: - supports-color dev: false - /@typescript-eslint/scope-manager@6.12.0: - resolution: {integrity: sha512-5gUvjg+XdSj8pcetdL9eXJzQNTl3RD7LgUiYTl8Aabdi8hFkaGSYnaS6BLc0BGNaDH+tVzVwmKtWvu0jLgWVbw==} + /@typescript-eslint/scope-manager@6.16.0: + resolution: {integrity: sha512-0N7Y9DSPdaBQ3sqSCwlrm9zJwkpOuc6HYm7LpzLAPqBL7dmzAUimr4M29dMkOP/tEwvOCC/Cxo//yOfJD3HUiw==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.12.0 - '@typescript-eslint/visitor-keys': 6.12.0 + '@typescript-eslint/types': 6.16.0 + '@typescript-eslint/visitor-keys': 6.16.0 dev: false - /@typescript-eslint/types@6.12.0: - resolution: {integrity: sha512-MA16p/+WxM5JG/F3RTpRIcuOghWO30//VEOvzubM8zuOOBYXsP+IfjoCXXiIfy2Ta8FRh9+IO9QLlaFQUU+10Q==} + /@typescript-eslint/types@6.16.0: + resolution: {integrity: sha512-hvDFpLEvTJoHutVl87+MG/c5C8I6LOgEx05zExTSJDEVU7hhR3jhV8M5zuggbdFCw98+HhZWPHZeKS97kS3JoQ==} engines: {node: ^16.0.0 || >=18.0.0} dev: false - /@typescript-eslint/typescript-estree@6.12.0(typescript@5.2.2): - resolution: {integrity: sha512-vw9E2P9+3UUWzhgjyyVczLWxZ3GuQNT7QpnIY3o5OMeLO/c8oHljGc8ZpryBMIyympiAAaKgw9e5Hl9dCWFOYw==} + /@typescript-eslint/typescript-estree@6.16.0(typescript@5.2.2): + resolution: {integrity: sha512-VTWZuixh/vr7nih6CfrdpmFNLEnoVBF1skfjdyGnNwXOH1SLeHItGdZDHhhAIzd3ACazyY2Fg76zuzOVTaknGA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' @@ -1370,11 +1389,12 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 6.12.0 - '@typescript-eslint/visitor-keys': 6.12.0 + '@typescript-eslint/types': 6.16.0 + '@typescript-eslint/visitor-keys': 6.16.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 + minimatch: 9.0.3 semver: 7.5.4 ts-api-utils: 1.0.3(typescript@5.2.2) typescript: 5.2.2 @@ -1382,11 +1402,11 @@ packages: - supports-color dev: false - /@typescript-eslint/visitor-keys@6.12.0: - resolution: {integrity: sha512-rg3BizTZHF1k3ipn8gfrzDXXSFKyOEB5zxYXInQ6z0hUvmQlhaZQzK+YmHmNViMA9HzW5Q9+bPPt90bU6GQwyw==} + /@typescript-eslint/visitor-keys@6.16.0: + resolution: {integrity: sha512-QSFQLruk7fhs91a/Ep/LqRdbJCZ1Rq03rqBdKT5Ky17Sz8zRLUksqIe9DW0pKtg/Z35/ztbLQ6qpOCN6rOC11A==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.12.0 + '@typescript-eslint/types': 6.16.0 eslint-visitor-keys: 3.4.3 dev: false @@ -1424,6 +1444,11 @@ packages: engines: {node: '>=8'} dev: false + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: false + /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -1431,6 +1456,11 @@ packages: color-convert: 2.0.1 dev: false + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: false + /any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} dev: false @@ -1558,8 +1588,8 @@ packages: peerDependencies: postcss: ^8.1.0 dependencies: - browserslist: 4.22.1 - caniuse-lite: 1.0.30001564 + browserslist: 4.22.2 + caniuse-lite: 1.0.30001571 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.0 @@ -1599,6 +1629,12 @@ packages: concat-map: 0.0.1 dev: false + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: false + /braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} @@ -1606,15 +1642,15 @@ packages: fill-range: 7.0.1 dev: false - /browserslist@4.22.1: - resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} + /browserslist@4.22.2: + resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001564 - electron-to-chromium: 1.4.591 - node-releases: 2.0.13 - update-browserslist-db: 1.0.13(browserslist@4.22.1) + caniuse-lite: 1.0.30001571 + electron-to-chromium: 1.4.616 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.22.2) dev: false /busboy@1.6.0: @@ -1642,8 +1678,8 @@ packages: engines: {node: '>= 6'} dev: false - /caniuse-lite@1.0.30001564: - resolution: {integrity: sha512-DqAOf+rhof+6GVx1y+xzbFPeOumfQnhYzVnZD6LAXijR77yPtm9mfOcqOnT3mpnJiZVT+kwLAFnRlZcIz+c6bg==} + /caniuse-lite@1.0.30001571: + resolution: {integrity: sha512-tYq/6MoXhdezDLFZuCO/TKboTzuQ/xR5cFdgXPfDtM7/kchBO3b4VWghE/OAi/DV7tTdhmLjZiZBZi1fA/GheQ==} dev: false /chalk@4.1.2: @@ -1737,8 +1773,8 @@ packages: hasBin: true dev: false - /csstype@3.1.2: - resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + /csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} dev: false /damerau-levenshtein@1.0.8: @@ -1828,8 +1864,16 @@ packages: esutils: 2.0.3 dev: false - /electron-to-chromium@1.4.591: - resolution: {integrity: sha512-vLv/P7wwAPKQoY+CVMyyI6rsTp+A14KGtPXx92oz1FY41AAqa9l6Wkizcixg0LDuJgyeo8xgNN9+9hsnGp66UA==} + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: false + + /electron-to-chromium@1.4.616: + resolution: {integrity: sha512-1n7zWYh8eS0L9Uy+GskE0lkBUNK83cXTVJI0pU3mGprFsbfSdAc15VTFbo+A+Bq4pwstmL30AVcEU3Fo463lNg==} + dev: false + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} dev: false /emoji-regex@9.2.2: @@ -1874,7 +1918,7 @@ packages: is-weakref: 1.0.2 object-inspect: 1.13.1 object-keys: 1.1.1 - object.assign: 4.1.4 + object.assign: 4.1.5 regexp.prototype.flags: 1.5.1 safe-array-concat: 1.0.1 safe-regex-test: 1.0.0 @@ -1952,12 +1996,12 @@ packages: optional: true dependencies: '@next/eslint-plugin-next': 13.4.19 - '@rushstack/eslint-patch': 1.6.0 - '@typescript-eslint/parser': 6.12.0(eslint@8.48.0)(typescript@5.2.2) + '@rushstack/eslint-patch': 1.6.1 + '@typescript-eslint/parser': 6.16.0(eslint@8.48.0)(typescript@5.2.2) eslint: 8.48.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.12.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.0)(eslint@8.48.0) - eslint-plugin-import: 2.29.0(@typescript-eslint/parser@6.12.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.48.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.16.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.48.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.16.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.48.0) eslint-plugin-jsx-a11y: 6.8.0(eslint@8.48.0) eslint-plugin-react: 7.33.2(eslint@8.48.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.48.0) @@ -1977,7 +2021,7 @@ packages: - supports-color dev: false - /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.12.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.0)(eslint@8.48.0): + /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.16.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.48.0): resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -1987,8 +2031,8 @@ packages: debug: 4.3.4 enhanced-resolve: 5.15.0 eslint: 8.48.0 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.12.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.48.0) - eslint-plugin-import: 2.29.0(@typescript-eslint/parser@6.12.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.48.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.16.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.48.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.16.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.48.0) fast-glob: 3.3.2 get-tsconfig: 4.7.2 is-core-module: 2.13.1 @@ -2000,7 +2044,7 @@ packages: - supports-color dev: false - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.12.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.48.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.16.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.48.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -2021,17 +2065,17 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 6.12.0(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.16.0(eslint@8.48.0)(typescript@5.2.2) debug: 3.2.7 eslint: 8.48.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.12.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.0)(eslint@8.48.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.16.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.48.0) transitivePeerDependencies: - supports-color dev: false - /eslint-plugin-import@2.29.0(@typescript-eslint/parser@6.12.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.48.0): - resolution: {integrity: sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==} + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.16.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.48.0): + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -2040,7 +2084,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 6.12.0(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.16.0(eslint@8.48.0)(typescript@5.2.2) array-includes: 3.1.7 array.prototype.findlastindex: 1.2.3 array.prototype.flat: 1.3.2 @@ -2049,7 +2093,7 @@ packages: doctrine: 2.1.0 eslint: 8.48.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.12.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.48.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.16.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.48.0) hasown: 2.0.0 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -2058,7 +2102,7 @@ packages: object.groupby: 1.0.1 object.values: 1.1.7 semver: 6.3.1 - tsconfig-paths: 3.14.2 + tsconfig-paths: 3.15.0 transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -2071,7 +2115,7 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.6 aria-query: 5.3.0 array-includes: 3.1.7 array.prototype.flatmap: 1.3.2 @@ -2144,7 +2188,7 @@ packages: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) '@eslint-community/regexpp': 4.10.0 - '@eslint/eslintrc': 2.1.3 + '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.48.0 '@humanwhocodes/config-array': 0.11.13 '@humanwhocodes/module-importer': 1.0.1 @@ -2164,7 +2208,7 @@ packages: file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.23.0 + globals: 13.24.0 graphemer: 1.4.0 ignore: 5.3.0 imurmurhash: 0.1.4 @@ -2239,8 +2283,8 @@ packages: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: false - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + /fastq@1.16.0: + resolution: {integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==} dependencies: reusify: 1.0.4 dev: false @@ -2286,12 +2330,20 @@ packages: is-callable: 1.2.7 dev: false + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + dev: false + /fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} dev: false - /framer-motion@10.16.5(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-GEzVjOYP2MIpV9bT/GbhcsBNoImG3/2X3O/xVNWmktkv9MdJ7P/44zELm/7Fjb+O3v39SmKFnoDQB32giThzpg==} + /framer-motion@10.16.16(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-je6j91rd7NmUX7L1XHouwJ4v3R+SO4umso2LUcgOct3rHZ0PajZ80ETYZTajzEXEl9DlKyzjyt4AvGQ+lrebOw==} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 @@ -2384,15 +2436,16 @@ packages: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} dev: false - /glob@7.1.6: - resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} + /glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.3 + minipass: 7.0.4 + path-scurry: 1.10.1 dev: false /glob@7.1.7: @@ -2417,8 +2470,8 @@ packages: path-is-absolute: 1.0.1 dev: false - /globals@13.23.0: - resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} + /globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 @@ -2605,6 +2658,11 @@ packages: call-bind: 1.0.5 dev: false + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: false + /is-generator-function@1.0.10: resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} engines: {node: '>= 0.4'} @@ -2719,6 +2777,15 @@ packages: set-function-name: 2.0.1 dev: false + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: false + /jiti@1.21.0: resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} hasBin: true @@ -2760,7 +2827,7 @@ packages: dependencies: array-includes: 3.1.7 array.prototype.flat: 1.3.2 - object.assign: 4.1.4 + object.assign: 4.1.5 object.values: 1.1.7 dev: false @@ -2821,6 +2888,11 @@ packages: js-tokens: 4.0.0 dev: false + /lru-cache@10.1.0: + resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} + engines: {node: 14 || >=16.14} + dev: false + /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -2855,10 +2927,22 @@ packages: brace-expansion: 1.1.11 dev: false + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: false + /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: false + /minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + dev: false + /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: false @@ -2915,7 +2999,7 @@ packages: '@next/env': 13.4.19 '@swc/helpers': 0.5.1 busboy: 1.6.0 - caniuse-lite: 1.0.30001564 + caniuse-lite: 1.0.30001571 postcss: 8.4.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -2937,8 +3021,8 @@ packages: - babel-plugin-macros dev: false - /node-releases@2.0.13: - resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} dev: false /normalize-path@3.0.0: @@ -2970,8 +3054,8 @@ packages: engines: {node: '>= 0.4'} dev: false - /object.assign@4.1.4: - resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + /object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.5 @@ -3081,6 +3165,14 @@ packages: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: false + /path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + lru-cache: 10.1.0 + minipass: 7.0.4 + dev: false + /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -3151,11 +3243,11 @@ packages: postcss: ^8.2.14 dependencies: postcss: 8.4.29 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.14 dev: false - /postcss-selector-parser@6.0.13: - resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} + /postcss-selector-parser@6.0.14: + resolution: {integrity: sha512-65xXYsT40i9GyWzlHQ5ShZoK7JZdySeOozi/tz2EezDo6c04q6+ckYMeoY7idaie1qp2dT5KoYQ2yky6JuoHnA==} engines: {node: '>=4'} dependencies: cssesc: 3.0.0 @@ -3189,8 +3281,8 @@ packages: engines: {node: '>= 0.8.0'} dev: false - /prism-react-renderer@2.3.0(react@18.2.0): - resolution: {integrity: sha512-UYRg2TkVIaI6tRVHC5OJ4/BxqPUxJkJvq/odLT/ykpt1zGYXooNperUxQcCvi87LyRnR4nCh81ceOA+e7nrydg==} + /prism-react-renderer@2.3.1(react@18.2.0): + resolution: {integrity: sha512-Rdf+HzBLR7KYjzpJ1rSoxT9ioO85nZngQEoFIhL07XhtJHlCU3SOz0GJ6+qvMyQe0Se+BV3qpe6Yd/NmQF5Juw==} peerDependencies: react: '>=16.0.0' dependencies: @@ -3226,9 +3318,9 @@ packages: scheduler: 0.23.0 dev: false - /react-hook-form@7.48.2(react@18.2.0): - resolution: {integrity: sha512-H0T2InFQb1hX7qKtDIZmvpU1Xfn/bdahWBN1fH19gSe4bBEqTfmlr7H3XWTaVtiK4/tpPaI1F3355GPMZYge+A==} - engines: {node: '>=12.22.0'} + /react-hook-form@7.49.2(react@18.2.0): + resolution: {integrity: sha512-TZcnSc17+LPPVpMRIDNVITY6w20deMdNi6iehTFLV1x8SqThXGwu93HjlUVU09pzFgZH7qZOvLMM7UYf2ShAHA==} + engines: {node: '>=18', pnpm: '8'} peerDependencies: react: ^16.8.0 || ^17 || ^18 dependencies: @@ -3342,8 +3434,8 @@ packages: which-builtin-type: 1.1.3 dev: false - /regenerator-runtime@0.14.0: - resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + /regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} dev: false /regexp.prototype.flags@1.5.1: @@ -3480,6 +3572,11 @@ packages: object-inspect: 1.13.1 dev: false + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: false + /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -3495,6 +3592,24 @@ packages: engines: {node: '>=10.0.0'} dev: false + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: false + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: false + /string.prototype.matchall@4.0.10: resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} dependencies: @@ -3541,6 +3656,13 @@ packages: ansi-regex: 5.0.1 dev: false + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: false + /strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -3568,14 +3690,14 @@ packages: react: 18.2.0 dev: false - /sucrase@3.34.0: - resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} - engines: {node: '>=8'} + /sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} hasBin: true dependencies: '@jridgewell/gen-mapping': 0.3.3 commander: 4.1.1 - glob: 7.1.6 + glob: 10.3.10 lines-and-columns: 1.2.4 mz: 2.7.0 pirates: 4.0.6 @@ -3630,9 +3752,9 @@ packages: postcss-js: 4.0.1(postcss@8.4.29) postcss-load-config: 4.0.2(postcss@8.4.29) postcss-nested: 6.0.1(postcss@8.4.29) - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.14 resolve: 1.22.8 - sucrase: 3.34.0 + sucrase: 3.35.0 transitivePeerDependencies: - ts-node dev: false @@ -3679,8 +3801,8 @@ packages: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: false - /tsconfig-paths@3.14.2: - resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} + /tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} dependencies: '@types/json5': 0.0.29 json5: 1.0.2 @@ -3757,13 +3879,13 @@ packages: which-boxed-primitive: 1.0.2 dev: false - /update-browserslist-db@1.0.13(browserslist@4.22.1): + /update-browserslist-db@1.0.13(browserslist@4.22.2): resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 escalade: 3.1.1 picocolors: 1.0.0 dev: false @@ -3878,6 +4000,24 @@ packages: isexe: 2.0.0 dev: false + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: false + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + dev: false + /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: false