From 5f91182ddf807167c114ad8233b031949266ba9a Mon Sep 17 00:00:00 2001 From: yoosangwook Date: Mon, 2 Sep 2024 18:13:45 +0900 Subject: [PATCH] chore: Update SCSS import in layout.js --- .env | 1 + package.json | 8 +- src/app/RecoilWrapper.js | 7 + src/app/colorpicker/page.jsx | 17 ++ src/app/datepicker/page.jsx | 32 +++ src/app/grid/page.jsx | 26 +++ src/app/layout.js | 9 +- src/app/modal/page.jsx | 42 ++++ src/components/colorpicker/ColorPicker.jsx | 13 ++ src/components/datepicker/RangeDatePicker.jsx | 19 ++ .../datepicker/SingleDatePicker.jsx | 8 + src/components/grid/QGrid.jsx | 88 ++++++++ src/components/modal/QModal.jsx | 20 ++ src/hooks/useAxios.js | 70 ++++++ src/store/modalAtom.js | 15 ++ yarn.lock | 210 +++++++++++++++++- 16 files changed, 581 insertions(+), 4 deletions(-) create mode 100644 .env create mode 100644 src/app/RecoilWrapper.js create mode 100644 src/app/colorpicker/page.jsx create mode 100644 src/app/datepicker/page.jsx create mode 100644 src/app/grid/page.jsx create mode 100644 src/app/modal/page.jsx create mode 100644 src/components/colorpicker/ColorPicker.jsx create mode 100644 src/components/datepicker/RangeDatePicker.jsx create mode 100644 src/components/datepicker/SingleDatePicker.jsx create mode 100644 src/components/grid/QGrid.jsx create mode 100644 src/components/modal/QModal.jsx create mode 100644 src/hooks/useAxios.js create mode 100644 src/store/modalAtom.js diff --git a/.env b/.env new file mode 100644 index 0000000..0d10143 --- /dev/null +++ b/.env @@ -0,0 +1 @@ +NEXT_PUBLIC_API_SERVER_PATH="http://1.248.227.176:38080" \ No newline at end of file diff --git a/package.json b/package.json index 4fdaa9a..07cbd17 100644 --- a/package.json +++ b/package.json @@ -9,9 +9,15 @@ "lint": "next lint" }, "dependencies": { + "ag-grid-react": "^32.1.0", + "axios": "^1.7.7", "next": "14.2.7", "react": "^18", - "react-dom": "^18" + "react-colorful": "^5.6.1", + "react-datepicker": "^7.3.0", + "react-dom": "^18", + "react-responsive-modal": "^6.4.2", + "recoil": "^0.7.7" }, "devDependencies": { "postcss": "^8", diff --git a/src/app/RecoilWrapper.js b/src/app/RecoilWrapper.js new file mode 100644 index 0000000..2f773bb --- /dev/null +++ b/src/app/RecoilWrapper.js @@ -0,0 +1,7 @@ +'use client' + +import { RecoilRoot } from 'recoil' + +export default function RecoilRootWrapper({ children }) { + return {children} +} diff --git a/src/app/colorpicker/page.jsx b/src/app/colorpicker/page.jsx new file mode 100644 index 0000000..45cc9dc --- /dev/null +++ b/src/app/colorpicker/page.jsx @@ -0,0 +1,17 @@ +'use client' + +import { useState } from 'react' +import ColorPicker from '@/components/colorpicker/ColorPicker' + +export default function ColorpickerPage() { + const [color, setColor] = useState('#ff0000') + + return ( + <> +
+ +
+
{color}
+ + ) +} diff --git a/src/app/datepicker/page.jsx b/src/app/datepicker/page.jsx new file mode 100644 index 0000000..e7a76f5 --- /dev/null +++ b/src/app/datepicker/page.jsx @@ -0,0 +1,32 @@ +'use client' + +import RangeDatePicker from '@/components/datepicker/RangeDatePicker' +import SingleDatePicker from '@/components/datepicker/SingleDatePicker' +import { useState } from 'react' + +export default function DatepickerPage() { + const [startDate, setStartDate] = useState(new Date()) + const singleDatePickerProps = { + startDate, + setStartDate, + } + + const [dateRange, setDateRange] = useState([null, null]) + const [startRangeDate, endRangeDate] = dateRange + const rangeDatePickerProps = { + startRangeDate, + endRangeDate, + setDateRange, + } + + return ( + <> +
+ +
+
+ +
+ + ) +} diff --git a/src/app/grid/page.jsx b/src/app/grid/page.jsx new file mode 100644 index 0000000..514efcb --- /dev/null +++ b/src/app/grid/page.jsx @@ -0,0 +1,26 @@ +'use client' + +import { useEffect, useState } from 'react' +import { useAxios } from '@/hooks/useAxios' +import QGrid from '@/components/grid/QGrid' + +export default function GridPage() { + const { get } = useAxios() + + const [gridProps, setGridProps] = useState({ + gridData: [], + isPageable: false, + }) + + useEffect(() => { + async function fetchData() { + // const response = await fetch('https://www.ag-grid.com/example-assets/space-mission-data.json') + // const data = await response.json() + const data = await get({ url: 'https://www.ag-grid.com/example-assets/space-mission-data.json' }) + setGridProps({ ...gridProps, gridData: data }) + } + fetchData() + }, []) + + return +} diff --git a/src/app/layout.js b/src/app/layout.js index 86e968b..e4745fe 100644 --- a/src/app/layout.js +++ b/src/app/layout.js @@ -1,3 +1,5 @@ +import RecoilRootWrapper from './RecoilWrapper' +import QModal from '@/components/modal/QModal' import '@/styles/style.scss' export const metadata = { @@ -8,7 +10,12 @@ export const metadata = { export default function RootLayout({ children }) { return ( - {children} + + + {children} + + + ) } diff --git a/src/app/modal/page.jsx b/src/app/modal/page.jsx new file mode 100644 index 0000000..9b2a97f --- /dev/null +++ b/src/app/modal/page.jsx @@ -0,0 +1,42 @@ +'use client' + +import { useRecoilState } from 'recoil' +import { modalContent, modalState } from '@/store/modalAtom' + +export default function ModalPage() { + const [open, setOpen] = useRecoilState(modalState) + const [contents, setContent] = useRecoilState(modalContent) + + const ipsum = ( + <> +

title

+

+ 저작자·발명가·과학기술자와 예술가의 권리는 법률로써 보호한다. 이 헌법은 1988년 2월 25일부터 시행한다. 다만, 이 헌법을 시행하기 위하여 필요한 + 법률의 제정·개정과 이 헌법에 의한 대통령 및 국회의원의 선거 기타 이 헌법시행에 관한 준비는 이 헌법시행 전에 할 수 있다. +

+

+ 국가는 주택개발정책등을 통하여 모든 국민이 쾌적한 주거생활을 할 수 있도록 노력하여야 한다. 통신·방송의 시설기준과 신문의 기능을 보장하기 + 위하여 필요한 사항은 법률로 정한다. +

+

+ 국회에서 의결된 법률안은 정부에 이송되어 15일 이내에 대통령이 공포한다. 선거에 관한 경비는 법률이 정하는 경우를 제외하고는 정당 또는 + 후보자에게 부담시킬 수 없다. +

+ + ) + + return ( + <> +
+ +
+ + ) +} diff --git a/src/components/colorpicker/ColorPicker.jsx b/src/components/colorpicker/ColorPicker.jsx new file mode 100644 index 0000000..fc78d8c --- /dev/null +++ b/src/components/colorpicker/ColorPicker.jsx @@ -0,0 +1,13 @@ +import { HexColorPicker } from 'react-colorful' + +export default function ColorPicker(props) { + const { color, setColor } = props + + return ( + <> +
+ +
+ + ) +} diff --git a/src/components/datepicker/RangeDatePicker.jsx b/src/components/datepicker/RangeDatePicker.jsx new file mode 100644 index 0000000..ad802f4 --- /dev/null +++ b/src/components/datepicker/RangeDatePicker.jsx @@ -0,0 +1,19 @@ +import DatePicker from 'react-datepicker' +import 'react-datepicker/dist/react-datepicker.css' + +export default function RangeDatePicker(props) { + const { startRangeDate, endRangeDate, setDateRange } = props + + return ( + { + setDateRange(update) + }} + isClearable={true} + /> + ) +} diff --git a/src/components/datepicker/SingleDatePicker.jsx b/src/components/datepicker/SingleDatePicker.jsx new file mode 100644 index 0000000..ca5feba --- /dev/null +++ b/src/components/datepicker/SingleDatePicker.jsx @@ -0,0 +1,8 @@ +import DatePicker from 'react-datepicker' +import 'react-datepicker/dist/react-datepicker.css' + +export default function SingleDatePicker(props) { + const { startDate, setStartDate } = props + + return setStartDate(date)} /> +} diff --git a/src/components/grid/QGrid.jsx b/src/components/grid/QGrid.jsx new file mode 100644 index 0000000..99c3fd6 --- /dev/null +++ b/src/components/grid/QGrid.jsx @@ -0,0 +1,88 @@ +'use client' + +import { useCallback, useEffect, useMemo, useState } from 'react' +import { AgGridReact } from 'ag-grid-react' + +import 'ag-grid-community/styles/ag-grid.css' +import 'ag-grid-community/styles/ag-theme-quartz.css' + +export default function QGrid(props) { + const { gridData, gridColumns, isPageable = true } = props + const [count, setCount] = useState(0) + const [clickedCount, setClickedCount] = useState(0) + /** + * 행 데이터를 설정할 때 useState을 사용하여 렌더링 전반에 걸쳐 일관된 배열 참조를 유지하는 것이 좋습니다 + */ + const [rowData, setRowData] = useState(null) + + /** + * Column Definitions를 설정할 때는 useMemo 또는 useState를 사용하여 렌더 간에 일관된 참조를 유지하십시오. + * 응용 프로그램이 Column Definitions를 동적으로 변경하는 경우에도 렌더링 간에 일관된 참조를 유지하려면 useMemo 또는 useState를 사용하십시오. + */ + const [colDefs, setColDefs] = useState( + gridColumns ?? [ + { field: 'mission', filter: true }, + { field: 'company' }, + { field: 'location' }, + { field: 'date' }, + { field: 'price', valueFormatter: (params) => `₩ ${params.value.toLocaleString()}` }, + { field: 'successful' }, + { field: 'rocket' }, + ], + ) + + /** + * defaultColDef 속성을 제공할 때 이 인라인 또는 구성 요소의 단순 개체로 정의하지 마십시오. 이렇게 하면 모든 렌더링에서 새 인스턴스가 생성됩니다. + * 대신 or useState 를 사용하여 useMemo 렌더 간에 일관된 참조가 유지되도록 합니다. + */ + const defaultColDef = useMemo(() => { + filter: true + }, []) + + /** + * 단순 유형(string, boolean 및 number)의 속성은 렌더링 간에 값으로 비교되므로 후크를 사용할 필요가 없습니다. + */ + const rowBuffer = 0 + + /** + * 모든 렌더링에서 그리드 상태를 재설정하지 않도록 useCallback을 사용하는 것이 좋습니다. + */ + const isRowSelectable = useCallback((node) => node.data.value > count, [count]) + + /** + * Event Listeners의 경우 이벤트 처리기가 그리드 내에서 업데이트를 트리거하지 않으므로 useCallback을 사용할 필요가 없습니다. + * 그러나 콜백과 일관성을 유지하고 항상 useCallback을 사용하는 것이 더 쉬울 수 있습니다. + */ + const onFilterOpened = useCallback(() => { + console.log(`number of clicks is ${clickedCount}`) + }, [clickedCount]) + + // Fetch data & update rowData state + useEffect(() => { + // async function fetchData() { + // const response = await fetch('https://www.ag-grid.com/example-assets/space-mission-data.json') + // const data = await response.json() + // setRowData(data) + // } + + console.log('use effect') + gridData ? setRowData(gridData) : '' + }, [gridData]) + + return ( +
+ +
+ ) +} diff --git a/src/components/modal/QModal.jsx b/src/components/modal/QModal.jsx new file mode 100644 index 0000000..1cf0191 --- /dev/null +++ b/src/components/modal/QModal.jsx @@ -0,0 +1,20 @@ +'use client' + +import { useRecoilState, useRecoilValue } from 'recoil' + +import { Modal } from 'react-responsive-modal' + +import { modalContent, modalState } from '@/store/modalAtom' + +import 'react-responsive-modal/styles.css' + +export default function QModal() { + const [open, setOpen] = useRecoilState(modalState) + const children = useRecoilValue(modalContent) + + return ( + setOpen(false)} center> + {children} + + ) +} diff --git a/src/hooks/useAxios.js b/src/hooks/useAxios.js new file mode 100644 index 0000000..898b78e --- /dev/null +++ b/src/hooks/useAxios.js @@ -0,0 +1,70 @@ +import axios from 'axios' + +const AxiosType = { + INTERNAL: 'Internal', + EXTERNAL: 'External', +} + +export function useAxios() { + const getInstances = (url) => { + let type = AxiosType.INTERNAL + url.startsWith('http') ? (type = AxiosType.EXTERNAL) : '' + + return axios.create({ + baseURL: type === AxiosType.INTERNAL ? process.env.NEXT_PUBLIC_API_SERVER_PATH : '', + headers: { + Accept: 'application/json', + }, + }) + } + + axios.interceptors.request.use((config) => { + // config['Authorization'] = localStorage.getItem('token') + //TODO: 인터셉터에서 추가 로직 구현 + return config + }) + + axios.interceptors.request.use(undefined, (error) => { + //TODO: 인터셉터에서 에러 처리 로직 구현 + // if (error.isAxiosError && e.response?.status === 401) { + // localStorage.removeItem('token') + // } + }) + + const get = async ({ url }) => { + return await getInstances(url) + .get(url) + .then((res) => res.data) + .catch(console.error) + } + + const post = async ({ url, data }) => { + return await getInstances(url) + .post(url, data) + .then((res) => res.data) + .catch(console.error) + } + + const put = async ({ url, data }) => { + return await getInstances(url) + .put(url, data) + .then((res) => res.data) + .catch(console.error) + } + + const patch = async ({ url, data }) => { + return await getInstances(url) + .patch(url, data) + .then((res) => res.data) + .catch(console.error) + } + + const del = async ({ url }) => { + return await getInstances(url) + .delete(url) + .then((res) => res.data) + .catch(console.error) + } + + return { get, post, put, patch, del } +} diff --git a/src/store/modalAtom.js b/src/store/modalAtom.js new file mode 100644 index 0000000..a9a708a --- /dev/null +++ b/src/store/modalAtom.js @@ -0,0 +1,15 @@ +import { atom } from 'recoil' + +export const modalState = atom({ + key: 'modalState', + default: false, +}) + +export const modalContent = atom({ + key: 'modalContent', + default: ( + <> +
test
+ + ), +}) diff --git a/yarn.lock b/yarn.lock index c12c138..90960ab 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,6 +7,54 @@ resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== +"@bedrock-layout/use-forwarded-ref@^1.3.1": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@bedrock-layout/use-forwarded-ref/-/use-forwarded-ref-1.6.1.tgz#e0d25c35af41ccaa36df809a7de8d5ccd9c70d1e" + integrity sha512-GD9A9AFLzFNjr7k6fgerSqxfwDWl+wsPS11PErOKe1zkVz0y7RGC9gzlOiX/JrgpyB3NFHWIuGtoOQqifJQQpw== + dependencies: + "@bedrock-layout/use-stateful-ref" "^1.4.1" + +"@bedrock-layout/use-stateful-ref@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@bedrock-layout/use-stateful-ref/-/use-stateful-ref-1.4.1.tgz#c543c61d15885e19506f068618a4d6427a5bf817" + integrity sha512-4eKO2KdQEXcR5LI4QcxqlJykJUDQJWDeWYAukIn6sRQYoabcfI5kDl61PUi6FR6o8VFgQ8IEP7HleKqWlSe8SQ== + +"@floating-ui/core@^1.6.0": + version "1.6.7" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.7.tgz#7602367795a390ff0662efd1c7ae8ca74e75fb12" + integrity sha512-yDzVT/Lm101nQ5TCVeK65LtdN7Tj4Qpr9RTXJ2vPFLqtLxwOrpoxAHAJI8J3yYWUc40J0BDBheaitK5SJmno2g== + dependencies: + "@floating-ui/utils" "^0.2.7" + +"@floating-ui/dom@^1.0.0": + version "1.6.10" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.10.tgz#b74c32f34a50336c86dcf1f1c845cf3a39e26d6f" + integrity sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A== + dependencies: + "@floating-ui/core" "^1.6.0" + "@floating-ui/utils" "^0.2.7" + +"@floating-ui/react-dom@^2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.1.1.tgz#cca58b6b04fc92b4c39288252e285e0422291fb0" + integrity sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg== + dependencies: + "@floating-ui/dom" "^1.0.0" + +"@floating-ui/react@^0.26.2": + version "0.26.23" + resolved "https://registry.yarnpkg.com/@floating-ui/react/-/react-0.26.23.tgz#28985e5ce482c34f347f28076f11267e47a933bd" + integrity sha512-9u3i62fV0CFF3nIegiWiRDwOs7OW/KhSUJDNx2MkQM3LbE5zQOY01sL3nelcVBXvX7Ovvo3A49I8ql+20Wg/Hw== + dependencies: + "@floating-ui/react-dom" "^2.1.1" + "@floating-ui/utils" "^0.2.7" + tabbable "^6.0.0" + +"@floating-ui/utils@^0.2.7": + version "0.2.7" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.7.tgz#d0ece53ce99ab5a8e37ebdfe5e32452a2bfc073e" + integrity sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA== + "@isaacs/cliui@^8.0.2": version "8.0.2" resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" @@ -140,6 +188,26 @@ "@swc/counter" "^0.1.3" tslib "^2.4.0" +ag-charts-types@10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/ag-charts-types/-/ag-charts-types-10.1.0.tgz#f265665f6b92742bb0bc2dcfab319b21e6d78749" + integrity sha512-pk9ft8hbgTXJ/thI/SEUR1BoauNplYExpcHh7tMOqVikoDsta1O15TB1ZL4XWnl4TPIzROBmONKsz7d8a2HBuQ== + +ag-grid-community@32.1.0: + version "32.1.0" + resolved "https://registry.yarnpkg.com/ag-grid-community/-/ag-grid-community-32.1.0.tgz#69d5b0af1b4d5cd5262705ecd87a3bd16c9c4155" + integrity sha512-RVvkjRH61nuCXwIqTKQPqNbKR+8cGBKw7S1qmmMXsy0pCBAJaQn4kL3v31hKHxDtV4bPscBXLFKGnKzHuss0GQ== + dependencies: + ag-charts-types "10.1.0" + +ag-grid-react@^32.1.0: + version "32.1.0" + resolved "https://registry.yarnpkg.com/ag-grid-react/-/ag-grid-react-32.1.0.tgz#539620927a187961911b99439917df58076ad8bb" + integrity sha512-GDbtvU3aicSajWXWxvQio5ZaPqJDx2jzgRBKQf1RF1IVzL+XATDmLFNuMND0+wJ/VW/xUjBFjiq9W1fjXg/DCA== + dependencies: + ag-grid-community "32.1.0" + prop-types "^15.8.1" + ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" @@ -180,6 +248,20 @@ arg@^5.0.2: resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +axios@^1.7.7: + version "1.7.7" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.7.tgz#2f554296f9892a72ac8d8e4c5b79c14a91d0a47f" + integrity sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -190,6 +272,11 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== +body-scroll-lock@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/body-scroll-lock/-/body-scroll-lock-3.1.5.tgz#c1392d9217ed2c3e237fee1e910f6cdd80b7aaec" + integrity sha512-Yi1Xaml0EvNA0OYWxXiYNqY24AfWkbA6w5vxE7GWxtKfzIbZM+Qw+aSmkgsbWzbHiy/RCSkUZBplVxTA+E4jJg== + brace-expansion@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" @@ -236,11 +323,21 @@ caniuse-lite@^1.0.30001579: optionalDependencies: fsevents "~2.3.2" +classnames@^2.3.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" + integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== + 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== +clsx@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" + integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== + color-convert@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" @@ -253,6 +350,13 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + commander@^4.0.0: version "4.1.1" resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" @@ -272,6 +376,16 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== +date-fns@^3.3.1: + version "3.6.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-3.6.0.tgz#f20ca4fe94f8b754951b24240676e8618c0206bf" + integrity sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww== + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + didyoumean@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" @@ -322,6 +436,11 @@ fill-range@^7.1.1: dependencies: to-regex-range "^5.0.1" +follow-redirects@^1.15.6: + version "1.15.6" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" + integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== + foreground-child@^3.1.0: version "3.3.0" resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" @@ -330,6 +449,15 @@ foreground-child@^3.1.0: cross-spawn "^7.0.0" signal-exit "^4.0.1" +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + fsevents@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" @@ -371,6 +499,11 @@ graceful-fs@^4.2.11: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== +hamt_plus@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/hamt_plus/-/hamt_plus-1.0.2.tgz#e21c252968c7e33b20f6a1b094cd85787a265601" + integrity sha512-t2JXKaehnMb9paaYA7J0BX8QQAY8lwfQ9Gjf4pg/mk4krt+cmwmU652HOoWonf+7+EQV97ARPMhhVgU1ra2GhA== + hasown@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" @@ -458,7 +591,7 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -loose-envify@^1.1.0: +loose-envify@^1.1.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== @@ -483,6 +616,18 @@ micromatch@^4.0.4, micromatch@^4.0.5: braces "^3.0.3" picomatch "^2.3.1" +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + minimatch@^9.0.4: version "9.0.5" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" @@ -537,7 +682,7 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -object-assign@^4.0.1: +object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== @@ -652,11 +797,41 @@ postcss@^8, postcss@^8.4.23: picocolors "^1.0.1" source-map-js "^1.2.0" +prop-types@^15.7.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== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +react-colorful@^5.6.1: + version "5.6.1" + resolved "https://registry.yarnpkg.com/react-colorful/-/react-colorful-5.6.1.tgz#7dc2aed2d7c72fac89694e834d179e32f3da563b" + integrity sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw== + +react-datepicker@^7.3.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/react-datepicker/-/react-datepicker-7.3.0.tgz#666664a609d4b57b095083fe29d080943fa7b3ed" + integrity sha512-EqRKLAtLZUTztiq6a+tjSjQX9ES0Xd229JPckAtyZZ4GoY3rtvNWAzkYZnQUf6zTWT50Ki0+t+W9VRQIkSJLfg== + dependencies: + "@floating-ui/react" "^0.26.2" + clsx "^2.1.0" + date-fns "^3.3.1" + prop-types "^15.7.2" + react-onclickoutside "^6.13.0" + react-dom@^18: version "18.3.1" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" @@ -665,6 +840,25 @@ react-dom@^18: loose-envify "^1.1.0" scheduler "^0.23.2" +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-onclickoutside@^6.13.0: + version "6.13.1" + resolved "https://registry.yarnpkg.com/react-onclickoutside/-/react-onclickoutside-6.13.1.tgz#1f5e0241c08784b6e65745d91aca0d700c548a89" + integrity sha512-LdrrxK/Yh9zbBQdFbMTXPp3dTSN9B+9YJQucdDu3JNKRrbdU+H+/TVONJoWtOwy4II8Sqf1y/DTI6w/vGPYW0w== + +react-responsive-modal@^6.4.2: + version "6.4.2" + resolved "https://registry.yarnpkg.com/react-responsive-modal/-/react-responsive-modal-6.4.2.tgz#666b5c35b232cec617981006c9fe59414531a5a0" + integrity sha512-ARjGEKE5Gu5CSvyA8U9ARVbtK4SMAtdXsjtzwtxRlQIHC99RQTnOUctLpl7+/sp1Kg1OJZ6yqvp6ivd4TBueEw== + dependencies: + "@bedrock-layout/use-forwarded-ref" "^1.3.1" + body-scroll-lock "^3.1.5" + classnames "^2.3.1" + react@^18: version "18.3.1" resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" @@ -686,6 +880,13 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +recoil@^0.7.7: + version "0.7.7" + resolved "https://registry.yarnpkg.com/recoil/-/recoil-0.7.7.tgz#c5f2c843224384c9c09e4a62c060fb4c1454dc8e" + integrity sha512-8Og5KPQW9LwC577Vc7Ug2P0vQshkv1y3zG3tSSkWMqkWSwHmE+by06L8JtnGocjW6gcCvfwB3YtrJG6/tWivNQ== + dependencies: + hamt_plus "1.0.2" + resolve@^1.1.7, resolve@^1.22.2: version "1.22.8" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" @@ -823,6 +1024,11 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +tabbable@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" + integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== + tailwindcss@^3.4.1: version "3.4.10" resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.10.tgz#70442d9aeb78758d1f911af29af8255ecdb8ffef"