From 616ef56c43a046f67aaa7300fe9df3a253898793 Mon Sep 17 00:00:00 2001 From: CP-Tiwari Date: Sat, 7 Feb 2026 13:22:31 +0530 Subject: [PATCH] feat(plays): add BMR and TDEE calculator play Add a new play that calculates Basal Metabolic Rate and Total Daily Energy Expenditure using the Mifflin-St Jeor Equation. Features include metric and imperial unit support, five activity levels, weight loss and gain calorie targets, responsive design, and smooth result animations. Closes #1660 --- .../bmr-tdee-calculator/BmrTdeeCalculator.jsx | 263 ++++++++++++++++ src/plays/bmr-tdee-calculator/Readme.md | 41 +++ src/plays/bmr-tdee-calculator/cover.svg | 22 ++ src/plays/bmr-tdee-calculator/styles.css | 292 ++++++++++++++++++ src/plays/index.js | 115 +++++++ 5 files changed, 733 insertions(+) create mode 100644 src/plays/bmr-tdee-calculator/BmrTdeeCalculator.jsx create mode 100644 src/plays/bmr-tdee-calculator/Readme.md create mode 100644 src/plays/bmr-tdee-calculator/cover.svg create mode 100644 src/plays/bmr-tdee-calculator/styles.css create mode 100644 src/plays/index.js diff --git a/src/plays/bmr-tdee-calculator/BmrTdeeCalculator.jsx b/src/plays/bmr-tdee-calculator/BmrTdeeCalculator.jsx new file mode 100644 index 000000000..31a4ae1fa --- /dev/null +++ b/src/plays/bmr-tdee-calculator/BmrTdeeCalculator.jsx @@ -0,0 +1,263 @@ +import PlayHeader from 'common/playlists/PlayHeader'; +import { useState } from 'react'; +import './styles.css'; + +// WARNING: Do not change the entry component name +function BmrTdeeCalculator(props) { + const [gender, setGender] = useState('male'); + const [age, setAge] = useState(''); + const [weight, setWeight] = useState(''); + const [height, setHeight] = useState(''); + const [activityLevel, setActivityLevel] = useState('1.2'); + const [unit, setUnit] = useState('metric'); + const [result, setResult] = useState(null); + + const activityOptions = [ + { value: '1.2', label: 'Sedentary', desc: 'Little or no exercise' }, + { value: '1.375', label: 'Lightly Active', desc: 'Exercise 1-3 days/week' }, + { value: '1.55', label: 'Moderately Active', desc: 'Exercise 3-5 days/week' }, + { value: '1.725', label: 'Very Active', desc: 'Exercise 6-7 days/week' }, + { value: '1.9', label: 'Extra Active', desc: 'Very hard exercise or physical job' } + ]; + + const calculateBMR = () => { + const ageNum = parseFloat(age); + let weightKg = parseFloat(weight); + let heightCm = parseFloat(height); + + if (!ageNum || !weightKg || !heightCm) { + return; + } + + // Convert imperial to metric if needed + if (unit === 'imperial') { + weightKg = weightKg * 0.453592; // lbs to kg + heightCm = heightCm * 2.54; // inches to cm + } + + // Mifflin-St Jeor Equation + let bmr; + if (gender === 'male') { + bmr = 10 * weightKg + 6.25 * heightCm - 5 * ageNum + 5; + } else { + bmr = 10 * weightKg + 6.25 * heightCm - 5 * ageNum - 161; + } + + const activity = parseFloat(activityLevel); + const tdee = bmr * activity; + + setResult({ + bmr: Math.round(bmr), + tdee: Math.round(tdee), + deficit: Math.round(tdee - 500), + surplus: Math.round(tdee + 500) + }); + }; + + const handleReset = () => { + setGender('male'); + setAge(''); + setWeight(''); + setHeight(''); + setActivityLevel('1.2'); + setUnit('metric'); + setResult(null); + }; + + return ( +
+ +
+
+

BMR & TDEE Calculator

+

+ Calculate your Basal Metabolic Rate and Total Daily Energy Expenditure +

+ +
+ {/* Unit Toggle */} +
+ +
+ + +
+
+ + {/* Gender */} +
+ +
+ + +
+
+ + {/* Age */} +
+ + setAge(e.target.value)} + /> +
+ + {/* Weight */} +
+ + setWeight(e.target.value)} + /> +
+ + {/* Height */} +
+ + setHeight(e.target.value)} + /> +
+ + {/* Activity Level */} +
+ + +
+ + {/* Buttons */} +
+ + +
+
+ + {/* Results */} + {result && ( +
+

Your Results

+
+
+ BMR + {result.bmr} + cal/day + Calories at complete rest +
+
+ TDEE + {result.tdee} + cal/day + Maintenance calories +
+
+ Weight Loss + {result.deficit} + cal/day + TDEE − 500 cal deficit +
+
+ Weight Gain + {result.surplus} + cal/day + TDEE + 500 cal surplus +
+
+ +
+

What do these numbers mean?

+
    +
  • + BMR — The calories your body burns at complete rest just to keep + you alive (breathing, circulation, cell production). +
  • +
  • + TDEE — Your total calories burned per day including physical + activity. Eat this amount to maintain weight. +
  • +
  • + Weight Loss — A 500 cal/day deficit leads to ~0.45 kg (1 lb) + lost per week. +
  • +
  • + Weight Gain — A 500 cal/day surplus leads to ~0.45 kg (1 lb) + gained per week. +
  • +
+

+ * Calculated using the Mifflin-St Jeor Equation, considered the most accurate BMR + formula. +

+
+
+ )} +
+
+
+ ); +} + +export default BmrTdeeCalculator; diff --git a/src/plays/bmr-tdee-calculator/Readme.md b/src/plays/bmr-tdee-calculator/Readme.md new file mode 100644 index 000000000..ed08e5d1c --- /dev/null +++ b/src/plays/bmr-tdee-calculator/Readme.md @@ -0,0 +1,41 @@ +# BMR & TDEE Calculator + +A calculator to determine your Basal Metabolic Rate (BMR) and Total Daily Energy Expenditure (TDEE) using the Mifflin-St Jeor Equation. + +## Play Demographic + +- Language: js +- Level: Beginner + +## Creator Information + +- User: aniketmishra-0 +- GitHub Link: https://github.com/aniketmishra-0 +- Blog: +- Video: + +## Implementation Details + +This play implements a BMR & TDEE calculator with the following features: + +- **BMR Calculation** using the Mifflin-St Jeor Equation (most accurate modern formula) +- **TDEE Calculation** based on 5 activity levels +- **Metric & Imperial** unit support (kg/cm and lbs/inches) +- **Weight management guidance** showing calorie targets for loss/gain +- Clean, responsive UI with smooth result animations + +### Formulas Used + +**Mifflin-St Jeor Equation:** +- Male: BMR = 10 × weight(kg) + 6.25 × height(cm) − 5 × age − 5 +- Female: BMR = 10 × weight(kg) + 6.25 × height(cm) − 5 × age − 161 + +**TDEE = BMR × Activity Multiplier** + +## Consideration + +- Results are estimates and should not replace professional medical advice. + +## Resources + +- [Mifflin-St Jeor Equation](https://en.wikipedia.org/wiki/Basal_metabolic_rate) diff --git a/src/plays/bmr-tdee-calculator/cover.svg b/src/plays/bmr-tdee-calculator/cover.svg new file mode 100644 index 000000000..956ed81f9 --- /dev/null +++ b/src/plays/bmr-tdee-calculator/cover.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + BMR & TDEE + Calculator + Basal Metabolic Rate • Total Daily Energy Expenditure + + 🔥 + + + diff --git a/src/plays/bmr-tdee-calculator/styles.css b/src/plays/bmr-tdee-calculator/styles.css new file mode 100644 index 000000000..c69985b28 --- /dev/null +++ b/src/plays/bmr-tdee-calculator/styles.css @@ -0,0 +1,292 @@ +.bmr-tdee-container { + max-width: 680px; + margin: 0 auto; + padding: 2rem 1.5rem; + font-family: var(--ff-default, 'Inter', sans-serif); +} + +.bmr-tdee-title { + font-size: 1.75rem; + font-weight: 700; + text-align: center; + margin-bottom: 0.25rem; + color: var(--color-neutral-90, #1a1a2e); +} + +.bmr-tdee-subtitle { + text-align: center; + color: var(--color-neutral-50, #6b7280); + font-size: 0.95rem; + margin-bottom: 2rem; +} + +/* Form */ +.bmr-tdee-form { + background: var(--color-neutral-10, #ffffff); + border: 1px solid var(--color-neutral-30, #e5e7eb); + border-radius: 1rem; + padding: 1.5rem; + display: flex; + flex-direction: column; + gap: 1.25rem; +} + +.bmr-tdee-field { + display: flex; + flex-direction: column; + gap: 0.4rem; +} + +.bmr-tdee-label { + font-size: 0.85rem; + font-weight: 600; + color: var(--color-neutral-70, #374151); +} + +.bmr-tdee-input, +.bmr-tdee-select { + padding: 0.65rem 0.85rem; + border: 1px solid var(--color-neutral-30, #d1d5db); + border-radius: 0.5rem; + font-size: 0.95rem; + color: var(--color-neutral-90, #1f2937); + background: var(--color-neutral-10, #fff); + transition: border-color 0.2s ease, box-shadow 0.2s ease; + outline: none; +} + +.bmr-tdee-input:focus, +.bmr-tdee-select:focus { + border-color: var(--color-brand-primary, #00f2fe); + box-shadow: 0 0 0 3px rgba(0, 242, 254, 0.15); +} + +.bmr-tdee-input::placeholder { + color: var(--color-neutral-40, #9ca3af); +} + +/* Toggle group */ +.bmr-tdee-toggle-group { + display: flex; + gap: 0.5rem; +} + +.bmr-tdee-toggle-btn { + flex: 1; + padding: 0.55rem 0.75rem; + border: 1px solid var(--color-neutral-30, #d1d5db); + border-radius: 0.5rem; + background: var(--color-neutral-10, #fff); + color: var(--color-neutral-60, #6b7280); + font-size: 0.85rem; + font-weight: 500; + cursor: pointer; + transition: all 0.2s ease; +} + +.bmr-tdee-toggle-btn:hover { + border-color: var(--color-brand-primary, #00f2fe); +} + +.bmr-tdee-toggle-btn.active { + background: var(--color-brand-primary, #00f2fe); + border-color: var(--color-brand-primary, #00f2fe); + color: var(--color-neutral-90, #1a1a2e); + font-weight: 600; +} + +/* Buttons */ +.bmr-tdee-btn-group { + display: flex; + gap: 0.75rem; + margin-top: 0.5rem; +} + +.bmr-tdee-btn { + flex: 1; + padding: 0.7rem 1rem; + border: none; + border-radius: 0.5rem; + font-size: 0.95rem; + font-weight: 600; + cursor: pointer; + transition: all 0.2s ease; +} + +.bmr-tdee-btn-primary { + background: var(--color-brand-primary, #00f2fe); + color: var(--color-neutral-90, #1a1a2e); +} + +.bmr-tdee-btn-primary:hover { + opacity: 0.9; + transform: translateY(-1px); + box-shadow: 0 4px 12px rgba(0, 242, 254, 0.3); +} + +.bmr-tdee-btn-secondary { + background: transparent; + border: 1px solid var(--color-neutral-30, #d1d5db); + color: var(--color-neutral-60, #6b7280); +} + +.bmr-tdee-btn-secondary:hover { + border-color: var(--color-neutral-50, #9ca3af); + color: var(--color-neutral-80, #374151); +} + +/* Results */ +.bmr-tdee-results { + margin-top: 2rem; + animation: bmrFadeIn 0.4s ease; +} + +@keyframes bmrFadeIn { + from { + opacity: 0; + transform: translateY(12px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.bmr-tdee-results-title { + font-size: 1.25rem; + font-weight: 700; + text-align: center; + margin-bottom: 1.25rem; + color: var(--color-neutral-90, #1a1a2e); +} + +.bmr-tdee-results-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 1rem; +} + +.bmr-tdee-result-card { + display: flex; + flex-direction: column; + align-items: center; + padding: 1.25rem 1rem; + border-radius: 0.75rem; + border: 1px solid var(--color-neutral-30, #e5e7eb); + background: var(--color-neutral-10, #fff); + transition: transform 0.2s ease, box-shadow 0.2s ease; +} + +.bmr-tdee-result-card:hover { + transform: translateY(-2px); + box-shadow: 0 6px 20px rgba(0, 0, 0, 0.08); +} + +.bmr-tdee-card-bmr { + border-top: 3px solid #6366f1; +} + +.bmr-tdee-card-tdee { + border-top: 3px solid #00f2fe; +} + +.bmr-tdee-card-deficit { + border-top: 3px solid #f59e0b; +} + +.bmr-tdee-card-surplus { + border-top: 3px solid #10b981; +} + +.bmr-tdee-result-label { + font-size: 0.75rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.05em; + color: var(--color-neutral-50, #6b7280); + margin-bottom: 0.25rem; +} + +.bmr-tdee-result-value { + font-size: 2rem; + font-weight: 800; + color: var(--color-neutral-90, #1a1a2e); + line-height: 1.1; +} + +.bmr-tdee-result-unit { + font-size: 0.8rem; + color: var(--color-neutral-50, #9ca3af); + margin-bottom: 0.35rem; +} + +.bmr-tdee-result-desc { + font-size: 0.75rem; + color: var(--color-neutral-40, #9ca3af); + text-align: center; +} + +/* Info section */ +.bmr-tdee-info { + margin-top: 1.75rem; + background: var(--color-neutral-10, #f9fafb); + border: 1px solid var(--color-neutral-30, #e5e7eb); + border-radius: 0.75rem; + padding: 1.25rem 1.5rem; +} + +.bmr-tdee-info h4 { + font-size: 1rem; + font-weight: 700; + margin-bottom: 0.75rem; + color: var(--color-neutral-90, #1f2937); +} + +.bmr-tdee-info ul { + list-style: none; + padding: 0; + margin: 0; + display: flex; + flex-direction: column; + gap: 0.6rem; +} + +.bmr-tdee-info li { + font-size: 0.85rem; + color: var(--color-neutral-60, #4b5563); + line-height: 1.5; +} + +.bmr-tdee-info li strong { + color: var(--color-neutral-80, #1f2937); +} + +.bmr-tdee-info-note { + margin-top: 0.75rem; + font-size: 0.75rem; + color: var(--color-neutral-40, #9ca3af); + font-style: italic; +} + +/* Responsive */ +@media screen and (max-width: 520px) { + .bmr-tdee-container { + padding: 1rem; + } + + .bmr-tdee-title { + font-size: 1.4rem; + } + + .bmr-tdee-results-grid { + grid-template-columns: 1fr; + } + + .bmr-tdee-toggle-group { + flex-direction: column; + } + + .bmr-tdee-result-value { + font-size: 1.6rem; + } +} diff --git a/src/plays/index.js b/src/plays/index.js new file mode 100644 index 000000000..a96560267 --- /dev/null +++ b/src/plays/index.js @@ -0,0 +1,115 @@ +// Do not modify the content of this file + export { default as BmrTdeeCalculator } from 'plays/bmr-tdee-calculator/BmrTdeeCalculator'; + export { default as CodeEditor } from 'plays/code-editor/CodeEditor'; + export { default as CdTimerComp } from 'plays/date-time-counter/CdTimerComp'; + export { default as AnalogClock } from 'plays/analog-clock/AnalogClock'; + export { default as RegistrationForm } from 'plays/registration-form/RegistrationForm'; + export { default as NetlifyCardGame } from 'plays/memory-game/NetlifyCardGame'; + export { default as TicTacToeGame } from 'plays/tic-tac-toe-game/TicTacToeGame'; + export { default as QuoteGenerator } from 'plays/quote-generator/QuoteGenerator'; + export { default as FlipCardEffect } from 'plays/flip-card-effect/FlipCardEffect'; + export { default as DynamicRoutes } from 'plays/dynamic-routes/DynamicRoutes'; + export { default as BasicTree } from 'plays/org-tree/BasicTree'; + export { default as Calendar } from 'plays/calendar/Calendar'; + export { default as States } from 'plays/states/States'; + export { default as CurrentTimer } from 'plays/clock/CurrentTimer'; + export { default as MovieContainer } from 'plays/movies/MovieContainer'; + export { default as SocialCard } from 'plays/social-card/SocialCard'; + export { default as ReactTodoApp } from 'plays/react-todo-app/ReactTodoApp'; + export { default as CounterApp } from 'plays/counter/CounterApp'; + export { default as RandomMemeGenerator } from 'plays/random-meme-generator/RandomMemeGenerator'; + export { default as Keeper } from 'plays/keeper/Keeper'; + export { default as Quizeo } from 'plays/quizeo/Quizeo'; + export { default as NavBar } from 'plays/navbar/NavBar'; + export { default as ImageCarousel } from 'plays/image-carousel/ImageCarousel'; + export { default as SimpleLiveChat } from 'plays/simple-live-chat/SimpleLiveChat'; + export { default as WhyReact } from 'plays/why-react/WhyReact'; + export { default as ExpandingCards } from 'plays/expanding-cards/ExpandingCards'; + export { default as Imagegallery } from 'plays/image-gallery/Imagegallery'; + export { default as ReactGradients } from 'plays/react-gradients/ReactGradients'; + export { default as MarkdownEditor } from 'plays/markdown-editor/MarkdownEditor'; + export { default as StarRating } from 'plays/star-rating/StarRating'; + export { default as DevJokes } from 'plays/dev-jokes/DevJokes'; + export { default as CountriesStatics } from 'plays/countries-statics/CountriesStatics'; + export { default as ContextWithRealUsecases } from 'plays/context-with-real-usecases/ContextWithRealUsecases'; + export { default as QrCodeGenerator } from 'plays/qr-code-generator/QrCodeGenerator'; + export { default as GithubProfileSearch } from 'plays/git-hub-profile-search/GithubProfileSearch'; + export { default as PersonalProfileCard } from 'plays/personal-profile-card/PersonalProfileCard'; + export { default as InspirationalQuotes } from 'plays/inspirational-quotes/InspirationalQuotes'; + export { default as TypingSpeedTest } from 'plays/typing-speed-test/TypingSpeedTest'; + export { default as ImageCollector } from 'plays/image-collector/ImageCollector'; + export { default as TextAvatar } from 'plays/text-avatar/TextAvatar'; + export { default as NewsFeedApplication } from 'plays/news-feed-application/NewsFeedApplication'; + export { default as TwentyFourtyEight } from 'plays/2048/TwentyFourtyEight'; + export { default as Emojipedia } from 'plays/emojipedia/Emojipedia'; + export { default as DownloadFetchResponse } from 'plays/download-fetch-response/DownloadFetchResponse'; + export { default as Weather } from 'plays/weather/Weather'; + export { default as PokemonStats } from 'plays/pokemon-stats/PokemonStats'; + export { default as QuizApp } from 'plays/quiz-app/QuizApp'; + export { default as MultiselectComponent } from 'plays/multiselect-component/MultiselectComponent'; + export { default as PlayFairCipher } from 'plays/play-fair-cipher/PlayFairCipher'; + export { default as SierpinskiTriangle } from 'plays/sierpinski-triangle/SierpinskiTriangle'; + export { default as MotivateMe } from 'plays/motivate-me/MotivateMe'; + export { default as SavingsCalculator } from 'plays/savings-calculator/SavingsCalculator'; + export { default as ImageCompressor } from 'plays/image-compressor/ImageCompressor'; + export { default as ShoppingCart } from 'plays/shopping-cart/ShoppingCart'; + export { default as InfiniteScrolling } from 'plays/infinite-scrolling/InfiniteScrolling'; + export { default as PasswordGenerator } from 'plays/password-generator/PasswordGenerator'; + export { default as FunQuiz } from 'plays/fun-quiz/FunQuiz'; + export { default as ReactMultistepForm } from 'plays/react-multistep-form/ReactMultistepForm'; + export { default as WhyTypescript } from 'plays/why-typescript/WhyTypescript'; + export { default as SimpleSeoComponent } from 'plays/simple-seo-component/SimpleSeoComponent'; + export { default as TenziesGame } from 'plays/tenzies-game/TenziesGame'; + export { default as SmartTodoList } from 'plays/smart-todo-list/SmartTodoList'; + export { default as ExpensesTracker } from 'plays/expenses-tracker/ExpensesTracker'; + export { default as DadJokes } from 'plays/dad-jokes/DadJokes'; + export { default as ImageGalleryUsingUnsplashApi } from 'plays/image-gallery-using-unsplash-api/ImageGalleryUsingUnsplashApi'; + export { default as SimpleCalculator } from 'plays/simple-calculator/SimpleCalculator'; + export { default as TextAnalyzer } from 'plays/text-analyzer/TextAnalyzer'; + export { default as RandomQuoteCardGenerator } from 'plays/random-quote-card-generator/RandomQuoteCardGenerator'; + export { default as Pagination } from 'plays/pagination/Pagination'; + export { default as StickyNotes } from 'plays/sticky-notes/StickyNotes'; + export { default as GithubUserFinder } from 'plays/github-user-finder/GithubUserFinder'; + export { default as Notehack } from 'plays/notehack/Notehack'; + export { default as Pixy } from 'plays/pixy/Pixy'; + export { default as Tube2tunes } from 'plays/tube2tunes/Tube2tunes'; + export { default as Devblog } from 'plays/devblog/Devblog'; + export { default as CricketGame } from 'plays/cricket-game/CricketGame'; + export { default as ObjectDetector } from 'plays/object-detector/ObjectDetector'; + export { default as Photoshopapp } from 'plays/photoshopapp/Photoshopapp'; + export { default as RollTheDice } from 'plays/roll-the-dice/RollTheDice'; + export { default as DigitsDelight } from 'plays/digital-delight/DigitsDelight'; + export { default as BasicCalculator } from 'plays/basic-calculator/BasicCalculator'; + export { default as TravelAdvisor } from 'plays/travel-advisor/TravelAdvisor'; + export { default as ColorPalettesGenerator } from 'plays/color-palettes-generator/ColorPalettesGenerator'; + export { default as EmojiGame } from 'plays/emoji-game/EmojiGame'; + export { default as PlayDictionary } from 'plays/play-dictionary/PlayDictionary'; + export { default as SelfClickingButton } from 'plays/self-clicking-button/SelfClickingButton'; + export { default as SmartConverter } from 'plays/smart-converter/SmartConverter'; + export { default as Codenchill } from 'plays/codenchill/Codenchill'; + export { default as Wordle } from 'plays/wordle/Wordle'; + export { default as MultiplayerTicTacToe } from 'plays/multiplayer-tic-tac-toe/MultiplayerTicTacToe'; + export { default as InfiniteScrollWithDebouncingConcept } from 'plays/infinite-scroll-with-debouncing-concept/InfiniteScrollWithDebouncingConcept'; + export { default as VideoPreview } from 'plays/video-preview/VideoPreview'; + export { default as Custommemesgenerator } from 'plays/custommemesgenerator/Custommemesgenerator'; + export { default as ReactTransitions } from 'plays/react-transitions/ReactTransitions'; + export { default as CalculatorByTea } from 'plays/calculator-by-tea/CalculatorByTea'; + export { default as GitHubUserSearch } from 'plays/github-user-search/GitHubUserSearch'; + export { default as UrlShortner } from 'plays/url-shortner/UrlShortner'; + export { default as TipCalculator } from 'plays/tip-calculator/TipCalculator'; + export { default as HangmanGame } from 'plays/hangman-game/HangmanGame'; + export { default as AirbnbExperiencesClone } from 'plays/airbnb-experiences-clone/AirbnbExperiencesClone'; + export { default as SchulteTables } from 'plays/schulte-tables/SchulteTables'; + export { default as DiceSimulator } from 'plays/dice-simulator/DiceSimulator'; + export { default as Accordian } from 'plays/accordian/Accordian'; + export { default as LanguageTranslater } from 'plays/language-translater/LanguageTranslater'; + export { default as Currencyconverter } from 'plays/currencyconverter/Currencyconverter'; + export { default as Zoomlogin } from 'plays/zoomlogin/Zoomlogin'; + export { default as Cheesylines } from 'plays/cheesylines/Cheesylines'; + export { default as RandomAvatar } from 'plays/random-avatar/RandomAvatar'; + export { default as BodymassindexCalculator } from 'plays/bodymassindex-calculator/BodymassindexCalculator'; + export { default as DailyJournal } from 'plays/daily-journa/DailyJournal'; + export { default as Dictionary } from 'plays/dictionary/Dictionary'; + export { default as Steps } from 'plays/steps/Steps'; + export { default as TextToSpeech } from 'plays/text-to-speech/TextToSpeech'; + export { default as SimpleTodoApp } from 'plays/simple-todo-app/SimpleTodoApp'; \ No newline at end of file