diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..5d77abd --- /dev/null +++ b/.env.example @@ -0,0 +1,2 @@ +VITE_TASTY_API_KEY= +VITE_TASTY_API_URL= \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 0dca328..2bf3666 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,433 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [0.0.32](https://github.com/chingu-voyages/v46-tier2-team-19/compare/v0.0.31...v0.0.32) (2023-11-13) + +### [0.0.31](https://github.com/chingu-voyages/v46-tier2-team-19/compare/v0.0.30...v0.0.31) (2023-11-12) + + +### Features + +* add .env.example file with VITE_TASTY_API_KEY and VITE_TASTY_API_URL variables ([d80878c](https://github.com/chingu-voyages/v46-tier2-team-19/commit/d80878c4aac42bb14fa6e8cecd9f985c06f04cc0)) +* add screenshot-home-dev.png to public directory ([e389efd](https://github.com/chingu-voyages/v46-tier2-team-19/commit/e389efd2570478588f4f6e4d2440caddeceb9175)) +* **main:** suppress console logs in non-development environments ([f329eb1](https://github.com/chingu-voyages/v46-tier2-team-19/commit/f329eb1d061705241f1e9fdb303fc1fcdedd455c)) +* **recipe details:** add graphics to recipe details page ([3158a3f](https://github.com/chingu-voyages/v46-tier2-team-19/commit/3158a3f7716eb1700164631fc34814cbe5ce522e)) + + +### Bug Fixes + +* **instructions.jsx:** layout fix for mobile screens ([b0d483e](https://github.com/chingu-voyages/v46-tier2-team-19/commit/b0d483e08d5c1e7597a0d5a77f4a4d90f1f42bd7)) +* **recipedetails:** add padding across top of recipe details page ([7b0b1d9](https://github.com/chingu-voyages/v46-tier2-team-19/commit/7b0b1d98621560aaac41177aa2feff4862d11c9b)) +* **tips:** avoid overlapped text in tips section ([6c8746a](https://github.com/chingu-voyages/v46-tier2-team-19/commit/6c8746a36aeaef0bd064e6577707c936d970f36a)) + +### [0.0.29](https://github.com/chingu-voyages/v46-tier2-team-19/compare/v0.0.28...v0.0.29) (2023-11-12) + + +### Features + +* **constants/index.js:** reorder header & footer menu items ([72fd3af](https://github.com/chingu-voyages/v46-tier2-team-19/commit/72fd3af6809c2f8349d37da441aad01118741d2f)) + +### [0.0.30](https://github.com/chingu-voyages/v46-tier2-team-19/compare/v0.0.28...v0.0.30) (2023-11-12) + + +### Features + +* **assets:** add art and picture components ([51554a1](https://github.com/chingu-voyages/v46-tier2-team-19/commit/51554a12b884d332c7bc3d185c6661927379b85f)) +* **tags.jsx:** add hover effect to recipe tag links ([5b38dae](https://github.com/chingu-voyages/v46-tier2-team-19/commit/5b38dae501f0a9397d9f1d014cdceec58d1afaa1)) + + +### Bug Fixes + +* **recipe-list.jsx:** add replace prop to Navigate component to prevent history stack overflow ([c4e8648](https://github.com/chingu-voyages/v46-tier2-team-19/commit/c4e8648df720890cbc469536bcb399ee1dd5c77d)) + +### [0.0.27](https://github.com/chingu-voyages/v46-tier2-team-19/compare/v0.0.26...v0.0.27) (2023-11-10) + + +### Features + +* **search.jsx:** enhance page heading and adjust layout for better user experience ([25ff48a](https://github.com/chingu-voyages/v46-tier2-team-19/commit/25ff48a4f43bc6fe249ed4f0e5580e5154730ed7)) + + +### [0.0.29](https://github.com/chingu-voyages/v46-tier2-team-19/compare/v0.0.28...v0.0.29) (2023-11-12) + + +### Features + + +* **tags.jsx:** add hover effect to recipe tag links ([5b38dae](https://github.com/chingu-voyages/v46-tier2-team-19/commit/5b38dae501f0a9397d9f1d014cdceec58d1afaa1)) +* **assets:** add art and picture components ([51554a1](https://github.com/chingu-voyages/v46-tier2-team-19/commit/51554a12b884d332c7bc3d185c6661927379b85f)) +* **constants/index.js:** reorder header & footer menu items ([72fd3af](https://github.com/chingu-voyages/v46-tier2-team-19/commit/72fd3af6809c2f8349d37da441aad01118741d2f)) +* add .env.example file with VITE_TASTY_API_KEY and VITE_TASTY_API_URL variables ([d80878c](https://github.com/chingu-voyages/v46-tier2-team-19/commit/d80878c4aac42bb14fa6e8cecd9f985c06f04cc0)) +* add screenshot-home-dev.png to public directory ([e389efd](https://github.com/chingu-voyages/v46-tier2-team-19/commit/e389efd2570478588f4f6e4d2440caddeceb9175)) +* **assets:** add art and picture components ([51554a1](https://github.com/chingu-voyages/v46-tier2-team-19/commit/51554a12b884d332c7bc3d185c6661927379b85f)) +* **main:** suppress console logs in non-development environments ([f329eb1](https://github.com/chingu-voyages/v46-tier2-team-19/commit/f329eb1d061705241f1e9fdb303fc1fcdedd455c)) + + + +### Bug Fixes + +* **recipe-list.jsx:** add replace prop to Navigate component to prevent history stack overflow ([c4e8648](https://github.com/chingu-voyages/v46-tier2-team-19/commit/c4e8648df720890cbc469536bcb399ee1dd5c77d)) + +### [0.0.27](https://github.com/chingu-voyages/v46-tier2-team-19/compare/v0.0.26...v0.0.27) (2023-11-10) + + +### Features + +* **search.jsx:** enhance page heading and adjust layout for better user experience ([25ff48a](https://github.com/chingu-voyages/v46-tier2-team-19/commit/25ff48a4f43bc6fe249ed4f0e5580e5154730ed7)) + +### [0.0.28](https://github.com/chingu-voyages/v46-tier2-team-19/compare/v0.0.26...v0.0.28) (2023-11-11) + +### Features + + +* **search.jsx:** enhance page heading and adjust layout for better user experience ([25ff48a](https://github.com/chingu-voyages/v46-tier2-team-19/commit/25ff48a4f43bc6fe249ed4f0e5580e5154730ed7)) + +* **favorites.jsx:** display confirmation modal on Clear Favorites button click ([fffd05f](https://github.com/chingu-voyages/v46-tier2-team-19/commit/fffd05f305d5964837d4c0b02577e46fddc905c6)) + +### [0.0.27](https://github.com/chingu-voyages/v46-tier2-team-19/compare/v0.0.26...v0.0.27) (2023-11-11) + + +### Features + +* **favorites.jsx:** display confirmation modal on Clear Favorites button click ([fffd05f](https://github.com/chingu-voyages/v46-tier2-team-19/commit/fffd05f305d5964837d4c0b02577e46fddc905c6)) + + +### [0.0.26](https://github.com/chingu-voyages/v46-tier2-team-19/compare/v0.0.25...v0.0.26) (2023-11-10) + + +### Features + +* **spa:** add ScrollToTop function to scroll to top on route change ([0375a27](https://github.com/chingu-voyages/v46-tier2-team-19/commit/0375a277044662816871dd33d885f148048a30d2)) + + +### Bug Fixes + +* **list.json:** add the feature of the day recipe to the list.json ([edf754d](https://github.com/chingu-voyages/v46-tier2-team-19/commit/edf754d7be627f2bf3e071e1895b40429e67c6db)) +* **recipe-list.jsx:** add null checks to prevent errors when recipes or tags are undefined ([0bb52a2](https://github.com/chingu-voyages/v46-tier2-team-19/commit/0bb52a2fb5478a2fa1bb53513f818767ac400cd3)) + +### [0.0.24](https://github.com/chingu-voyages/v46-tier2-team-19/compare/v0.0.23...v0.0.24) (2023-11-10) + + +### Features + +* **vite.config.js:** add file extensions to resolve property to enhance module resolution ([e146574](https://github.com/chingu-voyages/v46-tier2-team-19/commit/e146574a268a1f780668862da511eaa1ca9b44ce)) +* **vite.config.js:** add support for .jsx file extensions ([4031e75](https://github.com/chingu-voyages/v46-tier2-team-19/commit/4031e7541c717c31777fa4d7ac7529ea67b1c07f)) + + +### Bug Fixes + +* **about.jsx:** fix YumYumTeam heading responsiveness ([b38bcf3](https://github.com/chingu-voyages/v46-tier2-team-19/commit/b38bcf36aa32ee30aa925c0c414600d534ce1b1c)) +* **filters:** correct the file name in the export statement from 'filters' to 'Filters.jsx' ([152941b](https://github.com/chingu-voyages/v46-tier2-team-19/commit/152941b7f508525ba1c7240f6cf616b4fb2b19f3)) +* **recipe-list.jsx:** change initial value of reduce function from object to array ([d7de903](https://github.com/chingu-voyages/v46-tier2-team-19/commit/d7de903684d452378043f03fe85391a421ea3227)) + +### [0.0.23](https://github.com/chingu-voyages/v46-tier2-team-19/compare/v0.0.22...v0.0.23) (2023-11-08) + + +### Features + +* **about.jsx:** add y3-shadow-md-inner class to About page ([4d82459](https://github.com/chingu-voyages/v46-tier2-team-19/commit/4d82459a4c483bcb430ba9ac814842cdfed1c1b2)) +* **global.css:** create y3-shadow-md-inner class ([7c67434](https://github.com/chingu-voyages/v46-tier2-team-19/commit/7c674343fbcc3be4d6c6a3dd24bff81b3db03f28)) + +### [0.0.22](https://github.com/chingu-voyages/v46-tier2-team-19/compare/v0.0.21...v0.0.22) (2023-11-08) + + +### Bug Fixes + +* **about.jsx:** removed white stroke around main heading & deleted deprecated comments ([9453c1e](https://github.com/chingu-voyages/v46-tier2-team-19/commit/9453c1e545b666b7b97a71fa8d8f83e899124f85)) + +### [0.0.21](https://github.com/chingu-voyages/v46-tier2-team-19/compare/v0.0.20...v0.0.21) (2023-11-08) + + +### Features + +* **avatar-henri.jpg:** add image of Henri ([35f9be5](https://github.com/chingu-voyages/v46-tier2-team-19/commit/35f9be5367ceeb0c885349939d7f6b74032b9677)) +* **constants/teamdata.js:** add team member info for Henri ([70ca20d](https://github.com/chingu-voyages/v46-tier2-team-19/commit/70ca20d02e2901f78d98e16dceb50c0f64b77338)) +* **filters:** create a tags filter component ([cd39e40](https://github.com/chingu-voyages/v46-tier2-team-19/commit/cd39e40f8c93e5494ea157d55a43af9ca0c65f58)) +* **recipe-list.jsx:** add tag filtering functionality to recipe list ([fdc6526](https://github.com/chingu-voyages/v46-tier2-team-19/commit/fdc6526c9f0b7050c247f776c753b0a79bf3db5e)) +* **recipe-list.jsx:** added filter component ([65f98f0](https://github.com/chingu-voyages/v46-tier2-team-19/commit/65f98f052db727371dae8dcde60a46722317b490)) + +### [0.0.25](https://github.com/chingu-voyages/v46-tier2-team-19/compare/v0.0.20...v0.0.25) (2023-11-10) + + +### Features + +* **api:** add new tips.js file to fetch tips from Tasty API ([da69610](https://github.com/chingu-voyages/v46-tier2-team-19/commit/da69610c0c2e18c5daabfc02521618f16e05a996)) +* **mirageserver:** add tips.json and endpoint for tips in server.js ([ad337dc](https://github.com/chingu-voyages/v46-tier2-team-19/commit/ad337dcc0b65abd43131ac8c80b571a569d583c0)) +* **package.json, package-lock.json:** add react-responsive-carousel package ([713c339](https://github.com/chingu-voyages/v46-tier2-team-19/commit/713c3395219ec7b41c6cd31afb7c76b99af17ca4)) +* **recipe details:** continue improving responsive layout ([83e4357](https://github.com/chingu-voyages/v46-tier2-team-19/commit/83e4357964e724c1919ca2e3a32f26c4ebffaa24)) +* **recipes/api:** add fetch-tips-by-id.js to fetch tips by recipe id ([de66f72](https://github.com/chingu-voyages/v46-tier2-team-19/commit/de66f72afa817a209c798a59eab2ff90c0faad9a)) +* **tips.jsx:** implement dynamic tips fetching and display in a carousel ([a23fa0b](https://github.com/chingu-voyages/v46-tier2-team-19/commit/a23fa0ba7dd14f008310eca182459cc3934b8437)) + + +### Bug Fixes + +* **about.jsx:** fix responsive spacing around team members at larger viewport widths ([6b2c4ee](https://github.com/chingu-voyages/v46-tier2-team-19/commit/6b2c4ee830ee494ff6e426a80467ba9ce6ab9ffe)) +* **about.jsx:** remove stroke from team member role heading ([d50ab83](https://github.com/chingu-voyages/v46-tier2-team-19/commit/d50ab83bee449097aab00061dabd3dd383908c03)) +* **fetchrecipes:** wrap localStorage.setItem in try/catch block ([14330bc](https://github.com/chingu-voyages/v46-tier2-team-19/commit/14330bcfd6a2a7879f9c40d4e4bd62c5e79f1dda)) +* **matchsearchid:** replace negative lookahead with capturing group (for Safari) ([9a79455](https://github.com/chingu-voyages/v46-tier2-team-19/commit/9a79455099d8d0c2f6af5902bb78f858a06572d8)) + +### [0.0.24](https://github.com/chingu-voyages/v46-tier2-team-19/compare/v0.0.20...v0.0.24) (2023-11-10) + + +### Features + +* **api:** add new tips.js file to fetch tips from Tasty API ([da69610](https://github.com/chingu-voyages/v46-tier2-team-19/commit/da69610c0c2e18c5daabfc02521618f16e05a996)) +* **mirageserver:** add tips.json and endpoint for tips in server.js ([ad337dc](https://github.com/chingu-voyages/v46-tier2-team-19/commit/ad337dcc0b65abd43131ac8c80b571a569d583c0)) +* **package.json, package-lock.json:** add react-responsive-carousel package ([713c339](https://github.com/chingu-voyages/v46-tier2-team-19/commit/713c3395219ec7b41c6cd31afb7c76b99af17ca4)) +* **recipe details:** continue improving responsive layout ([83e4357](https://github.com/chingu-voyages/v46-tier2-team-19/commit/83e4357964e724c1919ca2e3a32f26c4ebffaa24)) +* **recipes/api:** add fetch-tips-by-id.js to fetch tips by recipe id ([de66f72](https://github.com/chingu-voyages/v46-tier2-team-19/commit/de66f72afa817a209c798a59eab2ff90c0faad9a)) +* **tips.jsx:** implement dynamic tips fetching and display in a carousel ([a23fa0b](https://github.com/chingu-voyages/v46-tier2-team-19/commit/a23fa0ba7dd14f008310eca182459cc3934b8437)) + + +### Bug Fixes + +* **about.jsx:** fix responsive spacing around team members at larger viewport widths ([6b2c4ee](https://github.com/chingu-voyages/v46-tier2-team-19/commit/6b2c4ee830ee494ff6e426a80467ba9ce6ab9ffe)) +* **about.jsx:** remove stroke from team member role heading ([d50ab83](https://github.com/chingu-voyages/v46-tier2-team-19/commit/d50ab83bee449097aab00061dabd3dd383908c03)) +* **fetchrecipes:** wrap localStorage.setItem in try/catch block ([14330bc](https://github.com/chingu-voyages/v46-tier2-team-19/commit/14330bcfd6a2a7879f9c40d4e4bd62c5e79f1dda)) +* **matchsearchid:** replace negative lookahead with capturing group (for Safari) ([9a79455](https://github.com/chingu-voyages/v46-tier2-team-19/commit/9a79455099d8d0c2f6af5902bb78f858a06572d8)) + +### [0.0.23](https://github.com/chingu-voyages/v46-tier2-team-19/compare/v0.0.20...v0.0.23) (2023-11-10) + + +### Features + +* **api:** add new tips.js file to fetch tips from Tasty API ([da69610](https://github.com/chingu-voyages/v46-tier2-team-19/commit/da69610c0c2e18c5daabfc02521618f16e05a996)) +* **mirageserver:** add tips.json and endpoint for tips in server.js ([ad337dc](https://github.com/chingu-voyages/v46-tier2-team-19/commit/ad337dcc0b65abd43131ac8c80b571a569d583c0)) +* **package.json, package-lock.json:** add react-responsive-carousel package ([713c339](https://github.com/chingu-voyages/v46-tier2-team-19/commit/713c3395219ec7b41c6cd31afb7c76b99af17ca4)) +* **recipe details:** continue improving responsive layout ([83e4357](https://github.com/chingu-voyages/v46-tier2-team-19/commit/83e4357964e724c1919ca2e3a32f26c4ebffaa24)) +* **recipes/api:** add fetch-tips-by-id.js to fetch tips by recipe id ([de66f72](https://github.com/chingu-voyages/v46-tier2-team-19/commit/de66f72afa817a209c798a59eab2ff90c0faad9a)) +* **tips.jsx:** implement dynamic tips fetching and display in a carousel ([a23fa0b](https://github.com/chingu-voyages/v46-tier2-team-19/commit/a23fa0ba7dd14f008310eca182459cc3934b8437)) + + +### Bug Fixes + +* **about.jsx:** fix responsive spacing around team members at larger viewport widths ([6b2c4ee](https://github.com/chingu-voyages/v46-tier2-team-19/commit/6b2c4ee830ee494ff6e426a80467ba9ce6ab9ffe)) +* **about.jsx:** remove stroke from team member role heading ([d50ab83](https://github.com/chingu-voyages/v46-tier2-team-19/commit/d50ab83bee449097aab00061dabd3dd383908c03)) +* **fetchrecipes:** wrap localStorage.setItem in try/catch block ([14330bc](https://github.com/chingu-voyages/v46-tier2-team-19/commit/14330bcfd6a2a7879f9c40d4e4bd62c5e79f1dda)) +* **matchsearchid:** replace negative lookahead with capturing group (for Safari) ([9a79455](https://github.com/chingu-voyages/v46-tier2-team-19/commit/9a79455099d8d0c2f6af5902bb78f858a06572d8)) + +### [0.0.22](https://github.com/chingu-voyages/v46-tier2-team-19/compare/v0.0.20...v0.0.22) (2023-11-10) + + +### Features + +* **about.jsx:** add y3-shadow-md-inner class to About page ([4d82459](https://github.com/chingu-voyages/v46-tier2-team-19/commit/4d82459a4c483bcb430ba9ac814842cdfed1c1b2)) +* **api:** add new tips.js file to fetch tips from Tasty API ([da69610](https://github.com/chingu-voyages/v46-tier2-team-19/commit/da69610c0c2e18c5daabfc02521618f16e05a996)) +* **global.css:** create y3-shadow-md-inner class ([7c67434](https://github.com/chingu-voyages/v46-tier2-team-19/commit/7c674343fbcc3be4d6c6a3dd24bff81b3db03f28)) +* **mirageserver:** add tips.json and endpoint for tips in server.js ([ad337dc](https://github.com/chingu-voyages/v46-tier2-team-19/commit/ad337dcc0b65abd43131ac8c80b571a569d583c0)) +* **package.json, package-lock.json:** add react-responsive-carousel package ([713c339](https://github.com/chingu-voyages/v46-tier2-team-19/commit/713c3395219ec7b41c6cd31afb7c76b99af17ca4)) +* **recipe details:** continue improving responsive layout ([83e4357](https://github.com/chingu-voyages/v46-tier2-team-19/commit/83e4357964e724c1919ca2e3a32f26c4ebffaa24)) +* **recipes/api:** add fetch-tips-by-id.js to fetch tips by recipe id ([de66f72](https://github.com/chingu-voyages/v46-tier2-team-19/commit/de66f72afa817a209c798a59eab2ff90c0faad9a)) +* **tips.jsx:** implement dynamic tips fetching and display in a carousel ([a23fa0b](https://github.com/chingu-voyages/v46-tier2-team-19/commit/a23fa0ba7dd14f008310eca182459cc3934b8437)) + + +### Bug Fixes + +* **about.jsx:** fix responsive spacing around team members at larger viewport widths ([6b2c4ee](https://github.com/chingu-voyages/v46-tier2-team-19/commit/6b2c4ee830ee494ff6e426a80467ba9ce6ab9ffe)) +* **about.jsx:** remove stroke from team member role heading ([d50ab83](https://github.com/chingu-voyages/v46-tier2-team-19/commit/d50ab83bee449097aab00061dabd3dd383908c03)) +* **about.jsx:** fix YumYumTeam heading responsiveness ([b38bcf3](https://github.com/chingu-voyages/v46-tier2-team-19/commit/b38bcf36aa32ee30aa925c0c414600d534ce1b1c)) +* **fetchrecipes:** wrap localStorage.setItem in try/catch block ([14330bc](https://github.com/chingu-voyages/v46-tier2-team-19/commit/14330bcfd6a2a7879f9c40d4e4bd62c5e79f1dda)) +* **matchsearchid:** replace negative lookahead with capturing group (for Safari) ([9a79455](https://github.com/chingu-voyages/v46-tier2-team-19/commit/9a79455099d8d0c2f6af5902bb78f858a06572d8)) + +### [0.0.21](https://github.com/chingu-voyages/v46-tier2-team-19/compare/v0.0.20...v0.0.21) (2023-11-10) + + +### Features + +* **api:** add new tips.js file to fetch tips from Tasty API ([da69610](https://github.com/chingu-voyages/v46-tier2-team-19/commit/da69610c0c2e18c5daabfc02521618f16e05a996)) +* **mirageserver:** add tips.json and endpoint for tips in server.js ([ad337dc](https://github.com/chingu-voyages/v46-tier2-team-19/commit/ad337dcc0b65abd43131ac8c80b571a569d583c0)) +* **package.json, package-lock.json:** add react-responsive-carousel package ([713c339](https://github.com/chingu-voyages/v46-tier2-team-19/commit/713c3395219ec7b41c6cd31afb7c76b99af17ca4)) +* **recipe details:** continue improving responsive layout ([83e4357](https://github.com/chingu-voyages/v46-tier2-team-19/commit/83e4357964e724c1919ca2e3a32f26c4ebffaa24)) +* **recipes/api:** add fetch-tips-by-id.js to fetch tips by recipe id ([de66f72](https://github.com/chingu-voyages/v46-tier2-team-19/commit/de66f72afa817a209c798a59eab2ff90c0faad9a)) +* **tips.jsx:** implement dynamic tips fetching and display in a carousel ([a23fa0b](https://github.com/chingu-voyages/v46-tier2-team-19/commit/a23fa0ba7dd14f008310eca182459cc3934b8437)) + + +### Bug Fixes + +* **about.jsx:** fix responsive spacing around team members at larger viewport widths ([6b2c4ee](https://github.com/chingu-voyages/v46-tier2-team-19/commit/6b2c4ee830ee494ff6e426a80467ba9ce6ab9ffe)) +* **about.jsx:** remove stroke from team member role heading ([d50ab83](https://github.com/chingu-voyages/v46-tier2-team-19/commit/d50ab83bee449097aab00061dabd3dd383908c03)) +* **about.jsx:** fix YumYumTeam heading responsiveness ([b38bcf3](https://github.com/chingu-voyages/v46-tier2-team-19/commit/b38bcf36aa32ee30aa925c0c414600d534ce1b1c)) +* **about.jsx:** removed white stroke around main heading & deleted deprecated comments ([9453c1e](https://github.com/chingu-voyages/v46-tier2-team-19/commit/9453c1e545b666b7b97a71fa8d8f83e899124f85)) +* **fetchrecipes:** wrap localStorage.setItem in try/catch block ([14330bc](https://github.com/chingu-voyages/v46-tier2-team-19/commit/14330bcfd6a2a7879f9c40d4e4bd62c5e79f1dda)) +* **matchsearchid:** replace negative lookahead with capturing group (for Safari) ([9a79455](https://github.com/chingu-voyages/v46-tier2-team-19/commit/9a79455099d8d0c2f6af5902bb78f858a06572d8)) + +### [0.0.20](https://github.com/chingu-voyages/v46-tier2-team-19/compare/v0.0.19...v0.0.20) (2023-11-08) + + +### Bug Fixes + +* **about.jsx:** add float clears ([b84ae15](https://github.com/chingu-voyages/v46-tier2-team-19/commit/b84ae154a48f2ebe31b04d983c37992d314808d6)) + +### [0.0.19](https://github.com/chingu-voyages/v46-tier2-team-19/compare/v0.0.18...v0.0.19) (2023-11-07) + + +### Features + +* **about.jsx:** add new styling to About page ([80ee2fd](https://github.com/chingu-voyages/v46-tier2-team-19/commit/80ee2fd44cc3efbdb4a23db9a7276b1b011a6600)) +* **assets/about/*.png:** add new images for About page ([0456718](https://github.com/chingu-voyages/v46-tier2-team-19/commit/045671847efb4f3869a154a23ddaf274789f6995)) +* **constants/teamdata.js:** modify team data info ([cecdd74](https://github.com/chingu-voyages/v46-tier2-team-19/commit/cecdd741a855433d9992f3bc0a3d4ec220e9704e)) +* **feature-of-day.jsx:** replace FeatureRecipe with FeatureChickenRecipe, add navigation to recipe ([093bbff](https://github.com/chingu-voyages/v46-tier2-team-19/commit/093bbffb7996e935da74dcd0927183b161a7535d)) +* **notfoundpage:** not Found Page added,user is redirect to the 404 when there are not any recipe ([2a8dd3b](https://github.com/chingu-voyages/v46-tier2-team-19/commit/2a8dd3b3420df831403960bb791e31d59d4b0ad7)) +* **recipe details:** continue improving Difficulty Card and Overall Layout ([b57d65b](https://github.com/chingu-voyages/v46-tier2-team-19/commit/b57d65baf6c941a94d0956d03af5e7779e3bf662)) +* **recipe-list.jsx:** replace static loading text with LoadingState component ([ec31982](https://github.com/chingu-voyages/v46-tier2-team-19/commit/ec319828c73129d3b2a9e4a6db3f339ca1b0605d)) +* **search.jsx:** add FeatureOfTheDay component and colorful balls to the search page ([4cdaec4](https://github.com/chingu-voyages/v46-tier2-team-19/commit/4cdaec4df4e5e8312f13f5db46b2c916c2469bf3)) +* **tailwind.config.js:** add GreenBall asset to tailwind configuration ([3b93d08](https://github.com/chingu-voyages/v46-tier2-team-19/commit/3b93d088c64e93ed79bb4fd71a52d04c918c303d)) + + +### Bug Fixes + +* **goblal css:** text stroke reduce to 1px, and top recipe text in h4 fix ([554a242](https://github.com/chingu-voyages/v46-tier2-team-19/commit/554a242ed22546a842a45e8be564b7d5b787c136)) +* **notfoundpage:** branch Update with the dev branch ([72cc649](https://github.com/chingu-voyages/v46-tier2-team-19/commit/72cc649c6094d5337a15afca6131b500a22b1c7b)) +* **notfoundpage:** not Found Page layout fix ([7924e0c](https://github.com/chingu-voyages/v46-tier2-team-19/commit/7924e0c380e83448ec4e97b186bf176c9b266582)) + +### [0.0.18](https://github.com/chingu-voyages/v46-tier2-team-19/compare/v0.0.17...v0.0.18) (2023-11-06) + + +### Features + +* **add nutrition section:** merge in nutrition section from Tim's branch ([3c487c2](https://github.com/chingu-voyages/v46-tier2-team-19/commit/3c487c210d3e0e41d507423fd01392cf41641204)) +* **avatar-joseph.webp:** add avatar image of Joseph ([fd69ca0](https://github.com/chingu-voyages/v46-tier2-team-19/commit/fd69ca0bdb168ddc046231920c63590a7bf7857b)) +* **avatar-tim.jpg:** add avatar image of Tim ([5bfaada](https://github.com/chingu-voyages/v46-tier2-team-19/commit/5bfaada516611229beba6c1980a2f2b51bfe9ed2)) +* **constants/index.js:** import team data from module ([21d5b76](https://github.com/chingu-voyages/v46-tier2-team-19/commit/21d5b7614c36707fb658c7a58b5e3764140288d5)) +* **recipe detail page:** improve layout of recipe detail page on large screens and refactor ([bf0087b](https://github.com/chingu-voyages/v46-tier2-team-19/commit/bf0087b4daabbe17fcaee35ce5384ef4e29b8df4)) +* **server.js:** add get-more-info endpoint to config ([06f8508](https://github.com/chingu-voyages/v46-tier2-team-19/commit/06f85083574922bc66dca6348acbaf4a9ca5b37c)) +* **teamdata.js:** create team data module to be imported into constants ([e8ab2c4](https://github.com/chingu-voyages/v46-tier2-team-19/commit/e8ab2c43e35526d3617d94bb6589d00a6b2790ab)) + + +### Bug Fixes + +* **ingredientsections:** make two-column layout only on tablet+ ([673f49e](https://github.com/chingu-voyages/v46-tier2-team-19/commit/673f49ecc40c6b2330f48868549a12fb167ad957)) +* **mirage server:** make recipe detail lookup dynamic ([cdd89cd](https://github.com/chingu-voyages/v46-tier2-team-19/commit/cdd89cd03af2c6ed9a94a90e22835767c2482a24)) + +### [0.0.16](https://github.com/chingu-voyages/v46-tier2-team-19/compare/v0.0.15...v0.0.16) (2023-11-05) + + +### Features + +* **avatar-darrick.jpg:** add avatar image file for Darrick ([3f1d61b](https://github.com/chingu-voyages/v46-tier2-team-19/commit/3f1d61b80238223b52647d7fff716b0c45c77c52)) +* **avatar-grey.jpg:** add avatar image file for Grey ([ef4e8af](https://github.com/chingu-voyages/v46-tier2-team-19/commit/ef4e8afa579ab513301a705a9ef756325b5bc31c)) +* **constants/index.js:** add avatar images & info for Darrick & Grey ([3a249b2](https://github.com/chingu-voyages/v46-tier2-team-19/commit/3a249b20c7b07e44638daee5df9e3692918ca61a)) + + +### Bug Fixes + +* **about.jsx:** modified avatar image size ([1fb2c77](https://github.com/chingu-voyages/v46-tier2-team-19/commit/1fb2c77ede083c302cc68027203d294340a2d22d)) + +### [0.0.17](https://github.com/chingu-voyages/v46-tier2-team-19/compare/v0.0.15...v0.0.17) (2023-11-05) + + +### Features + +* **recipedetails.jsx:** add check for cachedRecipesList length before attempting to find recipe ([b999145](https://github.com/chingu-voyages/v46-tier2-team-19/commit/b999145caeb800290ebe579dec20d4041c7a1b76)) +* **recipedetails.jsx:** add check for empty nutrition object to display a message none is available ([36dab3c](https://github.com/chingu-voyages/v46-tier2-team-19/commit/36dab3c67e78645b08cb4cb7713cdd05ee7c0751)) +* **recipedetails.jsx:** add NutritionSection component to display nutrition information ([1cc28db](https://github.com/chingu-voyages/v46-tier2-team-19/commit/1cc28dbd11a1dcf0c17ad5be7da416f5ee536638)) +* **recipes.js:** add fetchRecipeDetails function to retrieve specific recipe details ([6ef6c1c](https://github.com/chingu-voyages/v46-tier2-team-19/commit/6ef6c1cd579a3a2e93974077fefbd37994ddf6ac)) +* **usepagetitle hook:** implement usePageTitle hook in About, Favorites, Home, & Search pages ([71b699d](https://github.com/chingu-voyages/v46-tier2-team-19/commit/71b699d327151e1de29002e4a831508088cd1cbe)) +* **usepagetitle.js:** create custom hook to update page titles ([f80de7d](https://github.com/chingu-voyages/v46-tier2-team-19/commit/f80de7da2fc4239d5619cd88e7491d7c9a07c400)) + + +### Bug Fixes + +* **fetch-recipe-by-id.js:** corrected fetchRecipeById API call ([f089256](https://github.com/chingu-voyages/v46-tier2-team-19/commit/f08925690c75c027968c2cc1a50e76a4e0110be0)) +* **global.css:** increase heading brightness ([01dd2bf](https://github.com/chingu-voyages/v46-tier2-team-19/commit/01dd2bffbcf6a091c798f5c91613c5bd29f97da1)) + +### [0.0.14](https://github.com/chingu-voyages/v46-tier2-team-19/compare/v0.0.13...v0.0.14) (2023-11-03) + + +### Features + +* **app.jsx:** add Favorites page route ([a822968](https://github.com/chingu-voyages/v46-tier2-team-19/commit/a82296832770e8eace4dd6cac7a4cfd332425d25)) +* **constants/index.js:** add Favorites object to navLinks ([7203564](https://github.com/chingu-voyages/v46-tier2-team-19/commit/720356413228906dc08688183672458e401443b5)) +* **favorites.jsx:** add Favorites page ([5cb1a6a](https://github.com/chingu-voyages/v46-tier2-team-19/commit/5cb1a6aebbbe930f7721a5c72178d37cd4941e5f)) +* **recipedetails.jsx:** add Favorites feature to the recipe details page ([c082b55](https://github.com/chingu-voyages/v46-tier2-team-19/commit/c082b555e1170fd16a270e1f90d2c1f5a02c190e)) + + +### [0.0.16](https://github.com/chingu-voyages/v46-tier2-team-19/compare/v0.0.15...v0.0.16) (2023-11-05) + + +### Features + +* **recipedetails.jsx:** add check for cachedRecipesList length before attempting to find recipe ([b999145](https://github.com/chingu-voyages/v46-tier2-team-19/commit/b999145caeb800290ebe579dec20d4041c7a1b76)) +* **recipedetails.jsx:** add check for empty nutrition object to display a message none is available ([36dab3c](https://github.com/chingu-voyages/v46-tier2-team-19/commit/36dab3c67e78645b08cb4cb7713cdd05ee7c0751)) +* **recipedetails.jsx:** add NutritionSection component to display nutrition information ([1cc28db](https://github.com/chingu-voyages/v46-tier2-team-19/commit/1cc28dbd11a1dcf0c17ad5be7da416f5ee536638)) +* **recipes.js:** add fetchRecipeDetails function to retrieve specific recipe details ([6ef6c1c](https://github.com/chingu-voyages/v46-tier2-team-19/commit/6ef6c1cd579a3a2e93974077fefbd37994ddf6ac)) +* **usepagetitle hook:** implement usePageTitle hook in About, Favorites, Home, & Search pages ([71b699d](https://github.com/chingu-voyages/v46-tier2-team-19/commit/71b699d327151e1de29002e4a831508088cd1cbe)) +* **usepagetitle.js:** create custom hook to update page titles ([f80de7d](https://github.com/chingu-voyages/v46-tier2-team-19/commit/f80de7da2fc4239d5619cd88e7491d7c9a07c400)) +* **avatar-darrick.jpg:** add avatar image file for Darrick ([3f1d61b](https://github.com/chingu-voyages/v46-tier2-team-19/commit/3f1d61b80238223b52647d7fff716b0c45c77c52)) +* **avatar-grey.jpg:** add avatar image file for Grey ([ef4e8af](https://github.com/chingu-voyages/v46-tier2-team-19/commit/ef4e8afa579ab513301a705a9ef756325b5bc31c)) +* **constants/index.js:** add avatar images & info for Darrick & Grey ([3a249b2](https://github.com/chingu-voyages/v46-tier2-team-19/commit/3a249b20c7b07e44638daee5df9e3692918ca61a)) + + + +### Bug Fixes + +* **fetch-recipe-by-id.js:** corrected fetchRecipeById API call ([f089256](https://github.com/chingu-voyages/v46-tier2-team-19/commit/f08925690c75c027968c2cc1a50e76a4e0110be0)) +* **global.css:** increase heading brightness ([01dd2bf](https://github.com/chingu-voyages/v46-tier2-team-19/commit/01dd2bffbcf6a091c798f5c91613c5bd29f97da1)) +* **about.jsx:** modified avatar image size ([1fb2c77](https://github.com/chingu-voyages/v46-tier2-team-19/commit/1fb2c77ede083c302cc68027203d294340a2d22d)) + +### [0.0.14](https://github.com/chingu-voyages/v46-tier2-team-19/compare/v0.0.13...v0.0.14) (2023-11-03) + + +### Features + +* **app.jsx:** add Favorites page route ([a822968](https://github.com/chingu-voyages/v46-tier2-team-19/commit/a82296832770e8eace4dd6cac7a4cfd332425d25)) +* **constants/index.js:** add Favorites object to navLinks ([7203564](https://github.com/chingu-voyages/v46-tier2-team-19/commit/720356413228906dc08688183672458e401443b5)) +* **favorites.jsx:** add Favorites page ([5cb1a6a](https://github.com/chingu-voyages/v46-tier2-team-19/commit/5cb1a6aebbbe930f7721a5c72178d37cd4941e5f)) +* **recipedetails.jsx:** add Favorites feature to the recipe details page ([c082b55](https://github.com/chingu-voyages/v46-tier2-team-19/commit/c082b555e1170fd16a270e1f90d2c1f5a02c190e)) + +### [0.0.15](https://github.com/chingu-voyages/v46-tier2-team-19/compare/v0.0.13...v0.0.15) (2023-11-03) + + +### Features + +* **favicon and site bg gradient:** add favicon and site background gradient ([7989dd5](https://github.com/chingu-voyages/v46-tier2-team-19/commit/7989dd5b0a8b9827a5dfeb75ac28bb4d83893d62)) +* **global.css:** add .text-stroke class to provide text outline styling ([d8e67ba](https://github.com/chingu-voyages/v46-tier2-team-19/commit/d8e67bace2366262a35b7d35e8ab1c932c9ac719)), closes [#333](https://github.com/chingu-voyages/v46-tier2-team-19/issues/333) +* **global.css:** add smaller variants for text-shadow and text-stroke classes ([a8236ef](https://github.com/chingu-voyages/v46-tier2-team-19/commit/a8236efe91491f47e946d528c04c1701ba3ac7ce)) +* **heading.jsx:** add text shadow and text stroke styling to the headings ([6271b3a](https://github.com/chingu-voyages/v46-tier2-team-19/commit/6271b3a04dd81d288065b543bbd436619411f8dd)) +* **recipe details page:** add & style recipe title, desc., tags, topics, ingredients, video, etc ([1f61402](https://github.com/chingu-voyages/v46-tier2-team-19/commit/1f61402b6f611fc9476b307fe09926e5e4b640f9)) +* **recipe details page:** add instructions ([e4b64f5](https://github.com/chingu-voyages/v46-tier2-team-19/commit/e4b64f549cc3b9bd55740e2cc5c19ea9fff0d097)) +* **recipedetails.jsx:** improve responsive tablet layout for Recipe Details page ([1708c03](https://github.com/chingu-voyages/v46-tier2-team-19/commit/1708c031781f57b81dd0a99f19b3429e013dc1db)) +* **recipedetails:** add more cards, activate jumplinks, continue improving layout ([d3dd734](https://github.com/chingu-voyages/v46-tier2-team-19/commit/d3dd734199071baf17ee12fb9c2448475fcb3fc2)) + + +### Bug Fixes + +* **global css:** fix for overly thick stroke on small headings on mobile and tablet ([4374bbd](https://github.com/chingu-voyages/v46-tier2-team-19/commit/4374bbd1716000f40876032f6340704af9f30f31)) +* **global.css:** add missing closing bracket ([0fb455d](https://github.com/chingu-voyages/v46-tier2-team-19/commit/0fb455d2a9fdc35e53e5f56e2b9bd0857ff96e08)) +* **header.jsx:** improve styling of mobile menu ([82606c1](https://github.com/chingu-voyages/v46-tier2-team-19/commit/82606c19f7f5d648101aa773c5d6b44913fc2b9c)) +* merge in code from dev ([f7c3437](https://github.com/chingu-voyages/v46-tier2-team-19/commit/f7c34372d5fab284abb965c4b2663b99cebbe099)) +* **recipedetails.jsx:** hide debug messages ([0c7d3a3](https://github.com/chingu-voyages/v46-tier2-team-19/commit/0c7d3a3fcadd0f4ccb16d7093e4620a4681095a0)) +* **svgwave.jsx:** adjust viewBox attribute in SVG to correct aspect ratio ([6b770e8](https://github.com/chingu-voyages/v46-tier2-team-19/commit/6b770e885f009848909b2035cf0c818dcad50dac)) + + +### [0.0.14](https://github.com/chingu-voyages/v46-tier2-team-19/compare/v0.0.13...v0.0.14) (2023-11-03) + + +### Features + +* **app.jsx:** add Favorites page route ([a822968](https://github.com/chingu-voyages/v46-tier2-team-19/commit/a82296832770e8eace4dd6cac7a4cfd332425d25)) +* **constants/index.js:** add Favorites object to navLinks ([7203564](https://github.com/chingu-voyages/v46-tier2-team-19/commit/720356413228906dc08688183672458e401443b5)) +* **favicon and site bg gradient:** add favicon and site background gradient ([7989dd5](https://github.com/chingu-voyages/v46-tier2-team-19/commit/7989dd5b0a8b9827a5dfeb75ac28bb4d83893d62)) +* **favorites.jsx:** add Favorites page ([5cb1a6a](https://github.com/chingu-voyages/v46-tier2-team-19/commit/5cb1a6aebbbe930f7721a5c72178d37cd4941e5f)) +* **global.css:** add .text-stroke class to provide text outline styling ([d8e67ba](https://github.com/chingu-voyages/v46-tier2-team-19/commit/d8e67bace2366262a35b7d35e8ab1c932c9ac719)), closes [#333](https://github.com/chingu-voyages/v46-tier2-team-19/issues/333) +* **global.css:** add smaller variants for text-shadow and text-stroke classes ([a8236ef](https://github.com/chingu-voyages/v46-tier2-team-19/commit/a8236efe91491f47e946d528c04c1701ba3ac7ce)) +* **heading.jsx:** add text shadow and text stroke styling to the headings ([6271b3a](https://github.com/chingu-voyages/v46-tier2-team-19/commit/6271b3a04dd81d288065b543bbd436619411f8dd)) +* **recipe details page:** add & style recipe title, desc., tags, topics, ingredients, video, etc ([1f61402](https://github.com/chingu-voyages/v46-tier2-team-19/commit/1f61402b6f611fc9476b307fe09926e5e4b640f9)) +* **recipe details page:** add instructions ([e4b64f5](https://github.com/chingu-voyages/v46-tier2-team-19/commit/e4b64f549cc3b9bd55740e2cc5c19ea9fff0d097)) +* **recipedetails.jsx:** add Favorites feature to the recipe details page ([c082b55](https://github.com/chingu-voyages/v46-tier2-team-19/commit/c082b555e1170fd16a270e1f90d2c1f5a02c190e)) +* **recipedetails.jsx:** improve responsive tablet layout for Recipe Details page ([1708c03](https://github.com/chingu-voyages/v46-tier2-team-19/commit/1708c031781f57b81dd0a99f19b3429e013dc1db)) +* **recipedetails:** add more cards, activate jumplinks, continue improving layout ([d3dd734](https://github.com/chingu-voyages/v46-tier2-team-19/commit/d3dd734199071baf17ee12fb9c2448475fcb3fc2)) + + +### Bug Fixes + +* **global css:** fix for overly thick stroke on small headings on mobile and tablet ([4374bbd](https://github.com/chingu-voyages/v46-tier2-team-19/commit/4374bbd1716000f40876032f6340704af9f30f31)) +* **global.css:** add missing closing bracket ([0fb455d](https://github.com/chingu-voyages/v46-tier2-team-19/commit/0fb455d2a9fdc35e53e5f56e2b9bd0857ff96e08)) +* **header.jsx:** improve styling of mobile menu ([82606c1](https://github.com/chingu-voyages/v46-tier2-team-19/commit/82606c19f7f5d648101aa773c5d6b44913fc2b9c)) +* merge in code from dev ([f7c3437](https://github.com/chingu-voyages/v46-tier2-team-19/commit/f7c34372d5fab284abb965c4b2663b99cebbe099)) +* **recipedetails.jsx:** hide debug messages ([0c7d3a3](https://github.com/chingu-voyages/v46-tier2-team-19/commit/0c7d3a3fcadd0f4ccb16d7093e4620a4681095a0)) +* **svgwave.jsx:** adjust viewBox attribute in SVG to correct aspect ratio ([6b770e8](https://github.com/chingu-voyages/v46-tier2-team-19/commit/6b770e885f009848909b2035cf0c818dcad50dac)) + ### [0.0.13](https://github.com/chingu-voyages/v46-tier2-team-19/compare/v0.0.11...v0.0.13) (2023-11-01) diff --git a/README.md b/README.md index 734c407..96b15ab 100644 --- a/README.md +++ b/README.md @@ -1,28 +1,120 @@ - + + + -# YumYumYes.com - Recipe Search Web App + + + + + + +
+
+ + + +

YumYumYes.com - Recipe Search Web App

+

YumYumYes! is a beautiful, full-featured, responsive web app that interfaces with the [Tasty API](https://rapidapi.com/apidojo/api/tasty) and allows users to search, view and save recipes. It was built from the ground up for [Chingu Voyage 46](https://github.com/chingu-voyages/voyage-project-tier2-recipes). +
+ +Explore the docs +
+
+View Demo +Report Bug +Request Feature -## Table of contents +

+
+ +
+ Table of contents +
    +
  1. + Overview + -- [Overview](#overview) - - [About Chingu](#about-chingu) - - [Basic Requirements](#basic-requirements) - - [Our Solution](#our-solution) - - [Concept](#concept) - - [Screenshots](#screenshots) - - [Links](#links) +
  2. +
  3. + The challenge + +
  4. +
  5. + Our Solution + +
  6. +
  7. + Getting Started + +
  8. +
  9. The Team
  10. +
+
## Overview -### The challenge +### Features + +YumYumYes allows users to: + +- Ability to search for recipes by ingredient(s) +- Filter search results based on recipes tags +- Save recipes to their favorites list +- View their personal favorites list at any time + +### Technologies + +[![Vite][Vite]][Vite-url] +[![Tailwind][Tailwind.css]][Tailwind-url] +[![React-Query][React-Query]][React-Query-url] +[![React-Router][React-Router]][React-Router-url] + +
+Dependencies +
  • Vite.js
  • +
  • Tailwind.css
  • +
  • Headless UI
  • +
  • Axios
  • +
  • React Query
  • +
  • Prettier
  • +
  • ESLint
  • +
    + +

    (back to top)

    + +## The challenge -#### About Chingu: +### About Chingu: Chingu is a community of developers who are passionate about learning, helping others, and collaborating on projects. It is a remote, self-organizing, project-based learning platform. Chingu helps you to build your portfolio and network while collaborating on real-world projects with remote team members. "Chingus" are motivated learners who are self-directed and take responsibility for their own learning. -#### Basic requirements: +### Basic requirements: > Use the Tasty API to create an app that will help anyone interested in creating dishes and flavours to explore recipes in novel ways. @@ -30,35 +122,37 @@ Chingu is a community of developers who are passionate about learning, helping o _User can see a landing page containing at least the following components:_ -- [ ] Header component displaying a welcome message. -- [ ] Search field that enables users to input ingredient(s). -- [ ] Component to explain the use of the application. -- [ ] A scrollable list of recipes displaying the results based on the search criteria. Keep in mind that the Recipe API has over 1500 Recipes, however, it's paginated with 20 recipes per page of result. -- [ ] A summary main recipe component: it should display recipe image, name and link to details. -- [ ] A summary detail recipe component: it should display recipe name, category, and instructions. -- [ ] Ensure mobile responsiveness for the application. +- [x] Header component displaying a welcome message. +- [x] Search field that enables users to input ingredient(s). +- [x] Component to explain the use of the application. +- [x] A scrollable list of recipes displaying the results based on the search criteria. Keep in mind that the Recipe API has over 1500 Recipes, however, it's paginated with 20 recipes per page of result. +- [x] A summary main recipe component: it should display recipe image, name and link to details. +- [x] A summary detail recipe component: it should display recipe name, category, and instructions. +- [x] Ensure mobile responsiveness for the application. **Search Component** _Users can input one or multiple ingredient(s)._ -- [ ] Initiate the search by either pressing the Enter key or clicking the 'Search' button/icon. -- [ ] Display an error message when an unlisted item is entered. +- [x] Initiate the search by either pressing the Enter key or clicking the 'Search' button/icon. +- [x] Display an error message when an unlisted item is entered. **Main Data Display Component** -- [ ] Display results for each recipe in the main component. -- [ ] Remain on the landing page if no search ingredient has been entered. +- [x] Display results for each recipe in the main component. +- [x] Remain on the landing page if no search ingredient has been entered. **Summary Detail Component** _Display the following information of the selected recipe:_ -- [ ] Name -- [ ] Category -- [ ] List of instruction -- [ ] List of nutrition -- [ ] Add a Link to the instruction video +- [x] Name +- [x] Category +- [x] List of instruction +- [x] List of nutrition +- [x] Add a Link to the instruction video + +

    (back to top)

    ## Our Solution @@ -66,8 +160,6 @@ _Display the following information of the selected recipe:_ We developed a unique web app with a distinctive brand and a whimsical, animated design. YumYumYes! is intended to make recipe browsing fun! Colorful mascots Yumi and Chef Carrots welcome visitors to our pages, and delightful visual motifs including text gradients, 3d colored balls, dashed lines and gentle curves are intended to make the app feel more alive and engaging. -YumYumYes! allows users to search for recipes by ingredient and filter by useful tags such as difficulty, occasion, etc. The app also allows users to save recipes to their favorites list, and to view their favorites list at any time. - The app is built as a fully responsive web app compatible with all modern web browsers, both mobile and desktop. We've taken care to make it intuitive for all users, and accessible to users with different abilities. ### Screenshots @@ -79,26 +171,6 @@ The app is built as a fully responsive web app compatible with all modern web br Home Page - ### Links @@ -106,3 +178,83 @@ The app is built as a fully responsive web app compatible with all modern web br - Live Site URL: [YumYumYes.com](https://yumyumyes.com) - Source Code: [Github Repository](https://github.com/chingu-voyages/v46-tier2-team-19) - Design Mockup: [YumYumYes Figma Mockup](https://www.figma.com/file/CbJFJOPY0r5EbEpRSNrx9b/YumYumYes-wireframe) + +

    (back to top)

    + + + +## Getting Started + +### Run Locally: + +#### 1. signup for a RapidAPI account to get a API Key at [Tasty API](https://rapidapi.com/apidojo/api/tasty) + +#### 2. Clone project locally: + +```javascript +git clone git@github.com:chingu-voyages/v46-tier2-team-19.git + +``` + +#### 3. Create a `.env.local` file and add environment variables + +#### 4. Run Client: + +```javascript +cd v46-tier2-team-19 +npm install +npm run dev +``` + +

    (back to top)

    + + + +## The Team + +- [Greimil Nuñez](https://github.com/Greimil) +- [Darrick Fauvel](https://github.com/DarrickFauvel) +- [Tim DeHof](https://github.com/timDeHof) +- [Joseph Kotvas](https://github.com/joekotvas) +- [Henri Lambertucci](https://github.com/henrike32) + +#### Thank you to [Jim](https://github.com/jdmedlock) and the [Chingu](https://www.chingu.io/) team! + +

    (back to top)

    + + + + +[contributors-shield]: https://img.shields.io/github/contributors/github_username/repo_name.svg?style=for-the-badge +[contributors-url]: https://github.com/chingu-voyages/v46-tier2-team-19/graphs/contributors +[forks-shield]: https://img.shields.io/github/forks/github_username/repo_name.svg?style=for-the-badge +[forks-url]: https://github.com/chingu-voyages/v46-tier2-team-19/network/members +[stars-shield]: https://img.shields.io/github/stars/github_username/repo_name.svg?style=for-the-badge +[stars-url]: https://github.com/chingu-voyages/v46-tier2-team-19/stargazers +[issues-shield]: https://img.shields.io/github/issues/github_username/repo_name.svg?style=for-the-badge +[issues-url]: https://github.com/chingu-voyages/v46-tier2-team-19/issues +[license-shield]: https://img.shields.io/github/license/github_username/repo_name.svg?style=for-the-badge +[license-url]: https://github.com/chingu-voyages/v46-tier2-team-19/blob/master/LICENSE.txt +[product-screenshot]: images/screenshot.png +[Vite]: https://img.shields.io/badge/Vite-B73BFE?style=for-the-badge&logo=vite&logoColor=FFD62E +[Vite-url]: https://vitejs.dev/ +[React.js]: https://img.shields.io/badge/React-20232A?style=for-the-badge&logo=react&logoColor=61DAFB +[React-url]: https://reactjs.org/ +[Tailwind.css]: https://img.shields.io/badge/tailwindcss-%2338B2AC.svg?style=for-the-badge&logo=tailwind-css&logoColor=white +[Tailwind-url]: https://tailwindcss.com/ +[React-Query]: https://img.shields.io/badge/React_Query-FF4154?style=for-the-badge&logo=React_Query&logoColor=white +[React-Query-url]: https://tanstack.com/query/latest +[React-Router]: https://img.shields.io/badge/React_Router-CA4245?style=for-the-badge&logo=react-router&logoColor=white +[React-Router-url]: https://reactrouter.com/en/main +[Vue.js]: https://img.shields.io/badge/Vue.js-35495E?style=for-the-badge&logo=vuedotjs&logoColor=4FC08D +[Vue-url]: https://vuejs.org/ +[Angular.io]: https://img.shields.io/badge/Angular-DD0031?style=for-the-badge&logo=angular&logoColor=white +[Angular-url]: https://angular.io/ +[Svelte.dev]: https://img.shields.io/badge/Svelte-4A4A55?style=for-the-badge&logo=svelte&logoColor=FF3E00 +[Svelte-url]: https://svelte.dev/ +[Laravel.com]: https://img.shields.io/badge/Laravel-FF2D20?style=for-the-badge&logo=laravel&logoColor=white +[Laravel-url]: https://laravel.com +[Bootstrap.com]: https://img.shields.io/badge/Bootstrap-563D7C?style=for-the-badge&logo=bootstrap&logoColor=white +[Bootstrap-url]: https://getbootstrap.com +[JQuery.com]: https://img.shields.io/badge/jQuery-0769AD?style=for-the-badge&logo=jquery&logoColor=white +[JQuery-url]: https://jquery.com diff --git a/package-lock.json b/package-lock.json index c06ea51..15bc4a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "recipe-app", - "version": "0.0.13", + "version": "0.0.32", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "recipe-app", - "version": "0.0.13", + "version": "0.0.32", "dependencies": { "@headlessui/react": "^1.7.17", "@tanstack/react-query": "^4.36.1", @@ -19,6 +19,7 @@ "react-dom": "^18.2.0", "react-icons": "^4.11.0", "react-query": "^3.39.3", + "react-responsive-carousel": "^3.2.23", "react-router-dom": "^6.4.3" }, "devDependencies": { @@ -174,30 +175,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", - "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", + "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", - "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz", + "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", + "@babel/generator": "^7.23.3", "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-module-transforms": "^7.23.3", "@babel/helpers": "^7.23.2", - "@babel/parser": "^7.23.0", + "@babel/parser": "^7.23.3", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0", + "@babel/traverse": "^7.23.3", + "@babel/types": "^7.23.3", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -222,9 +223,9 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.22.15.tgz", - "integrity": "sha512-yc8OOBIQk1EcRrpizuARSQS0TWAcOMpEJ1aafhNznaeYkeL+OhqnDObGFylB8ka8VFF/sZc+S4RzHyO+3LjQxg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.23.3.tgz", + "integrity": "sha512-9bTuNlyx7oSstodm1cR1bECj4fkiknsDa1YniISkJemMY3DGhJNYBECbe6QD/q54mp2J8VO66jW3/7uP//iFCw==", "dev": true, "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", @@ -258,12 +259,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.3.tgz", + "integrity": "sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==", "dev": true, "dependencies": { - "@babel/types": "^7.23.0", + "@babel/types": "^7.23.3", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -454,9 +455,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", - "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", @@ -704,9 +705,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz", + "integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -716,9 +717,9 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz", - "integrity": "sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", + "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -731,14 +732,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz", - "integrity": "sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", + "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.15" + "@babel/plugin-transform-optional-chaining": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -747,6 +748,22 @@ "@babel/core": "^7.13.0" } }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz", + "integrity": "sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-proposal-class-properties": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", @@ -765,16 +782,16 @@ } }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.2.tgz", - "integrity": "sha512-eR0gJQc830fJVGz37oKLvt9W9uUIQSAovUl0e9sJ3YeO09dlcoBVYD3CLrjCj4qHdXmfiyTyFt8yeQYSN5fxLg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.3.tgz", + "integrity": "sha512-u8SwzOcP0DYSsa++nHd/9exlHb0NAlHCb890qtZZbSwPX2bFv8LBEztxwN7Xg/dS8oAFFidhrI9PBcLBJSkGRQ==", "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-replace-supers": "^7.22.20", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/plugin-syntax-decorators": "^7.22.10" + "@babel/plugin-syntax-decorators": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -904,9 +921,9 @@ } }, "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.10.tgz", - "integrity": "sha512-z1KTVemBjnz+kSEilAsI4lbkPOl5TvJH7YDSY1CTIzvLWJ+KHXp+mRe8VPmfnyvqOPqar1V2gid2PleKzRUstQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.23.3.tgz", + "integrity": "sha512-cf7Niq4/+/juY67E0PbgH0TDhLQ5J7zS8C/Q5FFx+DWyrRa9sUQdTXkjqKu8zGvuqr7vw1muKiukseihU+PJDA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -943,9 +960,9 @@ } }, "node_modules/@babel/plugin-syntax-flow": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.22.5.tgz", - "integrity": "sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.23.3.tgz", + "integrity": "sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -958,9 +975,9 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", - "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", + "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -973,9 +990,9 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", - "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", + "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1012,9 +1029,9 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", - "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1129,9 +1146,9 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", - "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", + "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1160,9 +1177,9 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", - "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", + "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1175,9 +1192,9 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz", - "integrity": "sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.3.tgz", + "integrity": "sha512-59GsVNavGxAXCDDbakWSMJhajASb4kBCqDjqJsv+p5nKdbz7istmZ3HrX3L2LuiI80+zsOADCvooqQH3qGCucQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", @@ -1193,14 +1210,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", - "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", + "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.5" + "@babel/helper-remap-async-to-generator": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -1210,9 +1227,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", - "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", + "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1225,9 +1242,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz", - "integrity": "sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.3.tgz", + "integrity": "sha512-QPZxHrThbQia7UdvfpaRRlq/J9ciz1J4go0k+lPBXbgaNeY7IQrBj/9ceWjvMMI07/ZBzHl/F0R/2K0qH7jCVw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1240,12 +1257,12 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", - "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", + "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1256,12 +1273,12 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", - "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.3.tgz", + "integrity": "sha512-PENDVxdr7ZxKPyi5Ffc0LjXdnJyrJxyqF5T5YjlVg4a0VFfQHW0r8iAtRiDXkfHlu1wwcvdtnndGYIeJLSuRMQ==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, @@ -1273,18 +1290,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz", - "integrity": "sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.3.tgz", + "integrity": "sha512-FGEQmugvAEu2QtgtU0uTASXevfLMFfBeVCIIdcQhn/uBQsMTjBajdnAtanQlOcuihWh10PZ7+HWvc7NtBwP74w==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-replace-supers": "^7.22.20", "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" }, @@ -1296,13 +1313,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", - "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", + "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.5" + "@babel/template": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -1312,9 +1329,9 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz", - "integrity": "sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", + "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1327,12 +1344,12 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", - "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", + "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1343,9 +1360,9 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", - "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", + "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1358,9 +1375,9 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", - "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.3.tgz", + "integrity": "sha512-vTG+cTGxPFou12Rj7ll+eD5yWeNl5/8xvQvF08y5Gv3v4mZQoyFf8/n9zg4q5vvCWt5jmgymfzMAldO7orBn7A==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1374,12 +1391,12 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", - "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", + "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1390,9 +1407,9 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", - "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.3.tgz", + "integrity": "sha512-yCLhW34wpJWRdTxxWtFZASJisihrfyMOTOQexhVzA78jlU+dH7Dw+zQgcPepQ5F3C6bAIiblZZ+qBggJdHiBAg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1406,13 +1423,13 @@ } }, "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.22.5.tgz", - "integrity": "sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.23.3.tgz", + "integrity": "sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-flow": "^7.22.5" + "@babel/plugin-syntax-flow": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -1422,9 +1439,9 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz", - "integrity": "sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.3.tgz", + "integrity": "sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1437,13 +1454,13 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", - "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", + "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1454,9 +1471,9 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", - "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.3.tgz", + "integrity": "sha512-H9Ej2OiISIZowZHaBwF0tsJOih1PftXJtE8EWqlEIwpc7LMTGq0rPOrywKLQ4nefzx8/HMR0D3JGXoMHYvhi0A==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1470,9 +1487,9 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", - "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", + "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1485,9 +1502,9 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", - "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.3.tgz", + "integrity": "sha512-+pD5ZbxofyOygEp+zZAfujY2ShNCXRpDRIPOiBmTO693hhyOEteZgl876Xs9SAHPQpcV0vz8LvA/T+w8AzyX8A==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1501,9 +1518,9 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", - "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", + "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1516,12 +1533,12 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz", - "integrity": "sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", + "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1532,12 +1549,12 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz", - "integrity": "sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", + "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-simple-access": "^7.22.5" }, @@ -1549,13 +1566,13 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz", - "integrity": "sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", + "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.20" }, @@ -1567,12 +1584,12 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", - "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", + "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1599,9 +1616,9 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", - "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", + "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1614,9 +1631,9 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", - "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.3.tgz", + "integrity": "sha512-xzg24Lnld4DYIdysyf07zJ1P+iIfJpxtVFOzX4g+bsJ3Ng5Le7rXx9KwqKzuyaUeRnt+I1EICwQITqc0E2PmpA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1630,9 +1647,9 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", - "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.3.tgz", + "integrity": "sha512-s9GO7fIBi/BLsZ0v3Rftr6Oe4t0ctJ8h4CCXfPoEJwmvAPMyNrfkOOJzm6b9PX9YXcCJWWQd/sBF/N26eBiMVw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1646,16 +1663,16 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz", - "integrity": "sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.3.tgz", + "integrity": "sha512-VxHt0ANkDmu8TANdE9Kc0rndo/ccsmfe2Cx2y5sI4hu3AukHQ5wAu4cM7j3ba8B9548ijVyclBU+nuDQftZsog==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.9", + "@babel/compat-data": "^7.23.3", "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.22.15" + "@babel/plugin-transform-parameters": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -1665,13 +1682,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", - "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", + "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5" + "@babel/helper-replace-supers": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -1681,9 +1698,9 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", - "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.3.tgz", + "integrity": "sha512-LxYSb0iLjUamfm7f1D7GpiS4j0UAC8AOiehnsGAP8BEsIX8EOi3qV6bbctw8M7ZvLtcoZfZX5Z7rN9PlWk0m5A==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1697,9 +1714,9 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz", - "integrity": "sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.3.tgz", + "integrity": "sha512-zvL8vIfIUgMccIAK1lxjvNv572JHFJIKb4MWBz5OGdBQA0fB0Xluix5rmOby48exiJc987neOmP/m9Fnpkz3Tg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1714,9 +1731,9 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz", - "integrity": "sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", + "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1729,12 +1746,12 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", - "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", + "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1745,13 +1762,13 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", - "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.3.tgz", + "integrity": "sha512-a5m2oLNFyje2e/rGKjVfAELTVI5mbA0FeZpBnkOWWV7eSmKQ+T/XW0Vf+29ScLzSxX+rnsarvU0oie/4m6hkxA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, @@ -1763,9 +1780,9 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", - "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", + "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1778,9 +1795,9 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz", - "integrity": "sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz", + "integrity": "sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1827,9 +1844,9 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz", - "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.23.3.tgz", + "integrity": "sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1842,9 +1859,9 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz", - "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.23.3.tgz", + "integrity": "sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1857,9 +1874,9 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz", - "integrity": "sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz", + "integrity": "sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", @@ -1873,9 +1890,9 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", - "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", + "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1889,9 +1906,9 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", - "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", + "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1904,9 +1921,9 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.2.tgz", - "integrity": "sha512-XOntj6icgzMS58jPVtQpiuF6ZFWxQiJavISGx5KGjRj+3gqZr8+N6Kx+N9BApWzgS+DOjIZfXXj0ZesenOWDyA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.3.tgz", + "integrity": "sha512-XcQ3X58CKBdBnnZpPaQjgVMePsXtSZzHoku70q9tUAQp02ggPQNM04BF3RvlW1GSM/McbSOQAzEK4MXbS7/JFg==", "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.22.15", @@ -1933,9 +1950,9 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", - "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", + "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1948,9 +1965,9 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", - "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", + "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1964,9 +1981,9 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", - "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", + "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1979,9 +1996,9 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", - "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", + "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1994,9 +2011,9 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", - "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", + "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -2009,15 +2026,15 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz", - "integrity": "sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.3.tgz", + "integrity": "sha512-ogV0yWnq38CFwH20l2Afz0dfKuZBx9o/Y2Rmh5vuSS0YD1hswgEgTfyTzuSrT2q9btmHRSqYoSfwFUVaC1M1Jw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-typescript": "^7.22.5" + "@babel/plugin-syntax-typescript": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -2027,9 +2044,9 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", - "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", + "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -2042,12 +2059,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", - "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", + "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -2058,12 +2075,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", - "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", + "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -2074,12 +2091,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", - "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", + "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -2090,25 +2107,26 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.2.tgz", - "integrity": "sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.3.tgz", + "integrity": "sha512-ovzGc2uuyNfNAs/jyjIGxS8arOHS5FENZaNn4rtE7UdKMMkqHCvboHfcuhWLZNX5cB44QfcGNWjaevxMzzMf+Q==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.23.2", + "@babel/compat-data": "^7.23.3", "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.15", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.15", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.3", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.22.5", - "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-assertions": "^7.23.3", + "@babel/plugin-syntax-import-attributes": "^7.23.3", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", @@ -2120,56 +2138,55 @@ "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.23.2", - "@babel/plugin-transform-async-to-generator": "^7.22.5", - "@babel/plugin-transform-block-scoped-functions": "^7.22.5", - "@babel/plugin-transform-block-scoping": "^7.23.0", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-class-static-block": "^7.22.11", - "@babel/plugin-transform-classes": "^7.22.15", - "@babel/plugin-transform-computed-properties": "^7.22.5", - "@babel/plugin-transform-destructuring": "^7.23.0", - "@babel/plugin-transform-dotall-regex": "^7.22.5", - "@babel/plugin-transform-duplicate-keys": "^7.22.5", - "@babel/plugin-transform-dynamic-import": "^7.22.11", - "@babel/plugin-transform-exponentiation-operator": "^7.22.5", - "@babel/plugin-transform-export-namespace-from": "^7.22.11", - "@babel/plugin-transform-for-of": "^7.22.15", - "@babel/plugin-transform-function-name": "^7.22.5", - "@babel/plugin-transform-json-strings": "^7.22.11", - "@babel/plugin-transform-literals": "^7.22.5", - "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", - "@babel/plugin-transform-member-expression-literals": "^7.22.5", - "@babel/plugin-transform-modules-amd": "^7.23.0", - "@babel/plugin-transform-modules-commonjs": "^7.23.0", - "@babel/plugin-transform-modules-systemjs": "^7.23.0", - "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-arrow-functions": "^7.23.3", + "@babel/plugin-transform-async-generator-functions": "^7.23.3", + "@babel/plugin-transform-async-to-generator": "^7.23.3", + "@babel/plugin-transform-block-scoped-functions": "^7.23.3", + "@babel/plugin-transform-block-scoping": "^7.23.3", + "@babel/plugin-transform-class-properties": "^7.23.3", + "@babel/plugin-transform-class-static-block": "^7.23.3", + "@babel/plugin-transform-classes": "^7.23.3", + "@babel/plugin-transform-computed-properties": "^7.23.3", + "@babel/plugin-transform-destructuring": "^7.23.3", + "@babel/plugin-transform-dotall-regex": "^7.23.3", + "@babel/plugin-transform-duplicate-keys": "^7.23.3", + "@babel/plugin-transform-dynamic-import": "^7.23.3", + "@babel/plugin-transform-exponentiation-operator": "^7.23.3", + "@babel/plugin-transform-export-namespace-from": "^7.23.3", + "@babel/plugin-transform-for-of": "^7.23.3", + "@babel/plugin-transform-function-name": "^7.23.3", + "@babel/plugin-transform-json-strings": "^7.23.3", + "@babel/plugin-transform-literals": "^7.23.3", + "@babel/plugin-transform-logical-assignment-operators": "^7.23.3", + "@babel/plugin-transform-member-expression-literals": "^7.23.3", + "@babel/plugin-transform-modules-amd": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-modules-systemjs": "^7.23.3", + "@babel/plugin-transform-modules-umd": "^7.23.3", "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.22.5", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", - "@babel/plugin-transform-numeric-separator": "^7.22.11", - "@babel/plugin-transform-object-rest-spread": "^7.22.15", - "@babel/plugin-transform-object-super": "^7.22.5", - "@babel/plugin-transform-optional-catch-binding": "^7.22.11", - "@babel/plugin-transform-optional-chaining": "^7.23.0", - "@babel/plugin-transform-parameters": "^7.22.15", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.11", - "@babel/plugin-transform-property-literals": "^7.22.5", - "@babel/plugin-transform-regenerator": "^7.22.10", - "@babel/plugin-transform-reserved-words": "^7.22.5", - "@babel/plugin-transform-shorthand-properties": "^7.22.5", - "@babel/plugin-transform-spread": "^7.22.5", - "@babel/plugin-transform-sticky-regex": "^7.22.5", - "@babel/plugin-transform-template-literals": "^7.22.5", - "@babel/plugin-transform-typeof-symbol": "^7.22.5", - "@babel/plugin-transform-unicode-escapes": "^7.22.10", - "@babel/plugin-transform-unicode-property-regex": "^7.22.5", - "@babel/plugin-transform-unicode-regex": "^7.22.5", - "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.23.3", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.3", + "@babel/plugin-transform-numeric-separator": "^7.23.3", + "@babel/plugin-transform-object-rest-spread": "^7.23.3", + "@babel/plugin-transform-object-super": "^7.23.3", + "@babel/plugin-transform-optional-catch-binding": "^7.23.3", + "@babel/plugin-transform-optional-chaining": "^7.23.3", + "@babel/plugin-transform-parameters": "^7.23.3", + "@babel/plugin-transform-private-methods": "^7.23.3", + "@babel/plugin-transform-private-property-in-object": "^7.23.3", + "@babel/plugin-transform-property-literals": "^7.23.3", + "@babel/plugin-transform-regenerator": "^7.23.3", + "@babel/plugin-transform-reserved-words": "^7.23.3", + "@babel/plugin-transform-shorthand-properties": "^7.23.3", + "@babel/plugin-transform-spread": "^7.23.3", + "@babel/plugin-transform-sticky-regex": "^7.23.3", + "@babel/plugin-transform-template-literals": "^7.23.3", + "@babel/plugin-transform-typeof-symbol": "^7.23.3", + "@babel/plugin-transform-unicode-escapes": "^7.23.3", + "@babel/plugin-transform-unicode-property-regex": "^7.23.3", + "@babel/plugin-transform-unicode-regex": "^7.23.3", + "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", "@babel/preset-modules": "0.1.6-no-external-plugins", - "@babel/types": "^7.23.0", "babel-plugin-polyfill-corejs2": "^0.4.6", "babel-plugin-polyfill-corejs3": "^0.8.5", "babel-plugin-polyfill-regenerator": "^0.5.3", @@ -2207,17 +2224,17 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.22.15.tgz", - "integrity": "sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.23.3.tgz", + "integrity": "sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-transform-react-display-name": "^7.22.5", + "@babel/plugin-transform-react-display-name": "^7.23.3", "@babel/plugin-transform-react-jsx": "^7.22.15", "@babel/plugin-transform-react-jsx-development": "^7.22.5", - "@babel/plugin-transform-react-pure-annotations": "^7.22.5" + "@babel/plugin-transform-react-pure-annotations": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -2227,16 +2244,16 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.2.tgz", - "integrity": "sha512-u4UJc1XsS1GhIGteM8rnGiIvf9rJpiVgMEeCnwlLA7WJPC+jcXWJAGxYmeqs5hOZD8BbAfnV5ezBOxQbb4OUxA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz", + "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-syntax-jsx": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.23.0", - "@babel/plugin-transform-typescript": "^7.22.15" + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-typescript": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -2277,19 +2294,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.3.tgz", + "integrity": "sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", + "@babel/generator": "^7.23.3", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", + "@babel/parser": "^7.23.3", + "@babel/types": "^7.23.3", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -2298,9 +2315,9 @@ } }, "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz", + "integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", @@ -2348,12 +2365,12 @@ } }, "node_modules/@commitlint/config-validator": { - "version": "17.6.7", - "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.6.7.tgz", - "integrity": "sha512-vJSncmnzwMvpr3lIcm0I8YVVDJTzyjy7NZAeXbTXy+MPUdAr9pKyyg7Tx/ebOQ9kqzE6O9WT6jg2164br5UdsQ==", + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.8.1.tgz", + "integrity": "sha512-UUgUC+sNiiMwkyiuIFR7JG2cfd9t/7MV8VB4TZ+q02ZFkHoduUS4tJGsCBWvBOGD9Btev6IecPMvlWUfJorkEA==", "dev": true, "dependencies": { - "@commitlint/types": "^17.4.4", + "@commitlint/types": "^17.8.1", "ajv": "^8.11.0" }, "engines": { @@ -2361,12 +2378,12 @@ } }, "node_modules/@commitlint/ensure": { - "version": "17.6.7", - "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-17.6.7.tgz", - "integrity": "sha512-mfDJOd1/O/eIb/h4qwXzUxkmskXDL9vNPnZ4AKYKiZALz4vHzwMxBSYtyL2mUIDeU9DRSpEUins8SeKtFkYHSw==", + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-17.8.1.tgz", + "integrity": "sha512-xjafwKxid8s1K23NFpL8JNo6JnY/ysetKo8kegVM7c8vs+kWLP8VrQq+NbhgVlmCojhEDbzQKp4eRXSjVOGsow==", "dev": true, "dependencies": { - "@commitlint/types": "^17.4.4", + "@commitlint/types": "^17.8.1", "lodash.camelcase": "^4.3.0", "lodash.kebabcase": "^4.1.1", "lodash.snakecase": "^4.1.1", @@ -2378,21 +2395,21 @@ } }, "node_modules/@commitlint/execute-rule": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-17.4.0.tgz", - "integrity": "sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==", + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-17.8.1.tgz", + "integrity": "sha512-JHVupQeSdNI6xzA9SqMF+p/JjrHTcrJdI02PwesQIDCIGUrv04hicJgCcws5nzaoZbROapPs0s6zeVHoxpMwFQ==", "dev": true, "engines": { "node": ">=v14" } }, "node_modules/@commitlint/format": { - "version": "17.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-17.4.4.tgz", - "integrity": "sha512-+IS7vpC4Gd/x+uyQPTAt3hXs5NxnkqAZ3aqrHd5Bx/R9skyCAWusNlNbw3InDbAK6j166D9asQM8fnmYIa+CXQ==", + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-17.8.1.tgz", + "integrity": "sha512-f3oMTyZ84M9ht7fb93wbCKmWxO5/kKSbwuYvS867duVomoOsgrgljkGGIztmT/srZnaiGbaK8+Wf8Ik2tSr5eg==", "dev": true, "dependencies": { - "@commitlint/types": "^17.4.4", + "@commitlint/types": "^17.8.1", "chalk": "^4.1.0" }, "engines": { @@ -2400,12 +2417,12 @@ } }, "node_modules/@commitlint/is-ignored": { - "version": "17.7.0", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.7.0.tgz", - "integrity": "sha512-043rA7m45tyEfW7Zv2vZHF++176MLHH9h70fnPoYlB1slKBeKl8BwNIlnPg4xBdRBVNPaCqvXxWswx2GR4c9Hw==", + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.8.1.tgz", + "integrity": "sha512-UshMi4Ltb4ZlNn4F7WtSEugFDZmctzFpmbqvpyxD3la510J+PLcnyhf9chs7EryaRFJMdAKwsEKfNK0jL/QM4g==", "dev": true, "dependencies": { - "@commitlint/types": "^17.4.4", + "@commitlint/types": "^17.8.1", "semver": "7.5.4" }, "engines": { @@ -2413,30 +2430,30 @@ } }, "node_modules/@commitlint/lint": { - "version": "17.7.0", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.7.0.tgz", - "integrity": "sha512-TCQihm7/uszA5z1Ux1vw+Nf3yHTgicus/+9HiUQk+kRSQawByxZNESeQoX9ujfVd3r4Sa+3fn0JQAguG4xvvbA==", + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.8.1.tgz", + "integrity": "sha512-aQUlwIR1/VMv2D4GXSk7PfL5hIaFSfy6hSHV94O8Y27T5q+DlDEgd/cZ4KmVI+MWKzFfCTiTuWqjfRSfdRllCA==", "dev": true, "dependencies": { - "@commitlint/is-ignored": "^17.7.0", - "@commitlint/parse": "^17.7.0", - "@commitlint/rules": "^17.7.0", - "@commitlint/types": "^17.4.4" + "@commitlint/is-ignored": "^17.8.1", + "@commitlint/parse": "^17.8.1", + "@commitlint/rules": "^17.8.1", + "@commitlint/types": "^17.8.1" }, "engines": { "node": ">=v14" } }, "node_modules/@commitlint/load": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.7.2.tgz", - "integrity": "sha512-XA7WTnsjHZ4YH6ZYsrnxgLdXzriwMMq+utZUET6spbOEEIPBCDLdOQXS26P+v3TTO4hUHOEhzUquaBv3jbBixw==", + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.8.1.tgz", + "integrity": "sha512-iF4CL7KDFstP1kpVUkT8K2Wl17h2yx9VaR1ztTc8vzByWWcbO/WaKwxsnCOqow9tVAlzPfo1ywk9m2oJ9ucMqA==", "dev": true, "dependencies": { - "@commitlint/config-validator": "^17.6.7", - "@commitlint/execute-rule": "^17.4.0", - "@commitlint/resolve-extends": "^17.6.7", - "@commitlint/types": "^17.4.4", + "@commitlint/config-validator": "^17.8.1", + "@commitlint/execute-rule": "^17.8.1", + "@commitlint/resolve-extends": "^17.8.1", + "@commitlint/types": "^17.8.1", "@types/node": "20.5.1", "chalk": "^4.1.0", "cosmiconfig": "^8.0.0", @@ -2446,7 +2463,7 @@ "lodash.uniq": "^4.5.0", "resolve-from": "^5.0.0", "ts-node": "^10.8.1", - "typescript": "^4.6.4 || ^5.0.0" + "typescript": "^4.6.4 || ^5.2.2" }, "engines": { "node": ">=v14" @@ -2459,21 +2476,21 @@ "dev": true }, "node_modules/@commitlint/message": { - "version": "17.4.2", - "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-17.4.2.tgz", - "integrity": "sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q==", + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-17.8.1.tgz", + "integrity": "sha512-6bYL1GUQsD6bLhTH3QQty8pVFoETfFQlMn2Nzmz3AOLqRVfNNtXBaSY0dhZ0dM6A2MEq4+2d7L/2LP8TjqGRkA==", "dev": true, "engines": { "node": ">=v14" } }, "node_modules/@commitlint/parse": { - "version": "17.7.0", - "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-17.7.0.tgz", - "integrity": "sha512-dIvFNUMCUHqq5Abv80mIEjLVfw8QNuA4DS7OWip4pcK/3h5wggmjVnlwGCDvDChkw2TjK1K6O+tAEV78oxjxag==", + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-17.8.1.tgz", + "integrity": "sha512-/wLUickTo0rNpQgWwLPavTm7WbwkZoBy3X8PpkUmlSmQJyWQTj0m6bDjiykMaDt41qcUbfeFfaCvXfiR4EGnfw==", "dev": true, "dependencies": { - "@commitlint/types": "^17.4.4", + "@commitlint/types": "^17.8.1", "conventional-changelog-angular": "^6.0.0", "conventional-commits-parser": "^4.0.0" }, @@ -2482,14 +2499,14 @@ } }, "node_modules/@commitlint/prompt": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/@commitlint/prompt/-/prompt-17.7.2.tgz", - "integrity": "sha512-DcN55b2Oi906a2pGDjjmR+ymZMvrwvxhnlr7Bu6FBaemXJlLicBOYXGz/cXIo9iExlwowbfCOuenBHvfXdDK9g==", + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/prompt/-/prompt-17.8.1.tgz", + "integrity": "sha512-adK+6oaR/8SSSa/Lnp7KU+lu28j/jWfR2sX/5qRDFc2WTTMM59yJ+33k8FMHKZAZIU1FdyCGr11yP3btL6VdLA==", "dev": true, "dependencies": { - "@commitlint/ensure": "^17.6.7", - "@commitlint/load": "^17.7.2", - "@commitlint/types": "^17.4.4", + "@commitlint/ensure": "^17.8.1", + "@commitlint/load": "^17.8.1", + "@commitlint/types": "^17.8.1", "chalk": "^4.1.0", "inquirer": "^6.5.2" }, @@ -2498,12 +2515,12 @@ } }, "node_modules/@commitlint/prompt-cli": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/@commitlint/prompt-cli/-/prompt-cli-17.7.2.tgz", - "integrity": "sha512-HndRoOaWWOiRp1K0jEspeq7qCVavLQS44YVMWXe8yEKSxkYUpIv24Zm4sl7rm7i21xZT7shUaq2R6JCFX+lxyg==", + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/prompt-cli/-/prompt-cli-17.8.1.tgz", + "integrity": "sha512-dkjxr0ah2R9P/vsz/s128kNEar/5zjr3TN3LOvA8kBiSrrbfF560gnoxAh+KgQ5sAc8lMrG+z4dVYvzSkXyfDQ==", "dev": true, "dependencies": { - "@commitlint/prompt": "^17.7.2", + "@commitlint/prompt": "^17.8.1", "execa": "^5.0.0", "inquirer": "^6.5.2" }, @@ -2515,13 +2532,13 @@ } }, "node_modules/@commitlint/read": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-17.5.1.tgz", - "integrity": "sha512-7IhfvEvB//p9aYW09YVclHbdf1u7g7QhxeYW9ZHSO8Huzp8Rz7m05aCO1mFG7G8M+7yfFnXB5xOmG18brqQIBg==", + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-17.8.1.tgz", + "integrity": "sha512-Fd55Oaz9irzBESPCdMd8vWWgxsW3OWR99wOntBDHgf9h7Y6OOHjWEdS9Xzen1GFndqgyoaFplQS5y7KZe0kO2w==", "dev": true, "dependencies": { - "@commitlint/top-level": "^17.4.0", - "@commitlint/types": "^17.4.4", + "@commitlint/top-level": "^17.8.1", + "@commitlint/types": "^17.8.1", "fs-extra": "^11.0.0", "git-raw-commits": "^2.0.11", "minimist": "^1.2.6" @@ -2531,13 +2548,13 @@ } }, "node_modules/@commitlint/resolve-extends": { - "version": "17.6.7", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.6.7.tgz", - "integrity": "sha512-PfeoAwLHtbOaC9bGn/FADN156CqkFz6ZKiVDMjuC2N5N0740Ke56rKU7Wxdwya8R8xzLK9vZzHgNbuGhaOVKIg==", + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.8.1.tgz", + "integrity": "sha512-W/ryRoQ0TSVXqJrx5SGkaYuAaE/BUontL1j1HsKckvM6e5ZaG0M9126zcwL6peKSuIetJi7E87PRQF8O86EW0Q==", "dev": true, "dependencies": { - "@commitlint/config-validator": "^17.6.7", - "@commitlint/types": "^17.4.4", + "@commitlint/config-validator": "^17.8.1", + "@commitlint/types": "^17.8.1", "import-fresh": "^3.0.0", "lodash.mergewith": "^4.6.2", "resolve-from": "^5.0.0", @@ -2548,15 +2565,15 @@ } }, "node_modules/@commitlint/rules": { - "version": "17.7.0", - "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-17.7.0.tgz", - "integrity": "sha512-J3qTh0+ilUE5folSaoK91ByOb8XeQjiGcdIdiB/8UT1/Rd1itKo0ju/eQVGyFzgTMYt8HrDJnGTmNWwcMR1rmA==", + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-17.8.1.tgz", + "integrity": "sha512-2b7OdVbN7MTAt9U0vKOYKCDsOvESVXxQmrvuVUZ0rGFMCrCPJWWP1GJ7f0lAypbDAhaGb8zqtdOr47192LBrIA==", "dev": true, "dependencies": { - "@commitlint/ensure": "^17.6.7", - "@commitlint/message": "^17.4.2", - "@commitlint/to-lines": "^17.4.0", - "@commitlint/types": "^17.4.4", + "@commitlint/ensure": "^17.8.1", + "@commitlint/message": "^17.8.1", + "@commitlint/to-lines": "^17.8.1", + "@commitlint/types": "^17.8.1", "execa": "^5.0.0" }, "engines": { @@ -2564,18 +2581,18 @@ } }, "node_modules/@commitlint/to-lines": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-17.4.0.tgz", - "integrity": "sha512-LcIy/6ZZolsfwDUWfN1mJ+co09soSuNASfKEU5sCmgFCvX5iHwRYLiIuoqXzOVDYOy7E7IcHilr/KS0e5T+0Hg==", + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-17.8.1.tgz", + "integrity": "sha512-LE0jb8CuR/mj6xJyrIk8VLz03OEzXFgLdivBytoooKO5xLt5yalc8Ma5guTWobw998sbR3ogDd+2jed03CFmJA==", "dev": true, "engines": { "node": ">=v14" } }, "node_modules/@commitlint/top-level": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-17.4.0.tgz", - "integrity": "sha512-/1loE/g+dTTQgHnjoCy0AexKAEFyHsR2zRB4NWrZ6lZSMIxAhBJnmCqwao7b4H8888PsfoTBCLBYIw8vGnej8g==", + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-17.8.1.tgz", + "integrity": "sha512-l6+Z6rrNf5p333SHfEte6r+WkOxGlWK4bLuZKbtf/2TXRN+qhrvn1XE63VhD8Oe9oIHQ7F7W1nG2k/TJFhx2yA==", "dev": true, "dependencies": { "find-up": "^5.0.0" @@ -2585,9 +2602,9 @@ } }, "node_modules/@commitlint/types": { - "version": "17.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-17.4.4.tgz", - "integrity": "sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==", + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-17.8.1.tgz", + "integrity": "sha512-PXDQXkAmiMEG162Bqdh9ChML/GJZo6vU+7F03ALKDK8zYc6SuAr47LjG7hGYRqUOz+WK0dU7bQ0xzuqFMdxzeQ==", "dev": true, "dependencies": { "chalk": "^4.1.0" @@ -2986,18 +3003,18 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.1.tgz", - "integrity": "sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", + "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -3067,9 +3084,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", - "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", + "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3091,12 +3108,12 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", - "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", + "@humanwhocodes/object-schema": "^2.0.1", "debug": "^4.1.1", "minimatch": "^3.0.5" }, @@ -3118,9 +3135,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, "node_modules/@hutson/parse-repository-url": { @@ -3171,9 +3188,9 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -3294,9 +3311,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.9.0.tgz", - "integrity": "sha512-bV63itrKBC0zdT27qYm6SDZHlkXwFL1xMBuhkn+X7l0+IIhNaH5wuuvZKp6eKhCD4KFhujhfhCT1YxXW6esUIA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.11.0.tgz", + "integrity": "sha512-BHdhcWgeiudl91HvVa2wxqZjSHbheSgIiDvxrF1VjFzBzpTtuDPkOdOi3Iqvc08kXtFkLjhbS+ML9aM8mJS+wQ==", "engines": { "node": ">=14.0.0" } @@ -3427,9 +3444,9 @@ "dev": true }, "node_modules/@types/babel__core": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.2.tgz", - "integrity": "sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA==", + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.4.tgz", + "integrity": "sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg==", "dev": true, "dependencies": { "@babel/parser": "^7.20.7", @@ -3440,18 +3457,18 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.5", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.5.tgz", - "integrity": "sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w==", + "version": "7.6.7", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", + "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", "dev": true, "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.2.tgz", - "integrity": "sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "dependencies": { "@babel/parser": "^7.1.0", @@ -3459,18 +3476,18 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.2.tgz", - "integrity": "sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw==", + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", + "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", "dev": true, "dependencies": { "@babel/types": "^7.20.7" } }, "node_modules/@types/eslint": { - "version": "8.44.4", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.4.tgz", - "integrity": "sha512-lOzjyfY/D9QR4hY9oblZ76B90MYTB3RrQ4z2vBIJKj9ROCRqdkYl2gSUx1x1a4IWPjKJZLL4Aw1Zfay7eMnmnA==", + "version": "8.44.7", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.7.tgz", + "integrity": "sha512-f5ORu2hcBbKei97U73mf+l9t4zTGl74IqZ0GQk4oVea/VS8tQZYkUveSYojk+frraAVYId0V2WC9O4PTNru2FQ==", "dev": true, "dependencies": { "@types/estree": "*", @@ -3478,15 +3495,15 @@ } }, "node_modules/@types/estree": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.2.tgz", - "integrity": "sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, "node_modules/@types/json-schema": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", - "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "node_modules/@types/json5": { @@ -3496,42 +3513,42 @@ "dev": true }, "node_modules/@types/minimist": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.3.tgz", - "integrity": "sha512-ZYFzrvyWUNhaPomn80dsMNgMeXxNWZBdkuG/hWlUvXvbdUH8ZERNBGXnU87McuGcWDsyzX2aChCv/SVN348k3A==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", "dev": true }, "node_modules/@types/node": { - "version": "20.8.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.4.tgz", - "integrity": "sha512-ZVPnqU58giiCjSxjVUESDtdPk4QR5WQhhINbc9UBrKLU68MX5BF6kbQzTrkwbolyr0X8ChBpXfavr5mZFKZQ5A==", + "version": "20.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz", + "integrity": "sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==", "dev": true, "dependencies": { - "undici-types": "~5.25.1" + "undici-types": "~5.26.4" } }, "node_modules/@types/normalize-package-data": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.2.tgz", - "integrity": "sha512-lqa4UEhhv/2sjjIQgjX8B+RBjj47eo0mzGasklVJ78UKGQY1r0VpB9XHDaZZO9qzEFDdy4MrXLuEaSmPrPSe/A==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", "dev": true }, "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", "dev": true }, "node_modules/@types/prop-types": { - "version": "15.7.8", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.8.tgz", - "integrity": "sha512-kMpQpfZKSCBqltAJwskgePRaYRFukDkm1oItcAbC3gNELR20XIBcN9VRgg4+m8DKsTfkWeA4m4Imp4DDuWy7FQ==", + "version": "15.7.10", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.10.tgz", + "integrity": "sha512-mxSnDQxPqsZxmeShFH+uwQ4kO4gcJcGahjjMFeLbKE95IAZiiZyiEepGZjtXJ7hN/yfu0bu9xN2ajcU0JcxX6A==", "dev": true }, "node_modules/@types/react": { - "version": "18.2.28", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.28.tgz", - "integrity": "sha512-ad4aa/RaaJS3hyGz0BGegdnSRXQBkd1CCYDCdNjBPg90UUpLgo+WlJqb9fMYUxtehmzF3PJaTWqRZjko6BRzBg==", + "version": "18.2.37", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.37.tgz", + "integrity": "sha512-RGAYMi2bhRgEXT3f4B92WTohopH6bIXw05FuGlmJEnv/omEn190+QYEIYxIAuIBdKgboYYdVved2p1AxZVQnaw==", "dev": true, "dependencies": { "@types/prop-types": "*", @@ -3540,24 +3557,24 @@ } }, "node_modules/@types/react-dom": { - "version": "18.2.13", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.13.tgz", - "integrity": "sha512-eJIUv7rPP+EC45uNYp/ThhSpE16k22VJUknt5OLoH9tbXoi8bMhwLf5xRuWMywamNbWzhrSmU7IBJfPup1+3fw==", + "version": "18.2.15", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.15.tgz", + "integrity": "sha512-HWMdW+7r7MR5+PZqJF6YFNSCtjz1T0dsvo/f1BV6HkV+6erD/nA7wd9NM00KVG83zf2nJ7uATPO9ttdIPvi3gg==", "dev": true, "dependencies": { "@types/react": "*" } }, "node_modules/@types/scheduler": { - "version": "0.16.4", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.4.tgz", - "integrity": "sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ==", + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.6.tgz", + "integrity": "sha512-Vlktnchmkylvc9SnwwwozTv04L/e1NykF5vgoQ0XTmI8DD+wxfjQuHuvHS3p0r2jz2x2ghPs2h1FVeDirIteWA==", "dev": true }, "node_modules/@types/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.5.tgz", + "integrity": "sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==", "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { @@ -3789,16 +3806,22 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "node_modules/@vitejs/plugin-react": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.1.0.tgz", - "integrity": "sha512-rM0SqazU9iqPUraQ2JlIvReeaxOoRj6n+PzB1C0cBzIbd8qP336nC39/R9yPi3wVcah7E7j/kdU1uCUqMEU4OQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.1.1.tgz", + "integrity": "sha512-Jie2HERK+uh27e+ORXXwEP5h0Y2lS9T2PRGbfebiHGlwzDO0dEnd2aNtOR/qjBlPb1YgxwAONeblL1xqLikLag==", "dev": true, "dependencies": { - "@babel/core": "^7.22.20", + "@babel/core": "^7.23.2", "@babel/plugin-transform-react-jsx-self": "^7.22.5", "@babel/plugin-transform-react-jsx-source": "^7.22.5", - "@types/babel__core": "^7.20.2", + "@types/babel__core": "^7.20.3", "react-refresh": "^0.14.0" }, "engines": { @@ -3809,9 +3832,9 @@ } }, "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -3830,9 +3853,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", + "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==", "dev": true, "engines": { "node": ">=0.4.0" @@ -4079,9 +4102,9 @@ } }, "node_modules/ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", "dev": true }, "node_modules/asynciterator.prototype": { @@ -4157,18 +4180,18 @@ } }, "node_modules/axe-core": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.2.tgz", - "integrity": "sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", + "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/axios": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz", - "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.1.tgz", + "integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==", "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -4248,13 +4271,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.5.tgz", - "integrity": "sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA==", + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz", + "integrity": "sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==", "dev": true, "dependencies": { "@babel/helper-define-polyfill-provider": "^0.4.3", - "core-js-compat": "^3.32.2" + "core-js-compat": "^3.33.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -4490,13 +4513,14 @@ } }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4547,9 +4571,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001547", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001547.tgz", - "integrity": "sha512-W7CrtIModMAxobGhz8iXmDfuJiiKg1WADMO/9x7/CLNin5cpSbuBjooyoIUVB5eyCc36QuTVlkVa1iB2S5+/eA==", + "version": "1.0.30001561", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz", + "integrity": "sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==", "dev": true, "funding": [ { @@ -4627,6 +4651,11 @@ "node": ">= 6" } }, + "node_modules/classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, "node_modules/cli": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", @@ -5608,9 +5637,9 @@ } }, "node_modules/core-js-compat": { - "version": "3.33.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.0.tgz", - "integrity": "sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw==", + "version": "3.33.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.2.tgz", + "integrity": "sha512-axfo+wxFVxnqf8RvxTzoAlzW4gRoacrHeoFlc9n0x50+7BEyZL/Rt3hicaED1/CEd7I6tPCPVUYcJwCMO5XUYw==", "dev": true, "dependencies": { "browserslist": "^4.22.1" @@ -6046,9 +6075,9 @@ } }, "node_modules/define-data-property": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.0.tgz", - "integrity": "sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", "dev": true, "dependencies": { "get-intrinsic": "^1.2.1", @@ -6350,9 +6379,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.551", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.551.tgz", - "integrity": "sha512-/Ng/W/kFv7wdEHYzxdK7Cv0BHEGSkSB3M0Ssl8Ndr1eMiYeas/+Mv4cNaDqamqWx6nd2uQZfPz6g25z25M/sdw==", + "version": "1.4.579", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.579.tgz", + "integrity": "sha512-bJKvA+awBIzYR0xRced7PrQuRIwGQPpo6ZLP62GAShahU9fWpsNN2IP6BSP1BLDDSbxvBVRGAMWlvVVq3npmLA==", "dev": true }, "node_modules/emoji-regex": { @@ -6383,26 +6412,26 @@ } }, "node_modules/es-abstract": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.2.tgz", - "integrity": "sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==", + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", "arraybuffer.prototype.slice": "^1.0.2", "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "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.1", + "get-intrinsic": "^1.2.2", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", "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", @@ -6412,7 +6441,7 @@ "is-string": "^1.0.7", "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.5.1", @@ -6426,7 +6455,7 @@ "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -6458,26 +6487,26 @@ } }, "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "node_modules/es-to-primitive": { @@ -6556,18 +6585,19 @@ } }, "node_modules/eslint": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", - "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", + "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.51.0", - "@humanwhocodes/config-array": "^0.11.11", + "@eslint/eslintrc": "^2.1.3", + "@eslint/js": "8.53.0", + "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -6735,26 +6765,26 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.28.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz", - "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==", + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", + "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", "dev": true, "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.findlastindex": "^1.2.2", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", + "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.8.0", - "has": "^1.0.3", - "is-core-module": "^2.13.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.fromentries": "^2.0.6", - "object.groupby": "^1.0.0", - "object.values": "^1.1.6", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", "semver": "^6.3.1", "tsconfig-paths": "^3.14.2" }, @@ -6820,27 +6850,27 @@ } }, "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", - "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.20.7", - "aria-query": "^5.1.3", - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.6.2", - "axobject-query": "^3.1.1", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", + "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.23.2", + "aria-query": "^5.3.0", + "array-includes": "^3.1.7", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "=4.7.0", + "axobject-query": "^3.2.1", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.3.3", - "language-tags": "=1.0.5", + "es-iterator-helpers": "^1.0.15", + "hasown": "^2.0.0", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "semver": "^6.3.0" + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7" }, "engines": { "node": ">=4.0" @@ -6849,15 +6879,6 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/eslint-plugin-prettier": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz", @@ -6930,9 +6951,9 @@ } }, "node_modules/eslint-plugin-react-refresh": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.3.tgz", - "integrity": "sha512-Hh0wv8bUNY877+sI0BlCUlsS0TYYQqvzEwJsJJPM2WF4RnTStSnSR3zdJYa2nPOJgg3UghXi54lVyMSmpCalzA==", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.4.tgz", + "integrity": "sha512-eD83+65e8YPVg6603Om2iCIwcQJf/y7++MWm4tACtEswFLYMwxwVWAfwN+e19f5Ad/FOyyNg9Dfi5lXhH3Y3rA==", "dev": true, "peerDependencies": { "eslint": ">=7" @@ -7230,9 +7251,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -7432,9 +7453,9 @@ } }, "node_modules/fraction.js": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", - "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", "dev": true, "engines": { "node": "*" @@ -7478,10 +7499,13 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { "version": "1.1.6", @@ -7529,15 +7553,15 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7959,15 +7983,6 @@ "node": ">=6" } }, - "node_modules/has": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", - "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -7987,12 +8002,12 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.1" + "get-intrinsic": "^1.2.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8037,6 +8052,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/homedir-polyfill": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", @@ -8349,13 +8376,13 @@ } }, "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { @@ -8450,12 +8477,12 @@ } }, "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8809,9 +8836,9 @@ } }, "node_modules/is-what": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.15.tgz", - "integrity": "sha512-uKua1wfy3Yt+YqsD6mTUEa2zSi3G1oPlqTflgaPJ7z63vUGN5pxFpnQfeSLMFnJDEsdvOtkp1rUWkYjB4YfhgA==", + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", "engines": { "node": ">=12.13" }, @@ -8881,9 +8908,9 @@ } }, "node_modules/jiti": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", - "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", "dev": true, "bin": { "jiti": "bin/jiti.js" @@ -9189,12 +9216,15 @@ "dev": true }, "node_modules/language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", "dev": true, "dependencies": { - "language-subtag-registry": "~0.3.2" + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" } }, "node_modules/levn": { @@ -9465,96 +9495,24 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "node_modules/lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==", - "dev": true - }, "node_modules/lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", "dev": true }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", - "dev": true - }, - "node_modules/lodash.compact": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash.compact/-/lodash.compact-3.0.1.tgz", - "integrity": "sha512-2ozeiPi+5eBXW1CLtzjk8XQFhQOEMwwfxblqeq6EGyTxZJ1bPATqilY0e6g2SLQpP4KuMeuioBhEnWz5Pr7ICQ==", - "dev": true - }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, - "node_modules/lodash.find": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.find/-/lodash.find-4.6.0.tgz", - "integrity": "sha512-yaRZoAV3Xq28F1iafWN1+a0rflOej93l1DQUejs3SZ41h2O9UJBoS9aueGjPDgAl4B6tPC0NuuchLKaDQQ3Isg==", - "dev": true - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", - "dev": true - }, - "node_modules/lodash.forin": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.forin/-/lodash.forin-4.4.0.tgz", - "integrity": "sha512-APldePP4yvGhMcplVxv9L+exdLHMRHRhH1Q9O70zRJMm9HbTm6zxaihXtNl+ICOBApeFWoH7jNmFr/L4XfWeiQ==", - "dev": true - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "dev": true - }, - "node_modules/lodash.has": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz", - "integrity": "sha512-rnYUdIo6xRCJnQmbVFEwcxF144erlD+M3YcJUVesflU9paQaE8p+fJDcIQrlMYbxoANFL+AB9hZrzSBBk5PL+g==", - "dev": true - }, - "node_modules/lodash.invokemap": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.invokemap/-/lodash.invokemap-4.6.0.tgz", - "integrity": "sha512-CfkycNtMqgUlfjfdh2BhKO/ZXrP8ePOX5lEU/g0R3ItJcnuxWDwokMGKx1hWcfOikmyOVx6X9IwWnDGlgKl61w==", - "dev": true - }, - "node_modules/lodash.isempty": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", - "integrity": "sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg==", - "dev": true - }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", - "dev": true - }, "node_modules/lodash.isfunction": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", "dev": true }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", - "dev": true - }, "node_modules/lodash.ismatch": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", @@ -9573,24 +9531,12 @@ "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", "dev": true }, - "node_modules/lodash.lowerfirst": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/lodash.lowerfirst/-/lodash.lowerfirst-4.3.1.tgz", - "integrity": "sha512-UUKX7VhP1/JL54NXg2aq/E1Sfnjjes8fNYTNkPU8ZmsaVeBvPHKdbNaN79Re5XRL01u6wbq3j0cbYZj71Fcu5w==", - "dev": true - }, "node_modules/lodash.map": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==", "dev": true }, - "node_modules/lodash.mapvalues": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", - "integrity": "sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==", - "dev": true - }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -9603,12 +9549,6 @@ "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", "dev": true }, - "node_modules/lodash.pick": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==", - "dev": true - }, "node_modules/lodash.snakecase": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", @@ -9627,24 +9567,12 @@ "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", "dev": true }, - "node_modules/lodash.uniqby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", - "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", - "dev": true - }, "node_modules/lodash.upperfirst": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", "dev": true }, - "node_modules/lodash.values": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-4.3.0.tgz", - "integrity": "sha512-r0RwvdCv8id9TUblb/O7rYPwVy6lerCbcawrfdo9iC/1t1wsNMJknO79WNBgwkH0hIeJ08jmvvESbFpNb4jH0Q==", - "dev": true - }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -9957,36 +9885,14 @@ } }, "node_modules/miragejs": { - "version": "0.1.47", - "resolved": "https://registry.npmjs.org/miragejs/-/miragejs-0.1.47.tgz", - "integrity": "sha512-99tuCbIAlMhNhyF3s5d3+5/FdJ7O4jSq/5e3e+sDv7L8dZdwJuwutXe0pobJ7hm6yRChTDjK+Nn8dZZd175wbg==", + "version": "0.1.48", + "resolved": "https://registry.npmjs.org/miragejs/-/miragejs-0.1.48.tgz", + "integrity": "sha512-MGZAq0Q3OuRYgZKvlB69z4gLN4G3PvgC4A2zhkCXCXrLD5wm2cCnwNB59xOBVA+srZ0zEes6u+VylcPIkB4SqA==", "dev": true, "dependencies": { "@miragejs/pretender-node-polyfill": "^0.1.0", "inflected": "^2.0.4", - "lodash.assign": "^4.2.0", - "lodash.camelcase": "^4.3.0", - "lodash.clonedeep": "^4.5.0", - "lodash.compact": "^3.0.1", - "lodash.find": "^4.6.0", - "lodash.flatten": "^4.4.0", - "lodash.forin": "^4.4.0", - "lodash.get": "^4.4.2", - "lodash.has": "^4.5.2", - "lodash.invokemap": "^4.6.0", - "lodash.isempty": "^4.4.0", - "lodash.isequal": "^4.5.0", - "lodash.isfunction": "^3.0.9", - "lodash.isinteger": "^4.0.4", - "lodash.isplainobject": "^4.0.6", - "lodash.lowerfirst": "^4.3.1", - "lodash.map": "^4.6.0", - "lodash.mapvalues": "^4.6.0", - "lodash.pick": "^4.4.0", - "lodash.snakecase": "^4.1.1", - "lodash.uniq": "^4.5.0", - "lodash.uniqby": "^4.7.0", - "lodash.values": "^4.3.0", + "lodash": "^4.0.0", "pretender": "^3.4.7" }, "engines": { @@ -10034,9 +9940,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, "funding": [ { @@ -10138,9 +10044,9 @@ } }, "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -10762,9 +10668,9 @@ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "engines": { "node": ">=6" @@ -10832,6 +10738,17 @@ "react": "^18.2.0" } }, + "node_modules/react-easy-swipe": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/react-easy-swipe/-/react-easy-swipe-0.0.21.tgz", + "integrity": "sha512-OeR2jAxdoqUMHIn/nS9fgreI5hSpgGoL5ezdal4+oO7YSSgJR8ga+PkYGJrSrJ9MKlPcQjMQXnketrD7WNmNsg==", + "dependencies": { + "prop-types": "^15.5.8" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/react-icons": { "version": "4.11.0", "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.11.0.tgz", @@ -10879,12 +10796,22 @@ "node": ">=0.10.0" } }, + "node_modules/react-responsive-carousel": { + "version": "3.2.23", + "resolved": "https://registry.npmjs.org/react-responsive-carousel/-/react-responsive-carousel-3.2.23.tgz", + "integrity": "sha512-pqJLsBaKHWJhw/ItODgbVoziR2z4lpcJg+YwmRlSk4rKH32VE633mAtZZ9kDXjy4wFO+pgUZmDKPsPe1fPmHCg==", + "dependencies": { + "classnames": "^2.2.5", + "prop-types": "^15.5.8", + "react-easy-swipe": "^0.0.21" + } + }, "node_modules/react-router": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.16.0.tgz", - "integrity": "sha512-VT4Mmc4jj5YyjpOi5jOf0I+TYzGpvzERy4ckNSvSh2RArv8LLoCxlsZ2D+tc7zgjxcY34oTz2hZaeX5RVprKqA==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.18.0.tgz", + "integrity": "sha512-vk2y7Dsy8wI02eRRaRmOs9g2o+aE72YCx5q9VasT1N9v+lrdB79tIqrjMfByHiY5+6aYkH2rUa5X839nwWGPDg==", "dependencies": { - "@remix-run/router": "1.9.0" + "@remix-run/router": "1.11.0" }, "engines": { "node": ">=14.0.0" @@ -10894,12 +10821,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.16.0.tgz", - "integrity": "sha512-aTfBLv3mk/gaKLxgRDUPbPw+s4Y/O+ma3rEN1u8EgEpLpPe6gNjIsWt9rxushMHHMb7mSwxRGdGlGdvmFsyPIg==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.18.0.tgz", + "integrity": "sha512-Ubrue4+Ercc/BoDkFQfc6og5zRQ4A8YxSO3Knsne+eRbZ+IepAsK249XBH/XaFuOYOYr3L3r13CXTLvYt5JDjw==", "dependencies": { - "@remix-run/router": "1.9.0", - "react-router": "6.16.0" + "@remix-run/router": "1.11.0", + "react-router": "6.18.0" }, "engines": { "node": ">=14.0.0" @@ -11520,6 +11447,21 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/set-function-name": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", @@ -12221,9 +12163,9 @@ "dev": true }, "node_modules/tailwindcss": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", - "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.5.tgz", + "integrity": "sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==", "dev": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", @@ -12231,10 +12173,10 @@ "chokidar": "^3.5.3", "didyoumean": "^1.2.2", "dlv": "^1.1.3", - "fast-glob": "^3.2.12", + "fast-glob": "^3.3.0", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", - "jiti": "^1.18.2", + "jiti": "^1.19.1", "lilconfig": "^2.1.0", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", @@ -12608,9 +12550,9 @@ } }, "node_modules/undici-types": { - "version": "5.25.3", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", - "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==", + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": true }, "node_modules/unicode-canonical-property-names-ecmascript": { @@ -12654,9 +12596,9 @@ } }, "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "engines": { "node": ">= 10.0.0" @@ -12750,9 +12692,9 @@ } }, "node_modules/vite": { - "version": "4.4.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.11.tgz", - "integrity": "sha512-ksNZJlkcU9b0lBwAGZGGaZHCMqHsc8OpgtoYhsQ4/I2v5cnpmmmqe5pM4nv/4Hn6G/2GhTdj0DhZh2e+Er1q5A==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", + "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", "dev": true, "dependencies": { "esbuild": "^0.18.10", @@ -12916,13 +12858,13 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", - "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.4", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^1.0.0" diff --git a/package.json b/package.json index da245aa..056a879 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "recipe-app", "private": true, - "version": "0.0.13", + "version": "0.0.32", "type": "module", "scripts": { "dev": "vite", @@ -37,6 +37,7 @@ "react-dom": "^18.2.0", "react-icons": "^4.11.0", "react-query": "^3.39.3", + "react-responsive-carousel": "^3.2.23", "react-router-dom": "^6.4.3" }, "devDependencies": { diff --git a/screenshot-home-dev.png b/public/screenshot-home-dev.png similarity index 100% rename from screenshot-home-dev.png rename to public/screenshot-home-dev.png diff --git a/src/App.jsx b/src/App.jsx index fc7bf32..21d7c56 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,10 +1,18 @@ import Spa from "./routes"; import makeServer from "./mirageServer/server"; import { Routes, Route } from "react-router-dom"; -import { Home, About, Search, RecipeDetails, Components } from "@/pages"; +import { + Home, + About, + Search, + RecipeDetails, + Components, + PageNotFound, +} from "@/pages"; +import Favorites from "./pages/Favorites"; // Please keep on when possible to avoid using up our Tasty API free quota // All api calls will be intercepted and fulfilled by the mirage server. -const USE_MIRAGE_API = true; +const USE_MIRAGE_API = false; if (USE_MIRAGE_API) { makeServer(); @@ -21,6 +29,8 @@ function App() { } /> } /> + } /> + } /> ); diff --git a/src/api/posts.js b/src/api/posts.js deleted file mode 100644 index e63846a..0000000 --- a/src/api/posts.js +++ /dev/null @@ -1,15 +0,0 @@ -import axios from "axios"; - -export async function getPosts() { - const { data } = await axios.get( - "https://jsonplaceholder.typicode.com/posts", - ); - return data; -} - -export async function getPostById(id) { - const { data } = await axios.get( - `https://jsonplaceholder.typicode.com/posts/${id}`, - ); - return data; -} diff --git a/src/api/recipes.js b/src/api/recipes.js index a7366b3..f6543c9 100644 --- a/src/api/recipes.js +++ b/src/api/recipes.js @@ -31,10 +31,34 @@ export async function fetchRecipes(search, from = 0, size = 20) { params: { from, size, q: search }, }, ); - localStorage.setItem( - `${search}-searchRecipeResults`, - JSON.stringify(data.results), + try { + localStorage.setItem( + `${search}-searchRecipeResults`, + JSON.stringify(data.results), + ); + } catch (error) { + console.error("Could not write to local storage:", error); + } + return data; + } catch (error) { + console.error(error); + } +} + +export async function fetchRecipeDetails(id) { + console.log(`Fetching ${id} recipe details`); + try { + const { data } = await axios.get( + `https://tasty.p.rapidapi.com/recipes/get-more-info`, + { + headers: { + "X-RapidAPI-Key": import.meta.env.VITE_TASTY_API_KEY, + "X-RapidAPI-Host": "tasty.p.rapidapi.com", + }, + params: { id }, + }, ); + console.log("fetched Details", data); return data; } catch (error) { console.error(error); diff --git a/src/api/tips.js b/src/api/tips.js new file mode 100644 index 0000000..787921f --- /dev/null +++ b/src/api/tips.js @@ -0,0 +1,17 @@ +import axios from "axios"; + +export async function fetchTips(id, from = 0, size = 20) { + console.log(`Fetching ${id} tips`); + try { + const { data } = await axios.get(`https://tasty.p.rapidapi.com/tips/list`, { + headers: { + "X-RapidAPI-Key": import.meta.env.VITE_TASTY_API_KEY, + "X-RapidAPI-Host": "tasty.p.rapidapi.com", + }, + params: { from, size, id: id }, + }); + return data.results; + } catch (error) { + console.error(error); + } +} diff --git a/src/assets/FeaturedChickenSweetPotatos.jpg b/src/assets/FeaturedChickenSweetPotatos.jpg new file mode 100644 index 0000000..ff66e85 Binary files /dev/null and b/src/assets/FeaturedChickenSweetPotatos.jpg differ diff --git a/src/assets/about/avatar-darrick.jpg b/src/assets/about/avatar-darrick.jpg new file mode 100644 index 0000000..71f4e22 Binary files /dev/null and b/src/assets/about/avatar-darrick.jpg differ diff --git a/src/assets/about/avatar-grey.jpg b/src/assets/about/avatar-grey.jpg new file mode 100644 index 0000000..606f2a4 Binary files /dev/null and b/src/assets/about/avatar-grey.jpg differ diff --git a/src/assets/about/avatar-henri.jpg b/src/assets/about/avatar-henri.jpg new file mode 100644 index 0000000..d82cd2f Binary files /dev/null and b/src/assets/about/avatar-henri.jpg differ diff --git a/src/assets/about/avatar-joseph.webp b/src/assets/about/avatar-joseph.webp new file mode 100644 index 0000000..8acb7d6 Binary files /dev/null and b/src/assets/about/avatar-joseph.webp differ diff --git a/src/assets/about/avatar-tim.jpg b/src/assets/about/avatar-tim.jpg new file mode 100644 index 0000000..cbbd59d Binary files /dev/null and b/src/assets/about/avatar-tim.jpg differ diff --git a/src/assets/about/chingu-rectangle.png b/src/assets/about/chingu-rectangle.png new file mode 100644 index 0000000..8b1f75c Binary files /dev/null and b/src/assets/about/chingu-rectangle.png differ diff --git a/src/assets/about/yumi-standing-with-orange-apron-holding-fruit-basket.png b/src/assets/about/yumi-standing-with-orange-apron-holding-fruit-basket.png new file mode 100644 index 0000000..8528a50 Binary files /dev/null and b/src/assets/about/yumi-standing-with-orange-apron-holding-fruit-basket.png differ diff --git a/src/assets/about/yumi-with-blue-apron-holding-brown-salad-bowl.png b/src/assets/about/yumi-with-blue-apron-holding-brown-salad-bowl.png new file mode 100644 index 0000000..65e6e73 Binary files /dev/null and b/src/assets/about/yumi-with-blue-apron-holding-brown-salad-bowl.png differ diff --git a/src/assets/brand/Yumi-reading/Yumi-reading.png b/src/assets/brand/Yumi-reading/Yumi-reading.png new file mode 100644 index 0000000..8e6f492 Binary files /dev/null and b/src/assets/brand/Yumi-reading/Yumi-reading.png differ diff --git a/src/assets/brand/chef-carrots/ChefCarrots.jsx b/src/assets/brand/chef-carrots/ChefCarrots.jsx new file mode 100644 index 0000000..eaafef0 --- /dev/null +++ b/src/assets/brand/chef-carrots/ChefCarrots.jsx @@ -0,0 +1,60 @@ +import PropTypes from "prop-types"; +import { Picture } from "@/features/ui"; + +// WebP Imports +import Webp180 from "./chef-carrots-180w.webp"; +import Webp300 from "./chef-carrots-300w.webp"; +import Webp396 from "./chef-carrots-396w.webp"; +import Webp600 from "./chef-carrots-600w.webp"; +import Webp900 from "./chef-carrots-900w.webp"; +import Webp1200 from "./chef-carrots-1200w.webp"; + +// PNG Imports +import Png180 from "./chef-carrots-180w.png"; +import Png300 from "./chef-carrots-300w.png"; +import Png396 from "./chef-carrots-396w.png"; +import Png600 from "./chef-carrots-600w.png"; +import Png900 from "./chef-carrots-900w.png"; +import Png1200 from "./chef-carrots-1200w.png"; + +const files = { + webp: { + 180: Webp180, + 300: Webp300, + 396: Webp396, + 600: Webp600, + 900: Webp900, + 1200: Webp1200, + }, + png: { + 180: Png180, + 300: Png300, + 396: Png396, + 600: Png600, + 900: Png900, + 1200: Png1200, + }, +}; + +const ChefCarrots = ({ + resolution = 300, + alt = "Chef Carrots the Friendly Bunny", + className, +}) => { + return ( + + ); +}; + +ChefCarrots.propTypes = { + alt: PropTypes.string, + resolution: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), + className: PropTypes.string, +}; + +export default ChefCarrots; diff --git a/src/assets/brand/chef-carrots/chef-carrots-1200w.png b/src/assets/brand/chef-carrots/chef-carrots-1200w.png new file mode 100644 index 0000000..4e2d82f Binary files /dev/null and b/src/assets/brand/chef-carrots/chef-carrots-1200w.png differ diff --git a/src/assets/brand/chef-carrots/chef-carrots-1200w.webp b/src/assets/brand/chef-carrots/chef-carrots-1200w.webp new file mode 100644 index 0000000..acc1014 Binary files /dev/null and b/src/assets/brand/chef-carrots/chef-carrots-1200w.webp differ diff --git a/src/assets/brand/chef-carrots/chef-carrots-180w.png b/src/assets/brand/chef-carrots/chef-carrots-180w.png new file mode 100644 index 0000000..a29beaf Binary files /dev/null and b/src/assets/brand/chef-carrots/chef-carrots-180w.png differ diff --git a/src/assets/brand/chef-carrots/chef-carrots-180w.webp b/src/assets/brand/chef-carrots/chef-carrots-180w.webp new file mode 100644 index 0000000..09cb88a Binary files /dev/null and b/src/assets/brand/chef-carrots/chef-carrots-180w.webp differ diff --git a/src/assets/brand/chef-carrots/chef-carrots-300w.png b/src/assets/brand/chef-carrots/chef-carrots-300w.png new file mode 100644 index 0000000..dadd219 Binary files /dev/null and b/src/assets/brand/chef-carrots/chef-carrots-300w.png differ diff --git a/src/assets/brand/chef-carrots/chef-carrots-300w.webp b/src/assets/brand/chef-carrots/chef-carrots-300w.webp new file mode 100644 index 0000000..6d862e4 Binary files /dev/null and b/src/assets/brand/chef-carrots/chef-carrots-300w.webp differ diff --git a/src/assets/brand/chef-carrots/chef-carrots-396w.png b/src/assets/brand/chef-carrots/chef-carrots-396w.png new file mode 100644 index 0000000..b284458 Binary files /dev/null and b/src/assets/brand/chef-carrots/chef-carrots-396w.png differ diff --git a/src/assets/brand/chef-carrots/chef-carrots-396w.webp b/src/assets/brand/chef-carrots/chef-carrots-396w.webp new file mode 100644 index 0000000..be54057 Binary files /dev/null and b/src/assets/brand/chef-carrots/chef-carrots-396w.webp differ diff --git a/src/assets/brand/chef-carrots/chef-carrots-600w.png b/src/assets/brand/chef-carrots/chef-carrots-600w.png new file mode 100644 index 0000000..6f7cf9f Binary files /dev/null and b/src/assets/brand/chef-carrots/chef-carrots-600w.png differ diff --git a/src/assets/brand/chef-carrots/chef-carrots-600w.webp b/src/assets/brand/chef-carrots/chef-carrots-600w.webp new file mode 100644 index 0000000..8b25870 Binary files /dev/null and b/src/assets/brand/chef-carrots/chef-carrots-600w.webp differ diff --git a/src/assets/brand/chef-carrots/chef-carrots-900w.png b/src/assets/brand/chef-carrots/chef-carrots-900w.png new file mode 100644 index 0000000..673deb8 Binary files /dev/null and b/src/assets/brand/chef-carrots/chef-carrots-900w.png differ diff --git a/src/assets/brand/chef-carrots/chef-carrots-900w.webp b/src/assets/brand/chef-carrots/chef-carrots-900w.webp new file mode 100644 index 0000000..66bf85c Binary files /dev/null and b/src/assets/brand/chef-carrots/chef-carrots-900w.webp differ diff --git a/src/assets/brand/index.js b/src/assets/brand/index.js index 5cd4213..129e214 100644 --- a/src/assets/brand/index.js +++ b/src/assets/brand/index.js @@ -1,5 +1,6 @@ import BellPeppers from "./bell-peppers/BellPeppers"; import YumiWithSpatula from "./yumi-with-spatula/YumiWithSpatula"; import YumiWithSpoon from "./yumi-with-spoon/YumiWithSpoon"; +import YumiReading from "./Yumi-reading/Yumi-reading.png"; -export { BellPeppers, YumiWithSpatula, YumiWithSpoon }; +export { BellPeppers, YumiWithSpatula, YumiWithSpoon, YumiReading }; diff --git a/src/assets/brand/lime/Lime.jsx b/src/assets/brand/lime/Lime.jsx new file mode 100644 index 0000000..03c4586 --- /dev/null +++ b/src/assets/brand/lime/Lime.jsx @@ -0,0 +1,68 @@ +import PropTypes from "prop-types"; +import { Picture } from "@/features/ui"; + +// WebP Imports +import Webp111 from "./lime-111w.webp"; +import Webp167 from "./lime-167w.webp"; +import Webp279 from "./lime-279w.webp"; +import Webp368 from "./lime-368w.webp"; +import Webp557 from "./lime-557w.webp"; +import Webp836 from "./lime-836w.webp"; +import Webp891 from "./lime-891w.webp"; +import Webp1003 from "./lime-1003w.webp"; +import Webp1114 from "./lime-1114w.webp"; + +// PNG Imports +import Png111 from "./lime-111w.png"; +import Png167 from "./lime-167w.png"; +import Png279 from "./lime-279w.png"; +import Png368 from "./lime-368w.png"; +import Png557 from "./lime-557w.png"; +import Png836 from "./lime-836w.png"; +import Png891 from "./lime-891w.png"; +import Png1003 from "./lime-1003w.png"; +import Png1114 from "./lime-1114w.png"; + +const files = { + webp: { + 111: Webp111, + 167: Webp167, + 279: Webp279, + 368: Webp368, + 557: Webp557, + 836: Webp836, + 891: Webp891, + 1003: Webp1003, + 1114: Webp1114, + }, + png: { + 111: Png111, + 167: Png167, + 279: Png279, + 368: Png368, + 557: Png557, + 836: Png836, + 891: Png891, + 1003: Png1003, + 1114: Png1114, + }, +}; + +const Lime = ({ resolution = 360, alt = "Lemons and Lime", className }) => { + return ( + + ); +}; + +Lime.propTypes = { + alt: PropTypes.string, + resolution: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), + className: PropTypes.string, +}; + +export default Lime; diff --git a/src/assets/brand/lime/lime-1003w.png b/src/assets/brand/lime/lime-1003w.png new file mode 100644 index 0000000..735f2b6 Binary files /dev/null and b/src/assets/brand/lime/lime-1003w.png differ diff --git a/src/assets/brand/lime/lime-1003w.webp b/src/assets/brand/lime/lime-1003w.webp new file mode 100644 index 0000000..ea6604f Binary files /dev/null and b/src/assets/brand/lime/lime-1003w.webp differ diff --git a/src/assets/brand/lime/lime-1114w.png b/src/assets/brand/lime/lime-1114w.png new file mode 100644 index 0000000..7ea4f68 Binary files /dev/null and b/src/assets/brand/lime/lime-1114w.png differ diff --git a/src/assets/brand/lime/lime-1114w.webp b/src/assets/brand/lime/lime-1114w.webp new file mode 100644 index 0000000..95e5233 Binary files /dev/null and b/src/assets/brand/lime/lime-1114w.webp differ diff --git a/src/assets/brand/lime/lime-111w.png b/src/assets/brand/lime/lime-111w.png new file mode 100644 index 0000000..7a935ea Binary files /dev/null and b/src/assets/brand/lime/lime-111w.png differ diff --git a/src/assets/brand/lime/lime-111w.webp b/src/assets/brand/lime/lime-111w.webp new file mode 100644 index 0000000..72664da Binary files /dev/null and b/src/assets/brand/lime/lime-111w.webp differ diff --git a/src/assets/brand/lime/lime-167w.png b/src/assets/brand/lime/lime-167w.png new file mode 100644 index 0000000..ef2f780 Binary files /dev/null and b/src/assets/brand/lime/lime-167w.png differ diff --git a/src/assets/brand/lime/lime-167w.webp b/src/assets/brand/lime/lime-167w.webp new file mode 100644 index 0000000..ed4060d Binary files /dev/null and b/src/assets/brand/lime/lime-167w.webp differ diff --git a/src/assets/brand/lime/lime-279w.png b/src/assets/brand/lime/lime-279w.png new file mode 100644 index 0000000..2a6d867 Binary files /dev/null and b/src/assets/brand/lime/lime-279w.png differ diff --git a/src/assets/brand/lime/lime-279w.webp b/src/assets/brand/lime/lime-279w.webp new file mode 100644 index 0000000..c7b238d Binary files /dev/null and b/src/assets/brand/lime/lime-279w.webp differ diff --git a/src/assets/brand/lime/lime-368w.png b/src/assets/brand/lime/lime-368w.png new file mode 100644 index 0000000..454e159 Binary files /dev/null and b/src/assets/brand/lime/lime-368w.png differ diff --git a/src/assets/brand/lime/lime-368w.webp b/src/assets/brand/lime/lime-368w.webp new file mode 100644 index 0000000..85b9a8d Binary files /dev/null and b/src/assets/brand/lime/lime-368w.webp differ diff --git a/src/assets/brand/lime/lime-557w.png b/src/assets/brand/lime/lime-557w.png new file mode 100644 index 0000000..7663e12 Binary files /dev/null and b/src/assets/brand/lime/lime-557w.png differ diff --git a/src/assets/brand/lime/lime-557w.webp b/src/assets/brand/lime/lime-557w.webp new file mode 100644 index 0000000..506356f Binary files /dev/null and b/src/assets/brand/lime/lime-557w.webp differ diff --git a/src/assets/brand/lime/lime-836w.png b/src/assets/brand/lime/lime-836w.png new file mode 100644 index 0000000..956ac04 Binary files /dev/null and b/src/assets/brand/lime/lime-836w.png differ diff --git a/src/assets/brand/lime/lime-836w.webp b/src/assets/brand/lime/lime-836w.webp new file mode 100644 index 0000000..11709f8 Binary files /dev/null and b/src/assets/brand/lime/lime-836w.webp differ diff --git a/src/assets/brand/lime/lime-891w.png b/src/assets/brand/lime/lime-891w.png new file mode 100644 index 0000000..c648726 Binary files /dev/null and b/src/assets/brand/lime/lime-891w.png differ diff --git a/src/assets/brand/lime/lime-891w.webp b/src/assets/brand/lime/lime-891w.webp new file mode 100644 index 0000000..d613b7b Binary files /dev/null and b/src/assets/brand/lime/lime-891w.webp differ diff --git a/src/assets/brand/plants-tl/PlantsTL.jsx b/src/assets/brand/plants-tl/PlantsTL.jsx new file mode 100644 index 0000000..39269e0 --- /dev/null +++ b/src/assets/brand/plants-tl/PlantsTL.jsx @@ -0,0 +1,60 @@ +import PropTypes from "prop-types"; +import { Picture } from "@/features/ui"; + +// WebP Imports +import Webp50 from "./plants-tl-50w.webp"; +import Webp126 from "./plants-tl-126w.webp"; +import Webp166 from "./plants-tl-166w.webp"; +import Webp252 from "./plants-tl-252w.webp"; +import Webp377 from "./plants-tl-377w.webp"; +import Webp402 from "./plants-tl-402w.webp"; +import Webp503 from "./plants-tl-503w.webp"; + +// PNG Imports +import Png50 from "./plants-tl-50w.png"; +import Png126 from "./plants-tl-126w.png"; +import Png166 from "./plants-tl-166w.png"; +import Png252 from "./plants-tl-252w.png"; +import Png377 from "./plants-tl-377w.png"; +import Png402 from "./plants-tl-402w.png"; +import Png503 from "./plants-tl-503w.png"; + +const files = { + webp: { + 50: Webp50, + 126: Webp126, + 166: Webp166, + 252: Webp252, + 377: Webp377, + 402: Webp402, + 503: Webp503, + }, + png: { + 50: Png50, + 126: Png126, + 166: Png166, + 252: Png252, + 377: Png377, + 402: Png402, + 503: Png503, + }, +}; + +const PlantsTL = ({ resolution = 166, alt = "Green Leaves", className }) => { + return ( + + ); +}; + +PlantsTL.propTypes = { + alt: PropTypes.string, + resolution: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), + className: PropTypes.string, +}; + +export default PlantsTL; diff --git a/src/assets/brand/plants-tl/plants-tl-126w.png b/src/assets/brand/plants-tl/plants-tl-126w.png new file mode 100644 index 0000000..66d74d3 Binary files /dev/null and b/src/assets/brand/plants-tl/plants-tl-126w.png differ diff --git a/src/assets/brand/plants-tl/plants-tl-126w.webp b/src/assets/brand/plants-tl/plants-tl-126w.webp new file mode 100644 index 0000000..d655279 Binary files /dev/null and b/src/assets/brand/plants-tl/plants-tl-126w.webp differ diff --git a/src/assets/brand/plants-tl/plants-tl-166w.png b/src/assets/brand/plants-tl/plants-tl-166w.png new file mode 100644 index 0000000..ec9c9c9 Binary files /dev/null and b/src/assets/brand/plants-tl/plants-tl-166w.png differ diff --git a/src/assets/brand/plants-tl/plants-tl-166w.webp b/src/assets/brand/plants-tl/plants-tl-166w.webp new file mode 100644 index 0000000..1581c6e Binary files /dev/null and b/src/assets/brand/plants-tl/plants-tl-166w.webp differ diff --git a/src/assets/brand/plants-tl/plants-tl-252w.png b/src/assets/brand/plants-tl/plants-tl-252w.png new file mode 100644 index 0000000..777670e Binary files /dev/null and b/src/assets/brand/plants-tl/plants-tl-252w.png differ diff --git a/src/assets/brand/plants-tl/plants-tl-252w.webp b/src/assets/brand/plants-tl/plants-tl-252w.webp new file mode 100644 index 0000000..9914b35 Binary files /dev/null and b/src/assets/brand/plants-tl/plants-tl-252w.webp differ diff --git a/src/assets/brand/plants-tl/plants-tl-377w.png b/src/assets/brand/plants-tl/plants-tl-377w.png new file mode 100644 index 0000000..b8ca4c8 Binary files /dev/null and b/src/assets/brand/plants-tl/plants-tl-377w.png differ diff --git a/src/assets/brand/plants-tl/plants-tl-377w.webp b/src/assets/brand/plants-tl/plants-tl-377w.webp new file mode 100644 index 0000000..f45b3df Binary files /dev/null and b/src/assets/brand/plants-tl/plants-tl-377w.webp differ diff --git a/src/assets/brand/plants-tl/plants-tl-402w.png b/src/assets/brand/plants-tl/plants-tl-402w.png new file mode 100644 index 0000000..1c73940 Binary files /dev/null and b/src/assets/brand/plants-tl/plants-tl-402w.png differ diff --git a/src/assets/brand/plants-tl/plants-tl-402w.webp b/src/assets/brand/plants-tl/plants-tl-402w.webp new file mode 100644 index 0000000..72aa45d Binary files /dev/null and b/src/assets/brand/plants-tl/plants-tl-402w.webp differ diff --git a/src/assets/brand/plants-tl/plants-tl-503w.png b/src/assets/brand/plants-tl/plants-tl-503w.png new file mode 100644 index 0000000..8d10bc0 Binary files /dev/null and b/src/assets/brand/plants-tl/plants-tl-503w.png differ diff --git a/src/assets/brand/plants-tl/plants-tl-503w.webp b/src/assets/brand/plants-tl/plants-tl-503w.webp new file mode 100644 index 0000000..5afca26 Binary files /dev/null and b/src/assets/brand/plants-tl/plants-tl-503w.webp differ diff --git a/src/assets/brand/plants-tl/plants-tl-50w.png b/src/assets/brand/plants-tl/plants-tl-50w.png new file mode 100644 index 0000000..140db2d Binary files /dev/null and b/src/assets/brand/plants-tl/plants-tl-50w.png differ diff --git a/src/assets/brand/plants-tl/plants-tl-50w.webp b/src/assets/brand/plants-tl/plants-tl-50w.webp new file mode 100644 index 0000000..759721a Binary files /dev/null and b/src/assets/brand/plants-tl/plants-tl-50w.webp differ diff --git a/src/assets/brand/tomato/Tomato.jsx b/src/assets/brand/tomato/Tomato.jsx new file mode 100644 index 0000000..2ba1b36 --- /dev/null +++ b/src/assets/brand/tomato/Tomato.jsx @@ -0,0 +1,56 @@ +import PropTypes from "prop-types"; +import { Picture } from "@/features/ui"; + +// WebP Imports +import Webp29 from "./tomato-29w.webp"; +import Webp44 from "./tomato-44w.webp"; +import Webp73 from "./tomato-73w.webp"; +import Webp145 from "./tomato-145w.webp"; +import Webp218 from "./tomato-218w.webp"; +import Webp290 from "./tomato-290w.webp"; + +// PNG Imports +import Png29 from "./tomato-29w.png"; +import Png44 from "./tomato-44w.png"; +import Png73 from "./tomato-73w.png"; +import Png145 from "./tomato-145w.png"; +import Png218 from "./tomato-218w.png"; +import Png290 from "./tomato-290w.png"; + +const files = { + webp: { + 29: Webp29, + 44: Webp44, + 73: Webp73, + 145: Webp145, + 218: Webp218, + 290: Webp290, + }, + png: { + 29: Png29, + 44: Png44, + 73: Png73, + 145: Png145, + 218: Png218, + 290: Png290, + }, +}; + +const Tomato = ({ resolution = 360, alt = "A Tomato", className }) => { + return ( + + ); +}; + +Tomato.propTypes = { + alt: PropTypes.string, + resolution: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), + className: PropTypes.string, +}; + +export default Tomato; diff --git a/src/assets/brand/tomato/tomato-145w.png b/src/assets/brand/tomato/tomato-145w.png new file mode 100644 index 0000000..32c11e0 Binary files /dev/null and b/src/assets/brand/tomato/tomato-145w.png differ diff --git a/src/assets/brand/tomato/tomato-145w.webp b/src/assets/brand/tomato/tomato-145w.webp new file mode 100644 index 0000000..4680ad5 Binary files /dev/null and b/src/assets/brand/tomato/tomato-145w.webp differ diff --git a/src/assets/brand/tomato/tomato-218w.png b/src/assets/brand/tomato/tomato-218w.png new file mode 100644 index 0000000..1a7acd9 Binary files /dev/null and b/src/assets/brand/tomato/tomato-218w.png differ diff --git a/src/assets/brand/tomato/tomato-218w.webp b/src/assets/brand/tomato/tomato-218w.webp new file mode 100644 index 0000000..6ed7c7b Binary files /dev/null and b/src/assets/brand/tomato/tomato-218w.webp differ diff --git a/src/assets/brand/tomato/tomato-290w.png b/src/assets/brand/tomato/tomato-290w.png new file mode 100644 index 0000000..c5f3d7d Binary files /dev/null and b/src/assets/brand/tomato/tomato-290w.png differ diff --git a/src/assets/brand/tomato/tomato-290w.webp b/src/assets/brand/tomato/tomato-290w.webp new file mode 100644 index 0000000..0f24f10 Binary files /dev/null and b/src/assets/brand/tomato/tomato-290w.webp differ diff --git a/src/assets/brand/tomato/tomato-29w.png b/src/assets/brand/tomato/tomato-29w.png new file mode 100644 index 0000000..dc5193c Binary files /dev/null and b/src/assets/brand/tomato/tomato-29w.png differ diff --git a/src/assets/brand/tomato/tomato-29w.webp b/src/assets/brand/tomato/tomato-29w.webp new file mode 100644 index 0000000..d3913de Binary files /dev/null and b/src/assets/brand/tomato/tomato-29w.webp differ diff --git a/src/assets/brand/tomato/tomato-44w.png b/src/assets/brand/tomato/tomato-44w.png new file mode 100644 index 0000000..55182a6 Binary files /dev/null and b/src/assets/brand/tomato/tomato-44w.png differ diff --git a/src/assets/brand/tomato/tomato-44w.webp b/src/assets/brand/tomato/tomato-44w.webp new file mode 100644 index 0000000..9c719b4 Binary files /dev/null and b/src/assets/brand/tomato/tomato-44w.webp differ diff --git a/src/assets/brand/tomato/tomato-73w.png b/src/assets/brand/tomato/tomato-73w.png new file mode 100644 index 0000000..dc16c56 Binary files /dev/null and b/src/assets/brand/tomato/tomato-73w.png differ diff --git a/src/assets/brand/tomato/tomato-73w.webp b/src/assets/brand/tomato/tomato-73w.webp new file mode 100644 index 0000000..3b41711 Binary files /dev/null and b/src/assets/brand/tomato/tomato-73w.webp differ diff --git a/src/assets/brand/yellow-pepper/YellowPepper.jsx b/src/assets/brand/yellow-pepper/YellowPepper.jsx new file mode 100644 index 0000000..c016991 --- /dev/null +++ b/src/assets/brand/yellow-pepper/YellowPepper.jsx @@ -0,0 +1,60 @@ +import PropTypes from "prop-types"; +import { Picture } from "@/features/ui"; + +// WebP Imports +import Webp48 from "./yellow-pepper-48w.webp"; +import Webp79 from "./yellow-pepper-79w.webp"; +import Webp105 from "./yellow-pepper-105w.webp"; +import Webp159 from "./yellow-pepper-159w.webp"; +import Webp238 from "./yellow-pepper-238w.webp"; +import Webp317 from "./yellow-pepper-317w.webp"; + +// PNG Imports +import Png48 from "./yellow-pepper-48w.png"; +import Png79 from "./yellow-pepper-79w.png"; +import Png105 from "./yellow-pepper-105w.png"; +import Png159 from "./yellow-pepper-159w.png"; +import Png238 from "./yellow-pepper-238w.png"; +import Png317 from "./yellow-pepper-317w.png"; + +const files = { + webp: { + 48: Webp48, + 79: Webp79, + 105: Webp105, + 159: Webp159, + 238: Webp238, + 317: Webp317, + }, + png: { + 48: Png48, + 79: Png79, + 105: Png105, + 159: Png159, + 238: Png238, + 317: Png317, + }, +}; + +const YellowPepper = ({ + resolution = 360, + alt = "A Large Yellow Pepper", + className, +}) => { + return ( + + ); +}; + +YellowPepper.propTypes = { + alt: PropTypes.string, + resolution: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), + className: PropTypes.string, +}; + +export default YellowPepper; diff --git a/src/assets/brand/yellow-pepper/yellow-pepper-105w.png b/src/assets/brand/yellow-pepper/yellow-pepper-105w.png new file mode 100644 index 0000000..5525ae8 Binary files /dev/null and b/src/assets/brand/yellow-pepper/yellow-pepper-105w.png differ diff --git a/src/assets/brand/yellow-pepper/yellow-pepper-105w.webp b/src/assets/brand/yellow-pepper/yellow-pepper-105w.webp new file mode 100644 index 0000000..97f4f4e Binary files /dev/null and b/src/assets/brand/yellow-pepper/yellow-pepper-105w.webp differ diff --git a/src/assets/brand/yellow-pepper/yellow-pepper-159w.png b/src/assets/brand/yellow-pepper/yellow-pepper-159w.png new file mode 100644 index 0000000..bcc1acd Binary files /dev/null and b/src/assets/brand/yellow-pepper/yellow-pepper-159w.png differ diff --git a/src/assets/brand/yellow-pepper/yellow-pepper-159w.webp b/src/assets/brand/yellow-pepper/yellow-pepper-159w.webp new file mode 100644 index 0000000..81e65fe Binary files /dev/null and b/src/assets/brand/yellow-pepper/yellow-pepper-159w.webp differ diff --git a/src/assets/brand/yellow-pepper/yellow-pepper-238w.png b/src/assets/brand/yellow-pepper/yellow-pepper-238w.png new file mode 100644 index 0000000..faf46ba Binary files /dev/null and b/src/assets/brand/yellow-pepper/yellow-pepper-238w.png differ diff --git a/src/assets/brand/yellow-pepper/yellow-pepper-238w.webp b/src/assets/brand/yellow-pepper/yellow-pepper-238w.webp new file mode 100644 index 0000000..fe93f1e Binary files /dev/null and b/src/assets/brand/yellow-pepper/yellow-pepper-238w.webp differ diff --git a/src/assets/brand/yellow-pepper/yellow-pepper-317w.png b/src/assets/brand/yellow-pepper/yellow-pepper-317w.png new file mode 100644 index 0000000..6516a76 Binary files /dev/null and b/src/assets/brand/yellow-pepper/yellow-pepper-317w.png differ diff --git a/src/assets/brand/yellow-pepper/yellow-pepper-317w.webp b/src/assets/brand/yellow-pepper/yellow-pepper-317w.webp new file mode 100644 index 0000000..e396dbf Binary files /dev/null and b/src/assets/brand/yellow-pepper/yellow-pepper-317w.webp differ diff --git a/src/assets/brand/yellow-pepper/yellow-pepper-48w.png b/src/assets/brand/yellow-pepper/yellow-pepper-48w.png new file mode 100644 index 0000000..8e176dc Binary files /dev/null and b/src/assets/brand/yellow-pepper/yellow-pepper-48w.png differ diff --git a/src/assets/brand/yellow-pepper/yellow-pepper-48w.webp b/src/assets/brand/yellow-pepper/yellow-pepper-48w.webp new file mode 100644 index 0000000..4571fee Binary files /dev/null and b/src/assets/brand/yellow-pepper/yellow-pepper-48w.webp differ diff --git a/src/assets/brand/yellow-pepper/yellow-pepper-79w.png b/src/assets/brand/yellow-pepper/yellow-pepper-79w.png new file mode 100644 index 0000000..5d20471 Binary files /dev/null and b/src/assets/brand/yellow-pepper/yellow-pepper-79w.png differ diff --git a/src/assets/brand/yellow-pepper/yellow-pepper-79w.webp b/src/assets/brand/yellow-pepper/yellow-pepper-79w.webp new file mode 100644 index 0000000..23bcf06 Binary files /dev/null and b/src/assets/brand/yellow-pepper/yellow-pepper-79w.webp differ diff --git a/src/assets/brand/yumi-with-basket/YumiWithBasket.jsx b/src/assets/brand/yumi-with-basket/YumiWithBasket.jsx new file mode 100644 index 0000000..3b7b582 --- /dev/null +++ b/src/assets/brand/yumi-with-basket/YumiWithBasket.jsx @@ -0,0 +1,68 @@ +import PropTypes from "prop-types"; +import { Picture } from "@/features/ui"; + +// WebP Imports +import Webp180 from "./yumi-with-basket-180w.webp"; +import Webp300 from "./yumi-with-basket-300w.webp"; +import Webp360 from "./yumi-with-basket-360w.webp"; +import Webp396 from "./yumi-with-basket-396w.webp"; +import Webp600 from "./yumi-with-basket-600w.webp"; +import Webp900 from "./yumi-with-basket-900w.webp"; +import Webp960 from "./yumi-with-basket-960w.webp"; +import Webp1200 from "./yumi-with-basket-1200w.webp"; + +// PNG Imports +import Png180 from "./yumi-with-basket-180w.png"; +import Png300 from "./yumi-with-basket-300w.png"; +import Png360 from "./yumi-with-basket-360w.png"; +import Png396 from "./yumi-with-basket-396w.png"; +import Png600 from "./yumi-with-basket-600w.png"; +import Png900 from "./yumi-with-basket-900w.png"; +import Png960 from "./yumi-with-basket-960w.png"; +import Png1200 from "./yumi-with-basket-1200w.png"; + +const files = { + webp: { + 180: Webp180, + 300: Webp300, + 360: Webp360, + 396: Webp396, + 600: Webp600, + 900: Webp900, + 960: Webp960, + 1200: Webp1200, + }, + png: { + 180: Png180, + 300: Png300, + 360: Png360, + 396: Png396, + 600: Png600, + 900: Png900, + 960: Png960, + 1200: Png1200, + }, +}; + +const YumiWithBasket = ({ + resolution = 360, + alt = "Yumi Holding a Basket of Fresh Vegetables", + className, +}) => { + return ( + + ); +}; + +YumiWithBasket.propTypes = { + alt: PropTypes.string, + resolution: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), + className: PropTypes.string, +}; + +export default YumiWithBasket; diff --git a/src/assets/brand/yumi-with-basket/large_png/yumi-with-basket.png b/src/assets/brand/yumi-with-basket/large_png/yumi-with-basket.png new file mode 100755 index 0000000..cc4295d Binary files /dev/null and b/src/assets/brand/yumi-with-basket/large_png/yumi-with-basket.png differ diff --git a/src/assets/brand/yumi-with-basket/large_png/yumi-with-basket@0.15x.png b/src/assets/brand/yumi-with-basket/large_png/yumi-with-basket@0.15x.png new file mode 100755 index 0000000..07fe75b Binary files /dev/null and b/src/assets/brand/yumi-with-basket/large_png/yumi-with-basket@0.15x.png differ diff --git a/src/assets/brand/yumi-with-basket/large_png/yumi-with-basket@0.25x.png b/src/assets/brand/yumi-with-basket/large_png/yumi-with-basket@0.25x.png new file mode 100755 index 0000000..cfea05e Binary files /dev/null and b/src/assets/brand/yumi-with-basket/large_png/yumi-with-basket@0.25x.png differ diff --git a/src/assets/brand/yumi-with-basket/large_png/yumi-with-basket@0.33x.png b/src/assets/brand/yumi-with-basket/large_png/yumi-with-basket@0.33x.png new file mode 100755 index 0000000..9b6baec Binary files /dev/null and b/src/assets/brand/yumi-with-basket/large_png/yumi-with-basket@0.33x.png differ diff --git a/src/assets/brand/yumi-with-basket/large_png/yumi-with-basket@0.3x.png b/src/assets/brand/yumi-with-basket/large_png/yumi-with-basket@0.3x.png new file mode 100755 index 0000000..3509411 Binary files /dev/null and b/src/assets/brand/yumi-with-basket/large_png/yumi-with-basket@0.3x.png differ diff --git a/src/assets/brand/yumi-with-basket/large_png/yumi-with-basket@0.5x.png b/src/assets/brand/yumi-with-basket/large_png/yumi-with-basket@0.5x.png new file mode 100755 index 0000000..b29f650 Binary files /dev/null and b/src/assets/brand/yumi-with-basket/large_png/yumi-with-basket@0.5x.png differ diff --git a/src/assets/brand/yumi-with-basket/large_png/yumi-with-basket@0.75x.png b/src/assets/brand/yumi-with-basket/large_png/yumi-with-basket@0.75x.png new file mode 100755 index 0000000..fa5dd39 Binary files /dev/null and b/src/assets/brand/yumi-with-basket/large_png/yumi-with-basket@0.75x.png differ diff --git a/src/assets/brand/yumi-with-basket/large_png/yumi-with-basket@0.8x.png b/src/assets/brand/yumi-with-basket/large_png/yumi-with-basket@0.8x.png new file mode 100755 index 0000000..fc7829c Binary files /dev/null and b/src/assets/brand/yumi-with-basket/large_png/yumi-with-basket@0.8x.png differ diff --git a/src/assets/brand/yumi-with-basket/psd/yumi-with-basket-2.psd b/src/assets/brand/yumi-with-basket/psd/yumi-with-basket-2.psd new file mode 100755 index 0000000..12f1302 Binary files /dev/null and b/src/assets/brand/yumi-with-basket/psd/yumi-with-basket-2.psd differ diff --git a/src/assets/brand/yumi-with-basket/psd/yumi-with-basket.psd b/src/assets/brand/yumi-with-basket/psd/yumi-with-basket.psd new file mode 100755 index 0000000..e82e00a Binary files /dev/null and b/src/assets/brand/yumi-with-basket/psd/yumi-with-basket.psd differ diff --git a/src/assets/brand/yumi-with-basket/yumi-with-basket-1200w.png b/src/assets/brand/yumi-with-basket/yumi-with-basket-1200w.png new file mode 100644 index 0000000..49bb663 Binary files /dev/null and b/src/assets/brand/yumi-with-basket/yumi-with-basket-1200w.png differ diff --git a/src/assets/brand/yumi-with-basket/yumi-with-basket-1200w.webp b/src/assets/brand/yumi-with-basket/yumi-with-basket-1200w.webp new file mode 100644 index 0000000..926b678 Binary files /dev/null and b/src/assets/brand/yumi-with-basket/yumi-with-basket-1200w.webp differ diff --git a/src/assets/brand/yumi-with-basket/yumi-with-basket-180w.png b/src/assets/brand/yumi-with-basket/yumi-with-basket-180w.png new file mode 100644 index 0000000..18decfd Binary files /dev/null and b/src/assets/brand/yumi-with-basket/yumi-with-basket-180w.png differ diff --git a/src/assets/brand/yumi-with-basket/yumi-with-basket-180w.webp b/src/assets/brand/yumi-with-basket/yumi-with-basket-180w.webp new file mode 100644 index 0000000..04c0931 Binary files /dev/null and b/src/assets/brand/yumi-with-basket/yumi-with-basket-180w.webp differ diff --git a/src/assets/brand/yumi-with-basket/yumi-with-basket-300w.png b/src/assets/brand/yumi-with-basket/yumi-with-basket-300w.png new file mode 100644 index 0000000..40ad604 Binary files /dev/null and b/src/assets/brand/yumi-with-basket/yumi-with-basket-300w.png differ diff --git a/src/assets/brand/yumi-with-basket/yumi-with-basket-300w.webp b/src/assets/brand/yumi-with-basket/yumi-with-basket-300w.webp new file mode 100644 index 0000000..877c357 Binary files /dev/null and b/src/assets/brand/yumi-with-basket/yumi-with-basket-300w.webp differ diff --git a/src/assets/brand/yumi-with-basket/yumi-with-basket-360w.png b/src/assets/brand/yumi-with-basket/yumi-with-basket-360w.png new file mode 100644 index 0000000..f31b5d1 Binary files /dev/null and b/src/assets/brand/yumi-with-basket/yumi-with-basket-360w.png differ diff --git a/src/assets/brand/yumi-with-basket/yumi-with-basket-360w.webp b/src/assets/brand/yumi-with-basket/yumi-with-basket-360w.webp new file mode 100644 index 0000000..0f03af1 Binary files /dev/null and b/src/assets/brand/yumi-with-basket/yumi-with-basket-360w.webp differ diff --git a/src/assets/brand/yumi-with-basket/yumi-with-basket-396w.png b/src/assets/brand/yumi-with-basket/yumi-with-basket-396w.png new file mode 100644 index 0000000..ec6c291 Binary files /dev/null and b/src/assets/brand/yumi-with-basket/yumi-with-basket-396w.png differ diff --git a/src/assets/brand/yumi-with-basket/yumi-with-basket-396w.webp b/src/assets/brand/yumi-with-basket/yumi-with-basket-396w.webp new file mode 100644 index 0000000..aba6897 Binary files /dev/null and b/src/assets/brand/yumi-with-basket/yumi-with-basket-396w.webp differ diff --git a/src/assets/brand/yumi-with-basket/yumi-with-basket-600w.png b/src/assets/brand/yumi-with-basket/yumi-with-basket-600w.png new file mode 100644 index 0000000..ea79793 Binary files /dev/null and b/src/assets/brand/yumi-with-basket/yumi-with-basket-600w.png differ diff --git a/src/assets/brand/yumi-with-basket/yumi-with-basket-600w.webp b/src/assets/brand/yumi-with-basket/yumi-with-basket-600w.webp new file mode 100644 index 0000000..f903e5d Binary files /dev/null and b/src/assets/brand/yumi-with-basket/yumi-with-basket-600w.webp differ diff --git a/src/assets/brand/yumi-with-basket/yumi-with-basket-900w.png b/src/assets/brand/yumi-with-basket/yumi-with-basket-900w.png new file mode 100644 index 0000000..dd09b24 Binary files /dev/null and b/src/assets/brand/yumi-with-basket/yumi-with-basket-900w.png differ diff --git a/src/assets/brand/yumi-with-basket/yumi-with-basket-900w.webp b/src/assets/brand/yumi-with-basket/yumi-with-basket-900w.webp new file mode 100644 index 0000000..c954b0d Binary files /dev/null and b/src/assets/brand/yumi-with-basket/yumi-with-basket-900w.webp differ diff --git a/src/assets/brand/yumi-with-basket/yumi-with-basket-960w.png b/src/assets/brand/yumi-with-basket/yumi-with-basket-960w.png new file mode 100644 index 0000000..98fc5ed Binary files /dev/null and b/src/assets/brand/yumi-with-basket/yumi-with-basket-960w.png differ diff --git a/src/assets/brand/yumi-with-basket/yumi-with-basket-960w.webp b/src/assets/brand/yumi-with-basket/yumi-with-basket-960w.webp new file mode 100644 index 0000000..7b7ca6b Binary files /dev/null and b/src/assets/brand/yumi-with-basket/yumi-with-basket-960w.webp differ diff --git a/src/assets/icons/Clock.jsx b/src/assets/icons/Clock.jsx new file mode 100644 index 0000000..f2e57de --- /dev/null +++ b/src/assets/icons/Clock.jsx @@ -0,0 +1,3 @@ +export default ( + +); diff --git a/src/assets/icons/Easy.jsx b/src/assets/icons/Easy.jsx new file mode 100644 index 0000000..20226c8 --- /dev/null +++ b/src/assets/icons/Easy.jsx @@ -0,0 +1,6 @@ +export default ( + <> + + + +); diff --git a/src/assets/icons/iconList.js b/src/assets/icons/iconList.js index 7360550..b301fdf 100755 --- a/src/assets/icons/iconList.js +++ b/src/assets/icons/iconList.js @@ -1,5 +1,7 @@ +import Clock from "./Clock"; import Close from "./Close"; import DownArrow from "./DownArrow"; +import Easy from "./Easy"; import Flame from "./Flame"; import GreenDot from "./GreenDot"; import Hamburger from "./Hamburger"; @@ -18,8 +20,10 @@ import UpArrow from "./UpArrow"; import YellowDot from "./YellowDot"; export const icons = { + Clock, Close, DownArrow, + Easy, Flame, GreenDot, Hamburger, diff --git a/src/assets/icons/index.js b/src/assets/icons/index.js index 0a9e610..dab9611 100644 --- a/src/assets/icons/index.js +++ b/src/assets/icons/index.js @@ -1,5 +1,7 @@ +import Clock from "./Clock"; import Close from "./Close"; import DownArrow from "./DownArrow"; +import Easy from "./Easy"; import Flame from "./Flame"; import GreenDot from "./GreenDot"; import Hamburger from "./Hamburger"; @@ -20,8 +22,10 @@ import YellowDot from "./YellowDot"; import github from "./github.png"; export const icons = { + Clock, Close, DownArrow, + Easy, Flame, GreenDot, Hamburger, diff --git a/src/assets/index.js b/src/assets/index.js index fb992ca..1ba68e7 100644 --- a/src/assets/index.js +++ b/src/assets/index.js @@ -1,6 +1,6 @@ import FeatureRecipe from "./RecipePhoto.png"; - -export { FeatureRecipe }; +import FeatureChickenRecipe from "./FeaturedChickenSweetPotatos.jpg"; +export { FeatureRecipe, FeatureChickenRecipe }; export * from "./brand"; export * from "./brand/food"; diff --git a/src/constants/index.js b/src/constants/index.js index 9a97fb5..5437d48 100644 --- a/src/constants/index.js +++ b/src/constants/index.js @@ -1,98 +1,44 @@ +import team from "./teamData"; + const name = "YumYumYes!"; const welcome = "Welcome to YumYumYes, your gateway to delicious recipes and culinary inspiration! Let's embark on a flavorful journey together! "; const logoUrl = ""; export const navLinks = [ - { - id: "about", - title: "About", - href: "/about", - }, - // { - // id: "posts", - // title: "Posts", - // href: "/posts", - // }, { id: "search", title: "Search", href: "/search", }, -]; - -const footerLinks = [ + { + id: "favorites", + title: "Favorites", + href: "/favorites", + }, { id: "about", title: "About", href: "/about", }, +]; + +const footerLinks = [ { id: "search", title: "Search", href: "/search", }, -]; - -const team = [ - { - name: "Alice Butler", - role: "Web Developer", - summary: - "Alice utilized her expertise in HTML, CSS, and JavaScript to collaborate with the project team, creating a user-friendly, responsive website that successfully met project objectives.", - image: "https://randomuser.me/api/portraits/women/69.jpg", - socials: [ - { - name: "GitHub", - url: "https://github.com", - }, - { - name: "LinkedIn", - url: "https://linkedin.com", - }, - ], - }, { - name: "Bob Hoffman", - role: "Product Owner", - summary: - "Bob, with his expertise, collaborated with the project team to ensure the development of a user-friendly, responsive website that successfully met project objectives.", - image: "https://randomuser.me/api/portraits/men/48.jpg", - socials: [ - { - name: "GitHub", - url: "https://github.com", - }, - { - name: "LinkedIn", - url: "https://linkedin.com", - }, - ], + id: "favorites", + title: "Favorites", + href: "/favorites", }, { - name: "Charlie Stephens", - role: "UI/UX Designer", - summary: - "Charlie used his creative skills to collaborate with the project team, ensuring the development of a visually appealing and user-friendly website that successfully met project objectives.", - image: "https://randomuser.me/api/portraits/men/34.jpg", - socials: [ - { - name: "GitHub", - url: "https://github.com", - }, - { - name: "LinkedIn", - url: "https://linkedin.com", - }, - ], + id: "about", + title: "About", + href: "/about", }, - // { - // name: "", - // role: "", - // summary: "", - // image: "", - // socials: [{ gitHub: "", linkedIn: "" }], - // }, ]; export { name, welcome, logoUrl, footerLinks, team }; diff --git a/src/constants/teamData.js b/src/constants/teamData.js new file mode 100644 index 0000000..244bbfc --- /dev/null +++ b/src/constants/teamData.js @@ -0,0 +1,111 @@ +import AvatarGrey from "../assets/about/avatar-grey.jpg"; +import AvatarDarrick from "../assets/about/avatar-darrick.jpg"; +import AvatarTim from "../assets/about/avatar-tim.jpg"; +import AvatarJoseph from "../assets/about/avatar-joseph.webp"; +import AvatarHenri from "../assets/about/avatar-henri.jpg"; + +const team = [ + { + name: "Greimil Nuñez", + role: "Designer & Developer", + summary: + "I am a self-motivated software developer pursuing a Computer Science degree, blending formal education with self-taught knowledge. I actively worked on this project, contributing to web design and coding for functional and aesthetically pleasing interfaces. My background in both design and development allows me to contribute comprehensively to projects, and I'm eager to refine my skills further, solve complex problems, and create user-centric software solutions through continuous learning and improvement.", + image: AvatarGrey, + socials: [ + { + name: "GitHub", + url: "https://github.com/Greimil", + }, + { + name: "LinkedIn", + url: "https://www.linkedin.com/in/greimil-nu%C3%B1ez/", + }, + ], + }, + { + name: "Darrick Fauvel", + role: "Developer", + summary: + "An experienced web developer skilled in JavaScript and React, Darrick is based in Massachusetts, USA. In agile collaboration with the team, he helped create several features on the site, all while emphasizing website responsiveness. He holds a Bachelor of IT degree (summa cum laude) from UMass Lowell, and has the rad 😎 experience of developing websites when more than 216 colors was unsafe. 😲", + image: AvatarDarrick, + socials: [ + { + name: "GitHub", + url: "https://github.com/DarrickFauvel", + }, + { + name: "LinkedIn", + url: "https://www.linkedin.com/in/darrickfauvel/", + }, + ], + }, + { + name: "Tim DeHof", + role: "DevOps & Developer", + summary: + "He is a dynamic software developer with a background in mechanical design, now specializing in Fullstack development with skills in Postgres, Express, React, and Node. Renowned for transforming initial concepts into user-centric interfaces, he leads projects and excels in developing intuitive features like search functions. With a passion for continuous learning, he integrates functional design with robust technology to deliver seamless and responsive software solutions.", + image: AvatarTim, + socials: [ + { + name: "GitHub", + url: "https://github.com/timDeHof", + }, + { + name: "LinkedIn", + url: "https://www.linkedin.com/in/timothy-dehof/", + }, + ], + }, + { + name: "Joseph Kotvas", + role: "Designer & Developer", + summary: + "An independent website designer and developer, Joseph has almost two decades of experience building and optimizing online solutions for small businesses. Lead generation, marketing, education and online sales are all spaces where he can help your business achieve its goals and surpass client expectations. Joseph also serves as a Baptist missionary teaching and ministering to the Deaf community in Peru, South America. A father of three precocious children, in his nonexistent free time, Joseph enjoys traveling, playing the piano, and reading.", + image: AvatarJoseph, + socials: [ + { + name: "GitHub", + url: "https://github.com/joekotvas", + }, + { + name: "LinkedIn", + url: "https://www.linkedin.com/in/joekotvas/", + }, + ], + }, + { + name: "Henri Lambertucci", + role: "UI/UX Designer", + summary: + "Hey there, I'm Henri, a 36-year-old U.S. Air Force veteran with a background in civil engineering. I've always had a thing for tech, and now I'm diving headfirst into the world of web development. When I'm not tinkering with websites, you'll find me battling it out in online games, soaking up the sun at the beach, or catching the latest flick at the movie theater. I guess you could say I'm a bit of a geek with a dash of adventure and a love for relaxation. I'm all about bringing your ideas to life online and making your digital presence shine.", + image: AvatarHenri, + socials: [ + { + name: "GitHub", + url: "https://github.com/henrike32", + }, + { + name: "LinkedIn", + url: "https://www.linkedin.com/in/hslambert/", + }, + ], + }, + // { + // name: "", + // role: "", + // summary: "", + // image: "", + // socials: [ + // { + // name: "GitHub", + // url: "https://github.com/", + // }, + // { + // name: "LinkedIn", + // url: "https://www.linkedin.com/", + // }, + // ], + // }, +]; + +export default team; diff --git a/src/features/PageNotFound/HeroSectionPageNotFound.jsx b/src/features/PageNotFound/HeroSectionPageNotFound.jsx new file mode 100644 index 0000000..9eca24c --- /dev/null +++ b/src/features/PageNotFound/HeroSectionPageNotFound.jsx @@ -0,0 +1,47 @@ +import { Heading, Button, Icon } from "@/features/ui"; +import { Link } from "react-router-dom"; +import { YumiReading } from "@/assets"; +export const HeroSectionPageNotFound = () => { + const clearSessision = () => { + sessionStorage.removeItem("recipes"); + }; + + return ( +
    + + { + "Oops! It looks like the recipe you're hunting for has slipped out of the pot." + } + + +

    + It seems our magical ingredients are playing hide and seek. While we + summon our most skilled chefs to find this lost recipe, why not explore + other culinary delights in our virtual kitchen? +

    + + clearSessision()} + to="/search" + className="col-start-1 col-end-2 row-star-3 row-end-4 flex justify-center md:justify-start lg:self-start " + > + + + +
    + Yumi Reading +
    +
    + ); +}; diff --git a/src/features/PageNotFound/index.js b/src/features/PageNotFound/index.js new file mode 100644 index 0000000..405f6a4 --- /dev/null +++ b/src/features/PageNotFound/index.js @@ -0,0 +1 @@ +export * from "./HeroSectionPageNotFound"; diff --git a/src/features/posts/api/get-posts.jsx b/src/features/posts/api/get-posts.jsx deleted file mode 100644 index 86f71b8..0000000 --- a/src/features/posts/api/get-posts.jsx +++ /dev/null @@ -1,6 +0,0 @@ -import { getPostById } from "@/api/posts"; -import { useQuery } from "@tanstack/react-query"; - -export function GetPostById(id) { - return useQuery(["posts", id], () => getPostById(id)); -} diff --git a/src/features/posts/api/index.js b/src/features/posts/api/index.js deleted file mode 100644 index 262e897..0000000 --- a/src/features/posts/api/index.js +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./use-posts"; -export * from "./get-posts"; diff --git a/src/features/posts/api/use-posts.jsx b/src/features/posts/api/use-posts.jsx deleted file mode 100644 index aed78e1..0000000 --- a/src/features/posts/api/use-posts.jsx +++ /dev/null @@ -1,6 +0,0 @@ -import { getPosts } from "@/api/posts"; -import { useQuery } from "@tanstack/react-query"; - -export function UsePosts() { - return useQuery(["posts"], getPosts); -} diff --git a/src/features/posts/components/post-card/PostCard.jsx b/src/features/posts/components/post-card/PostCard.jsx deleted file mode 100644 index 26b1f4e..0000000 --- a/src/features/posts/components/post-card/PostCard.jsx +++ /dev/null @@ -1,16 +0,0 @@ -import { Link } from "react-router-dom"; -import PropTypes from "prop-types"; -export const PostCard = ({ post }) => { - return post ? ( -
  • - {post.title} -
  • - ) : null; -}; - -PostCard.propTypes = { - post: PropTypes.shape({ - id: PropTypes.number.isRequired, - title: PropTypes.string.isRequired, - }), -}; diff --git a/src/features/posts/components/post-card/index.js b/src/features/posts/components/post-card/index.js deleted file mode 100644 index a3d627f..0000000 --- a/src/features/posts/components/post-card/index.js +++ /dev/null @@ -1 +0,0 @@ -export { PostCard } from "./PostCard"; diff --git a/src/features/posts/components/post-list/PostList.jsx b/src/features/posts/components/post-list/PostList.jsx deleted file mode 100644 index 205358f..0000000 --- a/src/features/posts/components/post-list/PostList.jsx +++ /dev/null @@ -1,26 +0,0 @@ -import { UsePosts } from "../../api"; -import { PostCard } from "../post-card"; -export const PostList = () => { - const { data, isLoading, isError, error } = UsePosts(); - - if (isLoading) { - return
    Loading...
    ; - } - - if (isError) { - console.error(error); - - return

    {error.message}

    ; - } - - return ( - <> -
    PostList
    -
      - {data.map((post) => ( - - ))} -
    - - ); -}; diff --git a/src/features/posts/components/post-list/index.js b/src/features/posts/components/post-list/index.js deleted file mode 100644 index c08f9c3..0000000 --- a/src/features/posts/components/post-list/index.js +++ /dev/null @@ -1 +0,0 @@ -export { PostList } from "./PostList"; diff --git a/src/features/posts/index.js b/src/features/posts/index.js deleted file mode 100644 index e25183a..0000000 --- a/src/features/posts/index.js +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./api"; -export * from "./components/post-list"; diff --git a/src/features/recipes/api/fetch-recipe-by-id.js b/src/features/recipes/api/fetch-recipe-by-id.js index 0682b41..b327ce4 100644 --- a/src/features/recipes/api/fetch-recipe-by-id.js +++ b/src/features/recipes/api/fetch-recipe-by-id.js @@ -1,9 +1,10 @@ -import { fetchRecipes } from "@/api/recipes"; +import { fetchRecipeDetails } from "@/api/recipes"; import { useQuery } from "@tanstack/react-query"; -export function FetchRecipeById(id) { +export function FetchRecipeDetailsById(id) { + console.log("recipes/api", id); const search = "id:" + id; - return useQuery(["search", search], () => fetchRecipes(search), { - enabled: !!search, + return useQuery(["search", search], () => fetchRecipeDetails(id), { + enabled: !!id, }); } diff --git a/src/features/recipes/api/fetch-recipes.js b/src/features/recipes/api/fetch-recipes.js index 5258c73..ca92e96 100644 --- a/src/features/recipes/api/fetch-recipes.js +++ b/src/features/recipes/api/fetch-recipes.js @@ -3,7 +3,8 @@ import { useQuery } from "@tanstack/react-query"; import { useSessionStorage } from "../hooks"; export function FetchRecipes(search) { - const [cachedRecipes, setCachedRecipes] = useSessionStorage("recipes", null); + const KEY = `${search}-searchRecipeResults`; + const [cachedRecipes, setCachedRecipes] = useSessionStorage(KEY, null); const { data: recipes, isLoading, @@ -13,6 +14,7 @@ export function FetchRecipes(search) { onSuccess: (data) => { setCachedRecipes(data); }, + enabled: !!search, staleTime: 1000 * 60 * 5, // 5 minutes cacheTime: 1000 * 60 * 60, // 1 hour @@ -21,7 +23,7 @@ export function FetchRecipes(search) { return { data: recipes || cachedRecipes, isLoading: isLoading && !cachedRecipes, - isError, - error, + isError: isError, + error: error, }; } diff --git a/src/features/recipes/api/fetch-tips-by-id.js b/src/features/recipes/api/fetch-tips-by-id.js new file mode 100644 index 0000000..279db14 --- /dev/null +++ b/src/features/recipes/api/fetch-tips-by-id.js @@ -0,0 +1,9 @@ +import { fetchTips } from "@/api/tips"; +import { useQuery } from "@tanstack/react-query"; + +export function FetchTipsById(id) { + const fetch = "tips for: " + id; + return useQuery(["tips", fetch], () => fetchTips(id), { + enabled: !!id, + }); +} diff --git a/src/features/recipes/api/index.js b/src/features/recipes/api/index.js index 25b6acf..b56b10b 100644 --- a/src/features/recipes/api/index.js +++ b/src/features/recipes/api/index.js @@ -1,3 +1,4 @@ export * from "./use-recipes"; export * from "./fetch-recipes"; export * from "./fetch-recipe-by-id"; +export * from "./fetch-tips-by-id"; diff --git a/src/features/recipes/components/feature-of-the-day/feature-of-the-day.jsx b/src/features/recipes/components/feature-of-the-day/feature-of-the-day.jsx index 4c99311..1485398 100644 --- a/src/features/recipes/components/feature-of-the-day/feature-of-the-day.jsx +++ b/src/features/recipes/components/feature-of-the-day/feature-of-the-day.jsx @@ -1,9 +1,13 @@ // import { downArrow } from "@/assets"; import { Heading, Button, Icon } from "@/features/ui"; -import { FeatureRecipe } from "@/assets"; +import { FeatureChickenRecipe } from "@/assets"; +import { useNavigate } from "react-router-dom"; export const FeatureOfTheDay = () => { + const navigate = useNavigate(); + + const handleNavigate = () => navigate("/recipes/3194"); return ( -
    +
    { > Recipe of the day -
    - +
    +
    - Roasted Chicken Recipe + Roasted Chicken And Sweet Potatoes Recipe

    Your ingredients, our creativity. Share what's in your kitchen, @@ -26,9 +33,10 @@ export const FeatureOfTheDay = () => {

    diff --git a/src/features/recipes/components/filters/Filters.jsx b/src/features/recipes/components/filters/Filters.jsx new file mode 100644 index 0000000..8ff9350 --- /dev/null +++ b/src/features/recipes/components/filters/Filters.jsx @@ -0,0 +1,39 @@ +import PropTypes from "prop-types"; + +export const Filters = ({ tagsCollection, onTagSelected, selectedTags }) => { + const isTagSelected = (tag) => { + return selectedTags.some((selectedTag) => selectedTag.id === tag.id); + }; + + return ( +
    + {Object.entries(tagsCollection).map(([tagType, tags]) => ( +
    +
    + {tagType === "cooking_style" ? "Cooking Style" : tagType} +
    +
      + {tags.map((tag) => ( +
    • + +
    • + ))} +
    +
    + ))} +
    + ); +}; + +Filters.propTypes = { + tagsCollection: PropTypes.object, + selectedTags: PropTypes.arrayOf(PropTypes.object), + onTagSelected: PropTypes.func, +}; diff --git a/src/features/recipes/components/filters/index.js b/src/features/recipes/components/filters/index.js new file mode 100644 index 0000000..24ea26a --- /dev/null +++ b/src/features/recipes/components/filters/index.js @@ -0,0 +1 @@ +export { Filters } from "./Filters.jsx"; diff --git a/src/features/recipes/components/recipe-card/recipe-card.jsx b/src/features/recipes/components/recipe-card/recipe-card.jsx index 726ca73..8a31be2 100644 --- a/src/features/recipes/components/recipe-card/recipe-card.jsx +++ b/src/features/recipes/components/recipe-card/recipe-card.jsx @@ -10,22 +10,22 @@ export const RecipeCard = ({ id, }) => { return ( -
    +
    {thumbnail_alt_text} -
    +
    {name} -
    +

    {`${num_servings} serving(s)`}

    diff --git a/src/features/recipes/components/recipe-details/Card.jsx b/src/features/recipes/components/recipe-details/Card.jsx new file mode 100644 index 0000000..84fbb27 --- /dev/null +++ b/src/features/recipes/components/recipe-details/Card.jsx @@ -0,0 +1,18 @@ +import PropTypes from "prop-types"; + +export const Card = ({ children, className, id }) => { + return ( +
    + {children} +
    + ); +}; + +Card.propTypes = { + children: PropTypes.oneOfType([PropTypes.object, PropTypes.array]), + className: PropTypes.string, + id: PropTypes.string, +}; diff --git a/src/features/recipes/components/recipe-details/Description.jsx b/src/features/recipes/components/recipe-details/Description.jsx new file mode 100644 index 0000000..39663f3 --- /dev/null +++ b/src/features/recipes/components/recipe-details/Description.jsx @@ -0,0 +1,51 @@ +import PropTypes from "prop-types"; +import { Heading } from "@/features/ui/Heading"; + +export const Description = ({ description }) => { + const words = description.split(" "); + + let titleLength = 2; + + const inflectionWords = [ + "is", + "are", + "was", + "were", + "has", + "can", + "at", + "to", + "for", + "so", + "tastes", + ]; + + let indexOfInflectionWord = words + .slice(0, 6) + .findIndex((w) => inflectionWords.includes(w)); + if (indexOfInflectionWord !== -1) { + titleLength = indexOfInflectionWord; + } + + const title = `${words.slice(0, titleLength).join(" ")}`; + const body = words.slice(titleLength).join(" "); + console.log("body length:", body.length); + return description ? ( +
    + + 10 ? "text-clamp-h3" : ""}> + {title} + + +

    100 ? "" : "text-2xl"} italic md:text-2xl`} + > + {body} +

    +
    + ) : null; +}; + +Description.propTypes = { + description: PropTypes.string, +}; diff --git a/src/features/recipes/components/recipe-details/FavoriteButton.jsx b/src/features/recipes/components/recipe-details/FavoriteButton.jsx new file mode 100644 index 0000000..3ed2107 --- /dev/null +++ b/src/features/recipes/components/recipe-details/FavoriteButton.jsx @@ -0,0 +1,56 @@ +import PropTypes from "prop-types"; +import { useState, useEffect } from "react"; +import { Button, Icon } from "@/features/ui"; + +export const FavoriteButton = ({ recipe }) => { + // Function to check if a recipe with a specific ID exists in the array + const hasFavoriteRecipeWithId = (recipeId) => { + return favorites.some((recipe) => recipe.id === recipeId); + }; + + const handleFavoriteClick = (recipe) => { + if (hasFavoriteRecipeWithId(recipe.id)) { + // Recipe is already a favorite, so remove it. + const updatedFavorites = favorites.filter( + (favRecipe) => favRecipe.id !== recipe.id, + ); + setFavorites(updatedFavorites); + localStorage.setItem("favorites", JSON.stringify(updatedFavorites)); + } else { + // Recipe is not a favorite, so add it. + const updatedFavorites = [...favorites, recipe]; + setFavorites(updatedFavorites); + localStorage.setItem("favorites", JSON.stringify(updatedFavorites)); + } + }; + + const [favorites, setFavorites] = useState([]); + + useEffect(() => { + const savedFavorites = localStorage.getItem("favorites"); + if (savedFavorites) { + // Parse the saved JSON data + setFavorites(JSON.parse(savedFavorites)); + } + }, []); + return ( + + ); +}; + +FavoriteButton.propTypes = { + recipe: PropTypes.object, +}; diff --git a/src/features/recipes/components/recipe-details/IngredientSections.jsx b/src/features/recipes/components/recipe-details/IngredientSections.jsx new file mode 100644 index 0000000..2dddf7e --- /dev/null +++ b/src/features/recipes/components/recipe-details/IngredientSections.jsx @@ -0,0 +1,30 @@ +import PropTypes from "prop-types"; +import { Heading } from "@/features/ui"; +import { Section } from "./Section"; +import Lime from "@/assets/brand/lime/Lime"; + +export const IngredientSections = ({ sections }) => { + return ( +
    + + Ingredients + +
    + {sections.map((section, index) => { + return ( +
    + ); + })} + +
    +
    + ); +}; + +IngredientSections.propTypes = { + sections: PropTypes.array, +}; diff --git a/src/features/recipes/components/recipe-details/Instructions.jsx b/src/features/recipes/components/recipe-details/Instructions.jsx new file mode 100644 index 0000000..4f21b67 --- /dev/null +++ b/src/features/recipes/components/recipe-details/Instructions.jsx @@ -0,0 +1,31 @@ +import PropTypes from "prop-types"; +import { Heading } from "@/features/ui"; +import YumiWithBasket from "@/assets/brand/yumi-with-basket/YumiWithBasket"; + +export const Instructions = ({ instructions }) => { + return ( +
    + + Preparation + +
      + {instructions.map((step, index) => { + const { display_text } = step; + return ( +
    1. + {`${display_text}`} +
    2. + ); + })} +
    + +
    + ); +}; + +Instructions.propTypes = { + instructions: PropTypes.array, +}; diff --git a/src/features/recipes/components/recipe-details/IntroCard.jsx b/src/features/recipes/components/recipe-details/IntroCard.jsx new file mode 100644 index 0000000..7f5d8ef --- /dev/null +++ b/src/features/recipes/components/recipe-details/IntroCard.jsx @@ -0,0 +1,49 @@ +import PropTypes from "prop-types"; +import { Description } from "./Description"; +import { Card } from "./Card"; +import PlantsTL from "@/assets/brand/plants-tl/PlantsTL"; + +export const IntroCard = ({ name, imageUrl, description }) => { + if (description) + return ( + +
    + +
    +
    +
    +
    + + {name} + +
    +
    + +
    +
    + ); + return ( +
    + + {name} + +
    + ); +}; + +IntroCard.propTypes = { + name: PropTypes.string, + imageUrl: PropTypes.string, + description: PropTypes.string, +}; diff --git a/src/features/recipes/components/recipe-details/Nutrition.jsx b/src/features/recipes/components/recipe-details/Nutrition.jsx new file mode 100644 index 0000000..262334d --- /dev/null +++ b/src/features/recipes/components/recipe-details/Nutrition.jsx @@ -0,0 +1,38 @@ +import PropTypes from "prop-types"; +import { Heading } from "@/features/ui"; + +export const NutritionSection = ({ nutrition }) => { + if (!nutrition || Object.keys(nutrition).length === 0) { + return

    No nutritional information available.

    ; + } + const { updated_at, ...rest } = nutrition; + return ( + <> +
    + {Object.entries(rest).map(([key, value]) => { + return ( +
    + + {key} + +

    + {value} + {key === "calories" ? "" : "g"} +

    +
    + ); + })} +
    +

    + {`Last updated on ${updated_at.slice(0, 10)}`} +

    + + ); +}; + +NutritionSection.propTypes = { + nutrition: PropTypes.object, +}; diff --git a/src/features/recipes/components/recipe-details/QuickLink.jsx b/src/features/recipes/components/recipe-details/QuickLink.jsx new file mode 100644 index 0000000..cb876fb --- /dev/null +++ b/src/features/recipes/components/recipe-details/QuickLink.jsx @@ -0,0 +1,22 @@ +import PropTypes from "prop-types"; +import { Button, Icon } from "@/features/ui"; + +export const QuickLink = ({ label, to }) => { + return ( + + ); +}; + +QuickLink.propTypes = { + label: PropTypes.string, + to: PropTypes.string, +}; diff --git a/src/features/recipes/components/recipe-details/RecipeDetails.jsx b/src/features/recipes/components/recipe-details/RecipeDetails.jsx index 74a4e84..c4b1302 100644 --- a/src/features/recipes/components/recipe-details/RecipeDetails.jsx +++ b/src/features/recipes/components/recipe-details/RecipeDetails.jsx @@ -1,189 +1,41 @@ import PropTypes from "prop-types"; -import { Heading } from "@/features/ui/Heading"; -import { Link } from "react-router-dom"; -import { Button } from "@/features/ui"; -import Icon from "@/assets/icons/Icon"; +import { Heading } from "@/features/ui"; -export const RecipeDetails = ({ recipe }) => { - const Card = ({ children, className }) => { - return ( -
    - {children} -
    - ); - }; - - const Description = ({ description }) => { - const words = recipe.description.split(" "); - - const title = `${words[0]} ${words[1]}...`; - const body = words.slice(2).join(" "); - - return description ? ( -
    -

    {title}

    -

    {body}

    -
    - ) : null; - }; - - const Topics = ({ topics }) => { - return ( -
    - Topics: - {topics.map((topic, index) => { - return ( - <> - - {topic.name} - - {index !== recipe.topics.length - 1 ? ", " : ""} - - ); - })} -
    - ); - }; - - const Tags = ({ tags }) => { - return ( -
    - Tags: - {tags.map((tag, index) => ( - <> - - {tag.display_name} - - {index !== recipe.tags.length - 1 ? ", " : ""} - - ))} -
    - ); - }; - - const QuickLink = ({ label, to }) => { - return ( - - ); - }; - - const RecipeVideo = ({ videoUrl, renditions }) => { - if (!videoUrl) return null; - const sources = Object.values(renditions).map((src, index) => { - return ; - }); - return ( -
    - -
    - ); - }; - - const Section = ({ list, name }) => { - const components = list.map((component, index) => { - console.log(component); - const quantity = component.measurements[0].quantity; - const unit = component.measurements[0].unit; - const isPlural = quantity > 1 ? true : false; - console.log(isPlural); - const measurement = ( - - - {quantity && quantity !== "0" ? quantity + " " : "-"} - - - {isPlural ? unit.display_plural + " " : unit.display_singular + " "} - - - ); - const name = - isPlural && unit.display_plural === "" - ? component.ingredient.display_plural + " " - : component.ingredient.display_singular + " "; - const note = component.extra_comment - ? ` (${component.extra_comment})` - : ""; - return ( -
  • - {measurement} - {name} - {note} -
  • - ); - }); - return ( -
    - - {name || "You'll Need:"} - -
      {components}
    -
    - ); - }; - - const IngredientSections = ({ sections }) => { - return ( -
    - - Ingredients - - {sections.map((section, index) => { - return ( -
    - ); - })} -
    - ); - }; +// Page Components +import { IntroCard } from "./IntroCard"; +import { Card } from "./Card"; +import { Tags } from "./Tags"; +import { QuickLink } from "./QuickLink"; +import { RecipeVideo } from "./RecipeVideo"; +import { RecipeDifficultyCard } from "./RecipeDifficultyCard"; +import { IngredientSections } from "./IngredientSections"; +import { Instructions } from "./Instructions"; +import { FavoriteButton } from "./FavoriteButton"; +import { NutritionSection } from "./Nutrition"; +import { Tips } from "./Tips"; +import usePageTitle from "../../../../hooks/usePageTitle"; +export const RecipeDetails = ({ recipe }) => { + usePageTitle(recipe.name); return (
    -
    +
    {recipe.name}
    -
    - -
    -

    - -

    -
    - {recipe.name} -
    - + +
    + + Filed Under - {recipe.topics && } Quick Links @@ -192,16 +44,50 @@ export const RecipeDetails = ({ recipe }) => { - +
    +
    - + + + + + + + + + + Nutrition + + + + + + Tips + + +
    ); @@ -209,18 +95,6 @@ export const RecipeDetails = ({ recipe }) => { RecipeDetails.propTypes = { recipe: PropTypes.object, - topics: PropTypes.object, - tags: PropTypes.object, - description: PropTypes.string, - label: PropTypes.string, - to: PropTypes.string, - videoUrl: PropTypes.string, - children: PropTypes.object, - className: PropTypes.string, - renditions: PropTypes.object, - sections: PropTypes.object, - list: PropTypes.object, - name: PropTypes.string, }; export default RecipeDetails; diff --git a/src/features/recipes/components/recipe-details/RecipeDifficultyCard.jsx b/src/features/recipes/components/recipe-details/RecipeDifficultyCard.jsx new file mode 100644 index 0000000..cf03af9 --- /dev/null +++ b/src/features/recipes/components/recipe-details/RecipeDifficultyCard.jsx @@ -0,0 +1,61 @@ +import PropTypes from "prop-types"; +import ChefCarrots from "@/assets/brand/chef-carrots/ChefCarrots"; +import RecipeDifficultyDetail from "./RecipeDifficultyDetail"; + +export const RecipeDifficultyCard = ({ tags }) => { + // Available cards: + // Difficulty: easy + // Time: under_15_minutes || under_30_minutes || under_45_minutes || under_1_hour + // Complexity: 5_ingredients_or_less + + const under15Minutes = tags.find((tag) => tag.name === "under_15_minutes"); + const under30Minutes = tags.find((tag) => tag.name === "under_30_minutes"); + const under45Minutes = tags.find((tag) => tag.name === "under_45_minutes"); + const under1Hour = tags.find((tag) => tag.name === "under_1_hour"); + + const easy = tags.find( + (tag) => tag.type === "difficulty" && tag.name === "easy", + ); + + let quickText = ""; + + if (under15Minutes) quickText = "Under 15 Minutes"; + if (under30Minutes) quickText = "Under 30 Minutes"; + if (under45Minutes) quickText = "Under 45 Minutes"; + if (under1Hour) quickText = "Under 1 Hour"; + + const simple = tags.find( + (tag) => tag.type === "difficulty" && tag.name === "5_ingredients_or_less", + ); + return ( +
    + +
    + {easy && ( + + )} + {quickText && ( + + )} + {simple && ( + + )} +
    +
    + ); +}; + +RecipeDifficultyCard.propTypes = { + tags: PropTypes.array, +}; diff --git a/src/features/recipes/components/recipe-details/RecipeDifficultyDetail.jsx b/src/features/recipes/components/recipe-details/RecipeDifficultyDetail.jsx new file mode 100644 index 0000000..229030c --- /dev/null +++ b/src/features/recipes/components/recipe-details/RecipeDifficultyDetail.jsx @@ -0,0 +1,30 @@ +import { Heading, Icon } from "@/features/ui"; +import PropTypes from "prop-types"; + +const RecipeDifficultyDetail = ({ title, icon, text }) => { + const className = + "sm:border-r-2 " + + "md:border-r-0 " + + "lg:border-r-2 " + + "last:border-r-0 " + + "border-dotted " + + "border-lava-300 " + + "px-2 md:px-0 " + + "lg:px-2 "; + return ( +
    + + {title} + +

    {text}

    +
    + ); +}; + +export default RecipeDifficultyDetail; + +RecipeDifficultyDetail.propTypes = { + title: PropTypes.string, + icon: PropTypes.string, + text: PropTypes.string, +}; diff --git a/src/features/recipes/components/recipe-details/RecipeImage.jsx b/src/features/recipes/components/recipe-details/RecipeImage.jsx new file mode 100644 index 0000000..8df0c91 --- /dev/null +++ b/src/features/recipes/components/recipe-details/RecipeImage.jsx @@ -0,0 +1,30 @@ +import PropTypes from "prop-types"; + +export const RecipeImage = ({ src, alt, description }) => { + let wrapperClasses = ""; + let pictureClasses = ""; + if (description) { + wrapperClasses += + "picture-wrapper -mt-6 mb-4 box-content flex justify-center overflow-visible md:rotate-12 md:rounded-full md:border-[.5rem] border-b-[.3rem] border-dashed border-tangerine-500 pb-6 md:-mr-20 md:-mt-16 md:h-[17rem] md:w-[17rem] md:p-3 xl:h-[25rem] xl:max-h-[25vw] xl:w-[25rem] xl:max-w-[25vw]"; + pictureClasses += + "-mx-6 block h-full w-full overflow-clip rounded-t-xl object-cover md:rounded-full md:shadow-2xl"; + } else { + wrapperClasses += ""; + pictureClasses += ""; + } + return ( +
    +
    + + {alt} + +
    +
    + ); +}; + +RecipeImage.propTypes = { + src: PropTypes.string, + alt: PropTypes.string, + description: PropTypes.string, +}; diff --git a/src/features/recipes/components/recipe-details/RecipeVideo.jsx b/src/features/recipes/components/recipe-details/RecipeVideo.jsx new file mode 100644 index 0000000..874b343 --- /dev/null +++ b/src/features/recipes/components/recipe-details/RecipeVideo.jsx @@ -0,0 +1,20 @@ +import PropTypes from "prop-types"; + +export const RecipeVideo = ({ videoUrl, renditions, ...attributes }) => { + if (!videoUrl) return null; + const sources = Object.values(renditions).map((src, index) => { + return ; + }); + return ( +
    + +
    + ); +}; + +RecipeVideo.propTypes = { + videoUrl: PropTypes.string, + renditions: PropTypes.array, +}; diff --git a/src/features/recipes/components/recipe-details/Section.jsx b/src/features/recipes/components/recipe-details/Section.jsx new file mode 100644 index 0000000..225f38b --- /dev/null +++ b/src/features/recipes/components/recipe-details/Section.jsx @@ -0,0 +1,46 @@ +import PropTypes from "prop-types"; +import { Heading } from "@/features/ui"; + +// Section is the term the Tasty api uses for an individual ingredient for a recipe component +export const Section = ({ list, name }) => { + const components = list.map((component, index) => { + const quantity = component.measurements[0].quantity; + const unit = component.measurements[0].unit; + const isPlural = quantity > 1 ? true : false; + const measurement = ( + + + {quantity && quantity !== "0" ? quantity + " " : "-"} + + + {isPlural ? unit.display_plural + " " : unit.display_singular + " "} + + + ); + const name = + isPlural && unit.display_plural === "" + ? component.ingredient.display_plural + " " + : component.ingredient.display_singular + " "; + const note = component.extra_comment ? ` (${component.extra_comment})` : ""; + return ( +
  • + {measurement} + {name} + {note} +
  • + ); + }); + return ( +
    + + {name || "You'll Need:"} + +
      {components}
    +
    + ); +}; + +Section.propTypes = { + list: PropTypes.array, + name: PropTypes.string, +}; diff --git a/src/features/recipes/components/recipe-details/Tags.jsx b/src/features/recipes/components/recipe-details/Tags.jsx new file mode 100644 index 0000000..dcb7db7 --- /dev/null +++ b/src/features/recipes/components/recipe-details/Tags.jsx @@ -0,0 +1,37 @@ +import PropTypes from "prop-types"; +import { Link } from "react-router-dom"; + +export const Tags = ({ tags }) => { + const filteredCategories = [ + "equipment", + "appliance", + "difficulty", + "business_tags", + ]; + const displayTags = tags + .filter((tag) => !filteredCategories.includes(tag.type)) + .slice(0, 20); + if (displayTags.length === 0) return null; + return ( +
    + {displayTags.map((tag, index) => { + return ( + + + {tag.display_name} + + {index !== displayTags.length - 1 ? ", " : ""} + + ); + })} +
    + ); +}; + +Tags.propTypes = { + tags: PropTypes.array, +}; diff --git a/src/features/recipes/components/recipe-details/Tips.jsx b/src/features/recipes/components/recipe-details/Tips.jsx new file mode 100644 index 0000000..7d82b76 --- /dev/null +++ b/src/features/recipes/components/recipe-details/Tips.jsx @@ -0,0 +1,93 @@ +import PropTypes from "prop-types"; +import { FetchTipsById } from "../../api"; +import { LoadingState } from "@/features/ui"; +import { Carousel } from "react-responsive-carousel"; +import "react-responsive-carousel/lib/styles/carousel.min.css"; + +export const Tips = ({ recipeId }) => { + const { data: tips, isLoading, isError, error } = FetchTipsById(recipeId); + + if (isLoading) { + return ; + } + + if (isError) { + return
    Error: {error.message}
    ; + } + + return ( + + {tips.map((tip) => ( +
    + +
    + ))} +
    + ); +}; + +const TipCard = ({ + tip_body, + author_name, + author_username, + author_avatar_url, + updated_at, +}) => { + const RenderYearsSinceTimeStamp = (timeStamp) => { + const timeStampDate = new Date(timeStamp * 1000); + const currentDate = new Date(); + const differenceInMilliseconds = currentDate - timeStampDate; + const differenceInYears = + differenceInMilliseconds / (1000 * 60 * 60 * 24 * 365); + const fullYears = Math.round(differenceInYears); + + return `${fullYears} years ago`; + }; + + return ( +
    +
    +
    + +
    +

    + {author_name ? author_name : author_username} +

    +
    +
    +

    + "{tip_body}" +

    +
    +
    +

    {RenderYearsSinceTimeStamp(updated_at)}

    +
    +
    + ); +}; +Tips.propTypes = { + recipeId: PropTypes.number, +}; + +TipCard.propTypes = { + tip_body: PropTypes.string, + author_avatar_url: PropTypes.string, + author_name: PropTypes.string, + author_username: PropTypes.string, + updated_at: PropTypes.number, +}; diff --git a/src/features/recipes/components/recipe-details/Topics.jsx b/src/features/recipes/components/recipe-details/Topics.jsx new file mode 100644 index 0000000..b80141d --- /dev/null +++ b/src/features/recipes/components/recipe-details/Topics.jsx @@ -0,0 +1,29 @@ +import PropTypes from "prop-types"; +import { Link } from "react-router-dom"; + +export const Topics = ({ topics }) => { + if (topics.length === 0) return null; + return ( +
    + Topics: + {topics.map((topic, index) => { + return ( + <> + + {topic.name} + + {index !== topics.length - 1 ? ", " : ""} + + ); + })} +
    + ); +}; + +Topics.propTypes = { + topics: PropTypes.object, +}; diff --git a/src/features/recipes/components/recipe-link-card/RecipeLinkCard.jsx b/src/features/recipes/components/recipe-link-card/RecipeLinkCard.jsx index 77f07b0..401ef31 100644 --- a/src/features/recipes/components/recipe-link-card/RecipeLinkCard.jsx +++ b/src/features/recipes/components/recipe-link-card/RecipeLinkCard.jsx @@ -39,7 +39,7 @@ export const RecipeLinkCard = ({
    - + {text}
    diff --git a/src/features/recipes/components/recipe-list/recipe-list.jsx b/src/features/recipes/components/recipe-list/recipe-list.jsx index c26c5da..977002d 100644 --- a/src/features/recipes/components/recipe-list/recipe-list.jsx +++ b/src/features/recipes/components/recipe-list/recipe-list.jsx @@ -1,11 +1,99 @@ +// eslint-disable-next-line react-hooks/exhaustive-deps + import PropTypes from "prop-types"; +import { useState, useEffect, useMemo } from "react"; import { RecipeCard } from "../recipe-card"; import { FetchRecipes } from "../../api"; +import { Filters } from "../filters"; +import { LoadingState, Heading } from "@/features/ui"; +import { Navigate } from "react-router-dom"; +import { BiPlus, BiMinus } from "react-icons/bi"; +const allowedTagTypes = [ + "difficulty", + "meal", + "occasion", + "dietary", + "cuisine", + "cooking_style", +]; export const RecipeList = ({ searchTerm }) => { const { data: recipes, isLoading, isError, error } = FetchRecipes(searchTerm); + const [selectedTags, setSelectedTags] = useState([]); + const [isOpen, setIsOpen] = useState(false); + // State to store the tags available in the fetched recipes + const [tagsCollection, setTagsCollection] = useState(() => + allowedTagTypes.reduce((acc, type) => ({ ...acc, [type]: [] }), {}), + ); + + // This effect will run once on initial render to initialize tagsCollection + useEffect(() => { + if (recipes && recipes.results) { + const newTagsCollection = allowedTagTypes.reduce((collection, type) => { + collection[type] = recipes.results + .flatMap((recipe) => recipe.tags || []) + .filter((tag) => tag && tag.type === type) + .reduce((uniqueTags, tag) => { + if (!uniqueTags.some((uniqueTag) => uniqueTag.id === tag.id)) { + uniqueTags.push(tag); + } + return uniqueTags; + }, []); + + return collection; + }, {}); + + setTagsCollection(newTagsCollection); + } + }, [recipes]); // Depends on 'recipes' to re-run if recipes change + + const filteredRecipes = + selectedTags.length > 0 + ? recipes.results.filter((recipe) => { + const recipeTags = recipe.tags || []; + const hasMatchingTag = recipeTags.some((tag) => + selectedTags.some((selectedTag) => selectedTag.id === tag.id), + ); + + return hasMatchingTag; + }) + : recipes?.results; + + const displayedTags = useMemo(() => { + const filteredTags = {}; + + // Create a set of tag IDs present in the filtered recipes + const filteredTagIds = new Set( + (filteredRecipes || []).flatMap((recipe) => + (recipe.tags || []).map((recipeTag) => recipeTag.id).filter(Boolean), + ), + ); + + // Iterate over the types of tags and filter them based on the selected tags and filtered recipes + Object.keys(tagsCollection).forEach((type) => { + filteredTags[type] = tagsCollection[type].filter( + (tag) => + filteredTagIds.has(tag.id) || + selectedTags.some((selectedTag) => selectedTag.id === tag.id), + ); + }); + + // Remove the tag from the second type if it has already been added to the first type + const otherTypes = Object.keys(filteredTags).filter((t) => t !== t.type); + otherTypes.forEach((otherType) => { + const index = filteredTags[otherType].findIndex( + (tag) => tag.id === tag.id, + ); + if (index !== -1) { + filteredTags[otherType].splice(index, 1); + } + }); + + return filteredTags; + }, [selectedTags, filteredRecipes, tagsCollection]); + if (isLoading) { - return
    Loading...
    ; + return ; } if (isError) { @@ -18,16 +106,66 @@ export const RecipeList = ({ searchTerm }) => { recipes.results.length === 0 ) { console.log(!recipes); - console.log(Array.isArray(recipes.results)); - return
    No recipes found
    ; + console.log(!Array.isArray(recipes.results)); + console.log(recipes.results.length === 0); + return ; } + const handleTagClick = (clickedTag) => { + setSelectedTags((currentSelectedTags) => { + // Check if the tag is already selected + const isSelected = currentSelectedTags.some( + (tag) => tag.id === clickedTag.id, + ); + if (isSelected) { + // If the tag is already selected, remove it from the array + return currentSelectedTags.filter((tag) => tag.id !== clickedTag.id); + } else { + // If the tag is not selected, add it to the array + return [...currentSelectedTags, clickedTag]; + } + }); + }; + return ( -
    - {recipes.results.map((recipe) => ( - - ))} -
    + <> +
    +
    + + {searchTerm} + + + {`${filteredRecipes.length} recipes`} + +
    + +
    + {isOpen && ( + + )} +
    + {filteredRecipes && + filteredRecipes.map((recipe) => ( + + ))} +
    + ); }; diff --git a/src/features/ui/Header/Header.jsx b/src/features/ui/Header/Header.jsx index de147dc..380f9b5 100644 --- a/src/features/ui/Header/Header.jsx +++ b/src/features/ui/Header/Header.jsx @@ -7,8 +7,6 @@ import { Fragment } from "react"; import { Link } from "react-router-dom"; export const Header = () => { - // const [toggle, setToggle] = useState(false); - return (