gitextract_ov6rt79l/ ├── .gitignore ├── .husky/ │ ├── .gitignore │ └── pre-commit ├── .prettierignore ├── .prettierrc ├── .vscode/ │ └── settings.json ├── LICENSE ├── README.md ├── package.json ├── public/ │ ├── browserconfig.xml │ ├── index.html │ ├── robots.txt │ └── site.webmanifest ├── src/ │ ├── App.tsx │ ├── diets/ │ │ ├── DietEditor/ │ │ │ ├── DndContextProvider.tsx │ │ │ ├── Form/ │ │ │ │ ├── About.tsx │ │ │ │ ├── Controls/ │ │ │ │ │ ├── ExportButton.tsx │ │ │ │ │ ├── MenuOrDrawer.tsx │ │ │ │ │ ├── Name.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── Footer.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── useDietFormEvents.ts │ │ │ │ └── useVariantFormActions.ts │ │ │ └── index.tsx │ │ ├── PdfDietEditor.tsx │ │ ├── dietForm.ts │ │ ├── index.ts │ │ ├── persistence/ │ │ │ ├── ExportModal/ │ │ │ │ ├── Content/ │ │ │ │ │ ├── Exporter/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── usePdfExport.ts │ │ │ │ │ │ └── worker/ │ │ │ │ │ │ ├── custom.d.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── types.ts │ │ │ │ │ │ └── worker.tsx │ │ │ │ │ └── index.tsx │ │ │ │ └── index.tsx │ │ │ ├── canExportDietForm.ts │ │ │ ├── hasMissingFoods.ts │ │ │ ├── index.ts │ │ │ ├── loadLastOrDefaultDietForm.ts │ │ │ ├── parseDietForm.ts │ │ │ ├── useDietImportErrors.tsx │ │ │ └── useImportDietForm.ts │ │ ├── types.ts │ │ ├── useDietFormStore.ts │ │ ├── useGetDietFormStatsTree.ts │ │ └── useScrollManager.ts │ ├── dom/ │ │ ├── animateScrollLeft.ts │ │ ├── index.ts │ │ ├── isElementInViewport.ts │ │ ├── useGetRefForId.ts │ │ └── useScrollTo.ts │ ├── foods/ │ │ ├── FoodInfo.tsx │ │ ├── FoodModal/ │ │ │ ├── Content/ │ │ │ │ ├── DeleteConfirmationModal.tsx │ │ │ │ ├── FoodFormProvider.tsx │ │ │ │ ├── Form/ │ │ │ │ │ ├── Footer.tsx │ │ │ │ │ ├── Header.tsx │ │ │ │ │ ├── Tabs/ │ │ │ │ │ │ ├── NutritionFactsFormFields.tsx │ │ │ │ │ │ ├── UrlField.tsx │ │ │ │ │ │ ├── VolumeFormFields.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── useSubmitFoodForm.ts │ │ │ │ │ └── useTabs.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── useDeleteFood.ts │ │ │ └── index.tsx │ │ ├── FoodsDrawer/ │ │ │ ├── Content/ │ │ │ │ ├── Header.tsx │ │ │ │ ├── MenuButtons.tsx │ │ │ │ ├── SelectedFoodsList/ │ │ │ │ │ ├── SelectedFoodItem.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── useFoodEvents.ts │ │ │ └── index.tsx │ │ ├── FoodsList/ │ │ │ ├── VirtualizedList/ │ │ │ │ ├── FoodItem/ │ │ │ │ │ ├── AnimateAppear.tsx │ │ │ │ │ ├── DisappearingBox.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── FoodItemRenderer.tsx │ │ │ │ ├── Inner.tsx │ │ │ │ └── index.tsx │ │ │ └── index.tsx │ │ ├── builtIn/ │ │ │ ├── bakedProducts.json │ │ │ ├── beef.json │ │ │ ├── beverages.json │ │ │ ├── dairyAndEggs.json │ │ │ ├── fatsAndOils.json │ │ │ ├── finfishAndShellFish.json │ │ │ ├── fruitsAndJuices.json │ │ │ ├── grainsAndPasta.json │ │ │ ├── index.ts │ │ │ ├── legumesAndLegumeProducts.json │ │ │ ├── nutAndSeedProducts.json │ │ │ ├── pork.json │ │ │ ├── poultry.json │ │ │ ├── saucesAndSoups.json │ │ │ ├── spicesAndHerbs.json │ │ │ ├── sweetsAndSnacks.json │ │ │ └── vegetables.json │ │ ├── foodForm.ts │ │ ├── foodVolumeForm.ts │ │ ├── index.ts │ │ ├── persistence/ │ │ │ ├── FoodsListModal/ │ │ │ │ ├── Content.tsx │ │ │ │ └── index.tsx │ │ │ ├── MissingFoodsModal.tsx │ │ │ ├── index.ts │ │ │ ├── loadFoods.ts │ │ │ └── useImportFoods.ts │ │ ├── types.ts │ │ └── useFoodsStore.ts │ ├── foods-categories/ │ │ ├── FoodCategoriesSelect.tsx │ │ ├── categories.json │ │ ├── index.ts │ │ └── types.ts │ ├── foods-filters/ │ │ ├── FoodsFilterPopoverOrModal/ │ │ │ ├── Content.tsx │ │ │ ├── Footer.tsx │ │ │ ├── Modal.tsx │ │ │ ├── Popover.tsx │ │ │ ├── Trigger.tsx │ │ │ └── index.tsx │ │ ├── foodsFilter.ts │ │ ├── index.ts │ │ ├── persistence/ │ │ │ ├── index.ts │ │ │ └── loadFoodsFilter.ts │ │ ├── useFilterFoods.ts │ │ └── useFoodsFilterStore.ts │ ├── form/ │ │ ├── duplicate.ts │ │ ├── index.ts │ │ ├── names.ts │ │ ├── types.ts │ │ ├── useFormError.ts │ │ └── useSelectInputText.ts │ ├── general/ │ │ ├── Badge.tsx │ │ ├── ContextMenuFlex.tsx │ │ ├── HFadeScroll/ │ │ │ ├── FadeBox.tsx │ │ │ ├── ScrollContainer.tsx │ │ │ └── index.tsx │ │ ├── Loader.tsx │ │ ├── Menu.tsx │ │ ├── MenuOrDrawer/ │ │ │ ├── Drawer/ │ │ │ │ ├── getDrawerButtons.tsx │ │ │ │ └── index.tsx │ │ │ ├── Menu/ │ │ │ │ ├── getMenuItems.tsx │ │ │ │ └── index.tsx │ │ │ ├── MenuOrDrawerItem.tsx │ │ │ ├── MenuOrDrawerSeparator.tsx │ │ │ ├── Trigger.tsx │ │ │ └── index.tsx │ │ ├── ResponsiveButton.tsx │ │ ├── ResponsiveIconButton.tsx │ │ ├── RightAligned.tsx │ │ ├── ScreenSizeProvider/ │ │ │ ├── context.ts │ │ │ └── index.tsx │ │ ├── Tooltip.tsx │ │ ├── TooltipCommandLabel.tsx │ │ ├── deepCopy.ts │ │ ├── getCtrlKeyName.ts │ │ ├── index.ts │ │ ├── minDelay.ts │ │ ├── stores.tsx │ │ ├── useElementHeight.ts │ │ ├── useOneTimeCheckStore.ts │ │ ├── useRunIfNotUnmounted.ts │ │ ├── useSameOrPreviousValue.ts │ │ └── useSelection.ts │ ├── icons/ │ │ ├── CalendarPlus.tsx │ │ └── index.ts │ ├── index.tsx │ ├── ingredients/ │ │ ├── IngredientsList/ │ │ │ ├── EmptyList.tsx │ │ │ ├── IngredientItem/ │ │ │ │ ├── MenuOrDrawer.tsx │ │ │ │ ├── MissingStatsLayout.tsx │ │ │ │ ├── Notes.tsx │ │ │ │ ├── PresenceAnimation.tsx │ │ │ │ ├── StatsLayout.tsx │ │ │ │ ├── getMenuOrDrawerItems.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── useIngredientsEvents.ts │ │ │ │ └── useNotesEvents.tsx │ │ │ └── index.tsx │ │ ├── PdfIngredientsList/ │ │ │ ├── PdfIngredientItem/ │ │ │ │ ├── FoodName.tsx │ │ │ │ └── index.tsx │ │ │ └── index.tsx │ │ ├── getIngredient.ts │ │ ├── index.ts │ │ ├── ingredientForm.ts │ │ ├── types.ts │ │ ├── useGetIngredientFormStatsTree.ts │ │ └── useIngredientsFormsActions.ts │ ├── layout/ │ │ ├── MainLayout.tsx │ │ ├── Page/ │ │ │ ├── ElementContainer.tsx │ │ │ ├── PageBody.tsx │ │ │ ├── PageFooter.tsx │ │ │ ├── PageHeader.tsx │ │ │ └── index.tsx │ │ ├── RightAligned.tsx │ │ ├── index.tsx │ │ └── useHasSideNavigation.ts │ ├── meals/ │ │ ├── MealsList/ │ │ │ ├── EmptyList.tsx │ │ │ ├── MealItem/ │ │ │ │ ├── Header/ │ │ │ │ │ ├── MenuOrDrawer.tsx │ │ │ │ │ ├── Name.tsx │ │ │ │ │ ├── getMenuOrDrawerItems.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── Notes.tsx │ │ │ │ ├── PresenceAnimation.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── useGetAndUpdateStats.ts │ │ │ │ └── useMealFormEvents.ts │ │ │ ├── MealsControls.tsx │ │ │ ├── index.tsx │ │ │ └── useScrollToAndFocusMeal.ts │ │ ├── PdfMealsList/ │ │ │ ├── Notes.tsx │ │ │ ├── PdfMealItem.tsx │ │ │ └── index.tsx │ │ ├── index.ts │ │ ├── mealForm.ts │ │ ├── types.ts │ │ ├── useGetMealFormStatsTree.ts │ │ └── useMealsFormsActions.ts │ ├── notes/ │ │ ├── EditNotesModal/ │ │ │ ├── Content/ │ │ │ │ ├── Form/ │ │ │ │ │ ├── Header.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── NotesFormProvider.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── notesForm.ts │ │ │ └── index.tsx │ │ ├── index.ts │ │ └── notesForm.ts │ ├── persistence/ │ │ ├── DownloadButton.tsx │ │ ├── file.ts │ │ ├── fixWhiteSpace.tsx │ │ ├── getUntitledFileName.ts │ │ ├── index.ts │ │ ├── useBlobUrl.ts │ │ ├── useImportFileError.ts │ │ └── useSaveValue.ts │ ├── portions/ │ │ ├── PortionsMenuOrDrawer/ │ │ │ ├── Drawer/ │ │ │ │ ├── PortionItem.tsx │ │ │ │ └── index.tsx │ │ │ ├── Menu.tsx │ │ │ ├── Trigger.tsx │ │ │ └── index.tsx │ │ ├── PortionsSelect.tsx │ │ ├── defaultPortions.ts │ │ ├── formatAmount.ts │ │ ├── getAmountFromPortionsToGrams.ts │ │ ├── getIngredientPortionDescription.ts │ │ ├── getPortionDescription.ts │ │ ├── getToGramsConversionFactor.ts │ │ ├── index.ts │ │ ├── types.ts │ │ ├── useGetAmount.ts │ │ ├── useGetToGramsConversionFactor.ts │ │ └── usePortionsStore.ts │ ├── react-app-env.d.ts │ ├── reportWebVitals.ts │ ├── setupTests.ts │ ├── stats/ │ │ ├── AmountInput.tsx │ │ ├── EnergyStat.tsx │ │ ├── PdfStat.tsx │ │ ├── PdfStatsLayout.tsx │ │ ├── Stat.tsx │ │ ├── StatValueDetail.tsx │ │ ├── StatsFormFields/ │ │ │ ├── MacrosFormFields.tsx │ │ │ ├── ReavealButton.tsx │ │ │ ├── StatFormField/ │ │ │ │ ├── ReadOnlyInput.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── types.ts │ │ │ │ └── useGetInputElement.tsx │ │ │ ├── VitaminsAndMineralsFormFields.tsx │ │ │ ├── index.tsx │ │ │ ├── useGetDailyValuePercent.ts │ │ │ └── useGetValue.ts │ │ ├── StatsLayout.tsx │ │ ├── amountAsNumber.ts │ │ ├── calculations/ │ │ │ ├── aggregateStats.ts │ │ │ ├── getDailyValuePercent.ts │ │ │ ├── getEnergiesEstimates.ts │ │ │ ├── getMacrosPercents.ts │ │ │ ├── getStatsTree.ts │ │ │ ├── index.ts │ │ │ └── roundMacrosPercents.ts │ │ ├── getUnit.ts │ │ ├── index.ts │ │ ├── objectFromNutritionDataKeys.ts │ │ ├── statsVariants.ts │ │ ├── types.ts │ │ ├── useMealsStatsStore.ts │ │ ├── useUpdateMealStats.ts │ │ └── useVariantStats.ts │ ├── theme/ │ │ ├── colors.ts │ │ ├── components/ │ │ │ ├── Alert.ts │ │ │ ├── Button.ts │ │ │ ├── Divider.ts │ │ │ ├── Input.ts │ │ │ ├── Textarea.ts │ │ │ └── index.ts │ │ ├── getComputedColorFromChakra.ts │ │ ├── index.ts │ │ └── styles.ts │ ├── undoRedo/ │ │ ├── UndoRedoButtons/ │ │ │ ├── RedoButton.tsx │ │ │ ├── UndoButton.tsx │ │ │ └── index.tsx │ │ ├── appLocation.ts │ │ ├── deltasStack.ts │ │ ├── index.ts │ │ ├── useDietFormVersionsStore.ts │ │ └── useKeyboard.ts │ └── variants/ │ ├── PdfVariantsList/ │ │ ├── PdfVariantItem.tsx │ │ └── index.tsx │ ├── VariantStats/ │ │ ├── EnergyStat.tsx │ │ ├── VariantStat.tsx │ │ └── index.tsx │ ├── VariantsDetailsModal/ │ │ ├── Content/ │ │ │ ├── FormFields.tsx │ │ │ ├── VariantsDetailsFormProvider.tsx │ │ │ ├── index.tsx │ │ │ ├── useVariantFormEvents.ts │ │ │ └── variantsDetailsForm.ts │ │ └── index.tsx │ ├── VariantsList/ │ │ ├── AddVariantButton.tsx │ │ ├── ScrollButtons.tsx │ │ ├── VariantItem/ │ │ │ ├── PresenceAnimation.tsx │ │ │ ├── getMenuOrDrawerItems.tsx │ │ │ ├── index.tsx │ │ │ ├── useScrollIntoView.ts │ │ │ └── useVariantFormEvents.ts │ │ ├── VariantNameModal/ │ │ │ ├── Content.tsx │ │ │ ├── VariantNameFormProvider.tsx │ │ │ ├── index.tsx │ │ │ ├── useSubmitVariantNameForm.ts │ │ │ └── variantNameForm.ts │ │ ├── VariantsMenuOrDrawer/ │ │ │ ├── Drawer/ │ │ │ │ ├── VariantItem.tsx │ │ │ │ └── index.tsx │ │ │ ├── Menu.tsx │ │ │ ├── Trigger.tsx │ │ │ └── index.tsx │ │ ├── index.tsx │ │ ├── useScrollState.ts │ │ └── useVariantFormEvents.ts │ ├── getVariantFormIndexAfterRemove.ts │ ├── index.ts │ ├── useGetVariantFormStatsTree.ts │ ├── useVariantsFormsActions.ts │ └── variantForm.ts └── tsconfig.json