gitextract_ajccn8ug/ ├── .cursorrules ├── .github/ │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.md │ │ ├── config.yml │ │ └── feature_request.md │ ├── pull_request_template.md │ └── workflows/ │ ├── ci.yml │ ├── notify-discord-issues.yml │ ├── notify-discord-pr.yml │ ├── notify-discord.yml │ └── publish-ghcr-image.yml ├── .gitignore ├── .npmrc ├── .prettierrc ├── .vscode/ │ └── settings.json ├── AGENTS.md ├── CLAUDE.md ├── CONTRIBUTING.md ├── Dockerfile ├── LICENSE ├── Makefile ├── README.md ├── app/ │ ├── [locale]/ │ │ ├── (admin)/ │ │ │ └── admin/ │ │ │ ├── [...catchAll]/ │ │ │ │ ├── not-found.tsx │ │ │ │ └── page.tsx │ │ │ ├── dashboard/ │ │ │ │ └── page.tsx │ │ │ ├── layout.tsx │ │ │ ├── not-found.tsx │ │ │ ├── programs/ │ │ │ │ ├── [id]/ │ │ │ │ │ └── edit/ │ │ │ │ │ └── page.tsx │ │ │ │ └── page.tsx │ │ │ ├── settings/ │ │ │ │ └── page.tsx │ │ │ └── users/ │ │ │ └── page.tsx │ │ ├── (app)/ │ │ │ ├── (legal-and-payment)/ │ │ │ │ ├── layout.tsx │ │ │ │ └── legal/ │ │ │ │ ├── privacy/ │ │ │ │ │ └── page.tsx │ │ │ │ ├── sales-terms/ │ │ │ │ │ └── page.tsx │ │ │ │ └── terms/ │ │ │ │ └── page.tsx │ │ │ ├── [slug]/ │ │ │ │ └── layout.tsx │ │ │ ├── about/ │ │ │ │ └── page.tsx │ │ │ ├── auth/ │ │ │ │ ├── (auth-layout)/ │ │ │ │ │ ├── forgot-password/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── layout.tsx │ │ │ │ │ ├── reset-password/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── signin/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ └── signup/ │ │ │ │ │ └── page.tsx │ │ │ │ ├── error/ │ │ │ │ │ └── page.tsx │ │ │ │ ├── error.tsx │ │ │ │ ├── layout.tsx │ │ │ │ ├── signout/ │ │ │ │ │ └── page.tsx │ │ │ │ ├── verify-email/ │ │ │ │ │ ├── layout.tsx │ │ │ │ │ └── page.tsx │ │ │ │ └── verify-request/ │ │ │ │ └── page.tsx │ │ │ ├── layout.tsx │ │ │ ├── leaderboard/ │ │ │ │ └── page.tsx │ │ │ ├── onboarding/ │ │ │ │ ├── layout.tsx │ │ │ │ └── page.tsx │ │ │ ├── page.tsx │ │ │ ├── premium/ │ │ │ │ └── page.tsx │ │ │ ├── profile/ │ │ │ │ └── page.tsx │ │ │ ├── programs/ │ │ │ │ ├── [slug]/ │ │ │ │ │ ├── page.tsx │ │ │ │ │ └── session/ │ │ │ │ │ └── [sessionSlug]/ │ │ │ │ │ ├── ProgramSessionClient.tsx │ │ │ │ │ └── page.tsx │ │ │ │ └── page.tsx │ │ │ ├── statistics/ │ │ │ │ └── page.tsx │ │ │ └── tools/ │ │ │ ├── bmi-calculator/ │ │ │ │ ├── bmi-calculator.utils.ts │ │ │ │ ├── page.tsx │ │ │ │ └── shared/ │ │ │ │ ├── BmiCalculatorClient.tsx │ │ │ │ └── components/ │ │ │ │ ├── BmiEducationalContent.tsx │ │ │ │ ├── BmiHeightInput.tsx │ │ │ │ ├── BmiResultsDisplay.tsx │ │ │ │ ├── BmiUnitSelector.tsx │ │ │ │ ├── BmiWeightInput.tsx │ │ │ │ └── MathEquation.tsx │ │ │ ├── calorie-calculator/ │ │ │ │ ├── CalorieCalculatorHub.tsx │ │ │ │ ├── calorie-calculator-comparison/ │ │ │ │ │ ├── CalorieCalculatorComparison.tsx │ │ │ │ │ └── page.tsx │ │ │ │ ├── calorie-calculator.utils.ts │ │ │ │ ├── cunningham-calculator/ │ │ │ │ │ └── page.tsx │ │ │ │ ├── harris-benedict-calculator/ │ │ │ │ │ └── page.tsx │ │ │ │ ├── katch-mcardle-calculator/ │ │ │ │ │ └── page.tsx │ │ │ │ ├── mifflin-st-jeor-calculator/ │ │ │ │ │ └── page.tsx │ │ │ │ ├── oxford-calculator/ │ │ │ │ │ └── page.tsx │ │ │ │ ├── page.tsx │ │ │ │ ├── shared/ │ │ │ │ │ ├── CalorieCalculatorClient.tsx │ │ │ │ │ ├── calculator-configs.ts │ │ │ │ │ ├── calorie-formulas.utils.ts │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── ActivityLevelSelector.tsx │ │ │ │ │ │ ├── AgeInput.tsx │ │ │ │ │ │ ├── BodyFatInput.tsx │ │ │ │ │ │ ├── FAQSection.tsx │ │ │ │ │ │ ├── GenderSelector.tsx │ │ │ │ │ │ ├── GoalSelector.tsx │ │ │ │ │ │ ├── HeightInput.tsx │ │ │ │ │ │ ├── InfoButton.tsx │ │ │ │ │ │ ├── InfoModal.tsx │ │ │ │ │ │ ├── ResultsDisplay.tsx │ │ │ │ │ │ ├── UnitSelector.tsx │ │ │ │ │ │ ├── WeightInput.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── types/ │ │ │ │ │ └── index.ts │ │ │ │ └── styles.css │ │ │ ├── heart-rate-zones/ │ │ │ │ ├── lib/ │ │ │ │ │ └── utils.ts │ │ │ │ ├── page.tsx │ │ │ │ ├── seo/ │ │ │ │ │ ├── config.ts │ │ │ │ │ └── page-content.ts │ │ │ │ └── ui/ │ │ │ │ ├── HeartRateZonesCalculatorClient.tsx │ │ │ │ ├── components/ │ │ │ │ │ ├── EducationalContent.tsx │ │ │ │ │ ├── EducationalContentServer.tsx │ │ │ │ │ ├── FAQAccordion.tsx │ │ │ │ │ ├── SEOOptimizedContentServer.tsx │ │ │ │ │ └── ScrollToTopButton.tsx │ │ │ │ └── styles.css │ │ │ └── page.tsx │ │ ├── @modal/ │ │ │ └── (.)auth/ │ │ │ └── login/ │ │ │ └── page.tsx │ │ ├── layout.tsx │ │ ├── manifest.json/ │ │ │ └── route.ts │ │ ├── not-found.tsx │ │ └── providers.tsx │ ├── ads.txt/ │ │ └── route.ts │ ├── api/ │ │ ├── analytics/ │ │ │ └── premium/ │ │ │ └── route.ts │ │ ├── auth/ │ │ │ ├── [...all]/ │ │ │ │ └── route.ts │ │ │ └── signup/ │ │ │ └── route.ts │ │ ├── billing/ │ │ │ └── status/ │ │ │ └── route.ts │ │ ├── exercises/ │ │ │ ├── [exerciseId]/ │ │ │ │ └── statistics/ │ │ │ │ ├── one-rep-max/ │ │ │ │ │ └── route.ts │ │ │ │ ├── route.ts │ │ │ │ ├── volume/ │ │ │ │ │ └── route.ts │ │ │ │ └── weight-progression/ │ │ │ │ └── route.ts │ │ │ ├── all/ │ │ │ │ └── route.ts │ │ │ ├── route.ts │ │ │ └── shuffle/ │ │ │ └── route.ts │ │ ├── premium/ │ │ │ ├── billing-portal/ │ │ │ │ └── route.ts │ │ │ ├── checkout/ │ │ │ │ └── route.ts │ │ │ ├── plans/ │ │ │ │ └── route.ts │ │ │ └── status/ │ │ │ └── route.ts │ │ ├── programs/ │ │ │ ├── [slug]/ │ │ │ │ ├── enroll/ │ │ │ │ │ └── route.ts │ │ │ │ ├── progress/ │ │ │ │ │ └── route.ts │ │ │ │ ├── route.ts │ │ │ │ └── sessions/ │ │ │ │ └── [sessionSlug]/ │ │ │ │ └── route.ts │ │ │ ├── route.ts │ │ │ └── session-progress/ │ │ │ ├── [progressId]/ │ │ │ │ └── complete/ │ │ │ │ └── route.ts │ │ │ └── start/ │ │ │ └── route.ts │ │ ├── revenuecat/ │ │ │ ├── link-user/ │ │ │ │ └── route.ts │ │ │ ├── sync-status/ │ │ │ │ └── route.ts │ │ │ └── webhook/ │ │ │ └── route.ts │ │ ├── user/ │ │ │ ├── password/ │ │ │ │ └── route.ts │ │ │ └── profile/ │ │ │ └── route.ts │ │ ├── webhooks/ │ │ │ ├── revenuecat/ │ │ │ │ └── route.ts │ │ │ └── stripe/ │ │ │ └── route.ts │ │ └── workout-sessions/ │ │ ├── [sessionId]/ │ │ │ ├── feedback/ │ │ │ │ └── route.ts │ │ │ ├── rating/ │ │ │ │ └── route.ts │ │ │ ├── route.ts │ │ │ └── summary/ │ │ │ └── route.ts │ │ ├── sync/ │ │ │ └── route.ts │ │ └── user/ │ │ └── [userId]/ │ │ └── route.ts │ ├── robots.txt │ └── sitemap.ts ├── components.json ├── content/ │ ├── about/ │ │ ├── en.mdx │ │ ├── es.mdx │ │ ├── fr.mdx │ │ ├── pt.mdx │ │ ├── ru.mdx │ │ └── zh-CN.mdx │ ├── privacy-policy/ │ │ ├── en.mdx │ │ ├── es.mdx │ │ ├── fr.mdx │ │ ├── pt.mdx │ │ ├── ru.mdx │ │ └── zh-CN.mdx │ ├── sales-terms/ │ │ ├── en.mdx │ │ ├── es.mdx │ │ ├── fr.mdx │ │ ├── pt.mdx │ │ ├── ru.mdx │ │ └── zh-CN.mdx │ └── terms/ │ ├── en.mdx │ ├── es.mdx │ ├── fr.mdx │ ├── pt.mdx │ ├── ru.mdx │ └── zh-CN.mdx ├── data/ │ └── sample-exercises.csv ├── docker-compose.yml ├── docs/ │ └── SELF-HOSTING.md ├── emails/ │ ├── ContactSupportEmail.tsx │ ├── DeleteAccountEmail.tsx │ ├── ResetPasswordEmail.tsx │ ├── VerifyEmail.tsx │ └── utils/ │ └── BaseEmailLayout.tsx ├── eslint.config.mjs ├── locales/ │ ├── client.ts │ ├── en.ts │ ├── es.ts │ ├── fr.ts │ ├── heart-rate-zones-translations.ts │ ├── pt.ts │ ├── ru.ts │ ├── server.ts │ ├── types.ts │ └── zh-CN.ts ├── middleware.ts ├── next.config.ts ├── nextauth.d.ts ├── package.json ├── postcss.config.mjs ├── prisma/ │ ├── migrations/ │ │ └── 0_init/ │ │ └── migration.sql │ ├── migrations_backup/ │ │ ├── 20240726_simplify_subscription_model/ │ │ │ └── migration.sql │ │ ├── 20250101000000_baseline/ │ │ │ └── migration.sql │ │ ├── 20250117000000_add_statistics_indexes/ │ │ │ └── migration.sql │ │ ├── 20250414120436_init/ │ │ │ └── migration.sql │ │ ├── 20250414170807_add_feedbacks/ │ │ │ └── migration.sql │ │ ├── 20250414174246_rename_feedbacks/ │ │ │ └── migration.sql │ │ ├── 20250414232816_add_first_name_and_last_name/ │ │ │ └── migration.sql │ │ ├── 20250416160303_add_plans/ │ │ │ └── migration.sql │ │ ├── 20250416160502_map/ │ │ │ └── migration.sql │ │ ├── 20250505114841_add_user_role/ │ │ │ └── migration.sql │ │ ├── 20250505191954_admin_and_user_lowercase/ │ │ │ └── migration.sql │ │ ├── 20250610182024_add_exercises_and_attributes/ │ │ │ └── migration.sql │ │ ├── 20250610182815_add_exercise_enums/ │ │ │ └── migration.sql │ │ ├── 20250610184725_simplified_exercises/ │ │ │ └── migration.sql │ │ ├── 20250611190228_convert_text_to_enums/ │ │ │ └── migration.sql │ │ ├── 20250611210106_add_enum_values/ │ │ │ └── migration.sql │ │ ├── 20250612213546_workout_session_sets/ │ │ │ └── migration.sql │ │ ├── 20250613095031_add_multi_column_support/ │ │ │ └── migration.sql │ │ ├── 20250614125347_add_table_maps/ │ │ │ └── migration.sql │ │ ├── 20250614153656_remove_value_int_value_sec_unit_from_workoutset/ │ │ │ └── migration.sql │ │ ├── 20250615160343_add_muscle_to_a_workout_session/ │ │ │ └── migration.sql │ │ ├── 20250615170916_add_cascade_delete_workout_sessions/ │ │ │ └── migration.sql │ │ ├── 20250623142458_add_billing_and_subscriptions/ │ │ │ └── migration.sql │ │ ├── 20250623143952_remove_webhook_events/ │ │ │ └── migration.sql │ │ ├── 20250623144324_add_webhook_events/ │ │ │ └── migration.sql │ │ ├── 20250625155932_add_admin/ │ │ │ └── migration.sql │ │ ├── 20250625195907_add_program_visibility/ │ │ │ └── migration.sql │ │ ├── 20250626102058_add_i18n_slugs_on_program/ │ │ │ └── migration.sql │ │ ├── 20250626134345_remove_emoji_on_program/ │ │ │ └── migration.sql │ │ ├── 20250626182857_cleanup_billing_system/ │ │ │ └── migration.sql │ │ ├── 20250626204136_remove_payment_table/ │ │ │ └── migration.sql │ │ ├── 20250626205121_remove_legacy_premium_fields/ │ │ │ └── migration.sql │ │ ├── 20250626205904_remove_payment_table_keep_ispremium/ │ │ │ └── migration.sql │ │ ├── 20250707114920_add_user_favorite_exercises/ │ │ │ └── migration.sql │ │ ├── 20250708214116_add_rating_to_wkt_sessions/ │ │ │ └── migration.sql │ │ ├── 20250709_add_revenuecat_fields/ │ │ │ └── migration.sql │ │ └── migration_lock.toml │ └── schema.prisma ├── public/ │ ├── _ads.txt │ ├── manifest.json │ └── sw.js ├── scripts/ │ ├── check-pricing-config.ts │ ├── import-exercises-with-attributes.prompt.md │ ├── import-exercises-with-attributes.ts │ ├── seed-leaderboard-data.ts │ ├── seed-multi-region-plans.ts │ ├── seed-subscription-plans-simple.ts │ ├── seed-workout-data-advanced.ts │ └── setup.sh ├── src/ │ ├── components/ │ │ ├── ads/ │ │ │ ├── AdBlockerForPremium.tsx │ │ │ ├── AdPlaceholder.tsx │ │ │ ├── AdSenseAutoAds.tsx │ │ │ ├── AdWrapper.tsx │ │ │ ├── EzoicAd.tsx │ │ │ ├── GoogleAdSense.tsx │ │ │ ├── HorizontalAdBanner.tsx │ │ │ ├── HorizontalBottomBanner.tsx │ │ │ ├── HorizontalTopBanner.tsx │ │ │ ├── InArticle.tsx │ │ │ ├── ResponsiveAdBanner.tsx │ │ │ ├── VerticalAdBanner.tsx │ │ │ ├── VerticalLeftBanner.tsx │ │ │ ├── VerticalRightBanner.tsx │ │ │ ├── index.ts │ │ │ └── nutripure-affiliate-banner.tsx │ │ ├── premium/ │ │ │ └── RemoveAdsText.tsx │ │ ├── pwa/ │ │ │ └── ServiceWorkerRegistration.tsx │ │ ├── seo/ │ │ │ ├── SEOHead.tsx │ │ │ ├── breadcrumbs.tsx │ │ │ ├── duration-badge.tsx │ │ │ ├── rich-snippet-rating.tsx │ │ │ └── session-rich-snippets.tsx │ │ ├── svg/ │ │ │ ├── BrokenLink.tsx │ │ │ ├── Calendly.tsx │ │ │ ├── CircleSvg.tsx │ │ │ ├── DiscordSvg.tsx │ │ │ ├── DotPattern.tsx │ │ │ ├── GoogleSvg.tsx │ │ │ ├── IconCheckboxCheck.tsx │ │ │ ├── LogoSvg.tsx │ │ │ ├── UnderlineSvg.tsx │ │ │ ├── VerifiedBadge.tsx │ │ │ └── Youtube.tsx │ │ ├── ui/ │ │ │ ├── 404-page-not-found.tsx │ │ │ ├── Bento.tsx │ │ │ ├── ToastSonner.tsx │ │ │ ├── accordion.tsx │ │ │ ├── alert-dialog.tsx │ │ │ ├── alert.tsx │ │ │ ├── animated-button/ │ │ │ │ └── ShinyButton.tsx │ │ │ ├── aspect-ratio.tsx │ │ │ ├── avatar.tsx │ │ │ ├── badge.tsx │ │ │ ├── bottom-sheet-vaul.tsx │ │ │ ├── bottom-sheet.tsx │ │ │ ├── button.tsx │ │ │ ├── card-styled.tsx │ │ │ ├── card.tsx │ │ │ ├── collapsible.tsx │ │ │ ├── dialog-stack.tsx │ │ │ ├── dialog.tsx │ │ │ ├── divider.tsx │ │ │ ├── donation-alert.tsx │ │ │ ├── dropdown-menu.tsx │ │ │ ├── form.tsx │ │ │ ├── hover-card.tsx │ │ │ ├── input-password-strength.tsx │ │ │ ├── input.tsx │ │ │ ├── iphone-mockup.tsx │ │ │ ├── label.tsx │ │ │ ├── link.tsx │ │ │ ├── loader.tsx │ │ │ ├── local-alert.tsx │ │ │ ├── moving-border.tsx │ │ │ ├── navigation-menu.tsx │ │ │ ├── next-top-loader.tsx │ │ │ ├── pagination.tsx │ │ │ ├── phone-frame-preview.tsx │ │ │ ├── popover.tsx │ │ │ ├── premium-gate.tsx │ │ │ ├── premium-upsell-alert.tsx │ │ │ ├── radio-group.tsx │ │ │ ├── scroll-area.tsx │ │ │ ├── select.tsx │ │ │ ├── separator.tsx │ │ │ ├── sheet.tsx │ │ │ ├── shine-border.tsx │ │ │ ├── simple-select.tsx │ │ │ ├── skeleton.tsx │ │ │ ├── slider.tsx │ │ │ ├── sonner.tsx │ │ │ ├── star-button.tsx │ │ │ ├── switch.tsx │ │ │ ├── table.tsx │ │ │ ├── tabs.tsx │ │ │ ├── textarea.tsx │ │ │ ├── theme-provider.tsx │ │ │ ├── timer.tsx │ │ │ ├── title-with-dot.tsx │ │ │ ├── toast.tsx │ │ │ ├── toaster.tsx │ │ │ ├── tooltip.tsx │ │ │ ├── typography.tsx │ │ │ ├── use-toast.ts │ │ │ └── workout-lol.tsx │ │ ├── utils/ │ │ │ ├── ErrorBoundaries.tsx │ │ │ └── TailwindIndicator.tsx │ │ └── version.tsx │ ├── entities/ │ │ ├── exercise/ │ │ │ ├── shared/ │ │ │ │ └── muscles.tsx │ │ │ └── types/ │ │ │ └── exercise.types.ts │ │ ├── program/ │ │ │ └── types/ │ │ │ └── program.types.ts │ │ ├── program-session/ │ │ │ └── types/ │ │ │ └── program-session.types.ts │ │ └── user/ │ │ ├── lib/ │ │ │ └── display-name.ts │ │ ├── model/ │ │ │ ├── get-server-session-user.ts │ │ │ ├── get-users.actions.ts │ │ │ ├── update-user-locale.ts │ │ │ ├── update-user.action.ts │ │ │ ├── use-auto-locale.ts │ │ │ ├── useCurrentSession.ts │ │ │ └── useCurrentUser.ts │ │ ├── schemas/ │ │ │ ├── get-user.schema.ts │ │ │ └── update-user.schema.ts │ │ └── types/ │ │ └── session-user.ts │ ├── env.ts │ ├── features/ │ │ ├── admin/ │ │ │ ├── layout/ │ │ │ │ ├── admin-header.tsx │ │ │ │ └── admin-sidebar/ │ │ │ │ └── ui/ │ │ │ │ ├── admin-header.tsx │ │ │ │ └── admin-sidebar.tsx │ │ │ ├── programs/ │ │ │ │ ├── actions/ │ │ │ │ │ ├── add-exercise.action.ts │ │ │ │ │ ├── add-session.action.ts │ │ │ │ │ ├── add-week.action.ts │ │ │ │ │ ├── create-program.action.ts │ │ │ │ │ ├── delete-program.action.ts │ │ │ │ │ ├── get-programs.action.ts │ │ │ │ │ ├── update-exercise-sets.action.ts │ │ │ │ │ ├── update-program-visibility.action.ts │ │ │ │ │ ├── update-program.action.ts │ │ │ │ │ ├── update-session.action.ts │ │ │ │ │ └── update-week.action.ts │ │ │ │ ├── types/ │ │ │ │ │ └── program.types.ts │ │ │ │ └── ui/ │ │ │ │ ├── add-exercise-modal.tsx │ │ │ │ ├── add-session-modal.tsx │ │ │ │ ├── add-week-modal.tsx │ │ │ │ ├── create-program-button.tsx │ │ │ │ ├── create-program-form.tsx │ │ │ │ ├── create-program-modal.tsx │ │ │ │ ├── delete-program-button.tsx │ │ │ │ ├── edit-program-modal.tsx │ │ │ │ ├── edit-session-modal.tsx │ │ │ │ ├── edit-sets-modal.tsx │ │ │ │ ├── edit-week-modal.tsx │ │ │ │ ├── program-builder.tsx │ │ │ │ ├── programs-list.tsx │ │ │ │ ├── session-card.tsx │ │ │ │ ├── visibility-badge.tsx │ │ │ │ └── week-card.tsx │ │ │ └── users/ │ │ │ └── list/ │ │ │ └── ui/ │ │ │ └── users-table.tsx │ │ ├── ads/ │ │ │ └── hooks/ │ │ │ └── useUserSubscription.ts │ │ ├── auth/ │ │ │ ├── forgot-password/ │ │ │ │ ├── forgot-password.schema.ts │ │ │ │ ├── model/ │ │ │ │ │ └── useForgotPassword.tsx │ │ │ │ └── ui/ │ │ │ │ └── forgot-password-form.tsx │ │ │ ├── lib/ │ │ │ │ ├── auth-client.ts │ │ │ │ └── better-auth.ts │ │ │ ├── model/ │ │ │ │ └── useLogout.ts │ │ │ ├── reset-password/ │ │ │ │ ├── model/ │ │ │ │ │ └── useResetPassword.ts │ │ │ │ ├── schema/ │ │ │ │ │ └── reset-password.schema.ts │ │ │ │ └── ui/ │ │ │ │ └── reset-password-form.tsx │ │ │ ├── signin/ │ │ │ │ ├── model/ │ │ │ │ │ └── useSignIn.ts │ │ │ │ ├── schema/ │ │ │ │ │ └── signin.schema.ts │ │ │ │ └── ui/ │ │ │ │ └── CredentialsLoginForm.tsx │ │ │ ├── signup/ │ │ │ │ ├── model/ │ │ │ │ │ ├── signup.action.ts │ │ │ │ │ └── useSignUp.ts │ │ │ │ ├── schema/ │ │ │ │ │ └── signup.schema.ts │ │ │ │ └── ui/ │ │ │ │ └── signup-form.tsx │ │ │ ├── ui/ │ │ │ │ ├── AuthButtonServer.tsx │ │ │ │ ├── LoggedInButton.tsx │ │ │ │ ├── ProviderButton.tsx │ │ │ │ ├── SignInButton.tsx │ │ │ │ └── SignUpButton.tsx │ │ │ └── verify-email/ │ │ │ ├── constants.ts │ │ │ ├── model/ │ │ │ │ └── useResendEmail.ts │ │ │ └── ui/ │ │ │ └── verify-email-page.tsx │ │ ├── consent-banner/ │ │ │ ├── model/ │ │ │ │ └── tracking-consent.action.ts │ │ │ ├── schema/ │ │ │ │ └── tracking-consent.schema.ts │ │ │ └── ui/ │ │ │ └── consent-banner.tsx │ │ ├── contact/ │ │ │ └── support/ │ │ │ ├── ContactSupportDialog.tsx │ │ │ ├── contact-support.action.ts │ │ │ └── contact-support.schema.ts │ │ ├── contact-feedback/ │ │ │ ├── model/ │ │ │ │ ├── contact-feedback.action.ts │ │ │ │ └── contact-feedback.schema.ts │ │ │ └── ui/ │ │ │ ├── ReviewInput.tsx │ │ │ └── contact-feedback-popover.tsx │ │ ├── dialogs-provider/ │ │ │ ├── DialogProvider.tsx │ │ │ └── DialogProviderDialog.tsx │ │ ├── email/ │ │ │ ├── EmailForm.tsx │ │ │ ├── email.action.ts │ │ │ └── email.schema.ts │ │ ├── form/ │ │ │ └── SubmitButton.tsx │ │ ├── layout/ │ │ │ ├── BottomNavigation.tsx │ │ │ ├── Footer.tsx │ │ │ ├── Header.tsx │ │ │ ├── model/ │ │ │ │ └── use-sidebar.store.tsx │ │ │ ├── nav-link.tsx │ │ │ ├── page-heading.tsx │ │ │ ├── useSidebarToggle.ts │ │ │ └── workout-streak-header.tsx │ │ ├── leaderboard/ │ │ │ ├── actions/ │ │ │ │ ├── get-top-workout-users.action.ts │ │ │ │ └── get-user-position.action.ts │ │ │ ├── hooks/ │ │ │ │ ├── use-top-workout-users.ts │ │ │ │ └── use-user-position.ts │ │ │ ├── lib/ │ │ │ │ └── utils.ts │ │ │ ├── models/ │ │ │ │ └── types.ts │ │ │ └── ui/ │ │ │ ├── leaderboard-item.tsx │ │ │ ├── leaderboard-page.tsx │ │ │ ├── leaderboard-skeleton.tsx │ │ │ └── user-leaderboard-position.tsx │ │ ├── page/ │ │ │ └── layout.tsx │ │ ├── premium/ │ │ │ └── ui/ │ │ │ ├── README.md │ │ │ ├── conversion-flow-notification.tsx │ │ │ ├── feature-comparison-table.tsx │ │ │ ├── index.ts │ │ │ ├── premium-upgrade-card.tsx │ │ │ ├── pricing-faq.tsx │ │ │ ├── pricing-hero-section.tsx │ │ │ └── pricing-testimonials.tsx │ │ ├── programs/ │ │ │ ├── actions/ │ │ │ │ ├── complete-program-session.action.ts │ │ │ │ ├── enroll-program.action.ts │ │ │ │ ├── get-program-by-slug.action.ts │ │ │ │ ├── get-program-progress-by-slug.action.ts │ │ │ │ ├── get-program-progress.action.ts │ │ │ │ ├── get-public-programs.action.ts │ │ │ │ ├── get-session-by-slug.action.ts │ │ │ │ ├── get-sitemap-data.action.ts │ │ │ │ └── start-program-session.action.ts │ │ │ ├── hooks/ │ │ │ │ └── use-program-share.ts │ │ │ ├── lib/ │ │ │ │ ├── program-metadata.ts │ │ │ │ ├── session-metadata.ts │ │ │ │ ├── suggested-sets-helpers.ts │ │ │ │ └── translations-mapper.ts │ │ │ └── ui/ │ │ │ ├── program-card.tsx │ │ │ ├── program-detail-page.tsx │ │ │ ├── program-progress.tsx │ │ │ ├── programs-page.tsx │ │ │ ├── session-access-guard.tsx │ │ │ ├── share-button.tsx │ │ │ └── welcome-modal.tsx │ │ ├── release-notes/ │ │ │ ├── hooks/ │ │ │ │ ├── index.ts │ │ │ │ └── use-changelog-notification.ts │ │ │ ├── index.ts │ │ │ ├── lib/ │ │ │ │ └── date-utils.ts │ │ │ ├── model/ │ │ │ │ ├── changelog-notification.local.ts │ │ │ │ └── notes.ts │ │ │ ├── types/ │ │ │ │ └── notification.ts │ │ │ └── ui/ │ │ │ ├── changelog-notification-badge.tsx │ │ │ ├── index.ts │ │ │ └── release-notes-dialog.tsx │ │ ├── statistics/ │ │ │ ├── components/ │ │ │ │ ├── ExerciseSelection.tsx │ │ │ │ ├── ExerciseStatisticsTab.tsx │ │ │ │ ├── ExercisesBrowser.tsx │ │ │ │ ├── OneRepMaxChart.tsx │ │ │ │ ├── StatisticsPreviewOverlay.tsx │ │ │ │ ├── TimeframeSelector.tsx │ │ │ │ ├── VolumeChart.tsx │ │ │ │ ├── WeightProgressionChart.tsx │ │ │ │ └── index.ts │ │ │ ├── hooks/ │ │ │ │ ├── use-chart-theme.ts │ │ │ │ └── use-exercise-statistics.ts │ │ │ └── types/ │ │ │ └── index.ts │ │ ├── theme/ │ │ │ ├── ThemeProviders.tsx │ │ │ ├── ThemeToggle.tsx │ │ │ └── ui/ │ │ │ └── ThemeSynchronizer.tsx │ │ ├── update-password/ │ │ │ ├── lib/ │ │ │ │ ├── hash.ts │ │ │ │ └── validate-password.ts │ │ │ ├── model/ │ │ │ │ ├── update-password.action.ts │ │ │ │ └── update-password.schema.ts │ │ │ └── ui/ │ │ │ └── password-form.tsx │ │ ├── user/ │ │ │ └── ui/ │ │ │ └── UserDropdown.tsx │ │ ├── workout-builder/ │ │ │ ├── actions/ │ │ │ │ ├── get-exercises-by-muscle.action.ts │ │ │ │ ├── get-exercises.action.ts │ │ │ │ ├── get-favorite-exercises.action.ts │ │ │ │ ├── pick-exercise.action.ts │ │ │ │ ├── shuffle-exercise.action.ts │ │ │ │ └── sync-favorite-exercises.action.ts │ │ │ ├── hooks/ │ │ │ │ ├── use-exercises.ts │ │ │ │ ├── use-favorite-exercises.service.ts │ │ │ │ ├── use-favorites-modal.ts │ │ │ │ ├── use-sync-favorite-exercises.ts │ │ │ │ ├── use-workout-session.ts │ │ │ │ └── use-workout-stepper.ts │ │ │ ├── index.ts │ │ │ ├── model/ │ │ │ │ ├── equipment-config.ts │ │ │ │ ├── favorite-exercises-synchronizer.tsx │ │ │ │ ├── favorite-exercises.local.ts │ │ │ │ └── workout-builder.store.ts │ │ │ ├── schema/ │ │ │ │ └── get-exercises.schema.ts │ │ │ ├── types/ │ │ │ │ └── index.ts │ │ │ └── ui/ │ │ │ ├── add-exercise-modal.tsx │ │ │ ├── equipment-selection.tsx │ │ │ ├── exercise-card.tsx │ │ │ ├── exercise-list-item.tsx │ │ │ ├── exercise-pick-modal.tsx │ │ │ ├── exercise-video-modal.tsx │ │ │ ├── exercises-selection.tsx │ │ │ ├── favorite-button.tsx │ │ │ ├── favorite-exercise-button.tsx │ │ │ ├── muscle-selection.tsx │ │ │ ├── muscles/ │ │ │ │ ├── abdominals-group.tsx │ │ │ │ ├── back-group.tsx │ │ │ │ ├── biceps-group.tsx │ │ │ │ ├── calves-group.tsx │ │ │ │ ├── chest-group.tsx │ │ │ │ ├── forearms-group.tsx │ │ │ │ ├── glutes-group.tsx │ │ │ │ ├── hamstrings-group.tsx │ │ │ │ ├── obliques-group.tsx │ │ │ │ ├── quadriceps-group.tsx │ │ │ │ ├── shoulders-group.tsx │ │ │ │ ├── traps-group.tsx │ │ │ │ └── triceps-group.tsx │ │ │ ├── muscles.module.css │ │ │ ├── quit-workout-dialog.tsx │ │ │ ├── stepper-header.tsx │ │ │ ├── workout-stepper-footer.tsx │ │ │ └── workout-stepper.tsx │ │ └── workout-session/ │ │ ├── actions/ │ │ │ ├── delete-workout-session.action.ts │ │ │ ├── get-workout-sessions.action.ts │ │ │ └── sync-workout-sessions.action.ts │ │ ├── hooks/ │ │ │ └── use-donation-modal.ts │ │ ├── lib/ │ │ │ └── workout-set-labels.ts │ │ ├── model/ │ │ │ ├── use-sync-workout-sessions.ts │ │ │ ├── use-workout-session.ts │ │ │ ├── use-workout-sessions.ts │ │ │ └── workout-session.store.ts │ │ ├── types/ │ │ │ └── workout-set.ts │ │ └── ui/ │ │ ├── donation-modal.tsx │ │ ├── workout-session-header.tsx │ │ ├── workout-session-heatmap.tsx │ │ ├── workout-session-list.tsx │ │ ├── workout-session-set.tsx │ │ ├── workout-session-sets.tsx │ │ ├── workout-session-timer.tsx │ │ └── workout-sessions-synchronizer.tsx │ ├── index.d.ts │ ├── shared/ │ │ ├── api/ │ │ │ ├── README.md │ │ │ ├── createHandler.ts │ │ │ ├── handlers.ts │ │ │ ├── mobile-auth.ts │ │ │ ├── mobile-cookie-utils.ts │ │ │ ├── mobile-safe-actions.ts │ │ │ └── safe-actions.ts │ │ ├── config/ │ │ │ ├── localized-metadata.ts │ │ │ └── site-config.ts │ │ ├── constants/ │ │ │ ├── cookies.ts │ │ │ ├── errors.ts │ │ │ ├── paths.ts │ │ │ ├── placeholders.ts │ │ │ ├── regexs.ts │ │ │ ├── screen.ts │ │ │ ├── social-platforms.tsx │ │ │ ├── statistics.ts │ │ │ ├── success.ts │ │ │ └── workout-set-types.ts │ │ ├── hooks/ │ │ │ ├── use-clipboard.ts │ │ │ ├── use-premium-plans.ts │ │ │ ├── useBoolean.ts │ │ │ ├── useIsMobile.ts │ │ │ └── useScrollToTop.ts │ │ ├── lib/ │ │ │ ├── access-control.ts │ │ │ ├── analytics/ │ │ │ │ ├── client.tsx │ │ │ │ ├── events.ts │ │ │ │ └── server.ts │ │ │ ├── attribute-value-translation.ts │ │ │ ├── date.ts │ │ │ ├── format.ts │ │ │ ├── guards.ts │ │ │ ├── i18n-mapper.ts │ │ │ ├── locale-slug.ts │ │ │ ├── location/ │ │ │ │ ├── eu-countries.ts │ │ │ │ └── location.ts │ │ │ ├── logger.ts │ │ │ ├── mail/ │ │ │ │ └── sendEmail.ts │ │ │ ├── mdx/ │ │ │ │ └── load-mdx.ts │ │ │ ├── network/ │ │ │ │ └── use-network-status.ts │ │ │ ├── premium/ │ │ │ │ ├── premium.manager.ts │ │ │ │ ├── premium.service.ts │ │ │ │ ├── providers/ │ │ │ │ │ ├── base-provider.ts │ │ │ │ │ └── stripe-provider.ts │ │ │ │ ├── use-pending-checkout.ts │ │ │ │ ├── use-premium-redirect.ts │ │ │ │ └── use-premium.ts │ │ │ ├── prisma.ts │ │ │ ├── revenuecat/ │ │ │ │ ├── index.ts │ │ │ │ ├── revenuecat.api.ts │ │ │ │ ├── revenuecat.config.ts │ │ │ │ └── revenuecat.mapping.ts │ │ │ ├── server-url.ts │ │ │ ├── slug.ts │ │ │ ├── structured-data.ts │ │ │ ├── utils.ts │ │ │ ├── version.ts │ │ │ ├── web-share.ts │ │ │ ├── weight-conversion.ts │ │ │ ├── workout-session/ │ │ │ │ ├── equipments.ts │ │ │ │ ├── types/ │ │ │ │ │ └── workout-session.ts │ │ │ │ ├── use-workout-session.service.ts │ │ │ │ ├── workout-session.api.ts │ │ │ │ └── workout-session.local.ts │ │ │ └── youtube.ts │ │ ├── schemas/ │ │ │ └── url.ts │ │ ├── styles/ │ │ │ ├── additional-styles/ │ │ │ │ ├── highlights.css │ │ │ │ └── utility-patterns.css │ │ │ └── globals.css │ │ └── types/ │ │ ├── i18n.types.ts │ │ ├── next.ts │ │ ├── premium.types.ts │ │ ├── statistics.types.ts │ │ └── storage.ts │ └── widgets/ │ ├── 404.tsx │ └── language-selector/ │ └── language-selector.tsx ├── tailwind.config.ts ├── tsconfig.json └── workout-cool.code-workspace