diff --git a/packages/lab/package.json b/packages/lab/package.json index 162f513139d..ab5fa869d29 100644 --- a/packages/lab/package.json +++ b/packages/lab/package.json @@ -12,7 +12,6 @@ "sideEffects": false, "dependencies": { "@floating-ui/react": "^0.26.5", - "@fluentui/react-overflow": "^9.0.19", "@internationalized/date": "^3.0.0", "@types/react-window": "^1.8.2", "aria-hidden": "^1.1.1", diff --git a/packages/lab/src/tabs-next/TabNext.tsx b/packages/lab/src/tabs-next/TabNext.tsx index 24ed3f64cfe..3eef84b2fbc 100644 --- a/packages/lab/src/tabs-next/TabNext.tsx +++ b/packages/lab/src/tabs-next/TabNext.tsx @@ -16,7 +16,7 @@ import { import { CloseIcon } from "@salt-ds/icons"; import tabCss from "./TabNext.css"; -import { useTabs } from "./TabNextContext"; +import { useTabstrip } from "./TabstripNextContext"; const withBaseName = makePrefixer("saltTabNext"); @@ -24,7 +24,7 @@ export interface TabNextProps extends ComponentPropsWithoutRef<"div"> { /* Value prop is mandatory and must be unique in order for overflow to work. */ disabled?: boolean; value: string; - onClose?: () => void; + closable?: boolean; } export const TabNext = forwardRef( @@ -35,7 +35,7 @@ export const TabNext = forwardRef( className, disabled: disabledProp, onClick, - onClose, + closable, onKeyDown, onFocus, value, @@ -51,10 +51,11 @@ export const TabNext = forwardRef( registerItem, variant, setSelected, + setActive, selected, focusInside, handleClose, - } = useTabs(); + } = useTabstrip(); const disabled = disabledProp; const tabRef = useRef(null); @@ -87,25 +88,38 @@ export const TabNext = forwardRef( const handleFocus = () => { setFocused(true); + setActive(value); }; const handleBlur = () => { setFocused(false); }; - const handleCloseButton = (event: MouseEvent) => { - onClose?.(); + const handleCloseButtonClick = (event: MouseEvent) => { handleClose(event, value); event.stopPropagation(); }; + const handleCloseButtonKeyDown = ( + event: KeyboardEvent, + ) => { + if (event.key === "Enter" || event.key === " ") { + handleClose(event, value); + event.stopPropagation(); + } + }; + return (
( {children} - {onClose ? ( + {closable ? ( diff --git a/packages/lab/src/tabs-next/TabNextContext.tsx b/packages/lab/src/tabs-next/TabNextContext.tsx deleted file mode 100644 index 5e544285cdb..00000000000 --- a/packages/lab/src/tabs-next/TabNextContext.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { createContext } from "@salt-ds/core"; -import { type ReactNode, type SyntheticEvent, useContext } from "react"; - -interface TabValue { - id: string; - element: HTMLElement; -} - -export interface TabsContextValue { - registerItem: (tab: TabValue) => void; - variant: "main" | "inline"; - setSelected: (event: SyntheticEvent, id: string) => void; - handleClose: (event: SyntheticEvent, id: string) => void; - selected?: string; - focusInside: boolean; -} - -export const TabsContext = createContext("TabsContext", { - registerItem: () => undefined, - variant: "main", - setSelected: () => undefined, - handleClose: () => undefined, - selected: undefined, - focusInside: false, -}); - -export function useTabs() { - return useContext(TabsContext); -} diff --git a/packages/lab/src/tabs-next/TabNextPanel.tsx b/packages/lab/src/tabs-next/TabNextPanel.tsx new file mode 100644 index 00000000000..e3d93455944 --- /dev/null +++ b/packages/lab/src/tabs-next/TabNextPanel.tsx @@ -0,0 +1,17 @@ +import { useId } from "@salt-ds/core"; +import { type ComponentPropsWithoutRef, forwardRef } from "react"; + +export interface TabNextPanelProps extends ComponentPropsWithoutRef<"div"> {} + +export const TabNextPanel = forwardRef( + function TabNextPanel(props, ref) { + const { children, id: idProp, ...rest } = props; + const id = useId(idProp); + + return ( +
+ {children} +
+ ); + }, +); diff --git a/packages/lab/src/tabs-next/TabOverflowList.tsx b/packages/lab/src/tabs-next/TabOverflowList.tsx index 484719d2f2b..108a39ef081 100644 --- a/packages/lab/src/tabs-next/TabOverflowList.tsx +++ b/packages/lab/src/tabs-next/TabOverflowList.tsx @@ -91,7 +91,11 @@ export const TabOverflowList = forwardRef( onBlur={handleBlur} onClick={handleListClick} ref={refs.setFloating} - style={{ left: x ?? 0, top: y ?? 0, position: strategy }} + style={ + !hidden + ? { left: x ?? 0, top: y ?? 0, position: strategy } + : undefined + } tabIndex={-1} >
{children}
diff --git a/packages/lab/src/tabs-next/TabsNext.tsx b/packages/lab/src/tabs-next/TabsNext.tsx new file mode 100644 index 00000000000..e2e1adb9520 --- /dev/null +++ b/packages/lab/src/tabs-next/TabsNext.tsx @@ -0,0 +1,13 @@ +import type { ReactNode } from "react"; + +import { TabsNextContext } from "./TabsNextContext"; + +export interface TabsNextProps { + children: ReactNode; +} + +export function TabsNext({ children }: TabsNextProps) { + return ( + {children} + ); +} diff --git a/packages/lab/src/tabs-next/TabsNextContext.tsx b/packages/lab/src/tabs-next/TabsNextContext.tsx new file mode 100644 index 00000000000..f2730ef4ae2 --- /dev/null +++ b/packages/lab/src/tabs-next/TabsNextContext.tsx @@ -0,0 +1,14 @@ +import { createContext } from "@salt-ds/core"; +import { useContext } from "react"; + +// biome-ignore lint/complexity/noBannedTypes: +export type TabsNextContextValue = {}; + +export const TabsNextContext = createContext( + "TabsNextContext", + {}, +); + +export function useTabsNext() { + return useContext(TabsNextContext); +} diff --git a/packages/lab/src/tabs-next/TabstripNext.tsx b/packages/lab/src/tabs-next/TabstripNext.tsx index 717e721f9cc..ad96e099d0d 100644 --- a/packages/lab/src/tabs-next/TabstripNext.tsx +++ b/packages/lab/src/tabs-next/TabstripNext.tsx @@ -12,9 +12,9 @@ import { useState, } from "react"; -import { TabsContext } from "./TabNextContext"; import { TabOverflowList } from "./TabOverflowList"; import tabstripCss from "./TabstripNext.css"; +import { TabstripNextContext } from "./TabstripNextContext"; import { useOverflow } from "./useOverflow"; import { useTabstrip } from "./useTabstrip"; @@ -35,6 +35,7 @@ export interface TabstripNextProps /* The Tabs variant */ variant?: "main" | "inline"; onAdd?: () => void; + onClose?: (event: SyntheticEvent, value: string) => void; } export const TabstripNext = forwardRef( @@ -47,6 +48,7 @@ export const TabstripNext = forwardRef( value, defaultValue, onAdd, + onClose, onChange, onKeyDown, style, @@ -69,6 +71,7 @@ export const TabstripNext = forwardRef( registerItem, setSelected, selected, + setActive, handleKeyDown, items, handleClose, @@ -76,6 +79,7 @@ export const TabstripNext = forwardRef( defaultSelected: defaultValue, selected: value, onChange, + onClose, }); const [visible, hidden, isMeasuring] = useOverflow({ @@ -103,10 +107,19 @@ export const TabstripNext = forwardRef( variant, setSelected, selected, + setActive, focusInside, handleClose, }), - [variant, setSelected, selected, registerItem, focusInside, handleClose], + [ + variant, + setSelected, + selected, + registerItem, + focusInside, + handleClose, + setActive, + ], ); const tabstripStyle = { @@ -115,7 +128,7 @@ export const TabstripNext = forwardRef( }; return ( - +
( {hidden}
-
+ ); }, ); diff --git a/packages/lab/src/tabs-next/TabstripNextContext.tsx b/packages/lab/src/tabs-next/TabstripNextContext.tsx new file mode 100644 index 00000000000..1e2c827cfaa --- /dev/null +++ b/packages/lab/src/tabs-next/TabstripNextContext.tsx @@ -0,0 +1,34 @@ +import { createContext } from "@salt-ds/core"; +import { type SyntheticEvent, useContext } from "react"; + +interface TabValue { + id: string; + element: HTMLElement; +} + +export interface TabstripNextContextValue { + registerItem: (tab: TabValue) => void; + variant: "main" | "inline"; + setSelected: (event: SyntheticEvent, id: string) => void; + setActive: (id: string) => void; + handleClose: (event: SyntheticEvent, id: string) => void; + selected?: string; + focusInside: boolean; +} + +export const TabstripNextContext = createContext( + "TabstripNextContext", + { + registerItem: () => undefined, + variant: "main", + setSelected: () => undefined, + setActive: () => undefined, + handleClose: () => undefined, + selected: undefined, + focusInside: false, + }, +); + +export function useTabstrip() { + return useContext(TabstripNextContext); +} diff --git a/packages/lab/src/tabs-next/useOverflow.ts b/packages/lab/src/tabs-next/useOverflow.ts index 12775f228e2..41d7536e052 100644 --- a/packages/lab/src/tabs-next/useOverflow.ts +++ b/packages/lab/src/tabs-next/useOverflow.ts @@ -159,6 +159,7 @@ export function useOverflow({ tabs.length, ]); + // biome-ignore lint/correctness/useExhaustiveDependencies: we want to update when selected changes. useIsomorphicLayoutEffect(() => { updateOverflow(); }, [updateOverflow, selected]); diff --git a/packages/lab/src/tabs-next/useTabstrip.tsx b/packages/lab/src/tabs-next/useTabstrip.tsx index aa4e59b35d2..2ebcb985b7e 100644 --- a/packages/lab/src/tabs-next/useTabstrip.tsx +++ b/packages/lab/src/tabs-next/useTabstrip.tsx @@ -7,6 +7,7 @@ import { useRef, useState, } from "react"; +import type { TabstripNextProps } from "./TabstripNext"; export interface Item { id: string; @@ -107,7 +108,6 @@ function useCollection({ wrap }: UseCollectionProps) { return items[newIndex]?.id; }, getFirst: () => { - console.log(items); return items[0]?.id; }, getLast: () => { @@ -121,10 +121,12 @@ export function useTabstrip({ selected: selectedProp, defaultSelected, onChange, + onClose, }: { - selected?: string; - defaultSelected?: string; - onChange?: (event: SyntheticEvent, selected: string) => void; + selected?: TabstripNextProps["value"]; + defaultSelected?: TabstripNextProps["defaultValue"]; + onChange?: TabstripNextProps["onChange"]; + onClose?: TabstripNextProps["onClose"]; }) { const { registerItem, item, getNext, getPrevious, getFirst, getLast, items } = useCollection({ wrap: true }); @@ -167,6 +169,7 @@ export function useTabstrip({ } else { setActive(newActive); } + onClose?.(event, id); }, [getFirst, getNext, getPrevious, selected], ); diff --git a/packages/lab/stories/tabstrip-next/tabstrip-next.stories.tsx b/packages/lab/stories/tabstrip-next/tabstrip-next.stories.tsx index 8a31f8ea120..2b12aae6042 100644 --- a/packages/lab/stories/tabstrip-next/tabstrip-next.stories.tsx +++ b/packages/lab/stories/tabstrip-next/tabstrip-next.stories.tsx @@ -243,10 +243,7 @@ LotsOfTabsTabstrip.args = { ], }; -export const Dismissable: TabstripStory = ({ - width = 600, - ...tabstripProps -}) => { +export const Closable: TabstripStory = ({ width = 600, ...tabstripProps }) => { const [tabs, setTabs] = useState([ "Home", "Transactions", @@ -257,15 +254,15 @@ export const Dismissable: TabstripStory = ({ return (
- + { + setTabs(tabs.filter((tab) => tab !== closedTab)); + }} + {...tabstripProps} + > {tabs.map((label) => ( - { - setTabs(tabs.filter((tab) => tab !== label)); - }} - > + {label} {label === "Transactions" && } diff --git a/site/docs/components/tabs/examples.mdx b/site/docs/components/tabs/examples.mdx index 8114ee6614f..4f6d4fa7356 100644 --- a/site/docs/components/tabs/examples.mdx +++ b/site/docs/components/tabs/examples.mdx @@ -11,7 +11,7 @@ data: -## Main tabstrip (default) +## Main tabstrip The main tabstrip uses a border to separate the tabs from the rest of the page. You can align tabs inside the tabstrip can be aligned to the left, center or right. Use it to organize content across the main region of an interface under the app header. @@ -51,5 +51,34 @@ Ensure that icon descriptors are used consistently across all tabs within the st Tabs can feature a [badge](../badge) that serves as a visual cue. They can inform users of additional context, notifications, or new content. + + + + +## Add a new tab + +When `onAdd` is set on the `Tabstrip` component, a button will appear that allows users to add a new tab. + +### Best practices + +- Provide enough space to display several newly added tabs before overflow is enabled. +- Set the new tab to be the active tab when it is added. + + + + + +## Closable tabs + +Tabs can be set as closable using the `closable` prop. When a tab is closable, a close button appears on the right side of the tab. A tab can be closed, whether it is active or inactive. + +When closing a tab, a warning dialog may be used when closing a tab will result in data loss. + +### Best practices + +- Don't use closable tabs for tabs that are essential to the user's workflow. +- Don't allow users to close the last tab in a tabstrip. + + diff --git a/site/src/examples/tabs/AddANewTab.tsx b/site/src/examples/tabs/AddANewTab.tsx new file mode 100644 index 00000000000..ecfa94fa00b --- /dev/null +++ b/site/src/examples/tabs/AddANewTab.tsx @@ -0,0 +1,33 @@ +import { TabNext, TabstripNext } from "@salt-ds/lab"; +import { type ReactElement, useState } from "react"; + +export const AddANewTab = (): ReactElement => { + const [tabData, setTabData] = useState({ + tabs: ["Home", "Transactions", "Loans"], + value: "Home", + }); + + return ( + + setTabData((old) => ({ ...old, value: newValue })) + } + onAdd={() => { + setTabData((old) => { + const newTab = `Tab ${old.tabs.length + 1}`; + return { + tabs: old.tabs.concat([newTab]), + value: newTab, + }; + }); + }} + > + {tabData.tabs.map((label) => ( + + {label} + + ))} + + ); +}; diff --git a/site/src/examples/tabs/ClosableTabs.tsx b/site/src/examples/tabs/ClosableTabs.tsx new file mode 100644 index 00000000000..49bd1b4166b --- /dev/null +++ b/site/src/examples/tabs/ClosableTabs.tsx @@ -0,0 +1,29 @@ +import { Badge } from "@salt-ds/core"; +import { TabNext, TabstripNext } from "@salt-ds/lab"; +import { type ReactElement, useState } from "react"; + +export const ClosableTabs = (): ReactElement => { + const [tabs, setTabs] = useState([ + "Home", + "Transactions", + "Loans", + "Checks", + "Liquidity", + ]); + + return ( + { + setTabs(tabs.filter((tab) => tab !== closedTab)); + }} + > + {tabs.map((label) => ( + 1}> + {label} + {label === "Transactions" && } + + ))} + + ); +}; diff --git a/site/src/examples/tabs/index.ts b/site/src/examples/tabs/index.ts index d36eaf6a42b..4f3868c7ca4 100644 --- a/site/src/examples/tabs/index.ts +++ b/site/src/examples/tabs/index.ts @@ -2,3 +2,5 @@ export * from "./MainTabstrip"; export * from "./Inline"; export * from "./WithIcon"; export * from "./WithBadge"; +export * from "./AddANewTab"; +export * from "./ClosableTabs"; diff --git a/yarn.lock b/yarn.lock index 2bf720b5a5a..d1d3a327a12 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2287,7 +2287,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.12.1, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.14.6, @babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.16.3, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.20.1, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.2, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": +"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.12.1, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.14.6, @babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.16.3, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.20.1, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.2, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": version: 7.24.6 resolution: "@babel/runtime@npm:7.24.6" dependencies: @@ -3667,92 +3667,6 @@ __metadata: languageName: node linkType: hard -"@fluentui/keyboard-keys@npm:^9.0.3": - version: 9.0.3 - resolution: "@fluentui/keyboard-keys@npm:9.0.3" - dependencies: - "@swc/helpers": "npm:^0.4.14" - checksum: 10/2aa9a572923ce95abaea18c83eabfdb9f2e205b1022748228ba534413186b7bbc41e5eb4bc3f0bb6c2ec36b2641d6ef11e605a261bc96a6550db4b0af5fa3661 - languageName: node - linkType: hard - -"@fluentui/priority-overflow@npm:^9.1.0": - version: 9.1.0 - resolution: "@fluentui/priority-overflow@npm:9.1.0" - dependencies: - "@swc/helpers": "npm:^0.4.14" - checksum: 10/362ae2ce93d20f63cf1b8a4e84d54f1e6f3c78e3dc076b85d9bdcbc00c86edd2953bd7fee32d864caec71dd04c4a6531473e08d5424a360084725778cb22a60c - languageName: node - linkType: hard - -"@fluentui/react-context-selector@npm:^9.1.23": - version: 9.1.23 - resolution: "@fluentui/react-context-selector@npm:9.1.23" - dependencies: - "@fluentui/react-utilities": "npm:^9.9.3" - "@swc/helpers": "npm:^0.4.14" - peerDependencies: - "@types/react": ">=16.8.0 <19.0.0" - "@types/react-dom": ">=16.8.0 <19.0.0" - react: ">=16.8.0 <19.0.0" - react-dom: ">=16.8.0 <19.0.0" - scheduler: ^0.19.0 || ^0.20.0 - checksum: 10/ea425743bff2b55c63662d02a1c5ef73e61d44dec7fc9fb5795afdbb880100289f626d9b460ed293fc0ecb22e81bba35350ee9be612846af71003e9b4f494717 - languageName: node - linkType: hard - -"@fluentui/react-overflow@npm:^9.0.19": - version: 9.0.20 - resolution: "@fluentui/react-overflow@npm:9.0.20" - dependencies: - "@fluentui/priority-overflow": "npm:^9.1.0" - "@fluentui/react-context-selector": "npm:^9.1.23" - "@fluentui/react-theme": "npm:^9.1.9" - "@fluentui/react-utilities": "npm:^9.9.3" - "@griffel/react": "npm:^1.5.7" - "@swc/helpers": "npm:^0.4.14" - peerDependencies: - "@types/react": ">=16.8.0 <19.0.0" - "@types/react-dom": ">=16.8.0 <19.0.0" - react: ">=16.8.0 <19.0.0" - react-dom: ">=16.8.0 <19.0.0" - scheduler: ^0.19.0 || ^0.20.0 - checksum: 10/4df6c011352652d17f4157d3e502e1a05cca82180cf1677d825e4834d91d3311651b9c6fab4844ebb1a9e908326eb25682dc73543e949b5cc3b8b66996b03c0e - languageName: node - linkType: hard - -"@fluentui/react-theme@npm:^9.1.9": - version: 9.1.9 - resolution: "@fluentui/react-theme@npm:9.1.9" - dependencies: - "@fluentui/tokens": "npm:1.0.0-alpha.6" - "@swc/helpers": "npm:^0.4.14" - checksum: 10/9cfef8488fb62efbf69123666d0f2f76be0b6a290df25912dde3e59006553dd1dda9542e666b04be5a3499a9fc09e93eb25e81d72b353d7d5a57b33fe1dc99f2 - languageName: node - linkType: hard - -"@fluentui/react-utilities@npm:^9.9.3": - version: 9.9.3 - resolution: "@fluentui/react-utilities@npm:9.9.3" - dependencies: - "@fluentui/keyboard-keys": "npm:^9.0.3" - "@swc/helpers": "npm:^0.4.14" - peerDependencies: - "@types/react": ">=16.8.0 <19.0.0" - react: ">=16.8.0 <19.0.0" - checksum: 10/48b312c4cdc4680a3188473b0388c3c92eb3c881924a7d52ce9e2f3bcaa06c44825203ad6cff93f504d997f866b3de9f132ff7fa6504d71c348900fc60d39619 - languageName: node - linkType: hard - -"@fluentui/tokens@npm:1.0.0-alpha.6": - version: 1.0.0-alpha.6 - resolution: "@fluentui/tokens@npm:1.0.0-alpha.6" - dependencies: - "@swc/helpers": "npm:^0.4.14" - checksum: 10/b4c852066f83c7c857157f049241791a233d8343ee755e214e04f5576809267df4a66fb5133f563ad17538f09b8581dd953a9b132a64aed685bc3483e5f731f4 - languageName: node - linkType: hard - "@fontsource/open-sans@npm:^4.5.13": version: 4.5.13 resolution: "@fontsource/open-sans@npm:4.5.13" @@ -3774,31 +3688,6 @@ __metadata: languageName: node linkType: hard -"@griffel/core@npm:^1.11.0": - version: 1.11.0 - resolution: "@griffel/core@npm:1.11.0" - dependencies: - "@emotion/hash": "npm:^0.9.0" - csstype: "npm:^3.1.2" - rtl-css-js: "npm:^1.16.1" - stylis: "npm:^4.0.13" - tslib: "npm:^2.1.0" - checksum: 10/73b9e74ecf8d1029ad225f0075ae205b46d00859b12f1553111ce0989dc6b20f2aff2f9b2deb45a8c8c6851c45f2eb60f46f8fccc8511efd39b269f53330614b - languageName: node - linkType: hard - -"@griffel/react@npm:^1.5.7": - version: 1.5.7 - resolution: "@griffel/react@npm:1.5.7" - dependencies: - "@griffel/core": "npm:^1.11.0" - tslib: "npm:^2.1.0" - peerDependencies: - react: ">=16.8.0 <19.0.0" - checksum: 10/2627a78d16133d2972048f2d3c586e44cd74f724884f17ddeb7d0f77b112fdf882a4f55af8da0a657af9aefbe6271a95c2b92eb31f770ec23ffe497af2bf1223 - languageName: node - linkType: hard - "@humanwhocodes/config-array@npm:^0.5.0": version: 0.5.0 resolution: "@humanwhocodes/config-array@npm:0.5.0" @@ -5693,7 +5582,6 @@ __metadata: resolution: "@salt-ds/lab@workspace:packages/lab" dependencies: "@floating-ui/react": "npm:^0.26.5" - "@fluentui/react-overflow": "npm:^9.0.19" "@internationalized/date": "npm:^3.0.0" "@types/react-window": "npm:^1.8.2" aria-hidden: "npm:^1.1.1" @@ -7512,15 +7400,6 @@ __metadata: languageName: node linkType: hard -"@swc/helpers@npm:^0.4.14": - version: 0.4.14 - resolution: "@swc/helpers@npm:0.4.14" - dependencies: - tslib: "npm:^2.4.0" - checksum: 10/236afd445fb22e3df7aa84336d5c45d29e021ad01917aa7c24267330df8b39ed89c3d8d9836ac2ac7569b46923591d0e49174f72df7fb997aea841d08f374dbd - languageName: node - linkType: hard - "@szmarczak/http-timer@npm:^1.1.2": version: 1.1.2 resolution: "@szmarczak/http-timer@npm:1.1.2" @@ -11925,7 +11804,7 @@ __metadata: languageName: node linkType: hard -"csstype@npm:^3.0.2, csstype@npm:^3.0.7, csstype@npm:^3.1.2": +"csstype@npm:^3.0.2, csstype@npm:^3.0.7": version: 3.1.2 resolution: "csstype@npm:3.1.2" checksum: 10/1f39c541e9acd9562996d88bc9fb62d1cb234786ef11ed275567d4b2bd82e1ceacde25debc8de3d3b4871ae02c2933fa02614004c97190711caebad6347debc2 @@ -25466,15 +25345,6 @@ __metadata: languageName: node linkType: hard -"rtl-css-js@npm:^1.16.1": - version: 1.16.1 - resolution: "rtl-css-js@npm:1.16.1" - dependencies: - "@babel/runtime": "npm:^7.1.2" - checksum: 10/fa6a3e1f73e65bf5763b8a051942477a0852ee072d29ebad0999f02556a73715e72374d9a31ddec3fe023b09702b56f8be3a5a0404816e795ab86ea879183e02 - languageName: node - linkType: hard - "run-parallel@npm:^1.1.9": version: 1.2.0 resolution: "run-parallel@npm:1.2.0" @@ -26877,7 +26747,7 @@ __metadata: languageName: node linkType: hard -"stylis@npm:^4.0.13, stylis@npm:^4.1.2": +"stylis@npm:^4.1.2": version: 4.2.0 resolution: "stylis@npm:4.2.0" checksum: 10/58359185275ef1f39c339ae94e598168aa6bb789f6cf0d52e726c1e7087a94e9c17f0385a28d34483dec1ffc2c75670ec714dc5603d99c3124ec83bc2b0a0f42