From 5c3b199161826e65b647f4238c457d2b59b5c8dd Mon Sep 17 00:00:00 2001 From: Matt Krick Date: Thu, 20 Feb 2025 18:16:58 -0800 Subject: [PATCH] feat: insights block WIP Signed-off-by: Matt Krick --- .../components/MeetingTypePickerCombobox.tsx | 94 ++++++++++++++++ .../client/components/TeamPickerCombobox.tsx | 106 ++++++++++++++++++ .../components/TeamPickerComboboxRoot.tsx | 25 +++++ packages/client/hooks/useTipTapPageEditor.ts | 4 +- .../client/hooks/useTipTapReflectionEditor.ts | 3 +- .../components/GcalModal/DateTimePickers.tsx | 2 +- packages/client/package.json | 1 + .../tiptap/extensions/InsightsBlockBase.ts | 37 ++++++ .../shared/tiptap/serverTipTapExtensions.ts | 4 +- .../extensions/imageBlock/InsightsBlock.ts | 77 +++++++++++++ .../imageUpload/InsightsBlockView.tsx | 48 ++++++++ .../slashCommand/SlashCommandMenu.tsx | 2 +- .../extensions/slashCommand/slashCommands.ts | 26 +++++ yarn.lock | 46 ++++++++ 14 files changed, 470 insertions(+), 5 deletions(-) create mode 100644 packages/client/components/MeetingTypePickerCombobox.tsx create mode 100644 packages/client/components/TeamPickerCombobox.tsx create mode 100644 packages/client/components/TeamPickerComboboxRoot.tsx create mode 100644 packages/client/shared/tiptap/extensions/InsightsBlockBase.ts create mode 100644 packages/client/tiptap/extensions/imageBlock/InsightsBlock.ts create mode 100644 packages/client/tiptap/extensions/imageUpload/InsightsBlockView.tsx diff --git a/packages/client/components/MeetingTypePickerCombobox.tsx b/packages/client/components/MeetingTypePickerCombobox.tsx new file mode 100644 index 00000000000..5e223cc0f2d --- /dev/null +++ b/packages/client/components/MeetingTypePickerCombobox.tsx @@ -0,0 +1,94 @@ +import {ExpandMore} from '@mui/icons-material' +import CheckIcon from '@mui/icons-material/Check' +import * as Checkbox from '@radix-ui/react-checkbox' +import * as DropdownMenu from '@radix-ui/react-dropdown-menu' +import type {NodeViewProps} from '@tiptap/core' +import type {MeetingTypeEnum} from '../__generated__/ExportToCSVQuery.graphql' +import type {InsightsBlockAttrs} from '../tiptap/extensions/imageBlock/InsightsBlock' +import {Menu} from '../ui/Menu/Menu' +import {MenuContent} from '../ui/Menu/MenuContent' + +interface Props { + updateAttributes: NodeViewProps['updateAttributes'] + attrs: InsightsBlockAttrs +} + +const MeetingTypeToReadable = { + action: 'Team Check-in', + poker: 'Sprint Poker', + retrospective: 'Retrospective', + teamPrompt: 'Standup' +} satisfies Record + +export const MeetingTypePickerCombobox = (props: Props) => { + const {updateAttributes, attrs} = props + const {meetingTypes} = attrs + const toggleSelectedTeamId = (meetingType: MeetingTypeEnum) => { + const nextTypes = meetingTypes.includes(meetingType) + ? meetingTypes.filter((curMeetingType) => curMeetingType !== meetingType) + : [...meetingTypes, meetingType] + updateAttributes({meetingTypes: nextTypes}) + } + const label = + meetingTypes.map((type) => MeetingTypeToReadable[type]).join(', ') || 'Meeting types...' + return ( + +
{label}
+
+ +
+ + } + > + +
+
+ {Object.entries(MeetingTypeToReadable).map((entry) => { + const [meetingType, label] = entry as [MeetingTypeEnum, string] + const checked = meetingTypes.includes(meetingType) + return ( + { + e.preventDefault() + }} + onClick={() => { + toggleSelectedTeamId(meetingType) + }} + > +
+
+
+ + + {checked && ( + + )} + + + {/* */} +
+
+ {label} + {/* {command.description} */} +
+
+
+
+ ) + })} +
+
+
+
+ ) +} diff --git a/packages/client/components/TeamPickerCombobox.tsx b/packages/client/components/TeamPickerCombobox.tsx new file mode 100644 index 00000000000..5ba38a90c2e --- /dev/null +++ b/packages/client/components/TeamPickerCombobox.tsx @@ -0,0 +1,106 @@ +import {ExpandMore} from '@mui/icons-material' +import CheckIcon from '@mui/icons-material/Check' +import * as Checkbox from '@radix-ui/react-checkbox' +import * as DropdownMenu from '@radix-ui/react-dropdown-menu' +import type {NodeViewProps} from '@tiptap/core' +import graphql from 'babel-plugin-relay/macro' +import {usePreloadedQuery, type PreloadedQuery} from 'react-relay' +import type {TeamPickerComboboxQuery} from '../__generated__/TeamPickerComboboxQuery.graphql' +import type {InsightsBlockAttrs} from '../tiptap/extensions/imageBlock/InsightsBlock' +import {Menu} from '../ui/Menu/Menu' +import {MenuContent} from '../ui/Menu/MenuContent' +const query = graphql` + query TeamPickerComboboxQuery { + viewer { + teams { + id + name + } + } + } +` + +interface Props { + updateAttributes: NodeViewProps['updateAttributes'] + attrs: InsightsBlockAttrs + queryRef: PreloadedQuery +} + +export const TeamPickerCombobox = (props: Props) => { + const {updateAttributes, queryRef, attrs} = props + const data = usePreloadedQuery(query, queryRef) + const {viewer} = data + const {teams} = viewer + const {teamIds} = attrs + const toggleSelectedTeamId = (teamId: string) => { + const nextTeamIds = teamIds.includes(teamId) + ? teamIds.filter((curTeamId) => curTeamId !== teamId) + : [...teamIds, teamId] + updateAttributes({teamIds: nextTeamIds}) + } + + const label = + teams + .filter((team) => teamIds.includes(team.id)) + .map((team) => team.name) + .join(', ') || 'Select your teams...' + return ( + +
{label}
+
+ +
+ + } + > + +
+
+ {teams.map((team) => { + const checked = teamIds.includes(team.id) + return ( + { + e.preventDefault() + }} + onClick={() => { + toggleSelectedTeamId(team.id) + }} + > +
+
+
+ + + {checked && ( + + )} + + + {/* */} +
+
+ {team.name} + {/* {command.description} */} +
+
+
+
+ ) + })} +
+
+
+
+ ) +} diff --git a/packages/client/components/TeamPickerComboboxRoot.tsx b/packages/client/components/TeamPickerComboboxRoot.tsx new file mode 100644 index 00000000000..ee728a26e0b --- /dev/null +++ b/packages/client/components/TeamPickerComboboxRoot.tsx @@ -0,0 +1,25 @@ +import type {NodeViewProps} from '@tiptap/core' +import {Suspense} from 'react' +import type {TeamPickerComboboxQuery} from '../__generated__/TeamPickerComboboxQuery.graphql' +import query from '../__generated__/TeamPickerComboboxQuery.graphql' +import useQueryLoaderNow from '../hooks/useQueryLoaderNow' +import type {InsightsBlockAttrs} from '../tiptap/extensions/imageBlock/InsightsBlock' +import {Loader} from '../utils/relay/renderLoader' +import {TeamPickerCombobox} from './TeamPickerCombobox' + +interface Props { + updateAttributes: NodeViewProps['updateAttributes'] + attrs: InsightsBlockAttrs +} + +export const TeamPickerComboboxRoot = (props: Props) => { + const {attrs, updateAttributes} = props + const queryRef = useQueryLoaderNow(query) + return ( + }> + {queryRef && ( + + )} + + ) +} diff --git a/packages/client/hooks/useTipTapPageEditor.ts b/packages/client/hooks/useTipTapPageEditor.ts index 34d64ac70f3..41ce794d09a 100644 --- a/packages/client/hooks/useTipTapPageEditor.ts +++ b/packages/client/hooks/useTipTapPageEditor.ts @@ -23,6 +23,7 @@ import {themeBackgroundColors} from '../shared/themeBackgroundColors' import {mentionConfig, serverTipTapExtensions} from '../shared/tiptap/serverTipTapExtensions' import {toSlug} from '../shared/toSlug' import ImageBlock from '../tiptap/extensions/imageBlock/ImageBlock' +import {InsightsBlock} from '../tiptap/extensions/imageBlock/InsightsBlock' import {ImageUpload} from '../tiptap/extensions/imageUpload/ImageUpload' import {SlashCommand} from '../tiptap/extensions/slashCommand/SlashCommand' import {ElementWidth} from '../types/constEnums' @@ -150,7 +151,8 @@ export const useTipTapPageEditor = ( name: preferredName, color: `#${themeBackgroundColors[colorIdx]}` } - }) + }), + InsightsBlock ], autofocus: true, editable: true diff --git a/packages/client/hooks/useTipTapReflectionEditor.ts b/packages/client/hooks/useTipTapReflectionEditor.ts index dee34ab2c6c..6194602e492 100644 --- a/packages/client/hooks/useTipTapReflectionEditor.ts +++ b/packages/client/hooks/useTipTapReflectionEditor.ts @@ -67,7 +67,8 @@ export const useTipTapReflectionEditor = ( SlashCommand.configure({ 'Heading 1': false, 'Heading 2': false, - 'To-do list': false + 'To-do list': false, + Insights: false }), Focus, ImageUpload.configure({ diff --git a/packages/client/modules/userDashboard/components/GcalModal/DateTimePickers.tsx b/packages/client/modules/userDashboard/components/GcalModal/DateTimePickers.tsx index 6dfc9234ff0..c1d8cc1236d 100644 --- a/packages/client/modules/userDashboard/components/GcalModal/DateTimePickers.tsx +++ b/packages/client/modules/userDashboard/components/GcalModal/DateTimePickers.tsx @@ -5,7 +5,7 @@ import {Dayjs} from 'dayjs' import * as React from 'react' import {PALETTE} from '../../../../styles/paletteV3' -const customStyles = { +export const customStyles = { width: '100%', '& .MuiOutlinedInput-root': { '&:hover .MuiOutlinedInput-notchedOutline, &.Mui-focused .MuiOutlinedInput-notchedOutline, &.focus-within .MuiOutlinedInput-notchedOutline': diff --git a/packages/client/package.json b/packages/client/package.json index 6a040d55b8f..04b31506082 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -78,6 +78,7 @@ "@mui/x-date-pickers": "^7.23.6", "@radix-ui/react-alert-dialog": "1.1.2", "@radix-ui/react-avatar": "^1.1.1", + "@radix-ui/react-checkbox": "^1.1.4", "@radix-ui/react-collapsible": "^1.1.1", "@radix-ui/react-dialog": "^1.1.2", "@radix-ui/react-dropdown-menu": "^2.1.2", diff --git a/packages/client/shared/tiptap/extensions/InsightsBlockBase.ts b/packages/client/shared/tiptap/extensions/InsightsBlockBase.ts new file mode 100644 index 00000000000..37100cf2af3 --- /dev/null +++ b/packages/client/shared/tiptap/extensions/InsightsBlockBase.ts @@ -0,0 +1,37 @@ +import {Node} from '@tiptap/react' + +declare module '@tiptap/core' { + interface Commands { + insightsBlock: { + setInsights: () => ReturnType + } + } +} + +export const InsightsBlockBase = Node.create({ + name: 'insightsBlock', + + isolating: true, + + defining: true, + + group: 'block', + + draggable: true, + + selectable: true, + + inline: false, + + parseHTML() { + return [ + { + tag: `div[data-type="${this.name}"]` + } + ] + }, + + renderHTML() { + return ['div', {'data-type': this.name}] + } +}) diff --git a/packages/client/shared/tiptap/serverTipTapExtensions.ts b/packages/client/shared/tiptap/serverTipTapExtensions.ts index 21229d6009e..f3a26c63b41 100644 --- a/packages/client/shared/tiptap/serverTipTapExtensions.ts +++ b/packages/client/shared/tiptap/serverTipTapExtensions.ts @@ -9,6 +9,7 @@ import {LoomExtension} from '../../components/promptResponse/loomExtension' import {ImageBlockBase} from '../../tiptap/extensions/imageBlock/ImageBlockBase' import {tiptapTagConfig} from '../../utils/tiptapTagConfig' import {ImageUploadBase} from './extensions/ImageUploadBase' +import {InsightsBlockBase} from './extensions/InsightsBlockBase' export const mentionConfig: Partial> = { renderText({node}) { @@ -38,5 +39,6 @@ export const serverTipTapExtensions = [ renderHTML({HTMLAttributes}) { return ['a', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {class: 'link'}), 0] } - }) + }), + InsightsBlockBase ] diff --git a/packages/client/tiptap/extensions/imageBlock/InsightsBlock.ts b/packages/client/tiptap/extensions/imageBlock/InsightsBlock.ts new file mode 100644 index 00000000000..74883b63c9c --- /dev/null +++ b/packages/client/tiptap/extensions/imageBlock/InsightsBlock.ts @@ -0,0 +1,77 @@ +import {ReactNodeViewRenderer} from '@tiptap/react' +import ms from 'ms' +import type {MeetingTypeEnum} from '../../../__generated__/ExportToCSVQuery.graphql' +import {InsightsBlockBase} from '../../../shared/tiptap/extensions/InsightsBlockBase' +import {InsightsBlockView} from '../imageUpload/InsightsBlockView' + +export interface InsightsBlockAttrs { + teamIds: string[] + meetingTypes: MeetingTypeEnum[] + startAt: Date + endAt: Date + meetingIds: string[] + title: string +} + +export const InsightsBlock = InsightsBlockBase.extend({ + addAttributes() { + return { + teamIds: { + default: [], + parseHTML: (element) => element.getAttribute('data-team-ids')!.split(','), + renderHTML: (attributes) => ({ + 'data-team-ids': attributes.teamIds.join(',') + }) + }, + meetingTypes: { + default: ['retrospective'], + parseHTML: (element) => element.getAttribute('data-meeting-types'), + renderHTML: (attributes) => ({ + 'data-meeting-types': attributes.meetingTypes + }) + }, + startAt: { + default: () => new Date(Date.now() - ms('12w')).toISOString(), + parseHTML: (element) => new Date(element.getAttribute('data-start-at') as string), + renderHTML: (attributes: InsightsBlockAttrs) => ({ + 'data-start-at': attributes.startAt + }) + }, + endAt: { + default: () => new Date().toISOString(), + parseHTML: (element) => new Date(element.getAttribute('data-end-at') as string), + renderHTML: (attributes: InsightsBlockAttrs) => ({ + 'data-end-at': attributes.endAt + }) + }, + meetingIds: { + default: [], + parseHTML: (element) => element.getAttribute('data-meeting-ids'), + renderHTML: (attributes) => ({ + 'data-meeting-ids': attributes.meetingIds + }) + }, + title: { + default: 'Latest Team Insights', + parseHTML: (element) => element.getAttribute('data-title'), + renderHTML: (attributes) => ({ + 'data-title': attributes.title + }) + } + } + }, + addCommands() { + return { + setInsights: + () => + ({commands}) => { + return commands.insertContent({type: 'insightsBlock', text: 'Dirty title'}) + } + } + }, + + addNodeView() { + // By convention, components rendered here are named with a *View suffix + return ReactNodeViewRenderer(InsightsBlockView) + } +}) diff --git a/packages/client/tiptap/extensions/imageUpload/InsightsBlockView.tsx b/packages/client/tiptap/extensions/imageUpload/InsightsBlockView.tsx new file mode 100644 index 00000000000..06ca7ff956c --- /dev/null +++ b/packages/client/tiptap/extensions/imageUpload/InsightsBlockView.tsx @@ -0,0 +1,48 @@ +// import {DatePicker} from '@mui/x-date-pickers' +import {NodeViewWrapper, type NodeViewProps} from '@tiptap/react' +import {MeetingTypePickerCombobox} from '../../../components/MeetingTypePickerCombobox' +import {TeamPickerComboboxRoot} from '../../../components/TeamPickerComboboxRoot' +import type {InsightsBlockAttrs} from '../imageBlock/InsightsBlock' +export const InsightsBlockView = (props: NodeViewProps) => { + const {node, updateAttributes} = props + const attrs = node.attrs as InsightsBlockAttrs + const {title} = attrs + return ( + +
+
+ { + updateAttributes({title: e.target.value}) + }} + value={title} + /> +
+ {/* Row 1 */} + + + {/* Row 2 */} + + + + {/* Row 3 */} + + {/* handleChangeStart(date, startValue)} + format='MMMM D, YYYY' + sx={customStyles} + /> */} + +
+
+
+
+ ) +} diff --git a/packages/client/tiptap/extensions/slashCommand/SlashCommandMenu.tsx b/packages/client/tiptap/extensions/slashCommand/SlashCommandMenu.tsx index 773f985a52c..7d4161568b0 100644 --- a/packages/client/tiptap/extensions/slashCommand/SlashCommandMenu.tsx +++ b/packages/client/tiptap/extensions/slashCommand/SlashCommandMenu.tsx @@ -61,7 +61,7 @@ export const SlashCommandMenu = forwardRef( if (!items.length) return null return ( -
+
{items.map((item) => (
{item.group}
diff --git a/packages/client/tiptap/extensions/slashCommand/slashCommands.ts b/packages/client/tiptap/extensions/slashCommand/slashCommands.ts index af0f0a71565..44a476aa898 100644 --- a/packages/client/tiptap/extensions/slashCommand/slashCommands.ts +++ b/packages/client/tiptap/extensions/slashCommand/slashCommands.ts @@ -5,6 +5,7 @@ import FormatListNumberedIcon from '@mui/icons-material/FormatListNumbered' import FormatQuoteIcon from '@mui/icons-material/FormatQuote' import HorizontalRuleIcon from '@mui/icons-material/HorizontalRule' import ImageIcon from '@mui/icons-material/Image' +import InsightsIcon from '@mui/icons-material/Insights' import TextFieldsIcon from '@mui/icons-material/TextFields' import TitleIcon from '@mui/icons-material/Title' import type {OverridableComponent} from '@mui/material/OverridableComponent' @@ -115,6 +116,31 @@ export const slashCommands = [ } ] }, + { + group: 'AI', + commands: [ + { + title: 'Insights', + description: 'Generate insights from past activities', + searchTerms: ['insights', 'meetings', 'reports', 'summary', 'summaries'], + icon: InsightsIcon, + action: (editor: Editor) => { + const {to} = editor.state.selection + const size = editor.state.doc.content.size + let command = editor + .chain() + .focus() + .setInsights() + .setTextSelection(to + 1) + if (size - to <= 1) { + // if we're at the end of the doc, add an extra paragraph to make it easier to click below + command = command.insertContent('

').setTextSelection(to + 1) + } + return command.scrollIntoView().run() + } + } + ] + }, { group: 'Media', commands: [ diff --git a/yarn.lock b/yarn.lock index 1d1104f57fc..69e798dc994 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5722,6 +5722,11 @@ resolved "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.1.0.tgz#42ef83b3b56dccad5d703ae8c42919a68798bbe2" integrity sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA== +"@radix-ui/primitive@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.1.1.tgz#fc169732d755c7fbad33ba8d0cd7fd10c90dc8e3" + integrity sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA== + "@radix-ui/react-alert-dialog@1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.2.tgz#ac3bb7f71f5cbb595d3d0949bb12b598c2a99981" @@ -5751,6 +5756,20 @@ "@radix-ui/react-use-callback-ref" "1.1.0" "@radix-ui/react-use-layout-effect" "1.1.0" +"@radix-ui/react-checkbox@^1.1.4": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@radix-ui/react-checkbox/-/react-checkbox-1.1.4.tgz#d7f5cb0a82ca6bb4eb717b74e9b2b0cc73ecf7a0" + integrity sha512-wP0CPAHq+P5I4INKe3hJrIa1WoNqqrejzW+zoU0rOvo1b9gDEJJFl2rYfO1PYJUQCc2H1WZxIJmyv9BS8i5fLw== + dependencies: + "@radix-ui/primitive" "1.1.1" + "@radix-ui/react-compose-refs" "1.1.1" + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-presence" "1.1.2" + "@radix-ui/react-primitive" "2.0.2" + "@radix-ui/react-use-controllable-state" "1.1.0" + "@radix-ui/react-use-previous" "1.1.0" + "@radix-ui/react-use-size" "1.1.0" + "@radix-ui/react-collapsible@^1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@radix-ui/react-collapsible/-/react-collapsible-1.1.1.tgz#1382cc9ec48f8b473c14f3779d317f0cdf6da5e9" @@ -5780,6 +5799,11 @@ resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz#656432461fc8283d7b591dcf0d79152fae9ecc74" integrity sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw== +"@radix-ui/react-compose-refs@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz#6f766faa975f8738269ebb8a23bad4f5a8d2faec" + integrity sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw== + "@radix-ui/react-context@1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@radix-ui/react-context/-/react-context-1.1.0.tgz#6df8d983546cfd1999c8512f3a8ad85a6e7fcee8" @@ -5937,6 +5961,14 @@ "@radix-ui/react-compose-refs" "1.1.0" "@radix-ui/react-use-layout-effect" "1.1.0" +"@radix-ui/react-presence@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-presence/-/react-presence-1.1.2.tgz#bb764ed8a9118b7ec4512da5ece306ded8703cdc" + integrity sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg== + dependencies: + "@radix-ui/react-compose-refs" "1.1.1" + "@radix-ui/react-use-layout-effect" "1.1.0" + "@radix-ui/react-primitive@2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz#fe05715faa9203a223ccc0be15dc44b9f9822884" @@ -5944,6 +5976,13 @@ dependencies: "@radix-ui/react-slot" "1.1.0" +"@radix-ui/react-primitive@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-2.0.2.tgz#ac8b7854d87b0d7af388d058268d9a7eb64ca8ef" + integrity sha512-Ec/0d38EIuvDF+GZjcMU/Ze6MxntVJYO/fRlCPhCaVUyPY9WTalHJw54tp9sXeJo3tlShWpy41vQRgLRGOuz+w== + dependencies: + "@radix-ui/react-slot" "1.1.2" + "@radix-ui/react-radio-group@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@radix-ui/react-radio-group/-/react-radio-group-1.2.1.tgz#42b914c85f3a77be3ab766b6e49a9598680f76d1" @@ -6024,6 +6063,13 @@ dependencies: "@radix-ui/react-compose-refs" "1.1.0" +"@radix-ui/react-slot@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.1.2.tgz#daffff7b2bfe99ade63b5168407680b93c00e1c6" + integrity sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ== + dependencies: + "@radix-ui/react-compose-refs" "1.1.1" + "@radix-ui/react-tooltip@^1.0.6", "@radix-ui/react-tooltip@^1.1.3": version "1.1.4" resolved "https://registry.yarnpkg.com/@radix-ui/react-tooltip/-/react-tooltip-1.1.4.tgz#152d8485859b80d395d6b3229f676fef3cec56b3"