Merge branch 'main' into forms-control-value-accessor

This commit is contained in:
thomas
2023-12-16 11:23:00 +01:00
19 changed files with 762 additions and 59 deletions

View File

@@ -3,16 +3,30 @@
"projectOwner": "tomalaforge", "projectOwner": "tomalaforge",
"repoType": "github", "repoType": "github",
"repoHost": "https://github.com", "repoHost": "https://github.com",
"files": [ "files": ["README.md"],
"README.md"
],
"imageSize": 100, "imageSize": 100,
"commit": true, "commit": true,
"commitConvention": "angular", "commitConvention": "angular",
"types": { "types": {
"challenge": { "challenge": {
"symbol": "🧩", "symbol": "🧩",
"description": "Created a challenge" "description": "Create a challenge"
},
"translation-es": {
"symbol": "🇪🇸",
"description": "Translate in Spanish"
},
"translation-fr": {
"symbol": "🇫🇷",
"description": "Translate in French"
},
"translation-pt": {
"symbol": "🇵🇹",
"description": "Translate in Portuguese"
},
"translation-pt-BR": {
"symbol": "🇧🇷",
"description": "Translate in Brazilian Portuguese"
} }
}, },
"contributors": [ "contributors": [
@@ -27,7 +41,8 @@
"doc", "doc",
"content", "content",
"ideas", "ideas",
"design" "design",
"translation-fr"
] ]
}, },
{ {
@@ -35,104 +50,84 @@
"name": "Alan Dragicevich", "name": "Alan Dragicevich",
"avatar_url": "https://avatars.githubusercontent.com/u/31838230?v=4", "avatar_url": "https://avatars.githubusercontent.com/u/31838230?v=4",
"profile": "https://github.com/alan-bio", "profile": "https://github.com/alan-bio",
"contributions": [ "contributions": ["doc"]
"doc"
]
}, },
{ {
"login": "edimitchel", "login": "edimitchel",
"name": "Michel EDIGHOFFER", "name": "Michel EDIGHOFFER",
"avatar_url": "https://avatars.githubusercontent.com/u/2922851?v=4", "avatar_url": "https://avatars.githubusercontent.com/u/2922851?v=4",
"profile": "https://github.com/edimitchel", "profile": "https://github.com/edimitchel",
"contributions": [ "contributions": ["doc"]
"doc"
]
}, },
{ {
"login": "gsgonzalez88", "login": "gsgonzalez88",
"name": "Gerardo Sebastian Gonzalez", "name": "Gerardo Sebastian Gonzalez",
"avatar_url": "https://avatars.githubusercontent.com/u/39884678?v=4", "avatar_url": "https://avatars.githubusercontent.com/u/39884678?v=4",
"profile": "https://github.com/gsgonzalez88", "profile": "https://github.com/gsgonzalez88",
"contributions": [ "contributions": ["doc"]
"doc"
]
}, },
{ {
"login": "marryday", "login": "marryday",
"name": "Evseev Yuriy", "name": "Evseev Yuriy",
"avatar_url": "https://avatars.githubusercontent.com/u/57489315?v=4", "avatar_url": "https://avatars.githubusercontent.com/u/57489315?v=4",
"profile": "https://github.com/marryday", "profile": "https://github.com/marryday",
"contributions": [ "contributions": ["bug"]
"bug"
]
}, },
{ {
"login": "tomer953", "login": "tomer953",
"name": "Tomer953", "name": "Tomer953",
"avatar_url": "https://avatars.githubusercontent.com/u/1807493?v=4", "avatar_url": "https://avatars.githubusercontent.com/u/1807493?v=4",
"profile": "https://github.com/tomer953", "profile": "https://github.com/tomer953",
"contributions": [ "contributions": ["bug", "doc", "code"]
"bug",
"doc",
"code"
]
}, },
{ {
"login": "jdegand", "login": "jdegand",
"name": "J. Degand", "name": "J. Degand",
"avatar_url": "https://avatars.githubusercontent.com/u/70610011?v=4", "avatar_url": "https://avatars.githubusercontent.com/u/70610011?v=4",
"profile": "https://github.com/jdegand", "profile": "https://github.com/jdegand",
"contributions": [ "contributions": ["doc"]
"doc"
]
}, },
{ {
"login": "DeveshChau", "login": "DeveshChau",
"name": "Devesh Chaudhari", "name": "Devesh Chaudhari",
"avatar_url": "https://avatars.githubusercontent.com/u/9509673?v=4", "avatar_url": "https://avatars.githubusercontent.com/u/9509673?v=4",
"profile": "https://github.com/DeveshChau", "profile": "https://github.com/DeveshChau",
"contributions": [ "contributions": ["code", "bug", "challenge"]
"code",
"bug",
"challenge"
]
}, },
{ {
"login": "dmmishchenko", "login": "dmmishchenko",
"name": "Dmitriy Mishchenko", "name": "Dmitriy Mishchenko",
"avatar_url": "https://avatars.githubusercontent.com/u/51910160?v=4", "avatar_url": "https://avatars.githubusercontent.com/u/51910160?v=4",
"profile": "https://github.com/dmmishchenko", "profile": "https://github.com/dmmishchenko",
"contributions": [ "contributions": ["doc"]
"doc"
]
}, },
{ {
"login": "Sagardevkota", "login": "Sagardevkota",
"name": "Sagar Devkota", "name": "Sagar Devkota",
"avatar_url": "https://avatars.githubusercontent.com/u/30800393?v=4", "avatar_url": "https://avatars.githubusercontent.com/u/30800393?v=4",
"profile": "http://www.sagardev.com.np", "profile": "http://www.sagardev.com.np",
"contributions": [ "contributions": ["doc", "code"]
"doc",
"code"
]
}, },
{ {
"login": "nelsongutidev", "login": "nelsongutidev",
"name": "Nelson Gutierrez", "name": "Nelson Gutierrez",
"avatar_url": "https://avatars.githubusercontent.com/u/62297014?v=4", "avatar_url": "https://avatars.githubusercontent.com/u/62297014?v=4",
"profile": "https://nelsonguti.dev/", "profile": "https://nelsonguti.dev/",
"contributions": [ "contributions": ["translation-es"]
"doc"
]
}, },
{ {
"login": "ho-ssain", "login": "ho-ssain",
"name": "Hossain K. M.", "name": "Hossain K. M.",
"avatar_url": "https://avatars.githubusercontent.com/u/61125174?v=4", "avatar_url": "https://avatars.githubusercontent.com/u/61125174?v=4",
"profile": "https://github.com/ho-ssain", "profile": "https://github.com/ho-ssain",
"contributions": [ "contributions": ["doc"]
"doc" },
] {
"login": "kabrunko-dev",
"name": "Diogo Nishikawa",
"avatar_url": "https://avatars.githubusercontent.com/u/142346548?v=4",
"profile": "https://github.com/kabrunko-dev/",
"contributions": ["translation-pt-BR"]
} }
], ],
"contributorsPerLine": 7, "contributorsPerLine": 7,

View File

@@ -34,7 +34,7 @@ Check [all 41 challenges](https://angular-challenges.vercel.app/)
<table> <table>
<tbody> <tbody>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://thomaslaforge.dev/home"><img src="https://avatars.githubusercontent.com/u/30832608?v=4?s=100" width="100px;" alt="Laforge Thomas"/><br /><sub><b>Laforge Thomas</b></sub></a><br /><a href="#challenge-tomalaforge" title="Created a challenge">🧩</a> <a href="https://github.com/tomalaforge/angular-challenges/commits?author=tomalaforge" title="Code">💻</a> <a href="https://github.com/tomalaforge/angular-challenges/commits?author=tomalaforge" title="Documentation">📖</a> <a href="#content-tomalaforge" title="Content">🖋</a> <a href="#ideas-tomalaforge" title="Ideas, Planning, & Feedback">🤔</a> <a href="#design-tomalaforge" title="Design">🎨</a></td> <td align="center" valign="top" width="14.28%"><a href="https://thomaslaforge.dev/home"><img src="https://avatars.githubusercontent.com/u/30832608?v=4?s=100" width="100px;" alt="Laforge Thomas"/><br /><sub><b>Laforge Thomas</b></sub></a><br /><a href="#challenge-tomalaforge" title="Create a challenge">🧩</a> <a href="https://github.com/tomalaforge/angular-challenges/commits?author=tomalaforge" title="Code">💻</a> <a href="https://github.com/tomalaforge/angular-challenges/commits?author=tomalaforge" title="Documentation">📖</a> <a href="#content-tomalaforge" title="Content">🖋</a> <a href="#ideas-tomalaforge" title="Ideas, Planning, & Feedback">🤔</a> <a href="#design-tomalaforge" title="Design">🎨</a> <a href="#translation-fr-tomalaforge" title="Translate in French">🇫🇷</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/alan-bio"><img src="https://avatars.githubusercontent.com/u/31838230?v=4?s=100" width="100px;" alt="Alan Dragicevich"/><br /><sub><b>Alan Dragicevich</b></sub></a><br /><a href="https://github.com/tomalaforge/angular-challenges/commits?author=alan-bio" title="Documentation">📖</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/alan-bio"><img src="https://avatars.githubusercontent.com/u/31838230?v=4?s=100" width="100px;" alt="Alan Dragicevich"/><br /><sub><b>Alan Dragicevich</b></sub></a><br /><a href="https://github.com/tomalaforge/angular-challenges/commits?author=alan-bio" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/edimitchel"><img src="https://avatars.githubusercontent.com/u/2922851?v=4?s=100" width="100px;" alt="Michel EDIGHOFFER"/><br /><sub><b>Michel EDIGHOFFER</b></sub></a><br /><a href="https://github.com/tomalaforge/angular-challenges/commits?author=edimitchel" title="Documentation">📖</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/edimitchel"><img src="https://avatars.githubusercontent.com/u/2922851?v=4?s=100" width="100px;" alt="Michel EDIGHOFFER"/><br /><sub><b>Michel EDIGHOFFER</b></sub></a><br /><a href="https://github.com/tomalaforge/angular-challenges/commits?author=edimitchel" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/gsgonzalez88"><img src="https://avatars.githubusercontent.com/u/39884678?v=4?s=100" width="100px;" alt="Gerardo Sebastian Gonzalez"/><br /><sub><b>Gerardo Sebastian Gonzalez</b></sub></a><br /><a href="https://github.com/tomalaforge/angular-challenges/commits?author=gsgonzalez88" title="Documentation">📖</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/gsgonzalez88"><img src="https://avatars.githubusercontent.com/u/39884678?v=4?s=100" width="100px;" alt="Gerardo Sebastian Gonzalez"/><br /><sub><b>Gerardo Sebastian Gonzalez</b></sub></a><br /><a href="https://github.com/tomalaforge/angular-challenges/commits?author=gsgonzalez88" title="Documentation">📖</a></td>
@@ -43,11 +43,12 @@ Check [all 41 challenges](https://angular-challenges.vercel.app/)
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jdegand"><img src="https://avatars.githubusercontent.com/u/70610011?v=4?s=100" width="100px;" alt="J. Degand"/><br /><sub><b>J. Degand</b></sub></a><br /><a href="https://github.com/tomalaforge/angular-challenges/commits?author=jdegand" title="Documentation">📖</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/jdegand"><img src="https://avatars.githubusercontent.com/u/70610011?v=4?s=100" width="100px;" alt="J. Degand"/><br /><sub><b>J. Degand</b></sub></a><br /><a href="https://github.com/tomalaforge/angular-challenges/commits?author=jdegand" title="Documentation">📖</a></td>
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/DeveshChau"><img src="https://avatars.githubusercontent.com/u/9509673?v=4?s=100" width="100px;" alt="Devesh Chaudhari"/><br /><sub><b>Devesh Chaudhari</b></sub></a><br /><a href="https://github.com/tomalaforge/angular-challenges/commits?author=DeveshChau" title="Code">💻</a> <a href="https://github.com/tomalaforge/angular-challenges/issues?q=author%3ADeveshChau" title="Bug reports">🐛</a> <a href="#challenge-DeveshChau" title="Created a challenge">🧩</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/DeveshChau"><img src="https://avatars.githubusercontent.com/u/9509673?v=4?s=100" width="100px;" alt="Devesh Chaudhari"/><br /><sub><b>Devesh Chaudhari</b></sub></a><br /><a href="https://github.com/tomalaforge/angular-challenges/commits?author=DeveshChau" title="Code">💻</a> <a href="https://github.com/tomalaforge/angular-challenges/issues?q=author%3ADeveshChau" title="Bug reports">🐛</a> <a href="#challenge-DeveshChau" title="Create a challenge">🧩</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/dmmishchenko"><img src="https://avatars.githubusercontent.com/u/51910160?v=4?s=100" width="100px;" alt="Dmitriy Mishchenko"/><br /><sub><b>Dmitriy Mishchenko</b></sub></a><br /><a href="https://github.com/tomalaforge/angular-challenges/commits?author=dmmishchenko" title="Documentation">📖</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/dmmishchenko"><img src="https://avatars.githubusercontent.com/u/51910160?v=4?s=100" width="100px;" alt="Dmitriy Mishchenko"/><br /><sub><b>Dmitriy Mishchenko</b></sub></a><br /><a href="https://github.com/tomalaforge/angular-challenges/commits?author=dmmishchenko" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://www.sagardev.com.np"><img src="https://avatars.githubusercontent.com/u/30800393?v=4?s=100" width="100px;" alt="Sagar Devkota"/><br /><sub><b>Sagar Devkota</b></sub></a><br /><a href="https://github.com/tomalaforge/angular-challenges/commits?author=Sagardevkota" title="Documentation">📖</a> <a href="https://github.com/tomalaforge/angular-challenges/commits?author=Sagardevkota" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="http://www.sagardev.com.np"><img src="https://avatars.githubusercontent.com/u/30800393?v=4?s=100" width="100px;" alt="Sagar Devkota"/><br /><sub><b>Sagar Devkota</b></sub></a><br /><a href="https://github.com/tomalaforge/angular-challenges/commits?author=Sagardevkota" title="Documentation">📖</a> <a href="https://github.com/tomalaforge/angular-challenges/commits?author=Sagardevkota" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://nelsonguti.dev/"><img src="https://avatars.githubusercontent.com/u/62297014?v=4?s=100" width="100px;" alt="Nelson Gutierrez"/><br /><sub><b>Nelson Gutierrez</b></sub></a><br /><a href="https://github.com/tomalaforge/angular-challenges/commits?author=nelsongutidev" title="Documentation">📖</a></td> <td align="center" valign="top" width="14.28%"><a href="https://nelsonguti.dev/"><img src="https://avatars.githubusercontent.com/u/62297014?v=4?s=100" width="100px;" alt="Nelson Gutierrez"/><br /><sub><b>Nelson Gutierrez</b></sub></a><br /><a href="#translation-es-nelsongutidev" title="Translate in Spanish">🇪🇸</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ho-ssain"><img src="https://avatars.githubusercontent.com/u/61125174?v=4?s=100" width="100px;" alt="Hossain K. M."/><br /><sub><b>Hossain K. M.</b></sub></a><br /><a href="https://github.com/tomalaforge/angular-challenges/commits?author=ho-ssain" title="Documentation">📖</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/ho-ssain"><img src="https://avatars.githubusercontent.com/u/61125174?v=4?s=100" width="100px;" alt="Hossain K. M."/><br /><sub><b>Hossain K. M.</b></sub></a><br /><a href="https://github.com/tomalaforge/angular-challenges/commits?author=ho-ssain" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kabrunko-dev/"><img src="https://avatars.githubusercontent.com/u/142346548?v=4?s=100" width="100px;" alt="Diogo Nishikawa"/><br /><sub><b>Diogo Nishikawa</b></sub></a><br /><a href="#translation-pt-BR-kabrunko-dev" title="Translate in Brazilian Portuguese">🇧🇷</a></td>
</tr> </tr>
</tbody> </tbody>
<tfoot> <tfoot>

View File

@@ -11,11 +11,11 @@ import { UnknownPersonComponent } from './unknown-person/unknown-person.componen
template: ` template: `
<unknown-person [step]="loadingPercentage()" class="relative grow" /> <unknown-person [step]="loadingPercentage()" class="relative grow" />
<button <button
class="border border-white rounded-md px-4 py-2 text-white w-fit self-center text-2xl my-3" class="my-3 w-fit self-center rounded-md border border-white px-4 py-2 text-2xl text-white"
(click)="discover()"> (click)="discover()">
Discover Discover
</button> </button>
<div class="text-white p-1">Progress: {{ loadingPercentage() }}%</div> <div class="p-1 text-white">Progress: {{ loadingPercentage() }}%</div>
`, `,
host: { host: {
class: `flex flex-col h-screen w-screen bg-[#1f75c0]`, class: `flex flex-col h-screen w-screen bg-[#1f75c0]`,

View File

@@ -6,14 +6,14 @@ export class HeavyCalculationService {
private loadingLength = signal(0); private loadingLength = signal(0);
loadingPercentage = computed( loadingPercentage = computed(
() => (this.loadingLength() * 100) / this.finalLength () => (this.loadingLength() * 100) / this.finalLength,
); );
startLoading() { startLoading() {
this.randomHeavyCalculalationFunction(); this.randomHeavyCalculationFunction();
} }
private randomHeavyCalculalationFunction() { private randomHeavyCalculationFunction() {
for (let num = 2; num <= 10000000; num++) { for (let num = 2; num <= 10000000; num++) {
let randomFlag = true; let randomFlag = true;
for (let i = 2; i <= Math.sqrt(num); i++) { for (let i = 2; i <= Math.sqrt(num); i++) {

View File

@@ -4,16 +4,16 @@ import { Component, Input } from '@angular/core';
standalone: true, standalone: true,
template: ` template: `
<div <div
class="bg-black absolute inset-0 z-10 text-white text-center text-3xl" class="absolute inset-0 z-10 bg-black text-center text-3xl text-white"
[style.height.%]="100 - step"> [style.height.%]="100 - step">
@if (step !== 100) { @if (step !== 100) {
<div <div
class="relative top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2"> class="relative left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2">
Who is here? Who is here?
</div> </div>
} }
</div> </div>
<div class="text-center text-white text-4xl">Happy Christmas !!!</div> <div class="text-center text-4xl text-white">Happy Christmas !!!</div>
<div class="container"> <div class="container">
<div class="santa"> <div class="santa">
<div class="hand-l"></div> <div class="hand-l"></div>

View File

@@ -4,6 +4,8 @@ import { defineConfig } from 'astro/config';
export const locales = { export const locales = {
root: { label: 'English', lang: 'en' }, root: { label: 'English', lang: 'en' },
es: { label: 'Español', lang: 'es' }, es: { label: 'Español', lang: 'es' },
fr: { label: 'Français', lang: 'fr' },
'pt-br': { label: 'Português (Brasil)', lang: 'pt-BR' },
}; };
// https://astro.build/config // https://astro.build/config
@@ -28,6 +30,8 @@ export default defineConfig({
autogenerate: { directory: 'guides' }, autogenerate: { directory: 'guides' },
translations: { translations: {
es: 'Guías', es: 'Guías',
fr: 'Guides',
'pt-BR': 'Guias',
}, },
}, },
{ {
@@ -35,6 +39,8 @@ export default defineConfig({
autogenerate: { directory: 'challenges' }, autogenerate: { directory: 'challenges' },
translations: { translations: {
es: 'Desafíos', es: 'Desafíos',
fr: 'Challenges',
'pt-BR': 'Desafios'
}, },
}, },
], ],
@@ -73,6 +79,14 @@ export default defineConfig({
label: 'Español', label: 'Español',
lang: 'es', lang: 'es',
}, },
fr: {
label: 'Français',
lang: 'fr',
},
'pt-br': {
label: 'Português (Brasil)',
lang: 'pt-BR',
},
}, },
}), }),
], ],

View File

@@ -1,7 +1,7 @@
--- ---
title: 🟠 Web workers title: 🟠 Web workers
description: Challenge 40 is about learning how to create and use a web worker description: Challenge 40 is about learning how to create and use a web worker
author: Thomas Laforge author: thomas-laforge
challengeNumber: 40 challengeNumber: 40
command: performance-christmas-web-worker command: performance-christmas-web-worker
sidebar: sidebar:
@@ -19,14 +19,16 @@ This application is basic. We click on the **Discover** button to reveal the sur
Since JavaScript is single-threaded, when we perform a heavy task, the browser cannot update the UI or respond to mouse clicks or any events. To free the main thread, the goal is to isolate the heavy computation into a different thread. To do so, we will need to use web workers. Web workers can run any scripts in the background, in isolation from the main thread, allowing the browser to still provide your user with a good experience. Since JavaScript is single-threaded, when we perform a heavy task, the browser cannot update the UI or respond to mouse clicks or any events. To free the main thread, the goal is to isolate the heavy computation into a different thread. To do so, we will need to use web workers. Web workers can run any scripts in the background, in isolation from the main thread, allowing the browser to still provide your user with a good experience.
In Angular, this technology is often underused, however, it's straightforward to create one. There is a schematic that you can find here. In Angular, this technology is often underused, however, it's straightforward to create one. There is a schematic that you can find [here](https://angular.io/guide/web-worker).
## Statement ## Statement
The goal of this challenge is to create a smooth animation by isolating the heavy computation function into a web worker. The goal of this challenge is to create a smooth animation by isolating the heavy computation function into a web worker.
First, create a web worker using the schematics, then move the issuing function. Finally, the animation should be smooth and provide an awesome user experience. First, create a web worker using a schematic, then move the issuing function. Finally, the animation should be smooth and the progress percentage should update, which will provide an awesome user experience.
### Note
:::note
Since we are inside an Nx workspace, simply replace the `ng` command with `nx` when running the schematic. Since we are inside an Nx workspace, simply replace the `ng` command with `nx` when running the schematic.
If `nx` is not install globally on your machine, prefix your command with `npx`.
:::

View File

@@ -0,0 +1,57 @@
---
title: Comment démarrer
description: Un guide sur la manière de commencer avec sur Angular Challenges.
sidebar:
order: 1
---
Pour commencer avec les <b>Challenges Angular</b>, suivez ces étapes :
## Créez un compte Github
Si vous souhaitez soumettre une réponse, vous devrez avoir votre propre compte GitHub. De plus, avoir un compte GitHub est toujours bénéfique et c'est gratuit.
## Forkez le projet GitHub
Accédez au [répertoire des Challenges Angular](https://github.com/tomalaforge/angular-challenges) et cliquez sur le bouton <span class="github-neutral-btn"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo-forked mr-2">
<path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"></path></svg>Fork</span> dans l'en-tête. Cela créera une copie de ce dépôt sur votre propre page GitHub.
## Clonez le dépôt sur votre machine locale
Sélectionnez un répertoire sur votre ordinateur local et clonez ce dépôt.
Ouvrez un terminal, accédez au répertoire choisi et tapez la commande suivante :
```bash
git clone https://github.com/[VOTRE_NOM_GITHUB]/angular-challenges.git
```
:::note
Vous pouvez trouver l'URL de clonage en cliquant sur le bouton <span class="github-success-btn"><> Code</span> dans votre <b>propre instance</b> du dépôt des Challenges Angular.
![Header of github workpspace](../../../../assets/header-github.png)
:::
## Ouvrez le projet dans votre IDE préféré
Ouvrez le projet dans n'importe quel IDE de votre choix.
## Installez toutes les dépendances
```bash
npm ci
```
## Choisissez un challenge
Votre projet est maintenant opérationnel. La seule étape restante est de choisir un challenge 🚀
Chaque challenge se compose de :
- <b>Nom</b> : indiquant de quoi traite le défi.
- <b>Numéro</b> : ordre de création. Le numéro n'a pas de signification particulière mais aide pour la référence dans la section des Demandes de Tirage (Pull Requests) GitHub.
- <b>Badge</b> : aide à visualiser le degré de difficulté. C'est entièrement subjectif 😅
- 🟢 facile
- 🟠 moyen
- 🔴 difficile

View File

@@ -0,0 +1,93 @@
---
title: Résoudre un Challenge
description: Guide pour résoudre un challenge
sidebar:
order: 2
---
Dans ce guide, vous apprendrez comment résoudre un challenge et soumettre une réponse sur le répertoire principal de Github.
## Introduction
Ce répertoire utilise [Nx](https://nx.dev/getting-started/intro). <b>Nx</b> est un monorépo qui vous permet de stocker plusieurs applications à l'intérieur du même espace de travail. Chaque challenge est une application distincte. Si vous ouvrez le répertoire `apps`, vous trouverez plusieurs dossiers, chacun lié à un challenge spécifique. Chaque dossier représente une application autonome complète `Nx`. Pour exécuter et démarrer l'une d'entre elles, ouvrez votre terminal et exécutez :
```bash
npx nx serve <NOM_APPLICATION>
```
:::note
Si vous n'êtes pas sûr de votre `NOM_APPLICATION`, ouvrez le fichier README.md. La commande `serve` y est écrite, avec un lien vers la documentation du challenge.
:::
:::note
Si vous installez `nx` globalement sur votre ordinateur, vous éviterez de préfixer chaque commande par `npx`.
Pour installer `nx` globalement, exécutez
```bash
npm i -g nx
```
:::
## Créer une Branche Git
Avant de commencer à résoudre un challenge, créez une branche git pour y ajouter vos modifications.
```bash
git checkout -b <BRANCH_NAME>
```
## Résoudre un Challenge
Suivez les instructions décrites sur chaque Challenge pour le résoudre.
## Commitez et Pousser votre Travail
La dernière étape consiste à valider votre travail en suivant les [Conventional Guidelines](https://www.conventionalcommits.org/en/v1.0.0/).
Enfin, poussez votre travail vers le répertoire distant avec la commande suivante
```bash
git push --set-upstream origin <BRANCH_NAME>
```
:::tip[Pas besoin de retenir la commande par coeur]
Vous n'avez pas besoin de mémoriser précisément la commande. Il vous suffit de vous rappeler `git push `et si c'est la première fois que vous poussez cette branche, `git` vous fournira la commande complète.
:::
## Soumettre votre Travail sur le répertoire Principal
Maintenant, tout votre travail se trouve dans votre instance locale du dépôt de Angular Challenges.
La prochaine étape est de vous rendre sur la page principale de Angular Challenges et de créer une nouvelle Pull Request.
Github devrait afficher en en-tête une notification pour vous aider à créer la pull request.
Si ce n'est pas le cas, vous avez soit mal effectué l'une des étapes précédentes, soit vous pouvez vous rendre sur l'onglet <b>Pull Request</b> et cliquer sur le bouton <span class="github-success-btn">New pull request</span>.
Une fois que vous avez choisi les deux branches à comparer, vous devriez arriver sur la page suivante :
![New pull request screen](../../../../assets/new-pull-request.png)
Dans la section du titre, commencez par <b>Réponse :</b> suivi de votre <b>numéro de challenge</b>. Ensuite, vous êtes libre d'ajouter tout ce que vous souhaitez.
:::danger
C'est très important. Cela permet aux autres de savoir quel challenge vous tentez de résoudre.
:::
Dans la section de description, vous pouvez ajouter des questions, des problèmes rencontrés ou tout autre contenu que vous souhaitez partager. Vous pouvez laisser vide si vous n'avez rien à dire.
Vous pouvez maintenant cliquer sur <span class="github-success-btn">Créer pull request</span>.
Je la lirai et commenterai <b>quand j'aurai du temps libre.</b>
<p class="important-block">Ne vous inquiétez pas si votre réponse n'est pas examinée immédiatement. Je le fais <b>gratuitement</b> et pendant mon <b>temps libre</b>. Si vous souhaitez me soutenir, vous pouvez le faire en me <a href="https://github.com/sponsors/tomalaforge">sponsorisant sur github</a>. Cela validera que mon travail vous aide, vous ou votre équipe.</p>
:::note
Tout le monde peut commenter ou lire les Pull Requests des autres participants.
:::
:::tip[Champion OSS]
🔥 Une fois que vous avez terminé ce tutoriel, vous êtes prêt à contribuer à n'importe quel répertoire public Github et à soumettre une PR. C'est aussi simple que ça. 🔥
:::

View File

@@ -0,0 +1,78 @@
---
title: Bienvenue sur Angular Challenges
description: Commence par résoudre ces défis et deviens un meilleur ingénieur FrontEnd Angular.
template: splash
noCommentSection: true
banner:
content: J'aurai moins de temps libre dans les deux prochains mois, donc ne vous inquiétez pas si vos pull requests prennent du temps à être examinées.
hero:
tagline: Commence maintenant et deviens un expert Angular !
image:
file: ../../../assets/angular-challenge.webp
actions:
- text: C'est parti !
link: /guides/getting-started/
icon: right-arrow
variant: primary
- text: Aller au dernier Challenge
link: /challenges/performance/40-christmas-web-worker/
icon: rocket
- text: Donne une étoile
link: https://github.com/tomalaforge/angular-challenges
icon: github
variant: secondary
---
import { Card, CardGrid } from '@astrojs/starlight/components';
import MyIcon from '../../../components/MyIcon.astro';
<CardGrid>
<Card title="40 Défis">
Ce répertoire rassemble 40 défis liés à <b>Angular</b>, <b>Nx</b>, <b>RxJS</b>, <b>Ngrx</b> et <b>Typescript</b>. Ces défis portent sur des problèmes réels ou des fonctionnalités spécifiques pour améliorer vos compétences.
</Card>
<Card title="Devenir un Mainteneur OSS">
L'un des objectifs de ce répertoire est de rendre plus accessible les
contributions aux logiciels Open Source (OSS). En résolvant ces défis, vous
apprendrez comment commencer à contribuer à n'importe quel projet Open Source.
</Card>
<Card title="Apprendre aux Côtés des Autres">
Apprendre et démarrer sur un nouveau framework est toujours difficile. Cette
série de défis propose des cas d'utilisation réels pour appliquer ce que vous
avez appris. N'importe qui peut commenter ou aider.{' '}
<b>
Apprendre seul est bien, mais apprendre aux côtés des autres vous fera
progresser davantage et plus rapidement.
</b>
</Card>
<Card title="Contribuer">
Avez-vous un problème, un bug intéressant ou une idée ? N'hésitez pas ;{' '}
<b>créez vos propres challenges</b> sans perdre de temps.
</Card>
<Card title="Se Préparer pour les Entretiens">
Résoudre ces challenges vous préparera aux éventuels défis techniques que vous
pourriez rencontrer lors d'un entretien pour un rôle d'ingénieur frontend.
</Card>
<Card title="Sponsoring">
Ce projet est gratuit et vise à le rester le plus longtemps possible. Cependant, tout est réalisé pendant mon temps libre, y compris la création de challenges et la relecture des pull requests. <b>Le sponsoring peut me soutenir et contribuer à la croissance du projet.</b>
</Card>
</CardGrid>
---
<div class="article-footer">
<a href="https://github.com/sponsors/tomalaforge" alt="Sponsor link">
<MyIcon name="fillHeart" size="1.2rem" color="white" />
Sponsoriser le Project
</a>
</div>
<div class="main-page-footer">
Créer par{' '}
<a href="https://github.com/tomalaforge?tab=repositories">Thomas Laforge</a> -
Réaliser grâce à 🌟 <a href="https://starlight.astro.build/">Starlight</a>
</div>

View File

@@ -0,0 +1,37 @@
---
title: 🟢 Projeção
description: Desafio 1 é sobre aprender a projetar elementos DOM através de componentes
author: thomas-laforge
challengeNumber: 1
command: angular-projection
blogLink: https://medium.com/@thomas.laforge/create-a-highly-customizable-component-cc3a9805e4c5
videoLink:
link: https://www.youtube.com/watch?v=npyEyUZxoIw&ab_channel=ArthurLannelucq
alt: Vídeo de projeção por Arthur Lannelucq
flag: FR
sidebar:
order: 1
---
## Informação
Em Angular, projeção de conteúdo é uma técnica robusta para criar componente altamente personalizados. Usar e entender os conceitos do <b>ng-content</b> e <b>ngTemplateOutlet</b> pode melhorar significativamente sua habilidade na criação de componentes compartilháveis.
Você pode aprender tudo sobre <b>ng-content</b> [aqui](https://angular.io/guide/content-projection#projecting-content-in-more-complex-environments), desde projeção simples até casos mais complexos.
Para aprender sobre <b>ngTemplateOutlet</b>, você pode acessar a documentação [aqui](https://angular.io/api/common/NgTemplateOutlet) junto a alguns exemplos básicos.
Com essas duas ferramentas em mãos, você está pronto para realizar o desafio.
## Declaração
Você começará com uma aplicação totalmente funcional que inclui um dashboard, que possui um cartão de professor e de estudante. O objetivo é implementar o cartão de cidade.
Apesar da aplicação funcionar, a experiência do desenvolvedor (DX) está nem um pouco otimizada. Toda vez que você precisar implementar um novo cartão, você terá que modificar o `card.component.ts`. Em projetos reais, esse componente pode ser compartilhado entre várias aplicações. O objetivo do desafio é criar um `CardComponent` que possa ser personalizado sem nenhuma modificação. Uma vez criado o componente, você pode começar a implementar o `CityCardComponent` e assegurar que não mexerá no `CardComponent`.
## Restrições
- Você <b>deve</b> refatorar o `CardComponent` e `ListItemComponent`.
- A diretiva `NgFor` deve ser declarada e permanecer dentro do `CardComponent`. Você pode ficar instigado em querer mover ela para o `ParentCardComponent` como `TeacherCardComponent`.
- `CardComponent` não deve conter nenhum `NgIf` ou `NgSwitch`.
- CSS: tente evitar usar `::ng-deep`. Ache uma maneira melhor para lidar com o CSS.

View File

@@ -0,0 +1,48 @@
---
title: Verifique a resposta dos outros
description: Guia para verificar a resposta de outra pessoa
sidebar:
order: 3
---
Todas as respostas do Desafios Angular são apresentadas na forma de Pull Request (PR). Para ver e seguir elas, navegue pela página **Files Changes** no GitHub. Entretanto, entender e seguir esse processo pode não ser direto se você não estiver familiarizado com a interface. Muitas vezes, você pode preferir verificar a branch e revisar a solução na sua IDE de preferência.
Este guia foi criado para ajudar você a conseguir isso.
## Confire PR de outra pessoa localmente
### Sincronize seu repositório
Primeiro, você precisa sincronizar seu fork para garantir que ele está atualizado com o repositório bifurcado.
Isso pode ser feito clicando no botão Sync fork na página principal de seu fork.
![Sync project header](../../../../assets/fork-sync.png)
A imagem acima mostra que minha branch está atrás da branch principal por 8 commits, e será necessário sincronizá-la para deixar ela atualizada.
![Sync project update modal](../../../../assets/sync-fork-update.png)
### Confira localmente
Vá até o PR que desejar conferir localmente e pegue seu ID. Você o achará no título do PR (como mostrado abaixo).
![PR header](../../../../assets/PR-header.png)
Depois, abra um terminal dentro do diretório de seu projeto e execute o seguinte comando:
```bash
gh pr checkout <ID>
```
Se você não lembrar o comando, clique no butão <span class="github-neutral-btn"><> Code</span> no lado direito do cabeçalho e você poderá copiar/colar o comando.
![PR code modal](../../../../assets/PR-code-btn-modal.png)
:::note[Nota]
Se o comando não funcionar ou fracassar, a CLI do GitHub vai guiar você durante o processo.
:::
🔥 Agora você pode navegar nas soluções localmente e rodá-las para testar. 🔥
<!-- gh repo set-default -->

View File

@@ -0,0 +1,20 @@
---
title: Contribua
description: Guia para contribuir
sidebar:
order: 4
---
Você pode contribuir para este repositório das seguintes maneiras:
🔥 Criar um novo desafio seguindo as instruções [aqui](/pt-br/guides/create-challenge).
🔥 Responder desafios e submeter sua resposta (guia [aqui](/pt-br/guides/resolve-challenge)).
🔥 Comentar as soluções de outras pessoas dando feedback construtivo e solidário.
🔥 Corrigindo erros de digitação (typos) ou erros de inglês na documentação.
🔥 Enviar um problema (issue) para sugerir novas ideias de desafios ou reportar um bug.
🔥 Patrocinar o projeto [aqui](https://github.com/sponsors/tomalaforge).

View File

@@ -0,0 +1,54 @@
---
title: Crie seu próprio desafio
description: Guia para criar seu próprio desafio
sidebar:
order: 5
---
Você tem uma ideia que gostaria de compartilhar, um bug interessante que você está batendo a cabeça em um de seus projetos pessoais ou um truque no Angular que você descobriu. Todas essas possibilidades são um bom ponto de partida para criar um desafio e compartilhar a solução com as outras pessoas.
Mas como você pode criar esses desafios?
## Código Boilerplate
Para simplificar o processo, criei um gerador Nx que configurará todo código boilerplate para você começar mais rápido. A maneira mais fácil de rodar o código, é usando o console Nx: vá para <b>Nx Console > generate > @angular-challenges/cli - challenge</b>
### Parâmetros
#### parâmetros obrigatórios
- <b>title</b>: O título que você deseja dar para seu desafio.
:::note[Nota]
O título deve ter no máximo 25 caracteres.
:::
- <b>challengeDifficulty</b>: A dificuldade que você acredita que o desafio tem. Têm três níveis de dificuldade: 🟢 fácil / 🟠 médio / 🔴 difícil
- <b>name</b>: nome da aplicação Nx.
:::note[Nota]
Deve ser escrito em **kebab-case**.
:::
- <b>docRepository</b>: A categoria do seu desafio: Nx, Angular, Angular Performance, Rxjs, NgRx, Typescript.
#### parâmetros opcionais
- <b>directory</b>: Se você quiser que sua aplicação esteja localizada dentro de uma pasta específica de `apps`.
- <b>addTest</b>: Se você quer adicionar configuração de testes.
### O que é criado
- O gerador criará todos os arquivos necessários para ter uma nova aplicação funcional. Todos esses arquivos serão criado dentro de `apps/${directory}/${name}`
- Um arquivo Markdown com uma configuração mínima será criado dentro de `docs/src/content/docs/challenges/${docRepository}`
## Criação do Desafio
A única coisa que falta é criar seu desafio. 🚀
:::danger[Importante]
Não esqueça de atualizar a documentação para introduzir seu desafio e providenciar suas instruções.
:::
É sua vez de agir!!! 💪
## Submissão da Solução
Depois de uma semana mais ou menos, não esqueça de providenciar sua solução para seu desafio.

View File

@@ -0,0 +1,17 @@
---
title: FAQ
description: Respostas para perguntas
sidebar:
order: 7
---
<details>
<summary>Por que minha aplicação não roda ou por que eu encontro erros no meu terminal quando executo `nx serve`?</summary>
Na maioria das vezes, o problema surge por que seu `node_modules` está desatualizado e você precisa atualizá-lo executando o comando `npm ci`.
Se a instalação fracassar, você pode resolver deletando o diretório `node_modules` através do comando `rm -rf node_modules` ou `npx npkill`, e depois executar `npm ci` novamente.
Se o problema persistir, por favor reporte ele [aqui](https://github.com/tomalaforge/angular-challenges/issues/new).
</details>

View File

@@ -0,0 +1,57 @@
---
title: Começando
description: Um guia de como começar com Desafios Angular.
sidebar:
order: 1
---
Para começar com <b>Desafios Angular</b>, siga os seguintes passos:
## Crie uma conta GitHub
Se você desejar submeter uma resposta, será necessário ter uma conta pessoal no GitHub. Além disso, ter uma conta GitHub é sempre benéfico e é de graça.
## Crie um fork do projeto GitHub
Navegue para o [reposítório do Desafios Angular](https://github.com/tomalaforge/angular-challenges) e clique no botão <span class="github-neutral-btn"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo-forked mr-2">
<path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"></path></svg>Fork</span> no cabeçalho. Isso criará uma cópia do repositório no seu GitHub pessoal.
## Clone o repositório para sua máquina local
Escolha um diretório/pasta no seu computador e clone o repositório.
Abra um terminal, navegue até a pasta selecionada e digite o comando:
```bash
git clone https://github.com/[SEU_NOME_GITHUB]/angular-challenges.git
```
:::note[Nota]
Você pode achar a URL para clonar clicando no botão <span class="github-success-btn"><> Code</span> na sua <b>própria instância</b> do repositório do Desafios Angular.
![Header of github workpspace](../../../../assets/header-github.png)
:::
## Abra o projeto na sua IDE favorita
Abra o projeto em uma IDE de sua escolha.
## Instale todas dependências
```bash
npm ci
```
## Escolha um desafio
O seu projeto está pronto e funcional. O que falta agora é escolher um desafio 🚀
Cada desafio consiste em:
- <b>Nome</b>: indica sobre o que o desafio é.
- <b>Número</b>: ordem de criação. O número não tem nenhum significado, mas ajuda na referência para a seção de Pull Request no GitHub.
- <b>Indicador</b>: ajuda a visualizar o grau de dificuldade. É totalmente subjetivo 😅
- 🟢 fácil
- 🟠 médio
- 🔴 difícil

View File

@@ -0,0 +1,55 @@
---
title: Rebase sua branch
description: Guia para realizar rebase em uma branch e atualizá-la com as mudanças mais recentes
sidebar:
order: 6
---
De tempos em tempos, mudanças podem ser adicionadas no projeto. Eu tentarei fazer mudanças que não quebrem nada, mas algumas vezes é inevitável.
Na maioria das vezes, você não precisará fazer rebase na sua solução, mas aqui está um guia para ajudar em como fazer isso.
:::note[Nota]
Este guia é aplicável para qualquer Projeto de Código Aberto.
:::
## Passos para fazer rebase na sua branch
### Sincronize seu repositório
Primeiro, você precisa sincronizar seu fork para garantir que está tudo atualizado com o repositório bifurcado.
Você pode fazer isso clicando no botão Sync fork na página principal de seu fork.
![Sync project header](../../../../assets/fork-sync.png)
A imagem acima mostra que minha branch está atrás da branch principal por 8 commits e eu preciso sincronizar para atualizar ela com as mudanças mais recentes.
![Sync project update modal](../../../../assets/sync-fork-update.png)
### Abra um terminal
Abra um terminal de sua escolha, pode ser tanto na sua IDE favorita ou uma instância independente.
### Git
Siga os seguintes comandos para realizar um rebase na sua branch local:
- git checkout main
- git pull
- git checkout [sua branch]
- git rebase main
- Resolva Conflitos
Neste passo, o rebase pode parar, porque sua branch local tem arquivos conflitantes com a branch principal. Corrija-os e depois disso feito:
- git add .
- git rebase --continue
Se sua branch não tem nenhum conflito, uma mensagem de sucesso será mostrada.
### Faça um Push do seu trabalho para a branch remota
Por último, faça um push do seu trabalho de volta para o GitHub:
- git push -f

View File

@@ -0,0 +1,93 @@
---
title: Resolva um desafio
description: Guia de como resolver um desafio
sidebar:
order: 2
---
Neste guia, você aprenderá como resolver um desafio e submeter uma resposta para o repositório principal no GitHub.
## Introdução
Este repositório é feito com [Nx](https://nx.dev/getting-started/intro). <b>Nx</b> é um monorepositório que permite armazenar múltiplas aplicações dentro de um mesmo espaço de trabalho. Cada desafio é uma aplicação separada. Se você abrir o diretório `apps`, achará várias pastas, sendo cada uma relacionada a um desafio específico. Cada diretório representa um aplicação `Nx` completa e independente. Para executar e começar uma aplicação, abra seu terminal e use:
```bash
npx nx serve <NOME_APLICACAO>
```
:::note[Nota]
Se você não tem certeza quanto ao `NOME_APLICACAO`, abra o arquivo README.md do desafio. O comando `serve` está escrito nele com um link para a documentação do desafio.
:::
:::note[Nota]
Se `nx` está instalado globalmente no seu dispositivo, você pode pular o uso de `npx`.
Para instalar `nx` globalmente, execute:
```bash
npm i -g nx
```
:::
## Crie uma branch Git
Antes de começar a implementação de sua solução para um desafio, crie uma branch para commitar seu trabalho.
```bash
git checkout -b <NOME_BRANCH>
```
## Resolva o Desafio
Siga as instruções para resolver o desafio.
## Commitar e fazer o _Push_ do seu trabalho
O último passo é commitar seu trabalho seguindo o [Conventional Guidelines](https://www.conventionalcommits.org/en/v1.0.0/).
Finalmente, faça um push do trabalho ao repositório remoto com o seguinte comando:
```bash
git push --set-upstream origin <NOME_BRANCH>
```
:::tip[Não precisa lembrar disso]
Você não precisa lembrar do comando. Você pode simplemente lembrar do `git push` e, se é a primeira vez que você faz um push na branch, `git` fornecerá para você o comando completo.
:::
## Submeta seu Trabalho no Repositório Principal
Agora, todo seu trabalho está localizado dentro de sua instância local do repositório do Desafios Angular.
O próximo passo é ir para a [página principal do Desafios Angular](https://github.com/tomalaforge/angular-challenges) e criar um novo Pull Request.
GitHub deve mostrar no cabeçalho uma notificação para ajudar a criação do pull request.
Se não mostrar, você pode ter feito um dos passos anteriores errado ou você pode ir para a aba <b>Pull Request</b> e clicar no botão <span class="github-success-btn">New pull request</span>.
Uma vez escolhidas as duas branches para comparar, você deve ser redirecionado para a seguinte página:
![New pull request screen](../../../../assets/new-pull-request.png)
Na seção do título, comece com <b>Answer:</b> seguido pelo <b>número do desafio</b>. Depois, você está livre para adicionar o que você desejar.
:::danger[Importante]
Isso é muito importante. Isso deixará as outras pessoas saberem qual desafio você tentou resolver.
:::
Na seção de descrição, você pode adicionar perguntas, problemas que encontrou ou qualquer coisa que queira compartilhar. Você pode deixar vazio caso não tenha nada para dizer.
Agora você pode clicar em <span class="github-success-btn">Create pull request</span>.
Eu o lerei e comentarei <b>quando tiver algum tempo livre.</b>
<p class="important-block">Não se preocupe se sua resposta não for revisada imediatamente. Estou fazendo isso de <b>graça</b> e durante meu <b>tempo livre</b>. Se você quiser me ajudar, você pode fazê-lo <a href="https://github.com/sponsors/tomalaforge">me patrocinando no github</a>. Isso mostrará que meu trabalho é de grande ajuda para você e seu time.</p>
:::note[Nota]
Todo mundo é bem-vindo para comentar e ver outros PRs.
:::
:::tip[Campeão OSS]
🔥 Ao terminar este tutorial, você está pronto para contribuir em qualquer outro repositório público do GitHub e submeter um PR. Simples assim. 🔥
:::

View File

@@ -0,0 +1,82 @@
---
title: Bem-vindos aos Desafios Angular
description: Comece resolvendo esses desafios e se torne um melhor desenvolvedor frontend Angular.
template: splash
noCommentSection: true
banner:
content: Terei menos tempo livre nos próximos dois meses, não se preocupe se seus pull requests levarem um tempo para serem revisados.
hero:
tagline: Comece agora e vire um especialista em Angular!
image:
file: ../../../assets/angular-challenge.webp
actions:
- text: Iniciar
link: /pt-br/guides/getting-started/
icon: right-arrow
variant: primary
- text: Ir para o desafio mais recente
link: /pt-br/challenges/performance/40-christmas-web-worker/
icon: rocket
- text: Dar uma estrela
link: https://github.com/tomalaforge/angular-challenges
icon: github
variant: secondary
---
import { Card, CardGrid } from '@astrojs/starlight/components';
import MyIcon from '../../../components/MyIcon.astro';
<CardGrid>
<Card title="40 Desafios">
Este repositório possui 40 desafios relacionados a <b>Angular</b>, <b>Nx</b>, <b>RxJS</b>,
<b>Ngrx</b> e <b>Typescript</b>.
Esses desafios são voltados para problemas reais ou funcionalidades específicas afim de
melhorar suas habilidades.
</Card>
<Card title="Torne-se um contribuidor OSS">
Um dos objetivos desse repositório é <b>diminuir a barreira</b> de entrada para o Software de
Código Aberto (OSS). Ao realizar esses desafios, você aprenderá como começar a contruibuir em
qualquer outro Projeto de Código Aberto.
</Card>
<Card title="Aprenda junto com os outros">
Aprender e praticar um novo framework é sempre desafiador. Este conjunto de desafios
possui casos de uso reais para aplicarmos o que aprendemos. Qualquer um pode comentar e
oferecer assistência.
<b>
Aprender sozinho é legal, mas aprender junto com outras pessoas levará você mais longe.
</b>
</Card>
<Card title="Contribua">
Tem algum problema, um bug interessante ou uma ideia? Não hesite;
<b>crie seus próprios desafios</b> sem perder tempo.
</Card>
<Card title="Prepare-se para entrevistas">
Completar esses desafios vai preparar você para quaisquer desafios técnicos que encontrar em
uma entrevista para uma vaga frontend.
</Card>
<Card title="Patrocínio">
Este projeto é livre e tem o objetivo de permanecer assim o máximo possível. No entanto,
tudo é feito durante meu tempo livre, incluindo a criação de desafios e revisão de pull requests (PRs).
<b>Patrocinar pode me ajudar e contribuir para o crescimento do projeto</b>.
</Card>
</CardGrid>
---
<div class="article-footer">
<a href="https://github.com/sponsors/tomalaforge" alt="Sponsor link">
<MyIcon name="fillHeart" size="1.2rem" color="white" />
Patrocine o Projeto
</a>
</div>
<div class="main-page-footer">
Criado por{' '}
<a href="https://github.com/tomalaforge?tab=repositories">Thomas Laforge</a> -
Fornecido por 🌟 <a href="https://starlight.astro.build/">Starlight</a>
</div>