gitextract_1gd43b_x/ ├── .eslintignore ├── .gitignore ├── README.md ├── package.json ├── pnpm-workspace.yaml ├── projects/ │ ├── 01-twitter-follow-card/ │ │ ├── .gitignore │ │ ├── index.html │ │ ├── package.json │ │ ├── src/ │ │ │ ├── App.css │ │ │ ├── App.jsx │ │ │ ├── TwitterFollowCard.jsx │ │ │ ├── index.css │ │ │ └── main.jsx │ │ └── vite.config.js │ ├── 02-tic-tac-toe/ │ │ ├── .gitignore │ │ ├── index.html │ │ ├── package.json │ │ ├── src/ │ │ │ ├── App.css │ │ │ ├── App.jsx │ │ │ ├── components/ │ │ │ │ ├── Square.jsx │ │ │ │ └── WinnerModal.jsx │ │ │ ├── constants.js │ │ │ ├── index.css │ │ │ ├── logic/ │ │ │ │ ├── board.js │ │ │ │ └── storage/ │ │ │ │ └── index.js │ │ │ └── main.jsx │ │ └── vite.config.js │ ├── 03-mouse-follower/ │ │ ├── .gitignore │ │ ├── index.html │ │ ├── package.json │ │ ├── src/ │ │ │ ├── App.css │ │ │ ├── App.jsx │ │ │ ├── index.css │ │ │ └── main.jsx │ │ └── vite.config.js │ ├── 04-react-prueba-tecnica/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── counter.js │ │ ├── index.html │ │ ├── main.jsx │ │ ├── package.json │ │ ├── playwright.config.cjs │ │ ├── src/ │ │ │ ├── App.css │ │ │ ├── App.jsx │ │ │ ├── Components/ │ │ │ │ └── Otro.jsx │ │ │ ├── hooks/ │ │ │ │ ├── useCatFact.js │ │ │ │ └── useCatImage.js │ │ │ └── services/ │ │ │ └── facts.js │ │ ├── style.css │ │ ├── tests/ │ │ │ └── example.spec.js │ │ └── vite.config.js │ ├── 05-react-buscador-peliculas/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── index.html │ │ ├── package.json │ │ ├── src/ │ │ │ ├── App.css │ │ │ ├── App.jsx │ │ │ ├── components/ │ │ │ │ └── Movies.jsx │ │ │ ├── hooks/ │ │ │ │ └── useMovies.js │ │ │ ├── index.css │ │ │ ├── main.jsx │ │ │ ├── mocks/ │ │ │ │ ├── no-results.json │ │ │ │ └── with-results.json │ │ │ └── services/ │ │ │ └── movies.js │ │ └── vite.config.js │ ├── 06-shopping-cart/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── index.html │ │ ├── package.json │ │ ├── src/ │ │ │ ├── App.jsx │ │ │ ├── components/ │ │ │ │ ├── Cart.css │ │ │ │ ├── Cart.jsx │ │ │ │ ├── Filters.css │ │ │ │ ├── Filters.jsx │ │ │ │ ├── Footer.css │ │ │ │ ├── Footer.jsx │ │ │ │ ├── Header.jsx │ │ │ │ ├── Icons.jsx │ │ │ │ ├── Products.css │ │ │ │ └── Products.jsx │ │ │ ├── config.js │ │ │ ├── context/ │ │ │ │ ├── cart.jsx │ │ │ │ └── filters.jsx │ │ │ ├── hooks/ │ │ │ │ ├── useCart.js │ │ │ │ └── useFilters.js │ │ │ ├── index.css │ │ │ ├── main.jsx │ │ │ ├── mocks/ │ │ │ │ └── products.json │ │ │ └── reducers/ │ │ │ └── cart.js │ │ └── vite.config.js │ ├── 07-midu-router/ │ │ ├── .npmignore │ │ ├── .swcrc │ │ ├── README.md │ │ ├── index.html │ │ ├── lib/ │ │ │ ├── Link.js │ │ │ ├── Route.js │ │ │ ├── Router.js │ │ │ └── index.js │ │ ├── package.json │ │ ├── src/ │ │ │ ├── App.css │ │ │ ├── App.jsx │ │ │ ├── Router.test.jsx │ │ │ ├── components/ │ │ │ │ ├── Link.jsx │ │ │ │ ├── Route.jsx │ │ │ │ └── Router.jsx │ │ │ ├── index.css │ │ │ ├── index.jsx │ │ │ ├── main.jsx │ │ │ ├── pages/ │ │ │ │ ├── 404.jsx │ │ │ │ ├── About.jsx │ │ │ │ ├── Home.jsx │ │ │ │ └── Search.jsx │ │ │ └── utils/ │ │ │ ├── consts.js │ │ │ └── getCurrentPath.js │ │ └── vite.config.js │ ├── 08-todo-app-typescript/ │ │ ├── README.md │ │ ├── index.html │ │ ├── package.json │ │ ├── src/ │ │ │ ├── App.tsx │ │ │ ├── components/ │ │ │ │ ├── Copyright.css │ │ │ │ ├── Copyright.tsx │ │ │ │ ├── CreateTodo.tsx │ │ │ │ ├── Filters.tsx │ │ │ │ ├── Footer.tsx │ │ │ │ ├── Header.tsx │ │ │ │ ├── Todo.tsx │ │ │ │ └── Todos.tsx │ │ │ ├── consts.ts │ │ │ ├── hooks/ │ │ │ │ ├── useTodoFirst.ts │ │ │ │ └── useTodos.ts │ │ │ ├── index.css │ │ │ ├── main.tsx │ │ │ ├── mocks/ │ │ │ │ └── todos.ts │ │ │ ├── services/ │ │ │ │ └── todos.ts │ │ │ ├── types.d.ts │ │ │ └── vite-env.d.ts │ │ ├── tsconfig.json │ │ ├── tsconfig.node.json │ │ └── vite.config.ts │ ├── 09-google-translate-clone/ │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── index.html │ │ ├── package.json │ │ ├── src/ │ │ │ ├── App.css │ │ │ ├── App.test.tsx │ │ │ ├── App.tsx │ │ │ ├── components/ │ │ │ │ ├── Icons.tsx │ │ │ │ ├── LanguageSelector.tsx │ │ │ │ └── TextArea.tsx │ │ │ ├── constants.ts │ │ │ ├── hooks/ │ │ │ │ ├── useDebounce.ts │ │ │ │ └── useStore.ts │ │ │ ├── index.css │ │ │ ├── main.tsx │ │ │ ├── services/ │ │ │ │ └── translate.ts │ │ │ ├── types.d.ts │ │ │ └── vite-env.d.ts │ │ ├── tsconfig.json │ │ ├── tsconfig.node.json │ │ └── vite.config.ts │ ├── 10-crud-redux/ │ │ ├── .gitignore │ │ ├── index.html │ │ ├── package.json │ │ ├── postcss.config.js │ │ ├── rome.json │ │ ├── src/ │ │ │ ├── App.css │ │ │ ├── App.tsx │ │ │ ├── components/ │ │ │ │ ├── CreateNewUser.tsx │ │ │ │ └── ListOfUsers.tsx │ │ │ ├── hooks/ │ │ │ │ ├── store.ts │ │ │ │ └── useUserActions.ts │ │ │ ├── index.css │ │ │ ├── main.tsx │ │ │ ├── store/ │ │ │ │ ├── index.ts │ │ │ │ └── users/ │ │ │ │ └── slice.ts │ │ │ └── vite-env.d.ts │ │ ├── tailwind.config.js │ │ ├── tsconfig.json │ │ ├── tsconfig.node.json │ │ └── vite.config.ts │ ├── 11-typescript-prueba-tecnica/ │ │ ├── README.md │ │ ├── index.html │ │ ├── package.json │ │ ├── src/ │ │ │ ├── App.css │ │ │ ├── App.tsx │ │ │ ├── components/ │ │ │ │ └── UsersList.tsx │ │ │ ├── index.css │ │ │ ├── main.tsx │ │ │ ├── types.d.ts │ │ │ └── vite-env.d.ts │ │ ├── tsconfig.json │ │ ├── tsconfig.node.json │ │ └── vite.config.ts │ ├── 11b-typescript-prueba-tecnica-with-react-query/ │ │ ├── README.md │ │ ├── index.html │ │ ├── package.json │ │ ├── src/ │ │ │ ├── App.css │ │ │ ├── App.tsx │ │ │ ├── components/ │ │ │ │ ├── Results.tsx │ │ │ │ └── UsersList.tsx │ │ │ ├── hooks/ │ │ │ │ └── useUsers.ts │ │ │ ├── index.css │ │ │ ├── main.tsx │ │ │ ├── services/ │ │ │ │ └── users.ts │ │ │ ├── types.d.ts │ │ │ └── vite-env.d.ts │ │ ├── tsconfig.json │ │ ├── tsconfig.node.json │ │ └── vite.config.ts │ ├── 12-comments-react-query/ │ │ ├── index.html │ │ ├── package.json │ │ ├── postcss.config.js │ │ ├── src/ │ │ │ ├── App.css │ │ │ ├── App.tsx │ │ │ ├── components/ │ │ │ │ ├── Form.tsx │ │ │ │ └── Results.tsx │ │ │ ├── index.css │ │ │ ├── main.tsx │ │ │ ├── service/ │ │ │ │ └── comments.ts │ │ │ └── vite-env.d.ts │ │ ├── tailwind.config.js │ │ ├── tsconfig.json │ │ ├── tsconfig.node.json │ │ └── vite.config.ts │ ├── 13-javascript-quiz-con-zustand/ │ │ ├── .eslintrc.cjs │ │ ├── index.html │ │ ├── package.json │ │ ├── public/ │ │ │ └── data.json │ │ ├── src/ │ │ │ ├── App.css │ │ │ ├── App.tsx │ │ │ ├── Footer.tsx │ │ │ ├── Game.tsx │ │ │ ├── JavaScriptLogo.tsx │ │ │ ├── Results.tsx │ │ │ ├── Start.tsx │ │ │ ├── hooks/ │ │ │ │ └── useQuestionsData.ts │ │ │ ├── index.css │ │ │ ├── main.tsx │ │ │ ├── services/ │ │ │ │ └── questions.ts │ │ │ ├── store/ │ │ │ │ └── questions.ts │ │ │ ├── types.d.ts │ │ │ └── vite-env.d.ts │ │ ├── tsconfig.json │ │ ├── tsconfig.node.json │ │ └── vite.config.ts │ └── 14-hacker-news-prueba-tecnica/ │ ├── .gitignore │ ├── README.md │ ├── index.html │ ├── package.json │ ├── src/ │ │ ├── App.css │ │ ├── App.tsx │ │ ├── components/ │ │ │ ├── CommentLoader.tsx │ │ │ ├── Header.css.ts │ │ │ ├── Header.tsx │ │ │ ├── ListOfComments.tsx │ │ │ ├── Story.css.ts │ │ │ ├── Story.tsx │ │ │ └── StoryLoader.tsx │ │ ├── index.css │ │ ├── main.tsx │ │ ├── pages/ │ │ │ ├── Detail.tsx │ │ │ └── TopStories.tsx │ │ ├── services/ │ │ │ └── hacker-news.ts │ │ ├── utils/ │ │ │ └── getRelativeTime.ts │ │ └── vite-env.d.ts │ ├── tsconfig.json │ ├── tsconfig.node.json │ └── vite.config.ts └── tsconfig.json