From 11373571e26abda9f66465793b55dd0e7891e371 Mon Sep 17 00:00:00 2001 From: chocoboy08 Date: Tue, 26 Dec 2023 14:09:39 +0900 Subject: [PATCH 01/11] perf: :zap: add forwardref to stack MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Stack 컴포넌트에 forwardRef를 추가했습니다 --- src/components/@base/Stack.tsx | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/components/@base/Stack.tsx b/src/components/@base/Stack.tsx index f569ba1..2eb320a 100644 --- a/src/components/@base/Stack.tsx +++ b/src/components/@base/Stack.tsx @@ -1,4 +1,4 @@ -import { CSSProperties, HTMLAttributes } from 'react'; +import { CSSProperties, HTMLAttributes, forwardRef, useRef } from 'react'; export interface StackProps extends HTMLAttributes { justify?: CSSProperties['justifyContent']; @@ -6,13 +6,18 @@ export interface StackProps extends HTMLAttributes { spacing?: CSSProperties['gap']; } -function Stack({ - children, - justify: justifyContent = 'center', - align: alignItems = 'stretch', - spacing: gap, - ...props -}: StackProps) { +export default forwardRef(function Stack( + { + children, + justify: justifyContent = 'center', + align: alignItems = 'stretch', + spacing: gap, + ...props + }: StackProps, + ref, +) { + const localRef = useRef(null); + const inputRef = ref || localRef; return (
{children}
); -} - -export default Stack; +}); From 96eae9082d03cd2d73a1fe7842865f1c3888d9ce Mon Sep 17 00:00:00 2001 From: chocoboy08 Date: Tue, 26 Dec 2023 15:16:48 +0900 Subject: [PATCH 02/11] style: :bento: add icons MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit complete edit, edit text, list 아이콘을 추가했습니다. --- src/assets/icon-complete-edit-text.svg | 5 +++++ src/assets/icon-edit-text.svg | 5 +++++ src/assets/icon-list.svg | 3 +++ 3 files changed, 13 insertions(+) create mode 100644 src/assets/icon-complete-edit-text.svg create mode 100644 src/assets/icon-edit-text.svg create mode 100644 src/assets/icon-list.svg diff --git a/src/assets/icon-complete-edit-text.svg b/src/assets/icon-complete-edit-text.svg new file mode 100644 index 0000000..ff202ee --- /dev/null +++ b/src/assets/icon-complete-edit-text.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icon-edit-text.svg b/src/assets/icon-edit-text.svg new file mode 100644 index 0000000..06297a6 --- /dev/null +++ b/src/assets/icon-edit-text.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icon-list.svg b/src/assets/icon-list.svg new file mode 100644 index 0000000..02fe10e --- /dev/null +++ b/src/assets/icon-list.svg @@ -0,0 +1,3 @@ + + + From 610044bb61536a0beb43e99e3d6297d85ea91af9 Mon Sep 17 00:00:00 2001 From: chocoboy08 Date: Tue, 26 Dec 2023 15:24:13 +0900 Subject: [PATCH 03/11] feat: :sparkles: add inventory component MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 인벤토리 기능을 추가했습니다. --- package.json | 3 + .../inventory/components/IngrInputBox.tsx | 288 +++++++++ src/pages/inventory/index.tsx | 235 ++++++++ src/pages/inventory/react_dates_overrides.css | 85 +++ vite.config.ts | 3 + yarn.lock | 566 +++++++++++++++++- 6 files changed, 1169 insertions(+), 11 deletions(-) create mode 100644 src/pages/inventory/components/IngrInputBox.tsx create mode 100644 src/pages/inventory/index.tsx create mode 100644 src/pages/inventory/react_dates_overrides.css diff --git a/package.json b/package.json index 4af63ef..fa4dd5d 100644 --- a/package.json +++ b/package.json @@ -17,11 +17,14 @@ }, "dependencies": { "@emotion/react": "^11.11.1", + "@types/react-dates": "^21.8.6", "@types/textarea-caret": "^3.0.3", "framer-motion": "^10.16.4", "hangul-js": "^0.2.6", "immer": "^10.0.3", + "moment": "^2.29.4", "react": "^18.2.0", + "react-dates": "^21.8.0", "react-dom": "^18.2.0", "react-router-dom": "^6.15.0", "textarea-caret": "^3.1.0" diff --git a/src/pages/inventory/components/IngrInputBox.tsx b/src/pages/inventory/components/IngrInputBox.tsx new file mode 100644 index 0000000..8380c06 --- /dev/null +++ b/src/pages/inventory/components/IngrInputBox.tsx @@ -0,0 +1,288 @@ +import { ReactComponent as IconBack } from '@/assets/icon-back.svg'; +import { ReactComponent as IconDelete } from '@/assets/icon-minus.svg'; +import DesignSystem from '@/utils/designSystem'; +import { useComposing } from '@/utils/hooks'; +import globalStyles from '@/utils/styles'; +import { Group, Typography } from '@base'; +import { css } from '@emotion/react'; +import { motion } from 'framer-motion'; +import moment, { Moment } from 'moment'; +import 'moment/dist/locale/ko'; +import { HTMLAttributes, useEffect, useRef, useState } from 'react'; +import { SingleDatePicker } from 'react-dates'; +import 'react-dates/initialize'; +import 'react-dates/lib/css/_datepicker.css'; +import { IngredientDataType } from '..'; +import '../react_dates_overrides.css'; +const styles = { + box: css({ + backgroundColor: DesignSystem.Color.background.gray, + width: 1080, + borderRadius: '12px', + padding: '17.5px 24px', + boxSizing: 'border-box', + }), + input: { + default: css(DesignSystem.Text.body, { + color: DesignSystem.Color.background.black, + width: 222, + height: 35, + lineHeight: '35px', + padding: 0, + '&::placeholder': { color: DesignSystem.Color.text.gray }, + }), + calender: css( + globalStyles.center, + globalStyles.button, + DesignSystem.Text.subtitle, + { width: '100%', height: 65 }, + ), + }, + ingredients: css({ + backgroundColor: DesignSystem.Color.background.white, + padding: '61px 0 61px 43px', + }), +}; +interface IngrInputBoxProps extends HTMLAttributes { + type: string; + item?: IngredientDataType; + submit?: boolean; + handleDataChange?: (inputData: IngredientDataType) => void; + hanldeEdit?: (input: IngredientDataType) => void; + handleRemove?: () => void; +} +function IngrInputBox({ + type, + item, + submit, + handleDataChange, + hanldeEdit, + handleRemove, + style, + ...props +}: IngrInputBoxProps) { + moment.locale('ko'); + const [registerDate, setRegisterDate] = useState( + moment().locale('ko'), + ); + const [bestBefore, setBestBefore] = useState(null); + + const [inputData, setInputData] = useState( + item + ? { + name: item.name, + number: item.number, + registerDate: item.registerDate, + bestBefore: item.bestBefore, + } + : { + name: '', + number: '', + registerDate: registerDate, + bestBefore: bestBefore, + }, + ); + const [isComposing, composeProps] = useComposing(); + + const handleKeyDown = + type === 'input' + ? (e: React.KeyboardEvent) => { + if (isComposing) return; + + if (e.code === 'Enter' && inputData.name) { + handleDataChange && handleDataChange(inputData); + setRegisterDate(moment().locale('ko')); + setBestBefore(null); + setInputData({ + name: '', + number: '', + registerDate: registerDate, + bestBefore: bestBefore, + }); + inputRef.current?.focus(); + } + } + : undefined; + + useEffect(() => { + if (submit) { + hanldeEdit && hanldeEdit(inputData); + } + }, [type]); + const inputRef = useRef(null); + return type === 'input' || type === 'edit' ? ( + + {type === 'edit' && ( + + rect': { + fill: DesignSystem.Color.warning.red, + }, + }} + onClick={() => { + handleRemove && handleRemove(); + }} + /> + + )} + + { + setInputData({ ...inputData, name: e.target.value }); + }} + onKeyDown={handleKeyDown} + ref={inputRef} + css={styles.input.default} + placeholder="재료를 입력해주세요." + {...composeProps} + /> + { + setInputData({ ...inputData, number: e.target.value }); + }} + onKeyDown={handleKeyDown} + css={styles.input.default} + placeholder="수량을 입력해주세요." + {...composeProps} + /> + { + setInputData({ ...inputData, registerDate: date }); + }} + targetRef={inputRef} + > + 등록일자 설정 + + { + setInputData({ ...inputData, bestBefore: date }); + }} + placeholder="유통기한 날짜를 선택해주세요." + targetRef={inputRef} + > + 유통기한 설정 + + + ) : ( + + + {inputData.name} + + + {inputData.number} + + + {inputData.registerDate.format('YYYY/MM/DD').toString()} + + + {inputData.bestBefore + ? inputData.bestBefore.format('YYYY/MM/DD').toString() + : ''} + + + ); +} + +export default IngrInputBox; + +interface CustomCalenderProps extends HTMLAttributes { + children: string; + inputDate: Moment | null; + setInputDate: (date: Moment) => void; + targetRef: React.RefObject; +} + +const CustomCalender = ({ + children, + inputDate, + setInputDate, + targetRef, + ...props +}: CustomCalenderProps) => { + const [focus, setFocus] = useState(false); + return ( + { + date && setInputDate(date); + }} + focused={focus} + onFocusChange={({ focused }) => { + setFocus(focused); + }} + noBorder={true} + displayFormat="YYYY/MM/DD" + monthFormat="YYYY M월" + numberOfMonths={1} + navPrev={} + navNext={ + + } + onClose={() => { + targetRef.current?.focus(); + }} + renderCalendarInfo={() => { + return ( +
{ + setFocus(false); + targetRef.current?.focus(); + } + : undefined + } + > + {children} +
+ ); + }} + hideKeyboardShortcutsPanel + enableOutsideDays + keepOpenOnDateSelect + appendToBody + disableScroll + daySize={48} + {...props} + id="unique-id" + /> + ); +}; diff --git a/src/pages/inventory/index.tsx b/src/pages/inventory/index.tsx new file mode 100644 index 0000000..13bd23d --- /dev/null +++ b/src/pages/inventory/index.tsx @@ -0,0 +1,235 @@ +import { ReactComponent as IconComplete } from '@/assets/icon-complete-edit-text.svg'; +import { ReactComponent as IconEdit } from '@/assets/icon-edit-text.svg'; +import { ReactComponent as IconList } from '@/assets/icon-list.svg'; +import DesignSystem from '@/utils/designSystem'; +import globalStyles from '@/utils/styles'; +import { Group, Stack, Typography } from '@base'; +import { css } from '@emotion/react'; +import moment, { Moment } from 'moment'; +import { useEffect, useRef, useState } from 'react'; +import IngrInputBox from './components/IngrInputBox'; +const styles = { + wrapper: css({}), + inventory: { + background: css( + { + backgroundColor: DesignSystem.Color.background.gray, + width: '100%', + padding: '100px 10px', + }, + globalStyles.center, + ), + header: css({ + backgroundColor: DesignSystem.Color.background.black, + color: DesignSystem.Color.background.white, + padding: '16px 0', + boxSizing: 'border-box', + }), + + ingredients: { + box: css({ + backgroundColor: DesignSystem.Color.background.white, + padding: '45px 0 61px 43px', + position: 'relative', + width: 1264, + boxSizing: 'border-box', + overflow: 'hidden', + }), + scrollBar: css({ + backgroundColor: DesignSystem.Color.background.disabled, + position: 'absolute', + height: 454, + top: 213, + right: 37, + width: 10, + borderRadius: 19, + }), + guide: css(DesignSystem.Text.info, { + color: DesignSystem.Color.text.gray, + width: 260, + }), + }, + }, +}; + +export interface IngredientDataType { + name: string; + number: string; + registerDate: Moment; + bestBefore: Moment | null; +} + +function Inventory() { + const [data, setData] = useState([]); + const [isEditing, setIsEditing] = useState(false); + const [submit, setSubmit] = useState(false); + const handleDataChange = (inputData: IngredientDataType) => { + setData([{ ...inputData }, ...data]); + }; + const handleEditing = (targetIdx: number, inputData: IngredientDataType) => { + setData(data.map((item, idx) => (targetIdx === idx ? inputData : item))); + }; + const handleDelete = (targetIdx: number) => { + setData(data.filter((_, idx) => idx !== targetIdx)); + }; + const checkRef = useRef(null); + + const [isOverflowed, setIsOverflowed] = useState(false); + + useEffect(() => { + setIsOverflowed( + !!checkRef.current && + checkRef?.current.scrollHeight > checkRef.current?.clientHeight, + ); + }); + return ( + + + + + + INVENTORY + + {isEditing ? ( + { + setIsEditing(!isEditing); + setSubmit(true); + }} + /> + ) : ( + { + data.length !== 0 && setIsEditing(!isEditing); + setSubmit(false); + }} + /> + )} + + + + + 재료명 + + + 수량 + + + 등록일자 + + + 유통기한 + + + + + + *당근 + + + *2개 + + + *{moment().format('YYYY/MM/DD').toString()} + + + *{moment().add(1, 'months').format('YYYY/MM/DD').toString()} + + + + {!isEditing && ( + + )} + + {data.map((item, idx) => { + return ( + { + handleEditing(idx, input); + }} + handleRemove={() => { + handleDelete(idx); + }} + key={`${idx}-${item.name}-${item.registerDate}`} + /> + ); + })} + + + {isOverflowed && ( +
+ )} +
+
+
+
+ ); +} +export default Inventory; diff --git a/src/pages/inventory/react_dates_overrides.css b/src/pages/inventory/react_dates_overrides.css new file mode 100644 index 0000000..4872389 --- /dev/null +++ b/src/pages/inventory/react_dates_overrides.css @@ -0,0 +1,85 @@ +:root { + --primary_yellow: #ffe24c; + --text_black: #292929; + --text_gray: #9ea6b1; +} +.SingleDatePicker_picker * { + font-family: Pretendard; + color: var(--text_black); + font-style: normal; +} +.SingleDatePicker_picker { + z-index: 3; +} +/*인풋박스*/ +.SingleDatePicker * { + width: 222px; + height: 35px; + box-sizing: border-box; + background: transparent; +} +.SingleDatePickerInput { + background: transparent; +} +.DateInput { + background: transparent; +} +.DateInput_input { + font-family: Pretendard; + width: 222px; + box-sizing: border-box; + background: transparent; + font-size: 18px; + font-weight: 400; + color: var(--text_black); + border: none; + padding-left: 0; +} +.DateInput_input::placeholder { + color: var(--text_gray); +} +/*캘린더 연월 텍스트*/ +.CalendarMonth_caption { + font-size: 20px; + font-weight: 600; + line-height: 165%; + padding: 16px 0 80px 0; +} +.DayPicker_weekHeader { + top: 90px; +} +/*요일 텍스트*/ +.DayPicker_weekHeader_ul { + font-size: 16px; + font-weight: 500; + line-height: normal; +} + +/*날짜 텍스트*/ +.CalendarDay__default { + border: none; + color: var(--text_black); +} +.CalendarDay:hover { + border: none; + background-color: #fff; + color: var(--text_black); +} +.CalendarDay__blocked_out_of_range { + color: var(--text_gray); +} +.CalendarDay__blocked_out_of_range:hover { + color: var(--text_gray); +} +.CalendarDay__outside { + color: var(--text_gray); +} +.CalendarDay__selected { + background: var(--primary_yellow); + border-radius: 100%; +} +.CalendarDay__selected:hover { + background: var(--primary_yellow); + border-radius: 100%; + border: none; +} diff --git a/vite.config.ts b/vite.config.ts index f2a12a6..faa57d3 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -27,4 +27,7 @@ export default defineConfig({ '@': fileURLToPath(new URL('./src', import.meta.url)), }, }, + define: { + global: {}, + }, }); diff --git a/yarn.lock b/yarn.lock index e8acc6f..7b6fc20 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3711,6 +3711,15 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== +"@types/react-dates@^21.8.6": + version "21.8.6" + resolved "https://registry.yarnpkg.com/@types/react-dates/-/react-dates-21.8.6.tgz#ec9314b59e9d8e1ad71ccf021a7634e8afd26135" + integrity sha512-fDF322SOXAxstapv0/oruiPx9kY4DiiaEHYAVvXdPfQhi/hdaONsA9dFw5JBNPAWz7Niuwk+UUhxPU98h70TjA== + dependencies: + "@types/react" "*" + "@types/react-outside-click-handler" "*" + moment "^2.26.0" + "@types/react-dom@^18.2.7": version "18.2.7" resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz" @@ -3718,6 +3727,13 @@ dependencies: "@types/react" "*" +"@types/react-outside-click-handler@*": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@types/react-outside-click-handler/-/react-outside-click-handler-1.3.3.tgz#af3d263462f308a135efd6134d0abc8f9d54c222" + integrity sha512-fF7x4dHf/IPIne8kkt3rlCGuWFrWkFJmzQm4JkxSBzXJIM9WDLob++VnmGpE3ToVWrW3Xw9D5TxcUWrwqe04Gg== + dependencies: + "@types/react" "*" + "@types/react@*", "@types/react@^18.2.15": version "18.2.18" resolved "https://registry.npmjs.org/@types/react/-/react-18.2.18.tgz" @@ -4059,6 +4075,21 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" +airbnb-prop-types@^2.14.0, airbnb-prop-types@^2.15.0, airbnb-prop-types@^2.16.0: + version "2.16.0" + resolved "https://registry.yarnpkg.com/airbnb-prop-types/-/airbnb-prop-types-2.16.0.tgz#b96274cefa1abb14f623f804173ee97c13971dc2" + integrity sha512-7WHOFolP/6cS96PhKNrslCLMYAI8yB1Pp6u6XmxozQOiZbsI5ycglZr5cHhBFfuRcQQjzCMith5ZPZdYiJCxUg== + dependencies: + array.prototype.find "^2.1.1" + function.prototype.name "^1.1.2" + is-regex "^1.1.0" + object-is "^1.1.2" + object.assign "^4.1.0" + object.entries "^1.1.2" + prop-types "^15.7.2" + prop-types-exact "^1.2.0" + react-is "^16.13.1" + ajv@^6.12.4: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" @@ -4194,6 +4225,39 @@ array-union@^2.1.0: resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== +array.prototype.find@^2.1.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.2.2.tgz#e862cf891e725d8f2a10e5e42d750629faaabd32" + integrity sha512-DRumkfW97iZGOfn+lIXbkVrXL04sfYKX+EfOodo8XboR5sxPDVvOjZTF/rysusa9lmhmSOeD6Vp6RKQP+eP4Tg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.flat@^1.2.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +arraybuffer.prototype.slice@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" + integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + is-array-buffer "^3.0.2" + is-shared-array-buffer "^1.0.2" + arrify@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz" @@ -4392,6 +4456,11 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" +brcast@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/brcast/-/brcast-2.0.2.tgz#2db16de44140e418dc37fab10beec0369e78dcef" + integrity sha512-Tfn5JSE7hrUlFcOoaLzVvkbgIemIorMIyoMr3TgvszWW7jFt2C9PdeMLtysYD9RU0MmU17b69+XJG1eRY2OBRg== + browser-assert@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/browser-assert/-/browser-assert-1.2.1.tgz#9aaa5a2a8c74685c2ae05bfe46efd606f068c200" @@ -4475,6 +4544,15 @@ call-bind@^1.0.0, call-bind@^1.0.2: function-bind "^1.1.1" get-intrinsic "^1.0.2" +call-bind@^1.0.4, call-bind@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" + integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== + dependencies: + function-bind "^1.1.2" + get-intrinsic "^1.2.1" + set-function-length "^1.1.1" + callsites@^3.0.0: version "3.1.0" resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" @@ -4747,6 +4825,11 @@ concat-stream@^1.6.2: readable-stream "^2.2.2" typedarray "^0.0.6" +"consolidated-events@^1.1.1 || ^2.0.0": + version "2.0.2" + resolved "https://registry.yarnpkg.com/consolidated-events/-/consolidated-events-2.0.2.tgz#da8d8f8c2b232831413d9e190dc11669c79f4a91" + integrity sha512-2/uRVMdRypf5z/TW/ncD/66l75P5hH2vM/GR8Jf8HLc2xnfJtmina6F6du8+v4Z2vTrMo7jC+W1tmEEuuELgkQ== + content-disposition@0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" @@ -4975,6 +5058,11 @@ deep-is@^0.1.3: resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== +deepmerge@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.5.2.tgz#10499d868844cdad4fee0842df8c7f6f0c95a753" + integrity sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ== + deepmerge@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" @@ -4995,11 +5083,29 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" +define-data-property@^1.0.1, define-data-property@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" + integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== + dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + define-lazy-prop@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== +define-properties@^1.1.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" @@ -5094,6 +5200,11 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" +direction@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/direction/-/direction-1.0.4.tgz#2b86fb686967e987088caf8b89059370d4837442" + integrity sha512-GYqKi1aH7PJXxdhTeZBFrg8vUBeKXi+cNprXsC1kpJcbcVnV9wBsrOu1cQEdG0WeQwlfHiy3XvnKfIrJ2R0NzQ== + doctrine@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" @@ -5101,6 +5212,13 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +document.contains@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/document.contains/-/document.contains-1.0.2.tgz#4260abad67a6ae9e135c1be83d68da0db169d5f0" + integrity sha512-YcvYFs15mX8m3AO1QNQy3BlIpSMfNRj3Ujk2BEJxsZG+HZf7/hZ6jr7mDpXrF8q+ff95Vef5yjhiZxm8CGJr6Q== + dependencies: + define-properties "^1.1.3" + dom-accessibility-api@^0.5.6, dom-accessibility-api@^0.5.9: version "0.5.16" resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" @@ -5217,6 +5335,14 @@ envinfo@^7.7.3: resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.10.0.tgz#55146e3909cc5fe63c22da63fb15b05aeac35b13" integrity sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw== +enzyme-shallow-equal@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.5.tgz#5528a897a6ad2bdc417c7221a7db682cd01711ba" + integrity sha512-i6cwm7hN630JXenxxJFBKzgLC3hMTafFQXflvzHgPmDhOBhxUWDe8AeRv1qp2/uWJ2Y8z5yLWMzmAfkTOiOCZg== + dependencies: + has "^1.0.3" + object-is "^1.1.5" + error-ex@^1.3.1: version "1.3.2" resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" @@ -5224,6 +5350,51 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" +es-abstract@^1.22.1: + version "1.22.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.3.tgz#48e79f5573198de6dee3589195727f4f74bc4f32" + integrity sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA== + dependencies: + array-buffer-byte-length "^1.0.0" + arraybuffer.prototype.slice "^1.0.2" + available-typed-arrays "^1.0.5" + call-bind "^1.0.5" + es-set-tostringtag "^2.0.1" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.2" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-typed-array "^1.1.12" + is-weakref "^1.0.2" + object-inspect "^1.13.1" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.1" + safe-array-concat "^1.0.1" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.8" + string.prototype.trimend "^1.0.7" + string.prototype.trimstart "^1.0.7" + typed-array-buffer "^1.0.0" + typed-array-byte-length "^1.0.0" + typed-array-byte-offset "^1.0.0" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.13" + es-get-iterator@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" @@ -5244,6 +5415,31 @@ es-module-lexer@^0.9.3: resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== +es-set-tostringtag@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz#11f7cc9f63376930a5f20be4915834f4bc74f9c9" + integrity sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q== + dependencies: + get-intrinsic "^1.2.2" + has-tostringtag "^1.0.0" + hasown "^2.0.0" + +es-shim-unscopables@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + es6-object-assign@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c" @@ -5862,6 +6058,21 @@ function-bind@^1.1.1: resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.2, function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" @@ -5887,6 +6098,16 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@ has-proto "^1.0.1" has-symbols "^1.0.3" +get-intrinsic@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" + integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== + dependencies: + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + get-nonce@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" @@ -5912,6 +6133,14 @@ get-stream@^6.0.0, get-stream@^6.0.1: resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + giget@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/giget/-/giget-1.1.2.tgz#f99a49cb0ff85479c8c3612cdc7ca27f2066e818" @@ -5990,6 +6219,14 @@ glob@^7.1.3, glob@^7.1.4, glob@^7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" +global-cache@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/global-cache/-/global-cache-1.2.1.tgz#39ca020d3dd7b3f0934c52b75363f8d53312c16d" + integrity sha512-EOeUaup5DgWKlCMhA9YFqNRIlZwoxt731jCh47WBV9fQqHgXhr3Fa55hfgIUqilIcPsfdNKN7LHjrNY+Km40KA== + dependencies: + define-properties "^1.1.2" + is-symbol "^1.0.1" + global-dirs@^0.1.1: version "0.1.1" resolved "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz" @@ -6009,6 +6246,13 @@ globals@^13.19.0: dependencies: type-fest "^0.20.2" +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + globby@^11.0.1, globby@^11.0.2, globby@^11.1.0: version "11.1.0" resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" @@ -6072,7 +6316,7 @@ hard-rejection@^2.1.0: resolved "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz" integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== -has-bigints@^1.0.1: +has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== @@ -6118,7 +6362,14 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -hoist-non-react-statics@^3.3.1: +hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== + dependencies: + function-bind "^1.1.2" + +hoist-non-react-statics@^3.2.1, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: version "3.3.2" resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== @@ -6256,6 +6507,15 @@ internal-slot@^1.0.4: has "^1.0.3" side-channel "^1.0.4" +internal-slot@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.6.tgz#37e756098c4911c5e912b8edbf71ed3aa116f930" + integrity sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg== + dependencies: + get-intrinsic "^1.2.2" + hasown "^2.0.0" + side-channel "^1.0.4" + invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" @@ -6322,7 +6582,7 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-callable@^1.1.3: +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== @@ -6334,7 +6594,7 @@ is-core-module@^2.13.0, is-core-module@^2.5.0: dependencies: has "^1.0.3" -is-date-object@^1.0.5: +is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== @@ -6403,6 +6663,11 @@ is-nan@^1.2.1: call-bind "^1.0.0" define-properties "^1.1.3" +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + is-number-object@^1.0.4: version "1.0.7" resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" @@ -6447,7 +6712,7 @@ is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-regex@^1.1.4: +is-regex@^1.1.0, is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== @@ -6484,7 +6749,7 @@ is-string@^1.0.5, is-string@^1.0.7: dependencies: has-tostringtag "^1.0.0" -is-symbol@^1.0.3: +is-symbol@^1.0.1, is-symbol@^1.0.2, is-symbol@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== @@ -6498,7 +6763,12 @@ is-text-path@^1.0.1: dependencies: text-extensions "^1.0.0" -is-typed-array@^1.1.10, is-typed-array@^1.1.3: +is-touch-device@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-touch-device/-/is-touch-device-1.0.1.tgz#9a2fd59f689e9a9bf6ae9a86924c4ba805a42eab" + integrity sha512-LAYzo9kMT1b2p19L/1ATGt2XcSilnzNlyvq6c0pbPRVisLbAPpLqr53tIJS00kvrTkj0HtR8U7+u8X0yR8lPSw== + +is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.3, is-typed-array@^1.1.9: version "1.1.12" resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== @@ -6515,6 +6785,13 @@ is-weakmap@^2.0.1: resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + is-weakset@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" @@ -6997,7 +7274,7 @@ lodash.upperfirst@^4.3.1: resolved "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz" integrity sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg== -lodash@^4.17.15, lodash@^4.17.21: +lodash@^4.1.1, lodash@^4.17.15, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -7312,6 +7589,11 @@ mkdirp@^1.0.3: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== +moment@>=1.6.0, moment@^2.26.0, moment@^2.29.4: + version "2.29.4" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" + integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== + mri@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" @@ -7447,7 +7729,12 @@ object-inspect@^1.12.3, object-inspect@^1.9.0: resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== -object-is@^1.0.1, object-is@^1.1.5: +object-inspect@^1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + +object-is@^1.0.1, object-is@^1.1.2, object-is@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== @@ -7460,7 +7747,7 @@ object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.4: +object.assign@^4.1.0, object.assign@^4.1.2, object.assign@^4.1.4: version "4.1.4" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== @@ -7470,6 +7757,24 @@ object.assign@^4.1.4: has-symbols "^1.0.3" object-keys "^1.1.1" +object.entries@^1.1.2: + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.7.tgz#2b47760e2a2e3a752f39dd874655c61a7f03c131" + integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.values@^1.1.0, object.values@^1.1.5: + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" + integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + on-finished@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" @@ -7685,6 +7990,11 @@ pend@~1.2.0: resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + picocolors@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" @@ -7823,7 +8133,16 @@ prompts@^2.4.0: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@^15.7.2: +prop-types-exact@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/prop-types-exact/-/prop-types-exact-1.2.0.tgz#825d6be46094663848237e3925a98c6e944e9869" + integrity sha512-K+Tk3Kd9V0odiXFP9fwDHUYRyvK3Nun3GVyPapSIs5OBkITAm15W0CPFD/YKTkMUAbc0b9CUwRQp2ybiBIq+eA== + dependencies: + has "^1.0.3" + object.assign "^4.1.0" + reflect.ownkeys "^0.2.0" + +prop-types@^15.5.8, prop-types@^15.7.2: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -7920,6 +8239,13 @@ quick-lru@^4.0.1: resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== +raf@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" + integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== + dependencies: + performance-now "^2.1.0" + ramda@0.29.0: version "0.29.0" resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.29.0.tgz#fbbb67a740a754c8a4cbb41e2a6e0eb8507f55fb" @@ -7952,6 +8278,27 @@ react-confetti@^6.1.0: dependencies: tween-functions "^1.2.0" +react-dates@^21.8.0: + version "21.8.0" + resolved "https://registry.yarnpkg.com/react-dates/-/react-dates-21.8.0.tgz#355c3c7a243a7c29568fe00aca96231e171a5e94" + integrity sha512-PPriGqi30CtzZmoHiGdhlA++YPYPYGCZrhydYmXXQ6RAvAsaONcPtYgXRTLozIOrsQ5mSo40+DiA5eOFHnZ6xw== + dependencies: + airbnb-prop-types "^2.15.0" + consolidated-events "^1.1.1 || ^2.0.0" + enzyme-shallow-equal "^1.0.0" + is-touch-device "^1.0.1" + lodash "^4.1.1" + object.assign "^4.1.0" + object.values "^1.1.0" + prop-types "^15.7.2" + raf "^3.4.1" + react-moment-proptypes "^1.6.0" + react-outside-click-handler "^1.2.4" + react-portal "^4.2.0" + react-with-direction "^1.3.1" + react-with-styles "^4.1.0" + react-with-styles-interface-css "^6.0.0" + react-docgen-typescript@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/react-docgen-typescript/-/react-docgen-typescript-2.2.2.tgz#4611055e569edc071204aadb20e1c93e1ab1659c" @@ -8015,6 +8362,31 @@ react-is@^18.0.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== +react-moment-proptypes@^1.6.0: + version "1.8.1" + resolved "https://registry.yarnpkg.com/react-moment-proptypes/-/react-moment-proptypes-1.8.1.tgz#7ba4076147f6b5998f0d4f51d302d6d8c62049fd" + integrity sha512-Er940DxWoObfIqPrZNfwXKugjxMIuk1LAuEzn23gytzV6hKS/sw108wibi9QubfMN4h+nrlje8eUCSbQRJo2fQ== + dependencies: + moment ">=1.6.0" + +react-outside-click-handler@^1.2.4: + version "1.3.0" + resolved "https://registry.yarnpkg.com/react-outside-click-handler/-/react-outside-click-handler-1.3.0.tgz#3831d541ac059deecd38ec5423f81e80ad60e115" + integrity sha512-Te/7zFU0oHpAnctl//pP3hEAeobfeHMyygHB8MnjP6sX5OR8KHT1G3jmLsV3U9RnIYo+Yn+peJYWu+D5tUS8qQ== + dependencies: + airbnb-prop-types "^2.15.0" + consolidated-events "^1.1.1 || ^2.0.0" + document.contains "^1.0.1" + object.values "^1.1.0" + prop-types "^15.7.2" + +react-portal@^4.2.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/react-portal/-/react-portal-4.2.2.tgz#bff1e024147d6041ba8c530ffc99d4c8248f49fa" + integrity sha512-vS18idTmevQxyQpnde0Td6ZcUlv+pD8GTyR42n3CHUQq9OHi1C4jDE4ZWEbEsrbrLRhSECYiao58cvocwMtP7Q== + dependencies: + prop-types "^15.5.8" + react-refresh@^0.14.0: version "0.14.0" resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e" @@ -8063,6 +8435,39 @@ react-style-singleton@^2.2.1: invariant "^2.2.4" tslib "^2.0.0" +react-with-direction@^1.3.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/react-with-direction/-/react-with-direction-1.4.0.tgz#ebdf64d685d0650ce966e872e6431ad5a2485444" + integrity sha512-ybHNPiAmaJpoWwugwqry9Hd1Irl2hnNXlo/2SXQBwbLn/jGMauMS2y9jw+ydyX5V9ICryCqObNSthNt5R94xpg== + dependencies: + airbnb-prop-types "^2.16.0" + brcast "^2.0.2" + deepmerge "^1.5.2" + direction "^1.0.4" + hoist-non-react-statics "^3.3.2" + object.assign "^4.1.2" + object.values "^1.1.5" + prop-types "^15.7.2" + +react-with-styles-interface-css@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/react-with-styles-interface-css/-/react-with-styles-interface-css-6.0.0.tgz#b53da7fa8359d452cb934cface8738acaef7b5fe" + integrity sha512-6khSG1Trf4L/uXOge/ZAlBnq2O2PEXlQEqAhCRbvzaQU4sksIkdwpCPEl6d+DtP3+IdhyffTWuHDO9lhe1iYvA== + dependencies: + array.prototype.flat "^1.2.1" + global-cache "^1.2.1" + +react-with-styles@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/react-with-styles/-/react-with-styles-4.2.0.tgz#0b8a8e5d94d082518b9f564f6fcf6103e28096c5" + integrity sha512-tZCTY27KriRNhwHIbg1NkSdTTOSfXDg6Z7s+Q37mtz0Ym7Sc7IOr3PzVt4qJhJMW6Nkvfi3g34FuhtiGAJCBQA== + dependencies: + airbnb-prop-types "^2.14.0" + hoist-non-react-statics "^3.2.1" + object.assign "^4.1.0" + prop-types "^15.7.2" + react-with-direction "^1.3.1" + react@^18.2.0: version "18.2.0" resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" @@ -8147,6 +8552,11 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" +reflect.ownkeys@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz#749aceec7f3fdf8b63f927a04809e90c5c0b3460" + integrity sha512-qOLsBKHCpSOFKK1NUOCGC5VyeufB6lEsFe92AL2bhIJsacZS1qdoOZSbPk3MYKuT2cFlRDnulKXuuElIrMjGUg== + regenerate-unicode-properties@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" @@ -8185,6 +8595,15 @@ regexp.prototype.flags@^1.5.0: define-properties "^1.2.0" functions-have-names "^1.2.3" +regexp.prototype.flags@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" + integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + set-function-name "^2.0.0" + regexpu-core@^5.3.1: version "5.3.2" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" @@ -8332,6 +8751,16 @@ rxjs@^7.8.0: dependencies: tslib "^2.1.0" +safe-array-concat@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" + integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + isarray "^2.0.5" + safe-buffer@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" @@ -8347,6 +8776,15 @@ safe-buffer@5.2.1, safe-buffer@~5.2.0: resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + "safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -8423,6 +8861,25 @@ serve-static@1.15.0: parseurl "~1.3.3" send "0.18.0" +set-function-length@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" + integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ== + dependencies: + define-data-property "^1.1.1" + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + +set-function-name@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" + integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== + dependencies: + define-data-property "^1.0.1" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.0" + setprototypeof@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" @@ -8643,6 +9100,33 @@ string-width@^5.0.0, string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" +string.prototype.trim@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" + integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +string.prototype.trimend@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" + integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +string.prototype.trimstart@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" + integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" @@ -9009,6 +9493,45 @@ type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" +typed-array-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" + integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-typed-array "^1.1.10" + +typed-array-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" + integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" + integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" @@ -9024,6 +9547,16 @@ uglify-js@^3.1.4: resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -9303,6 +9836,17 @@ which-typed-array@^1.1.11, which-typed-array@^1.1.2, which-typed-array@^1.1.9: gopd "^1.0.1" has-tostringtag "^1.0.0" +which-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36" + integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.4" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + which@^2.0.1: version "2.0.2" resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" From f8730fa666643ee96b85702b43a609fb52eda217 Mon Sep 17 00:00:00 2001 From: chocoboy08 Date: Wed, 27 Dec 2023 16:08:40 +0900 Subject: [PATCH 04/11] feat: :sparkles: add expirationdate ingredients, recommend recipes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 유통기한 임박 재료, 재료 기반 추천 레시피 기능 추가 --- src/pages/home/index.tsx | 2 +- .../inventory/components/IngrInputBox.tsx | 46 ++++----- .../components/ShortExpirationItem.tsx | 50 ++++++++++ src/pages/inventory/index.tsx | 99 +++++++++++++++++-- 4 files changed, 165 insertions(+), 32 deletions(-) create mode 100644 src/pages/inventory/components/ShortExpirationItem.tsx diff --git a/src/pages/home/index.tsx b/src/pages/home/index.tsx index 241b9ea..37656a6 100644 --- a/src/pages/home/index.tsx +++ b/src/pages/home/index.tsx @@ -72,7 +72,7 @@ const mockTagData = [ { value: 'ingr-5', label: '# 재료 5' }, ]; -const mockRecipeData: RecipeProps[] = Array(14).fill({ +export const mockRecipeData: RecipeProps[] = Array(14).fill({ author: '해피밀', contents: `소스 : 스리라차 소스, 요거트 소스 반죽 : 밀가루, 계란 diff --git a/src/pages/inventory/components/IngrInputBox.tsx b/src/pages/inventory/components/IngrInputBox.tsx index 8380c06..cdbbfec 100644 --- a/src/pages/inventory/components/IngrInputBox.tsx +++ b/src/pages/inventory/components/IngrInputBox.tsx @@ -62,24 +62,24 @@ function IngrInputBox({ ...props }: IngrInputBoxProps) { moment.locale('ko'); - const [registerDate, setRegisterDate] = useState( + const [registrationDate, setRegistrationDate] = useState( moment().locale('ko'), ); - const [bestBefore, setBestBefore] = useState(null); + const [expirationDate, setExpirationDate] = useState(null); const [inputData, setInputData] = useState( item ? { name: item.name, - number: item.number, - registerDate: item.registerDate, - bestBefore: item.bestBefore, + quantity: item.quantity, + registrationDate: item.registrationDate, + expirationDate: item.expirationDate, } : { name: '', - number: '', - registerDate: registerDate, - bestBefore: bestBefore, + quantity: '', + registrationDate: registrationDate, + expirationDate: expirationDate, }, ); const [isComposing, composeProps] = useComposing(); @@ -91,13 +91,13 @@ function IngrInputBox({ if (e.code === 'Enter' && inputData.name) { handleDataChange && handleDataChange(inputData); - setRegisterDate(moment().locale('ko')); - setBestBefore(null); + setRegistrationDate(moment().locale('ko')); + setExpirationDate(null); setInputData({ name: '', - number: '', - registerDate: registerDate, - bestBefore: bestBefore, + quantity: '', + registrationDate: registrationDate, + expirationDate: expirationDate, }); inputRef.current?.focus(); } @@ -151,9 +151,9 @@ function IngrInputBox({ /> { - setInputData({ ...inputData, number: e.target.value }); + setInputData({ ...inputData, quantity: e.target.value }); }} onKeyDown={handleKeyDown} css={styles.input.default} @@ -161,18 +161,18 @@ function IngrInputBox({ {...composeProps} /> { - setInputData({ ...inputData, registerDate: date }); + setInputData({ ...inputData, registrationDate: date }); }} targetRef={inputRef} > 등록일자 설정 { - setInputData({ ...inputData, bestBefore: date }); + setInputData({ ...inputData, expirationDate: date }); }} placeholder="유통기한 날짜를 선택해주세요." targetRef={inputRef} @@ -186,14 +186,14 @@ function IngrInputBox({ {inputData.name} - {inputData.number} + {inputData.quantity} - {inputData.registerDate.format('YYYY/MM/DD').toString()} + {inputData.registrationDate.format('YYYY/MM/DD').toString()} - {inputData.bestBefore - ? inputData.bestBefore.format('YYYY/MM/DD').toString() + {inputData.expirationDate + ? inputData.expirationDate.format('YYYY/MM/DD').toString() : ''} diff --git a/src/pages/inventory/components/ShortExpirationItem.tsx b/src/pages/inventory/components/ShortExpirationItem.tsx new file mode 100644 index 0000000..7f45d1d --- /dev/null +++ b/src/pages/inventory/components/ShortExpirationItem.tsx @@ -0,0 +1,50 @@ +import { ReactComponent as IconCaution } from '@/assets/icon-caution.svg'; +import DesignSystem from '@/utils/designSystem'; +import { Group, Stack, Typography } from '@base'; +import { css } from '@emotion/react'; +import moment from 'moment'; +import { IngredientDataType } from '..'; +interface ShortExpirationItemProps { + item: IngredientDataType; +} +const styles = { + infoBox: css({ + backgroundColor: DesignSystem.Color.background.gray, + border: '1px solid', + borderColor: DesignSystem.Color.background.black, + marginLeft: -1, + padding: '17.5px 119px 32px 18.6px', + }), +}; +function ShortExpirationItem({ item }: ShortExpirationItemProps) { + return ( + + + {item.name} + {item.expirationDate?.isBefore(moment()) && ( + + )} + + + 수량 : {item.quantity} + + 등록 일자 : {item.registrationDate?.format('YYYY/MM/DD').toString()} + + + 유통기한 : {item.expirationDate?.format('YYYY/MM/DD').toString()} + + + + ); +} + +export default ShortExpirationItem; diff --git a/src/pages/inventory/index.tsx b/src/pages/inventory/index.tsx index 13bd23d..32fa677 100644 --- a/src/pages/inventory/index.tsx +++ b/src/pages/inventory/index.tsx @@ -4,10 +4,14 @@ import { ReactComponent as IconList } from '@/assets/icon-list.svg'; import DesignSystem from '@/utils/designSystem'; import globalStyles from '@/utils/styles'; import { Group, Stack, Typography } from '@base'; +import Pagenumber from '@copmonents/Pagenumber'; +import Recipe from '@copmonents/Recipe'; import { css } from '@emotion/react'; import moment, { Moment } from 'moment'; import { useEffect, useRef, useState } from 'react'; +import { mockRecipeData } from '../home'; import IngrInputBox from './components/IngrInputBox'; +import ShortExpirationItem from './components/ShortExpirationItem'; const styles = { wrapper: css({}), inventory: { @@ -54,15 +58,62 @@ const styles = { export interface IngredientDataType { name: string; - number: string; - registerDate: Moment; - bestBefore: Moment | null; + quantity: string; + registrationDate: Moment; + expirationDate: Moment | null; } function Inventory() { const [data, setData] = useState([]); const [isEditing, setIsEditing] = useState(false); const [submit, setSubmit] = useState(false); + const [isOverflowed, setIsOverflowed] = useState(false); + const [currentPage, setCurrentPage] = useState(1); + const checkRef = useRef(null); + + const mockIngredientData: IngredientDataType[][] = [ + [ + { + name: '김치', + quantity: '3개', + registrationDate: moment('2023-02-05'), + expirationDate: moment('2024-02-05'), + }, + { + name: '소고기', + quantity: '300g', + registrationDate: moment('2023-02-05'), + expirationDate: moment('2023-02-05'), + }, + { + name: '양파', + quantity: '5개', + registrationDate: moment('2023-02-05'), + expirationDate: moment('2023-02-05'), + }, + { + name: '양파', + quantity: '5개', + registrationDate: moment('2023-02-05'), + expirationDate: moment('2023-02-05'), + }, + ], + [ + { + name: '양파', + quantity: '5개', + registrationDate: moment('2023-02-05'), + expirationDate: moment('2023-02-05'), + }, + { + name: '양파', + quantity: '5개', + registrationDate: moment('2023-02-05'), + expirationDate: moment('2023-02-05'), + }, + ], + ]; + const handleDataChange = (inputData: IngredientDataType) => { setData([{ ...inputData }, ...data]); }; @@ -72,9 +123,6 @@ function Inventory() { const handleDelete = (targetIdx: number) => { setData(data.filter((_, idx) => idx !== targetIdx)); }; - const checkRef = useRef(null); - - const [isOverflowed, setIsOverflowed] = useState(false); useEffect(() => { setIsOverflowed( @@ -83,7 +131,7 @@ function Inventory() { ); }); return ( - + @@ -217,7 +265,7 @@ function Inventory() { handleRemove={() => { handleDelete(idx); }} - key={`${idx}-${item.name}-${item.registerDate}`} + key={`${idx}-${item.name}-${item.registrationDate}`} /> ); })} @@ -229,6 +277,41 @@ function Inventory() { + + + 유통기한이 얼마 남지 않은 재료 + + + {mockIngredientData[currentPage - 1].map((item, idx) => { + return ; + })} + + + { + setCurrentPage(page); + }} + /> + + + 재료 기반 추천 레시피 + +
+ {mockRecipeData.map((props, index) => ( + + ))} +
+
); } From 8cc835e193748398b563a77d4266c02b50f91797 Mon Sep 17 00:00:00 2001 From: strawji02 Date: Sat, 6 Jan 2024 15:51:20 +0900 Subject: [PATCH 05/11] fix: :bug: update export type --- src/components/@base/Stack.tsx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/components/@base/Stack.tsx b/src/components/@base/Stack.tsx index 2eb320a..03ce5a4 100644 --- a/src/components/@base/Stack.tsx +++ b/src/components/@base/Stack.tsx @@ -1,4 +1,4 @@ -import { CSSProperties, HTMLAttributes, forwardRef, useRef } from 'react'; +import { CSSProperties, HTMLAttributes, forwardRef } from 'react'; export interface StackProps extends HTMLAttributes { justify?: CSSProperties['justifyContent']; @@ -6,7 +6,7 @@ export interface StackProps extends HTMLAttributes { spacing?: CSSProperties['gap']; } -export default forwardRef(function Stack( +const Stack = forwardRef(function Stack( { children, justify: justifyContent = 'center', @@ -16,8 +16,7 @@ export default forwardRef(function Stack( }: StackProps, ref, ) { - const localRef = useRef(null); - const inputRef = ref || localRef; + const inputRef = ref; return (
(function Stack(
); }); + +export default Stack; From 4eb60a0cb94a7c132e53c78ae31b0b2c744da74b Mon Sep 17 00:00:00 2001 From: strawji02 Date: Sat, 6 Jan 2024 15:55:47 +0900 Subject: [PATCH 06/11] chore: :green_heart: update vite config --- vite.config.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vite.config.ts b/vite.config.ts index faa57d3..c29ff12 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -27,7 +27,7 @@ export default defineConfig({ '@': fileURLToPath(new URL('./src', import.meta.url)), }, }, - define: { - global: {}, - }, + // define: { + // global: {}, + // }, }); From ecdb504609bbe5f791f4c86a1ab020a3fa7c4610 Mon Sep 17 00:00:00 2001 From: strawji02 Date: Sat, 6 Jan 2024 16:01:02 +0900 Subject: [PATCH 07/11] fix: :bug: undefiend global fix --- index.html | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/index.html b/index.html index e4b78ea..b5358e2 100644 --- a/index.html +++ b/index.html @@ -9,5 +9,11 @@
+ + From f461ef159e551b9f7c134a5408696be8ef7fdb50 Mon Sep 17 00:00:00 2001 From: chocoboy08 Date: Mon, 8 Jan 2024 10:49:34 +0900 Subject: [PATCH 08/11] fix: :bug: change Group to table MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit border collapse를 추가하기 위해 Group 컴포넌트를 table로 변경했습니다. --- src/pages/inventory/components/ShortExpirationItem.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/pages/inventory/components/ShortExpirationItem.tsx b/src/pages/inventory/components/ShortExpirationItem.tsx index 7f45d1d..cce7ce7 100644 --- a/src/pages/inventory/components/ShortExpirationItem.tsx +++ b/src/pages/inventory/components/ShortExpirationItem.tsx @@ -12,13 +12,14 @@ const styles = { backgroundColor: DesignSystem.Color.background.gray, border: '1px solid', borderColor: DesignSystem.Color.background.black, - marginLeft: -1, + boxSizing: 'border-box', + width: 317, padding: '17.5px 119px 32px 18.6px', }), }; function ShortExpirationItem({ item }: ShortExpirationItemProps) { return ( - + {item.name} {item.expirationDate?.isBefore(moment()) && ( @@ -43,7 +44,7 @@ function ShortExpirationItem({ item }: ShortExpirationItemProps) { 유통기한 : {item.expirationDate?.format('YYYY/MM/DD').toString()} - + ); } From a9d636d1cd38e3f230db48bf78e9b102c7d319c7 Mon Sep 17 00:00:00 2001 From: chocoboy08 Date: Mon, 8 Jan 2024 12:06:52 +0900 Subject: [PATCH 09/11] fix: :bug: fix layout MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 재료가 4개 미만일 때 여백이 생기는 버그를 수정했습니다. --- src/pages/inventory/index.tsx | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/pages/inventory/index.tsx b/src/pages/inventory/index.tsx index 32fa677..18ced6d 100644 --- a/src/pages/inventory/index.tsx +++ b/src/pages/inventory/index.tsx @@ -277,15 +277,21 @@ function Inventory() { - + 유통기한이 얼마 남지 않은 재료 - +
{mockIngredientData[currentPage - 1].map((item, idx) => { return ; })} - +
Date: Thu, 18 Jan 2024 20:30:01 +0900 Subject: [PATCH 10/11] docs: :memo: add component storybook --- .../components/IngrInputBox.stories.tsx | 25 +++++++++++++ .../ShortExpirationItem.stories.tsx | 37 +++++++++++++++++++ vite.config.ts | 3 -- 3 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 src/pages/inventory/components/IngrInputBox.stories.tsx create mode 100644 src/pages/inventory/components/ShortExpirationItem.stories.tsx diff --git a/src/pages/inventory/components/IngrInputBox.stories.tsx b/src/pages/inventory/components/IngrInputBox.stories.tsx new file mode 100644 index 0000000..2965da8 --- /dev/null +++ b/src/pages/inventory/components/IngrInputBox.stories.tsx @@ -0,0 +1,25 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import IngrInputBox from './IngrInputBox'; + +const meta: Meta = { + parameters: { + design: { + type: 'figma', + url: 'https://www.figma.com/file/6Tcv8DaxZwjY4NYH0NAhmz/Design?type=design&node-id=733-6359&mode=design&t=CWLm1rDjU9r3ycwv-4', + }, + }, + component: IngrInputBox, + args: { + type: 'input', + }, +}; +export default meta; + +type Story = StoryObj; + +export const IngrInputBoxTypeInput: Story = {}; +export const IngrInputBoxTypeEdit: Story = { + args: { + type: 'edit', + }, +}; diff --git a/src/pages/inventory/components/ShortExpirationItem.stories.tsx b/src/pages/inventory/components/ShortExpirationItem.stories.tsx new file mode 100644 index 0000000..7fd6374 --- /dev/null +++ b/src/pages/inventory/components/ShortExpirationItem.stories.tsx @@ -0,0 +1,37 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import moment from 'moment'; +import ShortExpirationItem from './ShortExpirationItem'; + +const meta: Meta = { + parameters: { + design: { + type: 'figma', + url: 'https://www.figma.com/file/6Tcv8DaxZwjY4NYH0NAhmz/Design?type=design&node-id=733-6585&mode=design&t=CWLm1rDjU9r3ycwv-4', + }, + }, + component: ShortExpirationItem, + args: { + item: { + name: '김치', + quantity: '3개', + registrationDate: moment('2023-02-05'), + expirationDate: moment('2024-02-05'), + }, + }, +}; +export default meta; + +type Story = StoryObj; + +export const ShortExpirationItemDefault: Story = {}; + +export const ShortExpirationItemExpired: Story = { + args: { + item: { + name: '김치', + quantity: '3개', + registrationDate: moment('2023-02-05'), + expirationDate: moment('2021-02-05'), + }, + }, +}; diff --git a/vite.config.ts b/vite.config.ts index c29ff12..f2a12a6 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -27,7 +27,4 @@ export default defineConfig({ '@': fileURLToPath(new URL('./src', import.meta.url)), }, }, - // define: { - // global: {}, - // }, }); From b4e587cfd9c639ac850d9890c79be526754b5bc1 Mon Sep 17 00:00:00 2001 From: chocoboy08 Date: Mon, 12 Feb 2024 00:28:14 +0900 Subject: [PATCH 11/11] refactor: :recycle: reflect code reviews MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 코드 리뷰에서 언급된 수정사항들을 수정했습니다 --- .../inventory/components/IngrInputBox.tsx | 62 ++--- .../components/ShortExpirationItem.tsx | 25 +- src/pages/inventory/index.tsx | 216 +++++++++--------- src/pages/inventory/react_dates_overrides.css | 1 + 4 files changed, 150 insertions(+), 154 deletions(-) diff --git a/src/pages/inventory/components/IngrInputBox.tsx b/src/pages/inventory/components/IngrInputBox.tsx index cdbbfec..9a94cac 100644 --- a/src/pages/inventory/components/IngrInputBox.tsx +++ b/src/pages/inventory/components/IngrInputBox.tsx @@ -44,7 +44,7 @@ const styles = { }), }; interface IngrInputBoxProps extends HTMLAttributes { - type: string; + type: 'input' | 'edit' | 'list'; item?: IngredientDataType; submit?: boolean; handleDataChange?: (inputData: IngredientDataType) => void; @@ -67,21 +67,12 @@ function IngrInputBox({ ); const [expirationDate, setExpirationDate] = useState(null); - const [inputData, setInputData] = useState( - item - ? { - name: item.name, - quantity: item.quantity, - registrationDate: item.registrationDate, - expirationDate: item.expirationDate, - } - : { - name: '', - quantity: '', - registrationDate: registrationDate, - expirationDate: expirationDate, - }, - ); + const [inputData, setInputData] = useState({ + name: item?.name || '', + quantity: item?.quantity || '', + registrationDate: item?.registrationDate || registrationDate, + expirationDate: item?.expirationDate || expirationDate, + }); const [isComposing, composeProps] = useComposing(); const handleKeyDown = @@ -110,7 +101,8 @@ function IngrInputBox({ } }, [type]); const inputRef = useRef(null); - return type === 'input' || type === 'edit' ? ( + + return ( {type === 'edit' && ( { setInputData({ ...inputData, registrationDate: date }); }} + type={type} targetRef={inputRef} > 등록일자 설정 @@ -174,29 +169,13 @@ function IngrInputBox({ setInputDate={(date: Moment) => { setInputData({ ...inputData, expirationDate: date }); }} + type={type} placeholder="유통기한 날짜를 선택해주세요." targetRef={inputRef} > 유통기한 설정 - ) : ( - - - {inputData.name} - - - {inputData.quantity} - - - {inputData.registrationDate.format('YYYY/MM/DD').toString()} - - - {inputData.expirationDate - ? inputData.expirationDate.format('YYYY/MM/DD').toString() - : ''} - - ); } @@ -207,6 +186,7 @@ interface CustomCalenderProps extends HTMLAttributes { inputDate: Moment | null; setInputDate: (date: Moment) => void; targetRef: React.RefObject; + type: 'input' | 'edit' | 'list'; } const CustomCalender = ({ @@ -214,10 +194,15 @@ const CustomCalender = ({ inputDate, setInputDate, targetRef, + type, ...props }: CustomCalenderProps) => { const [focus, setFocus] = useState(false); - return ( + return type === 'list' ? ( + + {inputDate?.format('YYYY/MM/DD').toString()} + + ) : ( { @@ -281,8 +266,9 @@ const CustomCalender = ({ appendToBody disableScroll daySize={48} + verticalSpacing={9} {...props} - id="unique-id" + id={`${children}-${type}`} /> ); }; diff --git a/src/pages/inventory/components/ShortExpirationItem.tsx b/src/pages/inventory/components/ShortExpirationItem.tsx index cce7ce7..225d1bf 100644 --- a/src/pages/inventory/components/ShortExpirationItem.tsx +++ b/src/pages/inventory/components/ShortExpirationItem.tsx @@ -2,7 +2,7 @@ import { ReactComponent as IconCaution } from '@/assets/icon-caution.svg'; import DesignSystem from '@/utils/designSystem'; import { Group, Stack, Typography } from '@base'; import { css } from '@emotion/react'; -import moment from 'moment'; +import moment, { Moment } from 'moment'; import { IngredientDataType } from '..'; interface ShortExpirationItemProps { item: IngredientDataType; @@ -12,30 +12,29 @@ const styles = { backgroundColor: DesignSystem.Color.background.gray, border: '1px solid', borderColor: DesignSystem.Color.background.black, + marginLeft: -1, boxSizing: 'border-box', width: 317, padding: '17.5px 119px 32px 18.6px', }), + bgColor: (expirationDate: Moment | null) => { + return { + backgroundColor: expirationDate?.isBefore(moment()) + ? DesignSystem.Color.primary.yellow + : DesignSystem.Color.background.gray, + }; + }, }; function ShortExpirationItem({ item }: ShortExpirationItemProps) { return ( - + {item.name} {item.expirationDate?.isBefore(moment()) && ( )} - + 수량 : {item.quantity} 등록 일자 : {item.registrationDate?.format('YYYY/MM/DD').toString()} @@ -44,7 +43,7 @@ function ShortExpirationItem({ item }: ShortExpirationItemProps) { 유통기한 : {item.expirationDate?.format('YYYY/MM/DD').toString()} - + ); } diff --git a/src/pages/inventory/index.tsx b/src/pages/inventory/index.tsx index 18ced6d..b3b7acd 100644 --- a/src/pages/inventory/index.tsx +++ b/src/pages/inventory/index.tsx @@ -13,7 +13,7 @@ import { mockRecipeData } from '../home'; import IngrInputBox from './components/IngrInputBox'; import ShortExpirationItem from './components/ShortExpirationItem'; const styles = { - wrapper: css({}), + wrapper: css({ paddingBottom: 100 }), inventory: { background: css( { @@ -39,6 +39,37 @@ const styles = { boxSizing: 'border-box', overflow: 'hidden', }), + scrollBox: css({ + overflowX: 'hidden', + overflowY: 'scroll', + marginRight: 37, + zIndex: 2, + '&::-webkit-scrollbar': { + borderRadius: 19, + width: 10, + zIndex: 1, + }, + '&::-webkit-scrollbar-thumb': { + backgroundColor: DesignSystem.Color.text.gray, + borderRadius: 19, + }, + '&::-webkit-scrollbar-track': { + backgroundColor: 'transparent', + }, + + '&::-webkit-scrollbar-track-piece:end': { + backgroundColor: 'transparent', + marginBottom: 13, + }, + }), + scrollTrackStart: (isEditing: boolean) => { + return { + '&::-webkit-scrollbar-track-piece:start': { + backgroundColor: 'transparent', + marginTop: isEditing ? 125 : 38, + }, + }; + }, scrollBar: css({ backgroundColor: DesignSystem.Color.background.disabled, position: 'absolute', @@ -55,7 +86,48 @@ const styles = { }, }, }; - +const mockIngredientData: IngredientDataType[][] = [ + [ + { + name: '김치', + quantity: '3개', + registrationDate: moment('2023-02-05'), + expirationDate: moment('2026-02-05'), + }, + { + name: '소고기', + quantity: '300g', + registrationDate: moment('2023-02-05'), + expirationDate: moment('2023-02-05'), + }, + { + name: '양파', + quantity: '5개', + registrationDate: moment('2023-02-05'), + expirationDate: moment('2023-02-05'), + }, + { + name: '양파', + quantity: '5개', + registrationDate: moment('2023-02-05'), + expirationDate: moment('2023-02-05'), + }, + ], + [ + { + name: '양파', + quantity: '5개', + registrationDate: moment('2023-02-05'), + expirationDate: moment('2023-02-05'), + }, + { + name: '양파', + quantity: '5개', + registrationDate: moment('2023-02-05'), + expirationDate: moment('2023-02-05'), + }, + ], +]; export interface IngredientDataType { name: string; quantity: string; @@ -71,88 +143,48 @@ function Inventory() { const [currentPage, setCurrentPage] = useState(1); const checkRef = useRef(null); - const mockIngredientData: IngredientDataType[][] = [ - [ - { - name: '김치', - quantity: '3개', - registrationDate: moment('2023-02-05'), - expirationDate: moment('2024-02-05'), - }, - { - name: '소고기', - quantity: '300g', - registrationDate: moment('2023-02-05'), - expirationDate: moment('2023-02-05'), - }, - { - name: '양파', - quantity: '5개', - registrationDate: moment('2023-02-05'), - expirationDate: moment('2023-02-05'), - }, - { - name: '양파', - quantity: '5개', - registrationDate: moment('2023-02-05'), - expirationDate: moment('2023-02-05'), - }, - ], - [ - { - name: '양파', - quantity: '5개', - registrationDate: moment('2023-02-05'), - expirationDate: moment('2023-02-05'), - }, - { - name: '양파', - quantity: '5개', - registrationDate: moment('2023-02-05'), - expirationDate: moment('2023-02-05'), - }, - ], - ]; - const handleDataChange = (inputData: IngredientDataType) => { setData([{ ...inputData }, ...data]); }; - const handleEditing = (targetIdx: number, inputData: IngredientDataType) => { + const handleEdit = () => { + setIsEditing(!isEditing); + setSubmit(false); + }; + const handleContentEdit = ( + targetIdx: number, + inputData: IngredientDataType, + ) => { setData(data.map((item, idx) => (targetIdx === idx ? inputData : item))); }; const handleDelete = (targetIdx: number) => { setData(data.filter((_, idx) => idx !== targetIdx)); }; + const handleComplete = () => { + setIsEditing(!isEditing); + setSubmit(true); + }; useEffect(() => { setIsOverflowed( !!checkRef.current && - checkRef?.current.scrollHeight > checkRef.current?.clientHeight, + checkRef.current?.scrollHeight > checkRef.current?.clientHeight, ); - }); + }, [checkRef.current?.clientHeight]); + return ( - + INVENTORY - {isEditing ? ( - { - setIsEditing(!isEditing); - setSubmit(true); - }} - /> - ) : ( - { - data.length !== 0 && setIsEditing(!isEditing); - setSubmit(false); - }} - /> - )} + {data.length !== 0 && + (isEditing ? ( + + ) : ( + + ))} @@ -223,32 +255,10 @@ function Inventory() { /> )} { - handleEditing(idx, input); + handleContentEdit(idx, input); }} handleRemove={() => { handleDelete(idx); }} - key={`${idx}-${item.name}-${item.registrationDate}`} + key={`ingredient-${item.name}-${item.registrationDate}`} /> ); })} @@ -281,17 +291,16 @@ function Inventory() { 유통기한이 얼마 남지 않은 재료 -
- {mockIngredientData[currentPage - 1].map((item, idx) => { - return ; + + {mockIngredientData[currentPage - 1].map((item) => { + return ( + + ); })} -
+
( ))} diff --git a/src/pages/inventory/react_dates_overrides.css b/src/pages/inventory/react_dates_overrides.css index 4872389..85f8438 100644 --- a/src/pages/inventory/react_dates_overrides.css +++ b/src/pages/inventory/react_dates_overrides.css @@ -9,6 +9,7 @@ font-style: normal; } .SingleDatePicker_picker { + position: fixed; z-index: 3; } /*인풋박스*/