diff --git a/.eslintignore b/.eslintignore index a7063603..20646d43 100644 --- a/.eslintignore +++ b/.eslintignore @@ -2,3 +2,4 @@ **/node_modules **/protos **/proto +**/coverage diff --git a/.prettierignore b/.prettierignore index d6014446..800ee336 100644 --- a/.prettierignore +++ b/.prettierignore @@ -3,3 +3,4 @@ .parcel-cache .github **/protos +**/coverage diff --git a/packages/status-js/src/client/activityCenter.ts b/packages/status-js/src/client/activityCenter.ts index 5302d4a3..0f67c0b7 100644 --- a/packages/status-js/src/client/activityCenter.ts +++ b/packages/status-js/src/client/activityCenter.ts @@ -1,10 +1,11 @@ // todo?: rename to notifications (center?), inbox, or keep same as other platforms +// todo: use kebab case for the file name import type { ChatMessage } from './chat' import type { Client } from './client' // todo?: rename to Activity -type Notification = { +export type Notification = { type: 'message' value: ChatMessage isMention?: boolean @@ -13,8 +14,9 @@ type Notification = { export type ActivityCenterLatest = { notifications: Notification[] - // todo?: rename count to mentionsAndRepliesCount + // todo?: rename count to mentionsAndRepliesCount, mentionsCount unreadChats: Map + totalCount: number } export class ActivityCenter { @@ -33,6 +35,7 @@ export class ActivityCenter { public getLatest = (): ActivityCenterLatest => { const notifications: Notification[] = [] const unreadChats: Map = new Map() + let totalCount = 0 for (const notification of this.#notifications.values()) { if (notification.type === 'message') { @@ -41,8 +44,10 @@ export class ActivityCenter { const chat = unreadChats.get(chatUuid) let count = chat?.count ?? 0 - if (notification.isMention || notification.isReply) { + const isMention = notification.isMention || notification.isReply + if (isMention) { count++ + totalCount++ } if (chat) { @@ -50,6 +55,10 @@ export class ActivityCenter { } else { unreadChats.set(chatUuid, { count }) } + + if (!isMention) { + continue + } } notifications.push(notification) @@ -67,12 +76,14 @@ export class ActivityCenter { return 0 }) - // fixme!?: do not display regular messages, only mentions and replies - // todo?: group notifications (all, unreads, mentions, replies, _chats.{id,count}) - return { notifications, unreadChats } + return { + // todo?: group notifications (all, mentions, replies) + notifications, + unreadChats, + totalCount, + } } - // todo: pass ids instead of values and resolve within public addMessageNotification = ( newMessage: ChatMessage, referencedMessage?: ChatMessage @@ -98,15 +109,49 @@ export class ActivityCenter { this.emitLatest() } + // todo?: also calls `clearChatNotifications` (on non-action items/notifications)? + // markAllAsRead = () => {} + + // todo?: for example from chat with red bar in UI indicating start + // markChatNotificationsAsUnreadSince = (category, id) => {} + + // todo?: rename to `clearChatNotifications`; separate (button) from `markAllAsRead`? + // todo?: merge with `removeChatNotifications`; together with `notification.type` condition /** * Removes all notifications. */ - removeNotifications = () => { - this.#notifications.clear() + removeNotifications = (category: 'all' | 'mentions' | 'replies') => { + // todo?: clear all non-actionable notification too + if (category === 'all') { + for (const notification of this.#notifications) { + const { isMention, isReply } = notification + + if (!(isMention || isReply)) { + continue + } + + this.#notifications.delete(notification) + } + } else if (category === 'mentions') { + // todo: extract to a func + this.#notifications.forEach(notification => { + if (notification.isMention) { + this.#notifications.delete(notification) + } + }) + } else if (category === 'replies') { + this.#notifications.forEach(notification => { + if (notification.isReply) { + this.#notifications.delete(notification) + } + }) + } this.emitLatest() } + // todo?: call from UI on ESC + // todo?: call from UI if scrolled all the way to the end /** * Removes chat message notifications from the Activity Center. For example, * on only opening or after scrolling to the end. diff --git a/packages/status-js/src/client/chat.ts b/packages/status-js/src/client/chat.ts index 61f990bd..2a2a9e4d 100644 --- a/packages/status-js/src/client/chat.ts +++ b/packages/status-js/src/client/chat.ts @@ -20,6 +20,7 @@ import type { MessageType } from '../protos/enums' import type { Client } from './client' import type { Community } from './community/community' import type { Reactions } from './community/get-reactions' +import type { Member } from './member' import type { WakuMessage } from 'js-waku' export type ChatMessage = ChatMessageProto & { @@ -28,6 +29,9 @@ export type ChatMessage = ChatMessageProto & { reactions: Reactions chatUuid: string signer: string + member: Member + communityDisplayName: string + chatDisplayName: string responseToMessage?: ChatMessage edittedClock?: bigint pinnedClock?: bigint diff --git a/packages/status-js/src/client/community/handle-waku-message.ts b/packages/status-js/src/client/community/handle-waku-message.ts index 37562ab7..148206bb 100644 --- a/packages/status-js/src/client/community/handle-waku-message.ts +++ b/packages/status-js/src/client/community/handle-waku-message.ts @@ -126,6 +126,8 @@ export function handleWakuMessage( messageId, chatUuid, signerPublicKey, + community, + chat, }) // handle diff --git a/packages/status-js/src/client/community/map-chat-message.ts b/packages/status-js/src/client/community/map-chat-message.ts index 8a65032b..d0139cac 100644 --- a/packages/status-js/src/client/community/map-chat-message.ts +++ b/packages/status-js/src/client/community/map-chat-message.ts @@ -1,5 +1,6 @@ import type { ChatMessage as ChatMessageProto } from '../../protos/chat-message' -import type { ChatMessage } from '../chat' +import type { Chat, ChatMessage } from '../chat' +import type { Community } from './community' export function mapChatMessage( decodedMessage: ChatMessageProto, @@ -7,9 +8,11 @@ export function mapChatMessage( messageId: string chatUuid: string signerPublicKey: string + community: Community + chat: Chat } ): ChatMessage { - const { messageId, chatUuid, signerPublicKey } = props + const { messageId, chatUuid, signerPublicKey, community, chat } = props const message: ChatMessage = { ...decodedMessage, @@ -25,6 +28,10 @@ export function mapChatMessage( SAD: new Set(), ANGRY: new Set(), }, + member: community.getMember(signerPublicKey)!, + // todo?: asign as .community, .community.description, .communityDescription, or .community.displayName + communityDisplayName: community.description.identity!.displayName, + chatDisplayName: chat.description.identity!.displayName, } return message diff --git a/packages/status-js/src/index.ts b/packages/status-js/src/index.ts index 2599977d..410740b5 100644 --- a/packages/status-js/src/index.ts +++ b/packages/status-js/src/index.ts @@ -2,6 +2,7 @@ export type { Account } from './client/account' export type { ActivityCenter, ActivityCenterLatest, + Notification, } from './client/activityCenter' export type { ChatMessage as Message } from './client/chat' export type { Client, ClientOptions } from './client/client' diff --git a/packages/status-react/package.json b/packages/status-react/package.json index fb24d6f7..61bff02d 100644 --- a/packages/status-react/package.json +++ b/packages/status-react/package.json @@ -42,11 +42,13 @@ "@radix-ui/react-label": "^0.1.5", "@radix-ui/react-popover": "^0.1.6", "@radix-ui/react-separator": "^0.1.4", + "@radix-ui/react-tabs": "^1.0.0", "@radix-ui/react-toggle-group": "^0.1.5", - "@radix-ui/react-tooltip": "^0.1.7", + "@radix-ui/react-tooltip": "^1.0.0", "@radix-ui/react-visually-hidden": "^0.1.4", "@status-im/js": "0.1.0-alpha.2", "@stitches/react": "^1.2.8", + "date-fns": "^2.29.3", "emoji-mart": "^3.0.1", "html-entities": "^2.3.2", "qrcode.react": "^3.0.1", diff --git a/packages/status-react/src/components/chat-menu/edit-group-chat-dialog.tsx b/packages/status-react/src/components/chat-menu/edit-group-chat-dialog.tsx index d67def3e..b5ac7df7 100644 --- a/packages/status-react/src/components/chat-menu/edit-group-chat-dialog.tsx +++ b/packages/status-react/src/components/chat-menu/edit-group-chat-dialog.tsx @@ -11,7 +11,7 @@ export const EditGroupChatDialog = () => { placeholder="A catchy name" maxLength={30} /> - + Save changes diff --git a/packages/status-react/src/components/main-sidebar/components/chats/chat-item.tsx b/packages/status-react/src/components/main-sidebar/components/chats/chat-item.tsx index 271ee500..e582e8e3 100644 --- a/packages/status-react/src/components/main-sidebar/components/chats/chat-item.tsx +++ b/packages/status-react/src/components/main-sidebar/components/chats/chat-item.tsx @@ -4,7 +4,7 @@ import { NavLink } from 'react-router-dom' import { useActivityCenter } from '../../../../protocol' import { styled } from '../../../../styles/config' -import { Avatar } from '../../../../system' +import { Avatar, Badge, Flex } from '../../../../system' import type { Chat } from '../../../../protocol/use-sorted-chats' import type { Ref } from 'react' @@ -30,7 +30,10 @@ const ChatItem = (props: Props, ref: Ref) => { to={`/${chat.id}`} state={muted ? 'muted' : unread ? 'unread' : undefined} > - #{displayName} + + + #{displayName} + {count > 0 && {count}} ) @@ -46,11 +49,11 @@ const Link = styled(NavLink, { fontFamily: '$sans', fontWeight: '$500', fontSize: 15, - display: 'inline-flex', + display: 'flex', + justifyContent: 'space-between', color: '$accent-4', alignItems: 'center', width: '100%', - gap: '$2', borderRadius: 8, padding: 8, @@ -75,15 +78,3 @@ const Link = styled(NavLink, { }, }, }) - -const Badge = styled('div', { - textAlign: 'center', - position: 'absolute', - right: 8, - width: 22, - height: 22, - background: '$primary-1', - borderRadius: '$full', - fontSize: 12, - color: '$accent-11', -}) diff --git a/packages/status-react/src/components/main-sidebar/components/chats/index.tsx b/packages/status-react/src/components/main-sidebar/components/chats/index.tsx index 598bf95d..265a9ad2 100644 --- a/packages/status-react/src/components/main-sidebar/components/chats/index.tsx +++ b/packages/status-react/src/components/main-sidebar/components/chats/index.tsx @@ -9,7 +9,7 @@ export const Chats = () => { const { categories, chats } = useSortedChats() return ( - + {chats.map(chat => ( ))} diff --git a/packages/status-react/src/components/main-sidebar/components/community-info/index.tsx b/packages/status-react/src/components/main-sidebar/components/community-info/index.tsx index 9a3a4609..8b75b576 100644 --- a/packages/status-react/src/components/main-sidebar/components/community-info/index.tsx +++ b/packages/status-react/src/components/main-sidebar/components/community-info/index.tsx @@ -14,7 +14,7 @@ export const CommunityInfo = () => { return ( + + ) + results.contents.push( + + {currentTab.content} + + ) + + return results + }, initialValue) + + const actions = props.actions.map(action => { + return ( + + { + action.method(activeTab) + }} + > + + + + ) + }) + + return ( + + + {/* todo?: if all empty, disable other tabs */} + {/* todo?: if active, disable hover and clicks */} + {triggers} +
{actions}
+
+ {contents} +
+ ) +} + +export { Tabs } diff --git a/packages/status-react/src/system/tag/index.tsx b/packages/status-react/src/system/tag/index.tsx new file mode 100644 index 00000000..9d018728 --- /dev/null +++ b/packages/status-react/src/system/tag/index.tsx @@ -0,0 +1 @@ +export { Tag } from './tag' diff --git a/packages/status-react/src/system/tag/tag.tsx b/packages/status-react/src/system/tag/tag.tsx new file mode 100644 index 00000000..feb83a78 --- /dev/null +++ b/packages/status-react/src/system/tag/tag.tsx @@ -0,0 +1,128 @@ +import React from 'react' + +import { useNavigate } from 'react-router-dom' + +import { TinyChevronRightIcon } from '../../icons/tiny-chevron-right-icon' +import { TinyCommunityIcon } from '../../icons/tiny-community-icon' +import { TinyReplyIcon } from '../../icons/tiny-reply-icon' +import { styled } from '../../styles/config' +import { Avatar } from '../avatar' +import { Text } from '../text' + +const Base = styled('div', { + padding: '0px 6px', + border: '1px solid rgba(0, 0, 0, 0.1)', + borderRadius: '11px', + height: '22px', + display: 'flex', + alignItems: 'center', + width: 'max-content', + color: '$gray-1', + gap: '6px', + '&:hover': { + cursor: 'default', + }, +}) + +const Segment = styled('div', { + display: 'flex', + alignItems: 'center', + gap: '4px', +}) + +const PathLink = styled('a', { + '&:hover': { + textDecoration: 'underline', + }, +}) + +interface CommunityProps { + type: 'community' + communityDisplayName: string + chatDisplayName: string + chatUuid: string + onNavigateChange: () => void +} +interface ReplyProps { + type: 'reply' + text: string +} + +// fixme: clicking on flex gab/space between components captures and handles click events +const Tag = (props: CommunityProps | ReplyProps) => { + const { type } = props + + // todo?: extract together with `PathLink` + const navigate = useNavigate() + + switch (type) { + case 'community': + return ( + + { + e.preventDefault() + e.stopPropagation() + }} + > + + + + {props.communityDisplayName} + + + { + e.preventDefault() + e.stopPropagation() + }} + > + + + + { + e.preventDefault() + e.stopPropagation() + props.onNavigateChange() + navigate(`/${props.chatUuid}`) + }} + > + + #{props.chatDisplayName} + + + + + ) + + case 'reply': + return ( + + { + e.preventDefault() + e.stopPropagation() + }} + > + + + {props.text} + + + + ) + + default: + return null + } +} + +export { Tag } diff --git a/packages/status-react/src/system/text/text.tsx b/packages/status-react/src/system/text/text.tsx index bd278326..3d1c0ab5 100644 --- a/packages/status-react/src/system/text/text.tsx +++ b/packages/status-react/src/system/text/text.tsx @@ -2,6 +2,7 @@ import { styled, theme } from '../../styles/config' import type React from 'react' +// todo?: rich variant here (e.g. mentions, format, code) const Text = styled('div', { fontFamily: theme.fonts.sans, overflowWrap: 'break-word', @@ -35,6 +36,9 @@ const Text = styled('div', { gray: { color: '$gray-1', }, + current: { + color: '$current', + }, }, weight: { '400': { diff --git a/packages/status-react/src/system/tooltip/styles.tsx b/packages/status-react/src/system/tooltip/styles.tsx index d322a819..d9919f9a 100644 --- a/packages/status-react/src/system/tooltip/styles.tsx +++ b/packages/status-react/src/system/tooltip/styles.tsx @@ -27,7 +27,7 @@ export const Content = styled(Primitive.Content, { fontWeight: '$500', fontSize: 13, padding: 8, - lineHeight: 1, + lineHeight: '18px', backgroundColor: '$accent-1', color: '$accent-11', borderRadius: 8, diff --git a/packages/status-react/src/system/tooltip/tooltip.tsx b/packages/status-react/src/system/tooltip/tooltip.tsx index f1fc0614..d5563ab6 100644 --- a/packages/status-react/src/system/tooltip/tooltip.tsx +++ b/packages/status-react/src/system/tooltip/tooltip.tsx @@ -4,7 +4,10 @@ import * as Primitive from '@radix-ui/react-tooltip' import { Arrow, Content } from './styles' -import type { TooltipContentProps } from '@radix-ui/react-tooltip' +import type { + TooltipArrowProps, + TooltipContentProps, +} from '@radix-ui/react-tooltip' import type { Ref } from 'react' interface Props { @@ -12,6 +15,8 @@ interface Props { children: React.ReactElement side?: TooltipContentProps['side'] sideOffset?: TooltipContentProps['sideOffset'] + align?: TooltipContentProps['align'] + arrowOffset?: TooltipArrowProps['offset'] } const Tooltip = (props: Props, ref: Ref) => { @@ -20,19 +25,23 @@ const Tooltip = (props: Props, ref: Ref) => { label, side = 'top', sideOffset = 5, + align = 'center', + arrowOffset = 0, ...triggerProps } = props return ( - - - {cloneElement(children, { ref, ...triggerProps })} - - - {label} - - - + + + + {cloneElement(children, { ref, ...triggerProps })} + + + {label} + + + + ) } diff --git a/yarn.lock b/yarn.lock index 3284e750..971d4795 100644 --- a/yarn.lock +++ b/yarn.lock @@ -750,6 +750,26 @@ "@ethersproject/bytes" "^5.5.0" "@ethersproject/logger" "^5.5.0" +"@floating-ui/core@^0.7.3": + version "0.7.3" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-0.7.3.tgz#d274116678ffae87f6b60e90f88cc4083eefab86" + integrity sha512-buc8BXHmG9l82+OQXOFU3Kr2XQx9ys01U/Q9HMIrZ300iLc8HLMgh7dcCqgYzAzf4BkoQvDcXf5Y+CuEZ5JBYg== + +"@floating-ui/dom@^0.5.3": + version "0.5.4" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-0.5.4.tgz#4eae73f78bcd4bd553ae2ade30e6f1f9c73fe3f1" + integrity sha512-419BMceRLq0RrmTSDxn8hf9R3VCJv2K9PUfugh5JyEFmdjzDo+e8U5EdR8nzKq8Yj1htzLm3b6eQEEam3/rrtg== + dependencies: + "@floating-ui/core" "^0.7.3" + +"@floating-ui/react-dom@0.7.2": + version "0.7.2" + resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-0.7.2.tgz#0bf4ceccb777a140fc535c87eb5d6241c8e89864" + integrity sha512-1T0sJcpHgX/u4I1OzIEhlcrvkUN8ln39nz7fMoE/2HDHrPiMFoOGR7++GYyfUmIQHkkrTinaeQsO3XWubjSvGg== + dependencies: + "@floating-ui/dom" "^0.5.3" + use-isomorphic-layout-effect "^1.1.1" + "@hcaptcha/react-hcaptcha@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@hcaptcha/react-hcaptcha/-/react-hcaptcha-1.1.0.tgz#ca770c9fc1f456e3c6b057bedf01a94693b2ec96" @@ -1451,6 +1471,13 @@ dependencies: "@babel/runtime" "^7.13.10" +"@radix-ui/primitive@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.0.0.tgz#e1d8ef30b10ea10e69c76e896f608d9276352253" + integrity sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-accessible-icon@^0.1.4": version "0.1.4" resolved "https://registry.yarnpkg.com/@radix-ui/react-accessible-icon/-/react-accessible-icon-0.1.4.tgz#bdbf1e3226a0e9e7778b68728b175bdc532b720c" @@ -1480,6 +1507,14 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-primitive" "0.1.4" +"@radix-ui/react-arrow@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-arrow/-/react-arrow-1.0.0.tgz#c461f4c2cab3317e3d42a1ae62910a4cbb0192a1" + integrity sha512-1MUuv24HCdepi41+qfv125EwMuxgQ+U+h0A9K3BjCO/J8nVRREKHHpkD9clwfnjEDk9hgGzCnff4aUKCPiRepw== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-primitive" "1.0.0" + "@radix-ui/react-checkbox@^0.1.5": version "0.1.5" resolved "https://registry.yarnpkg.com/@radix-ui/react-checkbox/-/react-checkbox-0.1.5.tgz#3a6bd54ba1720c8e5c03852acf460e35dfbe9da3" @@ -1522,6 +1557,17 @@ "@radix-ui/react-primitive" "0.1.4" "@radix-ui/react-slot" "0.1.2" +"@radix-ui/react-collection@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-collection/-/react-collection-1.0.0.tgz#0ec4c72fabd35a03b5787075ac799e3b17ca5710" + integrity sha512-8i1pf5dKjnq90Z8udnnXKzdCEV3/FYrfw0n/b6NvB6piXEn3fO1bOh7HBcpG8XrnIXzxlYu2oCcR38QpyLS/mg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.0" + "@radix-ui/react-context" "1.0.0" + "@radix-ui/react-primitive" "1.0.0" + "@radix-ui/react-slot" "1.0.0" + "@radix-ui/react-compose-refs@0.1.0", "@radix-ui/react-compose-refs@^0.1.0": version "0.1.0" resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-0.1.0.tgz#cff6e780a0f73778b976acff2c2a5b6551caab95" @@ -1529,6 +1575,13 @@ dependencies: "@babel/runtime" "^7.13.10" +"@radix-ui/react-compose-refs@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz#37595b1f16ec7f228d698590e78eeed18ff218ae" + integrity sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-context-menu@^0.1.6": version "0.1.6" resolved "https://registry.yarnpkg.com/@radix-ui/react-context-menu/-/react-context-menu-0.1.6.tgz#0c75f2faffec6c8697247a4b685a432b3c4d07f0" @@ -1548,6 +1601,13 @@ dependencies: "@babel/runtime" "^7.13.10" +"@radix-ui/react-context@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-context/-/react-context-1.0.0.tgz#f38e30c5859a9fb5e9aa9a9da452ee3ed9e0aee0" + integrity sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-dialog@0.1.7", "@radix-ui/react-dialog@^0.1.7": version "0.1.7" resolved "https://registry.yarnpkg.com/@radix-ui/react-dialog/-/react-dialog-0.1.7.tgz#285414cf66f5bbf42bc9935314e0381abe01e7d0" @@ -1569,6 +1629,13 @@ aria-hidden "^1.1.1" react-remove-scroll "^2.4.0" +"@radix-ui/react-direction@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-direction/-/react-direction-1.0.0.tgz#a2e0b552352459ecf96342c79949dd833c1e6e45" + integrity sha512-2HV05lGUgYcA6xgLQ4BKPDmtL+QbIZYH5fCOTAOOcJ5O0QbWS3i9lKaurLzliYUDhORI2Qr3pyjhJh44lKA3rQ== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-dismissable-layer@0.1.5": version "0.1.5" resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-0.1.5.tgz#9379032351e79028d472733a5cc8ba4a0ea43314" @@ -1582,6 +1649,18 @@ "@radix-ui/react-use-callback-ref" "0.1.0" "@radix-ui/react-use-escape-keydown" "0.1.0" +"@radix-ui/react-dismissable-layer@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.0.tgz#35b7826fa262fd84370faef310e627161dffa76b" + integrity sha512-n7kDRfx+LB1zLueRDvZ1Pd0bxdJWDUZNQ/GWoxDn2prnuJKRdxsjulejX/ePkOsLi2tTm6P24mDqlMSgQpsT6g== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.0" + "@radix-ui/react-compose-refs" "1.0.0" + "@radix-ui/react-primitive" "1.0.0" + "@radix-ui/react-use-callback-ref" "1.0.0" + "@radix-ui/react-use-escape-keydown" "1.0.0" + "@radix-ui/react-dropdown-menu@^0.1.6": version "0.1.6" resolved "https://registry.yarnpkg.com/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-0.1.6.tgz#3203229788cd57e552c9f19dcc7008e2b545919c" @@ -1621,6 +1700,14 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-use-layout-effect" "0.1.0" +"@radix-ui/react-id@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-id/-/react-id-1.0.0.tgz#8d43224910741870a45a8c9d092f25887bb6d11e" + integrity sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-layout-effect" "1.0.0" + "@radix-ui/react-label@0.1.5", "@radix-ui/react-label@^0.1.5": version "0.1.5" resolved "https://registry.yarnpkg.com/@radix-ui/react-label/-/react-label-0.1.5.tgz#12cd965bfc983e0148121d4c99fb8e27a917c45c" @@ -1692,6 +1779,22 @@ "@radix-ui/react-use-size" "0.1.1" "@radix-ui/rect" "0.1.1" +"@radix-ui/react-popper@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-popper/-/react-popper-1.0.0.tgz#fb4f937864bf39c48f27f55beee61fa9f2bef93c" + integrity sha512-k2dDd+1Wl0XWAMs9ZvAxxYsB9sOsEhrFQV4CINd7IUZf0wfdye4OHen9siwxvZImbzhgVeKTJi68OQmPRvVdMg== + dependencies: + "@babel/runtime" "^7.13.10" + "@floating-ui/react-dom" "0.7.2" + "@radix-ui/react-arrow" "1.0.0" + "@radix-ui/react-compose-refs" "1.0.0" + "@radix-ui/react-context" "1.0.0" + "@radix-ui/react-primitive" "1.0.0" + "@radix-ui/react-use-layout-effect" "1.0.0" + "@radix-ui/react-use-rect" "1.0.0" + "@radix-ui/react-use-size" "1.0.0" + "@radix-ui/rect" "1.0.0" + "@radix-ui/react-portal@0.1.4": version "0.1.4" resolved "https://registry.yarnpkg.com/@radix-ui/react-portal/-/react-portal-0.1.4.tgz#17bdce3d7f1a9a0b35cb5e935ab8bc562441a7d2" @@ -1701,6 +1804,14 @@ "@radix-ui/react-primitive" "0.1.4" "@radix-ui/react-use-layout-effect" "0.1.0" +"@radix-ui/react-portal@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-portal/-/react-portal-1.0.0.tgz#7220b66743394fabb50c55cb32381395cc4a276b" + integrity sha512-a8qyFO/Xb99d8wQdu4o7qnigNjTPG123uADNecz0eX4usnQEj7o+cG4ZX4zkqq98NYekT7UoEQIjxBNWIFuqTA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-primitive" "1.0.0" + "@radix-ui/react-presence@0.1.2": version "0.1.2" resolved "https://registry.yarnpkg.com/@radix-ui/react-presence/-/react-presence-0.1.2.tgz#9f11cce3df73cf65bc348e8b76d891f0d54c1fe3" @@ -1710,6 +1821,15 @@ "@radix-ui/react-compose-refs" "0.1.0" "@radix-ui/react-use-layout-effect" "0.1.0" +"@radix-ui/react-presence@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-presence/-/react-presence-1.0.0.tgz#814fe46df11f9a468808a6010e3f3ca7e0b2e84a" + integrity sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.0" + "@radix-ui/react-use-layout-effect" "1.0.0" + "@radix-ui/react-primitive@0.1.4": version "0.1.4" resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-0.1.4.tgz#6c233cf08b0cb87fecd107e9efecb3f21861edc1" @@ -1718,6 +1838,14 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-slot" "0.1.2" +"@radix-ui/react-primitive@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-1.0.0.tgz#376cd72b0fcd5e0e04d252ed33eb1b1f025af2b0" + integrity sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-slot" "1.0.0" + "@radix-ui/react-roving-focus@0.1.5": version "0.1.5" resolved "https://registry.yarnpkg.com/@radix-ui/react-roving-focus/-/react-roving-focus-0.1.5.tgz#cc48d17a36b56f253d54905b0fd60ee134cb97ee" @@ -1733,6 +1861,22 @@ "@radix-ui/react-use-callback-ref" "0.1.0" "@radix-ui/react-use-controllable-state" "0.1.0" +"@radix-ui/react-roving-focus@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.0.tgz#aadeb65d5dbcdbdd037078156ae1f57c2ff754ee" + integrity sha512-lHvO4MhvoWpeNbiJAoyDsEtbKqP2jkkdwsMVJ3kfqbkC71J/aXE6Th6gkZA1xHEqSku+t+UgoDjvE7Z3gsBpcg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.0" + "@radix-ui/react-collection" "1.0.0" + "@radix-ui/react-compose-refs" "1.0.0" + "@radix-ui/react-context" "1.0.0" + "@radix-ui/react-direction" "1.0.0" + "@radix-ui/react-id" "1.0.0" + "@radix-ui/react-primitive" "1.0.0" + "@radix-ui/react-use-callback-ref" "1.0.0" + "@radix-ui/react-use-controllable-state" "1.0.0" + "@radix-ui/react-separator@^0.1.4": version "0.1.4" resolved "https://registry.yarnpkg.com/@radix-ui/react-separator/-/react-separator-0.1.4.tgz#383ad0f82b364d9982a978d752084af3598e4090" @@ -1749,6 +1893,29 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-compose-refs" "0.1.0" +"@radix-ui/react-slot@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.0.0.tgz#7fa805b99891dea1e862d8f8fbe07f4d6d0fd698" + integrity sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.0" + +"@radix-ui/react-tabs@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-tabs/-/react-tabs-1.0.0.tgz#135c67f1f2bd9ada69a3f6e38dd897d459af5fe5" + integrity sha512-oKUwEDsySVC0uuSEH7SHCVt1+ijmiDFAI9p+fHCtuZdqrRDKIFs09zp5nrmu4ggP6xqSx9lj1VSblnDH+n3IBA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.0" + "@radix-ui/react-context" "1.0.0" + "@radix-ui/react-direction" "1.0.0" + "@radix-ui/react-id" "1.0.0" + "@radix-ui/react-presence" "1.0.0" + "@radix-ui/react-primitive" "1.0.0" + "@radix-ui/react-roving-focus" "1.0.0" + "@radix-ui/react-use-controllable-state" "1.0.0" + "@radix-ui/react-toggle-group@^0.1.5": version "0.1.5" resolved "https://registry.yarnpkg.com/@radix-ui/react-toggle-group/-/react-toggle-group-0.1.5.tgz#9e4d65e22c4fc0ba3a42fbc8d5496c430e5e9852" @@ -1772,26 +1939,24 @@ "@radix-ui/react-primitive" "0.1.4" "@radix-ui/react-use-controllable-state" "0.1.0" -"@radix-ui/react-tooltip@^0.1.7": - version "0.1.7" - resolved "https://registry.yarnpkg.com/@radix-ui/react-tooltip/-/react-tooltip-0.1.7.tgz#6f8c00d6e489565d14abf209ce0fb8853c8c8ee3" - integrity sha512-eiBUsVOHenZ0JR16tl970bB0DafJBz6mFgSGfIGIVpflFj0LIsIDiLMsYyvYdx1KwwsIUDTEZtxcPm/sWjPzqA== +"@radix-ui/react-tooltip@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-tooltip/-/react-tooltip-1.0.0.tgz#f7fcecf2bac5c31cd14666b5acd056015fc21646" + integrity sha512-RB06pov+O4Npy10ei1C6fsyB9QoOjz7Ubo8Sl3qdKtLgkL9iI96925DYtH0bxx6MH6YB2FuzLU6B75qn3AQQQw== dependencies: "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "0.1.0" - "@radix-ui/react-compose-refs" "0.1.0" - "@radix-ui/react-context" "0.1.1" - "@radix-ui/react-id" "0.1.5" - "@radix-ui/react-popper" "0.1.4" - "@radix-ui/react-portal" "0.1.4" - "@radix-ui/react-presence" "0.1.2" - "@radix-ui/react-primitive" "0.1.4" - "@radix-ui/react-slot" "0.1.2" - "@radix-ui/react-use-controllable-state" "0.1.0" - "@radix-ui/react-use-escape-keydown" "0.1.0" - "@radix-ui/react-use-previous" "0.1.1" - "@radix-ui/react-use-rect" "0.1.1" - "@radix-ui/react-visually-hidden" "0.1.4" + "@radix-ui/primitive" "1.0.0" + "@radix-ui/react-compose-refs" "1.0.0" + "@radix-ui/react-context" "1.0.0" + "@radix-ui/react-dismissable-layer" "1.0.0" + "@radix-ui/react-id" "1.0.0" + "@radix-ui/react-popper" "1.0.0" + "@radix-ui/react-portal" "1.0.0" + "@radix-ui/react-presence" "1.0.0" + "@radix-ui/react-primitive" "1.0.0" + "@radix-ui/react-slot" "1.0.0" + "@radix-ui/react-use-controllable-state" "1.0.0" + "@radix-ui/react-visually-hidden" "1.0.0" "@radix-ui/react-use-body-pointer-events@0.1.1": version "0.1.1" @@ -1808,6 +1973,13 @@ dependencies: "@babel/runtime" "^7.13.10" +"@radix-ui/react-use-callback-ref@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz#9e7b8b6b4946fe3cbe8f748c82a2cce54e7b6a90" + integrity sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-controllable-state@0.1.0": version "0.1.0" resolved "https://registry.yarnpkg.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-0.1.0.tgz#4fced164acfc69a4e34fb9d193afdab973a55de1" @@ -1816,6 +1988,14 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-use-callback-ref" "0.1.0" +"@radix-ui/react-use-controllable-state@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.0.tgz#a64deaafbbc52d5d407afaa22d493d687c538b7f" + integrity sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-callback-ref" "1.0.0" + "@radix-ui/react-use-direction@0.1.0": version "0.1.0" resolved "https://registry.yarnpkg.com/@radix-ui/react-use-direction/-/react-use-direction-0.1.0.tgz#97ac1d52e497c974389e7988f809238ed72e7df7" @@ -1831,6 +2011,14 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-use-callback-ref" "0.1.0" +"@radix-ui/react-use-escape-keydown@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.0.tgz#aef375db4736b9de38a5a679f6f49b45a060e5d1" + integrity sha512-JwfBCUIfhXRxKExgIqGa4CQsiMemo1Xt0W/B4ei3fpzpvPENKpMKQ8mZSB6Acj3ebrAEgi2xiQvcI1PAAodvyg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-callback-ref" "1.0.0" + "@radix-ui/react-use-layout-effect@0.1.0": version "0.1.0" resolved "https://registry.yarnpkg.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-0.1.0.tgz#ebf71bd6d2825de8f1fbb984abf2293823f0f223" @@ -1838,6 +2026,13 @@ dependencies: "@babel/runtime" "^7.13.10" +"@radix-ui/react-use-layout-effect@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz#2fc19e97223a81de64cd3ba1dc42ceffd82374dc" + integrity sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-previous@0.1.1": version "0.1.1" resolved "https://registry.yarnpkg.com/@radix-ui/react-use-previous/-/react-use-previous-0.1.1.tgz#0226017f72267200f6e832a7103760e96a6db5d0" @@ -1853,6 +2048,14 @@ "@babel/runtime" "^7.13.10" "@radix-ui/rect" "0.1.1" +"@radix-ui/react-use-rect@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-rect/-/react-use-rect-1.0.0.tgz#b040cc88a4906b78696cd3a32b075ed5b1423b3e" + integrity sha512-TB7pID8NRMEHxb/qQJpvSt3hQU4sqNPM1VCTjTRjEOa7cEop/QMuq8S6fb/5Tsz64kqSvB9WnwsDHtjnrM9qew== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/rect" "1.0.0" + "@radix-ui/react-use-size@0.1.1": version "0.1.1" resolved "https://registry.yarnpkg.com/@radix-ui/react-use-size/-/react-use-size-0.1.1.tgz#f6b75272a5d41c3089ca78c8a2e48e5f204ef90f" @@ -1860,6 +2063,14 @@ dependencies: "@babel/runtime" "^7.13.10" +"@radix-ui/react-use-size@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-size/-/react-use-size-1.0.0.tgz#a0b455ac826749419f6354dc733e2ca465054771" + integrity sha512-imZ3aYcoYCKhhgNpkNDh/aTiU05qw9hX+HHI1QDBTyIlcFjgeFlKKySNGMwTp7nYFLQg/j0VA2FmCY4WPDDHMg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-layout-effect" "1.0.0" + "@radix-ui/react-visually-hidden@0.1.4", "@radix-ui/react-visually-hidden@^0.1.4": version "0.1.4" resolved "https://registry.yarnpkg.com/@radix-ui/react-visually-hidden/-/react-visually-hidden-0.1.4.tgz#6c75eae34fb5d084b503506fbfc05587ced05f03" @@ -1868,6 +2079,14 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-primitive" "0.1.4" +"@radix-ui/react-visually-hidden@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.0.tgz#4d69d7e3b6d21ee4678ed6de5215dcd068394401" + integrity sha512-MwAhMdX+n6S4InwRKSnpUsp+lLkYG6izQF56ul6guSX2mBBLOMV9Frx7xJlkEe2GjKLzbNuHhaCS6e5gopmZNA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-primitive" "1.0.0" + "@radix-ui/rect@0.1.1": version "0.1.1" resolved "https://registry.yarnpkg.com/@radix-ui/rect/-/rect-0.1.1.tgz#95b5ba51f469bea6b1b841e2d427e17e37d38419" @@ -1875,6 +2094,13 @@ dependencies: "@babel/runtime" "^7.13.10" +"@radix-ui/rect@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/rect/-/rect-1.0.0.tgz#0dc8e6a829ea2828d53cbc94b81793ba6383bf3c" + integrity sha512-d0O68AYy/9oeEy1DdC07bz1/ZXX+DqCskRd3i4JzLSTXwefzaepQrKjXC7aNM8lTHjFLDO0pDgaEiQ7jEk+HVg== + dependencies: + "@babel/runtime" "^7.13.10" + "@rollup/pluginutils@^4.2.1": version "4.2.1" resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz#e6c6c3aba0744edce3fb2074922d3776c0af2a6d" @@ -2840,6 +3066,11 @@ datastore-core@^8.0.1: it-take "^1.0.1" uint8arrays "^3.0.0" +date-fns@^2.29.3: + version "2.29.3" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8" + integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA== + debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -6832,6 +7063,11 @@ use-callback-ref@^1.2.3: resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.2.5.tgz#6115ed242cfbaed5915499c0a9842ca2912f38a5" integrity sha512-gN3vgMISAgacF7sqsLPByqoePooY3n2emTH59Ur5d/M8eg4WTWu1xp8i8DHjohftIyEx0S08RiYxbffr4j8Peg== +use-isomorphic-layout-effect@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" + integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== + use-sidecar@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.0.5.tgz#ffff2a17c1df42e348624b699ba6e5c220527f2b"