diff --git a/packages/project-tailwind/package.json b/packages/project-tailwind/package.json index ae05ef997..8501a34b6 100644 --- a/packages/project-tailwind/package.json +++ b/packages/project-tailwind/package.json @@ -25,32 +25,33 @@ "test-ci": "jest --coverage --runInBand" }, "dependencies": { - "@headlessui/react": "^1.7.11", - "@heroicons/react": "^2.0.15", - "clsx": "^1.2.1", + "@floating-ui/react": "0.19.2", + "@headlessui/react": "1.7.11", + "@heroicons/react": "2.0.15", + "clsx": "1.2.1", "react": "17.0.2", "react-dom": "17.0.2", - "react-polymorphic-box": "^3.0.3" + "react-polymorphic-box": "3.0.3" }, "devDependencies": { "@babel/core": "7.20.12", - "@mdx-js/react": "^1.6.22", + "@mdx-js/react": "1.6.22", "@motech-development/eslint-config-motech-react": "workspace:*", "@motech-development/prettier-motech-config": "workspace:*", "@motech-development/semantic-release": "workspace:*", "@rollup/plugin-babel": "6.0.3", "@rollup/plugin-commonjs": "23.0.7", "@rollup/plugin-node-resolve": "15.0.1", - "@storybook/addon-actions": "^6.5.16", - "@storybook/addon-docs": "^6.5.16", - "@storybook/addon-essentials": "^6.5.16", - "@storybook/addon-interactions": "^6.5.16", - "@storybook/addon-links": "^6.5.16", - "@storybook/builder-webpack5": "^6.5.16", - "@storybook/manager-webpack5": "^6.5.16", - "@storybook/react": "^6.5.16", + "@storybook/addon-actions": "6.5.16", + "@storybook/addon-docs": "6.5.16", + "@storybook/addon-essentials": "6.5.16", + "@storybook/addon-interactions": "6.5.16", + "@storybook/addon-links": "6.5.16", + "@storybook/builder-webpack5": "6.5.16", + "@storybook/manager-webpack5": "6.5.16", + "@storybook/react": "6.5.16", "@storybook/storybook-deployer": "2.8.16", - "@storybook/testing-library": "^0.0.13", + "@storybook/testing-library": "0.0.13", "@testing-library/jest-dom": "5.16.5", "@testing-library/react": "12.1.4", "@testing-library/react-hooks": "8.0.1", @@ -58,18 +59,20 @@ "@types/jest": "29.4.0", "@types/react": "17.0.53", "@types/react-dom": "17.0.18", - "autoprefixer": "^10.4.13", - "babel-loader": "^8.3.0", + "autoprefixer": "10.4.13", + "babel-loader": "8.3.0", "eslint": "8.33.0", "jest": "29.4.2", - "jest-environment-jsdom": "^29.4.2", - "postcss": "^8.4.21", + "jest-environment-jsdom": "29.4.2", + "jsdom-testing-mocks": "1.7.0", + "postcss": "8.4.21", "prettier": "2.3.0", "rimraf": "3.0.2", "rollup": "2.79.1", "rollup-plugin-exclude-dependencies-from-bundle": "1.1.23", - "rollup-plugin-postcss": "^4.0.2", - "tailwindcss": "^3.2.6", + "rollup-plugin-postcss": "4.0.2", + "snapshot-diff": "0.10.0", + "tailwindcss": "3.2.6", "typescript": "4.9.5" }, "peerDependencies": { diff --git a/packages/project-tailwind/src/components/Tooltip.tsx b/packages/project-tailwind/src/components/Tooltip.tsx new file mode 100644 index 000000000..3e06218e4 --- /dev/null +++ b/packages/project-tailwind/src/components/Tooltip.tsx @@ -0,0 +1,243 @@ +import { + arrow, + autoUpdate, + flip, + MiddlewareData, + offset, + Placement, + shift, + Side, + useDismiss, + useFloating, + useFocus, + useHover, + useInteractions, + useRole, +} from '@floating-ui/react'; +import { ComponentPropsWithoutRef, ReactNode, useRef, useState } from 'react'; +import { Themes, TTheme, useTailwind } from '../utilities/tailwind'; + +/** Default legth of time to display tooltip after moving away from parent */ +const DEFAULT_TIME = 1000; + +/** Arrow box dimension */ +const BOX_SIZE = 8; + +/** Arrow box's hypotenuse length */ +const FLOATING_OFFSET = Math.sqrt(2 * BOX_SIZE ** 2) / 2; + +/** + * Creates inline styles for arrows + * + * @param element - Arrow from middleware + * + * @param placement - Arrow placement + * + * @returns Arrow inline styles + */ +function createArrowStyles( + element: MiddlewareData['arrow'], + placement: Placement, +) { + let styles = { + bottom: '', + left: '', + right: '', + top: '', + }; + + if (element) { + const { x, y } = element; + + const side = placement.split('-')[0]; + + /** Position to apply generated style */ + const xy = { + bottom: 'top', + left: 'right', + right: 'left', + top: 'bottom', + }[side] as string; + + styles = { + ...styles, + left: xy === 'right' ? '' : `${x ?? BOX_SIZE}px`, + top: xy === 'bottom' ? '' : `${y ?? BOX_SIZE}px`, + [xy]: -BOX_SIZE / 2, + }; + } + + return styles; +} + +/** Tooltip component properties */ +export interface ITooltipProps extends ComponentPropsWithoutRef<'div'> { + /** Content to be displayed */ + content: ReactNode; + + /** Element to output tooltip relative to */ + parent: ReactNode; + + /** Where tooltip should be places */ + placement?: Side; + + /** Length of time to keep tooltip visible in milliseconds */ + time?: number; + + /** Component theme */ + theme?: TTheme; +} + +/** + * Display information when hovering over a component + * + * @param props - Component props + * + * @returns Tooltip component + */ +export function Tooltip({ + className, + content, + id, + parent, + placement = 'bottom', + time = DEFAULT_TIME, + theme = Themes.PRIMARY, + ...rest +}: ITooltipProps) { + const arrowRef = useRef(null); + + const { createStyles } = useTailwind(theme); + + const [isOpen, setIsOpen] = useState(false); + + const { + context, + middlewareData, + placement: floatingPlacement, + refs, + strategy, + x, + y, + } = useFloating({ + middleware: [ + flip(), + offset(FLOATING_OFFSET), + shift(), + arrow({ + element: arrowRef, + }), + ], + onOpenChange: setIsOpen, + open: isOpen, + placement, + whileElementsMounted: autoUpdate, + }); + + const hover = useHover(context, { + delay: { + close: time, + }, + move: false, + }); + + const focus = useFocus(context); + + const dismiss = useDismiss(context); + + const role = useRole(context, { + role: 'tooltip', + }); + + const { getFloatingProps, getReferenceProps } = useInteractions([ + hover, + focus, + dismiss, + role, + ]); + + const tooltipStyles = createStyles({ + classNames: [className], + theme: { + danger: ['bg-red-600 text-red-50'], + primary: ['bg-blue-600 text-blue-50'], + secondary: ['bg-gray-100 text-gray-600'], + success: ['bg-green-600 text-green-50'], + warning: ['bg-yellow-600 text-yellow-50'], + }, + }); + + const innerTooltipStyles = createStyles({ + classNames: [ + 'px-1 text-sm font-display whitespace-nowrap', + { + 'border-b-2': placement === 'top', + 'border-l-2': placement === 'right', + 'border-r-2': placement === 'left', + 'border-t-2': placement === 'bottom', + }, + ], + theme: { + danger: ['border-red-700'], + primary: ['border-blue-700'], + secondary: ['border-gray-200'], + success: ['border-green-700'], + warning: ['border-yellow-700'], + }, + }); + + const tooltipInlineStyles = { + left: x ?? 0, + position: strategy, + top: y ?? 0, + width: 'max-content', + }; + + const arrowStyles = createStyles({ + classNames: ['absolute w-2 h-2 rotate-45 -z-10 pointer-events-none'], + theme: { + danger: ['bg-red-700'], + primary: ['bg-blue-700'], + secondary: ['bg-gray-200'], + success: ['bg-green-700'], + warning: ['bg-yellow-700'], + }, + }); + + const arrowInlineStyles = createArrowStyles( + middlewareData.arrow, + floatingPlacement, + ); + + return ( + <> +
+ {parent} +
+ + {isOpen && ( +
+
{content}
+ +
+
+ )} + + ); +} diff --git a/packages/project-tailwind/src/components/__tests__/Tooltip.test.tsx b/packages/project-tailwind/src/components/__tests__/Tooltip.test.tsx new file mode 100644 index 000000000..c73c8119a --- /dev/null +++ b/packages/project-tailwind/src/components/__tests__/Tooltip.test.tsx @@ -0,0 +1,201 @@ +import { Side } from '@floating-ui/react'; +import { fireEvent, render } from '@testing-library/react'; +import { mockViewport } from 'jsdom-testing-mocks'; +import { ReactNode } from 'react'; +import { act } from 'react-dom/test-utils'; +import { themes } from '../../utilities/jest'; +import { Tooltip } from '../Tooltip'; + +interface IWrapperProps { + children: ReactNode; +} +function Wrapper({ children }: IWrapperProps) { + const styles = { + alignItems: 'center', + display: 'flex', + height: '100vh', + justifyContent: 'center', + }; + + return
{children}
; +} + +const placements: Side[] = ['top', 'bottom', 'right', 'left']; + +describe('Tooltip', () => { + beforeAll(() => { + mockViewport({ + height: '768px', + width: '1024px', + }); + }); + + describe('timer', () => { + beforeAll(() => { + jest.useFakeTimers(); + }); + + afterAll(() => { + jest.useRealTimers(); + }); + + it('should hide tooltip after 1000ms', async () => { + const { asFragment, findByTestId } = render( + + + Hover over me + + } + content={

Hello, world

} + /> +
, + ); + + const firstRender = asFragment(); + + await act(async () => { + const parent = await findByTestId('tooltip-parent-element'); + + fireEvent.mouseEnter(parent); + + fireEvent.mouseLeave(parent); + }); + + act(() => jest.advanceTimersByTime(900)); + + expect(firstRender).toMatchDiffSnapshot(asFragment()); + + act(() => jest.advanceTimersByTime(100)); + + expect(firstRender).toEqual(asFragment()); + }); + + it('should hide after set time', async () => { + const { asFragment, findByTestId } = render( + + + Hover over me + + } + content={

Hello, world

} + time={400} + /> +
, + ); + + const firstRender = asFragment(); + + await act(async () => { + const parent = await findByTestId('tooltip-parent-element'); + + fireEvent.mouseEnter(parent); + + fireEvent.mouseLeave(parent); + }); + + act(() => jest.advanceTimersByTime(300)); + + expect(firstRender).toMatchDiffSnapshot(asFragment()); + + act(() => jest.advanceTimersByTime(100)); + + expect(firstRender).toEqual(asFragment()); + }); + }); + + describe.each(placements)('when placement is "%s"', (placement) => { + it('should correctly render component when parent is not hovered over', () => { + const { asFragment } = render( + + + Hover over me + + } + content={

Hello, world

} + placement={placement} + /> +
, + ); + + expect(asFragment()).toMatchSnapshot(); + }); + + it('should correctly render component when parent is hovered over', async () => { + const { asFragment, findByTestId } = render( + + + Hover over me + + } + content={

Hello, world

} + placement={placement} + /> +
, + ); + + const firstRender = asFragment(); + + await act(async () => { + const parent = await findByTestId('tooltip-parent-element'); + + fireEvent.mouseEnter(parent); + }); + + expect(firstRender).toMatchDiffSnapshot(asFragment()); + }); + }); + + describe.each(themes)('when theme is "$theme"', ({ theme }) => { + it('should correctly render component when parent is not hovered over', () => { + const { asFragment } = render( + + + Hover over me + + } + content={

Hello, world

} + theme={theme} + /> +
, + ); + + expect(asFragment()).toMatchSnapshot(); + }); + + it('should correctly render component when parent is hovered over', async () => { + const { asFragment, findByTestId } = render( + + + Hover over me + + } + content={

Hello, world

} + theme={theme} + /> +
, + ); + + const firstRender = asFragment(); + + await act(async () => { + const parent = await findByTestId('tooltip-parent-element'); + + fireEvent.mouseEnter(parent); + }); + + expect(firstRender).toMatchDiffSnapshot(asFragment()); + }); + }); +}); diff --git a/packages/project-tailwind/src/components/__tests__/__snapshots__/Tooltip.test.tsx.snap b/packages/project-tailwind/src/components/__tests__/__snapshots__/Tooltip.test.tsx.snap new file mode 100644 index 000000000..d4b7a7f11 --- /dev/null +++ b/packages/project-tailwind/src/components/__tests__/__snapshots__/Tooltip.test.tsx.snap @@ -0,0 +1,665 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Tooltip timer should hide after set time 1`] = ` +"Snapshot Diff: +- First value ++ Second value + + +
+
+ ++
++ + " +`; + +exports[`Tooltip timer should hide tooltip after 1000ms 1`] = ` +"Snapshot Diff: +- First value ++ Second value + + +
+
+ ++
++ + " +`; + +exports[`Tooltip when placement is "bottom" should correctly render component when parent is hovered over 1`] = ` +"Snapshot Diff: +- First value ++ Second value + + +
+
+ ++
++ + " +`; + +exports[`Tooltip when placement is "bottom" should correctly render component when parent is not hovered over 1`] = ` + +
+
+ +
+
+
+`; + +exports[`Tooltip when placement is "left" should correctly render component when parent is hovered over 1`] = ` +"Snapshot Diff: +- First value ++ Second value + + +
+
+ ++
++ + " +`; + +exports[`Tooltip when placement is "left" should correctly render component when parent is not hovered over 1`] = ` + +
+
+ +
+
+
+`; + +exports[`Tooltip when placement is "right" should correctly render component when parent is hovered over 1`] = ` +"Snapshot Diff: +- First value ++ Second value + + +
+
+ ++
++ + " +`; + +exports[`Tooltip when placement is "right" should correctly render component when parent is not hovered over 1`] = ` + +
+
+ +
+
+
+`; + +exports[`Tooltip when placement is "top" should correctly render component when parent is hovered over 1`] = ` +"Snapshot Diff: +- First value ++ Second value + + +
+
+ ++
++ + " +`; + +exports[`Tooltip when placement is "top" should correctly render component when parent is not hovered over 1`] = ` + +
+
+ +
+
+
+`; + +exports[`Tooltip when theme is "danger" should correctly render component when parent is hovered over 1`] = ` +"Snapshot Diff: +- First value ++ Second value + + +
+
+ ++
++ + " +`; + +exports[`Tooltip when theme is "danger" should correctly render component when parent is not hovered over 1`] = ` + +
+
+ +
+
+
+`; + +exports[`Tooltip when theme is "primary" should correctly render component when parent is hovered over 1`] = ` +"Snapshot Diff: +- First value ++ Second value + + +
+
+ ++
++ + " +`; + +exports[`Tooltip when theme is "primary" should correctly render component when parent is not hovered over 1`] = ` + +
+
+ +
+
+
+`; + +exports[`Tooltip when theme is "secondary" should correctly render component when parent is hovered over 1`] = ` +"Snapshot Diff: +- First value ++ Second value + + +
+
+ ++
++ + " +`; + +exports[`Tooltip when theme is "secondary" should correctly render component when parent is not hovered over 1`] = ` + +
+
+ +
+
+
+`; + +exports[`Tooltip when theme is "success" should correctly render component when parent is hovered over 1`] = ` +"Snapshot Diff: +- First value ++ Second value + + +
+
+ ++
++ + " +`; + +exports[`Tooltip when theme is "success" should correctly render component when parent is not hovered over 1`] = ` + +
+
+ +
+
+
+`; + +exports[`Tooltip when theme is "warning" should correctly render component when parent is hovered over 1`] = ` +"Snapshot Diff: +- First value ++ Second value + + +
+
+ ++
++ + " +`; + +exports[`Tooltip when theme is "warning" should correctly render component when parent is not hovered over 1`] = ` + +
+
+ +
+
+
+`; diff --git a/packages/project-tailwind/src/index.ts b/packages/project-tailwind/src/index.ts index 0b78f1e20..03d4af629 100644 --- a/packages/project-tailwind/src/index.ts +++ b/packages/project-tailwind/src/index.ts @@ -9,4 +9,5 @@ export * from './components/Link'; export * from './components/Logo'; export * from './components/Title'; export * from './components/Toolbar'; +export * from './components/Tooltip'; export * from './components/Typography'; diff --git a/packages/project-tailwind/src/setupTests.ts b/packages/project-tailwind/src/setupTests.ts index 8f2609b7b..09dcb1db9 100644 --- a/packages/project-tailwind/src/setupTests.ts +++ b/packages/project-tailwind/src/setupTests.ts @@ -3,3 +3,5 @@ // expect(element).toHaveTextContent(/react/i) // learn more: https://github.com/testing-library/jest-dom import '@testing-library/jest-dom'; +import 'snapshot-diff'; +import 'snapshot-diff/extend-expect'; diff --git a/packages/project-tailwind/src/stories/Tooltip.stories.tsx b/packages/project-tailwind/src/stories/Tooltip.stories.tsx new file mode 100644 index 000000000..a08c03f7e --- /dev/null +++ b/packages/project-tailwind/src/stories/Tooltip.stories.tsx @@ -0,0 +1,20 @@ +import { ComponentMeta, ComponentStory } from '@storybook/react'; +import { Button } from '../components/Button'; +import { Tooltip } from '../components/Tooltip'; +import { Typography } from '../components/Typography'; + +export default { + args: { + content: Hello, world, + parent: , + }, + component: Tooltip, +} as ComponentMeta; + +const Template: ComponentStory = (props) => ( +
+ +
+); + +export const TooltipComponent = Template.bind({}); diff --git a/yarn.lock b/yarn.lock index 49f6d1d59..20255040a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4151,6 +4151,48 @@ __metadata: languageName: node linkType: hard +"@floating-ui/core@npm:^1.2.1": + version: 1.2.1 + resolution: "@floating-ui/core@npm:1.2.1" + checksum: 7a263e15abad4cd98ce3938075c90f76bafef71c67964c83dd7cf1e1916c92ccfa46a4f2b95b403bb180f70b3e7ded118db1cbc3426269ec70e948edf0d19ae2 + languageName: node + linkType: hard + +"@floating-ui/dom@npm:^1.2.1": + version: 1.2.1 + resolution: "@floating-ui/dom@npm:1.2.1" + dependencies: + "@floating-ui/core": ^1.2.1 + checksum: ad6928d5dd934ca8b3dcffdfcacde9d147afc0db4db0c0294b23d5f897224d73c7f0ae578b46d813f0d7ae22a86e7a3f8914fdbcdf4a8d42a1b430d0518f45be + languageName: node + linkType: hard + +"@floating-ui/react-dom@npm:^1.3.0": + version: 1.3.0 + resolution: "@floating-ui/react-dom@npm:1.3.0" + dependencies: + "@floating-ui/dom": ^1.2.1 + peerDependencies: + react: ">=16.8.0" + react-dom: ">=16.8.0" + checksum: ce0ad3e3bbe43cfd15a6a0d5cccede02175c845862bfab52027995ab99c6b29630180dc7d146f76ebb34730f90a6ab9bf193c8984fe8d7f56062308e4ca98f77 + languageName: node + linkType: hard + +"@floating-ui/react@npm:0.19.2": + version: 0.19.2 + resolution: "@floating-ui/react@npm:0.19.2" + dependencies: + "@floating-ui/react-dom": ^1.3.0 + aria-hidden: ^1.1.3 + tabbable: ^6.0.1 + peerDependencies: + react: ">=16.8.0" + react-dom: ">=16.8.0" + checksum: 00fd827c2dcf879fec221d89ef5b90836bbecacc236ce2acc787db32ae7311d490cd136b13a8d0b6ab12842554a2ee1110605aa832af71a45c0a7297e342072c + languageName: node + linkType: hard + "@fortawesome/fontawesome-common-types@npm:^0.2.36": version: 0.2.36 resolution: "@fortawesome/fontawesome-common-types@npm:0.2.36" @@ -4634,7 +4676,7 @@ __metadata: languageName: node linkType: hard -"@headlessui/react@npm:^1.7.11": +"@headlessui/react@npm:1.7.11": version: 1.7.11 resolution: "@headlessui/react@npm:1.7.11" dependencies: @@ -4646,7 +4688,7 @@ __metadata: languageName: node linkType: hard -"@heroicons/react@npm:^2.0.15": +"@heroicons/react@npm:2.0.15": version: 2.0.15 resolution: "@heroicons/react@npm:2.0.15" peerDependencies: @@ -4954,6 +4996,15 @@ __metadata: languageName: node linkType: hard +"@jest/expect-utils@npm:^29.4.3": + version: 29.4.3 + resolution: "@jest/expect-utils@npm:29.4.3" + dependencies: + jest-get-type: ^29.4.3 + checksum: 2bbed39ff2fb59f5acac465a1ce7303e3b4b62b479e4f386261986c9827f7f799ea912761e22629c5daf10addf8513f16733c14a29c2647bb66d4ee625e9ff92 + languageName: node + linkType: hard + "@jest/expect@npm:^29.4.2": version: 29.4.2 resolution: "@jest/expect@npm:29.4.2" @@ -5108,6 +5159,15 @@ __metadata: languageName: node linkType: hard +"@jest/schemas@npm:^29.4.3": + version: 29.4.3 + resolution: "@jest/schemas@npm:29.4.3" + dependencies: + "@sinclair/typebox": ^0.25.16 + checksum: ac754e245c19dc39e10ebd41dce09040214c96a4cd8efa143b82148e383e45128f24599195ab4f01433adae4ccfbe2db6574c90db2862ccd8551a86704b5bebd + languageName: node + linkType: hard + "@jest/source-map@npm:^27.5.1": version: 27.5.1 resolution: "@jest/source-map@npm:27.5.1" @@ -5259,6 +5319,29 @@ __metadata: languageName: node linkType: hard +"@jest/transform@npm:^29.4.3": + version: 29.4.3 + resolution: "@jest/transform@npm:29.4.3" + dependencies: + "@babel/core": ^7.11.6 + "@jest/types": ^29.4.3 + "@jridgewell/trace-mapping": ^0.3.15 + babel-plugin-istanbul: ^6.1.1 + chalk: ^4.0.0 + convert-source-map: ^2.0.0 + fast-json-stable-stringify: ^2.1.0 + graceful-fs: ^4.2.9 + jest-haste-map: ^29.4.3 + jest-regex-util: ^29.4.3 + jest-util: ^29.4.3 + micromatch: ^4.0.4 + pirates: ^4.0.4 + slash: ^3.0.0 + write-file-atomic: ^4.0.2 + checksum: 082d74e04044213aa7baa8de29f8383e5010034f867969c8602a2447a4ef2f484cfaf2491eba3179ce42f369f7a0af419cbd087910f7e5caf7aa5d1fe03f2ff9 + languageName: node + linkType: hard + "@jest/types@npm:^26.6.2": version: 26.6.2 resolution: "@jest/types@npm:26.6.2" @@ -5313,6 +5396,20 @@ __metadata: languageName: node linkType: hard +"@jest/types@npm:^29.4.3": + version: 29.4.3 + resolution: "@jest/types@npm:29.4.3" + dependencies: + "@jest/schemas": ^29.4.3 + "@types/istanbul-lib-coverage": ^2.0.0 + "@types/istanbul-reports": ^3.0.0 + "@types/node": "*" + "@types/yargs": ^17.0.8 + chalk: ^4.0.0 + checksum: 1756f4149d360f98567f56f434144f7af23ed49a2c42889261a314df6b6654c2de70af618fb2ee0ee39cadaf10835b885845557184509503646c9cb9dcc02bac + languageName: node + linkType: hard + "@jridgewell/gen-mapping@npm:^0.1.0": version: 0.1.1 resolution: "@jridgewell/gen-mapping@npm:0.1.1" @@ -5461,7 +5558,7 @@ __metadata: languageName: node linkType: hard -"@mdx-js/react@npm:^1.6.22": +"@mdx-js/react@npm:1.6.22, @mdx-js/react@npm:^1.6.22": version: 1.6.22 resolution: "@mdx-js/react@npm:1.6.22" peerDependencies: @@ -5767,25 +5864,26 @@ __metadata: resolution: "@motech-development/project-tailwind@workspace:packages/project-tailwind" dependencies: "@babel/core": 7.20.12 - "@headlessui/react": ^1.7.11 - "@heroicons/react": ^2.0.15 - "@mdx-js/react": ^1.6.22 + "@floating-ui/react": 0.19.2 + "@headlessui/react": 1.7.11 + "@heroicons/react": 2.0.15 + "@mdx-js/react": 1.6.22 "@motech-development/eslint-config-motech-react": "workspace:*" "@motech-development/prettier-motech-config": "workspace:*" "@motech-development/semantic-release": "workspace:*" "@rollup/plugin-babel": 6.0.3 "@rollup/plugin-commonjs": 23.0.7 "@rollup/plugin-node-resolve": 15.0.1 - "@storybook/addon-actions": ^6.5.16 - "@storybook/addon-docs": ^6.5.16 - "@storybook/addon-essentials": ^6.5.16 - "@storybook/addon-interactions": ^6.5.16 - "@storybook/addon-links": ^6.5.16 - "@storybook/builder-webpack5": ^6.5.16 - "@storybook/manager-webpack5": ^6.5.16 - "@storybook/react": ^6.5.16 + "@storybook/addon-actions": 6.5.16 + "@storybook/addon-docs": 6.5.16 + "@storybook/addon-essentials": 6.5.16 + "@storybook/addon-interactions": 6.5.16 + "@storybook/addon-links": 6.5.16 + "@storybook/builder-webpack5": 6.5.16 + "@storybook/manager-webpack5": 6.5.16 + "@storybook/react": 6.5.16 "@storybook/storybook-deployer": 2.8.16 - "@storybook/testing-library": ^0.0.13 + "@storybook/testing-library": 0.0.13 "@testing-library/jest-dom": 5.16.5 "@testing-library/react": 12.1.4 "@testing-library/react-hooks": 8.0.1 @@ -5793,22 +5891,24 @@ __metadata: "@types/jest": 29.4.0 "@types/react": 17.0.53 "@types/react-dom": 17.0.18 - autoprefixer: ^10.4.13 - babel-loader: ^8.3.0 - clsx: ^1.2.1 + autoprefixer: 10.4.13 + babel-loader: 8.3.0 + clsx: 1.2.1 eslint: 8.33.0 jest: 29.4.2 - jest-environment-jsdom: ^29.4.2 - postcss: ^8.4.21 + jest-environment-jsdom: 29.4.2 + jsdom-testing-mocks: 1.7.0 + postcss: 8.4.21 prettier: 2.3.0 react: 17.0.2 react-dom: 17.0.2 - react-polymorphic-box: ^3.0.3 + react-polymorphic-box: 3.0.3 rimraf: 3.0.2 rollup: 2.79.1 rollup-plugin-exclude-dependencies-from-bundle: 1.1.23 - rollup-plugin-postcss: ^4.0.2 - tailwindcss: ^3.2.6 + rollup-plugin-postcss: 4.0.2 + snapshot-diff: 0.10.0 + tailwindcss: 3.2.6 typescript: 4.9.5 peerDependencies: react: 17.0.2 @@ -7205,7 +7305,7 @@ __metadata: languageName: node linkType: hard -"@storybook/addon-actions@npm:6.5.16, @storybook/addon-actions@npm:^6.5.16": +"@storybook/addon-actions@npm:6.5.16": version: 6.5.16 resolution: "@storybook/addon-actions@npm:6.5.16" dependencies: @@ -7297,7 +7397,7 @@ __metadata: languageName: node linkType: hard -"@storybook/addon-docs@npm:6.5.16, @storybook/addon-docs@npm:^6.5.16": +"@storybook/addon-docs@npm:6.5.16": version: 6.5.16 resolution: "@storybook/addon-docs@npm:6.5.16" dependencies: @@ -7344,7 +7444,7 @@ __metadata: languageName: node linkType: hard -"@storybook/addon-essentials@npm:^6.5.16": +"@storybook/addon-essentials@npm:6.5.16": version: 6.5.16 resolution: "@storybook/addon-essentials@npm:6.5.16" dependencies: @@ -7404,7 +7504,7 @@ __metadata: languageName: node linkType: hard -"@storybook/addon-interactions@npm:^6.5.16": +"@storybook/addon-interactions@npm:6.5.16": version: 6.5.16 resolution: "@storybook/addon-interactions@npm:6.5.16" dependencies: @@ -7467,7 +7567,7 @@ __metadata: languageName: node linkType: hard -"@storybook/addon-links@npm:^6.5.16": +"@storybook/addon-links@npm:6.5.16": version: 6.5.16 resolution: "@storybook/addon-links@npm:6.5.16" dependencies: @@ -7706,7 +7806,7 @@ __metadata: languageName: node linkType: hard -"@storybook/builder-webpack5@npm:6.5.16, @storybook/builder-webpack5@npm:^6.5.16": +"@storybook/builder-webpack5@npm:6.5.16": version: 6.5.16 resolution: "@storybook/builder-webpack5@npm:6.5.16" dependencies: @@ -8171,7 +8271,7 @@ __metadata: languageName: node linkType: hard -"@storybook/manager-webpack5@npm:6.5.16, @storybook/manager-webpack5@npm:^6.5.16": +"@storybook/manager-webpack5@npm:6.5.16": version: 6.5.16 resolution: "@storybook/manager-webpack5@npm:6.5.16" dependencies: @@ -8303,7 +8403,7 @@ __metadata: languageName: node linkType: hard -"@storybook/react@npm:6.5.16, @storybook/react@npm:^6.5.16": +"@storybook/react@npm:6.5.16": version: 6.5.16 resolution: "@storybook/react@npm:6.5.16" dependencies: @@ -8479,7 +8579,7 @@ __metadata: languageName: node linkType: hard -"@storybook/testing-library@npm:^0.0.13": +"@storybook/testing-library@npm:0.0.13": version: 0.0.13 resolution: "@storybook/testing-library@npm:0.0.13" dependencies: @@ -11312,6 +11412,21 @@ __metadata: languageName: node linkType: hard +"aria-hidden@npm:^1.1.3": + version: 1.2.2 + resolution: "aria-hidden@npm:1.2.2" + dependencies: + tslib: ^2.0.0 + peerDependencies: + "@types/react": ^16.9.0 || ^17.0.0 || ^18.0.0 + react: ^16.9.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: ee1a3688db5491eeb87b73eea624614f24ef62a74cf9e47bc8229dde1ff7457f7e4a26425cadc0d3efd89380305e6fb4a4e505bccdee16beaa4686014861d7b1 + languageName: node + linkType: hard + "aria-query@npm:^4.2.2": version: 4.2.2 resolution: "aria-query@npm:4.2.2" @@ -11706,7 +11821,7 @@ __metadata: languageName: node linkType: hard -"autoprefixer@npm:^10.4.13": +"autoprefixer@npm:10.4.13, autoprefixer@npm:^10.4.13": version: 10.4.13 resolution: "autoprefixer@npm:10.4.13" dependencies: @@ -12006,20 +12121,7 @@ __metadata: languageName: node linkType: hard -"babel-loader@npm:9.1.2": - version: 9.1.2 - resolution: "babel-loader@npm:9.1.2" - dependencies: - find-cache-dir: ^3.3.2 - schema-utils: ^4.0.0 - peerDependencies: - "@babel/core": ^7.12.0 - webpack: ">=5" - checksum: f0edb8e157f9806b810ba3f2c8ca8fa489d377ae5c2b7b00c2ace900a6925641ce4ec520b9c12f70e37b94aa5366e7003e0f6271b26821643e109966ce741cb7 - languageName: node - linkType: hard - -"babel-loader@npm:^8.0.0, babel-loader@npm:^8.2.3, babel-loader@npm:^8.3.0": +"babel-loader@npm:8.3.0, babel-loader@npm:^8.0.0, babel-loader@npm:^8.2.3": version: 8.3.0 resolution: "babel-loader@npm:8.3.0" dependencies: @@ -12034,6 +12136,19 @@ __metadata: languageName: node linkType: hard +"babel-loader@npm:9.1.2": + version: 9.1.2 + resolution: "babel-loader@npm:9.1.2" + dependencies: + find-cache-dir: ^3.3.2 + schema-utils: ^4.0.0 + peerDependencies: + "@babel/core": ^7.12.0 + webpack: ">=5" + checksum: f0edb8e157f9806b810ba3f2c8ca8fa489d377ae5c2b7b00c2ace900a6925641ce4ec520b9c12f70e37b94aa5366e7003e0f6271b26821643e109966ce741cb7 + languageName: node + linkType: hard + "babel-plugin-add-react-displayname@npm:^0.0.5": version: 0.0.5 resolution: "babel-plugin-add-react-displayname@npm:0.0.5" @@ -12419,6 +12534,13 @@ __metadata: languageName: node linkType: hard +"bezier-easing@npm:^2.1.0": + version: 2.1.0 + resolution: "bezier-easing@npm:2.1.0" + checksum: ec22666b5385979b3e7a63eaf2631395b1be5beb3aed4f14cc70ae9eb09032082584f7e3eec045e4c122466987ed7e159f5b39f82b8a9870cd55e75b0d55a7d5 + languageName: node + linkType: hard + "bfj@npm:^7.0.2": version: 7.0.2 resolution: "bfj@npm:7.0.2" @@ -13960,7 +14082,7 @@ __metadata: languageName: node linkType: hard -"clsx@npm:^1.0.4, clsx@npm:^1.2.1": +"clsx@npm:1.2.1, clsx@npm:^1.0.4": version: 1.2.1 resolution: "clsx@npm:1.2.1" checksum: 30befca8019b2eb7dbad38cff6266cf543091dae2825c856a62a8ccf2c3ab9c2907c4d12b288b73101196767f66812365400a227581484a05f968b0307cfaf12 @@ -15019,6 +15141,13 @@ __metadata: languageName: node linkType: hard +"css-mediaquery@npm:^0.1.2": + version: 0.1.2 + resolution: "css-mediaquery@npm:0.1.2" + checksum: 8e26ae52d8aaaa71893f82fc485363ff0fab494b7d3b3464572aaed50714b8b538d33dbdaa69f0c02cf7f80d1f4d9a77519306c0492223ce91b3987475031a69 + languageName: node + linkType: hard + "css-minimizer-webpack-plugin@npm:^3.2.0": version: 3.4.1 resolution: "css-minimizer-webpack-plugin@npm:3.4.1" @@ -16150,6 +16279,13 @@ __metadata: languageName: node linkType: hard +"diff-sequences@npm:^29.4.3": + version: 29.4.3 + resolution: "diff-sequences@npm:29.4.3" + checksum: 28b265e04fdddcf7f9f814effe102cc95a9dec0564a579b5aed140edb24fc345c611ca52d76d725a3cab55d3888b915b5e8a4702e0f6058968a90fa5f41fcde7 + languageName: node + linkType: hard + "diff@npm:3.5.0": version: 3.5.0 resolution: "diff@npm:3.5.0" @@ -17915,6 +18051,19 @@ __metadata: languageName: node linkType: hard +"expect@npm:^29.4.3": + version: 29.4.3 + resolution: "expect@npm:29.4.3" + dependencies: + "@jest/expect-utils": ^29.4.3 + jest-get-type: ^29.4.3 + jest-matcher-utils: ^29.4.3 + jest-message-util: ^29.4.3 + jest-util: ^29.4.3 + checksum: ff9dd8c50c0c6fd4b2b00f6dbd7ab0e2063fe1953be81a8c10ae1c005c7f5667ba452918e2efb055504b72b701a4f82575a081a0a7158efb16d87991b0366feb + languageName: node + linkType: hard + "express-history-api-fallback@npm:2.2.1": version: 2.2.1 resolution: "express-history-api-fallback@npm:2.2.1" @@ -22230,6 +22379,18 @@ __metadata: languageName: node linkType: hard +"jest-diff@npm:^29.0.0, jest-diff@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-diff@npm:29.4.3" + dependencies: + chalk: ^4.0.0 + diff-sequences: ^29.4.3 + jest-get-type: ^29.4.3 + pretty-format: ^29.4.3 + checksum: 877fd1edffef6b319688c27b152e5b28e2bc4bcda5ce0ca90d7e137f9fafda4280bae25403d4c0bfd9806c2c0b15d966aa2dfaf5f9928ec8f1ccea7fa1d08ed6 + languageName: node + linkType: hard + "jest-diff@npm:^29.4.2": version: 29.4.2 resolution: "jest-diff@npm:29.4.2" @@ -22286,22 +22447,7 @@ __metadata: languageName: node linkType: hard -"jest-environment-jsdom@npm:^27.5.1": - version: 27.5.1 - resolution: "jest-environment-jsdom@npm:27.5.1" - dependencies: - "@jest/environment": ^27.5.1 - "@jest/fake-timers": ^27.5.1 - "@jest/types": ^27.5.1 - "@types/node": "*" - jest-mock: ^27.5.1 - jest-util: ^27.5.1 - jsdom: ^16.6.0 - checksum: bc104aef7d7530d0740402aa84ac812138b6d1e51fe58adecce679f82b99340ddab73e5ec68fa079f33f50c9ddec9728fc9f0ddcca2ad6f0b351eed2762cc555 - languageName: node - linkType: hard - -"jest-environment-jsdom@npm:^29.4.2": +"jest-environment-jsdom@npm:29.4.2, jest-environment-jsdom@npm:^29.4.2": version: 29.4.2 resolution: "jest-environment-jsdom@npm:29.4.2" dependencies: @@ -22322,6 +22468,21 @@ __metadata: languageName: node linkType: hard +"jest-environment-jsdom@npm:^27.5.1": + version: 27.5.1 + resolution: "jest-environment-jsdom@npm:27.5.1" + dependencies: + "@jest/environment": ^27.5.1 + "@jest/fake-timers": ^27.5.1 + "@jest/types": ^27.5.1 + "@types/node": "*" + jest-mock: ^27.5.1 + jest-util: ^27.5.1 + jsdom: ^16.6.0 + checksum: bc104aef7d7530d0740402aa84ac812138b6d1e51fe58adecce679f82b99340ddab73e5ec68fa079f33f50c9ddec9728fc9f0ddcca2ad6f0b351eed2762cc555 + languageName: node + linkType: hard + "jest-environment-node@npm:^27.5.1": version: 27.5.1 resolution: "jest-environment-node@npm:27.5.1" @@ -22364,6 +22525,13 @@ __metadata: languageName: node linkType: hard +"jest-get-type@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-get-type@npm:29.4.3" + checksum: 6ac7f2dde1c65e292e4355b6c63b3a4897d7e92cb4c8afcf6d397f2682f8080e094c8b0b68205a74d269882ec06bf696a9de6cd3e1b7333531e5ed7b112605ce + languageName: node + linkType: hard + "jest-haste-map@npm:^26.6.2": version: 26.6.2 resolution: "jest-haste-map@npm:26.6.2" @@ -22436,6 +22604,29 @@ __metadata: languageName: node linkType: hard +"jest-haste-map@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-haste-map@npm:29.4.3" + dependencies: + "@jest/types": ^29.4.3 + "@types/graceful-fs": ^4.1.3 + "@types/node": "*" + anymatch: ^3.0.3 + fb-watchman: ^2.0.0 + fsevents: ^2.3.2 + graceful-fs: ^4.2.9 + jest-regex-util: ^29.4.3 + jest-util: ^29.4.3 + jest-worker: ^29.4.3 + micromatch: ^4.0.4 + walker: ^1.0.8 + dependenciesMeta: + fsevents: + optional: true + checksum: c7a83ebe6008b3fe96a96235e8153092e54b14df68e0f4205faedec57450df26b658578495a71c6d82494c01fbb44bca98c1506a6b2b9c920696dcc5d2e2bc59 + languageName: node + linkType: hard + "jest-jasmine2@npm:^27.5.1": version: 27.5.1 resolution: "jest-jasmine2@npm:27.5.1" @@ -22505,6 +22696,18 @@ __metadata: languageName: node linkType: hard +"jest-matcher-utils@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-matcher-utils@npm:29.4.3" + dependencies: + chalk: ^4.0.0 + jest-diff: ^29.4.3 + jest-get-type: ^29.4.3 + pretty-format: ^29.4.3 + checksum: 9e13cbe42d2113bab2691110c7c3ba5cec3b94abad2727e1de90929d0f67da444e9b2066da3b476b5bf788df53a8ede0e0a950cfb06a04e4d6d566d115ee4f1d + languageName: node + linkType: hard + "jest-message-util@npm:^27.5.1": version: 27.5.1 resolution: "jest-message-util@npm:27.5.1" @@ -22556,6 +22759,23 @@ __metadata: languageName: node linkType: hard +"jest-message-util@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-message-util@npm:29.4.3" + dependencies: + "@babel/code-frame": ^7.12.13 + "@jest/types": ^29.4.3 + "@types/stack-utils": ^2.0.0 + chalk: ^4.0.0 + graceful-fs: ^4.2.9 + micromatch: ^4.0.4 + pretty-format: ^29.4.3 + slash: ^3.0.0 + stack-utils: ^2.0.3 + checksum: 64f06b9550021e68da0059020bea8691283cf818918810bb67192d7b7fb9b691c7eadf55c2ca3cd04df5394918f2327245077095cdc0d6b04be3532d2c7d0ced + languageName: node + linkType: hard + "jest-mock@npm:^27.0.6, jest-mock@npm:^27.5.1": version: 27.5.1 resolution: "jest-mock@npm:27.5.1" @@ -22617,6 +22837,13 @@ __metadata: languageName: node linkType: hard +"jest-regex-util@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-regex-util@npm:29.4.3" + checksum: 96fc7fc28cd4dd73a63c13a526202c4bd8b351d4e5b68b1a2a2c88da3308c2a16e26feaa593083eb0bac38cca1aa9dd05025412e7de013ba963fb8e66af22b8a + languageName: node + linkType: hard + "jest-resolve-dependencies@npm:^27.5.1": version: 27.5.1 resolution: "jest-resolve-dependencies@npm:27.5.1" @@ -22842,6 +23069,38 @@ __metadata: languageName: node linkType: hard +"jest-snapshot@npm:^29.0.0": + version: 29.4.3 + resolution: "jest-snapshot@npm:29.4.3" + dependencies: + "@babel/core": ^7.11.6 + "@babel/generator": ^7.7.2 + "@babel/plugin-syntax-jsx": ^7.7.2 + "@babel/plugin-syntax-typescript": ^7.7.2 + "@babel/traverse": ^7.7.2 + "@babel/types": ^7.3.3 + "@jest/expect-utils": ^29.4.3 + "@jest/transform": ^29.4.3 + "@jest/types": ^29.4.3 + "@types/babel__traverse": ^7.0.6 + "@types/prettier": ^2.1.5 + babel-preset-current-node-syntax: ^1.0.0 + chalk: ^4.0.0 + expect: ^29.4.3 + graceful-fs: ^4.2.9 + jest-diff: ^29.4.3 + jest-get-type: ^29.4.3 + jest-haste-map: ^29.4.3 + jest-matcher-utils: ^29.4.3 + jest-message-util: ^29.4.3 + jest-util: ^29.4.3 + natural-compare: ^1.4.0 + pretty-format: ^29.4.3 + semver: ^7.3.5 + checksum: 79ba52f2435e23ce72b1309be4b17fdbcb299d1c2ce97ebb61df9a62711e9463035f63b4c849181b2fe5aa17b3e09d30ee4668cc25fb3c6f59511c010b4d9494 + languageName: node + linkType: hard + "jest-snapshot@npm:^29.4.2": version: 29.4.2 resolution: "jest-snapshot@npm:29.4.2" @@ -22941,6 +23200,20 @@ __metadata: languageName: node linkType: hard +"jest-util@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-util@npm:29.4.3" + dependencies: + "@jest/types": ^29.4.3 + "@types/node": "*" + chalk: ^4.0.0 + ci-info: ^3.2.0 + graceful-fs: ^4.2.9 + picomatch: ^2.2.3 + checksum: 606b3e6077895baf8fb4ad4d08c134f37a6b81d5ba77ae654c942b1ae4b7294ab3b5a0eb93db34f129407b367970cf3b76bf5c80897b30f215f2bc8bf20a5f3f + languageName: node + linkType: hard + "jest-validate@npm:^27.5.1": version: 27.5.1 resolution: "jest-validate@npm:27.5.1" @@ -23078,6 +23351,18 @@ __metadata: languageName: node linkType: hard +"jest-worker@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-worker@npm:29.4.3" + dependencies: + "@types/node": "*" + jest-util: ^29.4.3 + merge-stream: ^2.0.0 + supports-color: ^8.0.0 + checksum: c99ae66f257564613e72c5797c3a68f21a22e1c1fb5f30d14695ff5b508a0d2405f22748f13a3df8d1015b5e16abb130170f81f047ff68f58b6b1d2ff6ebc51b + languageName: node + linkType: hard + "jest@npm:29.4.2": version: 29.4.2 resolution: "jest@npm:29.4.2" @@ -23229,6 +23514,18 @@ __metadata: languageName: node linkType: hard +"jsdom-testing-mocks@npm:1.7.0": + version: 1.7.0 + resolution: "jsdom-testing-mocks@npm:1.7.0" + dependencies: + bezier-easing: ^2.1.0 + css-mediaquery: ^0.1.2 + peerDependencies: + react: ">=17" + checksum: 93db608c79d9010b4d10bc75e7d4e5f28125572a6e8fb3128f6250775973dfc06c4b6d06113c70525b0116ac0a4abc93644efa3aa3f3046e6345e3ed32ab00fd + languageName: node + linkType: hard + "jsdom@npm:^16.6.0": version: 16.7.0 resolution: "jsdom@npm:16.7.0" @@ -28559,17 +28856,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^7.0.14, postcss@npm:^7.0.26, postcss@npm:^7.0.32, postcss@npm:^7.0.35, postcss@npm:^7.0.36, postcss@npm:^7.0.5, postcss@npm:^7.0.6": - version: 7.0.39 - resolution: "postcss@npm:7.0.39" - dependencies: - picocolors: ^0.2.1 - source-map: ^0.6.1 - checksum: 4ac793f506c23259189064bdc921260d869a115a82b5e713973c5af8e94fbb5721a5cc3e1e26840500d7e1f1fa42a209747c5b1a151918a9bc11f0d7ed9048e3 - languageName: node - linkType: hard - -"postcss@npm:^8.0.9, postcss@npm:^8.2.15, postcss@npm:^8.3.5, postcss@npm:^8.4.19, postcss@npm:^8.4.21, postcss@npm:^8.4.4": +"postcss@npm:8.4.21, postcss@npm:^8.0.9, postcss@npm:^8.2.15, postcss@npm:^8.3.5, postcss@npm:^8.4.19, postcss@npm:^8.4.4": version: 8.4.21 resolution: "postcss@npm:8.4.21" dependencies: @@ -28580,6 +28867,16 @@ __metadata: languageName: node linkType: hard +"postcss@npm:^7.0.14, postcss@npm:^7.0.26, postcss@npm:^7.0.32, postcss@npm:^7.0.35, postcss@npm:^7.0.36, postcss@npm:^7.0.5, postcss@npm:^7.0.6": + version: 7.0.39 + resolution: "postcss@npm:7.0.39" + dependencies: + picocolors: ^0.2.1 + source-map: ^0.6.1 + checksum: 4ac793f506c23259189064bdc921260d869a115a82b5e713973c5af8e94fbb5721a5cc3e1e26840500d7e1f1fa42a209747c5b1a151918a9bc11f0d7ed9048e3 + languageName: node + linkType: hard + "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1" @@ -28719,6 +29016,17 @@ __metadata: languageName: node linkType: hard +"pretty-format@npm:^29.4.3": + version: 29.4.3 + resolution: "pretty-format@npm:29.4.3" + dependencies: + "@jest/schemas": ^29.4.3 + ansi-styles: ^5.0.0 + react-is: ^18.0.0 + checksum: 3258b9a010bd79b3cf73783ad1e4592b6326fc981b6e31b742f316f14e7fbac09b48a9dbf274d092d9bde404db9fe16f518370e121837dc078a597392e6e5cc5 + languageName: node + linkType: hard + "pretty-hrtime@npm:^1.0.3": version: 1.0.3 resolution: "pretty-hrtime@npm:1.0.3" @@ -29734,7 +30042,7 @@ __metadata: languageName: node linkType: hard -"react-polymorphic-box@npm:^3.0.3": +"react-polymorphic-box@npm:3.0.3": version: 3.0.3 resolution: "react-polymorphic-box@npm:3.0.3" peerDependencies: @@ -30842,7 +31150,7 @@ __metadata: languageName: node linkType: hard -"rollup-plugin-postcss@npm:^4.0.2": +"rollup-plugin-postcss@npm:4.0.2": version: 4.0.2 resolution: "rollup-plugin-postcss@npm:4.0.2" dependencies: @@ -31930,6 +32238,19 @@ __metadata: languageName: node linkType: hard +"snapshot-diff@npm:0.10.0": + version: 0.10.0 + resolution: "snapshot-diff@npm:0.10.0" + dependencies: + jest-diff: ^29.0.0 + jest-snapshot: ^29.0.0 + pretty-format: ^29.0.0 + peerDependencies: + jest: ">=16" + checksum: d13e310faeed3f091265cc141ac8f19f192b2c6837e1aaabf6ea601ed8edc40471324609434ab85cb5220fff4c7103fa48c4f9f63c3a207944c55224c0dbde0b + languageName: node + linkType: hard + "sockjs@npm:^0.3.24": version: 0.3.24 resolution: "sockjs@npm:0.3.24" @@ -33105,7 +33426,14 @@ __metadata: languageName: node linkType: hard -"tailwindcss@npm:^3.0.2, tailwindcss@npm:^3.2.6": +"tabbable@npm:^6.0.1": + version: 6.1.1 + resolution: "tabbable@npm:6.1.1" + checksum: 348639497262241ce8e0ccb0664ea582a386183107299ee8f27cf7b56bc84f36e09eaf667d3cb4201e789634012a91f7129bcbd49760abe874fbace35b4cf429 + languageName: node + linkType: hard + +"tailwindcss@npm:3.2.6, tailwindcss@npm:^3.0.2": version: 3.2.6 resolution: "tailwindcss@npm:3.2.6" dependencies: