diff --git a/packages/web/package.json b/packages/web/package.json index a915a665..b0b11716 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -27,6 +27,7 @@ "mini-css-extract-plugin": "^2.3.0", "normalizr": "^3.6.1", "react": "^18.1.0", + "react-cmdk": "^1.3.9", "react-datepicker": "^4.2.1", "react-dnd": "^16.0.1", "react-dnd-html5-backend": "^16.0.1", diff --git a/packages/web/src/assets/svg/index.ts b/packages/web/src/assets/svg/index.ts index c5f37ce5..1f8f58e5 100644 --- a/packages/web/src/assets/svg/index.ts +++ b/packages/web/src/assets/svg/index.ts @@ -3,6 +3,7 @@ export { default as ArrowLeftIcon } from "./arrowLeft.svg"; export { default as CheckIcon } from "./check.svg"; export { default as MonthCalendarIcon } from "./monthCalendar.svg"; export { default as HamburgerMenuIcon } from "./hamburgerMenu.svg"; +export { default as MetaKeyIcon } from "./metaKey.svg"; export { default as SidebarCollapseIcon } from "./sidebarCollapse.svg"; export { default as SidebarOpenIcon } from "./sidebarOpen.svg"; export { default as TrashIcon } from "./trash.svg"; diff --git a/packages/web/src/assets/svg/metaKey.svg b/packages/web/src/assets/svg/metaKey.svg new file mode 100644 index 00000000..e6145fb1 --- /dev/null +++ b/packages/web/src/assets/svg/metaKey.svg @@ -0,0 +1,6 @@ + + +mac-command + + \ No newline at end of file diff --git a/packages/web/src/components/Icons/MetaKeyIcon.tsx b/packages/web/src/components/Icons/MetaKeyIcon.tsx new file mode 100644 index 00000000..a81f04cb --- /dev/null +++ b/packages/web/src/components/Icons/MetaKeyIcon.tsx @@ -0,0 +1,30 @@ +import React from "react"; +import { getColor } from "@core/util/color.utils"; +import { ColorNames } from "@core/types/color.types"; +import { useAppDispatch, useAppSelector } from "@web/store/store.hooks"; +import { settingsSlice } from "@web/ducks/settings/slices/settings.slice"; +import { selectIsCmdPaletteOpen } from "@web/ducks/settings/selectors/settings.selectors"; + +import { StyledMetaKeyIcon } from "../Svg"; +import { TooltipWrapper } from "../Tooltip/TooltipWrapper"; + +export const MetaKeyIcon = () => { + const dispatch = useAppDispatch(); + + const isCmdPaletteOpen = useAppSelector(selectIsCmdPaletteOpen); + + return ( + { + if (isCmdPaletteOpen) { + dispatch(settingsSlice.actions.closeCmdPalette()); + } else { + dispatch(settingsSlice.actions.openCmdPalette()); + } + }} + > + + + ); +}; diff --git a/packages/web/src/components/Svg/Svg.tsx b/packages/web/src/components/Svg/Svg.tsx index 2b71eba4..5e99ae37 100644 --- a/packages/web/src/components/Svg/Svg.tsx +++ b/packages/web/src/components/Svg/Svg.tsx @@ -1,6 +1,7 @@ import styled, { css } from "styled-components"; import { HamburgerMenuIcon, + MetaKeyIcon, MonthCalendarIcon, TrashIcon, } from "@web/assets/svg"; @@ -27,6 +28,10 @@ export const StyledHamburgerMenuIcon = styled(HamburgerMenuIcon)` ${(props: SvgStylesProps) => svgStyles(props)} `; +export const StyledMetaKeyIcon = styled(MetaKeyIcon)` + ${(props: SvgStylesProps) => svgStyles(props)} +`; + export const StyledMonthCalendarIcon = styled(MonthCalendarIcon)` ${(props: SvgStylesProps) => svgStyles(props)} `; diff --git a/packages/web/src/components/Svg/index.ts b/packages/web/src/components/Svg/index.ts index f2266a39..1b266512 100644 --- a/packages/web/src/components/Svg/index.ts +++ b/packages/web/src/components/Svg/index.ts @@ -1,7 +1,13 @@ import { StyledHamburgerMenuIcon, + StyledMetaKeyIcon, StyledMonthCalendarIcon, StyledTrashIcon, } from "./Svg"; -export { StyledHamburgerMenuIcon, StyledMonthCalendarIcon, StyledTrashIcon }; +export { + StyledHamburgerMenuIcon, + StyledMetaKeyIcon, + StyledMonthCalendarIcon, + StyledTrashIcon, +}; diff --git a/packages/web/src/ducks/settings/selectors/settings.selectors.ts b/packages/web/src/ducks/settings/selectors/settings.selectors.ts index d3b22883..4a4a7f12 100644 --- a/packages/web/src/ducks/settings/selectors/settings.selectors.ts +++ b/packages/web/src/ducks/settings/selectors/settings.selectors.ts @@ -2,5 +2,8 @@ import { RootState } from "@web/store"; export const selectDatesInView = (state: RootState) => state.settings.dates; +export const selectIsCmdPaletteOpen = (state: RootState) => + state.settings.isCmdPaletteOpen; + export const selectIsRightSidebarOpen = (state: RootState) => state.settings.isRightSidebarOpen; diff --git a/packages/web/src/ducks/settings/slices/settings.slice.ts b/packages/web/src/ducks/settings/slices/settings.slice.ts index c92e816d..4f6e3764 100644 --- a/packages/web/src/ducks/settings/slices/settings.slice.ts +++ b/packages/web/src/ducks/settings/slices/settings.slice.ts @@ -7,6 +7,7 @@ interface State_Settings { start: string; end: string; }; + isCmdPaletteOpen: boolean; isRightSidebarOpen: boolean; } @@ -15,6 +16,7 @@ const initialState: State_Settings = { start: dayjs().format(), end: dayjs().endOf("week").format(), }, + isCmdPaletteOpen: false, isRightSidebarOpen: false, }; @@ -29,6 +31,15 @@ export const settingsSlice = createSlice({ name: "settings", initialState, reducers: { + closeCmdPalette: (state) => { + state.isCmdPaletteOpen = false; + }, + openCmdPalette: (state) => { + state.isCmdPaletteOpen = true; + }, + toggleCmdPalette: (state) => { + state.isCmdPaletteOpen = !state.isCmdPaletteOpen; + }, toggleRightSidebar: (state) => { state.isRightSidebarOpen = !state.isRightSidebarOpen; }, diff --git a/packages/web/src/views/Calendar/Calendar.tsx b/packages/web/src/views/Calendar/Calendar.tsx index 3f0b4862..b749f462 100644 --- a/packages/web/src/views/Calendar/Calendar.tsx +++ b/packages/web/src/views/Calendar/Calendar.tsx @@ -17,6 +17,7 @@ import { LeftSidebar } from "./components/LeftSidebar"; import { RightSidebar } from "./components/RightSidebar"; import { Draft } from "./components/Event/Draft"; import { Dedication } from "./components/Dedication"; +import { CmdPalette } from "../CmdPalette"; export const CalendarView = () => { const prefs = usePreferences(); @@ -31,15 +32,22 @@ export const CalendarView = () => { const dateCalcs = useDateCalcs(measurements, gridRefs.gridScrollRef); - useShortcuts( + const isCurrentWeek = weekProps.component.isCurrentWeek; + const startOfSelectedWeek = weekProps.component.startOfView; + const util = weekProps.util; + const toggleSidebar = prefs.toggleSidebar; + + const shortcutProps = { today, dateCalcs, - weekProps.component.isCurrentWeek, - weekProps.component.startOfView, - weekProps.util, + isCurrentWeek, + startOfSelectedWeek, + util, scrollUtil, - prefs.toggleSidebar - ); + toggleSidebar, + }; + + useShortcuts(shortcutProps); const rootProps: RootProps = { component: { today: today }, @@ -47,6 +55,7 @@ export const CalendarView = () => { return ( + { + const currentMinute = dayjs().minute(); + const nextMinuteInterval = roundToNext(currentMinute, GRID_TIME_STEP); + + const fullStart = isCurrentWeek ? dayjs() : startOfWeek.hour(dayjs().hour()); + const _start = fullStart.minute(nextMinuteInterval).second(0); + + const _end = _start.add(1, "hour"); + const startDate = _start.format(); + const endDate = _end.format(); + + return { startDate, endDate }; +}; export const getDraftContainer = (isAllDay: boolean) => { if (isAllDay) { diff --git a/packages/web/src/views/Calendar/components/LeftSidebar/LeftSidebar.tsx b/packages/web/src/views/Calendar/components/LeftSidebar/LeftSidebar.tsx index 607bde8e..683ff4fc 100644 --- a/packages/web/src/views/Calendar/components/LeftSidebar/LeftSidebar.tsx +++ b/packages/web/src/views/Calendar/components/LeftSidebar/LeftSidebar.tsx @@ -7,6 +7,7 @@ import { Measurements_Grid } from "@web/views/Calendar/hooks/grid/useGridLayout" import { Styled, getSidebarToggleIcon, StyledSidebarOverflow } from "./styled"; import { SomedaySection } from "./SomedaySection"; +import { SidebarIconRow } from "./SidebarIconRow"; interface Props { dateCalcs: DateCalcs; @@ -50,7 +51,7 @@ export const LeftSidebar: FC> = ( viewEnd={weekEnd} /> - {/* */} + ); }; diff --git a/packages/web/src/views/Calendar/components/LeftSidebar/SidebarIconRow/SidebarIconRow.tsx b/packages/web/src/views/Calendar/components/LeftSidebar/SidebarIconRow/SidebarIconRow.tsx index a877d2b8..c13371a9 100644 --- a/packages/web/src/views/Calendar/components/LeftSidebar/SidebarIconRow/SidebarIconRow.tsx +++ b/packages/web/src/views/Calendar/components/LeftSidebar/SidebarIconRow/SidebarIconRow.tsx @@ -1,17 +1,12 @@ -import React, { FC } from "react"; -import { MonthCalendarIcon } from "@web/components/Icons/MonthCalendarIcon"; -import { Preferences } from "@web/views/Calendar/hooks/usePreferences"; +import React from "react"; +import { MetaKeyIcon } from "@web/components/Icons/MetaKeyIcon"; import { StyledBottomRow } from "../styled"; -interface Props { - prefs: Preferences; -} - -export const SidebarIconRow: FC = ({ prefs }) => { +export const SidebarIconRow = () => { return ( - + ); }; diff --git a/packages/web/src/views/Calendar/components/LeftSidebar/SidebarIconRow/index.ts b/packages/web/src/views/Calendar/components/LeftSidebar/SidebarIconRow/index.ts index e69de29b..2a2fe805 100644 --- a/packages/web/src/views/Calendar/components/LeftSidebar/SidebarIconRow/index.ts +++ b/packages/web/src/views/Calendar/components/LeftSidebar/SidebarIconRow/index.ts @@ -0,0 +1 @@ +export * from "./SidebarIconRow"; diff --git a/packages/web/src/views/Calendar/hooks/shortcuts/useShortcuts.ts b/packages/web/src/views/Calendar/hooks/shortcuts/useShortcuts.ts index ad4c5a12..fab7c5af 100644 --- a/packages/web/src/views/Calendar/hooks/shortcuts/useShortcuts.ts +++ b/packages/web/src/views/Calendar/hooks/shortcuts/useShortcuts.ts @@ -1,16 +1,15 @@ import { useEffect } from "react"; import { useNavigate } from "react-router-dom"; import { Key } from "ts-keycode-enum"; -import dayjs, { Dayjs } from "dayjs"; +import { Dayjs } from "dayjs"; import { Categories_Event } from "@core/types/event.types"; import { SOMEDAY_MONTH_LIMIT_MSG, SOMEDAY_WEEK_LIMIT_MSG, } from "@core/constants/core.constants"; import { useAppDispatch, useAppSelector } from "@web/store/store.hooks"; -import { isDrafting, roundToNext } from "@web/common/utils"; +import { isDrafting } from "@web/common/utils"; import { draftSlice } from "@web/ducks/events/slices/draft.slice"; -import { GRID_TIME_STEP } from "@web/views/Calendar/layout.constants"; import { ROOT_ROUTES } from "@web/common/constants/routes"; import { selectIsAtMonthlyLimit, @@ -21,16 +20,27 @@ import { settingsSlice } from "@web/ducks/settings/slices/settings.slice"; import { DateCalcs } from "../grid/useDateCalcs"; import { Util_Scroll } from "../grid/useScroll"; import { WeekProps } from "../useWeek"; - -export const useShortcuts = ( - today: Dayjs, - dateCalcs: DateCalcs, - isCurrentWeek: boolean, - startOfSelectedWeek: Dayjs, - util: WeekProps["util"], - scrollUtil: Util_Scroll, - toggleSidebar: (target: "left" | "right") => void -) => { +import { getDraftTimes } from "../../components/Event/Draft/draft.util"; + +export interface ShortcutProps { + today: Dayjs; + dateCalcs: DateCalcs; + isCurrentWeek: boolean; + startOfSelectedWeek: Dayjs; + util: WeekProps["util"]; + scrollUtil: Util_Scroll; + toggleSidebar: (target: "left" | "right") => void; +} + +export const useShortcuts = ({ + today, + dateCalcs, + isCurrentWeek, + startOfSelectedWeek, + util, + scrollUtil, + toggleSidebar, +}: ShortcutProps) => { const dispatch = useAppDispatch(); const navigate = useNavigate(); @@ -38,14 +48,6 @@ export const useShortcuts = ( const isAtWeeklyLimit = useAppSelector(selectIsAtWeeklyLimit); useEffect(() => { - const _getStart = () => { - if (isCurrentWeek) { - return dayjs(); - } else { - return startOfSelectedWeek.hour(dayjs().hour()); - } - }; - const _createSomedayDraft = (type: "week" | "month") => { if (type === "week" && isAtWeeklyLimit) { alert(SOMEDAY_WEEK_LIMIT_MSG); @@ -69,13 +71,10 @@ export const useShortcuts = ( }; const _createTimedDraft = () => { - const currentMinute = dayjs().minute(); - const nextMinuteInterval = roundToNext(currentMinute, GRID_TIME_STEP); - - const _start = _getStart().minute(nextMinuteInterval).second(0); - const _end = _start.add(1, "hour"); - const startDate = _start.format(); - const endDate = _end.format(); + const { startDate, endDate } = getDraftTimes( + isCurrentWeek, + startOfSelectedWeek + ); dispatch( draftSlice.actions.start({ @@ -98,6 +97,12 @@ export const useShortcuts = ( const keyDownHandler = (e: KeyboardEvent) => { if (isDrafting()) return; + const isCmdPaletteOpen = + document.getElementById("headlessui-portal-root") !== null; + if (isCmdPaletteOpen) return; + + if (e.metaKey) return; + const handlersByKey = { [Key.OpenBracket]: () => toggleSidebar("left"), [Key.ClosedBracket]: () => diff --git a/packages/web/src/views/CmdPalette/CmdPalette.tsx b/packages/web/src/views/CmdPalette/CmdPalette.tsx new file mode 100644 index 00000000..58abf68d --- /dev/null +++ b/packages/web/src/views/CmdPalette/CmdPalette.tsx @@ -0,0 +1,217 @@ +import "react-cmdk/dist/cmdk.css"; +import React, { FC, useEffect, useState } from "react"; +import CommandPalette, { + filterItems, + getItemIndex, + useHandleOpenCommandPalette, +} from "react-cmdk"; +import { useNavigate } from "react-router-dom"; +import { Categories_Event } from "@core/types/event.types"; +import { + SOMEDAY_MONTH_LIMIT_MSG, + SOMEDAY_WEEK_LIMIT_MSG, +} from "@core/constants/core.constants"; +import { useAppDispatch, useAppSelector } from "@web/store/store.hooks"; +import { ROOT_ROUTES } from "@web/common/constants/routes"; +import { draftSlice } from "@web/ducks/events/slices/draft.slice"; +import { isDrafting } from "@web/common/utils"; +import { + selectIsAtMonthlyLimit, + selectIsAtWeeklyLimit, +} from "@web/ducks/events/selectors/someday.selectors"; +import { settingsSlice } from "@web/ducks/settings/slices/settings.slice"; +import { selectIsCmdPaletteOpen } from "@web/ducks/settings/selectors/settings.selectors"; + +import { getDraftTimes } from "../Calendar/components/Event/Draft/draft.util"; +import { ShortcutProps } from "../Calendar/hooks/shortcuts/useShortcuts"; + +const CmdPalette = ({ + today, + isCurrentWeek, + startOfSelectedWeek, + util, + scrollUtil, +}: ShortcutProps) => { + const dispatch = useAppDispatch(); + const navigate = useNavigate(); + + const isAtMonthlyLimit = useAppSelector(selectIsAtMonthlyLimit); + const isAtWeeklyLimit = useAppSelector(selectIsAtWeeklyLimit); + const _open = useAppSelector(selectIsCmdPaletteOpen); + + const [open, setOpen] = useState(false); + const [page] = useState<"root" | "projects">("root"); + const [search, setSearch] = useState(""); + + useEffect(() => { + setOpen(_open); + }, [_open]); + + useHandleOpenCommandPalette(setOpen); + + const _createSomedayDraft = (type: "week" | "month") => { + if (type === "week" && isAtWeeklyLimit) { + alert(SOMEDAY_WEEK_LIMIT_MSG); + return; + } + if (type === "month" && isAtMonthlyLimit) { + alert(SOMEDAY_MONTH_LIMIT_MSG); + return; + } + + const eventType = + type === "week" + ? Categories_Event.SOMEDAY_WEEK + : Categories_Event.SOMEDAY_MONTH; + + dispatch( + draftSlice.actions.start({ + eventType, + }) + ); + }; + + const _createTimedDraft = () => { + const { startDate, endDate } = getDraftTimes( + isCurrentWeek, + startOfSelectedWeek + ); + + dispatch( + draftSlice.actions.start({ + activity: "createShortcut", + eventType: Categories_Event.TIMED, + event: { + startDate, + endDate, + }, + }) + ); + }; + + const _discardDraft = () => { + if (isDrafting()) { + dispatch(draftSlice.actions.discard()); + } + }; + + const filteredItems = filterItems( + [ + { + heading: "Common Tasks", + id: "general", + items: [ + { + id: "create-event", + children: "Create Event [c]", + icon: "PlusIcon", + onClick: () => _createTimedDraft(), + }, + { + id: "create-someday-week-event", + children: "Create Week Event [w]", + icon: "PlusIcon", + onClick: () => _createSomedayDraft("week"), + }, + { + id: "create-someday-month-event", + children: "Create Month Event [m]", + icon: "PlusIcon", + onClick: () => _createSomedayDraft("month"), + }, + { + id: "today", + children: `Go to Today (${today.format("dddd, MMMM D")}) [t]`, + icon: "ArrowUturnDownIcon", + onClick: () => { + scrollUtil.scrollToNow(); + _discardDraft(); + util.goToToday(); + }, + }, + { + id: "report-bug", + children: "Report Bug", + icon: "BugAntIcon", + href: "https://github.com/SwitchbackTech/compass/issues/new?assignees=&labels=bug&projects=&template=2-Bug_report.md&title=", + target: "_blank", + }, + { + id: "log-out", + children: "Log Out [z]", + icon: "ArrowRightOnRectangleIcon", + onClick: () => navigate(ROOT_ROUTES.LOGOUT), + }, + { + id: "share-feedback", + children: "Share Feedback", + icon: "EnvelopeOpenIcon", + href: "mailto:tyler@switchback.tech", + target: "_blank", + }, + ], + }, + { + heading: "More", + id: "advanced", + items: [ + { + id: "code", + children: "Code", + icon: "CodeBracketIcon", + href: "https://github.com/SwitchbackTech/compass", + }, + { + id: "terms", + children: "Terms", + icon: "DocumentTextIcon", + href: "https://www.compasscalendar.com/terms", + target: "_blank", + }, + { + id: "privacy-policy", + children: "Privacy Policy", + icon: "LockClosedIcon", + href: "https://www.compasscalendar.com/privacy", + target: "_blank", + }, + ], + }, + ], + search + ); + + return ( + { + dispatch(settingsSlice.actions.closeCmdPalette()); + setOpen(!open); + }} + search={search} + isOpen={open} + page={page} + placeholder="Try: 'create', 'bug', or 'view code'" + > + + {filteredItems.length ? ( + filteredItems.map((list) => ( + + {list.items.map(({ id, ...rest }) => ( + + ))} + + )) + ) : ( + + )} + + + ); +}; + +export default CmdPalette; diff --git a/packages/web/src/views/CmdPalette/index.ts b/packages/web/src/views/CmdPalette/index.ts new file mode 100644 index 00000000..09c240e4 --- /dev/null +++ b/packages/web/src/views/CmdPalette/index.ts @@ -0,0 +1,3 @@ +import CmdPalette from "./CmdPalette"; + +export { CmdPalette }; diff --git a/packages/web/src/views/CmdPalette/styled.ts b/packages/web/src/views/CmdPalette/styled.ts new file mode 100644 index 00000000..d0448f14 --- /dev/null +++ b/packages/web/src/views/CmdPalette/styled.ts @@ -0,0 +1,12 @@ +import styled from "styled-components"; +import { ColorNames } from "@core/types/color.types"; +import { getColor } from "@core/util/color.utils"; +import { Flex } from "@web/components/Flex"; + +export const StyledKeyTip = styled(Flex)` + border: 2px solid ${getColor(ColorNames.GREY_2)}; + border-radius: 3px; + font-size: 11px; + margin-left: 20px; + padding: 3px 8px; +`; diff --git a/yarn.lock b/yarn.lock index c8c7c240..0ef5afe5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1364,6 +1364,14 @@ resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.1.tgz#16308cea045f0fc777b6ff20a9f25474dd8293d2" integrity sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q== +"@headlessui/react@^1.6.4": + version "1.7.18" + resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-1.7.18.tgz#30af4634d2215b2ca1aa29d07f33d02bea82d9d7" + integrity sha512-4i5DOrzwN4qSgNsL4Si61VMkUcWbcSKueUV7sFhpHzQcSShdlHENE5+QBntMSRvHt8NyoFO2AGG8si9lq+w4zQ== + dependencies: + "@tanstack/react-virtual" "^3.0.0-beta.60" + client-only "^0.0.1" + "@hello-pangea/dnd@^16.2.0": version "16.5.0" resolved "https://registry.yarnpkg.com/@hello-pangea/dnd/-/dnd-16.5.0.tgz#f323ff9f813204818bc67648a383e8715f47c59c" @@ -1377,6 +1385,11 @@ redux "^4.2.1" use-memo-one "^1.1.3" +"@heroicons/react@^2.0.13": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@heroicons/react/-/react-2.1.3.tgz#78a2a7f504a7370283d07eabcddc7fec04f503db" + integrity sha512-fEcPfo4oN345SoqdlCDdSa4ivjaKbk0jTd+oubcgNxnNgAfzysfwWfQUr+51wigiWHQQRiZNd1Ao0M5Y3M2EGg== + "@humanwhocodes/config-array@^0.11.13": version "0.11.14" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" @@ -1933,6 +1946,18 @@ "@svgr/plugin-jsx" "^6.5.1" "@svgr/plugin-svgo" "^6.5.1" +"@tanstack/react-virtual@^3.0.0-beta.60": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@tanstack/react-virtual/-/react-virtual-3.2.0.tgz#fb70f9c6baee753a5a0f7618ac886205d5a02af9" + integrity sha512-OEdMByf2hEfDa6XDbGlZN8qO6bTjlNKqjM3im9JG+u3mCL8jALy0T/67oDI001raUUPh1Bdmfn4ZvPOV5knpcg== + dependencies: + "@tanstack/virtual-core" "3.2.0" + +"@tanstack/virtual-core@3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@tanstack/virtual-core/-/virtual-core-3.2.0.tgz#874d36135e4badce2719e7bdc556ce240cbaff14" + integrity sha512-P5XgYoAw/vfW65byBbJQCw+cagdXDT/qH6wmABiLt4v4YBT2q2vqCOhihe+D1Nt325F/S/0Tkv6C5z0Lv+VBQQ== + "@testing-library/dom@^8.11.1": version "8.20.1" resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.20.1.tgz#2e52a32e46fc88369eef7eef634ac2a192decd9f" @@ -3812,6 +3837,11 @@ cli-width@^3.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== +client-only@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" + integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== + cliui@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" @@ -5993,7 +6023,7 @@ html-minifier-terser@^6.0.2: relateurl "^0.2.7" terser "^5.10.0" -html-webpack-plugin@^5.3.2: +html-webpack-plugin@^5.3.2, html-webpack-plugin@^5.5.0: version "5.6.0" resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz#50a8fa6709245608cb00e811eacecb8e0d7b7ea0" integrity sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw== @@ -8816,6 +8846,15 @@ raw-body@2.5.1: iconv-lite "0.4.24" unpipe "1.0.0" +react-cmdk@^1.3.9: + version "1.3.9" + resolved "https://registry.yarnpkg.com/react-cmdk/-/react-cmdk-1.3.9.tgz#77123f5120a47e35a517a8176550e96731667654" + integrity sha512-MSVmAQZ9iqY7hO3r++XP6yWSHzGfMDGMvY3qlDT8k5RiWoRFwO1CGPlsWzhvcUbPilErzsMKK7uB4McEcX4B6g== + dependencies: + "@headlessui/react" "^1.6.4" + "@heroicons/react" "^2.0.13" + html-webpack-plugin "^5.5.0" + react-datepicker@^4.2.1: version "4.25.0" resolved "https://registry.yarnpkg.com/react-datepicker/-/react-datepicker-4.25.0.tgz#86b3ee8ac764bad1650046d0cf9280837bf6d845"