diff --git a/frontend/package.json b/frontend/package.json index 95a1648f..0c4fbbe1 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -6,6 +6,9 @@ "dependencies": { "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.1", + "@fullcalendar/core": "^6.1.19", + "@fullcalendar/daygrid": "^6.1.19", + "@fullcalendar/react": "^6.1.19", "@mui/icons-material": "^7.3.1", "@mui/material": "^7.3.1", "@tanstack/react-query": "^5.85.5", @@ -20,10 +23,8 @@ "@types/react-dom": "^19.1.9", "@types/react-router-dom": "^5.3.3", "axios": "^1.11.0", - "date-fns": "^4.1.0", "loglevel": "^1.9.2", "react": "^19.1.1", - "react-big-calendar": "^1.19.4", "react-dom": "^19.1.1", "react-router-dom": "^7.8.2", "react-scripts": "^5.0.1", diff --git a/frontend/public/index.html b/frontend/public/index.html index aa069f27..08d6361d 100644 --- a/frontend/public/index.html +++ b/frontend/public/index.html @@ -24,7 +24,7 @@ work correctly both with client-side routing and a non-root public URL. Learn how to configure a non-root public URL by running `npm run build`. --> - React App + Coding Project diff --git a/frontend/src/components/CalendarView.css b/frontend/src/components/CalendarView.css new file mode 100644 index 00000000..93d9c066 --- /dev/null +++ b/frontend/src/components/CalendarView.css @@ -0,0 +1,102 @@ +/* Force transparency on all major calendar cell backgrounds so only CSS variables show */ +:root { + --fc-page-bg-color: #a0a0a0; + --fc-neutral-bg-color: #e3f2fd; + --fc-today-bg-color: #e3f2fd; + --fc-event-bg-color: #1976d2; + --fc-border-color: #707070; +} + +.calendarContainer { + padding: 2rem; + background: #f8fafc !important; + border-radius: 16px !important; + box-shadow: 0 4px 24px rgba(30, 64, 175, 0.08) !important; +} + +.fc { + font-family: "Inter", "Roboto", Arial, sans-serif !important; + /*background: transparent !important;*/ + /*border-radius: 12px !important;*/ + box-shadow: none !important; +} + +.fc .fc-toolbar { + background: #1976d2 !important; + color: #fff !important; + border-radius: 12px 12px 0 0 !important; + padding: 0.5rem 1rem !important; +} + +.fc .fc-toolbar-title { + font-size: 1.5rem !important; + font-weight: 600 !important; +} + +.fc .fc-button { + background: #1976d2 !important; + color: #fff !important; + border: none !important; + border-radius: 6px !important; + padding: 0.3rem 0.8rem !important; + margin: 0 0.2rem !important; + font-weight: 500 !important; + transition: background 0.2s !important; +} + +.fc .fc-button:hover, +.fc .fc-button:focus { + background: #1565c0 !important; +} + +.fc .fc-daygrid-day { + /* background: #fff !important;*/ + /*border-radius: 8px !important;*/ + box-shadow: 0 1px 4px rgba(30, 64, 175, 0.08) !important; + transition: box-shadow 0.2s !important; +} + +.fc .fc-daygrid-day:hover { + box-shadow: 0 4px 12px rgba(30, 64, 175, 0.16) !important; + background: #e3f2fd !important; +} + +.fc .fc-daygrid-day-number { + font-weight: 600 !important; + color: #1976d2 !important; +} + +.fc .fc-event { + background: #1976d2 !important; + color: #fff !important; + /*border-radius: 6px !important;*/ + padding: 2px 6px !important; + font-size: 0.95rem !important; + box-shadow: 0 2px 8px rgba(30, 64, 175, 0.12) !important; +} + +.fc .fc-event:hover { + background: #1565c0 !important; +} + +.fc .fc-day-today { + background: #e3f2fd !important; + border-radius: 8px !important; +} + +.fc .fc-daygrid-day .fc-daygrid-day-frame { + background: #c0c0c0 !important; + /*border-radius: 8px !important;*/ + box-shadow: 0 1px 4px rgba(30, 64, 175, 0.08) !important; + transition: box-shadow 0.2s !important; +} + +.fc .fc-daygrid-day:hover .fc-daygrid-day-frame { + background: #e3f2fd !important; + box-shadow: 0 4px 12px rgba(30, 64, 175, 0.16) !important; +} + +.fc, +.fc-toolbar.fc-header-toolbar { + margin-bottom: 0px !important; +} diff --git a/frontend/src/components/CalendarView.tsx b/frontend/src/components/CalendarView.tsx index f2d3c124..17678b89 100644 --- a/frontend/src/components/CalendarView.tsx +++ b/frontend/src/components/CalendarView.tsx @@ -1,150 +1,29 @@ import React from "react"; -/** - * CalendarView component - * - * Displays a detailed calendar using react-big-calendar. - * - * @component - * @example - * - */ -import Tooltip from "@mui/material/Tooltip"; -import Typography from "@mui/material/Typography"; -import { - Calendar, - dateFnsLocalizer, - Event, - SlotInfo, -} from "react-big-calendar"; -import { format } from "date-fns/format"; -import { parse } from "date-fns/parse"; -import { startOfWeek } from "date-fns/startOfWeek"; -import { getDay } from "date-fns/getDay"; -import { enUS } from "date-fns/locale/en-US"; -import "react-big-calendar/lib/css/react-big-calendar.css"; +import FullCalendar from "@fullcalendar/react"; +import dayGridPlugin from "@fullcalendar/daygrid"; -const locales = { - "en-US": enUS, -}; - -const localizer = dateFnsLocalizer({ - format, - parse, - startOfWeek: () => startOfWeek(new Date(), { weekStartsOn: 0 }), - getDay, - locales, -}); - -export interface CalendarEvent extends Event { - id: number | string; - title: string; - start: Date; - end: Date; - resource?: any; -} +import { EventInput } from "@fullcalendar/core"; +import "./CalendarView.css"; interface CalendarViewProps { - events: CalendarEvent[]; - onSelectSlot?: (slotInfo: SlotInfo) => void; - onSelectEvent?: (event: CalendarEvent) => void; - roomColors?: Record; + events: EventInput[]; } -/** - * Renders a calendar for room bookings. - * @param {CalendarViewProps} props - */ - -const CalendarView: React.FC = ({ - events, - onSelectSlot, - onSelectEvent, - roomColors, -}) => { - // Assign a color to each room if not provided - const defaultColors = [ - "#1976d2", - "#388e3c", - "#fbc02d", - "#d32f2f", - "#7b1fa2", - "#0288d1", - "#c2185b", - "#ffa000", - ]; - const colorMap = roomColors || {}; - // Fallback: assign colors by roomId order - events.forEach((ev, idx) => { - const roomId = ev.resource?.roomId; - if (roomId && !colorMap[roomId]) { - colorMap[roomId] = defaultColors[idx % defaultColors.length]; - } - }); - - // Style events by room color - const eventPropGetter = (event: CalendarEvent) => { - const roomId = event.resource?.roomId; - const bg = colorMap[roomId] || "#1976d2"; - return { - style: { - backgroundColor: bg, - color: "#fff", - borderRadius: 6, - border: `1px solid ${bg}`, - fontWeight: 600, - opacity: 0.95, - }, - }; - }; - - // Custom event wrapper for tooltips - const EventWithTooltip = ({ event }: { event: CalendarEvent }) => { - const room = event.resource?.roomName || event.resource?.roomId || "Room"; - const start = - event.start instanceof Date ? event.start : new Date(event.start); - const end = event.end instanceof Date ? event.end : new Date(event.end); - return ( - - - {event.title || "(No Title)"} - - Room: {room} - - Start: {start.toLocaleString()} - - End: {end.toLocaleString()} - - } - arrow - placement="top" - > -
{event.title}
-
- ); - }; - - return ( -
- -
- ); -}; +const CalendarView: React.FC = ({ events }) => ( +
+ +
+); export default CalendarView; diff --git a/frontend/src/pages/BookingPage.tsx b/frontend/src/pages/BookingPage.tsx index 34bc7d41..b5a18708 100644 --- a/frontend/src/pages/BookingPage.tsx +++ b/frontend/src/pages/BookingPage.tsx @@ -3,7 +3,8 @@ import { logger } from "../utils/logger"; // Booking page for conference room system // See README for requirements -import CalendarView, { CalendarEvent } from "../components/CalendarView"; +import CalendarView from "../components/CalendarView"; +import { EventInput } from "@fullcalendar/core"; import BookingForm from "../components/BookingForm"; import RoomDetailsModal from "../components/RoomDetailsModal"; import { useQuery } from "@tanstack/react-query"; @@ -137,7 +138,7 @@ const BookingPage: React.FC = () => { }, [rooms]); // Combine all bookings into calendar events - const events: CalendarEvent[] = useMemo(() => { + const events: EventInput[] = useMemo(() => { if (!bookingsByRoom || rooms.length === 0) return []; return Object.entries(bookingsByRoom).flatMap(([roomId, bookings]) => (bookings as any[]).map((booking) => ({ @@ -166,7 +167,7 @@ const BookingPage: React.FC = () => { setFormOpen(true); }; - const handleSelectEvent = (event: CalendarEvent) => { + const handleSelectEvent = (event: EventInput) => { logger.debug("[BookingPage] Event selected for edit", event); setEditBooking(event); setFormSlot(null); @@ -293,12 +294,7 @@ const BookingPage: React.FC = () => { onClose={() => setRoomModalOpen(false)} room={rooms.find((r: any) => r.id === selectedRoomId)} /> - + {formOpen && ( =16.9.11", "@types/react@^19.1.12": +"@types/react@*", "@types/react@^19.1.12": version "19.1.12" resolved "https://registry.yarnpkg.com/@types/react/-/react-19.1.12.tgz#7bfaa76aabbb0b4fe0493c21a3a7a93d33e8937b" integrity sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w== @@ -2752,11 +2762,6 @@ resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== -"@types/warning@^3.0.0": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/warning/-/warning-3.0.3.tgz#d1884c8cc4a426d1ac117ca2611bf333834c6798" - integrity sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q== - "@types/ws@^8.5.5": version "8.18.1" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.18.1.tgz#48464e4bf2ddfd17db13d845467f6070ffea4aa9" @@ -3978,11 +3983,6 @@ cliui@^8.0.1: strip-ansi "^6.0.1" wrap-ansi "^7.0.0" -clsx@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" - integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== - clsx@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" @@ -4460,21 +4460,6 @@ data-view-byte-offset@^1.0.1: es-errors "^1.3.0" is-data-view "^1.0.1" -date-arithmetic@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/date-arithmetic/-/date-arithmetic-4.1.0.tgz#e5d6434e9deb71f79760a37b729e4a515e730ddf" - integrity sha512-QWxYLR5P/6GStZcdem+V1xoto6DMadYWpMXU82ES3/RfR3Wdwr3D0+be7mgOJ+Ov0G9D5Dmb9T17sNLQYj9XOg== - -date-fns@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-4.1.0.tgz#64b3d83fff5aa80438f5b1a633c2e83b8a1c2d14" - integrity sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg== - -dayjs@^1.11.7: - version "1.11.15" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.15.tgz#fd7fd2db6fc92f08ffe4adc306756d45db00ada3" - integrity sha512-MC+DfnSWiM9APs7fpiurHGCoeIx0Gdl6QZBy+5lu8MbYKN5FZEXqOgrundfibdfhGZ15o9hzmZ2xJjZnbvgKXQ== - debug@2.6.9, debug@^2.6.0: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -4654,7 +4639,7 @@ dom-converter@^0.2.0: dependencies: utila "~0.4" -dom-helpers@^5.0.1, dom-helpers@^5.2.0, dom-helpers@^5.2.1: +dom-helpers@^5.0.1: version "5.2.1" resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== @@ -5794,11 +5779,6 @@ global-prefix@^3.0.0: kind-of "^6.0.2" which "^1.3.1" -globalize@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/globalize/-/globalize-0.1.1.tgz#4d04ba65a580a8b0bdcc9ed974aeb497b9c80a56" - integrity sha512-5e01v8eLGfuQSOvx2MsDMOWS0GFtCx1wPzQSmcHw4hkxFzrQDBO3Xwg/m8Hr/7qXMrHeOIE29qWVzyv06u1TZA== - globals@^13.19.0: version "13.24.0" resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" @@ -6191,13 +6171,6 @@ internal-slot@^1.1.0: hasown "^2.0.2" side-channel "^1.1.0" -invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" @@ -7708,11 +7681,6 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash-es@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" - integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== - lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" @@ -7748,7 +7716,7 @@ loglevel@^1.9.2: resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.9.2.tgz#c2e028d6c757720107df4e64508530db6621ba08" integrity sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg== -loose-envify@^1.0.0, loose-envify@^1.4.0: +loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -7774,11 +7742,6 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -luxon@^3.2.1: - version "3.7.1" - resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.7.1.tgz#9bd09aa84a56afb00c57ea78a8ec5bd16eb24ec0" - integrity sha512-RkRWjA926cTvz5rAb1BqyWkKbbjzCGchDUIKMCUvNi17j6f6j8uHGDV82Aqcqtzd+icoYpELmG3ksgGiFNNcNg== - lz-string@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" @@ -7844,11 +7807,6 @@ memfs@^3.1.2, memfs@^3.4.3: dependencies: fs-monkey "^1.0.4" -memoize-one@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045" - integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== - merge-descriptors@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" @@ -7960,18 +7918,6 @@ mkdirp@~0.5.1: dependencies: minimist "^1.2.6" -moment-timezone@^0.5.40: - version "0.5.48" - resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.48.tgz#111727bb274734a518ae154b5ca589283f058967" - integrity sha512-f22b8LV1gbTO2ms2j2z13MuPogNoh5UzxL3nzNAYKGraILnbGc9NEE6dyiiiLv46DGRb8A4kg8UKWLjPthxBHw== - dependencies: - moment "^2.29.4" - -moment@^2.29.4: - version "2.30.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae" - integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== - ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -9015,6 +8961,11 @@ postcss@^8.3.5, postcss@^8.4.33, postcss@^8.4.4, postcss@^8.4.47: picocolors "^1.1.1" source-map-js "^1.2.1" +preact@~10.12.1: + version "10.12.1" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.12.1.tgz#8f9cb5442f560e532729b7d23d42fd1161354a21" + integrity sha512-l8386ixSsBdbreOAkqtrwqHwdvR35ID8c3rKPa8lCWuO86dBi32QWHV4vfsZK1utLLFMvw+Z5Ad4XLkZzchscg== + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -9086,7 +9037,7 @@ prompts@^2.0.1, prompts@^2.4.2: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: +prop-types@^15.6.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -9195,28 +9146,6 @@ react-app-rewired@^2.2.1: dependencies: semver "^5.6.0" -react-big-calendar@^1.19.4: - version "1.19.4" - resolved "https://registry.yarnpkg.com/react-big-calendar/-/react-big-calendar-1.19.4.tgz#a1f00f4cb817a7e210a8137bbabf5726c032d2da" - integrity sha512-FrvbDx2LF6JAWFD96LU1jjloppC5OgIvMYUYIPzAw5Aq+ArYFPxAjLqXc4DyxfsQDN0TJTMuS/BIbcSB7Pg0YA== - dependencies: - "@babel/runtime" "^7.20.7" - clsx "^1.2.1" - date-arithmetic "^4.1.0" - dayjs "^1.11.7" - dom-helpers "^5.2.1" - globalize "^0.1.1" - invariant "^2.2.4" - lodash "^4.17.21" - lodash-es "^4.17.21" - luxon "^3.2.1" - memoize-one "^6.0.0" - moment "^2.29.4" - moment-timezone "^0.5.40" - prop-types "^15.8.1" - react-overlays "^5.2.1" - uncontrollable "^7.2.1" - react-dev-utils@^12.0.1: version "12.0.1" resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-12.0.1.tgz#ba92edb4a1f379bd46ccd6bcd4e7bc398df33e73" @@ -9279,25 +9208,6 @@ react-is@^19.1.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-19.1.1.tgz#038ebe313cf18e1fd1235d51c87360eb87f7c36a" integrity sha512-tr41fA15Vn8p4X9ntI+yCyeGSf1TlYaY5vlTZfQmeLBrFo3psOPX6HhTDnFNL9uj3EhP0KAQ80cugCl4b4BERA== -react-lifecycles-compat@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" - integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== - -react-overlays@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/react-overlays/-/react-overlays-5.2.1.tgz#49dc007321adb6784e1f212403f0fb37a74ab86b" - integrity sha512-GLLSOLWr21CqtJn8geSwQfoJufdt3mfdsnIiQswouuQ2MMPns+ihZklxvsTDKD3cR2tF8ELbi5xUsvqVhR6WvA== - dependencies: - "@babel/runtime" "^7.13.8" - "@popperjs/core" "^2.11.6" - "@restart/hooks" "^0.4.7" - "@types/warning" "^3.0.0" - dom-helpers "^5.2.0" - prop-types "^15.7.2" - uncontrollable "^7.2.1" - warning "^4.0.3" - react-refresh@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.11.0.tgz#77198b944733f0f1f1a90e791de4541f9f074046" @@ -10773,16 +10683,6 @@ unbox-primitive@^1.1.0: has-symbols "^1.1.0" which-boxed-primitive "^1.1.1" -uncontrollable@^7.2.1: - version "7.2.1" - resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-7.2.1.tgz#1fa70ba0c57a14d5f78905d533cf63916dc75738" - integrity sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ== - dependencies: - "@babel/runtime" "^7.6.3" - "@types/react" ">=16.9.11" - invariant "^2.2.4" - react-lifecycles-compat "^3.0.4" - underscore@1.12.1: version "1.12.1" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.12.1.tgz#7bb8cc9b3d397e201cf8553336d262544ead829e" @@ -10979,13 +10879,6 @@ walker@^1.0.7, walker@^1.0.8: dependencies: makeerror "1.0.12" -warning@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" - integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== - dependencies: - loose-envify "^1.0.0" - watchpack@^2.4.1: version "2.4.4" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.4.tgz#473bda72f0850453da6425081ea46fc0d7602947"