From c37eb73b65e97d19dac258e1dafb76b9f7393cf7 Mon Sep 17 00:00:00 2001 From: Nikolay Kost Date: Mon, 5 Sep 2022 16:40:45 +0200 Subject: [PATCH] feat: tabs initial --- package.json | 17 +- .../LegacyTabs/LegacyTabs.stories.tsx | 2 +- .../navigation/Tabs/Tabs.stories.tsx | 24 ++ src/components/navigation/Tabs/Tabs.tsx | 183 +++++++++++++++ src/components/navigation/Tabs/styled.ts | 79 +++++++ yarn.lock | 216 ++++++++++++++++++ 6 files changed, 513 insertions(+), 8 deletions(-) create mode 100644 src/components/navigation/Tabs/Tabs.stories.tsx create mode 100644 src/components/navigation/Tabs/Tabs.tsx create mode 100644 src/components/navigation/Tabs/styled.ts diff --git a/package.json b/package.json index 91a78634..8e48c660 100644 --- a/package.json +++ b/package.json @@ -75,6 +75,7 @@ "@react-aria/separator": "3.1.6", "@react-aria/ssr": "^3.2.0", "@react-aria/switch": "^3.1.3", + "@react-aria/tabs": "3.3.1", "@react-aria/textfield": "^3.5.0", "@react-aria/tooltip": "^3.1.3", "@react-aria/utils": "^3.11.0", @@ -84,15 +85,16 @@ "@react-stately/collections": "^3.3.4", "@react-stately/combobox": "3.0.1", "@react-stately/list": "^3.5.1", + "@react-stately/menu": "^3.3.1", "@react-stately/numberfield": "^3.0.2", "@react-stately/overlays": "^3.1.6", "@react-stately/radio": "^3.3.2", "@react-stately/searchfield": "^3.1.3", "@react-stately/select": "^3.2.1", + "@react-stately/tabs": "3.2.1", "@react-stately/toggle": "^3.2.3", "@react-stately/tooltip": "^3.0.8", "@react-stately/tree": "^3.3.1", - "@react-stately/menu": "^3.3.1", "@react-stately/utils": "^3.5.0", "@react-types/button": "^3.4.1", "@react-types/checkbox": "^3.2.5", @@ -103,8 +105,9 @@ "@react-types/overlays": "^3.5.5", "@react-types/radio": "^3.1.2", "@react-types/select": "^3.6.1", - "@react-types/shared": "^3.10.1", + "@react-types/shared": "3.14.1", "@react-types/switch": "^3.1.2", + "@react-types/tabs": "3.1.3", "@react-types/textfield": "^3.3.0", "@react-types/tooltip": "^3.1.5", "clipboard-copy": "^4.0.1", @@ -134,9 +137,9 @@ "@storybook/addon-interactions": "6.5.9", "@storybook/addon-links": "6.5.9", "@storybook/builder-webpack5": "6.5.9", + "@storybook/jest": "0.0.10", "@storybook/manager-webpack5": "6.5.9", "@storybook/react": "6.5.9", - "@storybook/jest": "0.0.10", "@storybook/test-runner": "0.3.0", "@storybook/testing-library": "0.0.13", "@swc/core": "1.2.148", @@ -146,8 +149,8 @@ "@testing-library/react-hooks": "^8.0.0", "@testing-library/user-event": "14.2.0", "@types/react": "^17.0.38", - "@types/react-is": "17.0.3", "@types/react-dom": "^17.0.11", + "@types/react-is": "17.0.3", "@types/react-test-renderer": "17.0.1", "@types/react-transition-group": "^4.4.2", "@typescript-eslint/eslint-plugin": "^5.8.1", @@ -178,10 +181,10 @@ "react-test-renderer": "^17.0.2", "rimraf": "^3.0.2", "size-limit": "^7.0.5", - "styled-components": "5.3.0", - "typescript": "^4.5.4", "storybook-addon-turbo-build": "1.1.0", - "swc-loader": "0.2.3" + "styled-components": "5.3.0", + "swc-loader": "0.2.3", + "typescript": "^4.5.4" }, "resolutions": { "es5-ext": "0.10.53", diff --git a/src/components/navigation/LegacyTabs/LegacyTabs.stories.tsx b/src/components/navigation/LegacyTabs/LegacyTabs.stories.tsx index 474e1f5a..81051da2 100644 --- a/src/components/navigation/LegacyTabs/LegacyTabs.stories.tsx +++ b/src/components/navigation/LegacyTabs/LegacyTabs.stories.tsx @@ -3,7 +3,7 @@ import { useState } from 'react'; import { LegacyTabs } from './LegacyTabs'; export default { - title: 'Navigation/Tabs', + title: 'Navigation/LegacyTabs', component: LegacyTabs, argTypes: {}, }; diff --git a/src/components/navigation/Tabs/Tabs.stories.tsx b/src/components/navigation/Tabs/Tabs.stories.tsx new file mode 100644 index 00000000..9740c29f --- /dev/null +++ b/src/components/navigation/Tabs/Tabs.stories.tsx @@ -0,0 +1,24 @@ +import { TeamOutlined, PlusOutlined } from '@ant-design/icons'; + +import { Tabs } from './Tabs'; + +export default { + title: 'Navigation/Tabs', + component: Tabs, + argTypes: {}, +}; + +const Template = () => { + return ( + + }> + One Tab Content + + Two Tab Content + } /> + + ); +}; + +export const Default = Template.bind({}); +Default.args = {}; diff --git a/src/components/navigation/Tabs/Tabs.tsx b/src/components/navigation/Tabs/Tabs.tsx new file mode 100644 index 00000000..1f9c9ef3 --- /dev/null +++ b/src/components/navigation/Tabs/Tabs.tsx @@ -0,0 +1,183 @@ +import React, { ReactNode, ReactElement, Children } from 'react'; +import { useTabList, useTab, useTabPanel } from '@react-aria/tabs'; +import { TabListState, useTabListState } from '@react-stately/tabs'; +import { + DOMRef, + ItemProps, + Node, + Orientation, + CollectionElement, +} from '@react-types/shared'; +import { Item as BaseItem } from '@react-stately/collections'; +import { useHover } from '@react-aria/interactions'; +import { AriaTabListProps, TabListProps } from '@react-types/tabs'; +import { useDOMRef } from '@react-spectrum/utils'; +import { useButton } from '@react-aria/button'; +import { AriaButtonProps } from '@react-types/button'; + +import { mergeProps } from '../../../utils/react'; +import { useFocus } from '../../../utils/react/interactions'; + +import { + StyledTabsContainer, + StyledTabPanes, + StyledTabItem, + StyledTabBody, + // ACTION_BUTTON, +} from './styled'; + +type CubeTabButtonProps = { + icon?: ReactElement; + isDisabled?: boolean; + children?: ReactNode; +} & AriaButtonProps<'button'>; + +function TabButton(props: CubeTabButtonProps) { + const { isDisabled, icon } = props; + const ref = React.useRef(null); + const { hoverProps, isHovered } = useHover({ isDisabled }); + const { focusProps, isFocused } = useFocus({ isDisabled }, true); + + const { buttonProps, isPressed } = useButton(props, ref); + + const mods = { + hovered: isHovered, + focused: isFocused, + pressed: isPressed, + }; + + return ( + + {icon} + + ); +} + +type CubeTabProps = { + item: Node; + state: TabListState; + orientation?: Orientation; +}; + +function Tab({ item, state, orientation }: CubeTabProps) { + const { key, rendered, props: itemProps } = item; + const ref = React.useRef(null); + const { tabProps, isSelected, isDisabled } = useTab({ key }, state, ref); + const { hoverProps, isHovered } = useHover({ isDisabled }); + const { focusProps, isFocused } = useFocus({ isDisabled }, true); + + const icon = itemProps.icon; + + const mods = { + ...itemProps.mods, + selected: isSelected, + disabled: isDisabled, + hovered: isHovered, + focused: isFocused, + horizontal: orientation === 'horizontal', + vertical: orientation === 'vertical', + }; + + return ( + + {icon} + {rendered} + + ); +} + +type CubeTabPanelProps = { + state: TabListState; +}; + +function TabPanel({ state, ...props }: CubeTabPanelProps) { + const ref = React.useRef(null); + const { tabPanelProps } = useTabPanel(props, state, ref); + return ( + + {state.selectedItem?.props.children} + + ); +} + +export type CubeTabsProps = TabListProps & AriaTabListProps; + +function Tabs( + props: CubeTabsProps, + ref: DOMRef, +) { + const domRef = useDOMRef(ref); + const children = Children.toArray(props.children).filter( + (el) => (el as ReactElement)?.props?.children, + ); + const tabButtons = Children.toArray(props.children).filter( + (el) => !(el as ReactElement)?.props?.children, + ) as ReactElement[]; + const state = useTabListState({ + ...props, + children: children as CollectionElement[], + }); + const { tabListProps } = useTabList( + { + ...props, + children: children as CollectionElement[], + }, + state, + domRef, + ); + + return ( + + + {[...state.collection].map((item) => ( + + ))} + {tabButtons.map((el) => ( + + ))} + + + + ); +} + +// forwardRef doesn't support generic parameters, so cast the result to the correct type +// https://stackoverflow.com/questions/58469229/react-with-typescript-generics-while-using-react-forwardref +const _Tabs = React.forwardRef(Tabs) as ( + props: CubeTabsProps & { ref?: DOMRef }, +) => ReactElement; + +type ItemComponent = ( + props: Omit, 'children'> & CubeTabButtonProps, +) => JSX.Element; + +const Item = Object.assign(BaseItem, { + displayName: 'Item', +}) as ItemComponent; + +type __TabsComponent = typeof _Tabs & { + Item: typeof Item; +}; + +const __Tabs = Object.assign(_Tabs as __TabsComponent, { + Item, + displayName: 'Tabs', +}); + +__Tabs.displayName = 'Tabs'; + +export { __Tabs as Tabs }; diff --git a/src/components/navigation/Tabs/styled.ts b/src/components/navigation/Tabs/styled.ts new file mode 100644 index 00000000..ad80c2a0 --- /dev/null +++ b/src/components/navigation/Tabs/styled.ts @@ -0,0 +1,79 @@ +import { Styles, tasty } from '../../../tasty'; + +export const StyledTabsContainer = tasty({}); + +export const StyledTabPanes = tasty({ + styles: { + display: 'flex', + flow: 'row', + gap: '3x', + }, +}); + +export const StyledTabItem = tasty({ + styles: { + preset: 'h5s', + display: 'flex', + placeItems: 'center stretch', + placeContent: 'center', + flow: 'row', + gap: '1x', + fill: '#clear', + color: { + '': '#dark', + selected: '#purple-text', + hovered: '#purple-text', + }, + outline: { + '': '#purple-03.0', + focused: '#purple-03', + }, + border: { + '': 0, + selected: 'bottom 3bw #purple-text', + }, + cursor: { + '': 'pointer', + disabled: 'default', + }, + padding: { + '': '1.5x 0', + }, + radius: { + '': '1r', + selected: '1r 1r 0 0', + }, + }, +}); + +export const StyledTabBody = tasty({}); + +export const ACTION_BUTTON: Styles = { + border: { + '': '#clear', + pressed: '#clear', + }, + fill: { + '': '#clear', + hovered: '#clear', + 'pressed | selected': '#clear', + disabled: '#clear', + }, + color: { + '': '#dark-02', + hovered: '#dark-02', + 'pressed | selected': '#purple-text', + disabled: '#dark-04', + }, + padding: { + '': '1.5x 0', + }, + cursor: { + '': 'pointer', + disabled: 'default', + }, + shadow: '#clear', + display: 'flex', + flow: 'row', + justifyContent: 'start', +}; diff --git a/yarn.lock b/yarn.lock index 8f729b0f..b1a16f98 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1703,6 +1703,14 @@ "@formatjs/intl-localematcher" "0.2.25" tslib "^2.1.0" +"@formatjs/ecma402-abstract@1.12.0": + version "1.12.0" + resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.12.0.tgz#2fb5e8983d5fae2fad9ec6c77aec1803c2b88d8e" + integrity sha512-0/wm9b7brUD40kx7KSE0S532T8EfH06Zc41rGlinoNyYXnuusR6ull2x63iFJgVXgwahm42hAW7dcYdZ+llZzA== + dependencies: + "@formatjs/intl-localematcher" "0.2.31" + tslib "2.4.0" + "@formatjs/fast-memoize@1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-1.2.1.tgz#e6f5aee2e4fd0ca5edba6eba7668e2d855e0fc21" @@ -1710,6 +1718,13 @@ dependencies: tslib "^2.1.0" +"@formatjs/fast-memoize@1.2.6": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-1.2.6.tgz#a442970db7e9634af556919343261a7bbe5e88c3" + integrity sha512-9CWZ3+wCkClKHX+i5j+NyoBVqGf0pIskTo6Xl6ihGokYM2yqSSS68JIgeo+99UIHc+7vi9L3/SDSz/dWI9SNlA== + dependencies: + tslib "2.4.0" + "@formatjs/icu-messageformat-parser@2.1.0": version "2.1.0" resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.1.0.tgz#a54293dd7f098d6a6f6a084ab08b6d54a3e8c12d" @@ -1719,6 +1734,23 @@ "@formatjs/icu-skeleton-parser" "1.3.6" tslib "^2.1.0" +"@formatjs/icu-messageformat-parser@2.1.7": + version "2.1.7" + resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.1.7.tgz#35dc556c13a0544cc730300c8ddb730ba7f44bd4" + integrity sha512-KM4ikG5MloXMulqn39Js3ypuVzpPKq/DDplvl01PE2qD9rAzFO8YtaUCC9vr9j3sRXwdHPeTe8r3J/8IJgvYEQ== + dependencies: + "@formatjs/ecma402-abstract" "1.12.0" + "@formatjs/icu-skeleton-parser" "1.3.13" + tslib "2.4.0" + +"@formatjs/icu-skeleton-parser@1.3.13": + version "1.3.13" + resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.3.13.tgz#f7e186e72ed73c3272d22a3aacb646e77368b099" + integrity sha512-qb1kxnA4ep76rV+d9JICvZBThBpK5X+nh1dLmmIReX72QyglicsaOmKEcdcbp7/giCWfhVs6CXPVA2JJ5/ZvAw== + dependencies: + "@formatjs/ecma402-abstract" "1.12.0" + tslib "2.4.0" + "@formatjs/icu-skeleton-parser@1.3.6": version "1.3.6" resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.3.6.tgz#4ce8c0737d6f07b735288177049e97acbf2e8964" @@ -1734,6 +1766,13 @@ dependencies: tslib "^2.1.0" +"@formatjs/intl-localematcher@0.2.31": + version "0.2.31" + resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.2.31.tgz#aada2b1e58211460cedba56889e3c489117eb6eb" + integrity sha512-9QTjdSBpQ7wHShZgsNzNig5qT3rCPvmZogS/wXZzKotns5skbXgs0I7J8cuN0PPqXyynvNVuN+iOKhNS2eb+ZA== + dependencies: + tslib "2.4.0" + "@gar/promisify@^1.0.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.2.tgz#30aa825f11d438671d585bd44e7fd564535fc210" @@ -1772,6 +1811,13 @@ dependencies: "@babel/runtime" "^7.6.2" +"@internationalized/date@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@internationalized/date/-/date-3.0.1.tgz#66332e9ca8f59b7be010ca65d946bca430ba4b66" + integrity sha512-E/3lASs4mAeJ2Z2ye6ab7eUD0bPUfTeNVTAv6IS+ne9UtMu9Uepb9A1U2Ae0hDr6WAlBuvUtrakaxEdYB9TV6Q== + dependencies: + "@babel/runtime" "^7.6.2" + "@internationalized/message@^3.0.8": version "3.0.8" resolved "https://registry.yarnpkg.com/@internationalized/message/-/message-3.0.8.tgz#0d57d95057f60abe28988e35f42b0790ffdcaa08" @@ -1780,6 +1826,14 @@ "@babel/runtime" "^7.6.2" intl-messageformat "^9.12.0" +"@internationalized/message@^3.0.9": + version "3.0.9" + resolved "https://registry.yarnpkg.com/@internationalized/message/-/message-3.0.9.tgz#52bc20debe5296375d66ffcf56c3df5d8118a37d" + integrity sha512-yHQggKWUuSvj1GznVtie4tcYq+xMrkd/lTKCFHp6gG18KbIliDw+UI7sL9+yJPGuWiR083xuLyyhzqiPbNOEww== + dependencies: + "@babel/runtime" "^7.6.2" + intl-messageformat "^10.1.0" + "@internationalized/number@^3.0.2", "@internationalized/number@^3.1.1": version "3.1.1" resolved "https://registry.yarnpkg.com/@internationalized/number/-/number-3.1.1.tgz#160584316741de4381689ab759001603ee17b595" @@ -1787,6 +1841,13 @@ dependencies: "@babel/runtime" "^7.6.2" +"@internationalized/string@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@internationalized/string/-/string-3.0.0.tgz#de563871e1b19e4d0ce3246ec18d25da1a73db73" + integrity sha512-NUSr4u+mNu5BysXFeVWZW4kvjXylPkU/YYqaWzdNuz1eABfehFiZTEYhWAAMzI3U8DTxfqF9PM3zyhk5gcfz6w== + dependencies: + "@babel/runtime" "^7.6.2" + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -2369,6 +2430,17 @@ "@react-types/shared" "^3.13.1" clsx "^1.1.1" +"@react-aria/focus@^3.8.0": + version "3.8.0" + resolved "https://registry.yarnpkg.com/@react-aria/focus/-/focus-3.8.0.tgz#b292df7e35ed1b57af43f98df8135b00c4667d17" + integrity sha512-XuaLFdqf/6OyILifkVJo++5k2O+wlpNvXgsJkRWn/wSmB77pZKURm2MMGiSg2u911NqY+829UrSlpmhCZrc8RA== + dependencies: + "@babel/runtime" "^7.6.2" + "@react-aria/interactions" "^3.11.0" + "@react-aria/utils" "^3.13.3" + "@react-types/shared" "^3.14.1" + clsx "^1.1.1" + "@react-aria/i18n@^3.3.2", "@react-aria/i18n@^3.3.3", "@react-aria/i18n@^3.3.4", "@react-aria/i18n@^3.3.8", "@react-aria/i18n@^3.4.1": version "3.4.1" resolved "https://registry.yarnpkg.com/@react-aria/i18n/-/i18n-3.4.1.tgz#e79a52d30d542798c7a087d6f248034773d65cb1" @@ -2382,6 +2454,29 @@ "@react-aria/utils" "^3.13.1" "@react-types/shared" "^3.13.1" +"@react-aria/i18n@^3.6.0": + version "3.6.0" + resolved "https://registry.yarnpkg.com/@react-aria/i18n/-/i18n-3.6.0.tgz#0caf4d2173de411839ee55c1d4591aaf3919d6dc" + integrity sha512-FbdoBpMPgO0uldrpn43vCm8Xcveb46AklvUmh+zIUYRSIyIl2TKs5URTnwl9Sb1aloawoHQm2A5kASj5+TCxuA== + dependencies: + "@babel/runtime" "^7.6.2" + "@internationalized/date" "^3.0.1" + "@internationalized/message" "^3.0.9" + "@internationalized/number" "^3.1.1" + "@internationalized/string" "^3.0.0" + "@react-aria/ssr" "^3.3.0" + "@react-aria/utils" "^3.13.3" + "@react-types/shared" "^3.14.1" + +"@react-aria/interactions@^3.11.0": + version "3.11.0" + resolved "https://registry.yarnpkg.com/@react-aria/interactions/-/interactions-3.11.0.tgz#aa6118af58ff443670152393edab97e403d6d359" + integrity sha512-ZjK4m8u6FlV7Q9/1h9P2Ii6j/NwKR3BmTeGeBQssS2i4dV2pJeOPePnGzVQQGG8FzGQ+TcNRvZPXKaU4AlnBjw== + dependencies: + "@babel/runtime" "^7.6.2" + "@react-aria/utils" "^3.13.3" + "@react-types/shared" "^3.14.1" + "@react-aria/interactions@^3.5.1", "@react-aria/interactions@^3.6.0", "@react-aria/interactions@^3.7.0", "@react-aria/interactions@^3.8.1", "@react-aria/interactions@^3.8.3", "@react-aria/interactions@^3.9.1": version "3.9.1" resolved "https://registry.yarnpkg.com/@react-aria/interactions/-/interactions-3.9.1.tgz#1860b905d9a0b17ed74dd7fe769370e017cb3015" @@ -2545,6 +2640,20 @@ "@react-types/select" "^3.6.1" "@react-types/shared" "^3.13.1" +"@react-aria/selection@^3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@react-aria/selection/-/selection-3.10.1.tgz#16368f68463923d51ee3ee7b393a2b85534dc277" + integrity sha512-f4T6HVp6MP0A8EHZd/gTc8irgZW8KbjZYa6sP6u4+2N0Uxwm67mlG41/IJGt1KSSk0EOulRqdAdF+Kd78hIOWg== + dependencies: + "@babel/runtime" "^7.6.2" + "@react-aria/focus" "^3.8.0" + "@react-aria/i18n" "^3.6.0" + "@react-aria/interactions" "^3.11.0" + "@react-aria/utils" "^3.13.3" + "@react-stately/collections" "^3.4.3" + "@react-stately/selection" "^3.10.3" + "@react-types/shared" "^3.14.1" + "@react-aria/selection@^3.7.1", "@react-aria/selection@^3.8.1", "@react-aria/selection@^3.9.1": version "3.9.1" resolved "https://registry.yarnpkg.com/@react-aria/selection/-/selection-3.9.1.tgz#8bb58be6b39bf2e617a4489a6168e39aa0a08098" @@ -2587,6 +2696,13 @@ dependencies: "@babel/runtime" "^7.6.2" +"@react-aria/ssr@^3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.3.0.tgz#25e81daf0c7a270a4a891159d8d984578e4512d8" + integrity sha512-yNqUDuOVZIUGP81R87BJVi/ZUZp/nYOBXbPsRe7oltJOfErQZD+UezMpw4vM2KRz18cURffvmC8tJ6JTeyDtaQ== + dependencies: + "@babel/runtime" "^7.6.2" + "@react-aria/switch@^3.1.3": version "3.1.3" resolved "https://registry.yarnpkg.com/@react-aria/switch/-/switch-3.1.3.tgz#eb369cf6154055cf8429d5ec81caa97443b09f18" @@ -2597,6 +2713,22 @@ "@react-stately/toggle" "^3.2.3" "@react-types/switch" "^3.1.2" +"@react-aria/tabs@3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@react-aria/tabs/-/tabs-3.3.1.tgz#c85c2256b1ae429c7069c205d8111529f5ad4f6a" + integrity sha512-olKBDlh21+0TZHhO2r2wETdbkcW+9MEuiEz/pLi6PGb3b1BR/WjF8s/iCG/aLyvVed8rLmxP6ONuaXqIF8thRQ== + dependencies: + "@babel/runtime" "^7.6.2" + "@react-aria/focus" "^3.8.0" + "@react-aria/i18n" "^3.6.0" + "@react-aria/interactions" "^3.11.0" + "@react-aria/selection" "^3.10.1" + "@react-aria/utils" "^3.13.3" + "@react-stately/list" "^3.5.3" + "@react-stately/tabs" "^3.2.1" + "@react-types/shared" "^3.14.1" + "@react-types/tabs" "^3.1.3" + "@react-aria/textfield@^3.5.0": version "3.5.0" resolved "https://registry.yarnpkg.com/@react-aria/textfield/-/textfield-3.5.0.tgz#d711378e351b1374e6f11eda2896e6e481f0b0ba" @@ -2647,6 +2779,17 @@ "@react-types/shared" "^3.13.1" clsx "^1.1.1" +"@react-aria/utils@^3.13.3": + version "3.13.3" + resolved "https://registry.yarnpkg.com/@react-aria/utils/-/utils-3.13.3.tgz#1b27912e4630f0db6a7b39eb1013f6c4f710075c" + integrity sha512-wqjGNFX4TrXriUU1gvCaoqRhuckdoYogUWN0iyQRkTmzvb7H/NNzQzHou5ggWAdts/NzJUInwKarBWM9hCZZbg== + dependencies: + "@babel/runtime" "^7.6.2" + "@react-aria/ssr" "^3.3.0" + "@react-stately/utils" "^3.5.1" + "@react-types/shared" "^3.14.1" + clsx "^1.1.1" + "@react-aria/visually-hidden@^3.2.3", "@react-aria/visually-hidden@^3.3.1": version "3.3.1" resolved "https://registry.yarnpkg.com/@react-aria/visually-hidden/-/visually-hidden-3.3.1.tgz#5470af59686fdf4977989bcdd78f0b6fce79cc37" @@ -2687,6 +2830,14 @@ "@babel/runtime" "^7.6.2" "@react-types/shared" "^3.13.1" +"@react-stately/collections@^3.4.3": + version "3.4.3" + resolved "https://registry.yarnpkg.com/@react-stately/collections/-/collections-3.4.3.tgz#aaff67e697006a7c38dfb639180b79df4b202b46" + integrity sha512-xK3KPBCFcptpbTH/gsBT2bqVdGFruYvznBvUwzwgjb5x+vF2hXuIfaClD3/g6NckIo11MWpYGKO6iiPb1ytKeg== + dependencies: + "@babel/runtime" "^7.6.2" + "@react-types/shared" "^3.14.1" + "@react-stately/combobox@3.0.1": version "3.0.1" resolved "https://registry.yarnpkg.com/@react-stately/combobox/-/combobox-3.0.1.tgz#b94f395ec751cfd038ee281032c9c5f3f86cb9a2" @@ -2735,6 +2886,17 @@ "@react-stately/utils" "^3.5.0" "@react-types/shared" "^3.13.1" +"@react-stately/list@^3.5.3": + version "3.5.3" + resolved "https://registry.yarnpkg.com/@react-stately/list/-/list-3.5.3.tgz#4a9473194f2a9465ec8bfe6b201036b90d0d52bf" + integrity sha512-qO8RhtXKdXKWqoJiwB+iw18SwY4NlMoDGX08wnesIz10blWyBotx81uR6C53Z7pAlbm4jUSO8KlJ9ACvhy/6Mg== + dependencies: + "@babel/runtime" "^7.6.2" + "@react-stately/collections" "^3.4.3" + "@react-stately/selection" "^3.10.3" + "@react-stately/utils" "^3.5.1" + "@react-types/shared" "^3.14.1" + "@react-stately/menu@^3.2.3", "@react-stately/menu@^3.2.6", "@react-stately/menu@^3.3.1": version "3.3.1" resolved "https://registry.yarnpkg.com/@react-stately/menu/-/menu-3.3.1.tgz#8d9c9e1ba2bbb7e31cb41bf8f4a5fae2e85c9e25" @@ -2809,6 +2971,26 @@ "@react-stately/utils" "^3.5.0" "@react-types/shared" "^3.13.1" +"@react-stately/selection@^3.10.3": + version "3.10.3" + resolved "https://registry.yarnpkg.com/@react-stately/selection/-/selection-3.10.3.tgz#26722b4a5986626661f25a4e636385396c6f216a" + integrity sha512-gOEZ3bikv5zE3mFhv1etzk3WRy8/wBtXrZ1656L6fUNwYwl3lgW8fi5KrK8QEpdy5rHYeiMy/swn5SXK9GfnMA== + dependencies: + "@babel/runtime" "^7.6.2" + "@react-stately/collections" "^3.4.3" + "@react-stately/utils" "^3.5.1" + "@react-types/shared" "^3.14.1" + +"@react-stately/tabs@3.2.1", "@react-stately/tabs@^3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@react-stately/tabs/-/tabs-3.2.1.tgz#bc32bd13e1816d536000848e133d6ebc44c75bc7" + integrity sha512-3Z5MrJrx7Ozkp5kjhYgDs8p0kNmLocsHgq1IWgBRTRdTyQB01ixEuhR1g6A+BHFLojyDB6EKBX8TrbZPsnHRdQ== + dependencies: + "@babel/runtime" "^7.6.2" + "@react-stately/list" "^3.5.3" + "@react-stately/utils" "^3.5.1" + "@react-types/tabs" "^3.1.3" + "@react-stately/toggle@^3.2.3", "@react-stately/toggle@^3.2.5", "@react-stately/toggle@^3.3.1": version "3.3.1" resolved "https://registry.yarnpkg.com/@react-stately/toggle/-/toggle-3.3.1.tgz#ad09ff0886c8c14ac479047423b01932f4ea04b2" @@ -2847,6 +3029,13 @@ dependencies: "@babel/runtime" "^7.6.2" +"@react-stately/utils@^3.5.1": + version "3.5.1" + resolved "https://registry.yarnpkg.com/@react-stately/utils/-/utils-3.5.1.tgz#502de762e5d33e892347c5f58053674e06d3bc92" + integrity sha512-INeQ5Er2Jm+db8Py4upKBtgfzp3UYgwXYmbU/XJn49Xw27ktuimH9e37qP3bgHaReb5L3g8IrGs38tJUpnGPHA== + dependencies: + "@babel/runtime" "^7.6.2" + "@react-stately/virtualizer@^3.1.5": version "3.1.6" resolved "https://registry.yarnpkg.com/@react-stately/virtualizer/-/virtualizer-3.1.6.tgz#df803dbe032b73244b1d2f5cf09ac0ec9fcd9d04" @@ -2949,6 +3138,11 @@ dependencies: "@react-types/shared" "^3.13.1" +"@react-types/shared@3.14.1", "@react-types/shared@^3.14.1": + version "3.14.1" + resolved "https://registry.yarnpkg.com/@react-types/shared/-/shared-3.14.1.tgz#8fe25f729426e8043054e442eb5392364200e028" + integrity sha512-yPPgVRWWanXqbdxFTgJmVwx0JlcnEK3dqkKDIbVk6mxAHvEESI9+oDnHvO8IMHqF+GbrTCzVtAs0zwhYI/uHJA== + "@react-types/shared@^3.10.0", "@react-types/shared@^3.10.1", "@react-types/shared@^3.11.1", "@react-types/shared@^3.11.2", "@react-types/shared@^3.13.1", "@react-types/shared@^3.8.0", "@react-types/shared@^3.9.0": version "3.13.1" resolved "https://registry.yarnpkg.com/@react-types/shared/-/shared-3.13.1.tgz#eda5e3744971606f753baf7879136bf8e3f707ab" @@ -2970,6 +3164,13 @@ "@react-types/grid" "^3.0.0" "@react-types/shared" "^3.10.0" +"@react-types/tabs@3.1.3", "@react-types/tabs@^3.1.3": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@react-types/tabs/-/tabs-3.1.3.tgz#a9de35aa9a97997b5b2d3e94ec91e46920ded90d" + integrity sha512-RfHVSsbQiiIaJxf1qBdTt+mWj1GGC7AK/sXAQGhf3p3bi8fXBcXv2hZyPQF8uWZfb8sANtEXP8V3Xdg5SlWFGA== + dependencies: + "@react-types/shared" "^3.14.1" + "@react-types/textfield@^3.2.3", "@react-types/textfield@^3.3.0": version "3.3.0" resolved "https://registry.yarnpkg.com/@react-types/textfield/-/textfield-3.3.0.tgz#07a447fda327df4843e7d36cbd00f87f8a73e725" @@ -9659,6 +9860,16 @@ interpret@^2.2.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== +intl-messageformat@^10.1.0: + version "10.1.4" + resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-10.1.4.tgz#bf5ad48e357e3f3ab6559599296f54c175b22a92" + integrity sha512-tXCmWCXhbeHOF28aIf5b9ce3kwdwGyIiiSXVZsyDwksMiGn5Tp0MrMvyeuHuz4uN1UL+NfGOztHmE+6aLFp1wQ== + dependencies: + "@formatjs/ecma402-abstract" "1.12.0" + "@formatjs/fast-memoize" "1.2.6" + "@formatjs/icu-messageformat-parser" "2.1.7" + tslib "2.4.0" + intl-messageformat@^9.12.0: version "9.13.0" resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-9.13.0.tgz#97360b73bd82212e4f6005c712a4a16053165468" @@ -14972,6 +15183,11 @@ tsconfig-paths@^3.11.0: minimist "^1.2.0" strip-bom "^3.0.0" +tslib@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"