@edu-tosel/design 1.0.155 → 1.0.157

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/README.md +42 -42
  2. package/asset/SVG.tsx +29 -29
  3. package/asset/html/gomito-promotion.html +116 -116
  4. package/asset/html/speaking-series-promotion.html +58 -58
  5. package/asset/sizes.ts +202 -202
  6. package/asset/svg/Close.tsx +32 -32
  7. package/asset/svg/Direction.tsx +76 -76
  8. package/asset/svg/Email.tsx +20 -20
  9. package/asset/svg/Eye.tsx +48 -48
  10. package/asset/svg/Icon.tsx +195 -195
  11. package/asset/svg/Image.tsx +24 -24
  12. package/asset/svg/Notification.tsx +34 -34
  13. package/asset/svg/Operation.tsx +130 -130
  14. package/asset/svg/Phone.tsx +20 -20
  15. package/asset/svg/Profile.tsx +27 -27
  16. package/asset/svg/Symbol.tsx +60 -60
  17. package/asset/svg/TOSEL.tsx +63 -63
  18. package/card/design/Card.design.js +4 -2
  19. package/card/design/RollCard.design.js +1 -1
  20. package/card/template/InfoCard/Finance.js +1 -1
  21. package/card/template/InfoCard/Student.d.ts +2 -2
  22. package/card/template/InfoCard/Student.js +4 -11
  23. package/card/template/NavCard.js +1 -1
  24. package/card/template/ProgressCard/Large.js +1 -1
  25. package/globals.css +269 -269
  26. package/interface/Property.d.ts +1 -1
  27. package/layout/design/Row.design/index.js +1 -0
  28. package/layout/index.d.ts +1 -0
  29. package/layout/index.js +1 -0
  30. package/layout/template/Event/One.js +39 -1
  31. package/layout/template/MonthlyProgressReport/Report.d.ts +36 -0
  32. package/layout/template/MonthlyProgressReport/Report.js +80 -0
  33. package/layout/template/MonthlyProgressReport/index.d.ts +5 -0
  34. package/layout/template/MonthlyProgressReport/index.js +5 -0
  35. package/layout/template/home/layout/Footer.js +1 -1
  36. package/layout/template/home/layout/Navigation.js +1 -1
  37. package/package.json +2 -1
  38. package/tailwind.config.ts +675 -672
  39. package/version.txt +1 -1
@@ -1,10 +1,48 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { cn, isHTMLString } from "../../../util";
3
3
  import { StatusText } from "./StatusText";
4
+ import { useState, useEffect } from "react";
4
5
  export default function One({ event }) {
6
+ const [currentTime, setCurrentTime] = useState(new Date());
7
+ useEffect(() => {
8
+ const timer = setInterval(() => setCurrentTime(new Date()), 1000);
9
+ return () => clearInterval(timer);
10
+ }, []);
5
11
  const button = () => ({
6
12
  sizes: "w-full h-12 flex items-center justify-center rounded-md text-white cursor-pointer font-bold gap-3 text-sm xs:text-md",
7
13
  backgrounds: "bg-gradient-to-l from-[#760023] to-[#105652]",
8
14
  });
9
- return (_jsxs("div", { className: "flex flex-col mmd:flex-row", children: [_jsx("div", { className: "min-w-[320px] h-auto p-5 mmd:sticky mmd:top-20 mmd:self-start", children: _jsxs("div", { className: "w-full h-auto rounded-xl sm:flex mmd:flex-col", children: [_jsx("div", { className: "w-full mmd:h-50 overflow-hidden", children: _jsx("img", { src: event.thumbnail, alt: "", className: "rounded-xl h-full object-cover w-full" }) }), _jsxs("div", { className: "w-full h-auto pt-5 sm:p-5 mmd:p-0 mmd:pt-5 gap-3 flex flex-col", children: [_jsx("div", { className: "flex items-center", children: _jsx(StatusText, { event: event }) }), _jsx("div", { className: "text-sm font-bold text-gray-dark flex items-center mb-2", children: event.title }), event.button && (_jsx("div", { onClick: event.button.onClick, className: cn(button()), children: event.button?.title }))] })] }, event.id) }), _jsxs("div", { className: "flex-grow p-5", children: [_jsx("div", { children: isHTMLString(event.content) ? (_jsx("div", { dangerouslySetInnerHTML: { __html: event.content }, className: "w-full rounded-xl object-cover overflow-hidden" })) : (_jsx("div", { children: event.content })) }), _jsx("button", { onClick: () => history.back(), className: "p-5 bg-green-dark/5 text-green-dark rounded-xl flex items-center justify-center hover:bg-green-dark/20 transition-all", children: "\uBAA9\uB85D\uC73C\uB85C \uB3CC\uC544\uAC00\uAE30" })] })] }));
15
+ // 현재는 startedAt과 expiredAt 모두 시각은 09:00:00 으로 설정되어 있습니다.
16
+ const startedAt = event.startedAt ? new Date(event.startedAt) : null;
17
+ const expiredAt = event.expiredAt ? new Date(event.expiredAt) : null;
18
+ let buttonContent = null;
19
+ if (startedAt && expiredAt) {
20
+ const timeDiff = startedAt.getTime() - currentTime.getTime();
21
+ const daysRemaining = Math.floor(timeDiff / (1000 * 60 * 60 * 24));
22
+ const hoursRemaining = Math.floor((timeDiff / (1000 * 60 * 60)) % 24);
23
+ const minutesRemaining = Math.floor((timeDiff / (1000 * 60)) % 60);
24
+ const secondsRemaining = Math.floor((timeDiff / 1000) % 60);
25
+ if (startedAt < currentTime && currentTime < expiredAt) {
26
+ buttonContent = (_jsx("div", { onClick: event.button?.onClick, className: cn(button()), children: event.button?.title }));
27
+ }
28
+ else if (currentTime < startedAt) {
29
+ const countdownText = daysRemaining > 0
30
+ ? `오픈까지 D-${daysRemaining}`
31
+ : `오픈까지 ${hoursRemaining
32
+ .toString()
33
+ .padStart(2, "0")}:${minutesRemaining
34
+ .toString()
35
+ .padStart(2, "0")}:${secondsRemaining
36
+ .toString()
37
+ .padStart(2, "0")} 남음`;
38
+ buttonContent = (_jsx("div", { className: "w-full h-12 flex items-center justify-center rounded-md bg-gray-light text-green-dark font-bold gap-3 text-sm xs:text-md", children: countdownText }));
39
+ }
40
+ else if (expiredAt < currentTime) {
41
+ buttonContent = (_jsx("div", { className: "w-full h-12 flex items-center justify-center rounded-md bg-gray-light text-gray-medium font-bold gap-3 text-sm xs:text-md", children: "\uC774\uBCA4\uD2B8\uAC00 \uB9C8\uAC10\uB418\uC5C8\uC5B4\uC694" }));
42
+ }
43
+ }
44
+ else {
45
+ buttonContent = _jsx("div", { className: cn(button()), children: event.button?.title });
46
+ }
47
+ return (_jsxs("div", { className: "flex flex-col mmd:flex-row", children: [_jsx("div", { className: "min-w-[320px] h-auto p-5 mmd:sticky mmd:top-20 mmd:self-start", children: _jsxs("div", { className: "w-full h-auto rounded-xl sm:flex mmd:flex-col", children: [_jsx("div", { className: "w-full mmd:h-50 overflow-hidden", children: _jsx("img", { src: event.thumbnail, alt: "", className: "rounded-xl h-full object-cover w-full" }) }), _jsxs("div", { className: "w-full h-auto pt-5 sm:p-5 mmd:p-0 mmd:pt-5 gap-3 flex flex-col", children: [_jsx("div", { className: "flex items-center", children: _jsx(StatusText, { event: event }) }), _jsx("div", { className: "text-sm font-bold text-gray-dark flex items-center mb-2", children: event.title }), buttonContent] })] }, event.id) }), _jsxs("div", { className: "flex-grow p-5", children: [_jsx("div", { children: isHTMLString(event.content) ? (_jsx("div", { dangerouslySetInnerHTML: { __html: event.content }, className: "w-full rounded-xl object-cover overflow-hidden max-w-[810px]" })) : (_jsx("div", { children: event.content })) }), _jsx("button", { onClick: () => history.back(), className: "mt-8 p-5 bg-green-dark/5 text-green-dark rounded-xl flex items-center justify-center hover:bg-green-dark/20 transition-all", children: "\uBAA9\uB85D\uC73C\uB85C \uB3CC\uC544\uAC00\uAE30" })] })] }));
10
48
  }
@@ -0,0 +1,36 @@
1
+ export interface Result {
2
+ createdTimeStamp: number;
3
+ updatedTimeStamp: number;
4
+ academyId: number;
5
+ etc: null;
6
+ report: {
7
+ section1Part1: number;
8
+ section1Part2: number;
9
+ section1Part3: number;
10
+ section1Part4: null;
11
+ section2Part1: number;
12
+ section2Part2: number;
13
+ section2Part3: number;
14
+ section2Part4: null;
15
+ };
16
+ id: number;
17
+ setId: number;
18
+ level: string;
19
+ answers: number[];
20
+ userId: number;
21
+ }
22
+ interface ProgressReportProps {
23
+ studentInfo: {
24
+ name: string;
25
+ birthday: string;
26
+ belong?: string;
27
+ academy?: string;
28
+ };
29
+ results: Result[];
30
+ recentResult: Result & {
31
+ examName: string;
32
+ };
33
+ comment: string | string[];
34
+ }
35
+ export default function ProgressReport({ studentInfo, recentResult, comment, }: ProgressReportProps): import("react/jsx-runtime").JSX.Element;
36
+ export {};
@@ -0,0 +1,80 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { InfoCard } from "../../../card";
3
+ import CardDesign from "../../../card/design/Card.design";
4
+ import { LineBreaks } from "../../../text";
5
+ import { cn } from "../../../util";
6
+ import { ResponsiveContainer, XAxis, YAxis, LineChart, Line, Legend, } from "recharts";
7
+ import moment from "moment-timezone";
8
+ export default function ProgressReport({ studentInfo, recentResult, comment, }) {
9
+ const container = {
10
+ displays: "flex justify-between ",
11
+ sizes: "w-[297mm] h-[210mm]",
12
+ boundaries: "border-2 px-10 pt-7 pb-9 border-gray-medium",
13
+ fonts: "font-pretendard-var",
14
+ };
15
+ const leftBody = {
16
+ displays: "flex flex-col gap-y-7.5",
17
+ };
18
+ const rightBody = {
19
+ displays: "flex flex-col",
20
+ };
21
+ const calculate = (result, type) => {
22
+ const section1 = Object.values(result.report)
23
+ .slice(0, 4)
24
+ .filter((v) => v !== null)
25
+ .reduce((acc, cur) => Number(acc) + Number(cur), 0);
26
+ const section2 = Object.values(result.report)
27
+ .slice(4, 8)
28
+ .filter((v) => v !== null)
29
+ .reduce((acc, cur) => Number(acc) + Number(cur), 0);
30
+ const total = (section1 ?? 0) + (section2 ?? 0);
31
+ if (type === "section1")
32
+ return section1;
33
+ if (type === "section2")
34
+ return section2;
35
+ return total;
36
+ };
37
+ const circle = {
38
+ displays: "flex items-center justify-center",
39
+ sizes: "aspect-square ",
40
+ styles: "rounded-full border-gray-dark border-8",
41
+ fonts: "text-5xl font-bold text-blue-navy",
42
+ };
43
+ return (_jsxs("div", { className: cn(container), children: [_jsxs("div", { className: cn(leftBody), children: [_jsxs("div", { className: "flex flex-col text-blue-navy pl-4 border-l-4 border-blue-navy", children: [_jsx("div", { className: "flex items-center", children: _jsx("img", { src: "/images/logos/lab-spiral.png", alt: "lab" }) }), _jsx("div", { className: "text-2xl leading-tight font-bold", children: "MONTHLY PROGRESS REPORT" })] }), _jsxs("div", { className: "flex flex-col justify-between h-full", children: [_jsx(InfoCard.Student, { titles: {
44
+ title: studentInfo.name,
45
+ subtitle: studentInfo.birthday,
46
+ }, image: "/images/mock/haerin.jpeg", data: {
47
+ belong: studentInfo.belong,
48
+ academy: studentInfo.academy,
49
+ }, option: {
50
+ boundary: "border-2 border-blue-navy",
51
+ } }), _jsx("div", { className: "h-96", children: _jsxs(CardDesign, { option: {
52
+ height: "full",
53
+ boundary: "border-2 border-blue-navy pt-5 px-6 pb-6",
54
+ }, children: [_jsxs("div", { className: "flex flex-col justify-center border-b-3 border-blue-navy pb-2.5", children: [_jsx("div", { className: " text-lg font-bold", children: "\uCD5C\uADFC \uC2DC\uD5D8" }), _jsx("div", { children: recentResult.examName })] }), _jsxs("div", { className: "flex flex-col gap-y-7.5 absolute bottom-0 w-full px-3.5", children: [_jsxs("div", { className: "flex gap-x-12 justify-between w-full", children: [_jsxs("div", { className: "flex-1 ", children: [_jsx("div", { className: "text-center mb-3.5 text-lg", children: "SECTION I" }), _jsx("div", { className: cn(circle), children: calculate(recentResult, "section1") })] }), _jsxs("div", { className: "flex-1", children: [_jsx("div", { className: "text-center mb-3.5 text-lg", children: "SECTION II" }), _jsx("div", { className: cn(circle), children: calculate(recentResult, "section2") })] })] }), _jsxs("div", { className: "flex gap-x-2 justify-end items-end font-bold text-blue-navy", children: [_jsx("div", { className: "text-xl", children: "total" }), _jsx("div", { className: "text-5xl leading-none ", children: calculate(recentResult) })] })] })] }) })] })] }), _jsxs("div", { className: cn(rightBody), children: [_jsx("div", { className: "h-12 flex justify-end text-blue-navy font-bold", children: _jsx("div", { children: moment(new Date()).format("YYYY-MM-DD HH:mm:ss") }) }), _jsxs("div", { className: "flex flex-col justify-between h-full", children: [_jsx("div", { className: "h-88", children: _jsx(CardDesign, { option: {
55
+ width: "xl",
56
+ height: "full",
57
+ boundary: "border-2 border-blue-navy",
58
+ }, children: _jsx(ResponsiveContainer, { width: "95%", height: "95%", className: "absolute left-0 bottom-0", children: _jsxs(LineChart, { data: [
59
+ {
60
+ date: "2024-03-01",
61
+ score: 34,
62
+ },
63
+ {
64
+ date: "2024-03-02",
65
+ score: 45,
66
+ },
67
+ // {
68
+ // date: "2024-03-03",
69
+ // score: 47,
70
+ // },
71
+ // {
72
+ // date: "2024-03-04",
73
+ // score: 53,
74
+ // },
75
+ ], children: [_jsx(XAxis, { dataKey: "date" }), _jsx(YAxis, { dataKey: "score", scale: "log", domain: ["auto", "auto"] }), _jsx(Line, { type: "monotone", name: "Monthly Test", dataKey: "score", stroke: "#173A8B", fill: "#173A8B" }), _jsx(Legend, {})] }) }) }) }), _jsx("div", { className: "h-72", children: _jsxs(CardDesign, { option: {
76
+ width: "xl",
77
+ height: "full",
78
+ boundary: "border-2 border-blue-navy p-5",
79
+ }, children: [_jsx("div", { className: "text-gray-dark font-bold text-lg", children: "\uC6D0\uC7A5\uB2D8\uC758 \uCF54\uBA58\uD2B8" }), _jsx("div", { className: "h-52 overflow-y-scroll scrollbar-hidden text-sm mt-2.5", children: _jsx(LineBreaks, { texts: comment }) })] }) })] })] })] }));
80
+ }
@@ -0,0 +1,5 @@
1
+ import Report from "./Report";
2
+ declare const MonthlyProgressReport: {
3
+ Report: typeof Report;
4
+ };
5
+ export default MonthlyProgressReport;
@@ -0,0 +1,5 @@
1
+ import Report from "./Report";
2
+ const MonthlyProgressReport = {
3
+ Report,
4
+ };
5
+ export default MonthlyProgressReport;
@@ -40,7 +40,7 @@ export default function Footer() {
40
40
  const socialIconControl = {
41
41
  siezes: "h-6",
42
42
  };
43
- return (_jsx("div", { className: cn(container), children: _jsxs("div", { className: cn(body), children: [_jsxs("div", { className: cn(logoWrapper), children: [_jsx("img", { className: cn(svgController), src: "/images/logos/logo-tosel-main.svg", alt: "" }), _jsx("img", { className: cn(svgController), src: "/images/logos/logo-itc-main.svg", alt: "" })] }), _jsxs("div", { className: "flex flex-wrap justify-between items-center border-b-1 border-gray-dark pb-4 mt-5 font-medium gap-y-1", children: [_jsx("div", { children: "Copyright TOSEL. \u24D2 All Rights Reserved." }), _jsx("div", { className: "flex gap-5", children: buttons.map((button, index) => (_jsxs("div", { onClick: button.onClick, className: "cursor-default", children: [button.title, " "] }, index))) })] }), _jsxs("div", { className: cn(infoSet), children: [_jsx("div", { className: cn(infoTitle), children: "\uACE0\uAC1D\uBB38\uC758" }), _jsxs("div", { className: cn(info), children: ["\uB300\uD45C\uBC88\uD638 | 02-923-0505", _jsx("br", {}), " \uAC1C\uC778\uBB38\uC758 | tosel_cs@tosel.co.kr ", _jsx("br", {}), "\uB2E8\uCCB4\uBB38\uC758 | tosel_academy@tosel.co.kr"] })] }), _jsxs("div", { className: cn(infoSet), children: [_jsx("div", { className: cn(infoTitle), children: "\uAD6D\uC81C\uD1A0\uC140\uC704\uC6D0\uD68C" }), _jsxs("div", { className: cn(info), children: ["\uC6F9\uC11C\uBE44\uC2A4: \uC8FC\uC2DD\uD68C\uC0AC \uC5D0\uB4C0\uD1A0\uC140 | \uD1B5\uC2E0\uD310\uB9E4\uC5C5\uC2E0\uACE0\uBC88\uD638: \uC81C 2012-\uC11C\uC6B8\uC131\uBD81-0083\uD638", _jsx("br", {}), " \uC11C\uC6B8\uC2DC \uC131\uBD81\uAD6C \uC548\uC554\uB85C 145 \uACE0\uB824\uB300\uD559\uAD50 \uB77C\uC774\uC2DC\uC6C0 4\uCE35", _jsx("br", {}), " Lyceum Korea University, 145 Anam Ro, Seongbuk-Gu, Seoul, Korea 02841"] })] }), _jsxs("div", { className: cn(iconWrapper), children: [_jsx("a", { onClick: () => (location.href = "https://blog.naver.com/ebs1503"), children: _jsx("div", { className: cn(iconBox), children: _jsx("img", { className: cn(socialIconControl), src: "/images/logos/naver.svg", alt: "" }) }) }), _jsx("a", { onClick: () => (location.href = "https://www.instagram.com/tosel_official/"), children: _jsx("div", { className: cn(iconBox), children: _jsx("img", { className: cn(socialIconControl), src: "/images/logos/instagram.svg", alt: "" }) }) }), _jsx("a", { onClick: () => (location.href = "https://www.youtube.com/@tosel_official"), children: _jsx("div", { className: cn(iconBox), children: _jsx("img", { className: cn(socialIconControl), src: "/images/logos/youtube.svg", alt: "" }) }) })] })] }) }));
43
+ return (_jsx("div", { className: cn(container), children: _jsxs("div", { className: cn(body), children: [_jsxs("div", { className: cn(logoWrapper), children: [_jsx("img", { className: cn(svgController), src: "/images/logos/logo-tosel-main.svg", alt: "" }), _jsx("img", { className: cn(svgController), src: "/images/logos/logo-itc-main.svg", alt: "" })] }), _jsxs("div", { className: "flex flex-wrap justify-between items-center border-b-1 border-gray-dark pb-4 mt-5 font-medium gap-y-1", children: [_jsx("div", { children: "Copyright TOSEL. \u24D2 All Rights Reserved." }), _jsx("div", { className: "flex gap-5", children: buttons.map((button, index) => (_jsxs("div", { onClick: button.onClick, className: "cursor-default", children: [button.title, " "] }, index))) })] }), _jsxs("div", { className: cn(infoSet), children: [_jsx("div", { className: cn(infoTitle), children: "\uACE0\uAC1D\uBB38\uC758" }), _jsxs("div", { className: cn(info), children: ["\uB300\uD45C\uBC88\uD638 | 02-923-0505", _jsx("br", {}), " \uAC1C\uC778\uBB38\uC758 | tosel_cs@tosel.co.kr ", _jsx("br", {}), "\uB2E8\uCCB4\uBB38\uC758 | tosel_academy@tosel.co.kr"] })] }), _jsxs("div", { className: cn(infoSet), children: [_jsx("div", { className: cn(infoTitle), children: "\uAD6D\uC81C\uD1A0\uC140\uC704\uC6D0\uD68C" }), _jsxs("div", { className: cn(info), children: ["\uC0AC\uC5C5\uC790 \uB4F1\uB85D\uBC88\uD638 : 209-81-55585 | \uB300\uD45C : \uC624\uC2B9\uC5F0 ", _jsx("br", {}), "\uC6F9\uC11C\uBE44\uC2A4: \uC8FC\uC2DD\uD68C\uC0AC \uC5D0\uB4C0\uD1A0\uC140 | \uD1B5\uC2E0\uD310\uB9E4\uC5C5\uC2E0\uACE0\uBC88\uD638: \uC81C 2012-\uC11C\uC6B8\uC131\uBD81-0083\uD638", _jsx("br", {}), " \uC11C\uC6B8\uC2DC \uC131\uBD81\uAD6C \uC548\uC554\uB85C 145 \uACE0\uB824\uB300\uD559\uAD50 \uB77C\uC774\uC2DC\uC6C0 4\uCE35", _jsx("br", {}), " Lyceum Korea University, 145 Anam Ro, Seongbuk-Gu, Seoul, Korea 02841"] })] }), _jsxs("div", { className: cn(iconWrapper), children: [_jsx("a", { onClick: () => (location.href = "https://blog.naver.com/ebs1503"), children: _jsx("div", { className: cn(iconBox), children: _jsx("img", { className: cn(socialIconControl), src: "/images/logos/naver.svg", alt: "" }) }) }), _jsx("a", { onClick: () => (location.href = "https://www.instagram.com/tosel_official/"), children: _jsx("div", { className: cn(iconBox), children: _jsx("img", { className: cn(socialIconControl), src: "/images/logos/instagram.svg", alt: "" }) }) }), _jsx("a", { onClick: () => (location.href = "https://www.youtube.com/@tosel_official"), children: _jsx("div", { className: cn(iconBox), children: _jsx("img", { className: cn(socialIconControl), src: "/images/logos/youtube.svg", alt: "" }) }) })] })] }) }));
44
44
  }
45
45
  const buttons = [
46
46
  // {
@@ -98,7 +98,7 @@ function NavigationItem({ type, calendar, notice, event, }) {
98
98
  };
99
99
  if (type === "calendar")
100
100
  return (_jsx("div", { className: cn(container), children: calendar.schedules.map(({ applyDay, onClick }) => {
101
- const { isBefore, dDay } = compareDates(applyDay);
101
+ const { isBefore, } = compareDates(applyDay);
102
102
  return (_jsx("div", { onClick: onClick, className: cn(item, "w-[400px] md:w-full h-[184px] shadow-main rounded-[10px] p-7.5"), children: _jsxs("div", { children: [_jsx("div", { className: "text-[16px] font-bold text-gray-dark", children: convertDateToString(applyDay) }), _jsx("div", { children: isBefore && _jsx("p", { children: "\uC811\uC218\uC911" }) })] }) }));
103
103
  }) }));
104
104
  if (type === "notification")
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@edu-tosel/design",
3
- "version": "1.0.155",
3
+ "version": "1.0.157",
4
4
  "description": "UI components for International TOSEL Committee",
5
5
  "keywords": [
6
6
  "jsx",
@@ -20,6 +20,7 @@
20
20
  "date-fns-tz": "^2.0.1",
21
21
  "dayjs": "^1.11.12",
22
22
  "gsap": "^3.12.5",
23
+ "moment-timezone": "^0.5.45",
23
24
  "react": "^18.2.0",
24
25
  "react-beautiful-dnd": "^13.1.1",
25
26
  "react-datepicker": "^6.4.0",