diff --git a/packages/propel/.eslintrc.js b/packages/propel/.eslintrc.js index b11b7bb6d65..0ce8953748f 100644 --- a/packages/propel/.eslintrc.js +++ b/packages/propel/.eslintrc.js @@ -3,4 +3,29 @@ module.exports = { root: true, extends: ["@plane/eslint-config/library.js"], parser: "@typescript-eslint/parser", + rules: { + "import/order": [ + "warn", + { + groups: ["builtin", "external", "internal", "parent", "sibling"], + pathGroups: [ + { + pattern: "react", + group: "external", + position: "before", + }, + { + pattern: "@plane/**", + group: "external", + position: "after", + }, + ], + pathGroupsExcludedImportTypes: ["builtin", "internal", "react"], + alphabetize: { + order: "asc", + caseInsensitive: true, + }, + }, + ], + }, }; diff --git a/packages/propel/package.json b/packages/propel/package.json index 6ca94146707..7f2676da4e8 100644 --- a/packages/propel/package.json +++ b/packages/propel/package.json @@ -12,13 +12,17 @@ "clean": "rm -rf .turbo && rm -rf .next && rm -rf node_modules && rm -rf dist" }, "exports": { - "./ui/*": "./src/ui/*.tsx", + "./avatar": "./src/avatar/index.ts", "./charts/*": "./src/charts/*/index.ts", + "./dialog": "./src/dialog/index.ts", + "./menu": "./src/menu/index.ts", "./table": "./src/table/index.ts", + "./tabs": "./src/tabs/index.ts", "./styles/fonts": "./src/styles/fonts/index.css" }, "dependencies": { - "@radix-ui/react-slot": "^1.1.1", + "@base-ui-components/react": "^1.0.0-beta.2", + "@plane/utils": "*", "@tanstack/react-table": "^8.21.3", "class-variance-authority": "^0.7.1", "lucide-react": "^0.469.0", diff --git a/packages/propel/src/avatar/avatar.tsx b/packages/propel/src/avatar/avatar.tsx new file mode 100644 index 00000000000..ad77a81dacf --- /dev/null +++ b/packages/propel/src/avatar/avatar.tsx @@ -0,0 +1,121 @@ +import React from "react"; +import { Avatar as AvatarPrimitive } from "@base-ui-components/react/avatar"; +// utils +import { cn } from "@plane/utils"; + +export type TAvatarSize = "sm" | "md" | "base" | "lg" | number; + +type Props = { + name?: string; //The name of the avatar which will be displayed on the tooltip + fallbackBackgroundColor?: string; //The background color if the avatar image fails to load + fallbackText?: string; + fallbackTextColor?: string; //The text color if the avatar image fails to load + showTooltip?: boolean; + size?: TAvatarSize; //The size of the avatars + shape?: "circle" | "square"; + src?: string; //The source of the avatar image + className?: string; +}; + +/** + * Get the size details based on the size prop + * @param size The size of the avatar + * @returns The size details + */ +export const getSizeInfo = (size: TAvatarSize) => { + switch (size) { + case "sm": + return { + avatarSize: "h-4 w-4", + fontSize: "text-xs", + spacing: "-space-x-1", + }; + case "md": + return { + avatarSize: "h-5 w-5", + fontSize: "text-xs", + spacing: "-space-x-1", + }; + case "base": + return { + avatarSize: "h-6 w-6", + fontSize: "text-sm", + spacing: "-space-x-1.5", + }; + case "lg": + return { + avatarSize: "h-7 w-7", + fontSize: "text-sm", + spacing: "-space-x-1.5", + }; + default: + return { + avatarSize: "h-5 w-5", + fontSize: "text-xs", + spacing: "-space-x-1", + }; + } +}; + +/** + * Get the border radius based on the shape prop + * @param shape The shape of the avatar + * @returns The border radius + */ +export const getBorderRadius = (shape: "circle" | "square") => { + switch (shape) { + case "circle": + return "rounded-full"; + case "square": + return "rounded"; + default: + return "rounded-full"; + } +}; + +/** + * Check if the value is a valid number + * @param value The value to check + * @returns Whether the value is a valid number or not + */ +export const isAValidNumber = (value: any) => typeof value === "number" && !isNaN(value); + +export const Avatar: React.FC = (props) => { + const { + name, + fallbackBackgroundColor, + fallbackText, + fallbackTextColor, + showTooltip = true, + size = "md", + shape = "circle", + src, + className = "", + } = props; + + // get size details based on the size prop + const sizeInfo = getSizeInfo(size); + + const fallbackLetter = name?.[0]?.toUpperCase() ?? fallbackText ?? "?"; + return ( +
+ + + + {fallbackLetter} + + +
+ ); +}; diff --git a/packages/propel/src/avatar/index.ts b/packages/propel/src/avatar/index.ts new file mode 100644 index 00000000000..425e62c7b7d --- /dev/null +++ b/packages/propel/src/avatar/index.ts @@ -0,0 +1 @@ +export * from "./avatar"; \ No newline at end of file diff --git a/packages/propel/src/dialog/constants.ts b/packages/propel/src/dialog/constants.ts new file mode 100644 index 00000000000..d08202534ab --- /dev/null +++ b/packages/propel/src/dialog/constants.ts @@ -0,0 +1,17 @@ +export enum EDialogPosition { + TOP = "flex items-center justify-center text-center mx-4 my-10 md:my-20", + CENTER = "flex items-end sm:items-center justify-center p-4 min-h-full", +} + +export enum EDialogWidth { + SM = "sm:max-w-sm", + MD = "sm:max-w-md", + LG = "sm:max-w-lg", + XL = "sm:max-w-xl", + XXL = "sm:max-w-2xl", + XXXL = "sm:max-w-3xl", + XXXXL = "sm:max-w-4xl", + VXL = "sm:max-w-5xl", + VIXL = "sm:max-w-6xl", + VIIXL = "sm:max-w-7xl", +} diff --git a/packages/propel/src/dialog/index.ts b/packages/propel/src/dialog/index.ts new file mode 100644 index 00000000000..1efe34c51ec --- /dev/null +++ b/packages/propel/src/dialog/index.ts @@ -0,0 +1 @@ +export * from "./root"; diff --git a/packages/propel/src/dialog/root.tsx b/packages/propel/src/dialog/root.tsx new file mode 100644 index 00000000000..7cd5e725b10 --- /dev/null +++ b/packages/propel/src/dialog/root.tsx @@ -0,0 +1,77 @@ +"use client"; + +import * as React from "react"; +import { Dialog as BaseDialog } from "@base-ui-components/react"; +import { cn } from "@plane/utils"; +import { EDialogWidth } from "./constants"; + +function DialogPortal({ ...props }: React.ComponentProps) { + return ; +} + +function DialogOverlay({ className, ...props }: React.ComponentProps) { + return ( + + ); +} + +function Dialog({ ...props }: React.ComponentProps) { + return ; +} + +function DialogTrigger({ ...props }: React.ComponentProps) { + return ; +} + +function DialogPanel({ + className, + width = EDialogWidth.XXL, + children, + ...props +}: React.ComponentProps & { width?: EDialogWidth }) { + return ( + + + +
+ {children} +
+
+
+ ); +} + +function DialogTitle({ className, ...props }: React.ComponentProps) { + return ( + + ); +} +// compound components +Dialog.Trigger = DialogTrigger; +Dialog.Panel = DialogPanel; +Dialog.Title = DialogTitle; + +export { Dialog, DialogTitle, DialogTrigger, DialogPanel }; \ No newline at end of file diff --git a/packages/propel/src/menu/index.ts b/packages/propel/src/menu/index.ts new file mode 100644 index 00000000000..660d3ef02a5 --- /dev/null +++ b/packages/propel/src/menu/index.ts @@ -0,0 +1,2 @@ +export * from "./menu"; +export * from "./types"; diff --git a/packages/propel/src/menu/menu.tsx b/packages/propel/src/menu/menu.tsx new file mode 100644 index 00000000000..1817d500609 --- /dev/null +++ b/packages/propel/src/menu/menu.tsx @@ -0,0 +1,210 @@ +import * as React from "react"; +import { Menu as BaseMenu } from "@base-ui-components/react/menu"; +import { ChevronDown, ChevronRight, MoreHorizontal } from "lucide-react"; +// plane imports +import { cn } from "@plane/utils"; +import { TMenuProps, TSubMenuProps, TMenuItemProps } from "./types"; + +// Context for main menu to communicate with submenus +const MenuContext = React.createContext<{ + closeAllSubmenus: () => void; + registerSubmenu: (closeSubmenu: () => void) => () => void; +} | null>(null); + +// SubMenu context for closing submenu from nested items +const SubMenuContext = React.createContext<{ closeSubmenu: () => void } | null>(null); + +// Hook to use submenu context +const useSubMenu = () => React.useContext(SubMenuContext); + +// SubMenu implementation +const SubMenu: React.FC = (props) => { + const { children, trigger, disabled = false, className = "", contentClassName = "" } = props; + + return ( + + + {trigger} + + + + + {children} + + + + ); +}; + +const MenuItem: React.FC = (props) => { + const { children, disabled = false, onClick, className } = props; + const submenuContext = useSubMenu(); + + return ( + { + close(); + onClick?.(e); + submenuContext?.closeSubmenu(); + }} + > + {children} + + ); +}; + +function Menu(props: TMenuProps) { + const { + ariaLabel, + buttonClassName = "", + customButtonClassName = "", + customButtonTabIndex = 0, + placement, + children, + className = "", + customButton, + disabled = false, + ellipsis = false, + label, + maxHeight = "md", + noBorder = false, + noChevron = false, + optionsClassName = "", + menuItemsClassName = "", + verticalEllipsis = false, + portalElement, + menuButtonOnClick, + onMenuClose, + tabIndex, + closeOnSelect, + openOnHover = false, + useCaptureForOutsideClick = false, + handleOpenChange = () => {}, + } = props; + + const [isOpen, setIsOpen] = React.useState(false); + // refs + const submenuClosersRef = React.useRef void>>(new Set()); + + const closeAllSubmenus = React.useCallback(() => { + submenuClosersRef.current.forEach((closeSubmenu) => closeSubmenu()); + }, []); + + const registerSubmenu = React.useCallback((closeSubmenu: () => void) => { + submenuClosersRef.current.add(closeSubmenu); + return () => { + submenuClosersRef.current.delete(closeSubmenu); + }; + }, []); + const openDropdown = () => { + setIsOpen(true); + }; + + const closeDropdown = React.useCallback(() => { + if (isOpen) { + closeAllSubmenus(); + onMenuClose?.(); + } + setIsOpen(false); + }, [isOpen, closeAllSubmenus, onMenuClose]); + + const handleMenuButtonClick = (e: React.MouseEvent) => { + e.stopPropagation(); + e.preventDefault(); + if (isOpen) { + closeDropdown(); + } else { + openDropdown(); + } + if (menuButtonOnClick) menuButtonOnClick(); + }; + + return ( + + {customButton ? ( + + {customButton} + + ) : ( + <> + {ellipsis || verticalEllipsis ? ( + + + + ) : ( + + {label} + {!noChevron && } + + )} + + )} + + + + {children} + + + + + ); +} + +Menu.MenuItem = MenuItem; +Menu.SubMenu = SubMenu; + +export { Menu }; diff --git a/packages/propel/src/menu/types.ts b/packages/propel/src/menu/types.ts new file mode 100644 index 00000000000..a3c42406cbe --- /dev/null +++ b/packages/propel/src/menu/types.ts @@ -0,0 +1,49 @@ +export type TPlacement = "top" | "bottom" | "left" | "right"; + +export type TMenuProps = { + customButtonClassName?: string; + customButtonTabIndex?: number; + buttonClassName?: string; + className?: string; + customButton?: React.ReactNode; + disabled?: boolean; + input?: boolean; + label?: string | React.ReactNode; + maxHeight?: "sm" | "rg" | "md" | "lg"; + noChevron?: boolean; + chevronClassName?: string; + onOpen?: () => void; + optionsClassName?: string; + placement?: TPlacement; + tabIndex?: number; + useCaptureForOutsideClick?: boolean; + children: React.ReactNode; + ellipsis?: boolean; + noBorder?: boolean; + verticalEllipsis?: boolean; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + menuButtonOnClick?: (...args: any) => void; + menuItemsClassName?: string; + onMenuClose?: () => void; + closeOnSelect?: boolean; + portalElement?: Element | null; + openOnHover?: boolean; + ariaLabel?: string; + handleOpenChange?: (open: boolean) => void; +}; + +export type TSubMenuProps = { + children: React.ReactNode; + trigger: React.ReactNode; + disabled?: boolean; + className?: string; + contentClassName?: string; + placement?: TPlacement; +}; + +export type TMenuItemProps = { + children: React.ReactNode; + disabled?: boolean; + onClick?: (args?: any) => void; + className?: string; +}; diff --git a/packages/propel/src/index.ts b/packages/propel/src/tabs/index.ts similarity index 100% rename from packages/propel/src/index.ts rename to packages/propel/src/tabs/index.ts diff --git a/packages/propel/src/tabs/list.tsx b/packages/propel/src/tabs/list.tsx new file mode 100644 index 00000000000..f0e7e806da3 --- /dev/null +++ b/packages/propel/src/tabs/list.tsx @@ -0,0 +1,58 @@ +import React, { FC } from "react"; +import { Tabs as BaseTabs } from "@base-ui-components/react/tabs"; +import { LucideProps } from "lucide-react"; +// helpers +import { cn } from "@plane/utils"; + +export type TabListItem = { + key: string; + icon?: FC; + label?: React.ReactNode; + disabled?: boolean; + onClick?: () => void; +}; + +type TTabListProps = { + tabs: TabListItem[]; + tabListClassName?: string; + tabClassName?: string; + size?: "sm" | "md" | "lg"; + selectedTab?: string; +}; + +export const TabList: FC = ({ tabs, tabListClassName, tabClassName, size = "md", selectedTab }) => ( + + {tabs.map((tab) => ( + + cn( + "flex items-center justify-center p-1 min-w-fit w-full font-medium text-custom-text-100 outline-none focus:outline-none cursor-pointer transition-all rounded", + (selectedTab ? selectedTab === tab.key : selected) + ? "bg-custom-background-100 text-custom-text-100 shadow-sm" + : tab.disabled + ? "text-custom-text-400 cursor-not-allowed" + : "text-custom-text-400 hover:text-custom-text-300 hover:bg-custom-background-80/60", + { + "text-xs": size === "sm", + "text-sm": size === "md", + "text-base": size === "lg", + }, + tabClassName + ) + } + key={tab.key} + disabled={tab.disabled} + > + {tab.icon && } + {tab.label} + + ))} + + + +); \ No newline at end of file diff --git a/packages/propel/src/tabs/tabs.tsx b/packages/propel/src/tabs/tabs.tsx new file mode 100644 index 00000000000..4a4a663190b --- /dev/null +++ b/packages/propel/src/tabs/tabs.tsx @@ -0,0 +1,91 @@ +import React, { FC, useEffect, useState } from "react"; +import { Tabs as BaseTabs } from "@base-ui-components/react/tabs"; +// helpers +import { useLocalStorage } from "@plane/hooks"; +import { cn } from "@plane/utils"; +// types +import { TabList, TabListItem } from "./list"; + +export type TabContent = { + content: React.ReactNode; +}; + +export type TabItem = TabListItem & TabContent; + +type TTabsProps = { + tabs: TabItem[]; + storageKey?: string; + actions?: React.ReactNode; + defaultTab?: string; + containerClassName?: string; + tabListContainerClassName?: string; + tabListClassName?: string; + tabClassName?: string; + tabPanelClassName?: string; + size?: "sm" | "md" | "lg"; + storeInLocalStorage?: boolean; +}; + +export const Tabs: FC = (props: TTabsProps) => { + const { + tabs, + storageKey, + actions, + defaultTab = tabs[0]?.key, + containerClassName = "", + tabListContainerClassName = "", + tabListClassName = "", + tabClassName = "", + tabPanelClassName = "", + size = "md", + storeInLocalStorage = true, + } = props; + + const { storedValue, setValue } = useLocalStorage( + storeInLocalStorage && storageKey ? `tab-${storageKey}` : `tab-${tabs[0]?.key}`, + defaultTab + ); + + const [activeIndex, setActiveIndex] = useState(() => { + const initialTab = storedValue ?? defaultTab; + return tabs.findIndex((tab) => tab.key === initialTab); + }); + + useEffect(() => { + if (storeInLocalStorage && tabs[activeIndex]) { + setValue(tabs[activeIndex].key); + } + }, [activeIndex, setValue, storeInLocalStorage, tabs]); + + const handleTabChange = (index: number) => { + setActiveIndex(index); + if (!tabs[index].disabled) { + tabs[index].onClick?.(); + } + }; + + return ( + +
+ + {actions &&
{actions}
} +
+ + {tabs.map((tab) => ( + + {tab.content} + + ))} +
+ ); +}; \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 8c1e7f19e95..0b27409898c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -150,13 +150,13 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== -"@babel/helpers@7.26.10", "@babel/helpers@^7.27.6": - version "7.26.10" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.10.tgz#6baea3cd62ec2d0c1068778d63cb1314f6637384" - integrity sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g== +"@babel/helpers@^7.27.6": + version "7.28.3" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.3.tgz#b83156c0a2232c133d1b535dd5d3452119c7e441" + integrity sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw== dependencies: - "@babel/template" "^7.26.9" - "@babel/types" "^7.26.10" + "@babel/template" "^7.27.2" + "@babel/types" "^7.28.2" "@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.27.2", "@babel/parser@^7.28.0": version "7.28.0" @@ -165,14 +165,19 @@ dependencies: "@babel/types" "^7.28.0" -"@babel/runtime@7.26.10", "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.17.8", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.13", "@babel/runtime@^7.23.9", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.17.8", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.13", "@babel/runtime@^7.23.9", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": version "7.26.10" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.10.tgz#a07b4d8fa27af131a633d7b3524db803eb4764c2" integrity sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.26.9", "@babel/template@^7.27.2": +"@babel/runtime@^7.27.6": + version "7.28.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.28.3.tgz#75c5034b55ba868121668be5d5bb31cc64e6e61a" + integrity sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA== + +"@babel/template@^7.27.2": version "7.27.2" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d" integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== @@ -202,7 +207,7 @@ "@babel/helper-string-parser" "^7.27.1" "@babel/helper-validator-identifier" "^7.27.1" -"@babel/types@^7.26.10": +"@babel/types@^7.28.2": version "7.28.2" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.2.tgz#da9db0856a9a88e0a13b019881d7513588cf712b" integrity sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ== @@ -210,6 +215,29 @@ "@babel/helper-string-parser" "^7.27.1" "@babel/helper-validator-identifier" "^7.27.1" +"@base-ui-components/react@^1.0.0-beta.2": + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/@base-ui-components/react/-/react-1.0.0-beta.2.tgz#9a07bb6a462907b13aa35979e2b8235cc145adbc" + integrity sha512-jfAUfSgXvsfr8mQi7r/6gLG8U1Ybr77NN8WK5IXXM0c/hBvFDBtvUfwDJACV0gXiYbSKpA+dRzZz01V1tULobA== + dependencies: + "@babel/runtime" "^7.27.6" + "@base-ui-components/utils" "0.1.0" + "@floating-ui/react-dom" "^2.1.5" + "@floating-ui/utils" "^0.2.10" + reselect "^5.1.1" + tabbable "^6.2.0" + use-sync-external-store "^1.5.0" + +"@base-ui-components/utils@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@base-ui-components/utils/-/utils-0.1.0.tgz#56d0c801eb5afda7fe3f16b94b78cb75745d1eb1" + integrity sha512-9+uaWyF1o/PgXqHLJnC81IIG0HlV3o9eFCQ5hWZDMx5NHrFk0rrwqEFGQOB8lti/rnbxNPi+kYYw1D4e8xSn/Q== + dependencies: + "@babel/runtime" "^7.27.6" + "@floating-ui/utils" "^0.2.10" + reselect "^5.1.1" + use-sync-external-store "^1.5.0" + "@blueprintjs/colors@^4.2.1": version "4.2.1" resolved "https://registry.yarnpkg.com/@blueprintjs/colors/-/colors-4.2.1.tgz#603b2512caee84feddcb3dbd536534c140b9a1f3" @@ -634,6 +662,13 @@ dependencies: "@floating-ui/utils" "^0.2.10" +"@floating-ui/core@^1.7.3": + version "1.7.3" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.7.3.tgz#462d722f001e23e46d86fd2bd0d21b7693ccb8b7" + integrity sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w== + dependencies: + "@floating-ui/utils" "^0.2.10" + "@floating-ui/dom@^1.7.1", "@floating-ui/dom@^1.7.2": version "1.7.2" resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.7.2.tgz#3540b051cf5ce0d4f4db5fb2507a76e8ea5b4a45" @@ -642,6 +677,14 @@ "@floating-ui/core" "^1.7.2" "@floating-ui/utils" "^0.2.10" +"@floating-ui/dom@^1.7.3": + version "1.7.3" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.7.3.tgz#6174ac3409e6a064bbdf1f4bb07188ee9461f8cf" + integrity sha512-uZA413QEpNuhtb3/iIKoYMSK07keHPYeXF02Zhd6e213j+d1NamLix/mCLxBUDW/Gx52sPH2m+chlUsyaBs/Ag== + dependencies: + "@floating-ui/core" "^1.7.3" + "@floating-ui/utils" "^0.2.10" + "@floating-ui/react-dom@^2.1.2": version "2.1.4" resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.1.4.tgz#a0689be8978352fff2be2dfdd718cf668c488ec3" @@ -649,6 +692,13 @@ dependencies: "@floating-ui/dom" "^1.7.2" +"@floating-ui/react-dom@^2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.1.5.tgz#d11e3726d2eb385d8cf3216348742907c1d49fcf" + integrity sha512-HDO/1/1oH9fjj4eLgegrlH3dklZpHtUYYFiVwMUwfGvk9jWDRWqkklA2/NFScknrcNSspbV868WjXORvreDX+Q== + dependencies: + "@floating-ui/dom" "^1.7.3" + "@floating-ui/react@^0.26.4": version "0.26.28" resolved "https://registry.yarnpkg.com/@floating-ui/react/-/react-0.26.28.tgz#93f44ebaeb02409312e9df9507e83aab4a8c0dc7" @@ -1171,7 +1221,7 @@ "@radix-ui/react-use-callback-ref" "1.1.1" "@radix-ui/react-use-layout-effect" "1.1.1" -"@radix-ui/react-slot@1.2.3", "@radix-ui/react-slot@^1.1.1": +"@radix-ui/react-slot@1.2.3": version "1.2.3" resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.2.3.tgz#502d6e354fc847d4169c3bc5f189de777f68cfe1" integrity sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A== @@ -2465,7 +2515,7 @@ "@types/express-serve-static-core" "*" "@types/ws" "*" -"@types/express@*", "@types/express@4.17.23", "@types/express@^4.17.21", "@types/express@^4.17.23": +"@types/express@*", "@types/express@^4.17.21", "@types/express@^4.17.23": version "4.17.23" resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.23.tgz#35af3193c640bfd4d7fe77191cd0ed411a433bef" integrity sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ== @@ -3736,6 +3786,15 @@ bind-event-listener@^3.0.0: resolved "https://registry.yarnpkg.com/bind-event-listener/-/bind-event-listener-3.0.0.tgz#c90f9a7fcb65cac21045f810c20ef7e647a74921" integrity sha512-PJvH288AWQhKs2v9zyfYdPzlPqf5bXbGMmhmUIY9x4dAUGIWgomO771oBQNwJnMQSnUIXhKu6sgzpBRXTlvb8Q== +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + bluebird@^3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" @@ -3764,7 +3823,15 @@ boolbase@^1.0.0: resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== -brace-expansion@2.0.2, brace-expansion@^1.1.7, brace-expansion@^2.0.1: +brace-expansion@^1.1.7: + version "1.1.12" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" + integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7" integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== @@ -3812,6 +3879,14 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + buffer@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" @@ -3962,7 +4037,7 @@ check-error@^2.1.1: resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.1.tgz#87eb876ae71ee388fa0471fe423f494be1d96ccc" integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw== -chokidar@3.6.0, chokidar@^3.3.0, chokidar@^3.5.2, chokidar@^3.5.3, chokidar@^3.6.0, chokidar@^4.0.3: +chokidar@^3.3.0, chokidar@^3.5.2, chokidar@^3.5.3, chokidar@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== @@ -3977,6 +4052,18 @@ chokidar@3.6.0, chokidar@^3.3.0, chokidar@^3.5.2, chokidar@^3.5.3, chokidar@^3.6 optionalDependencies: fsevents "~2.3.2" +chokidar@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" + integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== + dependencies: + readdirp "^4.0.1" + +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + chromatic@^11.4.0: version "11.29.0" resolved "https://registry.yarnpkg.com/chromatic/-/chromatic-11.29.0.tgz#da556dbd3b043e8c6a3134d1afa3bb4ad7317410" @@ -4173,6 +4260,11 @@ compute-scroll-into-view@^3.0.2: resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz#02c3386ec531fb6a9881967388e53e8564f3e9aa" integrity sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw== +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + concurrently@^9.0.1: version "9.2.0" resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-9.2.0.tgz#233e3892ceb0b5db9fd49e9c8c739737a7b638b5" @@ -4887,7 +4979,7 @@ encodeurl@~2.0.0: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== -end-of-stream@^1.1.0: +end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.5" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.5.tgz#7344d711dea40e0b74abc2ed49778743ccedb08c" integrity sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg== @@ -5075,7 +5167,7 @@ esbuild-register@^3.5.0: dependencies: debug "^4.3.4" -esbuild@0.25.0, "esbuild@^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0", esbuild@^0.25.0: +"esbuild@^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0", esbuild@^0.25.0: version "0.25.0" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.0.tgz#0de1787a77206c5a79eeb634a623d39b5006ce92" integrity sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw== @@ -5755,6 +5847,11 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + fs-extra@^10.0.0: version "10.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" @@ -6166,7 +6263,7 @@ icss-utils@^5.0.0, icss-utils@^5.1.0: resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== -ieee754@^1.2.1: +ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -6219,7 +6316,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -7389,7 +7486,7 @@ minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.6: resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== -mkdirp-classic@^0.5.3: +mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== @@ -7458,7 +7555,12 @@ mz@^2.7.0: object-assign "^4.0.1" thenify-all "^1.0.0" -nanoid@3.3.8, nanoid@^3.3.11, nanoid@^3.3.6: +nanoid@^3.3.11: + version "3.3.11" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" + integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== + +nanoid@^3.3.6: version "3.3.8" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== @@ -8473,7 +8575,7 @@ prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transfor dependencies: prosemirror-model "^1.21.0" -prosemirror-view@1.40.0, prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.27.0, prosemirror-view@^1.31.0, prosemirror-view@^1.37.0, prosemirror-view@^1.39.1: +prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.27.0, prosemirror-view@^1.31.0, prosemirror-view@^1.37.0, prosemirror-view@^1.39.1: version "1.40.0" resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.40.0.tgz#212e627a0c4f0198ac9823a1232e0099c9a92865" integrity sha512-2G3svX0Cr1sJjkD/DYWSe3cfV5VPVTBOxI9XQEGWJDFEpsZb/gh4MV29ctv+OJx2RFX4BLt09i+6zaGM/ldkCw== @@ -8829,7 +8931,7 @@ read-cache@^1.0.0: dependencies: pify "^2.3.0" -readable-stream@^3.4.0, readable-stream@^3.6.2: +readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.2: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -8849,6 +8951,11 @@ readable-stream@^4.0.0: process "^0.11.10" string_decoder "^1.3.0" +readdirp@^4.0.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" + integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -9001,6 +9108,11 @@ require-from-string@^2.0.2: resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== +reselect@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-5.1.1.tgz#c766b1eb5d558291e5e550298adb0becc24bb72e" + integrity sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w== + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -9781,7 +9893,7 @@ symbol-tree@^3.2.4: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -tabbable@^6.0.0: +tabbable@^6.0.0, tabbable@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== @@ -9829,7 +9941,17 @@ tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.2.tgz#ab4984340d30cb9989a490032f086dbb8b56d872" integrity sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg== -tar-fs@3.0.9, tar-fs@^2.0.0, tar-fs@^3.0.4: +tar-fs@^2.0.0: + version "2.1.3" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.3.tgz#fb3b8843a26b6f13a08e606f7922875eb1fbbf92" + integrity sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-fs@^3.0.4: version "3.0.9" resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.9.tgz#d570793c6370d7078926c41fa422891566a0b617" integrity sha512-XF4w9Xp+ZQgifKakjZYmFdkLoSWd34VGKcsTCwlNWM7QG3ZbaxnTsaBwnjFZqHRf/rROxaR8rXnbtwdvaDI+lA== @@ -9840,6 +9962,17 @@ tar-fs@3.0.9, tar-fs@^2.0.0, tar-fs@^3.0.4: bare-fs "^4.0.1" bare-path "^3.0.0" +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + tar-stream@^3.1.5: version "3.1.7" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.1.7.tgz#24b3fb5eabada19fe7338ed6d26e5f7c482e792b" @@ -10463,7 +10596,7 @@ use-sidecar@^1.1.3: detect-node-es "^1.1.0" tslib "^2.0.0" -use-sync-external-store@^1, use-sync-external-store@^1.4.0: +use-sync-external-store@^1, use-sync-external-store@^1.4.0, use-sync-external-store@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz#55122e2a3edd2a6c106174c27485e0fd59bcfca0" integrity sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==