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 @@
+
+
\ 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"