From 2e83a3d41dd3e7fbc313dddd7635d25c24eab120 Mon Sep 17 00:00:00 2001 From: Ilenia Date: Wed, 31 Aug 2022 13:47:21 +0200 Subject: [PATCH 001/129] fix(curriculum): add `for` attribute to `label` elements in registration-form project (#47332) * Add files via upload * removed merge conflicts * new step 17 * write step 17 + seed code step 18 * for and id to remaining steps * new step 28 * finish id and for in second fieldset * new step 37 * 37 tests * update seeds and solution * more updating seeds and solution * fixed wrong seed * fixed wrong test * formatting * Apply suggestions from Shaun's code review Co-authored-by: Shaun Hamilton Co-authored-by: Johnathan Webster <81039525+JohnathanTWebster@users.noreply.github.com> Co-authored-by: Shaun Hamilton --- .../meta.json | 98 +++++++------ .../60f80e0081e0f2052ae5b505.md | 12 +- .../60f81167d0d4910809f88945.md | 12 +- .../60f81616cff80508badf9ad5.md | 12 +- .../60f83e7bfc09900959f41e20.md | 12 +- .../60f84ec41116b209c280ba91.md | 12 +- .../60f852f645b5310a8264f555.md | 12 +- .../60f85a62fb30c80bcea0cedb.md | 12 +- .../60f8604682407e0d017bbf7f.md | 12 +- .../60f8618d191b940d62038513.md | 12 +- .../60fab4a123ce4b04526b082b.md | 12 +- .../60fab8367d35de04e5cb7929.md | 18 +-- .../60fab9f17fa294054b74228c.md | 21 ++- .../60fabf0dd4959805dbae09e6.md | 20 +-- .../60fac4095512d3066053d73c.md | 23 ++- .../60fac56271087806def55b33.md | 25 ++-- .../60fac8d7fdfaee0796934f20.md | 23 ++- .../60faca286cb48b07f6482970.md | 23 ++- .../60facde2d0dc61085b41063f.md | 23 ++- .../60facf914c7b9b08d7510c2c.md | 33 +++-- .../60fad0a812d9890938524f50.md | 33 +++-- .../60fad1cafcde010995e15306.md | 35 +++-- .../60fad6dfcc0d930a59becf12.md | 33 +++-- .../60fad8e6148f310bba7890b1.md | 33 +++-- .../60fad99e09f9d30c1657e790.md | 33 +++-- .../60fadb18058e950c73925279.md | 33 +++-- .../60fadce90f85c50d0bb0dd4f.md | 33 +++-- .../60fadd972e6ffe0d6858fa2d.md | 33 +++-- .../60fadfa2b540b70dcfa8b771.md | 33 +++-- .../60fc219d333e37046f474a6e.md | 33 +++-- .../60fc22d1e64d1b04cdd4e602.md | 33 +++-- .../60fc236dc04532052926fdac.md | 33 +++-- .../60ffe1bc30415f042faea936.md | 33 +++-- .../60ffe3936796ac04959285a9.md | 33 +++-- .../60ffe4f4ec18cd04dc470c56.md | 33 +++-- .../60ffe69ee377c6055e192a46.md | 33 +++-- .../60ffe7d8aae62c05bcc9e7eb.md | 33 +++-- .../60ffe8a5ceb0e90618db06d9.md | 33 +++-- .../60ffe947a868ec068f7850f6.md | 33 +++-- .../60ffe9cb47809106eda2f2c9.md | 33 +++-- .../60ffec2825da1007509ddd06.md | 33 +++-- .../60ffecefac971607ae73c60f.md | 33 +++-- .../60ffefd6479a3d084fb77cbc.md | 62 ++++----- .../62b30924c5e4ef0daba23b5e.md | 33 +++-- .../62ff8b9dab5ac88e4d3d43a3.md | 109 +++++++++++++++ .../62ff8e998d3e7eae14d6ae3b.md | 102 ++++++++++++++ .../62ff919a7b5612c0670923a5.md | 131 ++++++++++++++++++ 47 files changed, 957 insertions(+), 635 deletions(-) create mode 100644 curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8b9dab5ac88e4d3d43a3.md create mode 100644 curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8e998d3e7eae14d6ae3b.md create mode 100644 curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff919a7b5612c0670923a5.md diff --git a/curriculum/challenges/_meta/learn-html-forms-by-building-a-registration-form/meta.json b/curriculum/challenges/_meta/learn-html-forms-by-building-a-registration-form/meta.json index 935b03b673ca04..54eabf2601cb1d 100644 --- a/curriculum/challenges/_meta/learn-html-forms-by-building-a-registration-form/meta.json +++ b/curriculum/challenges/_meta/learn-html-forms-by-building-a-registration-form/meta.json @@ -75,176 +75,188 @@ "Step 16" ], [ - "60f80e0081e0f2052ae5b505", + "62ff8b9dab5ac88e4d3d43a3", "Step 17" ], [ - "60f81167d0d4910809f88945", + "60f80e0081e0f2052ae5b505", "Step 18" ], [ - "60f81616cff80508badf9ad5", + "60f81167d0d4910809f88945", "Step 19" ], [ - "60f83e7bfc09900959f41e20", + "60f81616cff80508badf9ad5", "Step 20" ], [ - "60f84ec41116b209c280ba91", + "60f83e7bfc09900959f41e20", "Step 21" ], [ - "60f852f645b5310a8264f555", + "60f84ec41116b209c280ba91", "Step 22" ], [ - "60f85a62fb30c80bcea0cedb", + "60f852f645b5310a8264f555", "Step 23" ], [ - "60f8604682407e0d017bbf7f", + "60f85a62fb30c80bcea0cedb", "Step 24" ], [ - "60f8618d191b940d62038513", + "60f8604682407e0d017bbf7f", "Step 25" ], [ - "60fab4a123ce4b04526b082b", + "60f8618d191b940d62038513", "Step 26" ], [ - "60fab8367d35de04e5cb7929", + "60fab4a123ce4b04526b082b", "Step 27" ], [ - "60fab9f17fa294054b74228c", + "62ff8e998d3e7eae14d6ae3b", "Step 28" ], [ - "60fabf0dd4959805dbae09e6", + "60fab8367d35de04e5cb7929", "Step 29" ], [ - "60fac4095512d3066053d73c", + "60fab9f17fa294054b74228c", "Step 30" ], [ - "60fac56271087806def55b33", + "60fabf0dd4959805dbae09e6", "Step 31" ], [ - "60fac8d7fdfaee0796934f20", + "60fac4095512d3066053d73c", "Step 32" ], [ - "60faca286cb48b07f6482970", + "60fac56271087806def55b33", "Step 33" ], [ - "60facde2d0dc61085b41063f", + "60fac8d7fdfaee0796934f20", "Step 34" ], [ - "60facf914c7b9b08d7510c2c", + "60faca286cb48b07f6482970", "Step 35" ], [ - "60fad0a812d9890938524f50", + "60facde2d0dc61085b41063f", "Step 36" ], [ - "60fad1cafcde010995e15306", + "62ff919a7b5612c0670923a5", "Step 37" ], [ - "60fad6dfcc0d930a59becf12", + "60facf914c7b9b08d7510c2c", "Step 38" ], [ - "60fad8e6148f310bba7890b1", + "60fad0a812d9890938524f50", "Step 39" ], [ - "60fad99e09f9d30c1657e790", + "60fad1cafcde010995e15306", "Step 40" ], [ - "60fadb18058e950c73925279", + "60fad6dfcc0d930a59becf12", "Step 41" ], [ - "60fadce90f85c50d0bb0dd4f", + "60fad8e6148f310bba7890b1", "Step 42" ], [ - "62b30924c5e4ef0daba23b5e", + "60fad99e09f9d30c1657e790", "Step 43" ], [ - "60fadd972e6ffe0d6858fa2d", + "60fadb18058e950c73925279", "Step 44" ], [ - "60fadfa2b540b70dcfa8b771", + "60fadce90f85c50d0bb0dd4f", "Step 45" ], [ - "60fc219d333e37046f474a6e", + "62b30924c5e4ef0daba23b5e", "Step 46" ], [ - "60fc22d1e64d1b04cdd4e602", + "60fadd972e6ffe0d6858fa2d", "Step 47" ], [ - "60fc236dc04532052926fdac", + "60fadfa2b540b70dcfa8b771", "Step 48" ], [ - "60ffe1bc30415f042faea936", + "60fc219d333e37046f474a6e", "Step 49" ], [ - "60ffe3936796ac04959285a9", + "60fc22d1e64d1b04cdd4e602", "Step 50" ], [ - "60ffe4f4ec18cd04dc470c56", + "60fc236dc04532052926fdac", "Step 51" ], [ - "60ffe69ee377c6055e192a46", + "60ffe1bc30415f042faea936", "Step 52" ], [ - "60ffe7d8aae62c05bcc9e7eb", + "60ffe3936796ac04959285a9", "Step 53" ], [ - "60ffe8a5ceb0e90618db06d9", + "60ffe4f4ec18cd04dc470c56", "Step 54" ], [ - "60ffe947a868ec068f7850f6", + "60ffe69ee377c6055e192a46", "Step 55" ], [ - "60ffe9cb47809106eda2f2c9", + "60ffe7d8aae62c05bcc9e7eb", "Step 56" ], [ - "60ffec2825da1007509ddd06", + "60ffe8a5ceb0e90618db06d9", "Step 57" ], [ - "60ffecefac971607ae73c60f", + "60ffe947a868ec068f7850f6", "Step 58" ], [ - "60ffefd6479a3d084fb77cbc", + "60ffe9cb47809106eda2f2c9", "Step 59" + ], + [ + "60ffec2825da1007509ddd06", + "Step 60" + ], + [ + "60ffecefac971607ae73c60f", + "Step 61" + ], + [ + "60ffefd6479a3d084fb77cbc", + "Step 62" ] ] } \ No newline at end of file diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f80e0081e0f2052ae5b505.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f80e0081e0f2052ae5b505.md index a57200590cf24d..711948bab1413b 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f80e0081e0f2052ae5b505.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f80e0081e0f2052ae5b505.md @@ -1,8 +1,8 @@ --- id: 60f80e0081e0f2052ae5b505 -title: Step 17 +title: Step 18 challengeType: 0 -dashedName: step-17 +dashedName: step-18 --- # --description-- @@ -58,10 +58,10 @@ assert.equal(document.querySelectorAll('input')?.[3]?.type, 'password');
--fcc-editable-region--
- - - - + + + +
--fcc-editable-region--
diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81167d0d4910809f88945.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81167d0d4910809f88945.md index 37c91d54d00edf..2b82d0e81fd68b 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81167d0d4910809f88945.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81167d0d4910809f88945.md @@ -1,8 +1,8 @@ --- id: 60f81167d0d4910809f88945 -title: Step 18 +title: Step 19 challengeType: 0 -dashedName: step-18 +dashedName: step-19 --- # --description-- @@ -49,10 +49,10 @@ assert.exists(document.querySelector('fieldset + input[value="Submit"]')); --fcc-editable-region--
- - - - + + + +
diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81616cff80508badf9ad5.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81616cff80508badf9ad5.md index 4eff134fcc9087..cdc7c2f2625906 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81616cff80508badf9ad5.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81616cff80508badf9ad5.md @@ -1,8 +1,8 @@ --- id: 60f81616cff80508badf9ad5 -title: Step 19 +title: Step 20 challengeType: 0 -dashedName: step-19 +dashedName: step-20 --- # --description-- @@ -63,10 +63,10 @@ assert.equal(document.querySelector('input[type="submit"]')?.required, false); --fcc-editable-region--
- - - - + + + +
diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f83e7bfc09900959f41e20.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f83e7bfc09900959f41e20.md index 2ca2b79fc7974c..ca50aea9cf31d5 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f83e7bfc09900959f41e20.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f83e7bfc09900959f41e20.md @@ -1,8 +1,8 @@ --- id: 60f83e7bfc09900959f41e20 -title: Step 20 +title: Step 21 challengeType: 0 -dashedName: step-20 +dashedName: step-21 --- # --description-- @@ -43,10 +43,10 @@ assert.equal(document.querySelector('input[type="password"]')?.minLength, 8); --fcc-editable-region--
- - - - + + + +
--fcc-editable-region--
diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f84ec41116b209c280ba91.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f84ec41116b209c280ba91.md index 72ae35be26ac20..11c9480a706bd0 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f84ec41116b209c280ba91.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f84ec41116b209c280ba91.md @@ -1,8 +1,8 @@ --- id: 60f84ec41116b209c280ba91 -title: Step 21 +title: Step 22 challengeType: 0 -dashedName: step-21 +dashedName: step-22 --- # --description-- @@ -51,10 +51,10 @@ assert.equal(document.querySelector('input[type="password"]')?.minLength, -1); --fcc-editable-region--
- - - - + + + +
--fcc-editable-region--
diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f852f645b5310a8264f555.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f852f645b5310a8264f555.md index b6228e32ddfed9..3f7ad60cb857b7 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f852f645b5310a8264f555.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f852f645b5310a8264f555.md @@ -1,8 +1,8 @@ --- id: 60f852f645b5310a8264f555 -title: Step 22 +title: Step 23 challengeType: 0 -dashedName: step-22 +dashedName: step-23 --- # --description-- @@ -42,10 +42,10 @@ assert.exists(document.querySelector('fieldset:nth-child(2)')?.querySelector('la

Please fill out this form with the required information

- - - - + + + +
--fcc-editable-region--
diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f85a62fb30c80bcea0cedb.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f85a62fb30c80bcea0cedb.md index d775fa47663660..bab73dcaa4cf19 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f85a62fb30c80bcea0cedb.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f85a62fb30c80bcea0cedb.md @@ -1,8 +1,8 @@ --- id: 60f85a62fb30c80bcea0cedb -title: Step 23 +title: Step 24 challengeType: 0 -dashedName: step-23 +dashedName: step-24 --- # --description-- @@ -49,10 +49,10 @@ assert.equal(document.querySelectorAll('fieldset:nth-child(2) input[type="radio"

Please fill out this form with the required information

- - - - + + + +
--fcc-editable-region--
diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8604682407e0d017bbf7f.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8604682407e0d017bbf7f.md index d46770fc5f1b6d..7b98beede25054 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8604682407e0d017bbf7f.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8604682407e0d017bbf7f.md @@ -1,8 +1,8 @@ --- id: 60f8604682407e0d017bbf7f -title: Step 24 +title: Step 25 challengeType: 0 -dashedName: step-24 +dashedName: step-25 --- # --description-- @@ -46,10 +46,10 @@ assert.equal(document.querySelector('fieldset:nth-child(2) label:nth-child(3) in

Please fill out this form with the required information

- - - - + + + +
--fcc-editable-region--
diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8618d191b940d62038513.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8618d191b940d62038513.md index eae86745f49796..1ac99352c237c5 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8618d191b940d62038513.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8618d191b940d62038513.md @@ -1,8 +1,8 @@ --- id: 60f8618d191b940d62038513 -title: Step 25 +title: Step 26 challengeType: 0 -dashedName: step-25 +dashedName: step-26 --- # --description-- @@ -70,10 +70,10 @@ assert.equal(document.querySelector('fieldset:nth-child(2) > label:nth-child(3)'

Please fill out this form with the required information

- - - - + + + +
--fcc-editable-region--
diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab4a123ce4b04526b082b.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab4a123ce4b04526b082b.md index 2d7815288a2bce..68ac0ba124b8cc 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab4a123ce4b04526b082b.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab4a123ce4b04526b082b.md @@ -1,8 +1,8 @@ --- id: 60fab4a123ce4b04526b082b -title: Step 26 +title: Step 27 challengeType: 0 -dashedName: step-26 +dashedName: step-27 --- # --description-- @@ -48,10 +48,10 @@ assert.isEmpty(document.querySelector('fieldset:nth-child(2) label:nth-child(3)

Please fill out this form with the required information

- - - - + + + +
--fcc-editable-region--
diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab8367d35de04e5cb7929.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab8367d35de04e5cb7929.md index 1f108f7bbffa6c..f028eac0a4b98e 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab8367d35de04e5cb7929.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab8367d35de04e5cb7929.md @@ -1,8 +1,8 @@ --- id: 60fab8367d35de04e5cb7929 -title: Step 27 +title: Step 29 challengeType: 0 -dashedName: step-27 +dashedName: step-29 --- # --description-- @@ -50,16 +50,16 @@ assert.equal(document.querySelector('fieldset:nth-child(2) > label:nth-child(3)

Please fill out this form with the required information

- - - - + + + +
--fcc-editable-region--
- - - + + +
--fcc-editable-region--
diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab9f17fa294054b74228c.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab9f17fa294054b74228c.md index 576b3eaf54b27b..430214f2d23200 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab9f17fa294054b74228c.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab9f17fa294054b74228c.md @@ -1,8 +1,8 @@ --- id: 60fab9f17fa294054b74228c -title: Step 28 +title: Step 30 challengeType: 0 -dashedName: step-28 +dashedName: step-30 --- # --description-- @@ -48,17 +48,16 @@ assert.equal(document.querySelector('fieldset:nth-child(3) > label > input')?.ty

Please fill out this form with the required information

- - - - + + + +
- - -
--fcc-editable-region-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fabf0dd4959805dbae09e6.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fabf0dd4959805dbae09e6.md index 949876022f9577..4ca442467c47d4 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fabf0dd4959805dbae09e6.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fabf0dd4959805dbae09e6.md @@ -1,8 +1,8 @@ --- id: 60fabf0dd4959805dbae09e6 -title: Step 29 +title: Step 31 challengeType: 0 -dashedName: step-29 +dashedName: step-31 --- # --description-- @@ -62,16 +62,16 @@ assert.equal(document.querySelector('fieldset:nth-child(3) > label:nth-child(2)

Please fill out this form with the required information

- - - - + + + +
- - -
--fcc-editable-region-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac4095512d3066053d73c.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac4095512d3066053d73c.md index b5094eb84dbbc5..c10f31f103b963 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac4095512d3066053d73c.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac4095512d3066053d73c.md @@ -1,8 +1,8 @@ --- id: 60fac4095512d3066053d73c -title: Step 30 +title: Step 32 challengeType: 0 -dashedName: step-30 +dashedName: step-32 --- # --description-- @@ -42,23 +42,22 @@ assert.equal(document.querySelectorAll('fieldset:nth-child(3) > select > option'

Please fill out this form with the required information

- - - - + + + +
- - -
--fcc-editable-region--
- +
--fcc-editable-region-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac56271087806def55b33.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac56271087806def55b33.md index 776a713e7b8480..7d4f088a5fd829 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac56271087806def55b33.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac56271087806def55b33.md @@ -1,8 +1,8 @@ --- id: 60fac56271087806def55b33 -title: Step 31 +title: Step 33 challengeType: 0 -dashedName: step-31 +dashedName: step-33 --- # --description-- @@ -52,23 +52,22 @@ assert.equal(document.querySelectorAll('fieldset > label > select > option')?.le

Please fill out this form with the required information

- - - - + + + +
- - - + + +
--fcc-editable-region--
- + - - - + + + +
- - -
--fcc-editable-region--
- + - - - + + + +
- - -
--fcc-editable-region--
- + - - - + + + +
- - -
--fcc-editable-region--
- + - - - + + + +
- - -
--fcc-editable-region--
- - - + + -
--fcc-editable-region-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad0a812d9890938524f50.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad0a812d9890938524f50.md index 8591cbb5bccd19..fc31ba290fef30 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad0a812d9890938524f50.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad0a812d9890938524f50.md @@ -1,8 +1,8 @@ --- id: 60fad0a812d9890938524f50 -title: Step 36 +title: Step 39 challengeType: 0 -dashedName: step-36 +dashedName: step-39 --- # --description-- @@ -42,25 +42,24 @@ assert.match(document.querySelector('fieldset:nth-child(3) > label:nth-child(4)

Please fill out this form with the required information

- - - - + + + +
- - -
--fcc-editable-region--
- - - + + -
--fcc-editable-region-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad1cafcde010995e15306.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad1cafcde010995e15306.md index 696bc7035637f6..3d8b8ac0e023b8 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad1cafcde010995e15306.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad1cafcde010995e15306.md @@ -1,8 +1,8 @@ --- id: 60fad1cafcde010995e15306 -title: Step 37 +title: Step 40 challengeType: 0 -dashedName: step-37 +dashedName: step-40 --- # --description-- @@ -102,25 +102,24 @@ You should not give any of the `fieldset` elements a `name` attribute.

Please fill out this form with the required information

--fcc-editable-region-- -
- - - - +
+ + + +
- - -
- - - + + -
--fcc-editable-region-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad6dfcc0d930a59becf12.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad6dfcc0d930a59becf12.md index 36aa6b893c5750..189acb25ac9c79 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad6dfcc0d930a59becf12.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad6dfcc0d930a59becf12.md @@ -1,8 +1,8 @@ --- id: 60fad6dfcc0d930a59becf12 -title: Step 38 +title: Step 41 challengeType: 0 -dashedName: step-38 +dashedName: step-41 --- # --description-- @@ -48,24 +48,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('body')?.fontSize, '16px')

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad8e6148f310bba7890b1.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad8e6148f310bba7890b1.md index 2b211a1b83f6b8..d69690ec209484 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad8e6148f310bba7890b1.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad8e6148f310bba7890b1.md @@ -1,8 +1,8 @@ --- id: 60fad8e6148f310bba7890b1 -title: Step 39 +title: Step 42 challengeType: 0 -dashedName: step-39 +dashedName: step-42 --- # --description-- @@ -46,24 +46,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('h1, p')?.textAlign, 'cent

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad99e09f9d30c1657e790.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad99e09f9d30c1657e790.md index ac878af1c5f687..ea0ba5c8d290b9 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad99e09f9d30c1657e790.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad99e09f9d30c1657e790.md @@ -1,8 +1,8 @@ --- id: 60fad99e09f9d30c1657e790 -title: Step 40 +title: Step 43 challengeType: 0 -dashedName: step-40 +dashedName: step-43 --- # --description-- @@ -58,24 +58,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('form')?.width, '60vw');

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadb18058e950c73925279.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadb18058e950c73925279.md index ba42df17f66c6d..2d816f17dd20ff 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadb18058e950c73925279.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadb18058e950c73925279.md @@ -1,8 +1,8 @@ --- id: 60fadb18058e950c73925279 -title: Step 41 +title: Step 44 challengeType: 0 -dashedName: step-41 +dashedName: step-44 --- # --description-- @@ -52,24 +52,23 @@ assert.equal(fieldset?.paddingRight, '0px');

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadce90f85c50d0bb0dd4f.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadce90f85c50d0bb0dd4f.md index 603e2aae6db39a..4dc6ed2ac3140c 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadce90f85c50d0bb0dd4f.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadce90f85c50d0bb0dd4f.md @@ -1,8 +1,8 @@ --- id: 60fadce90f85c50d0bb0dd4f -title: Step 42 +title: Step 45 challengeType: 0 -dashedName: step-42 +dashedName: step-45 --- # --description-- @@ -34,24 +34,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('fieldset')?.borderBottom,

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadd972e6ffe0d6858fa2d.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadd972e6ffe0d6858fa2d.md index 57081aaf152e02..8b64312366cbf2 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadd972e6ffe0d6858fa2d.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadd972e6ffe0d6858fa2d.md @@ -1,8 +1,8 @@ --- id: 60fadd972e6ffe0d6858fa2d -title: Step 44 +title: Step 47 challengeType: 0 -dashedName: step-44 +dashedName: step-47 --- # --description-- @@ -73,24 +73,23 @@ assert.equal(selFunc(['input, textarea, select', 'input, select, textarea', 'sel

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadfa2b540b70dcfa8b771.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadfa2b540b70dcfa8b771.md index 15ac48144d592f..599275a237c5d8 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadfa2b540b70dcfa8b771.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadfa2b540b70dcfa8b771.md @@ -1,8 +1,8 @@ --- id: 60fadfa2b540b70dcfa8b771 -title: Step 45 +title: Step 48 challengeType: 0 -dashedName: step-45 +dashedName: step-48 --- # --description-- @@ -48,26 +48,25 @@ assert(document.querySelectorAll('fieldset:nth-child(2) input')?.[2]?.classList?

Please fill out this form with the required information

- - - - + + + +
--fcc-editable-region--
- - -
--fcc-editable-region--
- - - + + -
diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc219d333e37046f474a6e.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc219d333e37046f474a6e.md index 733924b7bcc6b8..3b67957ed98091 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc219d333e37046f474a6e.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc219d333e37046f474a6e.md @@ -1,8 +1,8 @@ --- id: 60fc219d333e37046f474a6e -title: Step 46 +title: Step 49 challengeType: 0 -dashedName: step-46 +dashedName: step-49 --- # --description-- @@ -40,24 +40,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('.inline')?.width, 'unset'

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc22d1e64d1b04cdd4e602.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc22d1e64d1b04cdd4e602.md index f2d9175f0831d6..e5a168ec00094e 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc22d1e64d1b04cdd4e602.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc22d1e64d1b04cdd4e602.md @@ -1,8 +1,8 @@ --- id: 60fc22d1e64d1b04cdd4e602 -title: Step 47 +title: Step 50 challengeType: 0 -dashedName: step-47 +dashedName: step-50 --- # --description-- @@ -52,24 +52,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('.inline')?.marginLeft, '0

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc236dc04532052926fdac.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc236dc04532052926fdac.md index aa3388e4477094..d641a8af37ad23 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc236dc04532052926fdac.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc236dc04532052926fdac.md @@ -1,8 +1,8 @@ --- id: 60fc236dc04532052926fdac -title: Step 48 +title: Step 51 challengeType: 0 -dashedName: step-48 +dashedName: step-51 --- # --description-- @@ -36,24 +36,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('.inline')?.verticalAlign,

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe1bc30415f042faea936.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe1bc30415f042faea936.md index faf609246ddc90..45d7a82cfdd13e 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe1bc30415f042faea936.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe1bc30415f042faea936.md @@ -1,8 +1,8 @@ --- id: 60ffe1bc30415f042faea936 -title: Step 49 +title: Step 52 challengeType: 0 -dashedName: step-49 +dashedName: step-52 --- # --description-- @@ -51,24 +51,23 @@ assert.equal(selFunc(['input, textarea', 'textarea, input'].find(selFunc))?.bord

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe3936796ac04959285a9.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe3936796ac04959285a9.md index aef32f9622e133..86998e7b4fb866 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe3936796ac04959285a9.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe3936796ac04959285a9.md @@ -1,8 +1,8 @@ --- id: 60ffe3936796ac04959285a9 -title: Step 50 +title: Step 53 challengeType: 0 -dashedName: step-50 +dashedName: step-53 --- # --description-- @@ -44,24 +44,23 @@ assert.equal(selFunc(['input, textarea', 'textarea, input'].find(selFunc))?.minH

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe4f4ec18cd04dc470c56.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe4f4ec18cd04dc470c56.md index 948e09aaa7e0ff..e493896561c15e 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe4f4ec18cd04dc470c56.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe4f4ec18cd04dc470c56.md @@ -1,8 +1,8 @@ --- id: 60ffe4f4ec18cd04dc470c56 -title: Step 51 +title: Step 54 challengeType: 0 -dashedName: step-51 +dashedName: step-54 --- # --description-- @@ -48,24 +48,23 @@ assert.isEmpty(new __helpers.CSSHelp(document).getStyle('input, textarea')?.minH

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe69ee377c6055e192a46.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe69ee377c6055e192a46.md index 691b49d3d1939a..06188bb493a281 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe69ee377c6055e192a46.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe69ee377c6055e192a46.md @@ -1,8 +1,8 @@ --- id: 60ffe69ee377c6055e192a46 -title: Step 52 +title: Step 55 challengeType: 0 -dashedName: step-52 +dashedName: step-55 --- # --description-- @@ -54,24 +54,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('input[type="submit"]')?.w

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe7d8aae62c05bcc9e7eb.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe7d8aae62c05bcc9e7eb.md index 5cd3c8d7526779..f3ec7deaaada55 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe7d8aae62c05bcc9e7eb.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe7d8aae62c05bcc9e7eb.md @@ -1,8 +1,8 @@ --- id: 60ffe7d8aae62c05bcc9e7eb -title: Step 53 +title: Step 56 challengeType: 0 -dashedName: step-53 +dashedName: step-56 --- # --description-- @@ -43,24 +43,23 @@ assert.isEmpty(new __helpers.CSSHelp(document).getStyle('input[type="submit"]')?

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe8a5ceb0e90618db06d9.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe8a5ceb0e90618db06d9.md index fcabb7a0ac50d8..9ca0497353d0dc 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe8a5ceb0e90618db06d9.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe8a5ceb0e90618db06d9.md @@ -1,8 +1,8 @@ --- id: 60ffe8a5ceb0e90618db06d9 -title: Step 54 +title: Step 57 challengeType: 0 -dashedName: step-54 +dashedName: step-57 --- # --description-- @@ -40,24 +40,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('input[type="submit"]')?.f

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe947a868ec068f7850f6.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe947a868ec068f7850f6.md index 6ac8233e1ff0c1..bb136377684996 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe947a868ec068f7850f6.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe947a868ec068f7850f6.md @@ -1,8 +1,8 @@ --- id: 60ffe947a868ec068f7850f6 -title: Step 55 +title: Step 58 challengeType: 0 -dashedName: step-55 +dashedName: step-58 --- # --description-- @@ -40,24 +40,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('input[type="submit"]')?.b

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe9cb47809106eda2f2c9.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe9cb47809106eda2f2c9.md index d9982494de3552..8ff520a0d70aca 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe9cb47809106eda2f2c9.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe9cb47809106eda2f2c9.md @@ -1,8 +1,8 @@ --- id: 60ffe9cb47809106eda2f2c9 -title: Step 56 +title: Step 59 challengeType: 0 -dashedName: step-56 +dashedName: step-59 --- # --description-- @@ -43,24 +43,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('input[type="submit"]')?.m

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffec2825da1007509ddd06.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffec2825da1007509ddd06.md index f110b532d97d90..9cb04369228e9a 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffec2825da1007509ddd06.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffec2825da1007509ddd06.md @@ -1,8 +1,8 @@ --- id: 60ffec2825da1007509ddd06 -title: Step 57 +title: Step 60 challengeType: 0 -dashedName: step-57 +dashedName: step-60 --- # --description-- @@ -42,24 +42,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('input[type="file"]')?.pad

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffecefac971607ae73c60f.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffecefac971607ae73c60f.md index 9501e186c69bc7..4133824dfa0e47 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffecefac971607ae73c60f.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffecefac971607ae73c60f.md @@ -1,8 +1,8 @@ --- id: 60ffecefac971607ae73c60f -title: Step 58 +title: Step 61 challengeType: 0 -dashedName: step-58 +dashedName: step-61 --- # --description-- @@ -40,24 +40,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('form')?.paddingBottom, '2

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffefd6479a3d084fb77cbc.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffefd6479a3d084fb77cbc.md index c85d2583d28a10..785c66089306bb 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffefd6479a3d084fb77cbc.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffefd6479a3d084fb77cbc.md @@ -1,8 +1,8 @@ --- id: 60ffefd6479a3d084fb77cbc -title: Step 59 +title: Step 62 challengeType: 0 -dashedName: step-59 +dashedName: step-62 --- # --description-- @@ -42,24 +42,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('a')?.color, 'rgb(223, 223

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
@@ -172,24 +171,23 @@ input[type="file"] {

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62b30924c5e4ef0daba23b5e.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62b30924c5e4ef0daba23b5e.md index b145bcec338668..058b8e4c6efb2a 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62b30924c5e4ef0daba23b5e.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62b30924c5e4ef0daba23b5e.md @@ -1,8 +1,8 @@ --- id: 62b30924c5e4ef0daba23b5e -title: Step 43 +title: Step 46 challengeType: 0 -dashedName: step-43 +dashedName: step-46 --- # --description-- @@ -47,24 +47,23 @@ assert(borderBottom === 'none' || borderBottom === 'medium none');

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8b9dab5ac88e4d3d43a3.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8b9dab5ac88e4d3d43a3.md new file mode 100644 index 00000000000000..fa49a72a0a0fcd --- /dev/null +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8b9dab5ac88e4d3d43a3.md @@ -0,0 +1,109 @@ +--- +id: 62ff8b9dab5ac88e4d3d43a3 +title: Step 17 +challengeType: 0 +dashedName: step-17 +--- + +# --description-- + +Following accessibility best practices, link the `input` elements and the `label` elements together using the `for` attribute. + +Use these values for the respective `id` properties: `first-name`, `last-name`, `email`, `new-password` + +# --hints-- + +The first `input` element should have an `id` of `first-name`. + +```js +assert(document.querySelectorAll('input')?.[0]?.matches('#first-name')) +``` + +The second `input` element should have an `id` of `last-name`. + +```js +assert(document.querySelectorAll('input')?.[1]?.matches('#last-name')) +``` + +The third `input` element should have an `id` of `email`. + +```js +assert(document.querySelectorAll('input')?.[2]?.matches('#email')) +``` + +The fourth `input` element should have an `id` of `new-password`. + +```js +assert(document.querySelectorAll('input')?.[3]?.matches('#new-password')) +``` + +The first `label` element should have a `for` attribute with a value of `first-name`. + +```js +assert(document.querySelectorAll('label')?.[0]?.matches('label[for="first-name"]')) +``` + +The second `label` element should have a `for` attribute with a value of `last-name`. + +```js +assert(document.querySelectorAll('label')?.[1]?.matches('label[for="last-name"]')) +``` + +The third `label` element should have a `for` attribute with a value of `email`. + +```js +assert(document.querySelectorAll('label')?.[2]?.matches('label[for="email"]')) +``` + +The fourth `label` element should have a `for` attribute with a value of `new-password`. + +```js +assert(document.querySelectorAll('label')?.[3]?.matches('label[for="new-password"]')) +``` + +# --seed-- + +## --seed-contents-- + +```html + + + + + Registration Form + + + +

Registration Form

+

Please fill out this form with the required information

+ +--fcc-editable-region-- +
+ + + + +
+--fcc-editable-region-- +
+
+ + + +``` + +```css +body { + width: 100%; + height: 100vh; + margin: 0; + background-color: #1b1b32; + color: #f5f6f7; +} + +label { + display: block; + margin: 0.5rem 0; +} + +``` diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8e998d3e7eae14d6ae3b.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8e998d3e7eae14d6ae3b.md new file mode 100644 index 00000000000000..99eb397da874fc --- /dev/null +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8e998d3e7eae14d6ae3b.md @@ -0,0 +1,102 @@ +--- +id: 62ff8e998d3e7eae14d6ae3b +title: Step 28 +challengeType: 0 +dashedName: step-28 +--- + +# --description-- + +Follow accessibility best practices by linking the `input` elements and the `label` elements in the second `fieldset`. + +Use these values for the respective `id` properties: `personal-account`, `business-account`, `terms-and-conditions` + +# --hints-- + +The first `input` element should have an `id` of `personal-account`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(2) input')?.[0]?.matches('#personal-account')) +``` + +The second `input` element should have an `id` of `business-account`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(2) input')?.[1]?.matches('#business-account')) +``` + +The third `input` element should have an `id` of `terms-and-conditions`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(2) input')?.[2]?.matches('#terms-and-conditions')) +``` + +The first `label` element should have a `for` attribute with a value of `personal-account`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(2) label')?.[0]?.matches('label[for="personal-account"]')) +``` + +The second `label` element should have a `for` attribute with a value of `business-account`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(2) label')?.[1]?.matches('label[for="business-account"]')) +``` + +The third `label` element should have a `for` attribute with a value of `terms-and-conditions`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(2) label')?.[2]?.matches('label[for="terms-and-conditions"]')) +``` + +# --seed-- + +## --seed-contents-- + +```html + + + + + Registration Form + + + +

Registration Form

+

Please fill out this form with the required information

+
+
+ + + + +
+--fcc-editable-region-- +
+ + + +
+--fcc-editable-region-- +
+ +
+ + +``` + +```css +body { + width: 100%; + height: 100vh; + margin: 0; + background-color: #1b1b32; + color: #f5f6f7; +} + +label { + display: block; + margin: 0.5rem 0; +} + +``` diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff919a7b5612c0670923a5.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff919a7b5612c0670923a5.md new file mode 100644 index 00000000000000..e9b871ba7f7970 --- /dev/null +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff919a7b5612c0670923a5.md @@ -0,0 +1,131 @@ +--- +id: 62ff919a7b5612c0670923a5 +title: Step 37 +challengeType: 0 +dashedName: step-37 +--- + +# --description-- + +Link the applicable form elements and their `label` elements together. + +Use these values for the respective `id` properties: `profile-picture`, `age`, `referrer`, `bio` + +# --hints-- + +The first `input` element should have an `id` of `profile-picture`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(3) input')?.[0]?.matches('#profile-picture')) +``` + +The second `input` element should have an `id` of `age`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(3) input')?.[1]?.matches('#age')) +``` + +The `select` element should have an `id` of `referrer`. + +```js +assert(document.querySelector('fieldset:nth-of-type(3) select')?.matches('#referrer')) +``` + +The `textarea` element should have an `id` of `bio`. + +```js +assert(document.querySelector('fieldset:nth-of-type(3) textarea')?.matches('#bio')) +``` + +The first `label` element should have a `for` attribute with a value of `profile-picture`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(3) label')?.[0]?.matches('label[for="profile-picture"]')) +``` + +The second `label` element should have a `for` attribute with a value of `age`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(3) label')?.[1]?.matches('label[for="age"]')) +``` + +The third `label` element should have a `for` attribute with a value of `referrer`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(3) label')?.[2]?.matches('label[for="referrer"]')) +``` + +The fourth `label` element should have a `for` attribute with a value of `bio`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(3) label')?.[3]?.matches('label[for="bio"]')) +``` + +# --seed-- + +## --seed-contents-- + +```html + + + + + Registration Form + + + +

Registration Form

+

Please fill out this form with the required information

+
+
+ + + + +
+
+ + + +
+--fcc-editable-region-- +
+ + + + +
+--fcc-editable-region-- + +
+ + +``` + +```css +body { + width: 100%; + height: 100vh; + margin: 0; + background-color: #1b1b32; + color: #f5f6f7; +} + +label { + display: block; + margin: 0.5rem 0; +} + +``` From f5ecb9aa9521ebc018f63fae8ab6fe70cfeac5ac Mon Sep 17 00:00:00 2001 From: camperbot Date: Wed, 31 Aug 2022 21:28:56 +0530 Subject: [PATCH 002/129] chore(i18n,client): processed translations (#47420) --- client/i18n/locales/chinese-traditional/translations.json | 1 + client/i18n/locales/chinese/translations.json | 1 + client/i18n/locales/espanol/translations.json | 1 + client/i18n/locales/german/translations.json | 3 ++- client/i18n/locales/italian/translations.json | 1 + client/i18n/locales/japanese/translations.json | 1 + client/i18n/locales/portuguese/translations.json | 3 ++- client/i18n/locales/ukrainian/translations.json | 1 + 8 files changed, 10 insertions(+), 2 deletions(-) diff --git a/client/i18n/locales/chinese-traditional/translations.json b/client/i18n/locales/chinese-traditional/translations.json index 09f6b06f5652c4..256993a47989e9 100644 --- a/client/i18n/locales/chinese-traditional/translations.json +++ b/client/i18n/locales/chinese-traditional/translations.json @@ -451,6 +451,7 @@ "change-theme": "登錄以更改主題。", "translation-pending": "幫我們翻譯", "certification-project": "認證項目", + "iframe-preview": "{{title}} preview", "iframe-alert": "通常,此鏈接會將你帶到另一個網站!一切正常,這個鏈接指向:{{externalLink}}。", "document-notfound": "找不到文件" }, diff --git a/client/i18n/locales/chinese/translations.json b/client/i18n/locales/chinese/translations.json index ba47cdcbc48775..67b268d8d3f9b5 100644 --- a/client/i18n/locales/chinese/translations.json +++ b/client/i18n/locales/chinese/translations.json @@ -451,6 +451,7 @@ "change-theme": "登录以更改主题。", "translation-pending": "帮我们翻译", "certification-project": "认证项目", + "iframe-preview": "{{title}} preview", "iframe-alert": "通常,此链接会将你带到另一个网站!一切正常,这个链接指向:{{externalLink}}。", "document-notfound": "找不到文件" }, diff --git a/client/i18n/locales/espanol/translations.json b/client/i18n/locales/espanol/translations.json index ce06a9c4ab4ef9..f3053812137b0e 100644 --- a/client/i18n/locales/espanol/translations.json +++ b/client/i18n/locales/espanol/translations.json @@ -451,6 +451,7 @@ "change-theme": "Entra para cambiar el tema.", "translation-pending": "Ayúdanos a traducir", "certification-project": "Proyecto de certificación", + "iframe-preview": "{{title}} preview", "iframe-alert": "Normally this link would bring you to another website! It works. This is a link to: {{externalLink}}", "document-notfound": "document not found" }, diff --git a/client/i18n/locales/german/translations.json b/client/i18n/locales/german/translations.json index 86efd66099519f..fbd2bed4684054 100644 --- a/client/i18n/locales/german/translations.json +++ b/client/i18n/locales/german/translations.json @@ -286,7 +286,7 @@ "percent-complete": "{{percent}}% abgeschlossen", "tried-rsa": "Wenn du die <0>Lesen-Suchen-Fragen Methode bereits ausprobiert hast, kannst du im freeCodeCamp-Forum um Hilfe bitten.", "rsa": "Lesen, suchen, fragen", - "rsa-forum": "Before making a new post please see if your question has <0>already been answered on the forum.", + "rsa-forum": "Bevor du einen neuen Beitrag schreibst schau bitte nach, ob deine Frage <0>bereits im Forum beantwortet wurde.", "reset": "Diese Lektion zurücksetzen?", "reset-warn": "Bist du dir sicher, dass du diese Lektion zurücksetzen möchtest? Die Editoren und Tests werden zurückgesetzt.", "reset-warn-2": "Dies kann nicht rückgängig gemacht werden", @@ -451,6 +451,7 @@ "change-theme": "Anmelden, um das Theme zu ändern.", "translation-pending": "Hilf uns, zu übersetzen", "certification-project": "Zertifizierungsprojekt", + "iframe-preview": "{{title}} preview", "iframe-alert": "Normalerweise würde dieser Link dich auf eine andere Website führen! Er funktioniert. Dies ist ein Link zu: {{externalLink}}", "document-notfound": "Dokument wurde nicht gefunden" }, diff --git a/client/i18n/locales/italian/translations.json b/client/i18n/locales/italian/translations.json index 4d237c3605a86c..1e3939b5065e38 100644 --- a/client/i18n/locales/italian/translations.json +++ b/client/i18n/locales/italian/translations.json @@ -451,6 +451,7 @@ "change-theme": "Accedi per modificare il tema.", "translation-pending": "Aiutaci a tradurlo", "certification-project": "Progetto della certificazione", + "iframe-preview": "{{title}} preview", "iframe-alert": "Solitamente questo link ti porterebbe su un altro sito web! Funziona. Questo è un link per {{externalLink}}", "document-notfound": "documento non trovato" }, diff --git a/client/i18n/locales/japanese/translations.json b/client/i18n/locales/japanese/translations.json index e881cc4814090c..b4c835bd8c8470 100644 --- a/client/i18n/locales/japanese/translations.json +++ b/client/i18n/locales/japanese/translations.json @@ -451,6 +451,7 @@ "change-theme": "テーマを変更するにはサインインしてください。", "translation-pending": "翻訳にご協力ください。", "certification-project": "認定プロジェクト", + "iframe-preview": "{{title}} preview", "iframe-alert": "このリンクは通常の環境では他のウェブサイトを開きます。正しく動作しています。これは {{externalLink}} へのリンクです。", "document-notfound": "ドキュメントが見つかりませんでした" }, diff --git a/client/i18n/locales/portuguese/translations.json b/client/i18n/locales/portuguese/translations.json index 70a6c82803eebd..cb72cc190d1d50 100644 --- a/client/i18n/locales/portuguese/translations.json +++ b/client/i18n/locales/portuguese/translations.json @@ -286,7 +286,7 @@ "percent-complete": "{{percent}}% completo", "tried-rsa": "Se você já tentou usar o método de <0>ler, pesquisar e perguntar, então pode pedir ajuda no fórum freeCodeCamp.", "rsa": "Leia, pesquise, pergunte", - "rsa-forum": "Before making a new post please see if your question has <0>already been answered on the forum.", + "rsa-forum": "Antes de fazer uma nova publicação, certifique-se de que sua pergunta <0>ainda não foi respondida no fórum.", "reset": "Reiniciar esta aula?", "reset-warn": "Tem certeza de que deseja reiniciar esta lição? Os editores e testes serão reiniciados.", "reset-warn-2": "Isto não pode ser desfeito", @@ -451,6 +451,7 @@ "change-theme": "Faça login para mudar o tema.", "translation-pending": "Ajude-nos a traduzir", "certification-project": "Projeto de certificação", + "iframe-preview": "{{title}} preview", "iframe-alert": "Normalmente, este link levaria você para outro site da web! Funciona. Esse é um link para: {{externalLink}}", "document-notfound": "documento não encontrado" }, diff --git a/client/i18n/locales/ukrainian/translations.json b/client/i18n/locales/ukrainian/translations.json index a17a6ff8bc40ce..ccc1e2eb87f482 100644 --- a/client/i18n/locales/ukrainian/translations.json +++ b/client/i18n/locales/ukrainian/translations.json @@ -451,6 +451,7 @@ "change-theme": "Увійдіть, щоб змінити тему.", "translation-pending": "Допоможіть нам з перекладом", "certification-project": "Сертифікаційний проєкт", + "iframe-preview": "{{title}} preview", "iframe-alert": "Зазвичай це посилання перенесло б вас на інший вебсайт! Воно працює. Це посилання на: {{externalLink}}", "document-notfound": "документ не знайдено" }, From aa4404e05af522af8abb5c83f3e145bb6febee4b Mon Sep 17 00:00:00 2001 From: camperbot Date: Wed, 31 Aug 2022 21:30:34 +0530 Subject: [PATCH 003/129] chore(i18n,docs): processed translations (#47419) --- docs/i18n/german/_sidebar.md | 28 +++++++++---------- .../how-to-work-on-coding-challenges.md | 2 +- .../how-to-work-on-localized-client-webapp.md | 2 +- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/docs/i18n/german/_sidebar.md b/docs/i18n/german/_sidebar.md index 9a1ae8edaa599c..303f0ae8daba80 100644 --- a/docs/i18n/german/_sidebar.md +++ b/docs/i18n/german/_sidebar.md @@ -7,17 +7,17 @@ - [Helfe beim Korrekturlesen von Übersetzungen](how-to-proofread-files.md) - **Mitwirkung am Code** - [freeCodeCamp lokal einrichten](how-to-setup-freecodecamp-locally.md) - - [Work on mobile app](how-to-setup-freecodecamp-mobile-app-locally.md) - - [Follow coding best practices](codebase-best-practices.md) - - [Open a pull request](how-to-open-a-pull-request.md) - - [Work on coding challenges](how-to-work-on-coding-challenges.md) - - [Work on practice projects](how-to-work-on-practice-projects.md) - - [Work on tutorials with CodeRoad](how-to-work-on-tutorials-that-use-coderoad.md) - - [Work on localized client web app](how-to-work-on-localized-client-webapp.md) - - [Work on Cypress tests](how-to-add-cypress-tests.md) - - [Work on video challenges](how-to-help-with-video-challenges.md) - - [Work on documentation](how-to-work-on-the-docs-theme.md) - - [Work on the component library](how-to-work-on-the-component-library.md) + - [Arbeite an der mobilen App mit](how-to-setup-freecodecamp-mobile-app-locally.md) + - [Befolge die besten Programmierpraktiken (best practices)](codebase-best-practices.md) + - [Eröffne einen Pull Request](how-to-open-a-pull-request.md) + - [Arbeite an den Programmieraufgaben](how-to-work-on-coding-challenges.md) + - [Arbeite an Praxisprojekten](how-to-work-on-practice-projects.md) + - [Arbeite an den Tutorials mit CodeRoad](how-to-work-on-tutorials-that-use-coderoad.md) + - [Arbeite an der lokalisierten Client-Web-App](how-to-work-on-localized-client-webapp.md) + - [Arbeite an den Cypress Tests](how-to-add-cypress-tests.md) + - [Arbeite an den Videoaufgaben](how-to-help-with-video-challenges.md) + - [Arbeite an der Dokumentation](how-to-work-on-the-docs-theme.md) + - [Arbeite an der Komponentenbibliothek](how-to-work-on-the-component-library.md) - **Zusätzliche Leitfäden** - [Übersetzungen lokal testen](how-to-test-translations-locally.md) - [Verstehe die Dateistruktur des Studienplans](curriculum-file-structure.md) @@ -29,9 +29,9 @@ - **Handbücher** (für Mitarbeiter & Moderatoren) - [Moderatorenhandbuch](moderator-handbook.md) - - [Language Lead Handbook](language-lead-handbook.md) - - [DevOps Handbook](devops.md) - - [Courses VSCode Extension](courses-vscode-extension.md) + - [Language Lead Handbuch](language-lead-handbook.md) + - [DevOps-Handbuch](devops.md) + - [Kurse VSCode Erweiterung](courses-vscode-extension.md) --- diff --git a/docs/i18n/german/how-to-work-on-coding-challenges.md b/docs/i18n/german/how-to-work-on-coding-challenges.md index d39cf0a0509f6f..dbcb90285aae35 100644 --- a/docs/i18n/german/how-to-work-on-coding-challenges.md +++ b/docs/i18n/german/how-to-work-on-coding-challenges.md @@ -10,7 +10,7 @@ Beachte, dass wir für Version 7.0 des freeCodeCamp-Studienplan zu einem [vollst Um diese Aufgaben zu lösen, braucht es viel Kreativität und Liebe zum Detail. Es gibt viele Möglichkeiten, dir zu helfen. Du bekommst Unterstützung von einem ganzen Team von Mitwirkenden, an die du deine Ideen weitergeben und deine Aufgaben demonstrieren kannst. -And as always, feel free to ask questions on the ['Contributors' category on our forum](https://forum.freecodecamp.org/c/contributors) or [the contributors chat room](https://discord.gg/PRyKn3Vbay). +Und wie immer kannst du deine Fragen in der [Kategorie "Contributors" in unserem Forum](https://forum.freecodecamp.org/c/contributors) oder im ["Contributors"-Chatraum](https://discord.gg/PRyKn3Vbay) stellen. Mit deiner Hilfe können wir einen interaktiven Studienplan entwickeln, der Millionen von Menschen dabei helfen wird, in den nächsten Jahren das Programmieren zu lernen. diff --git a/docs/i18n/german/how-to-work-on-localized-client-webapp.md b/docs/i18n/german/how-to-work-on-localized-client-webapp.md index 6906c8be7429ed..b074f0d13ccf34 100644 --- a/docs/i18n/german/how-to-work-on-localized-client-webapp.md +++ b/docs/i18n/german/how-to-work-on-localized-client-webapp.md @@ -77,7 +77,7 @@ Einige dieser Dateien werden auf unserer Übersetzungsplattform (Crowdin) übers - Die Datei `meta-tags.json` enthält die Informationen für die Meta-Tag-Informationen unserer Website. - Änderungen an diesen Dateien werden normalerweise von dem Mitarbeiterteam vorgenommen. If you see something out of the ordinary we recommend you reach us in the [contributors chat room](https://discord.gg/PRyKn3Vbay). + Änderungen an diesen Dateien werden normalerweise von dem Mitarbeiterteam vorgenommen. Wenn dir etwas Ungewöhnliches auffällt, empfehlen wir dir, uns im [Contributors Chat Room](https://discord.gg/PRyKn3Vbay) zu kontaktieren. ## Das Testen der Client-App in einer Weltsprache From 28c9cde95c3d2cfbbcb9dcdf6e929d201392d471 Mon Sep 17 00:00:00 2001 From: Naomi Carrigan Date: Wed, 31 Aug 2022 09:51:09 -0700 Subject: [PATCH 004/129] docs: document how to deploy language (#47361) * docs: document how to enable new languages * docs: rename file, update sidebar * docs: include hiddenLangs config --- docs/_sidebar.md | 2 +- ...ally.md => how-to-enable-new-languages.md} | 86 ++++++++++++++++--- docs/language-lead-handbook.md | 2 +- 3 files changed, 74 insertions(+), 16 deletions(-) rename docs/{how-to-test-translations-locally.md => how-to-enable-new-languages.md} (69%) diff --git a/docs/_sidebar.md b/docs/_sidebar.md index f7c726a47f7a24..c7a61e968761ac 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -19,7 +19,6 @@ - [Work on documentation](how-to-work-on-the-docs-theme.md) - [Work on the component library](how-to-work-on-the-component-library.md) - **Additional Guides** - - [Test translations locally](how-to-test-translations-locally.md) - [Understand the curriculum file structure](curriculum-file-structure.md) - [Debug outgoing emails locally](how-to-catch-outgoing-emails-locally.md) - [Set up freeCodeCamp on Windows (WSL)](how-to-setup-wsl.md) @@ -32,6 +31,7 @@ - [Language Lead Handbook](language-lead-handbook.md) - [DevOps Handbook](devops.md) - [Courses VSCode Extension](courses-vscode-extension.md) + - [Enable New Language](how-to-enable-new-languages.md) --- diff --git a/docs/how-to-test-translations-locally.md b/docs/how-to-enable-new-languages.md similarity index 69% rename from docs/how-to-test-translations-locally.md rename to docs/how-to-enable-new-languages.md index e3a0902a9be799..1c136e8e5aa7b1 100644 --- a/docs/how-to-test-translations-locally.md +++ b/docs/how-to-enable-new-languages.md @@ -1,21 +1,63 @@ -# How to Test Translations Locally +# Deploying New Languages on `/learn` -> [!NOTE] -> This process is not required, but documented in case you would like to preview what your translations will look like. +Before you can release a new language, you will need to allow the languages to download from Crowdin. + +## Updating Crowdin Settings + +In the `Curriculum` and `Learn UI` projects, you will need to select `Project Settings` from the sidebar. Then scroll down to `Language Mapping`, where you will see an option to add custom language codes. Add a new entry for the language you are releasing, selecting `language` as the `Placeholder` value, and entering a URL-friendly lower-case spelling of your language's name for the `Custom code`. If you aren't sure what to use, reach out in our contributor chat and we will assist you. + +## Updating Workflows + +You will need to add a step to the `crowdin-download.client-ui.yml` and `crowdin-download.curriculum.yml`. The step for these will be the same. For example, if you want to enable Dothraki downloads: + +```yml +##### Download Dothraki ##### +- name: Crowdin Download Dothraki Translations + uses: crowdin/github-action@master + # options: https://github.com/crowdin/github-action/blob/master/action.yml + with: + # uploads + upload_sources: false + upload_translations: false + auto_approve_imported: false + import_eq_suggestions: false + + # downloads + download_translations: true + download_language: mis + skip_untranslated_files: false + export_only_approved: true + + push_translations: false + + # pull-request + create_pull_request: false + + # global options + config: './crowdin-config.yml' + base_url: ${{ secrets.CROWDIN_BASE_URL_FCC }} + + # Uncomment below to debug + # dryrun_action: true +``` -If you would like to test your translations on a local instance of the freeCodeCamp `/learn` site, first ensure you have [set up the codebase](how-to-setup-freecodecamp-locally.md). +Note that the `download_language` key needs to be set to the language code displayed on Crowdin. ## Enabling a Language +> [!NOTE] +> The above section with updating the workflows should be completed before proceeding - these need to be done in separate steps or the builds will fail. + There are a few steps to take in order to allow the codebase to build in your desired language. -First, visit the `config/i18n/all-langs.ts` file to add the language to the available languages list and configure the values. There are four objects here. +First, visit the `config/i18n/all-langs.ts` file to add the language to the available languages list and configure the values. There are several objects here. - `availableLangs`: For both the `client` and `curriculum` arrays, add the text name of the language. This is the value that will be used in the `.env` file later. - `auditedCerts`: Add the text name of the language as the _key_, and add an array of `SuperBlocks.{cert}` variables as the _value_. This tells the client which certifications are fully translated. - `i18nextCodes`: These are the ISO language codes for each language. You will need to add the appropriate ISO code for the language you are enabling. These do need to be unique for each language. - `LangNames`: These are the display names for the language selector in the navigation menu. - `LangCodes`: These are the language codes used for formatting dates and numbers. These should be Unicode CLDR codes instead of ISO codes. +- `hiddenLangs`: These languages will not be displayed in the navigation menu. This is used for languages that are not yet ready for release. As an example, if you wanted to enable Dothraki as a language, your `all-langs.js` objects should look like this: @@ -93,8 +135,13 @@ export enum LangCodes = { 'chinese-traditional': 'zh-Hant', dothraki: 'mis' }; + +export const hiddenLangs = ['dothraki']; ``` +> [!NOTE] +> When a language has been set up in the deployment pipeline AND has a public `/news` instance live, it can be removed from the `hiddenLangs` array and be made available to the public. + Next, open the `client/src/utils/algolia-locale-setup.ts` file. This data is used for the search bar that loads `/news` articles. While it is unlikely that you are going to test this functionality, missing the data for your language can lead to errors when attempting to build the codebase locally. Add an object for your language to the `algoliaIndices` object. You should use the the same values as the `english` object for local testing, replacing the `english` key with your language's `availableLangs` value. @@ -129,13 +176,6 @@ const algoliaIndices = { }; ``` -Finally, in your `.env` file, set `CLIENT_LOCALE` and `CURRICULUM_LOCALE` to your new language (use the `availableLangs` value.) - -```txt -CLIENT_LOCALE=dothraki -CURRICULUM_LOCALE=dothraki -``` - ### Releasing a Superblock After a superblock has been fully translated into a language, there are two steps to release it. First add the superblock enum to that language's `auditedCerts` array. So, if you want to release the new Responsive Web Design superblock for Dothraki, the array should look like this: @@ -149,9 +189,10 @@ export const auditedCerts = { SuperBlocks.JsAlgoDataStruct, SuperBlocks.FrontEndDevLibs ] +}; ``` -Finally, the `languagesWithAuditedBetaReleases` array should be updated to include the new language like this: +Finally, if the superblock is in a "new" state (that is, replacing a legacy superblock), the `languagesWithAuditedBetaReleases` array should be updated to include the new language like this: ```ts export const languagesWithAuditedBetaReleases: ['english', 'dothraki']; @@ -213,12 +254,29 @@ videoLocaleIds: Joi.when('challengeType', { }), ``` -## Loading Translations +## Client UI + +You will need to take an additional step to handle the client UI translations. + +The Crowdin workflows will automatically pull down _some_ of the UI translations, but there are a couple of files that need to be moved manually. + +You will want to copy the following files from `/client/i18n/locales/english` to `/client/i18n/locales/`, and apply translations as needed: + +- `links.json` +- `meta-tags.json` +- `motivation.json` +- `trending.json` + +## Testing Translations Locally + +If you would like to test translations locally, before adding them to our main repository - skip the Crowdin workflow changes. Follow the steps for enabling a language, then download the translations from Crowdin and load them into your local code. Because the language has not been approved for production, our scripts are not automatically downloading the translations yet. Only staff have the access to directly download the translations - you are welcome to reach out to us in our [contributors chat room](https://discord.gg/PRyKn3Vbay), or you can translate the English markdown files locally for testing purposes. Once you have the files, you will need to place them in the correct directory. For the curriculum challenges, you should place the certification folders (i.e. `01-responsive-web-design`) within the `curriculum/challenges/{lang}` directory. For our Dothraki translations, this would be `curriculum/challenges/dothraki`. The client translation `.json` files will go in the `client/i18n/locales/{lang}` directory. +Update your `.env` file to use your new language for `CLIENT_LOCALE` and `CURRICULUM_LOCALE`. + Once these are in place, you should be able to run `npm run develop` to view your translated version of freeCodeCamp. > [!ATTENTION] diff --git a/docs/language-lead-handbook.md b/docs/language-lead-handbook.md index c1d310fdd3c23a..ab37af5de294eb 100644 --- a/docs/language-lead-handbook.md +++ b/docs/language-lead-handbook.md @@ -66,7 +66,7 @@ This is an example of how part of the `trending.json` file has to look. } ``` -You will want to [build the translated client locally](how-to-test-translations-locally.md) to see if the titles have the right length. Each title must stay on a single line and not go to a new line. +You will want to [build the translated client locally](how-to-enable-new-languages.md) to see if the titles have the right length. Each title must stay on a single line and not go to a new line. ### How to update the trending articles in the cdn From 76bba16ac12d9f80a3689a0ce8c612359c3415d7 Mon Sep 17 00:00:00 2001 From: Brooke Date: Wed, 31 Aug 2022 16:46:28 -0700 Subject: [PATCH 005/129] TCA-43 #comment This PR replaces repplit for the build-a-25-5-clock lesson #time 5m --- .../build-a-25-5-clock.md | 1151 ++++++++++++++++- 1 file changed, 1148 insertions(+), 3 deletions(-) diff --git a/curriculum/challenges/english/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-25-5-clock.md b/curriculum/challenges/english/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-25-5-clock.md index ca80567a6198ca..29128537355e2e 100644 --- a/curriculum/challenges/english/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-25-5-clock.md +++ b/curriculum/challenges/english/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-25-5-clock.md @@ -1,7 +1,7 @@ --- id: bd7158d8c442eddfaeb5bd0f title: Build a 25 + 5 Clock -challengeType: 3 +challengeType: 14 forumTopicId: 301373 dashedName: build-a-25--5-clock --- @@ -70,10 +70,1155 @@ You can use any mix of HTML, JavaScript, CSS, Bootstrap, SASS, React, Redux, and **User Story #28:** The audio element with id of `beep` must stop playing and be rewound to the beginning when the element with the id of `reset` is clicked. -You can build your project by using this CodePen template and clicking `Save` to create your own pen. Or you can use this CDN link to run the tests in any environment you like: `https://cdn.freecodecamp.org/testable-projects-fcc/v1/bundle.js` +# --hints-- -Once you're done, submit the URL to your working project with all its tests passing. +You should have an element with `id="break-label"` that contains a string (e.g. "Break Length"). +```js +const breakTitle = document.getElementById('break-label'); +assert.isAbove( + breakTitle.innerText.length, + 0, + 'Element does not contain a string' +); +``` + +You should have an element with `id="session-label"` that contains a string (e.g. "Session Length"). + +```js +const sessionTitle = document.getElementById('session-label'); +assert.isAbove( + sessionTitle.innerText.length, + 0, + 'Element does not contain a string' +); +``` + +You should have two clickable elements with corresponding IDs: `id="break-decrement"` and `id="session-decrement"`. + +```js +assert.isNotNull(document.getElementById('break-decrement')); +assert.isNotNull(document.getElementById('session-decrement')); +``` + +You should have two clickable elements with corresponding IDs: `id="break-increment"` and `id="session-increment"`. + +```js +assert.isNotNull(document.getElementById('break-increment')); +assert.isNotNull(document.getElementById('session-increment')); +``` + +You should have an element with a corresponding `id="break-length"`, which by default (on load) displays a value of 5. + +```js +const breakLength = document.getElementById('break-length'); +assert.strictEqual( + breakLength.nodeName.toLowerCase() === 'input' + ? breakLength.value + : breakLength.innerText, + '5', + 'A value of 5 is not displayed by default' +); +``` + +You should have an element with a corresponding `id="session-length"`, which by default displays a value of 25. + +```js +const sessionLength = document.getElementById('session-length'); +assert.strictEqual( + sessionLength.nodeName.toLowerCase() === 'input' + ? sessionLength.value + : sessionLength.innerText, + '25', + 'A value of 25 is not displayed by default' +); +``` + +You should have an element with a corresponding `id="timer-label"`, that contains a string indicating a session is initialized (e.g. "Session"). + +```js +const timerLabel = document.getElementById('timer-label'); +assert.isAbove( + timerLabel.innerText.length, + 0, + 'Element does not contain a string' +); +``` + +You should have an element with corresponding `id="time-left"`. NOTE: Paused or running, the value in this field should always be displayed in `mm:ss` format (i.e. 25:00). + +```js +(async () => { + const timeout = (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds)); + + const timerRe = new RegExp(/^(\d{2,4})[\.:,\/](\d{2})$/); + const target = document.getElementById('time-left'); + assert.isNotNull(target); + assert.strictEqual( + timerRe.exec(target.innerText)[1], + '25', + 'time-left is not formatted correctly' + ); + // Set session length to 60 + Array(35).fill('session-increment').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } + }); + // wait for 1.5 seconds to allow any re-renders to catch up + await timeout(1500); + assert.strictEqual( + timerRe.exec(target.innerText)[1], + '60', + 'time-left is not formatted correctly' + ); +})(); +``` + +You should have a clickable element with a corresponding `id="start_stop"`. + +```js +assert.isNotNull(document.getElementById('start_stop')); +``` + +You should have a clickable element with a corresponding `id="reset"`. + +```js +assert.isNotNull(document.getElementById('reset')); +``` + +When I click the element with the id of `reset`, any running timer should be stopped, the value within `id="break-length"` should return to `5`, the value within `id="session-length"` should return to 25, and the element with `id="time-left"` should reset to its default state. + +```js +(async () => { + const timeout = (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds)); + + const timeLeftElement = document.getElementById('time-left'); + + const savedSetTimeout = window.setTimeout; + const savedSetInterval = window.setInterval; + window.setTimeout = (fun) => { + return savedSetTimeout(fun, 30); + }; + window.setInterval = (fun) => { + return savedSetInterval(fun, 30); + }; + + // decrement session and break length + Array(60).fill('session-decrement').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } + }); + Array(60).fill('break-decrement').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } + }); + // start the 25 + 5 clock + Array.of('start_stop').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } + }); + + // wait while timer reaches 00:00 + await new Promise((resolve, reject) => { + var observer = new MutationObserver(() => { + if (/^00[\.:,\/]00$/.test(timeLeftElement.innerText)) { + observer.disconnect(); + resolve(); + } + }); + // pass in the timeLeftElement node, as well as the observer options + observer.observe(timeLeftElement, { + childList: true, + characterData: true, + subtree: true + }); + }); + + window.setTimeout = savedSetTimeout; + window.setInterval = savedSetInterval; + + // once timer has reached zero wait 1.5 seconds then reset and + // see if every default value is reset + await timeout(1500); + + Array.of('reset').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } + }); + const timerLabelAfterReset = + document.getElementById('timer-label').innerText; + const timerRe = new RegExp(/^(\d{2,4})[\.:,\/](\d{2})$/); + const secondsAfterReset = timerRe.exec( + document.getElementById('time-left').innerText + )[2]; + + // see if timer label changed back + assert.strictEqual( + timerLabelAfterReset, + document.getElementById('timer-label') && + document.getElementById('timer-label').innerText, + 'Default timer label was not properly reset ' + ); + + // wait another 1.5 seconds to be sure value has not changed + // (25 + 5 clock is stopped) + await timeout(1500); + + const breakLengthElement = document.getElementById('break-length'); + assert.strictEqual( + breakLengthElement.nodeName.toLowerCase() === 'input' + ? breakLengthElement.value + : breakLengthElement.innerText, + '5', + 'Default values for break length were not properly reset' + ); + + const sessionLengthElement = document.getElementById('session-length'); + assert.strictEqual( + sessionLengthElement.nodeName.toLowerCase() === 'input' + ? sessionLengthElement.value + : sessionLengthElement.innerText, + '25', + 'Default values for session length were not properly reset' + ); + + const secondsAfterAWhile = timerRe.exec( + document.getElementById('time-left').innerText + )[2]; + + assert.strictEqual( + secondsAfterAWhile, + secondsAfterReset, + '25 + 5 has paused but time continued elapsing' + ); +})(); +``` + +When I click the element with the id of `break-decrement`, the value within `id="break-length"` decrements by a value of 1, and I can see the updated value. + +```js +Array(4).fill('break-decrement').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } +}); +const breakLengthElement = document.getElementById('break-length'); +assert.strictEqual( + breakLengthElement.nodeName.toLowerCase() === 'input' + ? breakLengthElement.value + : breakLengthElement.innerText, + '1' +); +Array.of('reset').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } +}); +Array.of('break-decrement').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } +}); +assert.strictEqual( + breakLengthElement.nodeName.toLowerCase() === 'input' + ? breakLengthElement.value + : breakLengthElement.innerText, + '4' +); +``` + +When I click the element with the id of `break-increment`, the value within `id="break-length"` increments by a value of 1, and I can see the updated value. + +```js +Array(4).fill('break-increment').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } +}); +const breakLengthElement = document.getElementById('break-length'); +assert.strictEqual( + breakLengthElement.nodeName.toLowerCase() === 'input' + ? breakLengthElement.value + : breakLengthElement.innerText, + '8' +); +Array.of('reset').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } +}); +Array.of('break-increment').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } +}); +assert.strictEqual( + breakLengthElement.nodeName.toLowerCase() === 'input' + ? breakLengthElement.value + : breakLengthElement.innerText, + '6' +); +``` + +When I click the element with the id of `session-decrement`, the value within `id="session-length"` decrements by a value of 1, and I can see the updated value. + +```js +Array(4).fill('session-decrement').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } +}); +const sessionLengthElement = document.getElementById('session-length'); +assert.strictEqual( + sessionLengthElement.nodeName.toLowerCase() === 'input' + ? sessionLengthElement.value + : sessionLengthElement.innerText, + '21' +); +Array.of('reset').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } +}); +Array.of('session-decrement').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } +}); +assert.strictEqual( + sessionLengthElement.nodeName.toLowerCase() === 'input' + ? sessionLengthElement.value + : sessionLengthElement.innerText, + '24' +); +``` + +When I click the element with the id of `session-increment`, the value within `id="session-length"` increments by a value of 1, and I can see the updated value. + +```js +Array(4).fill('session-increment').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } +}); +const sessionLengthElement = document.getElementById('session-length'); +assert.strictEqual( + sessionLengthElement.nodeName.toLowerCase() === 'input' + ? sessionLengthElement.value + : sessionLengthElement.innerText, + '28' +); +Array.of('reset').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } +}); +Array.of('session-increment').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } +}); +assert.strictEqual( + sessionLengthElement.nodeName.toLowerCase() === 'input' + ? sessionLengthElement.value + : sessionLengthElement.innerText, + '26' +); +``` + +I should not be able to set a session or break length to <= 0. + +```js +Array(10).fill('break-decrement').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } +}); +const breakLengthElement = document.getElementById('break-length'); +assert.strictEqual( + breakLengthElement.nodeName.toLowerCase() === 'input' + ? breakLengthElement.value + : breakLengthElement.innerText, + '1', + 'Value in element with id of "break-length" is less than 1.' +); +Array.of('reset').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } +}); +Array(30).fill('session-decrement').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } +}); +const sessionLengthElement = document.getElementById('session-length'); +assert.strictEqual( + sessionLengthElement.nodeName.toLowerCase() === 'input' + ? sessionLengthElement.value + : sessionLengthElement.innerText, + '1', + 'Value in element with id of "session-length" is less than 1.' +); +``` + +I should not be able to set a session or break length to > 60. + +```js +Array(60).fill('break-increment').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } +}); +const breakLengthElement = document.getElementById('break-length'); +assert.strictEqual( + breakLengthElement.nodeName.toLowerCase() === 'input' + ? breakLengthElement.value + : breakLengthElement.innerText, + '60', + 'Value in element with id of "break-length" is greater than 60.' +); +Array.of('reset').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } +}); +Array(40).fill('session-increment').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } +}); +const sessionLengthElement = document.getElementById('session-length'); +assert.strictEqual( + sessionLengthElement.nodeName.toLowerCase() === 'input' + ? sessionLengthElement.value + : sessionLengthElement.innerText, + '60', + 'Value in element with id of "session-length" is greater than 60.' +); +``` + +When I first click the element with `id="start_stop"`, the timer should begin running from the value currently displayed in `id="session-length"`, even if the value has been incremented or decremented from the original value of 25. + +```js +Array.of('start_stop').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } +}); +const timerRe = new RegExp(/^(\d{2,4})[\.:,\/](\d{2})$/); +const sessionLengthElement = document.getElementById('session-length'); +assert.strictEqual( + timerRe.exec(document.getElementById('time-left').innerText)[1], + sessionLengthElement.nodeName.toLowerCase() === 'input' + ? sessionLengthElement.value + : sessionLengthElement.innerText +); + +// stop the 25 + 5 clock +Array.of('start_stop').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } +}); +``` + +If the timer is running, the element with the id of `time-left` should display the remaining time in `mm:ss` format (decrementing by a value of 1 and updating the display every 1000ms). + +```js +(async () => { + const timeout = (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds)); + + // start the 25 + 5 clock + Array.of('start_stop').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } + }); + + await timeout(2500); + + const timerRe = new RegExp(/^(\d{2,4})[\.:,\/](\d{2})$/); + const secondsBefore = timerRe.exec( + document.getElementById('time-left').innerText + )[2]; + + // wait 1.5 seconds then see if displayed time has changed + // (decremented) + await timeout(1500); + + const secondsAfter = timerRe.exec( + document.getElementById('time-left').innerText + )[2]; + + assert.isAbove( + +secondsBefore, + +secondsAfter, + '25 + 5 clock has started but time displayed is not changing ' + ); + + // stop the 25 + 5 clock + Array.of('start_stop').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } + }); +})(); +``` + +If the timer is running and I click the element with `id="start_stop"`, the countdown should pause. + +```js +(async () => { + const timeout = (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds)); + + // start the 25 + 5 clock + Array.of('start_stop').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } + }); + + const timerRe = new RegExp(/^(\d{2,4})[\.:,\/](\d{2})$/); + const secondsBefore = timerRe.exec( + document.getElementById('time-left').innerText + )[2]; + + // wait 1.5 seconds then see if displayed time has changed + await timeout(1500); + + const secondsAfter = timerRe.exec( + document.getElementById('time-left').innerText + )[2]; + + assert.notStrictEqual( + secondsAfter, + secondsBefore, + '25 + 5 has started but time displayed is not changing' + ); + + // Pause the 25 + 5 clock + Array.of('start_stop').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } + }); + + // wait another 1.5 seconds to be sure value has not changed + await timeout(1500); + + const secondsAfterPause = timerRe.exec( + document.getElementById('time-left').innerText + )[2]; + + assert.strictEqual( + secondsAfterPause, + secondsAfter, + '25 + 5 clock has paused but time continued elapsing' + ); +})(); +``` + +If the timer is paused and I click the element with `id="start_stop"`, the countdown should resume running from the point at which it was paused. + +```js +(async () => { + const timeout = (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds)); + + // start the 25 + 5 clock + Array.of('start_stop').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } + }); + + const timerRe = new RegExp(/^(\d{2,4})[\.:,\/](\d{2})$/); + const secondsBefore = timerRe.exec( + document.getElementById('time-left').innerText + )[2]; + + // wait 1.5 seconds then see if displayed time has changed + await timeout(1500); + + const secondsAfter = timerRe.exec( + document.getElementById('time-left').innerText + )[2]; + + assert.notStrictEqual( + secondsAfter, + secondsBefore, + '25 + 5 clock has started but time displayed is not changing' + ); + + // Pause the 25 + 5 clock + Array.of('start_stop').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } + }); + + // wait another 1.5 seconds to be sure value has not changed + await timeout(1500); + + const secondsAfterPause = timerRe.exec( + document.getElementById('time-left').innerText + )[2]; + + assert.strictEqual( + secondsAfterPause, + secondsAfter, + '25 + 5 clock has paused but time continued elapsing' + ); + + // Resume the 25 + 5 clock + Array.of('start_stop').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } + }); + + // wait another 1.5 seconds to be sure time is decrementing again + await timeout(1500); + + const secondsAfterResume = timerRe.exec( + document.getElementById('time-left').innerText + )[2]; + + assert.isBelow( + +secondsAfterResume, + +secondsAfterPause, + '25 + 5 clock has resumed but displayed time is not changing ' + ); + + // stop the 25 + 5 clock + Array.of('start_stop').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } + }); +})(); +``` + +When a session countdown reaches zero (NOTE: timer MUST reach 00:00), and a new countdown begins, the element with the id of `timer-label` should display a string indicating a break has begun. + +```js +(async () => { + const timeout = (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds)); + + const timeLeftElement = document.getElementById('time-left'); + const timerLabelElement = document.getElementById('timer-label'); + + Array.of('reset').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } + }); + + const savedSetTimeout = window.setTimeout; + const savedSetInterval = window.setInterval; + window.setTimeout = (fun) => { + return savedSetTimeout(fun, 30); + }; + window.setInterval = (fun) => { + return savedSetInterval(fun, 30); + }; + + // we decrement session time to the minimum (1 minute) + Array(60).fill('session-decrement').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } + }); + // start the 25 + 5 clock + Array.of('start_stop').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } + }); + + let tLabelA = timerLabelElement.innerHTML; + + // wait while timer reaches 00:00 + await new Promise((resolve, reject) => { + var observer = new MutationObserver(() => { + if (/^00[\.:,\/]00$/.test(timeLeftElement.innerText)) { + observer.disconnect(); + resolve(); + } + }); + // pass in the timeLeftElement node, as well as the observer options + observer.observe(timeLeftElement, { + childList: true, + characterData: true, + subtree: true + }); + }); + + await timeout(1500); + + const breakLengthElement = document.getElementById('break-length'); + const breakLength = +(breakLengthElement.nodeName.toLowerCase() === 'input' + ? breakLengthElement.value + : breakLengthElement.innerText); + const timerRe = new RegExp(/^(\d{2,4})[\.:,\/](\d{2})$/); + const breakTime = +timerRe.exec( + document.getElementById('time-left').innerText + )[1]; + assert.isAtMost( + breakTime, + breakLength, + "Break time didn't start with the correct value." + ); + + let tLabelB = timerLabelElement.innerHTML; + + assert.notStrictEqual( + tLabelB, + tLabelA, + "Timer has reached zero but didn't switch to Break time" + ); +})(); +``` + +When a session countdown reaches zero (NOTE: timer MUST reach 00:00), a new break countdown should begin, counting down from the value currently displayed in the `id="break-length"` element. + +```js +(async () => { + const timeout = (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds)); + + const timeLeftElement = document.getElementById('time-left'); + const timerLabelElement = document.getElementById('timer-label'); + + Array.of('reset').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } + }); + + const savedSetTimeout = window.setTimeout; + const savedSetInterval = window.setInterval; + window.setTimeout = (fun) => { + return savedSetTimeout(fun, 30); + }; + window.setInterval = (fun) => { + return savedSetInterval(fun, 30); + }; + + // we decrement session time to the minimum (1 minute) + Array(60).fill('session-decrement').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } + }); + // start the 25 + 5 clock + Array.of('start_stop').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } + }); + + let tLabelA = timerLabelElement.innerHTML; + + // wait while timer reaches 00:00 + await new Promise((resolve, reject) => { + var observer = new MutationObserver(() => { + if (/^00[\.:,\/]00$/.test(timeLeftElement.innerText)) { + observer.disconnect(); + resolve(); + } + }); + // pass in the timeLeftElement node, as well as the observer options + observer.observe(timeLeftElement, { + childList: true, + characterData: true, + subtree: true + }); + }); + + // wait while timer label switches + await new Promise((resolve, reject) => { + var observer = new MutationObserver(() => { + observer.disconnect(); + resolve(); + }); + // pass in the timeLeftElement node, as well as the observer options + observer.observe(timerLabelElement, { + childList: true, + characterData: true, + subtree: true + }); + }); + + const tLabelB = timerLabelElement.innerHTML; + + assert.notStrictEqual( + tLabelB, + tLabelA, + "Timer has reached zero but didn't switch to Break time" + ); + + const breakLengthElement = document.getElementById('break-length'); + const breakLength = +(breakLengthElement.nodeName.toLowerCase() === 'input' + ? breakLengthElement.value + : breakLengthElement.innerText); + const timerRe = new RegExp(/^(\d{2,4})[\.:,\/](\d{2})$/); + const breakTime = +timerRe.exec( + document.getElementById('time-left').innerText + )[1]; + assert.strictEqual( + breakTime, + breakLength, + "Timer has switched to Break time, but it didn't start with " + + 'the correct value.' + ); + + // stop the 25 + 5 clock + Array.of('start_stop').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } + }); +})(); +``` + +When a break countdown reaches zero (NOTE: timer MUST reach 00:00), and a new countdown begins, the element with the id of `timer-label` should display a string indicating a session has begun. + +```js +(async () => { + const timeout = (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds)); + + const timeLeftElement = document.getElementById('time-left'); + const timerLabelElement = document.getElementById('timer-label'); + + const savedSetTimeout = window.setTimeout; + const savedSetInterval = window.setInterval; + window.setTimeout = (fun) => { + return savedSetTimeout(fun, 30); + }; + window.setInterval = (fun) => { + return savedSetInterval(fun, 30); + }; + + // decrement session length and break length to the minimum (1 minute) + Array(60).fill('session-decrement').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } + }); + Array(60).fill('break-decrement').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } + }); + // start the 25 + 5 clock + Array.of('start_stop').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } + }); + + const breakLabel = timerLabelElement.innerHTML; + + // wait while timer reaches 00:00 + await new Promise((resolve, reject) => { + var observer = new MutationObserver(() => { + if (/^00[\.:,\/]00$/.test(timeLeftElement.innerText)) { + observer.disconnect(); + resolve(); + } + }); + // pass in the timeLeftElement node, as well as the observer options + observer.observe(timeLeftElement, { + childList: true, + characterData: true, + subtree: true + }); + }); + + await timeout(1500); + + const sessionLabel = timerLabelElement.innerHTML; + + assert.notStrictEqual( + sessionLabel, + breakLabel, + "Timer has reached zero but didn't switch back to Session time." + ); + + // stop the 25 + 5 clock + Array.of('start_stop').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } + }); +})(); +``` + +When a break countdown reaches zero (NOTE: timer MUST reach 00:00), a new session countdown should begin, counting down from the value currently displayed in the `id="session-length"` element. + +```js +(async () => { + const timeout = (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds)); + + const timeLeftElement = document.getElementById('time-left'); + const timerLabelElement = document.getElementById('timer-label'); + + const savedSetTimeout = window.setTimeout; + const savedSetInterval = window.setInterval; + window.setTimeout = (fun) => { + return savedSetTimeout(fun, 30); + }; + window.setInterval = (fun) => { + return savedSetInterval(fun, 30); + }; + + // decrement session length and break length to the minimum (1 minute) + Array(60).fill('session-decrement').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } + }); + Array(60).fill('break-decrement').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } + }); + // start the 25 + 5 clock + Array.of('start_stop').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } + }); + + // wait while timer reaches 00:00 + await new Promise((resolve, reject) => { + var observer = new MutationObserver(() => { + if (/^00[\.:,\/]00$/.test(timeLeftElement.innerText)) { + observer.disconnect(); + resolve(); + } + }); + // pass in the timeLeftElement node, as well as the observer options + observer.observe(timeLeftElement, { + childList: true, + characterData: true, + subtree: true + }); + }); + + // wait while timer label switches + await new Promise((resolve, reject) => { + var observer = new MutationObserver(() => { + observer.disconnect(); + resolve(); + }); + // pass in the timeLeftElement node, as well as the observer options + observer.observe(timerLabelElement, { + childList: true, + characterData: true, + subtree: true + }); + }); + + let tLabelA = timerLabelElement.innerHTML; + + // wait while timer reaches 00:00 + await new Promise((resolve, reject) => { + var observer = new MutationObserver(() => { + if (/^00[\.:,\/]00$/.test(timeLeftElement.innerText)) { + observer.disconnect(); + resolve(); + } + }); + // pass in the timeLeftElement node, as well as the observer options + observer.observe(timeLeftElement, { + childList: true, + characterData: true, + subtree: true + }); + }); + + // wait while timer label switches + await new Promise((resolve, reject) => { + var observer = new MutationObserver(() => { + observer.disconnect(); + resolve(); + }); + // pass in the timeLeftElement node, as well as the observer options + observer.observe(timerLabelElement, { + childList: true, + characterData: true, + subtree: true + }); + }); + + const tLabelB = timerLabelElement.innerHTML; + + assert.notStrictEqual( + tLabelB, + tLabelA, + "Timer has reached zero but didn't switch to Session time" + ); + + const sessionLengthElement = document.getElementById('session-length'); + const sessionLength = +(sessionLengthElement.nodeName.toLowerCase() === 'input' + ? sessionLengthElement.value + : sessionLengthElement.innerText); + const timerRe = new RegExp(/^(\d{2,4})[\.:,\/](\d{2})$/); + const currentTime = +timerRe.exec( + document.getElementById('time-left').innerText + )[1]; + assert.strictEqual( + currentTime, + sessionLength, + 'Timer has switched back to Session time, but it ' + + "didn't start with the correct value." + ); + + // stop the 25 + 5 clock + Array.of('start_stop').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } + }); +})(); +``` + +When a countdown reaches zero (NOTE: timer MUST reach 00:00), a sound indicating that time is up should play. This should utilize an HTML5 `audio` tag and have a corresponding `id="beep"`. + +```js +(async () => { + const timeout = (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds)); + + const timeLeftElement = document.getElementById('time-left'); + + assert.isNotNull( + document.querySelector('audio#beep'), + 'There is no audio tag with ID "beep" on the page.' + ); + + const savedSetTimeout = window.setTimeout; + const savedSetInterval = window.setInterval; + window.setTimeout = (fun) => { + return savedSetTimeout(fun, 30); + }; + window.setInterval = (fun) => { + return savedSetInterval(fun, 30); + }; + + // decrement session time to the minimum (1 minute) + Array(60).fill('session-decrement').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } + }); + // start the 25 + 5 clock + Array.of('start_stop').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } + }); + + // wait while timer reaches 00:00 + await new Promise((resolve, reject) => { + var observer = new MutationObserver(() => { + if (/^00[\.:,\/]00$/.test(timeLeftElement.innerText)) { + observer.disconnect(); + resolve(); + } + }); + // pass in the timeLeftElement node, as well as the observer options + observer.observe(timeLeftElement, { + childList: true, + characterData: true, + subtree: true + }); + }); + + await timeout(1500); + + window.setTimeout = savedSetTimeout; + window.setInterval = savedSetInterval; + + await timeout(200); + + assert.isFalse( + document.getElementById('beep').paused, + 'Timer has reached zero but audio is not playing while it should.' + ); +})(); +``` + +The audio element with `id="beep"` must be 1 second or longer. + +```js +(async () => { + const audio = document.querySelector('audio#beep'); + assert.isNotNull( + audio, + 'There is no audio tag with ID "beep" on the page.' + ); + + if (audio.readyState === 0) { + // Wait for the audio to load. + await new Promise((resolve) => { + const listener = audio.addEventListener('loadeddata', () => { + if (audio.readyState > 0) { + audio.removeEventListener('loadeddata', listener); + resolve(); + } + }); + }); + } + + assert.isAbove( + document.getElementById('beep').duration, + 1, + 'Audio element with id="beep" is not at least 1 second long.' + ); +})(); +``` + +The audio element with id of `beep` must stop playing and be rewound to the beginning when the element with the id of `reset` is clicked. + +```js +// Call document.getElementById('beep') each time to overcome framework cache +document.getElementById('beep').play(); +Array.of('reset').map((buttonId) => document.getElementById(buttonId)).forEach((key) => { + if (key && typeof key.click === 'function') { + key.click(); + } +}); + +assert.isTrue( + document.getElementById('beep').paused, + 'Audio element was not stopped when reset was clicked.' +); + +assert.strictEqual( + document.getElementById('beep').currentTime, + 0, + 'Audio element was not rewound when reset was clicked. HINT: use ' + + 'the currentTime property of the audio element to rewind.' +); +``` + +# --seed-- + +## --seed-contents-- + +```html + +``` + +```css + +``` # --solutions-- From df0e9dfbc1490a0ff2df21a5a1736c5fd1a7dcb1 Mon Sep 17 00:00:00 2001 From: camperbot Date: Fri, 2 Sep 2022 00:02:36 +0530 Subject: [PATCH 006/129] chore(i18n,learn): processed translations (#47421) --- .../build-a-product-landing-page.md | 467 ++++++++++++++++++ .../5f3c866d0fc037f7311b4ac8.md | 107 ++++ .../5f3c866d28d7ad0de6470505.md | 100 ++++ .../5f3c866d5414453fc2d7b480.md | 128 +++++ .../5f3c866daec9a49519871816.md | 88 ++++ .../60f80e0081e0f2052ae5b505.md | 12 +- .../60f81167d0d4910809f88945.md | 12 +- .../60f81616cff80508badf9ad5.md | 12 +- .../60f83e7bfc09900959f41e20.md | 12 +- .../60f84ec41116b209c280ba91.md | 12 +- .../60f852f645b5310a8264f555.md | 12 +- .../60f85a62fb30c80bcea0cedb.md | 12 +- .../60f8604682407e0d017bbf7f.md | 12 +- .../60f8618d191b940d62038513.md | 12 +- .../60fab4a123ce4b04526b082b.md | 12 +- .../60fab8367d35de04e5cb7929.md | 18 +- .../60fab9f17fa294054b74228c.md | 21 +- .../60fabf0dd4959805dbae09e6.md | 20 +- .../60fac4095512d3066053d73c.md | 23 +- .../60fac56271087806def55b33.md | 25 +- .../60fac8d7fdfaee0796934f20.md | 23 +- .../60faca286cb48b07f6482970.md | 23 +- .../60facde2d0dc61085b41063f.md | 23 +- .../60facf914c7b9b08d7510c2c.md | 33 +- .../60fad0a812d9890938524f50.md | 33 +- .../60fad1cafcde010995e15306.md | 35 +- .../60fad6dfcc0d930a59becf12.md | 33 +- .../60fad8e6148f310bba7890b1.md | 33 +- .../60fad99e09f9d30c1657e790.md | 33 +- .../60fadb18058e950c73925279.md | 33 +- .../60fadce90f85c50d0bb0dd4f.md | 33 +- .../60fadd972e6ffe0d6858fa2d.md | 33 +- .../60fadfa2b540b70dcfa8b771.md | 33 +- .../60fc219d333e37046f474a6e.md | 33 +- .../60fc22d1e64d1b04cdd4e602.md | 33 +- .../60fc236dc04532052926fdac.md | 33 +- .../60ffe1bc30415f042faea936.md | 33 +- .../60ffe3936796ac04959285a9.md | 33 +- .../60ffe4f4ec18cd04dc470c56.md | 33 +- .../60ffe69ee377c6055e192a46.md | 33 +- .../60ffe7d8aae62c05bcc9e7eb.md | 33 +- .../60ffe8a5ceb0e90618db06d9.md | 33 +- .../60ffe947a868ec068f7850f6.md | 33 +- .../60ffe9cb47809106eda2f2c9.md | 33 +- .../60ffec2825da1007509ddd06.md | 33 +- .../60ffecefac971607ae73c60f.md | 33 +- .../60ffefd6479a3d084fb77cbc.md | 62 ++- .../62b30924c5e4ef0daba23b5e.md | 33 +- .../62ff8b9dab5ac88e4d3d43a3.md | 109 ++++ .../62ff8e998d3e7eae14d6ae3b.md | 102 ++++ .../62ff919a7b5612c0670923a5.md | 131 +++++ .../612ebcba99bfa46a15370b11.md | 14 +- .../5dfb6250eacea3f48c6300b2.md | 94 ++++ .../5dfb655eeacea3f48c6300b3.md | 76 +++ .../5f0d48e7b435f13ab6550051.md | 105 ++++ .../5f0d4d04b435f13ab6550053.md | 114 +++++ .../5f1a89f1190aff21ae42105a.md | 106 ++++ .../62bb4009e3458a128ff57d5d.md | 166 +++++++ .../60eebd07ea685b0e777b5583.md | 52 ++ .../60f027099a15b00485563dd2.md | 54 ++ .../60f1a5e2d2c23707a4f9a660.md | 52 ++ .../iterate-with-javascript-while-loops.md | 2 +- .../60f80e0081e0f2052ae5b505.md | 12 +- .../60f81167d0d4910809f88945.md | 12 +- .../60f81616cff80508badf9ad5.md | 12 +- .../60f83e7bfc09900959f41e20.md | 12 +- .../60f84ec41116b209c280ba91.md | 12 +- .../60f852f645b5310a8264f555.md | 12 +- .../60f85a62fb30c80bcea0cedb.md | 12 +- .../60f8604682407e0d017bbf7f.md | 12 +- .../60f8618d191b940d62038513.md | 12 +- .../60fab4a123ce4b04526b082b.md | 12 +- .../60fab8367d35de04e5cb7929.md | 18 +- .../60fab9f17fa294054b74228c.md | 21 +- .../60fabf0dd4959805dbae09e6.md | 20 +- .../60fac4095512d3066053d73c.md | 23 +- .../60fac56271087806def55b33.md | 25 +- .../60fac8d7fdfaee0796934f20.md | 23 +- .../60faca286cb48b07f6482970.md | 23 +- .../60facde2d0dc61085b41063f.md | 23 +- .../60facf914c7b9b08d7510c2c.md | 33 +- .../60fad0a812d9890938524f50.md | 33 +- .../60fad1cafcde010995e15306.md | 35 +- .../60fad6dfcc0d930a59becf12.md | 33 +- .../60fad8e6148f310bba7890b1.md | 33 +- .../60fad99e09f9d30c1657e790.md | 33 +- .../60fadb18058e950c73925279.md | 33 +- .../60fadce90f85c50d0bb0dd4f.md | 33 +- .../60fadd972e6ffe0d6858fa2d.md | 33 +- .../60fadfa2b540b70dcfa8b771.md | 33 +- .../60fc219d333e37046f474a6e.md | 33 +- .../60fc22d1e64d1b04cdd4e602.md | 33 +- .../60fc236dc04532052926fdac.md | 33 +- .../60ffe1bc30415f042faea936.md | 33 +- .../60ffe3936796ac04959285a9.md | 33 +- .../60ffe4f4ec18cd04dc470c56.md | 33 +- .../60ffe69ee377c6055e192a46.md | 33 +- .../60ffe7d8aae62c05bcc9e7eb.md | 33 +- .../60ffe8a5ceb0e90618db06d9.md | 33 +- .../60ffe947a868ec068f7850f6.md | 33 +- .../60ffe9cb47809106eda2f2c9.md | 33 +- .../60ffec2825da1007509ddd06.md | 33 +- .../60ffecefac971607ae73c60f.md | 33 +- .../60ffefd6479a3d084fb77cbc.md | 62 ++- .../62b30924c5e4ef0daba23b5e.md | 33 +- .../62ff8b9dab5ac88e4d3d43a3.md | 109 ++++ .../62ff8e998d3e7eae14d6ae3b.md | 102 ++++ .../62ff919a7b5612c0670923a5.md | 131 +++++ .../612ebcba99bfa46a15370b11.md | 14 +- ...call-out-optional-actions-with-btn-info.md | 2 +- .../60f80e0081e0f2052ae5b505.md | 12 +- .../60f81167d0d4910809f88945.md | 12 +- .../60f81616cff80508badf9ad5.md | 12 +- .../60f83e7bfc09900959f41e20.md | 12 +- .../60f84ec41116b209c280ba91.md | 12 +- .../60f852f645b5310a8264f555.md | 12 +- .../60f85a62fb30c80bcea0cedb.md | 12 +- .../60f8604682407e0d017bbf7f.md | 12 +- .../60f8618d191b940d62038513.md | 12 +- .../60fab4a123ce4b04526b082b.md | 12 +- .../60fab8367d35de04e5cb7929.md | 18 +- .../60fab9f17fa294054b74228c.md | 21 +- .../60fabf0dd4959805dbae09e6.md | 20 +- .../60fac4095512d3066053d73c.md | 23 +- .../60fac56271087806def55b33.md | 25 +- .../60fac8d7fdfaee0796934f20.md | 23 +- .../60faca286cb48b07f6482970.md | 23 +- .../60facde2d0dc61085b41063f.md | 23 +- .../60facf914c7b9b08d7510c2c.md | 33 +- .../60fad0a812d9890938524f50.md | 33 +- .../60fad1cafcde010995e15306.md | 35 +- .../60fad6dfcc0d930a59becf12.md | 33 +- .../60fad8e6148f310bba7890b1.md | 33 +- .../60fad99e09f9d30c1657e790.md | 33 +- .../60fadb18058e950c73925279.md | 33 +- .../60fadce90f85c50d0bb0dd4f.md | 33 +- .../60fadd972e6ffe0d6858fa2d.md | 33 +- .../60fadfa2b540b70dcfa8b771.md | 33 +- .../60fc219d333e37046f474a6e.md | 33 +- .../60fc22d1e64d1b04cdd4e602.md | 33 +- .../60fc236dc04532052926fdac.md | 33 +- .../60ffe1bc30415f042faea936.md | 33 +- .../60ffe3936796ac04959285a9.md | 33 +- .../60ffe4f4ec18cd04dc470c56.md | 33 +- .../60ffe69ee377c6055e192a46.md | 33 +- .../60ffe7d8aae62c05bcc9e7eb.md | 33 +- .../60ffe8a5ceb0e90618db06d9.md | 33 +- .../60ffe947a868ec068f7850f6.md | 33 +- .../60ffe9cb47809106eda2f2c9.md | 33 +- .../60ffec2825da1007509ddd06.md | 33 +- .../60ffecefac971607ae73c60f.md | 33 +- .../60ffefd6479a3d084fb77cbc.md | 62 ++- .../62b30924c5e4ef0daba23b5e.md | 33 +- .../62ff8b9dab5ac88e4d3d43a3.md | 109 ++++ .../62ff8e998d3e7eae14d6ae3b.md | 102 ++++ .../62ff919a7b5612c0670923a5.md | 131 +++++ .../612ebcba99bfa46a15370b11.md | 14 +- 157 files changed, 4456 insertions(+), 1781 deletions(-) create mode 100644 curriculum/challenges/german/14-responsive-web-design-22/build-a-product-landing-page-project/build-a-product-landing-page.md create mode 100644 curriculum/challenges/german/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3c866d0fc037f7311b4ac8.md create mode 100644 curriculum/challenges/german/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3c866d28d7ad0de6470505.md create mode 100644 curriculum/challenges/german/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3c866d5414453fc2d7b480.md create mode 100644 curriculum/challenges/german/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3c866daec9a49519871816.md create mode 100644 curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8b9dab5ac88e4d3d43a3.md create mode 100644 curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8e998d3e7eae14d6ae3b.md create mode 100644 curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff919a7b5612c0670923a5.md create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfb6250eacea3f48c6300b2.md create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfb655eeacea3f48c6300b3.md create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f0d48e7b435f13ab6550051.md create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f0d4d04b435f13ab6550053.md create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f1a89f1190aff21ae42105a.md create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/62bb4009e3458a128ff57d5d.md create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60eebd07ea685b0e777b5583.md create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f027099a15b00485563dd2.md create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f1a5e2d2c23707a4f9a660.md create mode 100644 curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8b9dab5ac88e4d3d43a3.md create mode 100644 curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8e998d3e7eae14d6ae3b.md create mode 100644 curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff919a7b5612c0670923a5.md create mode 100644 curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8b9dab5ac88e4d3d43a3.md create mode 100644 curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8e998d3e7eae14d6ae3b.md create mode 100644 curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff919a7b5612c0670923a5.md diff --git a/curriculum/challenges/german/14-responsive-web-design-22/build-a-product-landing-page-project/build-a-product-landing-page.md b/curriculum/challenges/german/14-responsive-web-design-22/build-a-product-landing-page-project/build-a-product-landing-page.md new file mode 100644 index 00000000000000..fa4add5724a601 --- /dev/null +++ b/curriculum/challenges/german/14-responsive-web-design-22/build-a-product-landing-page-project/build-a-product-landing-page.md @@ -0,0 +1,467 @@ +--- +id: 587d78af367417b2b2512b04 +title: Erstelle eine Landingpage für ein Produkt +challengeType: 14 +forumTopicId: 301144 +dashedName: build-a-product-landing-page +--- + +# --description-- + +**Aufgabe:** Erstelle eine Anwendung, die eine ähnliche Funktionalität wie https://product-landing-page.freecodecamp.rocks aufweist. + +**User Stories:** + +1. Deine Produkt-Landingpage sollte ein `header`-Element mit einer entsprechenden `id="header"` haben +1. Du kannst ein Bild innerhalb des `header`-Elements mit einer entsprechenden `id="header-img"` (Ein Logo würde hier ein gutes Bild abgeben) sehen +1. Innerhalb des `#header`-Elements siehst du ein `nav`-Element mit dazugehöriger `id="nav-bar"` +1. Du kannst mindestens drei anklickbare Elemente innerhalb des `nav`-Elements sehen, jedes mit der `nav-link`-Klasse +1. Wenn du den `.nav-link`-Button im `nav`-Element drückst, wirst du zu dem entsprechenden Bereich auf der Landingpage geführt +1. Du kannst ein eingebettetes Produktvideo mit `id="video"` ansehen +1. Deine Landingpage sollte über ein `form`-Element mit entsprechender `id="form"` verfügen +1. Innerhalb des Formulars gibt es ein `input`-Feld mit `id="email"`, in das du deine E-Mail-Adresse eingeben kannst +1. Das `#email`-Eingabefeld sollte über einen Platzhaltertext verfügen, um Nutzer über den Zweck des Felds aufzuklären +1. Das `#email`-Eingabefeld findet durch HTML5-Validierung heraus, ob es sich beim eingegebenen Text auch wirklich um eine E-Mail-Adresse handelt +1. Innerhalb des Formulars gibt es ein Feld zum Abschicken des `input` mit einer entsprechenden `id="submit"` +1. Wenn du auf das `#submit`-Element klickst, wird die E-Mail an eine statische Seite weitergeleitet (Verwende diese Pseudo-URL: `https://www.freecodecamp.com/email-submit`) +1. Die Navigationsleiste sollte sich immer am oberen Rand des Ansichtsfensters befinden +1. Deine Produkt-Landingpage sollte mindestens eine Medienabfrage (Media Query) haben +1. Deine Produkt-Landingpage sollte die CSS-Flexbox mindestens einmal verwenden + +Erfülle die folgenden User Stories und bestehe alle Tests, um dieses Projekt abzuschließen. Gib dem Ganzen deinen persönlichen Stil. Viel Spaß beim Programmieren! + +**Hinweis:** Füge unbedingt `` in dein HTML ein, um dein Stylesheet zu verlinken und dein CSS anzuwenden + +# --hints-- + +Du solltest ein `header`-Element mit einer `id` von `header` haben. + +```js +const el = document.getElementById('header') +assert(!!el && el.tagName === 'HEADER') +``` + +Du solltest ein `img`-Element mit einer `id` von `header-img` haben. + +```js +const el = document.getElementById('header-img') +assert(!!el && el.tagName === 'IMG') +``` + +Dein `#header-img` sollte ein Nachfahre (descendant) des `#header` sein. + +```js +const els = document.querySelectorAll('#header #header-img') +assert(els.length > 0) +``` + +Dein `#header-img` sollte über ein `src`-Attribut verfügen. + +```js +const el = document.getElementById('header-img') +assert(!!el && !!el.src) +``` + +Die `src` deines `#header-img` sollte auf einen gültigen URL-Wert (beginnend mit `http`) gesetzt sein. + +```js +const el = document.getElementById('header-img') +assert(!!el && /^http/.test(el.src)) +``` + +Du solltest ein `nav`-Element mit einer `id` von `nav-bar` haben. + +```js +const el = document.getElementById('nav-bar') +assert(!!el && el.tagName === 'NAV') +``` + +Deine `#nav-bar` sollte ein Nachfahre des `#header` sein. + +```js +const els = document.querySelectorAll('#header #nav-bar') +assert(els.length > 0) +``` + +Du solltest mindestens 3 `.nav-link`-Elemente innerhalb des `#nav-bar` haben. + +```js +const els = document.querySelectorAll('#nav-bar .nav-link') +assert(els.length >= 3) +``` + +Jedes `.nav-link`-Element sollte über ein `href`-Attribut verfügen. + +```js +const els = document.querySelectorAll('.nav-link') +els.forEach(el => { + if (!el.href) assert(false) +}) +assert(els.length > 0) +``` + +Jedes `.nav-link`-Element sollte mit einem entsprechenden Element auf der Landingpage verknüpft sein (hat ein `href` mit dem Wert der ID eines anderen Elements, wie bspw. `#footer`). + +```js +const els = document.querySelectorAll('.nav-link') +els.forEach(el => { + const linkDestination = el.getAttribute('href').slice(1) + if (!document.getElementById(linkDestination)) assert(false) +}) +assert(els.length > 0) +``` + +Du solltest ein `video`- oder `iframe`-Element mit einer `id` von `video` haben. + +```js +const el = document.getElementById('video') +assert(!!el && (el.tagName === 'VIDEO' || el.tagName === 'IFRAME')) +``` + +Dein `#video` sollte über ein `src`-Attribut verfügen. + +```js +let el = document.getElementById('video') +const sourceNode = el.children; +let sourceElement = null; +if (sourceNode.length) { + sourceElement = [...video.children].filter(el => el.localName === 'source')[0]; +} +if (sourceElement) { + el = sourceElement; +} +assert(el.hasAttribute('src')); +``` + +Du solltest ein `form` Element mit einer `id` von `form` haben. + +```js +const el = document.getElementById('form') +assert(!!el && el.tagName === 'FORM') +``` + +Dein `input`-Element sollte über eine `id` von `email` verfügen. + +```js +const el = document.getElementById('email') +assert(!!el && el.tagName === 'INPUT') +``` + +Deine `#email` sollte ein Nachfahre der `#form` sein. + +```js +const els = document.querySelectorAll('#form #email') +assert(els.length > 0) +``` + +Deine `#email` sollte über ein `placeholder`-Attribut mit entsprechendem Text verfügen. + +```js +const el = document.getElementById('email') +assert(!!el && !!el.placeholder && el.placeholder.length > 0) +``` + +Deine `#email` sollte HTML5-Validierung verwenden, indem du `type` auf `email` setzt. + +```js +const el = document.getElementById('email') +assert(!!el && el.type === 'email') +``` + +Dein `input`-Element sollte über eine `id` von `submit` verfügen. + +```js +const el = document.getElementById('submit') +assert(!!el && el.tagName === 'INPUT') +``` + +Dein `#submit` sollte ein Nachfahre der `#form` sein. + +```js +const els = document.querySelectorAll('#form #submit') +assert(els.length > 0) +``` + +Dein `#submit` sollte einen `type` von `submit` haben. + +```js +const el = document.getElementById('submit') +assert(!!el && el.type === 'submit') +``` + +Deine `#form` sollte über ein `action`-Attribut von `https://www.freecodecamp.com/email-submit` verfügen. + +```js +const el = document.getElementById('form') +assert(!!el && el.action === 'https://www.freecodecamp.com/email-submit') +``` + +Deine `#email` sollte ein `name` Attribut von `email` haben. + +```js +const el = document.getElementById('email') +assert(!!el && el.name === 'email') +``` + +Dein `#nav-bar` sollte immer oben im Viewport liegen. + +```js +(async () => { + const timeout = (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds)); + + const header = document.getElementById('header'); + const headerChildren = header.children; + const navbarCandidates = [header, ...headerChildren]; + + // Return smallest top position of all navbar candidates + const getNavbarPosition = (candidates = []) => { + return candidates.reduce( + (min, candidate) => + Math.min(min, Math.abs(candidate?.getBoundingClientRect().top)), + Infinity + ); + }; + assert.approximately( + getNavbarPosition(navbarCandidates), + 0, + 15, + '#header or one of its children should be at the top of the viewport ' + ); + + window.scroll(0, 500); + await timeout(1); + + assert.approximately( + getNavbarPosition(navbarCandidates), + 0, + 15, + '#header or one of its children should be at the top of the ' + + 'viewport even after scrolling ' + ); + + window.scroll(0, 0); +})(); +``` + +Deine Produkt-Landingpage sollte mindestens eine Medienabfrage (Media Query) verwenden. + +```js +const htmlSourceAttr = Array.from(document.querySelectorAll('source')).map(el => el.getAttribute('media')) +const cssCheck = new __helpers.CSSHelp(document).getCSSRules('media') +assert(cssCheck.length > 0 || htmlSourceAttr.length > 0); +``` + +Deine Produktseite sollte mindestens einmal die CSS-Flexbox verwenden. + +```js +const stylesheet = new __helpers.CSSHelp(document).getStyleSheet() +const cssRules = new __helpers.CSSHelp(document).styleSheetToCssRulesArray(stylesheet) +const usesFlex = cssRules.find(rule => { + return rule.style?.display === 'flex' || rule.style?.display === 'inline-flex' +}) +assert(usesFlex) +``` + +# --seed-- + +## --seed-contents-- + +```html + +``` + +```css + +``` + +## --solutions-- + +```html + + + + + + Product Landing Page + + + +
+

+ Pokemon Daycare Service +

+
+

What we offer

+
+
+ +
+
Guaranteed friendly and loving staff!
+
+
+
+ +
+
+ Comfortable environment for Pokemon to explore and play! +
+
+
+
+ +
+
+ Multiple membership plans to fit your lifestyle! +
+
+
+
+

Check us out!

+ A sneak peek into our facility: +
+ +
+
+

Membership Plans

+
+
+ Basic Membership
+
    +
  • One Pokemon
  • +
  • Food and berries provided
  • +
+ $9.99/month +
+
+ Silver Membership
+
    +
  • Up to Three Pokemon
  • +
  • Food and berries provided
  • +
  • Grooming and accessories included
  • +
+ $19.99/month +
+
+ Gold Membership
+
    +
  • Up to six Pokemon!
  • +
  • Food and berries provided
  • +
  • Grooming and accessories included
  • +
  • Personal training for each Pokemon
  • +
  • Breeding and egg hatching
  • +
+ $29.99/month +
+
+
+
+

Sign up for our newsletter!

+ + +
+ +
+ + +``` + +```css +body { + background-color: #3a3240; + color: white; +} +main { + max-width: 750px; + margin: 50px auto; +} +input { + background-color: #92869c; +} +a:not(.nav-link) { + color: white; +} +#header-img { + max-height: 25px; +} +#nav-bar { + position: fixed; + width: 100%; + text-align: center; + top: 0%; + background-color: #92869c; +} +h1 { + text-align: center; +} +body { + text-align: center; +} +footer { + text-align: center; +} +#bullet { + max-height: 25px; +} +.flex-here { + display: flex; + justify-content: center; +} +.flex-left { + height: 25px; +} +.flex-mem { + display: flex; + justify-content: center; +} +.flex-mem-box { + background-color: #92869c; + border-color: black; + border-width: 5px; + border-style: solid; + margin: 10px; + padding: 10px; + color: black; +} +@media (max-width: 350px) { + #video { + width: 300; + height: 200; + } +} +``` diff --git a/curriculum/challenges/german/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3c866d0fc037f7311b4ac8.md b/curriculum/challenges/german/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3c866d0fc037f7311b4ac8.md new file mode 100644 index 00000000000000..9090f318108088 --- /dev/null +++ b/curriculum/challenges/german/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3c866d0fc037f7311b4ac8.md @@ -0,0 +1,107 @@ +--- +id: 5f3c866d0fc037f7311b4ac8 +title: Schritt 39 +challengeType: 0 +dashedName: step-39 +--- + +# --description-- + +Das ist näher dran, aber der Preis ist nicht auf der rechten Seite geblieben. Das liegt daran, dass `inline-block`-Elemente nur die Breite ihres Inhalts annehmen. Füge, um sie etwas breiter zu machen, eine `width`-Eigenschaft den Klassenselektoren `flavor` und `price` hinzu, die jeweils einen Wert von `50%` haben. + +# --hints-- + +Du solltest die `width`-Eigenschaft auf `50%` in deinem `.flavor`-Selektor setzen. + +```js +const flavorWidth = new __helpers.CSSHelp(document).getStyle('.flavor')?.getPropertyValue('width'); +assert(flavorWidth === '50%'); +``` + +Du solltest die `width`-Eigenschaft auf `50%` in deinem `.price`-Selektor setzen. + +```js +const priceWidth = new __helpers.CSSHelp(document).getStyle('.price')?.getPropertyValue('width'); +assert(priceWidth === '50%'); +``` + +# --seed-- + +## --seed-contents-- + +```html + + + + + + Cafe Menu + + + + + + +``` + +```css +body { + background-image: url(https://cdn.freecodecamp.org/curriculum/css-cafe/beans.jpg); +} + +h1, h2, p { + text-align: center; +} + +.menu { + width: 80%; + background-color: burlywood; + margin-left: auto; + margin-right: auto; +} + +.item p { + display: inline-block; +} + +--fcc-editable-region-- +.flavor { + text-align: left; +} + +.price { + text-align: right; +} +--fcc-editable-region-- +``` + diff --git a/curriculum/challenges/german/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3c866d28d7ad0de6470505.md b/curriculum/challenges/german/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3c866d28d7ad0de6470505.md new file mode 100644 index 00000000000000..551432cc671e83 --- /dev/null +++ b/curriculum/challenges/german/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3c866d28d7ad0de6470505.md @@ -0,0 +1,100 @@ +--- +id: 5f3c866d28d7ad0de6470505 +title: Schritt 33 +challengeType: 0 +dashedName: step-33 +--- + +# --description-- + +Die Sorten und Preise sind derzeit übereinander angeordnet und mit ihren jeweiligen `p`-Elementen zentriert. Es wäre schön, wenn die Sorte auf der linken und der Preis auf der rechten Seite wäre. + +Füge den Klassennamen `flavor` dem `p`-Element mit `French Vanilla` hinzu. + +# --hints-- + +Du solltest die Klasse `flavor` deinem `p`-Element hinzufügen. + +```js +assert(code.match(//i)); +``` + +Du solltest nur ein Element mit der Klasse `flavor` haben. + +```js +assert($('.flavor').length === 1); +``` + +Deine `flavor`-Klasse sollte dem `p`-Element mit dem Text `French Vanilla` zugewiesen sein. + +```js +assert($('.flavor')[0].innerText.match(/French Vanilla/i)); +``` + +# --seed-- + +## --seed-contents-- + +```html + + + + + + Cafe Menu + + + + + + +``` + +```css +body { + background-image: url(https://cdn.freecodecamp.org/curriculum/css-cafe/beans.jpg); +} + +h1, h2, p { + text-align: center; +} + +.menu { + width: 80%; + background-color: burlywood; + margin-left: auto; + margin-right: auto; +} +``` diff --git a/curriculum/challenges/german/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3c866d5414453fc2d7b480.md b/curriculum/challenges/german/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3c866d5414453fc2d7b480.md new file mode 100644 index 00000000000000..1713b5d1c7a681 --- /dev/null +++ b/curriculum/challenges/german/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3c866d5414453fc2d7b480.md @@ -0,0 +1,128 @@ +--- +id: 5f3c866d5414453fc2d7b480 +title: Schritt 32 +challengeType: 0 +dashedName: step-32 +--- + +# --description-- + +Füge unterhalb des existierenden Paares Kaffee/Preis folgende Kaffee- und Preisangaben mithilfe eines `article`-Elements mit zwei verschachtelten `p`-Elementen hinzu. Wie zuvor sollte der Text des ersten `p`-Elements die Kaffeesorte und des zweiten `p`-Elements die Preise enthalten. + +```bash +Caramel Macchiato 3.75 +Pumpkin Spice 3.50 +Hazelnut 4.00 +Mocha 4.50 +``` + +# --hints-- + +Du solltest fünf `article`-Elemente haben. + +```js +assert($('article').length === 5); +``` + +Jedes `article`-Element sollte zwei `p`-Elemente haben. + +```js +const articles = $('article'); +assert(articles[0].children.length === 2); +assert(articles[1].children.length === 2); +assert(articles[2].children.length === 2); +assert(articles[3].children.length === 2); +assert(articles[4].children.length === 2); +``` + +Dein erstes `article`-Element sollte `p`-Elemente mit den Texten `French Vanilla` und `3.00` enthalten. + +```js +const children = $('article')[0].children; +assert(children[0].innerText.match(/French Vanilla/i)); +assert(children[1].innerText.match(/3\.00/i)); +``` + +Dein zweites `article`-Element sollte `p`-Elemente mit den Texten `Caramel Macchiato` und `3.75` enthalten. + +```js +const children = $('article')[1].children; +assert(children[0].innerText.match(/Caramel Macchiato/i)); +assert(children[1].innerText.match(/3\.75/i)); +``` + +Dein drittes `article`-Element sollte `p`-Elemente mit den Texten `Pumpkin Spice` und `3.50` enthalten. + +```js +const children = $('article')[2].children; +assert(children[0].innerText.match(/Pumpkin Spice/i)); +assert(children[1].innerText.match(/3\.50/i)); +``` + +Dein viertes `article`-Element sollte `p`-Elemente mit den Texten `Hazelnut` und `4.00` enthalten. + +```js +const children = $('article')[3].children; +assert(children[0].innerText.match(/Hazelnut/i)); +assert(children[1].innerText.match(/4\.00/i)); +``` + +Dein fünftes `article`-Element sollte `p`-Elemente mit den Texten `Mocha` und `4.50` enthalten. + +```js +const children = $('article')[4].children; +assert(children[0].innerText.match(/Mocha/i)); +assert(children[1].innerText.match(/4\.50/i)); +``` + +# --seed-- + +## --seed-contents-- + +```html + + + + + + Cafe Menu + + + + + + +``` + +```css +body { + background-image: url(https://cdn.freecodecamp.org/curriculum/css-cafe/beans.jpg); +} + +h1, h2, p { + text-align: center; +} + +.menu { + width: 80%; + background-color: burlywood; + margin-left: auto; + margin-right: auto; +} +``` diff --git a/curriculum/challenges/german/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3c866daec9a49519871816.md b/curriculum/challenges/german/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3c866daec9a49519871816.md new file mode 100644 index 00000000000000..3b25e50b5401ee --- /dev/null +++ b/curriculum/challenges/german/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3c866daec9a49519871816.md @@ -0,0 +1,88 @@ +--- +id: 5f3c866daec9a49519871816 +title: Schritt 31 +challengeType: 0 +dashedName: step-31 +--- + +# --description-- + +`article`-Elemente enthalten in der Regel mehrere Elemente mit verwandten Informationen. In diesem Fall wird es eine Kaffeesorte und einen Preis für dieses Aroma enthalten. Füge zwei `p`-Elemente deinem `article`-Element hinzu. Der erste Text sollte `French Vanilla` sein, der zweite `3.00`. + +# --hints-- + +Du solltest das existierende Element `article` nicht verändern. + +```js +assert($('article').length === 1); +``` + +Dein `article`-Element sollte zwei `p`-Elemente enthalten. + +```js +assert($('article').children('p').length === 2); +``` + +Dein erstes `p`-Element sollte den Text `French Vanilla` enthalten. + +```js +const firstP = $('article').children('p')[0]; +assert(firstP.innerText.match(/French Vanilla/i)); +``` + +Dein zweites `p`-Element sollte den Text `3.00` haben. + +```js +const secondP = $('article').children('p')[1]; +assert(secondP.innerText.match(/3\.00/i)); +``` + +# --seed-- + +## --seed-contents-- + +```html + + + + + + Cafe Menu + + + + + + +``` + +```css +body { + background-image: url(https://cdn.freecodecamp.org/curriculum/css-cafe/beans.jpg); +} + +h1, h2, p { + text-align: center; +} + +.menu { + width: 80%; + background-color: burlywood; + margin-left: auto; + margin-right: auto; +} +``` diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f80e0081e0f2052ae5b505.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f80e0081e0f2052ae5b505.md index 59098a1044baf0..3f266e7f8890e0 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f80e0081e0f2052ae5b505.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f80e0081e0f2052ae5b505.md @@ -1,8 +1,8 @@ --- id: 60f80e0081e0f2052ae5b505 -title: Step 17 +title: Step 18 challengeType: 0 -dashedName: step-17 +dashedName: step-18 --- # --description-- @@ -57,10 +57,10 @@ assert.equal(document.querySelectorAll('input')?.[3]?.type, 'password');
--fcc-editable-region--
- - - - + + + +
--fcc-editable-region--
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81167d0d4910809f88945.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81167d0d4910809f88945.md index ff5bc73482d131..b1412de8b56c87 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81167d0d4910809f88945.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81167d0d4910809f88945.md @@ -1,8 +1,8 @@ --- id: 60f81167d0d4910809f88945 -title: Step 18 +title: Step 19 challengeType: 0 -dashedName: step-18 +dashedName: step-19 --- # --description-- @@ -49,10 +49,10 @@ assert.exists(document.querySelector('fieldset + input[value="Submit"]')); --fcc-editable-region--
- - - - + + + +
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81616cff80508badf9ad5.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81616cff80508badf9ad5.md index de84816cc0f939..a70d6d9fed3186 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81616cff80508badf9ad5.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81616cff80508badf9ad5.md @@ -1,8 +1,8 @@ --- id: 60f81616cff80508badf9ad5 -title: Step 19 +title: Step 20 challengeType: 0 -dashedName: step-19 +dashedName: step-20 --- # --description-- @@ -63,10 +63,10 @@ assert.equal(document.querySelector('input[type="submit"]')?.required, false); --fcc-editable-region--
- - - - + + + +
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f83e7bfc09900959f41e20.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f83e7bfc09900959f41e20.md index 26a8e53b4e83e6..10a281ad1c1a9c 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f83e7bfc09900959f41e20.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f83e7bfc09900959f41e20.md @@ -1,8 +1,8 @@ --- id: 60f83e7bfc09900959f41e20 -title: Step 20 +title: Step 21 challengeType: 0 -dashedName: step-20 +dashedName: step-21 --- # --description-- @@ -43,10 +43,10 @@ assert.equal(document.querySelector('input[type="password"]')?.minLength, 8); --fcc-editable-region--
- - - - + + + +
--fcc-editable-region--
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f84ec41116b209c280ba91.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f84ec41116b209c280ba91.md index b66cdbe4641996..71aaa09a6dd6da 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f84ec41116b209c280ba91.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f84ec41116b209c280ba91.md @@ -1,8 +1,8 @@ --- id: 60f84ec41116b209c280ba91 -title: Step 21 +title: Step 22 challengeType: 0 -dashedName: step-21 +dashedName: step-22 --- # --description-- @@ -51,10 +51,10 @@ assert.equal(document.querySelector('input[type="password"]')?.minLength, -1); --fcc-editable-region--
- - - - + + + +
--fcc-editable-region--
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f852f645b5310a8264f555.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f852f645b5310a8264f555.md index b59fad64fbb22e..f31a3f48f2f430 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f852f645b5310a8264f555.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f852f645b5310a8264f555.md @@ -1,8 +1,8 @@ --- id: 60f852f645b5310a8264f555 -title: Step 22 +title: Step 23 challengeType: 0 -dashedName: step-22 +dashedName: step-23 --- # --description-- @@ -42,10 +42,10 @@ assert.exists(document.querySelector('fieldset:nth-child(2)')?.querySelector('la

Please fill out this form with the required information

- - - - + + + +
--fcc-editable-region--
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f85a62fb30c80bcea0cedb.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f85a62fb30c80bcea0cedb.md index 1f9a28f316c5a4..5f22549570b36c 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f85a62fb30c80bcea0cedb.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f85a62fb30c80bcea0cedb.md @@ -1,8 +1,8 @@ --- id: 60f85a62fb30c80bcea0cedb -title: Step 23 +title: Step 24 challengeType: 0 -dashedName: step-23 +dashedName: step-24 --- # --description-- @@ -49,10 +49,10 @@ assert.equal(document.querySelectorAll('fieldset:nth-child(2) input[type="radio"

Please fill out this form with the required information

- - - - + + + +
--fcc-editable-region--
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8604682407e0d017bbf7f.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8604682407e0d017bbf7f.md index 9e6b05ef1f84f7..bedb8525d9388f 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8604682407e0d017bbf7f.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8604682407e0d017bbf7f.md @@ -1,8 +1,8 @@ --- id: 60f8604682407e0d017bbf7f -title: Step 24 +title: Step 25 challengeType: 0 -dashedName: step-24 +dashedName: step-25 --- # --description-- @@ -46,10 +46,10 @@ assert.equal(document.querySelector('fieldset:nth-child(2) label:nth-child(3) in

Please fill out this form with the required information

- - - - + + + +
--fcc-editable-region--
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8618d191b940d62038513.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8618d191b940d62038513.md index 26a23ff96451c7..8632249ecd823c 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8618d191b940d62038513.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8618d191b940d62038513.md @@ -1,8 +1,8 @@ --- id: 60f8618d191b940d62038513 -title: Step 25 +title: Step 26 challengeType: 0 -dashedName: step-25 +dashedName: step-26 --- # --description-- @@ -70,10 +70,10 @@ assert.equal(document.querySelector('fieldset:nth-child(2) > label:nth-child(3)'

Please fill out this form with the required information

- - - - + + + +
--fcc-editable-region--
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab4a123ce4b04526b082b.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab4a123ce4b04526b082b.md index 82f4a824bac54b..71913848295625 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab4a123ce4b04526b082b.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab4a123ce4b04526b082b.md @@ -1,8 +1,8 @@ --- id: 60fab4a123ce4b04526b082b -title: Step 26 +title: Step 27 challengeType: 0 -dashedName: step-26 +dashedName: step-27 --- # --description-- @@ -48,10 +48,10 @@ assert.isEmpty(document.querySelector('fieldset:nth-child(2) label:nth-child(3)

Please fill out this form with the required information

- - - - + + + +
--fcc-editable-region--
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab8367d35de04e5cb7929.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab8367d35de04e5cb7929.md index a2cb2c7ede52e6..0707d55d4d885b 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab8367d35de04e5cb7929.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab8367d35de04e5cb7929.md @@ -1,8 +1,8 @@ --- id: 60fab8367d35de04e5cb7929 -title: Step 27 +title: Step 29 challengeType: 0 -dashedName: step-27 +dashedName: step-29 --- # --description-- @@ -50,16 +50,16 @@ assert.equal(document.querySelector('fieldset:nth-child(2) > label:nth-child(3)

Please fill out this form with the required information

- - - - + + + +
--fcc-editable-region--
- - - + + +
--fcc-editable-region--
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab9f17fa294054b74228c.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab9f17fa294054b74228c.md index ab20f55fd52729..bdbe22259918de 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab9f17fa294054b74228c.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab9f17fa294054b74228c.md @@ -1,8 +1,8 @@ --- id: 60fab9f17fa294054b74228c -title: Step 28 +title: Step 30 challengeType: 0 -dashedName: step-28 +dashedName: step-30 --- # --description-- @@ -48,17 +48,16 @@ assert.equal(document.querySelector('fieldset:nth-child(3) > label > input')?.ty

Please fill out this form with the required information

- - - - + + + +
- - -
--fcc-editable-region-- diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fabf0dd4959805dbae09e6.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fabf0dd4959805dbae09e6.md index d271934ba0bad2..e3acbf567f89d9 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fabf0dd4959805dbae09e6.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fabf0dd4959805dbae09e6.md @@ -1,8 +1,8 @@ --- id: 60fabf0dd4959805dbae09e6 -title: Step 29 +title: Step 31 challengeType: 0 -dashedName: step-29 +dashedName: step-31 --- # --description-- @@ -62,16 +62,16 @@ assert.equal(document.querySelector('fieldset:nth-child(3) > label:nth-child(2)

Please fill out this form with the required information

- - - - + + + +
- - -
--fcc-editable-region-- diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac4095512d3066053d73c.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac4095512d3066053d73c.md index 9e61efc839781a..5a7d02bd645e46 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac4095512d3066053d73c.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac4095512d3066053d73c.md @@ -1,8 +1,8 @@ --- id: 60fac4095512d3066053d73c -title: Step 30 +title: Step 32 challengeType: 0 -dashedName: step-30 +dashedName: step-32 --- # --description-- @@ -42,23 +42,22 @@ assert.equal(document.querySelectorAll('fieldset:nth-child(3) > select > option'

Please fill out this form with the required information

- - - - + + + +
- - -
--fcc-editable-region--
- +
--fcc-editable-region-- diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac56271087806def55b33.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac56271087806def55b33.md index 0ff5946b74d1b8..d32c210d960e6b 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac56271087806def55b33.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac56271087806def55b33.md @@ -1,8 +1,8 @@ --- id: 60fac56271087806def55b33 -title: Step 31 +title: Step 33 challengeType: 0 -dashedName: step-31 +dashedName: step-33 --- # --description-- @@ -52,23 +52,22 @@ assert.equal(document.querySelectorAll('fieldset > label > select > option')?.le

Please fill out this form with the required information

- - - - + + + +
- - - + + +
--fcc-editable-region--
- + - - - + + + +
- - -
--fcc-editable-region--
- + - - - + + + +
- - -
--fcc-editable-region--
- + - - - + + + +
- - -
--fcc-editable-region--
- + - - - + + + +
- - -
--fcc-editable-region--
- - - + + -
--fcc-editable-region-- diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad0a812d9890938524f50.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad0a812d9890938524f50.md index 4b92deb1a790d5..55d3f3cdfbbed0 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad0a812d9890938524f50.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad0a812d9890938524f50.md @@ -1,8 +1,8 @@ --- id: 60fad0a812d9890938524f50 -title: Step 36 +title: Step 39 challengeType: 0 -dashedName: step-36 +dashedName: step-39 --- # --description-- @@ -42,25 +42,24 @@ assert.match(document.querySelector('fieldset:nth-child(3) > label:nth-child(4)

Please fill out this form with the required information

- - - - + + + +
- - -
--fcc-editable-region--
- - - + + -
--fcc-editable-region-- diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad1cafcde010995e15306.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad1cafcde010995e15306.md index e33c747e742d34..eee0d4fdd31efa 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad1cafcde010995e15306.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad1cafcde010995e15306.md @@ -1,8 +1,8 @@ --- id: 60fad1cafcde010995e15306 -title: Step 37 +title: Step 40 challengeType: 0 -dashedName: step-37 +dashedName: step-40 --- # --description-- @@ -102,25 +102,24 @@ Non dovresti assegnare a nessun elemento `fieldset` un attributo `name`.

Please fill out this form with the required information

--fcc-editable-region-- -
- - - - +
+ + + +
- - -
- - - + + -
--fcc-editable-region-- diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad6dfcc0d930a59becf12.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad6dfcc0d930a59becf12.md index 80879de67a6ab3..5f5ad1c96824db 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad6dfcc0d930a59becf12.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad6dfcc0d930a59becf12.md @@ -1,8 +1,8 @@ --- id: 60fad6dfcc0d930a59becf12 -title: Step 38 +title: Step 41 challengeType: 0 -dashedName: step-38 +dashedName: step-41 --- # --description-- @@ -48,24 +48,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('body')?.fontSize, '16px')

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad8e6148f310bba7890b1.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad8e6148f310bba7890b1.md index a8520541c90dda..30b4452b7ca10d 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad8e6148f310bba7890b1.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad8e6148f310bba7890b1.md @@ -1,8 +1,8 @@ --- id: 60fad8e6148f310bba7890b1 -title: Step 39 +title: Step 42 challengeType: 0 -dashedName: step-39 +dashedName: step-42 --- # --description-- @@ -46,24 +46,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('h1, p')?.textAlign, 'cent

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad99e09f9d30c1657e790.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad99e09f9d30c1657e790.md index c07954e65d2804..46a762a5eca7bd 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad99e09f9d30c1657e790.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad99e09f9d30c1657e790.md @@ -1,8 +1,8 @@ --- id: 60fad99e09f9d30c1657e790 -title: Step 40 +title: Step 43 challengeType: 0 -dashedName: step-40 +dashedName: step-43 --- # --description-- @@ -58,24 +58,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('form')?.width, '60vw');

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadb18058e950c73925279.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadb18058e950c73925279.md index 73f430c11a3029..ed0e9280d84770 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadb18058e950c73925279.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadb18058e950c73925279.md @@ -1,8 +1,8 @@ --- id: 60fadb18058e950c73925279 -title: Step 41 +title: Step 44 challengeType: 0 -dashedName: step-41 +dashedName: step-44 --- # --description-- @@ -52,24 +52,23 @@ assert.equal(fieldset?.paddingRight, '0px');

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadce90f85c50d0bb0dd4f.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadce90f85c50d0bb0dd4f.md index 49d6b7c2cf7a20..b03e89cfe2b6cb 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadce90f85c50d0bb0dd4f.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadce90f85c50d0bb0dd4f.md @@ -1,8 +1,8 @@ --- id: 60fadce90f85c50d0bb0dd4f -title: Step 42 +title: Step 45 challengeType: 0 -dashedName: step-42 +dashedName: step-45 --- # --description-- @@ -34,24 +34,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('fieldset')?.borderBottom,

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadd972e6ffe0d6858fa2d.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadd972e6ffe0d6858fa2d.md index fe6f3a38d3cb3e..c00082d167a259 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadd972e6ffe0d6858fa2d.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadd972e6ffe0d6858fa2d.md @@ -1,8 +1,8 @@ --- id: 60fadd972e6ffe0d6858fa2d -title: Step 44 +title: Step 47 challengeType: 0 -dashedName: step-44 +dashedName: step-47 --- # --description-- @@ -73,24 +73,23 @@ assert.equal(selFunc(['input, textarea, select', 'input, select, textarea', 'sel

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadfa2b540b70dcfa8b771.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadfa2b540b70dcfa8b771.md index ad414b607d69bb..3a91470ecc1384 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadfa2b540b70dcfa8b771.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadfa2b540b70dcfa8b771.md @@ -1,8 +1,8 @@ --- id: 60fadfa2b540b70dcfa8b771 -title: Step 45 +title: Step 48 challengeType: 0 -dashedName: step-45 +dashedName: step-48 --- # --description-- @@ -48,26 +48,25 @@ assert(document.querySelectorAll('fieldset:nth-child(2) input')?.[2]?.classList?

Please fill out this form with the required information

- - - - + + + +
--fcc-editable-region--
- - -
--fcc-editable-region--
- - - + + -
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc219d333e37046f474a6e.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc219d333e37046f474a6e.md index deb2cfd8cc096a..efc093181d4c06 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc219d333e37046f474a6e.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc219d333e37046f474a6e.md @@ -1,8 +1,8 @@ --- id: 60fc219d333e37046f474a6e -title: Step 46 +title: Step 49 challengeType: 0 -dashedName: step-46 +dashedName: step-49 --- # --description-- @@ -40,24 +40,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('.inline')?.width, 'unset'

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc22d1e64d1b04cdd4e602.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc22d1e64d1b04cdd4e602.md index a5fa3402f6ad76..cff2809bae97c3 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc22d1e64d1b04cdd4e602.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc22d1e64d1b04cdd4e602.md @@ -1,8 +1,8 @@ --- id: 60fc22d1e64d1b04cdd4e602 -title: Step 47 +title: Step 50 challengeType: 0 -dashedName: step-47 +dashedName: step-50 --- # --description-- @@ -52,24 +52,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('.inline')?.marginLeft, '0

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc236dc04532052926fdac.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc236dc04532052926fdac.md index 7150dac525f436..0f84f21fde45be 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc236dc04532052926fdac.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc236dc04532052926fdac.md @@ -1,8 +1,8 @@ --- id: 60fc236dc04532052926fdac -title: Step 48 +title: Step 51 challengeType: 0 -dashedName: step-48 +dashedName: step-51 --- # --description-- @@ -36,24 +36,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('.inline')?.verticalAlign,

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe1bc30415f042faea936.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe1bc30415f042faea936.md index 0fa309fb8cb6b4..69b2da6a237e2f 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe1bc30415f042faea936.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe1bc30415f042faea936.md @@ -1,8 +1,8 @@ --- id: 60ffe1bc30415f042faea936 -title: Step 49 +title: Step 52 challengeType: 0 -dashedName: step-49 +dashedName: step-52 --- # --description-- @@ -51,24 +51,23 @@ assert.equal(selFunc(['input, textarea', 'textarea, input'].find(selFunc))?.bord

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe3936796ac04959285a9.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe3936796ac04959285a9.md index b6b205da076e4f..1d4dee35e4cab3 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe3936796ac04959285a9.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe3936796ac04959285a9.md @@ -1,8 +1,8 @@ --- id: 60ffe3936796ac04959285a9 -title: Step 50 +title: Step 53 challengeType: 0 -dashedName: step-50 +dashedName: step-53 --- # --description-- @@ -44,24 +44,23 @@ assert.equal(selFunc(['input, textarea', 'textarea, input'].find(selFunc))?.minH

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe4f4ec18cd04dc470c56.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe4f4ec18cd04dc470c56.md index 29e74590792954..d5b80b233df00e 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe4f4ec18cd04dc470c56.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe4f4ec18cd04dc470c56.md @@ -1,8 +1,8 @@ --- id: 60ffe4f4ec18cd04dc470c56 -title: Step 51 +title: Step 54 challengeType: 0 -dashedName: step-51 +dashedName: step-54 --- # --description-- @@ -48,24 +48,23 @@ assert.isEmpty(new __helpers.CSSHelp(document).getStyle('input, textarea')?.minH

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe69ee377c6055e192a46.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe69ee377c6055e192a46.md index b72774b2d003c6..a504cd3d17c491 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe69ee377c6055e192a46.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe69ee377c6055e192a46.md @@ -1,8 +1,8 @@ --- id: 60ffe69ee377c6055e192a46 -title: Step 52 +title: Step 55 challengeType: 0 -dashedName: step-52 +dashedName: step-55 --- # --description-- @@ -54,24 +54,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('input[type="submit"]')?.w

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe7d8aae62c05bcc9e7eb.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe7d8aae62c05bcc9e7eb.md index d06983bb2a0f11..6fec60faa4d3a1 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe7d8aae62c05bcc9e7eb.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe7d8aae62c05bcc9e7eb.md @@ -1,8 +1,8 @@ --- id: 60ffe7d8aae62c05bcc9e7eb -title: Step 53 +title: Step 56 challengeType: 0 -dashedName: step-53 +dashedName: step-56 --- # --description-- @@ -43,24 +43,23 @@ assert.isEmpty(new __helpers.CSSHelp(document).getStyle('input[type="submit"]')?

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe8a5ceb0e90618db06d9.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe8a5ceb0e90618db06d9.md index a55b7625835637..ca411d7fc538d0 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe8a5ceb0e90618db06d9.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe8a5ceb0e90618db06d9.md @@ -1,8 +1,8 @@ --- id: 60ffe8a5ceb0e90618db06d9 -title: Step 54 +title: Step 57 challengeType: 0 -dashedName: step-54 +dashedName: step-57 --- # --description-- @@ -40,24 +40,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('input[type="submit"]')?.f

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe947a868ec068f7850f6.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe947a868ec068f7850f6.md index 14d18c1e64e8aa..fb985d66d040ab 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe947a868ec068f7850f6.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe947a868ec068f7850f6.md @@ -1,8 +1,8 @@ --- id: 60ffe947a868ec068f7850f6 -title: Step 55 +title: Step 58 challengeType: 0 -dashedName: step-55 +dashedName: step-58 --- # --description-- @@ -40,24 +40,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('input[type="submit"]')?.b

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe9cb47809106eda2f2c9.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe9cb47809106eda2f2c9.md index 4438a08a7650f2..0c51c3964b4edf 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe9cb47809106eda2f2c9.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe9cb47809106eda2f2c9.md @@ -1,8 +1,8 @@ --- id: 60ffe9cb47809106eda2f2c9 -title: Step 56 +title: Step 59 challengeType: 0 -dashedName: step-56 +dashedName: step-59 --- # --description-- @@ -43,24 +43,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('input[type="submit"]')?.m

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffec2825da1007509ddd06.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffec2825da1007509ddd06.md index ec5c5140176193..1af387847e2a79 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffec2825da1007509ddd06.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffec2825da1007509ddd06.md @@ -1,8 +1,8 @@ --- id: 60ffec2825da1007509ddd06 -title: Step 57 +title: Step 60 challengeType: 0 -dashedName: step-57 +dashedName: step-60 --- # --description-- @@ -42,24 +42,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('input[type="file"]')?.pad

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffecefac971607ae73c60f.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffecefac971607ae73c60f.md index 3f8183eb8c34f2..7fbb33bd572f67 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffecefac971607ae73c60f.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffecefac971607ae73c60f.md @@ -1,8 +1,8 @@ --- id: 60ffecefac971607ae73c60f -title: Step 58 +title: Step 61 challengeType: 0 -dashedName: step-58 +dashedName: step-61 --- # --description-- @@ -40,24 +40,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('form')?.paddingBottom, '2

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffefd6479a3d084fb77cbc.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffefd6479a3d084fb77cbc.md index fa1236d492a8bb..11ee08e46ef000 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffefd6479a3d084fb77cbc.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffefd6479a3d084fb77cbc.md @@ -1,8 +1,8 @@ --- id: 60ffefd6479a3d084fb77cbc -title: Step 59 +title: Step 62 challengeType: 0 -dashedName: step-59 +dashedName: step-62 --- # --description-- @@ -42,24 +42,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('a')?.color, 'rgb(223, 223

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
@@ -172,24 +171,23 @@ input[type="file"] {

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62b30924c5e4ef0daba23b5e.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62b30924c5e4ef0daba23b5e.md index 7103dec14b63ab..436d58f1cb1ca5 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62b30924c5e4ef0daba23b5e.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62b30924c5e4ef0daba23b5e.md @@ -1,8 +1,8 @@ --- id: 62b30924c5e4ef0daba23b5e -title: Step 43 +title: Step 46 challengeType: 0 -dashedName: step-43 +dashedName: step-46 --- # --description-- @@ -47,24 +47,23 @@ assert(borderBottom === 'none' || borderBottom === 'medium none');

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8b9dab5ac88e4d3d43a3.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8b9dab5ac88e4d3d43a3.md new file mode 100644 index 00000000000000..2e6b6967390592 --- /dev/null +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8b9dab5ac88e4d3d43a3.md @@ -0,0 +1,109 @@ +--- +id: 62ff8b9dab5ac88e4d3d43a3 +title: Step 17 +challengeType: 0 +dashedName: step-17 +--- + +# --description-- + +Per seguire le buone pratiche di accessibilità, collega gli elementi `input` e gli elementi `label` usando l'attributo `for`. + +Usa questi valori per i rispettivi attributi `id`: `first-name`, `last-name`, `email`, `new-password` + +# --hints-- + +Il primo elemento `input` dovrebbe avere un `id` con il valore `first-name`. + +```js +assert(document.querySelectorAll('input')?.[0]?.matches('#first-name')) +``` + +Il secondo elemento `input` dovrebbe avere un `id` con il valore `last-name`. + +```js +assert(document.querySelectorAll('input')?.[1]?.matches('#last-name')) +``` + +Il terzo elemento `input` dovrebbe avere un `id` con il valore `email`. + +```js +assert(document.querySelectorAll('input')?.[2]?.matches('#email')) +``` + +Il quarto elemento `input` dovrebbe avere un `id` con il valore `new-password`. + +```js +assert(document.querySelectorAll('input')?.[3]?.matches('#new-password')) +``` + +Il primo elemento `label` dovrebbe avere un attributo `for` con il valore `first-name`. + +```js +assert(document.querySelectorAll('label')?.[0]?.matches('label[for="first-name"]')) +``` + +Il secondo elemento `label` dovrebbe avere un attributo `for` con il valore `last-name`. + +```js +assert(document.querySelectorAll('label')?.[1]?.matches('label[for="last-name"]')) +``` + +Il terzo elemento `label` dovrebbe avere un attributo `for` con il valore `email`. + +```js +assert(document.querySelectorAll('label')?.[2]?.matches('label[for="email"]')) +``` + +Il quarto elemento `label` dovrebbe avere un attributo `for` con il valore `new-password`. + +```js +assert(document.querySelectorAll('label')?.[3]?.matches('label[for="new-password"]')) +``` + +# --seed-- + +## --seed-contents-- + +```html + + + + + Registration Form + + + +

Registration Form

+

Please fill out this form with the required information

+ +--fcc-editable-region-- +
+ + + + +
+--fcc-editable-region-- +
+
+ + + +``` + +```css +body { + width: 100%; + height: 100vh; + margin: 0; + background-color: #1b1b32; + color: #f5f6f7; +} + +label { + display: block; + margin: 0.5rem 0; +} + +``` diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8e998d3e7eae14d6ae3b.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8e998d3e7eae14d6ae3b.md new file mode 100644 index 00000000000000..49febbe46ca80d --- /dev/null +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8e998d3e7eae14d6ae3b.md @@ -0,0 +1,102 @@ +--- +id: 62ff8e998d3e7eae14d6ae3b +title: Step 28 +challengeType: 0 +dashedName: step-28 +--- + +# --description-- + +Segui le buone pratiche di accessibilità collegando gli elementi `input` e gli elementi `label` nel secondo `fieldset`. + +Usa questi valori per i rispettivi attributi `id`: `personal-account`, `business-account`, `terms-and-conditions` + +# --hints-- + +Il primo elemento `input` dovrebbe avere un `id` con il valore `personal-account`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(2) input')?.[0]?.matches('#personal-account')) +``` + +Il secondo elemento `input` dovrebbe avere un `id` con il valore `business-account`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(2) input')?.[1]?.matches('#business-account')) +``` + +Il terzo elemento `input` dovrebbe avere un `id` con il valore `terms-and-conditions`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(2) input')?.[2]?.matches('#terms-and-conditions')) +``` + +Il primo elemento `label` dovrebbe avere un attributo `for` con il valore `personal-account`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(2) label')?.[0]?.matches('label[for="personal-account"]')) +``` + +Il secondo elemento `label` dovrebbe avere un attributo `for` con il valore `business-account`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(2) label')?.[1]?.matches('label[for="business-account"]')) +``` + +Il terzo elemento `label` dovrebbe avere un attributo `for` con il valore `terms-and-conditions`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(2) label')?.[2]?.matches('label[for="terms-and-conditions"]')) +``` + +# --seed-- + +## --seed-contents-- + +```html + + + + + Registration Form + + + +

Registration Form

+

Please fill out this form with the required information

+
+
+ + + + +
+--fcc-editable-region-- +
+ + + +
+--fcc-editable-region-- +
+ +
+ + +``` + +```css +body { + width: 100%; + height: 100vh; + margin: 0; + background-color: #1b1b32; + color: #f5f6f7; +} + +label { + display: block; + margin: 0.5rem 0; +} + +``` diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff919a7b5612c0670923a5.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff919a7b5612c0670923a5.md new file mode 100644 index 00000000000000..896a4a461d93da --- /dev/null +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff919a7b5612c0670923a5.md @@ -0,0 +1,131 @@ +--- +id: 62ff919a7b5612c0670923a5 +title: Step 37 +challengeType: 0 +dashedName: step-37 +--- + +# --description-- + +Collega gli elementi inviabili del modulo con il rispettivo elemento `label`. + +Usa questi valori per i rispettivi attributi `id`: `profile-picture`, `age`, `referrer`, `bio` + +# --hints-- + +Il primo elemento `input` dovrebbe avere un `id` con il valore `profile-picture`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(3) input')?.[0]?.matches('#profile-picture')) +``` + +Il secondo elemento `input` dovrebbe avere un `id` con il valore `age`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(3) input')?.[1]?.matches('#age')) +``` + +L'elemento `select` dovrebbe avere un `id` con il valore `referrer`. + +```js +assert(document.querySelector('fieldset:nth-of-type(3) select')?.matches('#referrer')) +``` + +L'elemento `textarea` dovrebbe avere un `id` con il valore `bio`. + +```js +assert(document.querySelector('fieldset:nth-of-type(3) textarea')?.matches('#bio')) +``` + +Il primo elemento `label` dovrebbe avere un attributo `for` con il valore `profile-picture`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(3) label')?.[0]?.matches('label[for="profile-picture"]')) +``` + +Il secondo elemento `label` dovrebbe avere un attributo `for` con il valore `age`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(3) label')?.[1]?.matches('label[for="age"]')) +``` + +Il terzo elemento `label` dovrebbe avere un attributo `for` con il valore `referrer`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(3) label')?.[2]?.matches('label[for="referrer"]')) +``` + +Il quarto elemento `label` dovrebbe avere un attributo `for` con il valore `bio`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(3) label')?.[3]?.matches('label[for="bio"]')) +``` + +# --seed-- + +## --seed-contents-- + +```html + + + + + Registration Form + + + +

Registration Form

+

Please fill out this form with the required information

+
+
+ + + + +
+
+ + + +
+--fcc-editable-region-- +
+ + + + +
+--fcc-editable-region-- + +
+ + +``` + +```css +body { + width: 100%; + height: 100vh; + margin: 0; + background-color: #1b1b32; + color: #f5f6f7; +} + +label { + display: block; + margin: 0.5rem 0; +} + +``` diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ebcba99bfa46a15370b11.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ebcba99bfa46a15370b11.md index 1157a7dab2e014..4bfb486e6b7e3b 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ebcba99bfa46a15370b11.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ebcba99bfa46a15370b11.md @@ -7,7 +7,19 @@ dashedName: step-27 # --description-- -Ora devi fare in modo che sia responsivo. Aggiungi una `@media` query con una proprietà `max-width` di `768px`. +Una regola `@media`, anche detta media query, è usata per applicare il CSS in modo condizionale. Le media query sono usate comunemente per applicare il CSS in base alla larghezza del viewport usando le proprietà `max-width` e `min-width`. + +Nell'esempio qui sotto il padding è applicato alla classe `.card` quando il viewport è largo meno di `960px`. + +```css +@media (max-width: 960px) { + .card { + padding: 2rem; + } +} +``` + +Aggiungi una media query da applicare quando il viewport è largo meno di `768px`. # --hints-- diff --git a/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfb6250eacea3f48c6300b2.md b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfb6250eacea3f48c6300b2.md new file mode 100644 index 00000000000000..dcda974602ac2b --- /dev/null +++ b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfb6250eacea3f48c6300b2.md @@ -0,0 +1,94 @@ +--- +id: 5dfb6250eacea3f48c6300b2 +title: ステップ 21 +challengeType: 0 +dashedName: step-21 +--- + +# --description-- + +順序なしリストの後に、`src` 属性値を下記の値に設定した新しい画像を追加してください: + +`https://cdn.freecodecamp.org/curriculum/cat-photo-app/lasagna.jpg` + +`alt` 属性値は下記の値に設定してください: + +`A slice of lasagna on a plate.` + +# --hints-- + +終了タグ `` の直後に、`img` 要素が必要です。 + +```js +assert($('section')[1].lastElementChild.nodeName === 'IMG'); +``` + +新しい画像に `alt` 属性がありません。 開始タグのタグ名の後にスペースがあることと、すべての属性名の前にスペースがあることを確認してください。 + +```js +assert($('section')[1].lastElementChild.hasAttribute('alt')); +``` + +新しい画像の `alt` の値は `A slice of lasagna on a plate.` に設定してください。`alt` 属性の値が引用符で囲まれていることを確認してください。 + +```js +assert( + $('section')[1] + .lastElementChild.getAttribute('alt') + .replace(/\s+/g, ' ') + .match(/^A slice of lasagna on a plate\.?$/i) +); +``` + +新しい画像に `src` 属性がありません。 開始タグのタグ名の後にスペースがあることと、すべての属性名の前にスペースがあることを確認してください。 + +```js +assert($('section')[1].lastElementChild.hasAttribute('src')); +``` + +新しい画像の `src` の値は `https://cdn.freecodecamp.org/curriculum/cat-photo-app/lasagna.jpg` に設定してください。 `src` 属性の値が引用符で囲まれていることを確認してください。 + +```js +assert( + $('section')[1].lastElementChild.getAttribute('src') === + 'https://cdn.freecodecamp.org/curriculum/cat-photo-app/lasagna.jpg' +); +``` + +新しい画像の `src` は正しい URL に設定されていますが、属性の値は常に引用符で囲むことが推奨されています。 + +```js +assert(!/\ + +

CatPhotoApp

+
+
+

Cat Photos

+ +

Click here to view more cat photos.

+ A cute orange cat lying on its back. +
+
+

Cat Lists

+

Things cats love:

+--fcc-editable-region-- +
    +
  • cat nip
  • +
  • laser pointers
  • +
  • lasagna
  • +
+--fcc-editable-region-- +
+
+ + +``` + diff --git a/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfb655eeacea3f48c6300b3.md b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfb655eeacea3f48c6300b3.md new file mode 100644 index 00000000000000..f7fed3b6b2cde4 --- /dev/null +++ b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfb655eeacea3f48c6300b3.md @@ -0,0 +1,76 @@ +--- +id: 5dfb655eeacea3f48c6300b3 +title: ステップ 22 +challengeType: 0 +dashedName: step-22 +--- + +# --description-- + +`figure` 要素はそれ自体で完結する 1 つのコンテンツを表します。これを使って画像をキャプションと関連付けることができます。 + +先ほど追加した画像を `figure` 要素内にネストしてください。 + +# --hints-- + +`figure` 要素には開始タグが必要です。 開始タグは `` のような形式の構文です。 + +```js +assert(document.querySelector('figure')); +``` + +`figure` 要素には終了タグが必要です。 終了タグは `<` の直後に `/` があります。 + +```js +assert(code.match(/<\/figure\>/)); +``` + +2 つ目の `section` 要素の終了タグのすぐ上に `figure` 要素が必要です。 + +```js +assert($('section')[1].lastElementChild.nodeName === 'FIGURE'); +``` + +ラザニアの `img` 要素は `figure` 要素内にネストされている必要があります。 + +```js +assert( + document.querySelector('figure > img') && + document.querySelector('figure > img').getAttribute('src').toLowerCase() === + 'https://cdn.freecodecamp.org/curriculum/cat-photo-app/lasagna.jpg' +); +``` + +# --seed-- + +## --seed-contents-- + +```html + + +

CatPhotoApp

+
+
+

Cat Photos

+ +

Click here to view more cat photos.

+ A cute orange cat lying on its back. +
+
+

Cat Lists

+

Things cats love:

+
    +
  • cat nip
  • +
  • laser pointers
  • +
  • lasagna
  • +
+--fcc-editable-region-- + A slice of lasagna on a plate. +--fcc-editable-region-- +
+
+ + + +``` + diff --git a/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f0d48e7b435f13ab6550051.md b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f0d48e7b435f13ab6550051.md new file mode 100644 index 00000000000000..a2366da71b75e0 --- /dev/null +++ b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f0d48e7b435f13ab6550051.md @@ -0,0 +1,105 @@ +--- +id: 5f0d48e7b435f13ab6550051 +title: ステップ 50 +challengeType: 0 +dashedName: step-50 +--- + +# --description-- + +`legend` 要素は、`fieldset` 要素内のコンテンツに関する説明文として機能します。 つまり、フォームのその部分に入力すべき内容についてのコンテキストをユーザーに提供します。 + +ラジオボタンの上に `legend` 要素を追加し、`Is your cat an indoor or outdoor cat?` というテキストを設定してください。 + +# --hints-- + +`legend` 要素には開始タグが必要です。 開始タグは `` のような形式の構文です。 + +```js +assert(document.querySelector('legend')); +``` + +`legend` 要素には終了タグが必要です。 終了タグは `<` の直後に `/` があります。 + +```js +assert(code.match(/<\/legend\>/)); +``` + +`legend` 要素は、`fieldset` 要素の開始タグ直下の最初の要素であり、かつ 1 つ目のラジオボタンの `label` の開始タグの前にある必要があります。 位置が正しくないようです。 + +```js +const fieldsetElem = document.querySelector('fieldset'); +const fieldsetElemChildren = fieldsetElem.children; +assert( + fieldsetElem.firstElementChild.nodeName === 'LEGEND' && + fieldsetElemChildren[1].nodeName === 'LABEL' && + fieldsetElemChildren[1].children[0].nodeName === 'INPUT' && + fieldsetElemChildren[1].children[0].id === 'indoor' +); +``` + +`legend` 要素のテキストは `Is your cat an indoor or outdoor cat?` でなければなりません。 テキストに誤字脱字があるか、テキストが `legend` 要素の開始タグと終了タグの間に入っていない可能性があります。 + +```js +const extraSpacesRemoved = document + .querySelector('legend') + .innerText.replace(/\s+/g, ' '); +assert(extraSpacesRemoved.match(/Is your cat an indoor or outdoor cat\??$/i)); +``` + +# --seed-- + +## --seed-contents-- + +```html + + +

CatPhotoApp

+
+
+

Cat Photos

+ +

Click here to view more cat photos.

+ A cute orange cat lying on its back. +
+
+

Cat Lists

+

Things cats love:

+
    +
  • cat nip
  • +
  • laser pointers
  • +
  • lasagna
  • +
+
+ A slice of lasagna on a plate. +
Cats love lasagna.
+
+

Top 3 things cats hate:

+
    +
  1. flea treatment
  2. +
  3. thunder
  4. +
  5. other cats
  6. +
+
+ Five cats looking around a field. +
Cats hate other cats.
+
+
+
+

Cat Form

+
+--fcc-editable-region-- +
+ + +
+--fcc-editable-region-- + + +
+
+
+ + +``` + diff --git a/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f0d4d04b435f13ab6550053.md b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f0d4d04b435f13ab6550053.md new file mode 100644 index 00000000000000..3853419fb5d4fe --- /dev/null +++ b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f0d4d04b435f13ab6550053.md @@ -0,0 +1,114 @@ +--- +id: 5f0d4d04b435f13ab6550053 +title: ステップ 52 +challengeType: 0 +dashedName: step-52 +--- + +# --description-- + +2 つ目の `fieldset` 要素内に、`legend` 要素を追加して `What's your cat's personality?` というテキストを設定してください。 + +# --hints-- + +2 つ目の `fieldset` 要素が削除されたか、開始タグまたは終了タグがありません。 + +```js +assert( + document.querySelectorAll('fieldset').length === 2 && + code.match(/<\/fieldset>/g).length === 2 +); +``` + +`legend` 要素には開始タグが必要です。 開始タグは `` のような形式の構文です。 + +```js +const secondFieldset = $('fieldset')[1]; +assert( + secondFieldset && + [...secondFieldset.children].filter((child) => child.nodeName === 'LEGEND') + .length +); +``` + +`legend` 要素には終了タグが必要です。 終了タグは `<` の直後に `/` があります。 + +```js +assert(code.match(/<\/legend\>/g).length === 2); +``` + +`legend` 要素のテキストは `What's your cat's personality?` でなければなりません。 テキストが設定されていないか、誤字脱字があります。 + +```js +const secondFieldset = $('fieldset')[1]; +assert( + secondFieldset && + [...secondFieldset.children].filter((child) => { + const extraSpacesRemoved = child.innerText.replace(/\s+/g, ' '); + return ( + child.nodeName === 'LEGEND' && + extraSpacesRemoved.match(/What's your cat's personality\??$/i) + ); + }).length +); +``` + +# --seed-- + +## --seed-contents-- + +```html + + +

CatPhotoApp

+
+
+

Cat Photos

+ +

Click here to view more cat photos.

+ A cute orange cat lying on its back. +
+
+

Cat Lists

+

Things cats love:

+
    +
  • cat nip
  • +
  • laser pointers
  • +
  • lasagna
  • +
+
+ A slice of lasagna on a plate. +
Cats love lasagna.
+
+

Top 3 things cats hate:

+
    +
  1. flea treatment
  2. +
  3. thunder
  4. +
  5. other cats
  6. +
+
+ Five cats looking around a field. +
Cats hate other cats.
+
+
+
+

Cat Form

+
+
+ Is your cat an indoor or outdoor cat? + + +
+--fcc-editable-region-- +
+
+--fcc-editable-region-- + + +
+
+
+ + +``` + diff --git a/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f1a89f1190aff21ae42105a.md b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f1a89f1190aff21ae42105a.md new file mode 100644 index 00000000000000..c98de896a47553 --- /dev/null +++ b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f1a89f1190aff21ae42105a.md @@ -0,0 +1,106 @@ +--- +id: 5f1a89f1190aff21ae42105a +title: ステップ 59 +challengeType: 0 +dashedName: step-59 +--- + +# --description-- + +ラジオボタンと同様に、選択したチェックボックスのフォームデータは `name` 属性と `value` 属性のペアになります。 `value` 属性はオプションではありますが、ページ上のあらゆるチェックボックスあるいはラジオボタンに設定することがベストプラクティスです。 + +各チェックボックスに `value` 属性を追加してください。 便宜上、各チェックボックスの `value` 属性は `id` 属性と同じ値に設定してください。 + +# --hints-- + +3 つのチェックボックスすべてに `value` 属性が必要です。 開始タグのタグ名の後にスペースがあることと、すべての属性名の前にスペースがあることを確認してください。 + +```js +const checkboxes = [...document.querySelectorAll('input[type="checkbox"]')]; +assert(checkboxes.every((checkbox) => checkbox.hasAttribute('value'))); +``` + +`Loving` チェックボックスの `value` 属性は `loving` に設定する必要があります。 値が設定されていないか、誤字脱字があります。 属性値は引用符で囲むことを忘れないでください。 + +```js +const lovingCheckbox = document.querySelector('#loving'); +assert(lovingCheckbox.getAttribute('value').match(/^loving$/)); +``` + +`Lazy` チェックボックスの `value` 属性は `lazy` に設定する必要があります。 値が設定されていないか、誤字脱字があります。 属性値は引用符で囲むことを忘れないでください。 + +```js +const lazyCheckbox = document.querySelector('#lazy'); +assert(lazyCheckbox.getAttribute('value').match(/^lazy$/)); +``` + +`Energetic` チェックボックスの `value` 属性は `energetic` に設定する必要があります。 値が設定されていないか、誤字脱字があります。 属性値は引用符で囲むことを忘れないでください。 + +```js +const energeticCheckbox = document.querySelector('#energetic'); +assert(energeticCheckbox.getAttribute('value').match(/^energetic$/)); +``` + +# --seed-- + +## --seed-contents-- + +```html + + +

CatPhotoApp

+
+
+

Cat Photos

+ +

Click here to view more cat photos.

+ A cute orange cat lying on its back. +
+
+

Cat Lists

+

Things cats love:

+
    +
  • cat nip
  • +
  • laser pointers
  • +
  • lasagna
  • +
+
+ A slice of lasagna on a plate. +
Cats love lasagna.
+
+

Top 3 things cats hate:

+
    +
  1. flea treatment
  2. +
  3. thunder
  4. +
  5. other cats
  6. +
+
+ Five cats looking around a field. +
Cats hate other cats.
+
+
+
+

Cat Form

+
+--fcc-editable-region-- +
+ Is your cat an indoor or outdoor cat? + + +
+
+ What's your cat's personality? + + + +
+--fcc-editable-region-- + + +
+
+
+ + +``` + diff --git a/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/62bb4009e3458a128ff57d5d.md b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/62bb4009e3458a128ff57d5d.md new file mode 100644 index 00000000000000..d93f3e5a4c8595 --- /dev/null +++ b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/62bb4009e3458a128ff57d5d.md @@ -0,0 +1,166 @@ +--- +id: 62bb4009e3458a128ff57d5d +title: ステップ 68 +challengeType: 0 +dashedName: step-68 +--- + +# --description-- + +あと一歩です。 ユーザーが自分の母国語を使えるようにする必要があります。 `head` 要素の子要素として `meta` 要素を追加して、複数の言語をエンコードするようブラウザーに指示しましょう。 meta 要素の `charset` 属性を `UTF-8` に設定してください。 + +# --hints-- + +`head` 要素の中に新しい `meta` 要素を作成する必要があります。 + +```js +assert.exists(document.querySelector('head > meta')); +``` + +`meta` 要素の `charset` を `UTF-8` に設定してください。 + +```js +assert.equal(document.querySelector('head > meta')?.getAttribute('charset')?.toLowerCase(), 'utf-8'); +``` + +# --seed-- + +## --seed-contents-- + +```html + + + +--fcc-editable-region-- + + CatPhotoApp + +--fcc-editable-region-- + +

CatPhotoApp

+
+
+

Cat Photos

+ +

Click here to view more cat photos.

+ A cute orange cat lying on its back. +
+
+

Cat Lists

+

Things cats love:

+
    +
  • cat nip
  • +
  • laser pointers
  • +
  • lasagna
  • +
+
+ A slice of lasagna on a plate. +
Cats love lasagna.
+
+

Top 3 things cats hate:

+
    +
  1. flea treatment
  2. +
  3. thunder
  4. +
  5. other cats
  6. +
+
+ Five cats looking around a field. +
Cats hate other cats.
+
+
+
+

Cat Form

+
+
+ Is your cat an indoor or outdoor cat? + + +
+
+ What's your cat's personality? + + + +
+ + +
+
+
+ + + +``` + +# --solutions-- + +```html + + + + + CatPhotoApp + + +

CatPhotoApp

+
+
+

Cat Photos

+ +

Click here to view more cat photos.

+ A cute orange cat lying on its back. +
+
+

Cat Lists

+

Things cats love:

+
    +
  • cat nip
  • +
  • laser pointers
  • +
  • lasagna
  • +
+
+ A slice of lasagna on a plate. +
Cats love lasagna.
+
+

Top 3 things cats hate:

+
    +
  1. flea treatment
  2. +
  3. thunder
  4. +
  5. other cats
  6. +
+
+ Five cats looking around a field. +
Cats hate other cats.
+
+
+
+

Cat Form

+
+
+ Is your cat an indoor or outdoor cat? + + +
+
+ What's your cat's personality? + + + +
+ + +
+
+
+ + + +``` diff --git a/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60eebd07ea685b0e777b5583.md b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60eebd07ea685b0e777b5583.md new file mode 100644 index 00000000000000..bbb3cb3f970fb3 --- /dev/null +++ b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60eebd07ea685b0e777b5583.md @@ -0,0 +1,52 @@ +--- +id: 60eebd07ea685b0e777b5583 +title: ステップ 1 +challengeType: 0 +dashedName: step-1 +--- + +# --description-- + +登録フォームプロジェクトへようこそ! まず、読み込まれるドキュメントの種類をブラウザーに伝えるために、ドキュメントの先頭に `!DOCTYPE html` 宣言を追加しましょう。 + +# --hints-- + +コードに `DOCTYPE` 参照を入れる必要があります。 + +```js +assert(code.match(/` を入力して、`DOCTYPE` 宣言を閉じる必要があります。 + +```js +assert(code.match(/html\s*>/gi)); +``` + +`DOCTYPE` 宣言は HTML の先頭にある必要があります。 + +```js +assert(__helpers.removeHtmlComments(code).match(/^\s*/i)); +``` + +# --seed-- + +## --seed-contents-- + +```html +--fcc-editable-region-- + +--fcc-editable-region-- +``` diff --git a/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f027099a15b00485563dd2.md b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f027099a15b00485563dd2.md new file mode 100644 index 00000000000000..5c5ea33c1d3b72 --- /dev/null +++ b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f027099a15b00485563dd2.md @@ -0,0 +1,54 @@ +--- +id: 60f027099a15b00485563dd2 +title: ステップ 2 +challengeType: 0 +dashedName: step-2 +--- + +# --description-- + +`DOCTYPE` の下に、`lang` 属性が `en` に設定された `html` 要素を追加して、コードを入力する場所を作りましょう。 + +# --hints-- + +`DOCTYPE` 宣言は HTML の先頭にある必要があります。 + +```js +assert(__helpers.removeHtmlComments(code).match(/^\s*/i)); +``` + +`html` 要素が開始タグを持ち、`lang` 属性が `en` という値に設定されている必要があります。 + +```js +assert(code.match(//gi)); +``` + +`html` 要素には終了タグが必要です。 + +```js +assert(code.match(/<\/html\s*>/)); +``` + +`html` タグは正しい順序になっている必要があります。 + +```js +assert(code.match(/\s*<\/html\s*>/)); +``` + +`html` 要素は 1 つだけにしてください。 + +```js +// Possibly a redundant test, as browser fixes this +assert(document.querySelectorAll('html').length === 1); +``` + +# --seed-- + +## --seed-contents-- + +```html +--fcc-editable-region-- + + +--fcc-editable-region-- +``` diff --git a/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f1a5e2d2c23707a4f9a660.md b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f1a5e2d2c23707a4f9a660.md new file mode 100644 index 00000000000000..70cd5f2ee515e2 --- /dev/null +++ b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f1a5e2d2c23707a4f9a660.md @@ -0,0 +1,52 @@ +--- +id: 60f1a5e2d2c23707a4f9a660 +title: ステップ 9 +challengeType: 0 +dashedName: step-9 +--- + +# --description-- + +では `body` について、一部のブラウザで追加されるデフォルトの `margin` を `0` に設定して、水平方向のスクロールバーを取り除きましょう。 + +# --hints-- + +`body` 要素セレクター内に `margin` を追加する必要があります。 + +```js +assert.isNotEmpty(new __helpers.CSSHelp(document).getStyle('body')?.margin); +``` + +`margin` の値を `0` に設定する必要があります。 + +```js +assert.equal(new __helpers.CSSHelp(document).getStyle('body')?.margin, '0px'); +``` + +# --seed-- + +## --seed-contents-- + +```html + + + + + Registration Form + + + +

Registration Form

+

Please fill out this form with the required information

+ + +``` + +```css +--fcc-editable-region-- +body { + width: 100%; + height: 100vh; +} +--fcc-editable-region-- +``` diff --git a/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/basic-javascript/iterate-with-javascript-while-loops.md b/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/basic-javascript/iterate-with-javascript-while-loops.md index 080ec72682eecf..24e9a1f0c8b6bd 100644 --- a/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/basic-javascript/iterate-with-javascript-while-loops.md +++ b/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/basic-javascript/iterate-with-javascript-while-loops.md @@ -29,7 +29,7 @@ Vamos tentar fazer um laço while funcionar empurrando valores para um array. # --instructions-- -Adicione os números de 5 até 1 (inclusive) em ordem descendente para `myArray` usando um laço `while`. +Adicione os números de 5 até 0 (inclusive) em ordem descendente para `myArray` usando um laço `while`. # --hints-- diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f80e0081e0f2052ae5b505.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f80e0081e0f2052ae5b505.md index 423330162fb495..b51ee0e84dc01b 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f80e0081e0f2052ae5b505.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f80e0081e0f2052ae5b505.md @@ -1,8 +1,8 @@ --- id: 60f80e0081e0f2052ae5b505 -title: Passo 17 +title: Passo 18 challengeType: 0 -dashedName: step-17 +dashedName: step-18 --- # --description-- @@ -57,10 +57,10 @@ assert.equal(document.querySelectorAll('input')?.[3]?.type, 'password');
--fcc-editable-region--
- - - - + + + +
--fcc-editable-region--
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81167d0d4910809f88945.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81167d0d4910809f88945.md index 0609425274ca28..5ed6081d091e37 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81167d0d4910809f88945.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81167d0d4910809f88945.md @@ -1,8 +1,8 @@ --- id: 60f81167d0d4910809f88945 -title: Passo 18 +title: Passo 19 challengeType: 0 -dashedName: step-18 +dashedName: step-19 --- # --description-- @@ -49,10 +49,10 @@ assert.exists(document.querySelector('fieldset + input[value="Submit"]')); --fcc-editable-region--
- - - - + + + +
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81616cff80508badf9ad5.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81616cff80508badf9ad5.md index 5eaeb0bc194373..ac141dfc5d7ec5 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81616cff80508badf9ad5.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81616cff80508badf9ad5.md @@ -1,8 +1,8 @@ --- id: 60f81616cff80508badf9ad5 -title: Passo 19 +title: Passo 20 challengeType: 0 -dashedName: step-19 +dashedName: step-20 --- # --description-- @@ -63,10 +63,10 @@ assert.equal(document.querySelector('input[type="submit"]')?.required, false); --fcc-editable-region--
- - - - + + + +
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f83e7bfc09900959f41e20.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f83e7bfc09900959f41e20.md index 08658dd82c96dc..20f48c088cb282 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f83e7bfc09900959f41e20.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f83e7bfc09900959f41e20.md @@ -1,8 +1,8 @@ --- id: 60f83e7bfc09900959f41e20 -title: Passo 20 +title: Passo 21 challengeType: 0 -dashedName: step-20 +dashedName: step-21 --- # --description-- @@ -43,10 +43,10 @@ assert.equal(document.querySelector('input[type="password"]')?.minLength, 8); --fcc-editable-region--
- - - - + + + +
--fcc-editable-region--
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f84ec41116b209c280ba91.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f84ec41116b209c280ba91.md index 75b65fd92a3db2..e248803285ef94 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f84ec41116b209c280ba91.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f84ec41116b209c280ba91.md @@ -1,8 +1,8 @@ --- id: 60f84ec41116b209c280ba91 -title: Passo 21 +title: Passo 22 challengeType: 0 -dashedName: step-21 +dashedName: step-22 --- # --description-- @@ -51,10 +51,10 @@ assert.equal(document.querySelector('input[type="password"]')?.minLength, -1); --fcc-editable-region--
- - - - + + + +
--fcc-editable-region--
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f852f645b5310a8264f555.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f852f645b5310a8264f555.md index d86247e2c3aa23..6b6f8ef42bd514 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f852f645b5310a8264f555.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f852f645b5310a8264f555.md @@ -1,8 +1,8 @@ --- id: 60f852f645b5310a8264f555 -title: Passo 22 +title: Passo 23 challengeType: 0 -dashedName: step-22 +dashedName: step-23 --- # --description-- @@ -42,10 +42,10 @@ assert.exists(document.querySelector('fieldset:nth-child(2)')?.querySelector('la

Please fill out this form with the required information

- - - - + + + +
--fcc-editable-region--
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f85a62fb30c80bcea0cedb.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f85a62fb30c80bcea0cedb.md index 3e28a18d235eee..d625412b7af6d5 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f85a62fb30c80bcea0cedb.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f85a62fb30c80bcea0cedb.md @@ -1,8 +1,8 @@ --- id: 60f85a62fb30c80bcea0cedb -title: Passo 23 +title: Passo 24 challengeType: 0 -dashedName: step-23 +dashedName: step-24 --- # --description-- @@ -49,10 +49,10 @@ assert.equal(document.querySelectorAll('fieldset:nth-child(2) input[type="radio"

Please fill out this form with the required information

- - - - + + + +
--fcc-editable-region--
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8604682407e0d017bbf7f.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8604682407e0d017bbf7f.md index 5b0fdcbf886164..775173a03c891c 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8604682407e0d017bbf7f.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8604682407e0d017bbf7f.md @@ -1,8 +1,8 @@ --- id: 60f8604682407e0d017bbf7f -title: Passo 24 +title: Passo 25 challengeType: 0 -dashedName: step-24 +dashedName: step-25 --- # --description-- @@ -46,10 +46,10 @@ assert.equal(document.querySelector('fieldset:nth-child(2) label:nth-child(3) in

Please fill out this form with the required information

- - - - + + + +
--fcc-editable-region--
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8618d191b940d62038513.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8618d191b940d62038513.md index e13b8a20cee95a..abf16c65ad8f9f 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8618d191b940d62038513.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8618d191b940d62038513.md @@ -1,8 +1,8 @@ --- id: 60f8618d191b940d62038513 -title: Passo 25 +title: Passo 26 challengeType: 0 -dashedName: step-25 +dashedName: step-26 --- # --description-- @@ -70,10 +70,10 @@ assert.equal(document.querySelector('fieldset:nth-child(2) > label:nth-child(3)'

Please fill out this form with the required information

- - - - + + + +
--fcc-editable-region--
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab4a123ce4b04526b082b.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab4a123ce4b04526b082b.md index 9b626a45fbb95b..80359abeab2c71 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab4a123ce4b04526b082b.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab4a123ce4b04526b082b.md @@ -1,8 +1,8 @@ --- id: 60fab4a123ce4b04526b082b -title: Passo 26 +title: Passo 27 challengeType: 0 -dashedName: step-26 +dashedName: step-27 --- # --description-- @@ -48,10 +48,10 @@ assert.isEmpty(document.querySelector('fieldset:nth-child(2) label:nth-child(3)

Please fill out this form with the required information

- - - - + + + +
--fcc-editable-region--
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab8367d35de04e5cb7929.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab8367d35de04e5cb7929.md index 2443c69fd0f225..04216c1418e1e3 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab8367d35de04e5cb7929.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab8367d35de04e5cb7929.md @@ -1,8 +1,8 @@ --- id: 60fab8367d35de04e5cb7929 -title: Passo 27 +title: Passo 29 challengeType: 0 -dashedName: step-27 +dashedName: step-29 --- # --description-- @@ -50,16 +50,16 @@ assert.equal(document.querySelector('fieldset:nth-child(2) > label:nth-child(3)

Please fill out this form with the required information

- - - - + + + +
--fcc-editable-region--
- - - + + +
--fcc-editable-region--
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab9f17fa294054b74228c.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab9f17fa294054b74228c.md index 48a1241d36b7f7..8591ba26fe9cba 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab9f17fa294054b74228c.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab9f17fa294054b74228c.md @@ -1,8 +1,8 @@ --- id: 60fab9f17fa294054b74228c -title: Passo 28 +title: Passo 30 challengeType: 0 -dashedName: step-28 +dashedName: step-30 --- # --description-- @@ -48,17 +48,16 @@ assert.equal(document.querySelector('fieldset:nth-child(3) > label > input')?.ty

Please fill out this form with the required information

- - - - + + + +
- - -
--fcc-editable-region-- diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fabf0dd4959805dbae09e6.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fabf0dd4959805dbae09e6.md index 40a3c8b525865a..51204a8eda0984 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fabf0dd4959805dbae09e6.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fabf0dd4959805dbae09e6.md @@ -1,8 +1,8 @@ --- id: 60fabf0dd4959805dbae09e6 -title: Passo 29 +title: Passo 31 challengeType: 0 -dashedName: step-29 +dashedName: step-31 --- # --description-- @@ -62,16 +62,16 @@ assert.equal(document.querySelector('fieldset:nth-child(3) > label:nth-child(2)

Please fill out this form with the required information

- - - - + + + +
- - -
--fcc-editable-region-- diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac4095512d3066053d73c.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac4095512d3066053d73c.md index 5593dd8a8b0cf8..c860d339f4455a 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac4095512d3066053d73c.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac4095512d3066053d73c.md @@ -1,8 +1,8 @@ --- id: 60fac4095512d3066053d73c -title: Passo 30 +title: Passo 32 challengeType: 0 -dashedName: step-30 +dashedName: step-32 --- # --description-- @@ -42,23 +42,22 @@ assert.equal(document.querySelectorAll('fieldset:nth-child(3) > select > option'

Please fill out this form with the required information

- - - - + + + +
- - -
--fcc-editable-region--
- +
--fcc-editable-region-- diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac56271087806def55b33.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac56271087806def55b33.md index a789a2a487d1e1..42964f599bf285 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac56271087806def55b33.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac56271087806def55b33.md @@ -1,8 +1,8 @@ --- id: 60fac56271087806def55b33 -title: Passo 31 +title: Passo 33 challengeType: 0 -dashedName: step-31 +dashedName: step-33 --- # --description-- @@ -52,23 +52,22 @@ assert.equal(document.querySelectorAll('fieldset > label > select > option')?.le

Please fill out this form with the required information

- - - - + + + +
- - - + + +
--fcc-editable-region--
- + - - - + + + +
- - -
--fcc-editable-region--
- + - - - + + + +
- - -
--fcc-editable-region--
- + - - - + + + +
- - -
--fcc-editable-region--
- + - - - + + + +
- - -
--fcc-editable-region--
- - - + + -
--fcc-editable-region-- diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad0a812d9890938524f50.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad0a812d9890938524f50.md index 9a50e0f4cd2d4c..31a94c0f02200f 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad0a812d9890938524f50.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad0a812d9890938524f50.md @@ -1,8 +1,8 @@ --- id: 60fad0a812d9890938524f50 -title: Passo 36 +title: Passo 39 challengeType: 0 -dashedName: step-36 +dashedName: step-39 --- # --description-- @@ -42,25 +42,24 @@ assert.match(document.querySelector('fieldset:nth-child(3) > label:nth-child(4)

Please fill out this form with the required information

- - - - + + + +
- - -
--fcc-editable-region--
- - - + + -
--fcc-editable-region-- diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad1cafcde010995e15306.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad1cafcde010995e15306.md index c1c2b8b3e415ee..819f40126b84ea 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad1cafcde010995e15306.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad1cafcde010995e15306.md @@ -1,8 +1,8 @@ --- id: 60fad1cafcde010995e15306 -title: Passo 37 +title: Passo 40 challengeType: 0 -dashedName: step-37 +dashedName: step-40 --- # --description-- @@ -102,25 +102,24 @@ Você deve não dar atributos `name` para nenhum elemento `fieldset`.

Please fill out this form with the required information

--fcc-editable-region-- -
- - - - +
+ + + +
- - -
- - - + + -
--fcc-editable-region-- diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad6dfcc0d930a59becf12.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad6dfcc0d930a59becf12.md index d7cca78af4906e..032aa396dc02e1 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad6dfcc0d930a59becf12.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad6dfcc0d930a59becf12.md @@ -1,8 +1,8 @@ --- id: 60fad6dfcc0d930a59becf12 -title: Passo 38 +title: Passo 41 challengeType: 0 -dashedName: step-38 +dashedName: step-41 --- # --description-- @@ -48,24 +48,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('body')?.fontSize, '16px')

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad8e6148f310bba7890b1.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad8e6148f310bba7890b1.md index ae0240c4bdccb8..bdb5587ddbeadb 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad8e6148f310bba7890b1.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad8e6148f310bba7890b1.md @@ -1,8 +1,8 @@ --- id: 60fad8e6148f310bba7890b1 -title: Passo 39 +title: Passo 42 challengeType: 0 -dashedName: step-39 +dashedName: step-42 --- # --description-- @@ -46,24 +46,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('h1, p')?.textAlign, 'cent

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad99e09f9d30c1657e790.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad99e09f9d30c1657e790.md index 859528d59c4504..a0e7e252406b9c 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad99e09f9d30c1657e790.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad99e09f9d30c1657e790.md @@ -1,8 +1,8 @@ --- id: 60fad99e09f9d30c1657e790 -title: Passo 40 +title: Passo 43 challengeType: 0 -dashedName: step-40 +dashedName: step-43 --- # --description-- @@ -58,24 +58,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('form')?.width, '60vw');

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadb18058e950c73925279.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadb18058e950c73925279.md index fa7a85cfa79b1d..3e9aef5d6d6771 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadb18058e950c73925279.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadb18058e950c73925279.md @@ -1,8 +1,8 @@ --- id: 60fadb18058e950c73925279 -title: Passo 41 +title: Passo 44 challengeType: 0 -dashedName: step-41 +dashedName: step-44 --- # --description-- @@ -52,24 +52,23 @@ assert.equal(fieldset?.paddingRight, '0px');

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadce90f85c50d0bb0dd4f.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadce90f85c50d0bb0dd4f.md index 54b1182bca6638..973f8d140af459 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadce90f85c50d0bb0dd4f.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadce90f85c50d0bb0dd4f.md @@ -1,8 +1,8 @@ --- id: 60fadce90f85c50d0bb0dd4f -title: Passo 42 +title: Passo 45 challengeType: 0 -dashedName: step-42 +dashedName: step-45 --- # --description-- @@ -34,24 +34,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('fieldset')?.borderBottom,

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadd972e6ffe0d6858fa2d.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadd972e6ffe0d6858fa2d.md index 9cad06d69a18b4..7d15cead9e5e48 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadd972e6ffe0d6858fa2d.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadd972e6ffe0d6858fa2d.md @@ -1,8 +1,8 @@ --- id: 60fadd972e6ffe0d6858fa2d -title: Passo 44 +title: Passo 47 challengeType: 0 -dashedName: step-44 +dashedName: step-47 --- # --description-- @@ -73,24 +73,23 @@ assert.equal(selFunc(['input, textarea, select', 'input, select, textarea', 'sel

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadfa2b540b70dcfa8b771.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadfa2b540b70dcfa8b771.md index b2e38de4d961fd..4bd472ffa7396f 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadfa2b540b70dcfa8b771.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadfa2b540b70dcfa8b771.md @@ -1,8 +1,8 @@ --- id: 60fadfa2b540b70dcfa8b771 -title: Passo 45 +title: Passo 48 challengeType: 0 -dashedName: step-45 +dashedName: step-48 --- # --description-- @@ -48,26 +48,25 @@ assert(document.querySelectorAll('fieldset:nth-child(2) input')?.[2]?.classList?

Please fill out this form with the required information

- - - - + + + +
--fcc-editable-region--
- - -
--fcc-editable-region--
- - - + + -
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc219d333e37046f474a6e.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc219d333e37046f474a6e.md index 420b424999ec54..946c4654e97faa 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc219d333e37046f474a6e.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc219d333e37046f474a6e.md @@ -1,8 +1,8 @@ --- id: 60fc219d333e37046f474a6e -title: Passo 46 +title: Passo 49 challengeType: 0 -dashedName: step-46 +dashedName: step-49 --- # --description-- @@ -40,24 +40,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('.inline')?.width, 'unset'

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc22d1e64d1b04cdd4e602.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc22d1e64d1b04cdd4e602.md index 4a5e7b35b5bf02..e5fdb020c17963 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc22d1e64d1b04cdd4e602.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc22d1e64d1b04cdd4e602.md @@ -1,8 +1,8 @@ --- id: 60fc22d1e64d1b04cdd4e602 -title: Passo 47 +title: Passo 50 challengeType: 0 -dashedName: step-47 +dashedName: step-50 --- # --description-- @@ -52,24 +52,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('.inline')?.marginLeft, '0

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc236dc04532052926fdac.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc236dc04532052926fdac.md index d577b53b8182f1..72295a660aaf42 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc236dc04532052926fdac.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc236dc04532052926fdac.md @@ -1,8 +1,8 @@ --- id: 60fc236dc04532052926fdac -title: Passo 48 +title: Passo 51 challengeType: 0 -dashedName: step-48 +dashedName: step-51 --- # --description-- @@ -36,24 +36,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('.inline')?.verticalAlign,

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe1bc30415f042faea936.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe1bc30415f042faea936.md index 4dfd6ff45ccd95..5746f02498708c 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe1bc30415f042faea936.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe1bc30415f042faea936.md @@ -1,8 +1,8 @@ --- id: 60ffe1bc30415f042faea936 -title: Passo 49 +title: Passo 52 challengeType: 0 -dashedName: step-49 +dashedName: step-52 --- # --description-- @@ -51,24 +51,23 @@ assert.equal(selFunc(['input, textarea', 'textarea, input'].find(selFunc))?.bord

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe3936796ac04959285a9.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe3936796ac04959285a9.md index 897ba9656b01f1..ab10d01a755fb1 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe3936796ac04959285a9.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe3936796ac04959285a9.md @@ -1,8 +1,8 @@ --- id: 60ffe3936796ac04959285a9 -title: Passo 50 +title: Passo 53 challengeType: 0 -dashedName: step-50 +dashedName: step-53 --- # --description-- @@ -44,24 +44,23 @@ assert.equal(selFunc(['input, textarea', 'textarea, input'].find(selFunc))?.minH

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe4f4ec18cd04dc470c56.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe4f4ec18cd04dc470c56.md index f986ab0f6850ab..cc0bfe7a57ea0a 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe4f4ec18cd04dc470c56.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe4f4ec18cd04dc470c56.md @@ -1,8 +1,8 @@ --- id: 60ffe4f4ec18cd04dc470c56 -title: Passo 51 +title: Passo 54 challengeType: 0 -dashedName: step-51 +dashedName: step-54 --- # --description-- @@ -48,24 +48,23 @@ assert.isEmpty(new __helpers.CSSHelp(document).getStyle('input, textarea')?.minH

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe69ee377c6055e192a46.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe69ee377c6055e192a46.md index 1ea78917ee6646..e1e23cb8cb9b19 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe69ee377c6055e192a46.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe69ee377c6055e192a46.md @@ -1,8 +1,8 @@ --- id: 60ffe69ee377c6055e192a46 -title: Passo 52 +title: Passo 55 challengeType: 0 -dashedName: step-52 +dashedName: step-55 --- # --description-- @@ -54,24 +54,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('input[type="submit"]')?.w

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe7d8aae62c05bcc9e7eb.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe7d8aae62c05bcc9e7eb.md index f5a7068e3e3a29..f800a371cd52e1 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe7d8aae62c05bcc9e7eb.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe7d8aae62c05bcc9e7eb.md @@ -1,8 +1,8 @@ --- id: 60ffe7d8aae62c05bcc9e7eb -title: Passo 53 +title: Passo 56 challengeType: 0 -dashedName: step-53 +dashedName: step-56 --- # --description-- @@ -43,24 +43,23 @@ assert.isEmpty(new __helpers.CSSHelp(document).getStyle('input[type="submit"]')?

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe8a5ceb0e90618db06d9.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe8a5ceb0e90618db06d9.md index c395864f0ed9b9..a50dcb0f875a5f 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe8a5ceb0e90618db06d9.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe8a5ceb0e90618db06d9.md @@ -1,8 +1,8 @@ --- id: 60ffe8a5ceb0e90618db06d9 -title: Passo 54 +title: Passo 57 challengeType: 0 -dashedName: step-54 +dashedName: step-57 --- # --description-- @@ -40,24 +40,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('input[type="submit"]')?.f

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe947a868ec068f7850f6.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe947a868ec068f7850f6.md index 07eb76c62078ec..2666b5ebe90af1 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe947a868ec068f7850f6.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe947a868ec068f7850f6.md @@ -1,8 +1,8 @@ --- id: 60ffe947a868ec068f7850f6 -title: Passo 55 +title: Passo 58 challengeType: 0 -dashedName: step-55 +dashedName: step-58 --- # --description-- @@ -40,24 +40,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('input[type="submit"]')?.b

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe9cb47809106eda2f2c9.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe9cb47809106eda2f2c9.md index e60d5e1a62977c..8f4722deceae6d 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe9cb47809106eda2f2c9.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe9cb47809106eda2f2c9.md @@ -1,8 +1,8 @@ --- id: 60ffe9cb47809106eda2f2c9 -title: Passo 56 +title: Passo 59 challengeType: 0 -dashedName: step-56 +dashedName: step-59 --- # --description-- @@ -43,24 +43,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('input[type="submit"]')?.m

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffec2825da1007509ddd06.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffec2825da1007509ddd06.md index c4066cdc174087..ee76736efb360f 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffec2825da1007509ddd06.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffec2825da1007509ddd06.md @@ -1,8 +1,8 @@ --- id: 60ffec2825da1007509ddd06 -title: Passo 57 +title: Passo 60 challengeType: 0 -dashedName: step-57 +dashedName: step-60 --- # --description-- @@ -42,24 +42,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('input[type="file"]')?.pad

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffecefac971607ae73c60f.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffecefac971607ae73c60f.md index 151a8bdd836353..70b90fbfb7fd22 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffecefac971607ae73c60f.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffecefac971607ae73c60f.md @@ -1,8 +1,8 @@ --- id: 60ffecefac971607ae73c60f -title: Passo 58 +title: Passo 61 challengeType: 0 -dashedName: step-58 +dashedName: step-61 --- # --description-- @@ -40,24 +40,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('form')?.paddingBottom, '2

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffefd6479a3d084fb77cbc.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffefd6479a3d084fb77cbc.md index c105b23d3175ed..7b36d3f8a16d31 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffefd6479a3d084fb77cbc.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffefd6479a3d084fb77cbc.md @@ -1,8 +1,8 @@ --- id: 60ffefd6479a3d084fb77cbc -title: Passo 59 +title: Passo 62 challengeType: 0 -dashedName: step-59 +dashedName: step-62 --- # --description-- @@ -42,24 +42,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('a')?.color, 'rgb(223, 223

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
@@ -172,24 +171,23 @@ input[type="file"] {

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62b30924c5e4ef0daba23b5e.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62b30924c5e4ef0daba23b5e.md index 18e4b7652f3a7b..d041c34ba56451 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62b30924c5e4ef0daba23b5e.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62b30924c5e4ef0daba23b5e.md @@ -1,8 +1,8 @@ --- id: 62b30924c5e4ef0daba23b5e -title: Passo 43 +title: Passo 46 challengeType: 0 -dashedName: step-43 +dashedName: step-46 --- # --description-- @@ -47,24 +47,23 @@ assert(borderBottom === 'none' || borderBottom === 'medium none');

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8b9dab5ac88e4d3d43a3.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8b9dab5ac88e4d3d43a3.md new file mode 100644 index 00000000000000..091d17a8eae8ca --- /dev/null +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8b9dab5ac88e4d3d43a3.md @@ -0,0 +1,109 @@ +--- +id: 62ff8b9dab5ac88e4d3d43a3 +title: Passo 17 +challengeType: 0 +dashedName: step-17 +--- + +# --description-- + +Seguindo as melhores práticas de acessibilidade, vincule os elementos `input` e `label` utilizando o atributo `for`. + +Use estes valores para as respectivas propriedades de `id`: `first-name`, `last-name`, `email` e `new-password` + +# --hints-- + +O primeiro elemento `input` deve ter o `id` `first-name`. + +```js +assert(document.querySelectorAll('input')?.[0]?.matches('#first-name')) +``` + +O segundo elemento `input` deve ter o `id` `last-name`. + +```js +assert(document.querySelectorAll('input')?.[1]?.matches('#last-name')) +``` + +O terceiro elemento `input` deve ter o `id` `email`. + +```js +assert(document.querySelectorAll('input')?.[2]?.matches('#email')) +``` + +O quarto elemento `input` deve ter o `id` `new-password`. + +```js +assert(document.querySelectorAll('input')?.[3]?.matches('#new-password')) +``` + +O primeiro elemento `label` deve ter o atributo `for` com o valor `first-name`. + +```js +assert(document.querySelectorAll('label')?.[0]?.matches('label[for="first-name"]')) +``` + +O segundo elemento `label` deve ter o atributo `for` com o valor `last-name`. + +```js +assert(document.querySelectorAll('label')?.[1]?.matches('label[for="last-name"]')) +``` + +O terceiro elemento `label` deve ter o atributo `for` com o valor `email`. + +```js +assert(document.querySelectorAll('label')?.[2]?.matches('label[for="email"]')) +``` + +O quarto elemento `label` deve ter o atributo `for` com o valor `new-password`. + +```js +assert(document.querySelectorAll('label')?.[3]?.matches('label[for="new-password"]')) +``` + +# --seed-- + +## --seed-contents-- + +```html + + + + + Registration Form + + + +

Registration Form

+

Please fill out this form with the required information

+ +--fcc-editable-region-- +
+ + + + +
+--fcc-editable-region-- +
+
+ + + +``` + +```css +body { + width: 100%; + height: 100vh; + margin: 0; + background-color: #1b1b32; + color: #f5f6f7; +} + +label { + display: block; + margin: 0.5rem 0; +} + +``` diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8e998d3e7eae14d6ae3b.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8e998d3e7eae14d6ae3b.md new file mode 100644 index 00000000000000..67bea8ac7104dc --- /dev/null +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8e998d3e7eae14d6ae3b.md @@ -0,0 +1,102 @@ +--- +id: 62ff8e998d3e7eae14d6ae3b +title: Passo 28 +challengeType: 0 +dashedName: step-28 +--- + +# --description-- + +Siga as melhores práticas de acessibilidade vinculando os elementos `input` e `label` no segundo `fieldset`. + +Use estes valores para as respectivas propriedades de `id`: `personal-account`, `business-account` e `terms-and-conditions` + +# --hints-- + +O primeiro elemento `input` deve ter o `id` `personal-account`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(2) input')?.[0]?.matches('#personal-account')) +``` + +O segundo elemento `input` deve ter o `id` `business-account`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(2) input')?.[1]?.matches('#business-account')) +``` + +O terceiro elemento `input` deve ter o `id` `terms-and-conditions`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(2) input')?.[2]?.matches('#terms-and-conditions')) +``` + +O primeiro elemento `label` deve ter o atributo `for` com o valor `personal-account`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(2) label')?.[0]?.matches('label[for="personal-account"]')) +``` + +O segundo elemento `label` deve ter o atributo `for` com o valor `business-account`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(2) label')?.[1]?.matches('label[for="business-account"]')) +``` + +O terceiro elemento `label` deve ter o atributo `for` com o valor `terms-and-conditions`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(2) label')?.[2]?.matches('label[for="terms-and-conditions"]')) +``` + +# --seed-- + +## --seed-contents-- + +```html + + + + + Registration Form + + + +

Registration Form

+

Please fill out this form with the required information

+
+
+ + + + +
+--fcc-editable-region-- +
+ + + +
+--fcc-editable-region-- +
+ +
+ + +``` + +```css +body { + width: 100%; + height: 100vh; + margin: 0; + background-color: #1b1b32; + color: #f5f6f7; +} + +label { + display: block; + margin: 0.5rem 0; +} + +``` diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff919a7b5612c0670923a5.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff919a7b5612c0670923a5.md new file mode 100644 index 00000000000000..d7b4d9a2216527 --- /dev/null +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff919a7b5612c0670923a5.md @@ -0,0 +1,131 @@ +--- +id: 62ff919a7b5612c0670923a5 +title: Passo 37 +challengeType: 0 +dashedName: step-37 +--- + +# --description-- + +Vincule os elementos de formulário aplicáveis e os elementos `label`. + +Use estes valores para as respectivas propriedades de `id`: `profile-picture`, `age`, `referrer` e `bio` + +# --hints-- + +O primeiro elemento `input` deve ter o `id` `profile-picture`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(3) input')?.[0]?.matches('#profile-picture')) +``` + +O segundo elemento `input` deve ter o `id` `age`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(3) input')?.[1]?.matches('#age')) +``` + +O elemento `select` deve ter o `id` `referrer`. + +```js +assert(document.querySelector('fieldset:nth-of-type(3) select')?.matches('#referrer')) +``` + +O elemento `textarea` deve ter o `id` `bio`. + +```js +assert(document.querySelector('fieldset:nth-of-type(3) textarea')?.matches('#bio')) +``` + +O primeiro elemento `label` deve ter o atributo `for` com o valor `profile-picture`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(3) label')?.[0]?.matches('label[for="profile-picture"]')) +``` + +O segundo elemento `label` deve ter o atributo `for` com o valor `age`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(3) label')?.[1]?.matches('label[for="age"]')) +``` + +O terceiro elemento `label` deve ter o atributo `for` com o valor `referrer`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(3) label')?.[2]?.matches('label[for="referrer"]')) +``` + +O quarto elemento `label` deve ter o atributo `for` com o valor `bio`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(3) label')?.[3]?.matches('label[for="bio"]')) +``` + +# --seed-- + +## --seed-contents-- + +```html + + + + + Registration Form + + + +

Registration Form

+

Please fill out this form with the required information

+
+
+ + + + +
+
+ + + +
+--fcc-editable-region-- +
+ + + + +
+--fcc-editable-region-- + +
+ + +``` + +```css +body { + width: 100%; + height: 100vh; + margin: 0; + background-color: #1b1b32; + color: #f5f6f7; +} + +label { + display: block; + margin: 0.5rem 0; +} + +``` diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ebcba99bfa46a15370b11.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ebcba99bfa46a15370b11.md index df3bf7fffa5e98..752b747990f339 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ebcba99bfa46a15370b11.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ebcba99bfa46a15370b11.md @@ -7,7 +7,19 @@ dashedName: step-27 # --description-- -Agora, você precisa torná-lo responsivo. Adicione uma `@media` query com uma `max-width` de `768px`. +A regra `@media`, também conhecida como media query, é usada para aplicar condicionalmente o CSS. Media queries são comumente usadas para aplicar o CSS baseado na largura da viewport usando as propriedades `max-width` e `min-width`. + +No exemplo abaixo, o preenchimento (padding) é aplicado à classe `.card` quando a viewport tiver `960px` de largura ou menos. + +```css +@media (max-width: 960px) { + .card { + padding: 2rem; + } +} +``` + +Adicione uma media query que será aplicada quando a janela de visualização tiver `768px` de largura ou menos. # --hints-- diff --git a/curriculum/challenges/ukrainian/03-front-end-development-libraries/bootstrap/call-out-optional-actions-with-btn-info.md b/curriculum/challenges/ukrainian/03-front-end-development-libraries/bootstrap/call-out-optional-actions-with-btn-info.md index b9d8dfedfe1c8b..c77f40094a8274 100644 --- a/curriculum/challenges/ukrainian/03-front-end-development-libraries/bootstrap/call-out-optional-actions-with-btn-info.md +++ b/curriculum/challenges/ukrainian/03-front-end-development-libraries/bootstrap/call-out-optional-actions-with-btn-info.md @@ -10,7 +10,7 @@ dashedName: call-out-optional-actions-with-btn-info Bootstrap має набір заздалегідь встановлених кольорів для кнопок. Клас `btn-info` використовують, щоб привернути увагу до додаткових дій, які може виконувати користувач. -Створіть нову кнопку блок-елемент Bootstrap з текстом `Info` під вашою кнопкою `Like`, і додайте до неї класи Bootstrap `btn-info` та `btn-block`. +Під своєю кнопкою `Like` створіть нову кнопку Bootstrap на рівні блоку з текстом `Info` та додайте до неї Bootstrap клас `btn-info`. Зверніть увагу, що цим кнопкам все ще необхідні класи `btn` та `btn-block`. diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f80e0081e0f2052ae5b505.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f80e0081e0f2052ae5b505.md index f2b41c68a92fd8..ab8cb3ee206bb7 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f80e0081e0f2052ae5b505.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f80e0081e0f2052ae5b505.md @@ -1,8 +1,8 @@ --- id: 60f80e0081e0f2052ae5b505 -title: Крок 17 +title: Крок 18 challengeType: 0 -dashedName: step-17 +dashedName: step-18 --- # --description-- @@ -57,10 +57,10 @@ assert.equal(document.querySelectorAll('input')?.[3]?.type, 'password');
--fcc-editable-region--
- - - - + + + +
--fcc-editable-region--
diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81167d0d4910809f88945.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81167d0d4910809f88945.md index fec761e23dd1f8..c3dbd0bbdc383d 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81167d0d4910809f88945.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81167d0d4910809f88945.md @@ -1,8 +1,8 @@ --- id: 60f81167d0d4910809f88945 -title: Крок 18 +title: Крок 19 challengeType: 0 -dashedName: step-18 +dashedName: step-19 --- # --description-- @@ -49,10 +49,10 @@ assert.exists(document.querySelector('fieldset + input[value="Submit"]')); --fcc-editable-region--
- - - - + + + +
diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81616cff80508badf9ad5.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81616cff80508badf9ad5.md index a14691e742528a..68ba92ffd868a8 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81616cff80508badf9ad5.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81616cff80508badf9ad5.md @@ -1,8 +1,8 @@ --- id: 60f81616cff80508badf9ad5 -title: Крок 19 +title: Крок 20 challengeType: 0 -dashedName: step-19 +dashedName: step-20 --- # --description-- @@ -63,10 +63,10 @@ assert.equal(document.querySelector('input[type="submit"]')?.required, false); --fcc-editable-region--
- - - - + + + +
diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f83e7bfc09900959f41e20.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f83e7bfc09900959f41e20.md index 915434f785622a..366c0eb70a1936 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f83e7bfc09900959f41e20.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f83e7bfc09900959f41e20.md @@ -1,8 +1,8 @@ --- id: 60f83e7bfc09900959f41e20 -title: Крок 20 +title: Крок 21 challengeType: 0 -dashedName: step-20 +dashedName: step-21 --- # --description-- @@ -43,10 +43,10 @@ assert.equal(document.querySelector('input[type="password"]')?.minLength, 8); --fcc-editable-region--
- - - - + + + +
--fcc-editable-region--
diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f84ec41116b209c280ba91.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f84ec41116b209c280ba91.md index 97ef88ccaa045c..ada8ca7715bef1 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f84ec41116b209c280ba91.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f84ec41116b209c280ba91.md @@ -1,8 +1,8 @@ --- id: 60f84ec41116b209c280ba91 -title: Крок 21 +title: Крок 22 challengeType: 0 -dashedName: step-21 +dashedName: step-22 --- # --description-- @@ -51,10 +51,10 @@ assert.equal(document.querySelector('input[type="password"]')?.minLength, -1); --fcc-editable-region--
- - - - + + + +
--fcc-editable-region--
diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f852f645b5310a8264f555.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f852f645b5310a8264f555.md index 73f7d74a35b0eb..a989cbe4d95438 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f852f645b5310a8264f555.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f852f645b5310a8264f555.md @@ -1,8 +1,8 @@ --- id: 60f852f645b5310a8264f555 -title: Крок 22 +title: Крок 23 challengeType: 0 -dashedName: step-22 +dashedName: step-23 --- # --description-- @@ -42,10 +42,10 @@ assert.exists(document.querySelector('fieldset:nth-child(2)')?.querySelector('la

Please fill out this form with the required information

- - - - + + + +
--fcc-editable-region--
diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f85a62fb30c80bcea0cedb.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f85a62fb30c80bcea0cedb.md index a4396eeff74048..4f81eab6deb0ee 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f85a62fb30c80bcea0cedb.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f85a62fb30c80bcea0cedb.md @@ -1,8 +1,8 @@ --- id: 60f85a62fb30c80bcea0cedb -title: Крок 23 +title: Крок 24 challengeType: 0 -dashedName: step-23 +dashedName: step-24 --- # --description-- @@ -49,10 +49,10 @@ assert.equal(document.querySelectorAll('fieldset:nth-child(2) input[type="radio"

Please fill out this form with the required information

- - - - + + + +
--fcc-editable-region--
diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8604682407e0d017bbf7f.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8604682407e0d017bbf7f.md index da2c8568aece16..fe3195a0863cc8 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8604682407e0d017bbf7f.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8604682407e0d017bbf7f.md @@ -1,8 +1,8 @@ --- id: 60f8604682407e0d017bbf7f -title: Крок 24 +title: Крок 25 challengeType: 0 -dashedName: step-24 +dashedName: step-25 --- # --description-- @@ -46,10 +46,10 @@ assert.equal(document.querySelector('fieldset:nth-child(2) label:nth-child(3) in

Please fill out this form with the required information

- - - - + + + +
--fcc-editable-region--
diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8618d191b940d62038513.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8618d191b940d62038513.md index bd69772f15d0f1..8a7be764486b2d 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8618d191b940d62038513.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8618d191b940d62038513.md @@ -1,8 +1,8 @@ --- id: 60f8618d191b940d62038513 -title: Крок 25 +title: Крок 26 challengeType: 0 -dashedName: step-25 +dashedName: step-26 --- # --description-- @@ -70,10 +70,10 @@ assert.equal(document.querySelector('fieldset:nth-child(2) > label:nth-child(3)'

Please fill out this form with the required information

- - - - + + + +
--fcc-editable-region--
diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab4a123ce4b04526b082b.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab4a123ce4b04526b082b.md index 6b93686b68bd0e..f6f255a25eef40 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab4a123ce4b04526b082b.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab4a123ce4b04526b082b.md @@ -1,8 +1,8 @@ --- id: 60fab4a123ce4b04526b082b -title: Крок 26 +title: Крок 27 challengeType: 0 -dashedName: step-26 +dashedName: step-27 --- # --description-- @@ -48,10 +48,10 @@ assert.isEmpty(document.querySelector('fieldset:nth-child(2) label:nth-child(3)

Please fill out this form with the required information

- - - - + + + +
--fcc-editable-region--
diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab8367d35de04e5cb7929.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab8367d35de04e5cb7929.md index bd6c67a7a59815..82b5da8868acfd 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab8367d35de04e5cb7929.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab8367d35de04e5cb7929.md @@ -1,8 +1,8 @@ --- id: 60fab8367d35de04e5cb7929 -title: Крок 27 +title: Крок 29 challengeType: 0 -dashedName: step-27 +dashedName: step-29 --- # --description-- @@ -50,16 +50,16 @@ assert.equal(document.querySelector('fieldset:nth-child(2) > label:nth-child(3)

Please fill out this form with the required information

- - - - + + + +
--fcc-editable-region--
- - - + + +
--fcc-editable-region--
diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab9f17fa294054b74228c.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab9f17fa294054b74228c.md index edbae5d10fb6bf..d074eaa1073595 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab9f17fa294054b74228c.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab9f17fa294054b74228c.md @@ -1,8 +1,8 @@ --- id: 60fab9f17fa294054b74228c -title: Крок 28 +title: Крок 30 challengeType: 0 -dashedName: step-28 +dashedName: step-30 --- # --description-- @@ -48,17 +48,16 @@ assert.equal(document.querySelector('fieldset:nth-child(3) > label > input')?.ty

Please fill out this form with the required information

- - - - + + + +
- - -
--fcc-editable-region-- diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fabf0dd4959805dbae09e6.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fabf0dd4959805dbae09e6.md index f139363edeca28..e95f4b8284663b 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fabf0dd4959805dbae09e6.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fabf0dd4959805dbae09e6.md @@ -1,8 +1,8 @@ --- id: 60fabf0dd4959805dbae09e6 -title: Крок 29 +title: Крок 31 challengeType: 0 -dashedName: step-29 +dashedName: step-31 --- # --description-- @@ -62,16 +62,16 @@ assert.equal(document.querySelector('fieldset:nth-child(3) > label:nth-child(2)

Please fill out this form with the required information

- - - - + + + +
- - -
--fcc-editable-region-- diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac4095512d3066053d73c.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac4095512d3066053d73c.md index 099fbde4111623..2b4b81bcfedc2a 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac4095512d3066053d73c.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac4095512d3066053d73c.md @@ -1,8 +1,8 @@ --- id: 60fac4095512d3066053d73c -title: Крок 30 +title: Крок 32 challengeType: 0 -dashedName: step-30 +dashedName: step-32 --- # --description-- @@ -42,23 +42,22 @@ assert.equal(document.querySelectorAll('fieldset:nth-child(3) > select > option'

Please fill out this form with the required information

- - - - + + + +
- - -
--fcc-editable-region--
- +
--fcc-editable-region-- diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac56271087806def55b33.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac56271087806def55b33.md index ed9f04e0b3afd1..fcdbd10bc4221c 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac56271087806def55b33.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac56271087806def55b33.md @@ -1,8 +1,8 @@ --- id: 60fac56271087806def55b33 -title: Крок 31 +title: Крок 33 challengeType: 0 -dashedName: step-31 +dashedName: step-33 --- # --description-- @@ -52,23 +52,22 @@ assert.equal(document.querySelectorAll('fieldset > label > select > option')?.le

Please fill out this form with the required information

- - - - + + + +
- - - + + +
--fcc-editable-region--
- + - - - + + + +
- - -
--fcc-editable-region--
- + - - - + + + +
- - -
--fcc-editable-region--
- + - - - + + + +
- - -
--fcc-editable-region--
- + - - - + + + +
- - -
--fcc-editable-region--
- - - + + -
--fcc-editable-region-- diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad0a812d9890938524f50.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad0a812d9890938524f50.md index 7e3877371c2eb2..65acb40e57133c 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad0a812d9890938524f50.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad0a812d9890938524f50.md @@ -1,8 +1,8 @@ --- id: 60fad0a812d9890938524f50 -title: Крок 36 +title: Крок 39 challengeType: 0 -dashedName: step-36 +dashedName: step-39 --- # --description-- @@ -42,25 +42,24 @@ assert.match(document.querySelector('fieldset:nth-child(3) > label:nth-child(4)

Please fill out this form with the required information

- - - - + + + +
- - -
--fcc-editable-region--
- - - + + -
--fcc-editable-region-- diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad1cafcde010995e15306.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad1cafcde010995e15306.md index 1829dcacb39db4..dd3b57ece5b3f6 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad1cafcde010995e15306.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad1cafcde010995e15306.md @@ -1,8 +1,8 @@ --- id: 60fad1cafcde010995e15306 -title: Крок 37 +title: Крок 40 challengeType: 0 -dashedName: step-37 +dashedName: step-40 --- # --description-- @@ -102,25 +102,24 @@ assert.isNotEmpty(document.querySelector('textarea')?.name);

Please fill out this form with the required information

--fcc-editable-region-- -
- - - - +
+ + + +
- - -
- - - + + -
--fcc-editable-region-- diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad6dfcc0d930a59becf12.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad6dfcc0d930a59becf12.md index a5f1e9fefbd315..b341bf94726881 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad6dfcc0d930a59becf12.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad6dfcc0d930a59becf12.md @@ -1,8 +1,8 @@ --- id: 60fad6dfcc0d930a59becf12 -title: Крок 38 +title: Крок 41 challengeType: 0 -dashedName: step-38 +dashedName: step-41 --- # --description-- @@ -48,24 +48,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('body')?.fontSize, '16px')

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad8e6148f310bba7890b1.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad8e6148f310bba7890b1.md index ca5f128546017f..feaec6ec913478 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad8e6148f310bba7890b1.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad8e6148f310bba7890b1.md @@ -1,8 +1,8 @@ --- id: 60fad8e6148f310bba7890b1 -title: Крок 39 +title: Крок 42 challengeType: 0 -dashedName: step-39 +dashedName: step-42 --- # --description-- @@ -46,24 +46,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('h1, p')?.textAlign, 'cent

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad99e09f9d30c1657e790.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad99e09f9d30c1657e790.md index 93683f404bd814..522880677113fa 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad99e09f9d30c1657e790.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad99e09f9d30c1657e790.md @@ -1,8 +1,8 @@ --- id: 60fad99e09f9d30c1657e790 -title: Крок 40 +title: Крок 43 challengeType: 0 -dashedName: step-40 +dashedName: step-43 --- # --description-- @@ -58,24 +58,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('form')?.width, '60vw');

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadb18058e950c73925279.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadb18058e950c73925279.md index e1ebcee9dabd0b..398929d43a1b3a 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadb18058e950c73925279.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadb18058e950c73925279.md @@ -1,8 +1,8 @@ --- id: 60fadb18058e950c73925279 -title: Крок 41 +title: Крок 44 challengeType: 0 -dashedName: step-41 +dashedName: step-44 --- # --description-- @@ -52,24 +52,23 @@ assert.equal(fieldset?.paddingRight, '0px');

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadce90f85c50d0bb0dd4f.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadce90f85c50d0bb0dd4f.md index 1601c876b4818d..faa738f5045ce9 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadce90f85c50d0bb0dd4f.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadce90f85c50d0bb0dd4f.md @@ -1,8 +1,8 @@ --- id: 60fadce90f85c50d0bb0dd4f -title: Крок 42 +title: Крок 45 challengeType: 0 -dashedName: step-42 +dashedName: step-45 --- # --description-- @@ -34,24 +34,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('fieldset')?.borderBottom,

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadd972e6ffe0d6858fa2d.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadd972e6ffe0d6858fa2d.md index b54ec8f396e07e..9da56189b64f54 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadd972e6ffe0d6858fa2d.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadd972e6ffe0d6858fa2d.md @@ -1,8 +1,8 @@ --- id: 60fadd972e6ffe0d6858fa2d -title: Крок 44 +title: Крок 47 challengeType: 0 -dashedName: step-44 +dashedName: step-47 --- # --description-- @@ -73,24 +73,23 @@ assert.equal(selFunc(['input, textarea, select', 'input, select, textarea', 'sel

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadfa2b540b70dcfa8b771.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadfa2b540b70dcfa8b771.md index f799aa338d1b97..d6a6fadc03538d 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadfa2b540b70dcfa8b771.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fadfa2b540b70dcfa8b771.md @@ -1,8 +1,8 @@ --- id: 60fadfa2b540b70dcfa8b771 -title: Крок 45 +title: Крок 48 challengeType: 0 -dashedName: step-45 +dashedName: step-48 --- # --description-- @@ -48,26 +48,25 @@ assert(document.querySelectorAll('fieldset:nth-child(2) input')?.[2]?.classList?

Please fill out this form with the required information

- - - - + + + +
--fcc-editable-region--
- - -
--fcc-editable-region--
- - - + + -
diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc219d333e37046f474a6e.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc219d333e37046f474a6e.md index f43b8020fff93a..4bb314e58926e8 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc219d333e37046f474a6e.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc219d333e37046f474a6e.md @@ -1,8 +1,8 @@ --- id: 60fc219d333e37046f474a6e -title: Крок 46 +title: Крок 49 challengeType: 0 -dashedName: step-46 +dashedName: step-49 --- # --description-- @@ -40,24 +40,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('.inline')?.width, 'unset'

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc22d1e64d1b04cdd4e602.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc22d1e64d1b04cdd4e602.md index 927e5118746caa..2bc9e57d90e179 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc22d1e64d1b04cdd4e602.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc22d1e64d1b04cdd4e602.md @@ -1,8 +1,8 @@ --- id: 60fc22d1e64d1b04cdd4e602 -title: Крок 47 +title: Крок 50 challengeType: 0 -dashedName: step-47 +dashedName: step-50 --- # --description-- @@ -52,24 +52,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('.inline')?.marginLeft, '0

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc236dc04532052926fdac.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc236dc04532052926fdac.md index eaea858f4d615c..6c6ecd971b054c 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc236dc04532052926fdac.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fc236dc04532052926fdac.md @@ -1,8 +1,8 @@ --- id: 60fc236dc04532052926fdac -title: Крок 48 +title: Крок 51 challengeType: 0 -dashedName: step-48 +dashedName: step-51 --- # --description-- @@ -36,24 +36,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('.inline')?.verticalAlign,

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe1bc30415f042faea936.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe1bc30415f042faea936.md index df701ea7180930..edadb84728b8ba 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe1bc30415f042faea936.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe1bc30415f042faea936.md @@ -1,8 +1,8 @@ --- id: 60ffe1bc30415f042faea936 -title: Крок 49 +title: Крок 52 challengeType: 0 -dashedName: step-49 +dashedName: step-52 --- # --description-- @@ -51,24 +51,23 @@ assert.equal(selFunc(['input, textarea', 'textarea, input'].find(selFunc))?.bord

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe3936796ac04959285a9.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe3936796ac04959285a9.md index 752d6a74643ee0..6b16ad6df86bc8 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe3936796ac04959285a9.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe3936796ac04959285a9.md @@ -1,8 +1,8 @@ --- id: 60ffe3936796ac04959285a9 -title: Крок 50 +title: Крок 53 challengeType: 0 -dashedName: step-50 +dashedName: step-53 --- # --description-- @@ -44,24 +44,23 @@ assert.equal(selFunc(['input, textarea', 'textarea, input'].find(selFunc))?.minH

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe4f4ec18cd04dc470c56.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe4f4ec18cd04dc470c56.md index 0a3ec5f2a4b4dd..e6ab5305a11273 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe4f4ec18cd04dc470c56.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe4f4ec18cd04dc470c56.md @@ -1,8 +1,8 @@ --- id: 60ffe4f4ec18cd04dc470c56 -title: Крок 51 +title: Крок 54 challengeType: 0 -dashedName: step-51 +dashedName: step-54 --- # --description-- @@ -48,24 +48,23 @@ assert.isEmpty(new __helpers.CSSHelp(document).getStyle('input, textarea')?.minH

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe69ee377c6055e192a46.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe69ee377c6055e192a46.md index f28d2e87f60a44..93b2bcffa67f25 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe69ee377c6055e192a46.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe69ee377c6055e192a46.md @@ -1,8 +1,8 @@ --- id: 60ffe69ee377c6055e192a46 -title: Крок 52 +title: Крок 55 challengeType: 0 -dashedName: step-52 +dashedName: step-55 --- # --description-- @@ -54,24 +54,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('input[type="submit"]')?.w

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe7d8aae62c05bcc9e7eb.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe7d8aae62c05bcc9e7eb.md index a274e800a66315..3a3eeff16f74c8 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe7d8aae62c05bcc9e7eb.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe7d8aae62c05bcc9e7eb.md @@ -1,8 +1,8 @@ --- id: 60ffe7d8aae62c05bcc9e7eb -title: Крок 53 +title: Крок 56 challengeType: 0 -dashedName: step-53 +dashedName: step-56 --- # --description-- @@ -43,24 +43,23 @@ assert.isEmpty(new __helpers.CSSHelp(document).getStyle('input[type="submit"]')?

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe8a5ceb0e90618db06d9.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe8a5ceb0e90618db06d9.md index 3e7ac9c6f6f5c9..ed82a870735a15 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe8a5ceb0e90618db06d9.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe8a5ceb0e90618db06d9.md @@ -1,8 +1,8 @@ --- id: 60ffe8a5ceb0e90618db06d9 -title: Крок 54 +title: Крок 57 challengeType: 0 -dashedName: step-54 +dashedName: step-57 --- # --description-- @@ -40,24 +40,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('input[type="submit"]')?.f

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe947a868ec068f7850f6.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe947a868ec068f7850f6.md index 217c54fbef8281..6fbf37324eb19a 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe947a868ec068f7850f6.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe947a868ec068f7850f6.md @@ -1,8 +1,8 @@ --- id: 60ffe947a868ec068f7850f6 -title: Крок 55 +title: Крок 58 challengeType: 0 -dashedName: step-55 +dashedName: step-58 --- # --description-- @@ -40,24 +40,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('input[type="submit"]')?.b

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe9cb47809106eda2f2c9.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe9cb47809106eda2f2c9.md index c88f25a657f92c..22a8fa13313dff 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe9cb47809106eda2f2c9.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffe9cb47809106eda2f2c9.md @@ -1,8 +1,8 @@ --- id: 60ffe9cb47809106eda2f2c9 -title: Крок 56 +title: Крок 59 challengeType: 0 -dashedName: step-56 +dashedName: step-59 --- # --description-- @@ -43,24 +43,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('input[type="submit"]')?.m

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffec2825da1007509ddd06.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffec2825da1007509ddd06.md index 0bbf3d689aabea..205079025bd1ea 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffec2825da1007509ddd06.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffec2825da1007509ddd06.md @@ -1,8 +1,8 @@ --- id: 60ffec2825da1007509ddd06 -title: Крок 57 +title: Крок 60 challengeType: 0 -dashedName: step-57 +dashedName: step-60 --- # --description-- @@ -42,24 +42,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('input[type="file"]')?.pad

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffecefac971607ae73c60f.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffecefac971607ae73c60f.md index e2f37ab67c4e4b..bd6a0e0820e33d 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffecefac971607ae73c60f.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffecefac971607ae73c60f.md @@ -1,8 +1,8 @@ --- id: 60ffecefac971607ae73c60f -title: Крок 58 +title: Крок 61 challengeType: 0 -dashedName: step-58 +dashedName: step-61 --- # --description-- @@ -40,24 +40,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('form')?.paddingBottom, '2

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffefd6479a3d084fb77cbc.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffefd6479a3d084fb77cbc.md index 8a1f756518d1ab..0258ad37f092c6 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffefd6479a3d084fb77cbc.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60ffefd6479a3d084fb77cbc.md @@ -1,8 +1,8 @@ --- id: 60ffefd6479a3d084fb77cbc -title: Крок 59 +title: Крок 62 challengeType: 0 -dashedName: step-59 +dashedName: step-62 --- # --description-- @@ -42,24 +42,23 @@ assert.equal(new __helpers.CSSHelp(document).getStyle('a')?.color, 'rgb(223, 223

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
@@ -172,24 +171,23 @@ input[type="file"] {

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62b30924c5e4ef0daba23b5e.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62b30924c5e4ef0daba23b5e.md index 0b48ac62584042..6a5ba1b7384fc1 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62b30924c5e4ef0daba23b5e.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62b30924c5e4ef0daba23b5e.md @@ -1,8 +1,8 @@ --- id: 62b30924c5e4ef0daba23b5e -title: Крок 43 +title: Крок 46 challengeType: 0 -dashedName: step-43 +dashedName: step-46 --- # --description-- @@ -47,24 +47,23 @@ assert(borderBottom === 'none' || borderBottom === 'medium none');

Please fill out this form with the required information

- - - - + + + +
- - -
- - - + + -
diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8b9dab5ac88e4d3d43a3.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8b9dab5ac88e4d3d43a3.md new file mode 100644 index 00000000000000..64cccf8b03f14f --- /dev/null +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8b9dab5ac88e4d3d43a3.md @@ -0,0 +1,109 @@ +--- +id: 62ff8b9dab5ac88e4d3d43a3 +title: Крок 17 +challengeType: 0 +dashedName: step-17 +--- + +# --description-- + +Слідуючи за передовими практиками доступності, з'єднайте елементи `input` та `label` разом, використовуючи атрибут `for`. + +Використайте такі значення для відповідних властивостей `id`: `first-name`, `last-name`, `email`, `new-password` + +# --hints-- + +Перший елемент `input` повинен мати `id` зі значенням `first-name`. + +```js +assert(document.querySelectorAll('input')?.[0]?.matches('#first-name')) +``` + +Другий елемент `input` повинен мати `id` зі значенням `last-name`. + +```js +assert(document.querySelectorAll('input')?.[1]?.matches('#last-name')) +``` + +Третій елемент `input` повинен мати `id` зі значенням `email`. + +```js +assert(document.querySelectorAll('input')?.[2]?.matches('#email')) +``` + +Четвертий елемент `input` повинен мати `id` зі значенням `new-password`. + +```js +assert(document.querySelectorAll('input')?.[3]?.matches('#new-password')) +``` + +Перший елемент `label` повинен мати атрибут `for` зі значенням `first-name`. + +```js +assert(document.querySelectorAll('label')?.[0]?.matches('label[for="first-name"]')) +``` + +Другий елемент `label` повинен мати атрибут `for` зі значенням `last-name`. + +```js +assert(document.querySelectorAll('label')?.[1]?.matches('label[for="last-name"]')) +``` + +Третій елемент `label` повинен мати атрибут `for` зі значенням `email`. + +```js +assert(document.querySelectorAll('label')?.[2]?.matches('label[for="email"]')) +``` + +Четвертий елемент `label` повинен мати атрибут `for` зі значенням `new-password`. + +```js +assert(document.querySelectorAll('label')?.[3]?.matches('label[for="new-password"]')) +``` + +# --seed-- + +## --seed-contents-- + +```html + + + + + Registration Form + + + +

Registration Form

+

Please fill out this form with the required information

+ +--fcc-editable-region-- +
+ + + + +
+--fcc-editable-region-- +
+
+ + + +``` + +```css +body { + width: 100%; + height: 100vh; + margin: 0; + background-color: #1b1b32; + color: #f5f6f7; +} + +label { + display: block; + margin: 0.5rem 0; +} + +``` diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8e998d3e7eae14d6ae3b.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8e998d3e7eae14d6ae3b.md new file mode 100644 index 00000000000000..1c6642d195ead6 --- /dev/null +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8e998d3e7eae14d6ae3b.md @@ -0,0 +1,102 @@ +--- +id: 62ff8e998d3e7eae14d6ae3b +title: Крок 28 +challengeType: 0 +dashedName: step-28 +--- + +# --description-- + +Слідуючи за передовими практиками доступності, з'єднайте елементи `input` та `label` в другому `fieldset`. + +Використайте такі значення для відповідних властивостей `id`: `personal-account`, `business-account`, `terms-and-conditions` + +# --hints-- + +Перший елемент `input` повинен мати `id` зі значенням `personal-account`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(2) input')?.[0]?.matches('#personal-account')) +``` + +Другий елемент `input` повинен мати `id` зі значенням `business-account`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(2) input')?.[1]?.matches('#business-account')) +``` + +Третій елемент `input` повинен мати `id` зі значенням `terms-and-conditions`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(2) input')?.[2]?.matches('#terms-and-conditions')) +``` + +Перший елемент `label` повинен мати атрибут `for` зі значенням `personal-account`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(2) label')?.[0]?.matches('label[for="personal-account"]')) +``` + +Другий елемент `label` повинен мати атрибут `for` зі значенням `business-account`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(2) label')?.[1]?.matches('label[for="business-account"]')) +``` + +Третій елемент `label` повинен мати атрибут `for` зі значенням `terms-and-conditions`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(2) label')?.[2]?.matches('label[for="terms-and-conditions"]')) +``` + +# --seed-- + +## --seed-contents-- + +```html + + + + + Registration Form + + + +

Registration Form

+

Please fill out this form with the required information

+
+
+ + + + +
+--fcc-editable-region-- +
+ + + +
+--fcc-editable-region-- +
+ +
+ + +``` + +```css +body { + width: 100%; + height: 100vh; + margin: 0; + background-color: #1b1b32; + color: #f5f6f7; +} + +label { + display: block; + margin: 0.5rem 0; +} + +``` diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff919a7b5612c0670923a5.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff919a7b5612c0670923a5.md new file mode 100644 index 00000000000000..0bec3017b1b614 --- /dev/null +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff919a7b5612c0670923a5.md @@ -0,0 +1,131 @@ +--- +id: 62ff919a7b5612c0670923a5 +title: Крок 37 +challengeType: 0 +dashedName: step-37 +--- + +# --description-- + +З'єднайте відповідні елементи форми і їхні елементи `label` разом. + +Використайте такі значення для відповідних властивостей `id`: `profile-picture`, `age`, `referrer`, `bio` + +# --hints-- + +Перший елемент `input` повинен мати `id` зі значенням `profile-picture`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(3) input')?.[0]?.matches('#profile-picture')) +``` + +Другий елемент `input` повинен мати `id` зі значенням `age`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(3) input')?.[1]?.matches('#age')) +``` + +Елемент `select` повинен мати `id` зі значенням `referrer`. + +```js +assert(document.querySelector('fieldset:nth-of-type(3) select')?.matches('#referrer')) +``` + +Елемент `textarea` повинен мати `id` зі значенням `bio`. + +```js +assert(document.querySelector('fieldset:nth-of-type(3) textarea')?.matches('#bio')) +``` + +Перший елемент `label` повинен мати атрибут `for` зі значенням `profile-picture`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(3) label')?.[0]?.matches('label[for="profile-picture"]')) +``` + +Другий елемент `label` повинен мати атрибут `for` зі значенням `age`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(3) label')?.[1]?.matches('label[for="age"]')) +``` + +Третій елемент `label` повинен мати атрибут `for` зі значенням `referrer`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(3) label')?.[2]?.matches('label[for="referrer"]')) +``` + +Четвертий елемент `label` повинен мати атрибут `for` зі значенням `bio`. + +```js +assert(document.querySelectorAll('fieldset:nth-of-type(3) label')?.[3]?.matches('label[for="bio"]')) +``` + +# --seed-- + +## --seed-contents-- + +```html + + + + + Registration Form + + + +

Registration Form

+

Please fill out this form with the required information

+
+
+ + + + +
+
+ + + +
+--fcc-editable-region-- +
+ + + + +
+--fcc-editable-region-- + +
+ + +``` + +```css +body { + width: 100%; + height: 100vh; + margin: 0; + background-color: #1b1b32; + color: #f5f6f7; +} + +label { + display: block; + margin: 0.5rem 0; +} + +``` diff --git a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ebcba99bfa46a15370b11.md b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ebcba99bfa46a15370b11.md index 75ca01dc9892ef..20f6b36a011ccd 100644 --- a/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ebcba99bfa46a15370b11.md +++ b/curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ebcba99bfa46a15370b11.md @@ -7,7 +7,19 @@ dashedName: step-27 # --description-- -Тепер потрібно зробити його адаптивним. Додайте запит `@media`, що має `max-width` зі значенням `768px`. +В-правило `@media`, також відоме як медіазапит, використовують для умовного застосування CSS. Медіазапити часто використовуються, щоб застосувати CSS на основі ширини вюпорту, зі значеннями `max-width` та `min-width`. + +У наведеному нижче прикладі відступ застосований до класу `.card`, де вюпорт шириною `960px` та знизу. + +```css +@media (max-width: 960px) { + .card { + padding: 2rem; + } +} +``` + +Додайте медіазапит, який буде застосовано, коли вюпорт шириною `768px` та знизу. # --hints-- From c525a361578df212df0e6c85534036e088148a5e Mon Sep 17 00:00:00 2001 From: camperbot Date: Fri, 2 Sep 2022 00:05:07 +0530 Subject: [PATCH 007/129] chore(i18n,client): processed translations (#47429) --- client/i18n/locales/german/translations.json | 2 +- client/i18n/locales/portuguese/translations.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/i18n/locales/german/translations.json b/client/i18n/locales/german/translations.json index fbd2bed4684054..6dcc79ad6d283c 100644 --- a/client/i18n/locales/german/translations.json +++ b/client/i18n/locales/german/translations.json @@ -451,7 +451,7 @@ "change-theme": "Anmelden, um das Theme zu ändern.", "translation-pending": "Hilf uns, zu übersetzen", "certification-project": "Zertifizierungsprojekt", - "iframe-preview": "{{title}} preview", + "iframe-preview": "{{title}} Vorschau", "iframe-alert": "Normalerweise würde dieser Link dich auf eine andere Website führen! Er funktioniert. Dies ist ein Link zu: {{externalLink}}", "document-notfound": "Dokument wurde nicht gefunden" }, diff --git a/client/i18n/locales/portuguese/translations.json b/client/i18n/locales/portuguese/translations.json index cb72cc190d1d50..60ed22b5504817 100644 --- a/client/i18n/locales/portuguese/translations.json +++ b/client/i18n/locales/portuguese/translations.json @@ -451,7 +451,7 @@ "change-theme": "Faça login para mudar o tema.", "translation-pending": "Ajude-nos a traduzir", "certification-project": "Projeto de certificação", - "iframe-preview": "{{title}} preview", + "iframe-preview": "Visualização de {{title}}", "iframe-alert": "Normalmente, este link levaria você para outro site da web! Funciona. Esse é um link para: {{externalLink}}", "document-notfound": "documento não encontrado" }, From e5d352147d4e0148cef9bba406a0ba4d78a1e177 Mon Sep 17 00:00:00 2001 From: camperbot Date: Fri, 2 Sep 2022 00:05:35 +0530 Subject: [PATCH 008/129] chore(i18n,docs): processed translations (#47428) --- docs/i18n/chinese-traditional/_sidebar.md | 2 +- .../how-to-enable-new-languages.md | 279 ++++++++++++++++++ .../language-lead-handbook.md | 2 +- docs/i18n/chinese/_sidebar.md | 2 +- .../chinese/how-to-enable-new-languages.md | 279 ++++++++++++++++++ docs/i18n/chinese/language-lead-handbook.md | 2 +- docs/i18n/espanol/_sidebar.md | 10 +- .../espanol/how-to-enable-new-languages.md | 279 ++++++++++++++++++ docs/i18n/espanol/language-lead-handbook.md | 2 +- docs/i18n/german/_sidebar.md | 10 +- .../german/how-to-enable-new-languages.md | 279 ++++++++++++++++++ docs/i18n/german/index.md | 32 +- docs/i18n/german/language-lead-handbook.md | 160 +++++----- docs/i18n/german/security-hall-of-fame.md | 4 +- docs/i18n/italian/_sidebar.md | 10 +- .../italian/how-to-enable-new-languages.md | 279 ++++++++++++++++++ docs/i18n/italian/language-lead-handbook.md | 2 +- docs/i18n/japanese/_sidebar.md | 10 +- .../japanese/how-to-enable-new-languages.md | 279 ++++++++++++++++++ docs/i18n/japanese/language-lead-handbook.md | 2 +- docs/i18n/portuguese/_sidebar.md | 10 +- .../portuguese/how-to-enable-new-languages.md | 279 ++++++++++++++++++ .../i18n/portuguese/language-lead-handbook.md | 2 +- docs/i18n/ukrainian/_sidebar.md | 10 +- .../ukrainian/how-to-enable-new-languages.md | 279 ++++++++++++++++++ docs/i18n/ukrainian/language-lead-handbook.md | 2 +- 26 files changed, 2369 insertions(+), 137 deletions(-) create mode 100644 docs/i18n/chinese-traditional/how-to-enable-new-languages.md create mode 100644 docs/i18n/chinese/how-to-enable-new-languages.md create mode 100644 docs/i18n/espanol/how-to-enable-new-languages.md create mode 100644 docs/i18n/german/how-to-enable-new-languages.md create mode 100644 docs/i18n/italian/how-to-enable-new-languages.md create mode 100644 docs/i18n/japanese/how-to-enable-new-languages.md create mode 100644 docs/i18n/portuguese/how-to-enable-new-languages.md create mode 100644 docs/i18n/ukrainian/how-to-enable-new-languages.md diff --git a/docs/i18n/chinese-traditional/_sidebar.md b/docs/i18n/chinese-traditional/_sidebar.md index cbc094f2b459e4..edebe40ac12b44 100644 --- a/docs/i18n/chinese-traditional/_sidebar.md +++ b/docs/i18n/chinese-traditional/_sidebar.md @@ -19,7 +19,6 @@ - [Work on documentation](how-to-work-on-the-docs-theme.md) - [Work on the component library](how-to-work-on-the-component-library.md) - **Additional Guides** - - [Test translations locally](how-to-test-translations-locally.md) - [Understand the curriculum file structure](curriculum-file-structure.md) - [Debug outgoing emails locally](how-to-catch-outgoing-emails-locally.md) - [Set up freeCodeCamp on Windows (WSL)](how-to-setup-wsl.md) @@ -32,6 +31,7 @@ - [Language Lead Handbook](language-lead-handbook.md) - [DevOps Handbook](devops.md) - [Courses VSCode Extension](courses-vscode-extension.md) + - [Enable New Language](how-to-enable-new-languages.md) --- diff --git a/docs/i18n/chinese-traditional/how-to-enable-new-languages.md b/docs/i18n/chinese-traditional/how-to-enable-new-languages.md new file mode 100644 index 00000000000000..4214dbd91354ae --- /dev/null +++ b/docs/i18n/chinese-traditional/how-to-enable-new-languages.md @@ -0,0 +1,279 @@ +# Deploying New Languages on `/learn` + +Before you can release a new language, you will need to allow the languages to download from Crowdin. + +## Updating Crowdin Settings + +In the `Curriculum` and `Learn UI` projects, you will need to select `Project Settings` from the sidebar. Then scroll down to `Language Mapping`, where you will see an option to add custom language codes. Add a new entry for the language you are releasing, selecting `language` as the `Placeholder` value, and entering a URL-friendly lower-case spelling of your language's name for the `Custom code`. If you aren't sure what to use, reach out in our contributor chat and we will assist you. + +## Updating Workflows + +You will need to add a step to the `crowdin-download.client-ui.yml` and `crowdin-download.curriculum.yml`. The step for these will be the same. For example, if you want to enable Dothraki downloads: + +```yml +##### Download Dothraki ##### +- name: Crowdin Download Dothraki Translations + uses: crowdin/github-action@master + # options: https://github.com/crowdin/github-action/blob/master/action.yml + with: + # uploads + upload_sources: false + upload_translations: false + auto_approve_imported: false + import_eq_suggestions: false + + # downloads + download_translations: true + download_language: mis + skip_untranslated_files: false + export_only_approved: true + + push_translations: false + + # pull-request + create_pull_request: false + + # global options + config: './crowdin-config.yml' + base_url: ${{ secrets.CROWDIN_BASE_URL_FCC }} + + # Uncomment below to debug + # dryrun_action: true +``` + +Note that the `download_language` key needs to be set to the language code displayed on Crowdin. + +## Enabling a Language + +> [!NOTE] The above section with updating the workflows should be completed before proceeding - these need to be done in separate steps or the builds will fail. + +There are a few steps to take in order to allow the codebase to build in your desired language. + +First, visit the `config/i18n/all-langs.ts` file to add the language to the available languages list and configure the values. There are several objects here. + +- `availableLangs`: For both the `client` and `curriculum` arrays, add the text name of the language. This is the value that will be used in the `.env` file later. +- `auditedCerts`: Add the text name of the language as the _key_, and add an array of `SuperBlocks.{cert}` variables as the _value_. This tells the client which certifications are fully translated. +- `i18nextCodes`: These are the ISO language codes for each language. You will need to add the appropriate ISO code for the language you are enabling. These do need to be unique for each language. +- `LangNames`: These are the display names for the language selector in the navigation menu. +- `LangCodes`: These are the language codes used for formatting dates and numbers. These should be Unicode CLDR codes instead of ISO codes. +- `hiddenLangs`: These languages will not be displayed in the navigation menu. This is used for languages that are not yet ready for release. + +As an example, if you wanted to enable Dothraki as a language, your `all-langs.js` objects should look like this: + +```js +export const availableLangs = { + client: ['english', 'espanol', 'chinese', 'chinese-traditional', 'dothraki'], + curriculum: [ + 'english', + 'espanol', + 'chinese', + 'chinese-traditional', + 'dothraki' + ] +}; + +export const auditedCerts = { + espanol: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis + ], + chinese: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis, + SuperBlocks.QualityAssurance, + SuperBlocks.SciCompPy, + SuperBlocks.DataAnalysisPy, + SuperBlocks.InfoSec, + SuperBlocks.MachineLearningPy + ], + 'chinese-traditional': [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis, + SuperBlocks.QualityAssurance, + SuperBlocks.SciCompPy, + SuperBlocks.DataAnalysisPy, + SuperBlocks.InfoSec, + SuperBlocks.MachineLearningPy + ], + dothraki: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs + ] +}; + +export const i18nextCodes = { + english: 'en', + espanol: 'es', + chinese: 'zh', + 'chinese-traditional': 'zh-Hant', + dothraki: 'mis' +}; + +export enum LangNames = { + english: 'English', + espanol: 'Español', + chinese: '中文(簡體字)', + 'chinese-traditional': '中文(繁體字)', + dothraki: 'Dothraki' +}; + +export enum LangCodes = { + english: 'en-US', + espanol: 'es-419', + chinese: 'zh', + 'chinese-traditional': 'zh-Hant', + dothraki: 'mis' +}; + +export const hiddenLangs = ['dothraki']; +``` + +> [!NOTE] When a language has been set up in the deployment pipeline AND has a public `/news` instance live, it can be removed from the `hiddenLangs` array and be made available to the public. + +Next, open the `client/src/utils/algolia-locale-setup.ts` file. This data is used for the search bar that loads `/news` articles. While it is unlikely that you are going to test this functionality, missing the data for your language can lead to errors when attempting to build the codebase locally. + +Add an object for your language to the `algoliaIndices` object. You should use the the same values as the `english` object for local testing, replacing the `english` key with your language's `availableLangs` value. + +> [!NOTE] If we have already deployed an instance of news in your target language, you can update the values to reflect the live instance. Otherwise, use the English values. + +If you were to add Dothraki: + +```js +const algoliaIndices = { + english: { + name: 'news', + searchPage: 'https://www.freecodecamp.org/news/search/' + }, + espanol: { + name: 'news-es', + searchPage: 'https://www.freecodecamp.org/espanol/news/search/' + }, + chinese: { + name: 'news-zh', + searchPage: 'https://chinese.freecodecamp.org/news/search/' + }, + 'chinese-traditional': { + name: 'news-zh', + searchPage: 'https://chinese.freecodecamp.org/news/search' + }, + dothraki: { + name: 'news', + searchPage: 'https://www.freecodecamp.org/news/search/' + } +}; +``` + +### Releasing a Superblock + +After a superblock has been fully translated into a language, there are two steps to release it. First add the superblock enum to that language's `auditedCerts` array. So, if you want to release the new Responsive Web Design superblock for Dothraki, the array should look like this: + +```ts +export const auditedCerts = { + // other languages + dothraki: [ + SuperBlocks.RespWebDesignNew, // the newly translated superblock + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs + ] +}; +``` + +Finally, if the superblock is in a "new" state (that is, replacing a legacy superblock), the `languagesWithAuditedBetaReleases` array should be updated to include the new language like this: + +```ts +export const languagesWithAuditedBetaReleases: ['english', 'dothraki']; +``` + +This will move the new superblock to the correct place in the curriculum map on `/learn`. + +## Enabling Localized Videos + +For the video challenges, you need to change a few things. First add the new locale to the GraphQL query in the `client/src/templates/Challenges/video/Show.tsx` file. For example, adding Dothraki to the query: + +```tsx + query VideoChallenge($slug: String!) { + challengeNode(fields: { slug: { eq: $slug } }) { + videoId + videoLocaleIds { + espanol + italian + portuguese + dothraki + } + ... +``` + +Then add an id for the new language to any video challenge in an audited block. For example, if `auditedCerts` in `all-langs.ts` includes `scientific-computing-with-python` for `dothraki`, then you must add a `dothraki` entry in `videoLocaleIds`. The frontmatter should then look like this: + +```yml +videoLocaleIds: + espanol: 3muQV-Im3Z0 + italian: hiRTRAqNlpE + portuguese: AelGAcoMXbI + dothraki: new-id-here +dashedName: introduction-why-program +--- +``` + +Update the `VideoLocaleIds` interface in `client/src/redux/prop-types` to include the new language. + +```ts +export interface VideoLocaleIds { + espanol?: string; + italian?: string; + portuguese?: string; + dothraki?: string; +} +``` + +And finally update the challenge schema in `curriculum/schema/challengeSchema.js`. + +```js +videoLocaleIds: Joi.when('challengeType', { + is: challengeTypes.video, + then: Joi.object().keys({ + espanol: Joi.string(), + italian: Joi.string(), + portuguese: Joi.string(), + dothraki: Joi.string() + }) +}), +``` + +## Client UI + +You will need to take an additional step to handle the client UI translations. + +The Crowdin workflows will automatically pull down _some_ of the UI translations, but there are a couple of files that need to be moved manually. + +You will want to copy the following files from `/client/i18n/locales/english` to `/client/i18n/locales/`, and apply translations as needed: + +- `links.json` +- `meta-tags.json` +- `motivation.json` +- `trending.json` + +## Testing Translations Locally + +If you would like to test translations locally, before adding them to our main repository - skip the Crowdin workflow changes. Follow the steps for enabling a language, then download the translations from Crowdin and load them into your local code. + +Because the language has not been approved for production, our scripts are not automatically downloading the translations yet. Only staff have the access to directly download the translations - you are welcome to reach out to us in our [contributors chat room](https://discord.gg/PRyKn3Vbay), or you can translate the English markdown files locally for testing purposes. + +Once you have the files, you will need to place them in the correct directory. For the curriculum challenges, you should place the certification folders (i.e. `01-responsive-web-design`) within the `curriculum/challenges/{lang}` directory. For our Dothraki translations, this would be `curriculum/challenges/dothraki`. The client translation `.json` files will go in the `client/i18n/locales/{lang}` directory. + +Update your `.env` file to use your new language for `CLIENT_LOCALE` and `CURRICULUM_LOCALE`. + +Once these are in place, you should be able to run `npm run develop` to view your translated version of freeCodeCamp. + +> [!ATTENTION] While you may perform translations locally for the purpose of testing, we remind everyone that translations should _not_ be submitted through GitHub and should only be done through Crowdin. Be sure to reset your local codebase after you are done testing. diff --git a/docs/i18n/chinese-traditional/language-lead-handbook.md b/docs/i18n/chinese-traditional/language-lead-handbook.md index fbd057794e01c5..1f45dbd196bbaa 100644 --- a/docs/i18n/chinese-traditional/language-lead-handbook.md +++ b/docs/i18n/chinese-traditional/language-lead-handbook.md @@ -65,7 +65,7 @@ This is an example of how part of the `trending.json` file has to look. } ``` -You will want to [build the translated client locally](how-to-test-translations-locally.md) to see if the titles have the right length. Each title must stay on a single line and not go to a new line. +You will want to [build the translated client locally](how-to-enable-new-languages.md) to see if the titles have the right length. Each title must stay on a single line and not go to a new line. ### How to update the trending articles in the cdn diff --git a/docs/i18n/chinese/_sidebar.md b/docs/i18n/chinese/_sidebar.md index 114ecc993e0bd7..25705e2a20281d 100644 --- a/docs/i18n/chinese/_sidebar.md +++ b/docs/i18n/chinese/_sidebar.md @@ -19,7 +19,6 @@ - [Work on documentation](how-to-work-on-the-docs-theme.md) - [Work on the component library](how-to-work-on-the-component-library.md) - **Additional Guides** - - [Test translations locally](how-to-test-translations-locally.md) - [Understand the curriculum file structure](curriculum-file-structure.md) - [Debug outgoing emails locally](how-to-catch-outgoing-emails-locally.md) - [Set up freeCodeCamp on Windows (WSL)](how-to-setup-wsl.md) @@ -32,6 +31,7 @@ - [Language Lead Handbook](language-lead-handbook.md) - [DevOps Handbook](devops.md) - [Courses VSCode Extension](courses-vscode-extension.md) + - [Enable New Language](how-to-enable-new-languages.md) --- diff --git a/docs/i18n/chinese/how-to-enable-new-languages.md b/docs/i18n/chinese/how-to-enable-new-languages.md new file mode 100644 index 00000000000000..d0ee662a2a42c7 --- /dev/null +++ b/docs/i18n/chinese/how-to-enable-new-languages.md @@ -0,0 +1,279 @@ +# Deploying New Languages on `/learn` + +Before you can release a new language, you will need to allow the languages to download from Crowdin. + +## Updating Crowdin Settings + +In the `Curriculum` and `Learn UI` projects, you will need to select `Project Settings` from the sidebar. Then scroll down to `Language Mapping`, where you will see an option to add custom language codes. Add a new entry for the language you are releasing, selecting `language` as the `Placeholder` value, and entering a URL-friendly lower-case spelling of your language's name for the `Custom code`. If you aren't sure what to use, reach out in our contributor chat and we will assist you. + +## Updating Workflows + +You will need to add a step to the `crowdin-download.client-ui.yml` and `crowdin-download.curriculum.yml`. The step for these will be the same. For example, if you want to enable Dothraki downloads: + +```yml +##### Download Dothraki ##### +- name: Crowdin Download Dothraki Translations + uses: crowdin/github-action@master + # options: https://github.com/crowdin/github-action/blob/master/action.yml + with: + # uploads + upload_sources: false + upload_translations: false + auto_approve_imported: false + import_eq_suggestions: false + + # downloads + download_translations: true + download_language: mis + skip_untranslated_files: false + export_only_approved: true + + push_translations: false + + # pull-request + create_pull_request: false + + # global options + config: './crowdin-config.yml' + base_url: ${{ secrets.CROWDIN_BASE_URL_FCC }} + + # Uncomment below to debug + # dryrun_action: true +``` + +Note that the `download_language` key needs to be set to the language code displayed on Crowdin. + +## Enabling a Language + +> [!NOTE] The above section with updating the workflows should be completed before proceeding - these need to be done in separate steps or the builds will fail. + +There are a few steps to take in order to allow the codebase to build in your desired language. + +First, visit the `config/i18n/all-langs.ts` file to add the language to the available languages list and configure the values. There are several objects here. + +- `availableLangs`: For both the `client` and `curriculum` arrays, add the text name of the language. This is the value that will be used in the `.env` file later. +- `auditedCerts`: Add the text name of the language as the _key_, and add an array of `SuperBlocks.{cert}` variables as the _value_. This tells the client which certifications are fully translated. +- `i18nextCodes`: These are the ISO language codes for each language. You will need to add the appropriate ISO code for the language you are enabling. These do need to be unique for each language. +- `LangNames`: These are the display names for the language selector in the navigation menu. +- `LangCodes`: These are the language codes used for formatting dates and numbers. These should be Unicode CLDR codes instead of ISO codes. +- `hiddenLangs`: These languages will not be displayed in the navigation menu. This is used for languages that are not yet ready for release. + +As an example, if you wanted to enable Dothraki as a language, your `all-langs.js` objects should look like this: + +```js +export const availableLangs = { + client: ['english', 'espanol', 'chinese', 'chinese-traditional', 'dothraki'], + curriculum: [ + 'english', + 'espanol', + 'chinese', + 'chinese-traditional', + 'dothraki' + ] +}; + +export const auditedCerts = { + espanol: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis + ], + chinese: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis, + SuperBlocks.QualityAssurance, + SuperBlocks.SciCompPy, + SuperBlocks.DataAnalysisPy, + SuperBlocks.InfoSec, + SuperBlocks.MachineLearningPy + ], + 'chinese-traditional': [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis, + SuperBlocks.QualityAssurance, + SuperBlocks.SciCompPy, + SuperBlocks.DataAnalysisPy, + SuperBlocks.InfoSec, + SuperBlocks.MachineLearningPy + ], + dothraki: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs + ] +}; + +export const i18nextCodes = { + english: 'en', + espanol: 'es', + chinese: 'zh', + 'chinese-traditional': 'zh-Hant', + dothraki: 'mis' +}; + +export enum LangNames = { + english: 'English', + espanol: 'Español', + chinese: '中文(简体字)', + 'chinese-traditional': '中文(繁體字)', + dothraki: 'Dothraki' +}; + +export enum LangCodes = { + english: 'en-US', + espanol: 'es-419', + chinese: 'zh', + 'chinese-traditional': 'zh-Hant', + dothraki: 'mis' +}; + +export const hiddenLangs = ['dothraki']; +``` + +> [!NOTE] When a language has been set up in the deployment pipeline AND has a public `/news` instance live, it can be removed from the `hiddenLangs` array and be made available to the public. + +Next, open the `client/src/utils/algolia-locale-setup.ts` file. This data is used for the search bar that loads `/news` articles. While it is unlikely that you are going to test this functionality, missing the data for your language can lead to errors when attempting to build the codebase locally. + +Add an object for your language to the `algoliaIndices` object. You should use the the same values as the `english` object for local testing, replacing the `english` key with your language's `availableLangs` value. + +> [!NOTE] If we have already deployed an instance of news in your target language, you can update the values to reflect the live instance. Otherwise, use the English values. + +If you were to add Dothraki: + +```js +const algoliaIndices = { + english: { + name: 'news', + searchPage: 'https://www.freecodecamp.org/news/search/' + }, + espanol: { + name: 'news-es', + searchPage: 'https://www.freecodecamp.org/espanol/news/search/' + }, + chinese: { + name: 'news-zh', + searchPage: 'https://chinese.freecodecamp.org/news/search/' + }, + 'chinese-traditional': { + name: 'news-zh', + searchPage: 'https://chinese.freecodecamp.org/news/search' + }, + dothraki: { + name: 'news', + searchPage: 'https://www.freecodecamp.org/news/search/' + } +}; +``` + +### Releasing a Superblock + +After a superblock has been fully translated into a language, there are two steps to release it. First add the superblock enum to that language's `auditedCerts` array. So, if you want to release the new Responsive Web Design superblock for Dothraki, the array should look like this: + +```ts +export const auditedCerts = { + // other languages + dothraki: [ + SuperBlocks.RespWebDesignNew, // the newly translated superblock + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs + ] +}; +``` + +Finally, if the superblock is in a "new" state (that is, replacing a legacy superblock), the `languagesWithAuditedBetaReleases` array should be updated to include the new language like this: + +```ts +export const languagesWithAuditedBetaReleases: ['english', 'dothraki']; +``` + +This will move the new superblock to the correct place in the curriculum map on `/learn`. + +## Enabling Localized Videos + +For the video challenges, you need to change a few things. First add the new locale to the GraphQL query in the `client/src/templates/Challenges/video/Show.tsx` file. For example, adding Dothraki to the query: + +```tsx + query VideoChallenge($slug: String!) { + challengeNode(fields: { slug: { eq: $slug } }) { + videoId + videoLocaleIds { + espanol + italian + portuguese + dothraki + } + ... +``` + +Then add an id for the new language to any video challenge in an audited block. For example, if `auditedCerts` in `all-langs.ts` includes `scientific-computing-with-python` for `dothraki`, then you must add a `dothraki` entry in `videoLocaleIds`. The frontmatter should then look like this: + +```yml +videoLocaleIds: + espanol: 3muQV-Im3Z0 + italian: hiRTRAqNlpE + portuguese: AelGAcoMXbI + dothraki: new-id-here +dashedName: introduction-why-program +--- +``` + +Update the `VideoLocaleIds` interface in `client/src/redux/prop-types` to include the new language. + +```ts +export interface VideoLocaleIds { + espanol?: string; + italian?: string; + portuguese?: string; + dothraki?: string; +} +``` + +And finally update the challenge schema in `curriculum/schema/challengeSchema.js`. + +```js +videoLocaleIds: Joi.when('challengeType', { + is: challengeTypes.video, + then: Joi.object().keys({ + espanol: Joi.string(), + italian: Joi.string(), + portuguese: Joi.string(), + dothraki: Joi.string() + }) +}), +``` + +## Client UI + +You will need to take an additional step to handle the client UI translations. + +The Crowdin workflows will automatically pull down _some_ of the UI translations, but there are a couple of files that need to be moved manually. + +You will want to copy the following files from `/client/i18n/locales/english` to `/client/i18n/locales/`, and apply translations as needed: + +- `links.json` +- `meta-tags.json` +- `motivation.json` +- `trending.json` + +## Testing Translations Locally + +If you would like to test translations locally, before adding them to our main repository - skip the Crowdin workflow changes. Follow the steps for enabling a language, then download the translations from Crowdin and load them into your local code. + +Because the language has not been approved for production, our scripts are not automatically downloading the translations yet. Only staff have the access to directly download the translations - you are welcome to reach out to us in our [contributors chat room](https://discord.gg/PRyKn3Vbay), or you can translate the English markdown files locally for testing purposes. + +Once you have the files, you will need to place them in the correct directory. For the curriculum challenges, you should place the certification folders (i.e. `01-responsive-web-design`) within the `curriculum/challenges/{lang}` directory. For our Dothraki translations, this would be `curriculum/challenges/dothraki`. The client translation `.json` files will go in the `client/i18n/locales/{lang}` directory. + +Update your `.env` file to use your new language for `CLIENT_LOCALE` and `CURRICULUM_LOCALE`. + +Once these are in place, you should be able to run `npm run develop` to view your translated version of freeCodeCamp. + +> [!ATTENTION] While you may perform translations locally for the purpose of testing, we remind everyone that translations should _not_ be submitted through GitHub and should only be done through Crowdin. Be sure to reset your local codebase after you are done testing. diff --git a/docs/i18n/chinese/language-lead-handbook.md b/docs/i18n/chinese/language-lead-handbook.md index fbd057794e01c5..1f45dbd196bbaa 100644 --- a/docs/i18n/chinese/language-lead-handbook.md +++ b/docs/i18n/chinese/language-lead-handbook.md @@ -65,7 +65,7 @@ This is an example of how part of the `trending.json` file has to look. } ``` -You will want to [build the translated client locally](how-to-test-translations-locally.md) to see if the titles have the right length. Each title must stay on a single line and not go to a new line. +You will want to [build the translated client locally](how-to-enable-new-languages.md) to see if the titles have the right length. Each title must stay on a single line and not go to a new line. ### How to update the trending articles in the cdn diff --git a/docs/i18n/espanol/_sidebar.md b/docs/i18n/espanol/_sidebar.md index 813636e2fbbead..d2edb969970887 100644 --- a/docs/i18n/espanol/_sidebar.md +++ b/docs/i18n/espanol/_sidebar.md @@ -19,11 +19,10 @@ - [Work on documentation](how-to-work-on-the-docs-theme.md) - [Work on the component library](how-to-work-on-the-component-library.md) - **Guías adicionales** - - [Previsualiza las traducciones localmente](how-to-test-translations-locally.md) - - [Entiende la estructura de archivo del currículo](curriculum-file-structure.md) - - [Depurar correos salientes localmente ](how-to-catch-outgoing-emails-locally.md) - - [Configura freeCodeCamp en Windows (WSL)](how-to-setup-wsl.md) - - [Flujo de trabajo de los tokens de usuario](user-token-workflow.md) + - [Understand the curriculum file structure](curriculum-file-structure.md) + - [Debug outgoing emails locally](how-to-catch-outgoing-emails-locally.md) + - [Set up freeCodeCamp on Windows (WSL)](how-to-setup-wsl.md) + - [User Token Workflow](user-token-workflow.md) --- @@ -32,6 +31,7 @@ - [Language Lead Handbook](language-lead-handbook.md) - [DevOps Handbook](devops.md) - [Courses VSCode Extension](courses-vscode-extension.md) + - [Enable New Language](how-to-enable-new-languages.md) --- diff --git a/docs/i18n/espanol/how-to-enable-new-languages.md b/docs/i18n/espanol/how-to-enable-new-languages.md new file mode 100644 index 00000000000000..d0ee662a2a42c7 --- /dev/null +++ b/docs/i18n/espanol/how-to-enable-new-languages.md @@ -0,0 +1,279 @@ +# Deploying New Languages on `/learn` + +Before you can release a new language, you will need to allow the languages to download from Crowdin. + +## Updating Crowdin Settings + +In the `Curriculum` and `Learn UI` projects, you will need to select `Project Settings` from the sidebar. Then scroll down to `Language Mapping`, where you will see an option to add custom language codes. Add a new entry for the language you are releasing, selecting `language` as the `Placeholder` value, and entering a URL-friendly lower-case spelling of your language's name for the `Custom code`. If you aren't sure what to use, reach out in our contributor chat and we will assist you. + +## Updating Workflows + +You will need to add a step to the `crowdin-download.client-ui.yml` and `crowdin-download.curriculum.yml`. The step for these will be the same. For example, if you want to enable Dothraki downloads: + +```yml +##### Download Dothraki ##### +- name: Crowdin Download Dothraki Translations + uses: crowdin/github-action@master + # options: https://github.com/crowdin/github-action/blob/master/action.yml + with: + # uploads + upload_sources: false + upload_translations: false + auto_approve_imported: false + import_eq_suggestions: false + + # downloads + download_translations: true + download_language: mis + skip_untranslated_files: false + export_only_approved: true + + push_translations: false + + # pull-request + create_pull_request: false + + # global options + config: './crowdin-config.yml' + base_url: ${{ secrets.CROWDIN_BASE_URL_FCC }} + + # Uncomment below to debug + # dryrun_action: true +``` + +Note that the `download_language` key needs to be set to the language code displayed on Crowdin. + +## Enabling a Language + +> [!NOTE] The above section with updating the workflows should be completed before proceeding - these need to be done in separate steps or the builds will fail. + +There are a few steps to take in order to allow the codebase to build in your desired language. + +First, visit the `config/i18n/all-langs.ts` file to add the language to the available languages list and configure the values. There are several objects here. + +- `availableLangs`: For both the `client` and `curriculum` arrays, add the text name of the language. This is the value that will be used in the `.env` file later. +- `auditedCerts`: Add the text name of the language as the _key_, and add an array of `SuperBlocks.{cert}` variables as the _value_. This tells the client which certifications are fully translated. +- `i18nextCodes`: These are the ISO language codes for each language. You will need to add the appropriate ISO code for the language you are enabling. These do need to be unique for each language. +- `LangNames`: These are the display names for the language selector in the navigation menu. +- `LangCodes`: These are the language codes used for formatting dates and numbers. These should be Unicode CLDR codes instead of ISO codes. +- `hiddenLangs`: These languages will not be displayed in the navigation menu. This is used for languages that are not yet ready for release. + +As an example, if you wanted to enable Dothraki as a language, your `all-langs.js` objects should look like this: + +```js +export const availableLangs = { + client: ['english', 'espanol', 'chinese', 'chinese-traditional', 'dothraki'], + curriculum: [ + 'english', + 'espanol', + 'chinese', + 'chinese-traditional', + 'dothraki' + ] +}; + +export const auditedCerts = { + espanol: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis + ], + chinese: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis, + SuperBlocks.QualityAssurance, + SuperBlocks.SciCompPy, + SuperBlocks.DataAnalysisPy, + SuperBlocks.InfoSec, + SuperBlocks.MachineLearningPy + ], + 'chinese-traditional': [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis, + SuperBlocks.QualityAssurance, + SuperBlocks.SciCompPy, + SuperBlocks.DataAnalysisPy, + SuperBlocks.InfoSec, + SuperBlocks.MachineLearningPy + ], + dothraki: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs + ] +}; + +export const i18nextCodes = { + english: 'en', + espanol: 'es', + chinese: 'zh', + 'chinese-traditional': 'zh-Hant', + dothraki: 'mis' +}; + +export enum LangNames = { + english: 'English', + espanol: 'Español', + chinese: '中文(简体字)', + 'chinese-traditional': '中文(繁體字)', + dothraki: 'Dothraki' +}; + +export enum LangCodes = { + english: 'en-US', + espanol: 'es-419', + chinese: 'zh', + 'chinese-traditional': 'zh-Hant', + dothraki: 'mis' +}; + +export const hiddenLangs = ['dothraki']; +``` + +> [!NOTE] When a language has been set up in the deployment pipeline AND has a public `/news` instance live, it can be removed from the `hiddenLangs` array and be made available to the public. + +Next, open the `client/src/utils/algolia-locale-setup.ts` file. This data is used for the search bar that loads `/news` articles. While it is unlikely that you are going to test this functionality, missing the data for your language can lead to errors when attempting to build the codebase locally. + +Add an object for your language to the `algoliaIndices` object. You should use the the same values as the `english` object for local testing, replacing the `english` key with your language's `availableLangs` value. + +> [!NOTE] If we have already deployed an instance of news in your target language, you can update the values to reflect the live instance. Otherwise, use the English values. + +If you were to add Dothraki: + +```js +const algoliaIndices = { + english: { + name: 'news', + searchPage: 'https://www.freecodecamp.org/news/search/' + }, + espanol: { + name: 'news-es', + searchPage: 'https://www.freecodecamp.org/espanol/news/search/' + }, + chinese: { + name: 'news-zh', + searchPage: 'https://chinese.freecodecamp.org/news/search/' + }, + 'chinese-traditional': { + name: 'news-zh', + searchPage: 'https://chinese.freecodecamp.org/news/search' + }, + dothraki: { + name: 'news', + searchPage: 'https://www.freecodecamp.org/news/search/' + } +}; +``` + +### Releasing a Superblock + +After a superblock has been fully translated into a language, there are two steps to release it. First add the superblock enum to that language's `auditedCerts` array. So, if you want to release the new Responsive Web Design superblock for Dothraki, the array should look like this: + +```ts +export const auditedCerts = { + // other languages + dothraki: [ + SuperBlocks.RespWebDesignNew, // the newly translated superblock + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs + ] +}; +``` + +Finally, if the superblock is in a "new" state (that is, replacing a legacy superblock), the `languagesWithAuditedBetaReleases` array should be updated to include the new language like this: + +```ts +export const languagesWithAuditedBetaReleases: ['english', 'dothraki']; +``` + +This will move the new superblock to the correct place in the curriculum map on `/learn`. + +## Enabling Localized Videos + +For the video challenges, you need to change a few things. First add the new locale to the GraphQL query in the `client/src/templates/Challenges/video/Show.tsx` file. For example, adding Dothraki to the query: + +```tsx + query VideoChallenge($slug: String!) { + challengeNode(fields: { slug: { eq: $slug } }) { + videoId + videoLocaleIds { + espanol + italian + portuguese + dothraki + } + ... +``` + +Then add an id for the new language to any video challenge in an audited block. For example, if `auditedCerts` in `all-langs.ts` includes `scientific-computing-with-python` for `dothraki`, then you must add a `dothraki` entry in `videoLocaleIds`. The frontmatter should then look like this: + +```yml +videoLocaleIds: + espanol: 3muQV-Im3Z0 + italian: hiRTRAqNlpE + portuguese: AelGAcoMXbI + dothraki: new-id-here +dashedName: introduction-why-program +--- +``` + +Update the `VideoLocaleIds` interface in `client/src/redux/prop-types` to include the new language. + +```ts +export interface VideoLocaleIds { + espanol?: string; + italian?: string; + portuguese?: string; + dothraki?: string; +} +``` + +And finally update the challenge schema in `curriculum/schema/challengeSchema.js`. + +```js +videoLocaleIds: Joi.when('challengeType', { + is: challengeTypes.video, + then: Joi.object().keys({ + espanol: Joi.string(), + italian: Joi.string(), + portuguese: Joi.string(), + dothraki: Joi.string() + }) +}), +``` + +## Client UI + +You will need to take an additional step to handle the client UI translations. + +The Crowdin workflows will automatically pull down _some_ of the UI translations, but there are a couple of files that need to be moved manually. + +You will want to copy the following files from `/client/i18n/locales/english` to `/client/i18n/locales/`, and apply translations as needed: + +- `links.json` +- `meta-tags.json` +- `motivation.json` +- `trending.json` + +## Testing Translations Locally + +If you would like to test translations locally, before adding them to our main repository - skip the Crowdin workflow changes. Follow the steps for enabling a language, then download the translations from Crowdin and load them into your local code. + +Because the language has not been approved for production, our scripts are not automatically downloading the translations yet. Only staff have the access to directly download the translations - you are welcome to reach out to us in our [contributors chat room](https://discord.gg/PRyKn3Vbay), or you can translate the English markdown files locally for testing purposes. + +Once you have the files, you will need to place them in the correct directory. For the curriculum challenges, you should place the certification folders (i.e. `01-responsive-web-design`) within the `curriculum/challenges/{lang}` directory. For our Dothraki translations, this would be `curriculum/challenges/dothraki`. The client translation `.json` files will go in the `client/i18n/locales/{lang}` directory. + +Update your `.env` file to use your new language for `CLIENT_LOCALE` and `CURRICULUM_LOCALE`. + +Once these are in place, you should be able to run `npm run develop` to view your translated version of freeCodeCamp. + +> [!ATTENTION] While you may perform translations locally for the purpose of testing, we remind everyone that translations should _not_ be submitted through GitHub and should only be done through Crowdin. Be sure to reset your local codebase after you are done testing. diff --git a/docs/i18n/espanol/language-lead-handbook.md b/docs/i18n/espanol/language-lead-handbook.md index fbd057794e01c5..1f45dbd196bbaa 100644 --- a/docs/i18n/espanol/language-lead-handbook.md +++ b/docs/i18n/espanol/language-lead-handbook.md @@ -65,7 +65,7 @@ This is an example of how part of the `trending.json` file has to look. } ``` -You will want to [build the translated client locally](how-to-test-translations-locally.md) to see if the titles have the right length. Each title must stay on a single line and not go to a new line. +You will want to [build the translated client locally](how-to-enable-new-languages.md) to see if the titles have the right length. Each title must stay on a single line and not go to a new line. ### How to update the trending articles in the cdn diff --git a/docs/i18n/german/_sidebar.md b/docs/i18n/german/_sidebar.md index 303f0ae8daba80..65460a81578704 100644 --- a/docs/i18n/german/_sidebar.md +++ b/docs/i18n/german/_sidebar.md @@ -19,10 +19,9 @@ - [Arbeite an der Dokumentation](how-to-work-on-the-docs-theme.md) - [Arbeite an der Komponentenbibliothek](how-to-work-on-the-component-library.md) - **Zusätzliche Leitfäden** - - [Übersetzungen lokal testen](how-to-test-translations-locally.md) - - [Verstehe die Dateistruktur des Studienplans](curriculum-file-structure.md) - - [Ausgehende Emails lokal debuggen](how-to-catch-outgoing-emails-locally.md) - - [freeCodeCamp auf Windows einrichten (WSL)](how-to-setup-wsl.md) + - [Curriculum-Dateistruktur verstehen](curriculum-file-structure.md) + - [Ausgehende E-Mails lokal debuggen](how-to-catch-outgoing-emails-locally.md) + - [freeCodeCamp unter Windows einrichten (WSL)](how-to-setup-wsl.md) - [Benutzer-Token Workflow](user-token-workflow.md) --- @@ -32,10 +31,11 @@ - [Language Lead Handbuch](language-lead-handbook.md) - [DevOps-Handbuch](devops.md) - [Kurse VSCode Erweiterung](courses-vscode-extension.md) + - [Eine neue Sprache aktivieren](how-to-enable-new-languages.md) --- - **Unsere Community** - [**GitHub**](https://github.com/freecodecamp/freecodecamp) - - [**Discourse Forum**](https://freecodecamp.org/forum/c/contributors) + - [**Diskussionsforum**](https://freecodecamp.org/forum/c/contributors) - [**Chatserver**](https://discord.gg/PRyKn3Vbay) diff --git a/docs/i18n/german/how-to-enable-new-languages.md b/docs/i18n/german/how-to-enable-new-languages.md new file mode 100644 index 00000000000000..d0ee662a2a42c7 --- /dev/null +++ b/docs/i18n/german/how-to-enable-new-languages.md @@ -0,0 +1,279 @@ +# Deploying New Languages on `/learn` + +Before you can release a new language, you will need to allow the languages to download from Crowdin. + +## Updating Crowdin Settings + +In the `Curriculum` and `Learn UI` projects, you will need to select `Project Settings` from the sidebar. Then scroll down to `Language Mapping`, where you will see an option to add custom language codes. Add a new entry for the language you are releasing, selecting `language` as the `Placeholder` value, and entering a URL-friendly lower-case spelling of your language's name for the `Custom code`. If you aren't sure what to use, reach out in our contributor chat and we will assist you. + +## Updating Workflows + +You will need to add a step to the `crowdin-download.client-ui.yml` and `crowdin-download.curriculum.yml`. The step for these will be the same. For example, if you want to enable Dothraki downloads: + +```yml +##### Download Dothraki ##### +- name: Crowdin Download Dothraki Translations + uses: crowdin/github-action@master + # options: https://github.com/crowdin/github-action/blob/master/action.yml + with: + # uploads + upload_sources: false + upload_translations: false + auto_approve_imported: false + import_eq_suggestions: false + + # downloads + download_translations: true + download_language: mis + skip_untranslated_files: false + export_only_approved: true + + push_translations: false + + # pull-request + create_pull_request: false + + # global options + config: './crowdin-config.yml' + base_url: ${{ secrets.CROWDIN_BASE_URL_FCC }} + + # Uncomment below to debug + # dryrun_action: true +``` + +Note that the `download_language` key needs to be set to the language code displayed on Crowdin. + +## Enabling a Language + +> [!NOTE] The above section with updating the workflows should be completed before proceeding - these need to be done in separate steps or the builds will fail. + +There are a few steps to take in order to allow the codebase to build in your desired language. + +First, visit the `config/i18n/all-langs.ts` file to add the language to the available languages list and configure the values. There are several objects here. + +- `availableLangs`: For both the `client` and `curriculum` arrays, add the text name of the language. This is the value that will be used in the `.env` file later. +- `auditedCerts`: Add the text name of the language as the _key_, and add an array of `SuperBlocks.{cert}` variables as the _value_. This tells the client which certifications are fully translated. +- `i18nextCodes`: These are the ISO language codes for each language. You will need to add the appropriate ISO code for the language you are enabling. These do need to be unique for each language. +- `LangNames`: These are the display names for the language selector in the navigation menu. +- `LangCodes`: These are the language codes used for formatting dates and numbers. These should be Unicode CLDR codes instead of ISO codes. +- `hiddenLangs`: These languages will not be displayed in the navigation menu. This is used for languages that are not yet ready for release. + +As an example, if you wanted to enable Dothraki as a language, your `all-langs.js` objects should look like this: + +```js +export const availableLangs = { + client: ['english', 'espanol', 'chinese', 'chinese-traditional', 'dothraki'], + curriculum: [ + 'english', + 'espanol', + 'chinese', + 'chinese-traditional', + 'dothraki' + ] +}; + +export const auditedCerts = { + espanol: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis + ], + chinese: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis, + SuperBlocks.QualityAssurance, + SuperBlocks.SciCompPy, + SuperBlocks.DataAnalysisPy, + SuperBlocks.InfoSec, + SuperBlocks.MachineLearningPy + ], + 'chinese-traditional': [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis, + SuperBlocks.QualityAssurance, + SuperBlocks.SciCompPy, + SuperBlocks.DataAnalysisPy, + SuperBlocks.InfoSec, + SuperBlocks.MachineLearningPy + ], + dothraki: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs + ] +}; + +export const i18nextCodes = { + english: 'en', + espanol: 'es', + chinese: 'zh', + 'chinese-traditional': 'zh-Hant', + dothraki: 'mis' +}; + +export enum LangNames = { + english: 'English', + espanol: 'Español', + chinese: '中文(简体字)', + 'chinese-traditional': '中文(繁體字)', + dothraki: 'Dothraki' +}; + +export enum LangCodes = { + english: 'en-US', + espanol: 'es-419', + chinese: 'zh', + 'chinese-traditional': 'zh-Hant', + dothraki: 'mis' +}; + +export const hiddenLangs = ['dothraki']; +``` + +> [!NOTE] When a language has been set up in the deployment pipeline AND has a public `/news` instance live, it can be removed from the `hiddenLangs` array and be made available to the public. + +Next, open the `client/src/utils/algolia-locale-setup.ts` file. This data is used for the search bar that loads `/news` articles. While it is unlikely that you are going to test this functionality, missing the data for your language can lead to errors when attempting to build the codebase locally. + +Add an object for your language to the `algoliaIndices` object. You should use the the same values as the `english` object for local testing, replacing the `english` key with your language's `availableLangs` value. + +> [!NOTE] If we have already deployed an instance of news in your target language, you can update the values to reflect the live instance. Otherwise, use the English values. + +If you were to add Dothraki: + +```js +const algoliaIndices = { + english: { + name: 'news', + searchPage: 'https://www.freecodecamp.org/news/search/' + }, + espanol: { + name: 'news-es', + searchPage: 'https://www.freecodecamp.org/espanol/news/search/' + }, + chinese: { + name: 'news-zh', + searchPage: 'https://chinese.freecodecamp.org/news/search/' + }, + 'chinese-traditional': { + name: 'news-zh', + searchPage: 'https://chinese.freecodecamp.org/news/search' + }, + dothraki: { + name: 'news', + searchPage: 'https://www.freecodecamp.org/news/search/' + } +}; +``` + +### Releasing a Superblock + +After a superblock has been fully translated into a language, there are two steps to release it. First add the superblock enum to that language's `auditedCerts` array. So, if you want to release the new Responsive Web Design superblock for Dothraki, the array should look like this: + +```ts +export const auditedCerts = { + // other languages + dothraki: [ + SuperBlocks.RespWebDesignNew, // the newly translated superblock + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs + ] +}; +``` + +Finally, if the superblock is in a "new" state (that is, replacing a legacy superblock), the `languagesWithAuditedBetaReleases` array should be updated to include the new language like this: + +```ts +export const languagesWithAuditedBetaReleases: ['english', 'dothraki']; +``` + +This will move the new superblock to the correct place in the curriculum map on `/learn`. + +## Enabling Localized Videos + +For the video challenges, you need to change a few things. First add the new locale to the GraphQL query in the `client/src/templates/Challenges/video/Show.tsx` file. For example, adding Dothraki to the query: + +```tsx + query VideoChallenge($slug: String!) { + challengeNode(fields: { slug: { eq: $slug } }) { + videoId + videoLocaleIds { + espanol + italian + portuguese + dothraki + } + ... +``` + +Then add an id for the new language to any video challenge in an audited block. For example, if `auditedCerts` in `all-langs.ts` includes `scientific-computing-with-python` for `dothraki`, then you must add a `dothraki` entry in `videoLocaleIds`. The frontmatter should then look like this: + +```yml +videoLocaleIds: + espanol: 3muQV-Im3Z0 + italian: hiRTRAqNlpE + portuguese: AelGAcoMXbI + dothraki: new-id-here +dashedName: introduction-why-program +--- +``` + +Update the `VideoLocaleIds` interface in `client/src/redux/prop-types` to include the new language. + +```ts +export interface VideoLocaleIds { + espanol?: string; + italian?: string; + portuguese?: string; + dothraki?: string; +} +``` + +And finally update the challenge schema in `curriculum/schema/challengeSchema.js`. + +```js +videoLocaleIds: Joi.when('challengeType', { + is: challengeTypes.video, + then: Joi.object().keys({ + espanol: Joi.string(), + italian: Joi.string(), + portuguese: Joi.string(), + dothraki: Joi.string() + }) +}), +``` + +## Client UI + +You will need to take an additional step to handle the client UI translations. + +The Crowdin workflows will automatically pull down _some_ of the UI translations, but there are a couple of files that need to be moved manually. + +You will want to copy the following files from `/client/i18n/locales/english` to `/client/i18n/locales/`, and apply translations as needed: + +- `links.json` +- `meta-tags.json` +- `motivation.json` +- `trending.json` + +## Testing Translations Locally + +If you would like to test translations locally, before adding them to our main repository - skip the Crowdin workflow changes. Follow the steps for enabling a language, then download the translations from Crowdin and load them into your local code. + +Because the language has not been approved for production, our scripts are not automatically downloading the translations yet. Only staff have the access to directly download the translations - you are welcome to reach out to us in our [contributors chat room](https://discord.gg/PRyKn3Vbay), or you can translate the English markdown files locally for testing purposes. + +Once you have the files, you will need to place them in the correct directory. For the curriculum challenges, you should place the certification folders (i.e. `01-responsive-web-design`) within the `curriculum/challenges/{lang}` directory. For our Dothraki translations, this would be `curriculum/challenges/dothraki`. The client translation `.json` files will go in the `client/i18n/locales/{lang}` directory. + +Update your `.env` file to use your new language for `CLIENT_LOCALE` and `CURRICULUM_LOCALE`. + +Once these are in place, you should be able to run `npm run develop` to view your translated version of freeCodeCamp. + +> [!ATTENTION] While you may perform translations locally for the purpose of testing, we remind everyone that translations should _not_ be submitted through GitHub and should only be done through Crowdin. Be sure to reset your local codebase after you are done testing. diff --git a/docs/i18n/german/index.md b/docs/i18n/german/index.md index e39049e9dce0b3..551012fdb2b364 100644 --- a/docs/i18n/german/index.md +++ b/docs/i18n/german/index.md @@ -22,31 +22,31 @@ Du kannst helfen, den Studienplan zu erweitern und zu verbessern. Du kannst auch Wir lokalisieren freeCodeCamp.org in die wichtigsten Sprachen der Welt. -Certifications are already live in some major world languages like below: +Die Zertifizierungen sind bereits in einigen wichtigen Weltsprachen, wie unten zu sehen, verfügbar: -- [Chinese (中文)](https://chinese.freecodecamp.org/learn) -- [Spanish (Español)](https://www.freecodecamp.org/espanol/learn) -- [Italian (Italiano)](https://www.freecodecamp.org/italian/learn) -- [Portuguese (Português)](https://www.freecodecamp.org/portuguese/learn) -- [Ukrainian (Українська)](https://www.freecodecamp.org/ukrainian/learn) -- [Japanese (日本語)](https://www.freecodecamp.org/japanese/learn) +- [Chinesisch (中文)](https://chinese.freecodecamp.org/learn) +- [Spanisch (Español)](https://www.freecodecamp.org/espanol/learn) +- [Italienisch (Italiano)](https://www.freecodecamp.org/italian/learn) +- [Portugiesisch (Português)](https://www.freecodecamp.org/portuguese/learn) +- [Ukrainisch (Українська)](https://www.freecodecamp.org/ukrainian/learn) +- [Japanisch (日本語)](https://www.freecodecamp.org/japanese/learn) -We encourage you to read the [announcement here](https://www.freecodecamp.org/news/help-translate-freecodecamp-language/) and share it with your friends to get them excited about this. +Wir möchten dich dazu ermutigen, die [Ankündigung hier](https://www.freecodecamp.org/news/help-translate-freecodecamp-language/) zu lesen und sie an deine Freunde weiterzuleiten, um sie für dieses Thema zu begeistern. -**If you're interested in translating, here's [how to translate freeCodeCamp's resources](how-to-translate-files.md).** +**Wenn du daran interessiert bist, zu übersetzen, findest du hier [eine Anleitung zum Übersetzen der freeCodeCamp-Ressourcen](how-to-translate-files.md).** ## Lernplattform -Our learning platform runs on a modern JavaScript stack. It has various components, tools, and libraries. These include Node.js, MongoDB, OAuth 2.0, React, Gatsby, Webpack, and more. +Unsere Lernplattform läuft auf einem modernen JavaScript-Stack. Es umfasst verschiedene Komponenten, Werkzeuge und Bibliotheken. Dazu gehören Node.js, MongoDB, OAuth 2.0, React, Gatsby, Webpack und mehr. -Broadly, we have a Node.js based API server, a set of React-based client applications, testing scripts to evaluate camper-submitted curriculum projects, and more. If you want to productively contribute to the learning platform, we recommend some familiarity with these tools. +Im Großen und Ganzen haben wir einen Node.js-basierten API-Server, eine Reihe von React-basierten Client-Anwendungen, Testskripte, um die von Teilnehmer:innen eingereichten Studienplanprojekten zu bewerten, und einiges mehr. Wenn du einen produktiven Beitrag zur Lernplattform leisten willst, empfehlen wir dir, dich mit diesen Werkzeugen etwas vertraut zu machen. -If you want to help us improve our codebase... +Wenn du uns helfen willst, unsere Codebasis zu verbessern... -**you can either use Gitpod, a free online dev environment that starts a ready-to-code dev environment for freeCodeCamp in your browser.** +**kannst du entweder Gitpod verwenden, eine kostenlose Online-Entwicklungsumgebung, die eine programmierfertige Entwicklungsumgebung für freeCodeCamp in Ihrem Browser startet.** -[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/freeCodeCamp/freeCodeCamp) +[![In Gitpod öffnen](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/freeCodeCamp/freeCodeCamp) -Or you can... +Oder du kannst... -**[Set up freeCodeCamp locally](how-to-setup-freecodecamp-locally.md) on your machine.** +**[freeCodeCamp lokal](how-to-setup-freecodecamp-locally.md) auf deinem Rechner einrichten.** diff --git a/docs/i18n/german/language-lead-handbook.md b/docs/i18n/german/language-lead-handbook.md index fbd057794e01c5..8f4cfa0afb36f4 100644 --- a/docs/i18n/german/language-lead-handbook.md +++ b/docs/i18n/german/language-lead-handbook.md @@ -1,22 +1,22 @@ -# The Official freeCodeCamp Language Lead Handbook +# Das offizielle freeCodeCamp-Language Lead-Handbuch -This handbook will help you set up and use the tools for your localization efforts. +Dieses Handbuch hilft dir dabei, die Tools für deine Lokalisierungsvorhaben einzurichten und zu nutzen. -## How to invite new contributors to Ghost +## Wie du neue Mitwirkende zu Ghost einlädst -Ghost allows you to set contributors with different levels of authorizations. +Ghost ermöglicht es dir, Mitwirkende mit verschiedenen Berechtigungsstufen festzulegen. -Most of your invites will be for the "Contributor" level. This level allows the user to create drafts. Select this role when inviting a new translator. +Die meisten Ihrer Einladungen werden für die Stufe "Contributor " sein. Auf dieser Ebene kann der Benutzer Entwürfe erstellen. Wähle diese Rolle, wenn du einen neuen Übersetzer einlädst. -The "Author" level allows the user to create Drafts and publish them. +Die Stufe "Author" ermöglicht es dem Benutzer, Entwürfe zu erstellen und diese zu veröffentlichen. -The "Editor" level allows the user to access all Drafts and publish them. Select this role when inviting a new proofreader. +Auf der Ebene "Editor" hat der Benutzer Zugriff auf alle Entwürfe und kann sie veröffentlichen. Wähle diese Rolle, wenn du einen neuen Korrekturleser (proofreader) einlädst. -The "Administrator" level is reserved for freeCodeCamp staff and Language Leads. +Die Stufe "Administrator" ist für freeCodeCamp-Mitarbeiter und Language Leads reserviert. -## How to mention the original author of a translated article +## Wie man den Originalautor eines übersetzten Artikels erwähnt -The original author and the original article are linked automatically adding this code to the Code Injection -> head section in the Draft Settings on ghost. +Der ursprüngliche Autor und der ursprüngliche Artikel werden automatisch verlinkt, indem dieser Code dem Abschnitt Code Injection -> head in den Entwurfs-Einstellungen auf Ghost hinzugefügt wird. ```html ``` -With `link` being the link of the original article. +`Link` ist der Link zum Originalartikel. -## How to update trending articles +## Wie man angesagte Artikel aktualisiert -> [!TIP] Changing the articles in the footer at least once a month means giving a boost to the linked articles on google results. +> [!TIP] Die Artikel in der Fußzeile mindestens einmal im Monat zu ändern, führt zu einer Verbesserung der Google-Ergebnisse für die verlinkten Artikel. -There are two places in which to change the trending articles. +Es gibt zwei Stellen, an denen du die angesagten Artikel ändern kannst. -- [The curriculum repository](https://github.com/freeCodeCamp/freeCodeCamp/) -- [The CDN repository](https://github.com/freeCodeCamp/cdn) +- [Das Curriculum-Repository](https://github.com/freeCodeCamp/freeCodeCamp/) +- [Das CDN-Repository](https://github.com/freeCodeCamp/cdn) -For each article you will need to create a shorter title to use in the footer. +Für jeden Artikel musst du einen kürzeren Titel erstellen, den du in der Fußzeile (Footer) verwenden kannst. -### Change trending articles in the curriculum +### Änderung angesagter Artikel im Lehrplan (Curriculum) -The trending articles in the curriculum footer can be changed by editing the file at `client/i18n/locales//trending.json`. +Die angesagte Artikel in der Fußzeile des Lehrplans können durch Bearbeiten der Datei `client/i18n/locales//trending.json` geändert werden. -This file is a `*.json` file that has the shape of an object with property keys in the shape `article0title` and `article0link`. +Diese Datei ist eine `*.json`-Datei, die die Form eines Objekts mit Eigenschaftsschlüsseln in der Form `article0title` und `article0link` hat. -Each number rapresents one of the 30 articles in the footer. Make sure to match the title and the link correctly. +Jede Zahl steht für einen der 30 Artikel in der Fußzeile. Achte darauf, dass der Titel und der Link richtig zugeordnet sind. -This is an example of how part of the `trending.json` file has to look. +Dies ist ein Beispiel dafür, wie ein Teil der Datei `trending.json` aussehen muss. ```json { @@ -65,13 +65,13 @@ This is an example of how part of the `trending.json` file has to look. } ``` -You will want to [build the translated client locally](how-to-test-translations-locally.md) to see if the titles have the right length. Each title must stay on a single line and not go to a new line. +Du solltest [den übersetzten Client lokal einrichten](how-to-enable-new-languages.md), um zu sehen, ob die Titel die richtige Länge haben. Jeder Titel muss in einer einzigen Zeile bleiben und darf nicht in eine neue Zeile übergehen. -### How to update the trending articles in the cdn +### Wie man angesagte Artikel im cdn aktualisiert -The file in the cdn repository is the file `universal/trending/.yaml`. +Die Datei im cdn-Repository ist die Datei `universal/trending/.yaml`. -This file is shaped differently, for example here the file content for the first 6 articles: +Diese Datei ist unterschiedlich aufgebaut, zum Beispiel hier der Inhalt der ersten 6 Artikel: ```yaml article0title: 'Unire CSV con Python' @@ -88,27 +88,27 @@ article5title: 'Cosa è API?' article5link: 'https://www.freecodecamp.org/italian/news/cose-un-api-in-italiano-per-favore/' ``` -You can convert from one format to the other carefully changing it manually. Or you can use [the script in this repl](https://replit.com/@Ieahleen/convert-json-to-yaml). +Du kannst von einem Format in ein anderes konvertieren, indem du es vorsichtig manuell ändern. Oder du kannst [das Skript in diesem Repl](https://replit.com/@Ieahleen/convert-json-to-yaml) verwenden. -> [!TIP] A new workflow is being worked on, there will be only one place to change in the future. +> [!TIP] Es wird an einem neuen Arbeitsablauf gearbeitet, sodass es in Zukunft nur noch eine Stelle gibt, an der Änderungen vorgenommen werden müssen. -## How to translate the info boxes headers in the documentation +## Wie man die Überschriften der Infoboxen in der Dokumentation übersetzt -You can find these boxes all around the documentation: +Du findest diese Boxen überall in der Dokumentation: -> [!NOTE] I am a note box +> [!NOTE] Ich bin eine Notizbox -> [!TIP] I am a tip box +> [!TIP] Ich bin eine Tippbox -> [!WARNING] I am a warning box +> [!WARNING] Ich bin eine Warnbox -> [!ATTENTION] I am an attention box +> [!ATTENTION] Ich bin eine Aufmerksamkeitsbox -By default, their headers appear in English even in the translated docs. +Standardmäßig erscheinen die Kopfzeilen auch in den übersetzten Dokumenten auf Englisch. -You can have the headers translated in the docs in your language by changing the file `docs/index.html`, in this way: +Du kannst die Kopfzeilen in den Dokumenten in deine Sprache übersetzen lassen, indem du die Datei `docs/index.html` auf diese Weise änderst: -Inside the `script` element there is an object, find the `flexibleAlerts` property, which has this shape: +Innerhalb des `script` Elements gibt es ein Objekt, die `flexibleAlerts` Eigenschaft, die diese Form hat: ```js flexibleAlerts: { @@ -135,9 +135,9 @@ flexibleAlerts: { } ``` -Inside the object of the label property, before the `'/'` property, you would add a new property for your language, like `/i18n//`. +Innerhalb des Objekts der Label-Eigenschaft, vor der `'/'`-Eigenschaft, fügst du eine neue Eigenschaft für deine Sprache hinzu, wie `/i18n//`. -For example, adding the translations for Portuguese would appear like this: +Das Hinzufügen der Übersetzungen für Portugiesisch würde zum Beispiel so aussehen: ```js flexibleAlerts: { @@ -168,11 +168,11 @@ flexibleAlerts: { } ``` -## How to translate the motivational quotes +## Wie man die motivierenden Zitate übersetzt -The motivational quotes can be found in the [curriculum repository](https://github.com/freeCodeCamp/freeCodeCamp/) in the `/client/i18n/locales//motivation.json` file. +Die motivierenden Zitate befinden sich im [Curriculum-Repository](https://github.com/freeCodeCamp/freeCodeCamp/) in der Datei `/client/i18n/locales//motivation.json`. -This file has a general structure of: +Diese Datei hat folgende allgemeine Struktur: ```json { @@ -181,11 +181,11 @@ This file has a general structure of: } ``` -The compliments are the short sentences that appear at the completion of a challenge. +Die Komplimente sind die kurzen Sätze, die am Ende einer Aufgabe erscheinen. -You don't need to directly translate the sentences used in English, you can write a set of short sentences that are appropriate to show at the completion of a challenge. +Du musst die Sätze nicht direkt aus dem Englischen übersetzen, sondern kannst eine Reihe von kurzen Sätzen schreiben, die sich eignen, um sie am Ende einer Aufgabe zu zeigen. -The `compliments` array is an array of strings, so for example you would write: +Das `compliments`-Array ist ein Array aus Strings, also würdest du zum Beispiel schreiben: ```json { @@ -194,11 +194,11 @@ The `compliments` array is an array of strings, so for example you would write: } ``` -> [!TIP] You should start with at least a dozen compliments to have some variety when users complete challenges. +> [!TIP] Du solltest mit mindestens einem Dutzend Komplimenten beginnen, um eine gewisse Abwechslung zu schaffen, wenn die Benutzer die Aufgaben abschließen. -The motivational quotes are the quotes that appear at https://freecodecamp.org/learn. +Die Motivationszitate sind die Zitate, die auf https://freecodecamp.org/learn erscheinen. -The `motivationalQuotes` array is an array of objects, these objects should include a `quote` property and an `author` property. like this: +Das `motivationalQuotes`-Array ist ein Array aus Objekten. Diese Objekte sollten eine `quote`-Eigenschaft und eine `author`-Eigenschaft enthalten. Wie hier: ```json { @@ -216,64 +216,64 @@ The `motivationalQuotes` array is an array of objects, these objects should incl } ``` -> [!TIP] You should start with at least a dozen quotes, to have some variety. A new quote is shown every time the user reload the page. +> [!TIP] Du solltest mit mindestens einem Dutzend Zitaten beginnen, um eine gewisse Vielfalt zu haben. Jedes Mal, wenn der Benutzer die Seite neu lädt, wird ein neues Zitat angezeigt. -## How to update the common links +## Wie man allgemeine Links aktualisiert -We maintain a file of common links used throughout our [curriculum site](https://github.com/freecodecamp/freecodecamp) in the `/client/i18n/locales//links.json` file. +In der Datei `/client/i18n/locales//links.json` wird eine Datei mit allgemeinen Links geführt, die auf unserer [Lehrplan-Website](https://github.com/freecodecamp/freecodecamp) verwendet wird. -Some of these links will not change - but you should update the `/news` article links to point to your language's translated version of that article when it is published. +Einige dieser Links werden sich nicht ändern - aber du solltest die `/news`-Artikel-Links aktualisieren, damit sie auf die übersetzte Version des Artikels in deiner Sprache verweisen, wenn er veröffentlicht wird. -You should also update the `help` categories to point to your language's subforum (usually `language/category`, like `Italiano/HTML-CSS`). This will allow campers to create "help posts" in the correct forum location. +Du solltest auch die `help`-Kategorien aktualisieren, um auf das Unterforum deiner Sprache zu verweisen (normalerweise `language/category`, wie `Italiano/HTML-CSS`). Dies ermöglicht es freeCodeCamp-Benutzern, 'Hilfeanfragen' im richtigen Forum zu erstellen. -## How to update the site meta-data +## So aktualisierst du die Metadaten der Website -The site meta-data is in the `/client/i18n/locales//meta-tags.json` file. This file has five keys: `title`, `description`, `social-description`, `keywords`, and `youre-unsubscribed`. +Die Metadaten der Website befinden sich in der Datei `/client/i18n/locales//meta-tags.json`. Diese Datei hat 5 Schlüssel:`title`, `description`, `social-description`, `keywords`, und `youre-unsubscribed`. -The `youre-unsubscribed` value should be directly translated. The other values will need to be translated as closely as possible, while also considering common search terms and phrases used in your language. +Der Wert `youre-unsubscribed` sollte direkt übersetzt werden. Die anderen Werte müssen so genau wie möglich übersetzt werden, wobei auch die in deiner Sprache üblichen Suchbegriffe und Phrasen berücksichtigt werden müssen. -If you need help with this, reach out to us in the [contributor chat](https://discord.gg/PRyKn3Vbay) +Wenn du dabei Hilfe benötigst, wende dich an uns im ["Contributor" Chat](https://discord.gg/PRyKn3Vbay) -## Pre-Translate Workflow on Crowdin +## Vorübersetzungs-Workflow auf Crowdin -The Pre-Translate workflow can be used to apply translations from the Translation Memory to strings. +Der Vorübersetzungs-Workflow kann verwendet werden, um Übersetzungen aus dem Translation Memory auf Strings anzuwenden. -> [!TIP] Really useful to restore a lot of translations from the Translation Memory in bulk when a lot of files have been updated. +> [!TIP] Diese Funktion ist sehr nützlich, um viele Übersetzungen aus dem Translation Memory in großen Mengen wiederherzustellen, wenn viele Dateien aktualisiert worden sind. -You can find the Pre-Translation workflow at the top of the page in the console of a project. If you see "Go to console" in the upper right corner, click there first. +Du findest den Vorübersetzungs-Workflow oben auf der Seite in der Konsole eines Projekts. Wenn du in der oberen rechten Ecke "Go to console" siehst, klicke zuerst darauf. -![go to console button](./images/crowdin/pre-translate2.png) +![Gehe zur Konsole-Schaltfläche](./images/crowdin/pre-translate2.png) -![pre-translate workflow](./images/crowdin/pre-translate1.png) +![Vorübersetzungs-Workflow](./images/crowdin/pre-translate1.png) -You can choose "From Machine Translation" or "From Translation Memory". Choose "Translation Memory" to recover translations from memory. +Du kannst "From Machine Translation" oder "From Translation Memory" wählen. Wähle "Translation Memory", um Übersetzungen aus dem Speicher wiederherzustellen. -Then there are three steps to complete: +Dann sind drei Schritte zu absolvieren: -1. Files. Choose which files to translate, you can do all the project, or specific folders or files. -2. Languages. Set your language here. -3. Existing Translations. The best combination here is "100% match" and "Apply to untranslated strings only". Do not approve automatically, as it's always best to have a human eye on things. +1. Dateien. Wähle die zu übersetzenden Dateien aus. Du kannst das gesamte Projekt oder bestimmte Ordner oder Dateien übersetzen. +2. Sprachen. Stelle hier deine Sprache ein. +3. Vorhandene Übersetzungen. Die beste Kombination ist hier "100% match" und "Apply to untranslated strings only". Genehmige nicht automatisch, denn es ist immer besser, ein menschliches Auge auf die Dinge zu werfen. -![pre-translate existing translations](./images/crowdin/pre-translate3.png) +![Vorübersetzung bestehender Übersetzungen](./images/crowdin/pre-translate3.png) -When you have finished setting this, press the Pre-Translate button and wait. It will alert you once it has finished. The time it takes depends on how many untranslated strings are in the chosen files. +Wenn du diese Einstellung abgeschlossen hast, drücke den Button Pre-Translate und warte. Sobald der Vorgang abgeschlossen ist, wirst du benachrichtigt. Wie lange das dauert, hängt davon ab, wie viele unübersetzte Strings in den ausgewählten Dateien enthalten sind. -## How to update Crowdin Glossary +## Wie man das Crowdin Glossar aktualisiert -> [!TIP] An updated glossary helps in having an homogeneous translation of technical terms. +> [!TIP] Ein aktualisiertes Glossar hilft, eine einheitliche Übersetzung von Fachbegriffen zu erhalten. -The Crowdin Glossary is kept in the [crowdin-glossaries](https://github.com/freeCodeCamp/crowdin-glossaries) repository. +Das Crowdin-Glossar wird im [crowdin-glossaries](https://github.com/freeCodeCamp/crowdin-glossaries)-Repository aufbewahrt. -In the `glossaries` folder there are various `*.csv` (comma separated values) files, one for each of the crowdin projects that have a glossary that can be updated from this workflow. +Im Ordner `glossaries` befinden sich verschiedene `*.csv`-Dateien (kommagetrennte Werte), eine für jedes Crowdin-Projekt, das ein Glossar hat, das über diesen Workflow aktualisiert werden kann. -The `client.csv` file is for the Learn User Interface project, the `curriculum.csv` file is for the Coding Curriculum project, the `docs.csv` file is for the Contributing Documentation project. +Die `client.csv`-Datei ist für das Projekt "Learn User Interface", die `curriculum.csv`-Datei ist für das Projekt "Coding Curriculum", die `docs.csv`-Datei ist für das Projekt "Contributing Documentation". -To update the Crowdin Glossaries you need to clone this repo locally. Open the `.csv` file with an appropriate program, for example Microsoft Excel. +Um die Crowdin Glossare zu aktualisieren, musst du dieses Repo lokal klonen. Öffnen die `.csv`-Datei mit einem geeigneten Programm, zum Beispiel Microsoft Excel. -In the `.csv` file you will find that the English language occupies the first three columns, `Term:English` is the column for the English term, `Description:English` is the column for the English description, and `Part:English` is for the part of speech (e.g., noun, verb etc.) of the term. +In der `.csv`-Datei siehst du, dass die englische Sprache die ersten drei Spalten belegt, `Term:English` ist die Spalte für den englischen Begriff, `Description:English` ist die Spalte für die englische Beschreibung, und `Part:English` steht für die Wortart (z. B. Substantiv, Verb usw.) des Begriffs. -Then, each target language has two columns. If you translate to Dothraki, you will be interested in the columns `Term:Dothraki` and `Description:Dothraki`. The column `Term:Dothraki` is for the translation of the term in Dothraki, and the column `Description:Dothraki` is for a description of the term in Dothraki. +Dann hat jede Zielsprache zwei Spalten. Wenn du ins Dothrakische übersetzt, wirst du an den Spalten `Term:Dothraki` und `Description:Dothraki` interessiert sein. Die Spalte `Term:Dothraki` ist für die Übersetzung des Begriffs in Dothraki, und die Spalte `Description:Dothraki` ist für die Beschreibung des Begriffs in Dothraki. -> [!TIP] In programs like Microsoft Excel you can hide the columns of the other languages to free up screen real-estate and see the English columns and the target language columns near each other. +> [!TIP] In Programmen wie Microsoft Excel kannst du die Spalten der anderen Sprachen ausblenden, um Bildschirmfläche freizugeben und die englischen Spalten und die Spalten der Zielsprache nebeneinander zu sehen. -After you have made the changes and saved the file, you will need to make a PR with the proposed changes. After the PR is accepted, you will need to run the GitHub Action workflow to update the Crowdin Glossary. Your glossary changes will not have immediate effects, but they will come. +Nachdem du die Änderungen vorgenommen und die Datei gespeichert hast, musst du einen PR mit den vorgeschlagenen Änderungen erstellen. Nachdem der PR angenommen wurde, musst du den GitHub Action-Workflow ausführen, um das Crowdin-Glossar zu aktualisieren. Deine Änderungen im Glossar werden sich nicht sofort auswirken, aber sie werden kommen. diff --git a/docs/i18n/german/security-hall-of-fame.md b/docs/i18n/german/security-hall-of-fame.md index cb13abbd116949..b6175d3a3b577a 100644 --- a/docs/i18n/german/security-hall-of-fame.md +++ b/docs/i18n/german/security-hall-of-fame.md @@ -6,6 +6,6 @@ Auch wenn wir im Moment keine Belohnungen oder Swags anbieten, sind wir diesen g - Mehul Mohan from [codedamn](https://codedamn.com) ([@mehulmpt](https://twitter.com/mehulmpt)) - [Behebung von Sicherheitslücken](https://github.com/freeCodeCamp/freeCodeCamp/blob/bb5a9e815313f1f7c91338e171bfe5acb8f3e346/client/src/components/Flash/index.js) - Peter Samir https://www.linkedin.com/in/peter-samir/ -- Laurence Tennant ([@hyperreality](https://github.com/hyperreality)) working with IncludeSecurity.com - [GHSA-cc3r-grh4-27gj](https://github.com/freeCodeCamp/freeCodeCamp/security/advisories/GHSA-cc3r-grh4-27gj) +- Laurence Tennant ([@hyperreality](https://github.com/hyperreality)) arbeitet mit IncludeSecurity.com - [GHSA-cc3r-grh4-27gj](https://github.com/freeCodeCamp/freeCodeCamp/security/advisories/GHSA-cc3r-grh4-27gj) -> ### Thank you for your contributions :pray: +> ### Vielen Dank für eure Beiträge :pray: diff --git a/docs/i18n/italian/_sidebar.md b/docs/i18n/italian/_sidebar.md index 83b236578f6abb..fb617be40a24e6 100644 --- a/docs/i18n/italian/_sidebar.md +++ b/docs/i18n/italian/_sidebar.md @@ -19,11 +19,10 @@ - [Lavorare sulla documentazione](how-to-work-on-the-docs-theme.md) - [Lavorare sulla libreria dei componenti](how-to-work-on-the-component-library.md) - **Guide aggiuntive** - - [Testare traduzioni in locale](how-to-test-translations-locally.md) - - [Capire la struttura dei file del curriculum](curriculum-file-structure.md) - - [Fare il debug delle email in uscita localmente](how-to-catch-outgoing-emails-locally.md) - - [Settare freeCodeCamp su Windows (WSL)](how-to-setup-wsl.md) - - [Workflow con il Token Utente](user-token-workflow.md) + - [Understand the curriculum file structure](curriculum-file-structure.md) + - [Debug outgoing emails locally](how-to-catch-outgoing-emails-locally.md) + - [Set up freeCodeCamp on Windows (WSL)](how-to-setup-wsl.md) + - [User Token Workflow](user-token-workflow.md) --- @@ -32,6 +31,7 @@ - [Manuale del Leader di lingua](language-lead-handbook.md) - [Manuale di DevOps](devops.md) - [Estensione di VSCode per i corsi](courses-vscode-extension.md) + - [Enable New Language](how-to-enable-new-languages.md) --- diff --git a/docs/i18n/italian/how-to-enable-new-languages.md b/docs/i18n/italian/how-to-enable-new-languages.md new file mode 100644 index 00000000000000..d0ee662a2a42c7 --- /dev/null +++ b/docs/i18n/italian/how-to-enable-new-languages.md @@ -0,0 +1,279 @@ +# Deploying New Languages on `/learn` + +Before you can release a new language, you will need to allow the languages to download from Crowdin. + +## Updating Crowdin Settings + +In the `Curriculum` and `Learn UI` projects, you will need to select `Project Settings` from the sidebar. Then scroll down to `Language Mapping`, where you will see an option to add custom language codes. Add a new entry for the language you are releasing, selecting `language` as the `Placeholder` value, and entering a URL-friendly lower-case spelling of your language's name for the `Custom code`. If you aren't sure what to use, reach out in our contributor chat and we will assist you. + +## Updating Workflows + +You will need to add a step to the `crowdin-download.client-ui.yml` and `crowdin-download.curriculum.yml`. The step for these will be the same. For example, if you want to enable Dothraki downloads: + +```yml +##### Download Dothraki ##### +- name: Crowdin Download Dothraki Translations + uses: crowdin/github-action@master + # options: https://github.com/crowdin/github-action/blob/master/action.yml + with: + # uploads + upload_sources: false + upload_translations: false + auto_approve_imported: false + import_eq_suggestions: false + + # downloads + download_translations: true + download_language: mis + skip_untranslated_files: false + export_only_approved: true + + push_translations: false + + # pull-request + create_pull_request: false + + # global options + config: './crowdin-config.yml' + base_url: ${{ secrets.CROWDIN_BASE_URL_FCC }} + + # Uncomment below to debug + # dryrun_action: true +``` + +Note that the `download_language` key needs to be set to the language code displayed on Crowdin. + +## Enabling a Language + +> [!NOTE] The above section with updating the workflows should be completed before proceeding - these need to be done in separate steps or the builds will fail. + +There are a few steps to take in order to allow the codebase to build in your desired language. + +First, visit the `config/i18n/all-langs.ts` file to add the language to the available languages list and configure the values. There are several objects here. + +- `availableLangs`: For both the `client` and `curriculum` arrays, add the text name of the language. This is the value that will be used in the `.env` file later. +- `auditedCerts`: Add the text name of the language as the _key_, and add an array of `SuperBlocks.{cert}` variables as the _value_. This tells the client which certifications are fully translated. +- `i18nextCodes`: These are the ISO language codes for each language. You will need to add the appropriate ISO code for the language you are enabling. These do need to be unique for each language. +- `LangNames`: These are the display names for the language selector in the navigation menu. +- `LangCodes`: These are the language codes used for formatting dates and numbers. These should be Unicode CLDR codes instead of ISO codes. +- `hiddenLangs`: These languages will not be displayed in the navigation menu. This is used for languages that are not yet ready for release. + +As an example, if you wanted to enable Dothraki as a language, your `all-langs.js` objects should look like this: + +```js +export const availableLangs = { + client: ['english', 'espanol', 'chinese', 'chinese-traditional', 'dothraki'], + curriculum: [ + 'english', + 'espanol', + 'chinese', + 'chinese-traditional', + 'dothraki' + ] +}; + +export const auditedCerts = { + espanol: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis + ], + chinese: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis, + SuperBlocks.QualityAssurance, + SuperBlocks.SciCompPy, + SuperBlocks.DataAnalysisPy, + SuperBlocks.InfoSec, + SuperBlocks.MachineLearningPy + ], + 'chinese-traditional': [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis, + SuperBlocks.QualityAssurance, + SuperBlocks.SciCompPy, + SuperBlocks.DataAnalysisPy, + SuperBlocks.InfoSec, + SuperBlocks.MachineLearningPy + ], + dothraki: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs + ] +}; + +export const i18nextCodes = { + english: 'en', + espanol: 'es', + chinese: 'zh', + 'chinese-traditional': 'zh-Hant', + dothraki: 'mis' +}; + +export enum LangNames = { + english: 'English', + espanol: 'Español', + chinese: '中文(简体字)', + 'chinese-traditional': '中文(繁體字)', + dothraki: 'Dothraki' +}; + +export enum LangCodes = { + english: 'en-US', + espanol: 'es-419', + chinese: 'zh', + 'chinese-traditional': 'zh-Hant', + dothraki: 'mis' +}; + +export const hiddenLangs = ['dothraki']; +``` + +> [!NOTE] When a language has been set up in the deployment pipeline AND has a public `/news` instance live, it can be removed from the `hiddenLangs` array and be made available to the public. + +Next, open the `client/src/utils/algolia-locale-setup.ts` file. This data is used for the search bar that loads `/news` articles. While it is unlikely that you are going to test this functionality, missing the data for your language can lead to errors when attempting to build the codebase locally. + +Add an object for your language to the `algoliaIndices` object. You should use the the same values as the `english` object for local testing, replacing the `english` key with your language's `availableLangs` value. + +> [!NOTE] If we have already deployed an instance of news in your target language, you can update the values to reflect the live instance. Otherwise, use the English values. + +If you were to add Dothraki: + +```js +const algoliaIndices = { + english: { + name: 'news', + searchPage: 'https://www.freecodecamp.org/news/search/' + }, + espanol: { + name: 'news-es', + searchPage: 'https://www.freecodecamp.org/espanol/news/search/' + }, + chinese: { + name: 'news-zh', + searchPage: 'https://chinese.freecodecamp.org/news/search/' + }, + 'chinese-traditional': { + name: 'news-zh', + searchPage: 'https://chinese.freecodecamp.org/news/search' + }, + dothraki: { + name: 'news', + searchPage: 'https://www.freecodecamp.org/news/search/' + } +}; +``` + +### Releasing a Superblock + +After a superblock has been fully translated into a language, there are two steps to release it. First add the superblock enum to that language's `auditedCerts` array. So, if you want to release the new Responsive Web Design superblock for Dothraki, the array should look like this: + +```ts +export const auditedCerts = { + // other languages + dothraki: [ + SuperBlocks.RespWebDesignNew, // the newly translated superblock + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs + ] +}; +``` + +Finally, if the superblock is in a "new" state (that is, replacing a legacy superblock), the `languagesWithAuditedBetaReleases` array should be updated to include the new language like this: + +```ts +export const languagesWithAuditedBetaReleases: ['english', 'dothraki']; +``` + +This will move the new superblock to the correct place in the curriculum map on `/learn`. + +## Enabling Localized Videos + +For the video challenges, you need to change a few things. First add the new locale to the GraphQL query in the `client/src/templates/Challenges/video/Show.tsx` file. For example, adding Dothraki to the query: + +```tsx + query VideoChallenge($slug: String!) { + challengeNode(fields: { slug: { eq: $slug } }) { + videoId + videoLocaleIds { + espanol + italian + portuguese + dothraki + } + ... +``` + +Then add an id for the new language to any video challenge in an audited block. For example, if `auditedCerts` in `all-langs.ts` includes `scientific-computing-with-python` for `dothraki`, then you must add a `dothraki` entry in `videoLocaleIds`. The frontmatter should then look like this: + +```yml +videoLocaleIds: + espanol: 3muQV-Im3Z0 + italian: hiRTRAqNlpE + portuguese: AelGAcoMXbI + dothraki: new-id-here +dashedName: introduction-why-program +--- +``` + +Update the `VideoLocaleIds` interface in `client/src/redux/prop-types` to include the new language. + +```ts +export interface VideoLocaleIds { + espanol?: string; + italian?: string; + portuguese?: string; + dothraki?: string; +} +``` + +And finally update the challenge schema in `curriculum/schema/challengeSchema.js`. + +```js +videoLocaleIds: Joi.when('challengeType', { + is: challengeTypes.video, + then: Joi.object().keys({ + espanol: Joi.string(), + italian: Joi.string(), + portuguese: Joi.string(), + dothraki: Joi.string() + }) +}), +``` + +## Client UI + +You will need to take an additional step to handle the client UI translations. + +The Crowdin workflows will automatically pull down _some_ of the UI translations, but there are a couple of files that need to be moved manually. + +You will want to copy the following files from `/client/i18n/locales/english` to `/client/i18n/locales/`, and apply translations as needed: + +- `links.json` +- `meta-tags.json` +- `motivation.json` +- `trending.json` + +## Testing Translations Locally + +If you would like to test translations locally, before adding them to our main repository - skip the Crowdin workflow changes. Follow the steps for enabling a language, then download the translations from Crowdin and load them into your local code. + +Because the language has not been approved for production, our scripts are not automatically downloading the translations yet. Only staff have the access to directly download the translations - you are welcome to reach out to us in our [contributors chat room](https://discord.gg/PRyKn3Vbay), or you can translate the English markdown files locally for testing purposes. + +Once you have the files, you will need to place them in the correct directory. For the curriculum challenges, you should place the certification folders (i.e. `01-responsive-web-design`) within the `curriculum/challenges/{lang}` directory. For our Dothraki translations, this would be `curriculum/challenges/dothraki`. The client translation `.json` files will go in the `client/i18n/locales/{lang}` directory. + +Update your `.env` file to use your new language for `CLIENT_LOCALE` and `CURRICULUM_LOCALE`. + +Once these are in place, you should be able to run `npm run develop` to view your translated version of freeCodeCamp. + +> [!ATTENTION] While you may perform translations locally for the purpose of testing, we remind everyone that translations should _not_ be submitted through GitHub and should only be done through Crowdin. Be sure to reset your local codebase after you are done testing. diff --git a/docs/i18n/italian/language-lead-handbook.md b/docs/i18n/italian/language-lead-handbook.md index 38829e9c982eda..7b02d5e0c0f72f 100644 --- a/docs/i18n/italian/language-lead-handbook.md +++ b/docs/i18n/italian/language-lead-handbook.md @@ -65,7 +65,7 @@ Questo è un esempio di come deve essere una parte del file `trending.json`. } ``` -Dovrai [fare il build in locale del client tradotto](how-to-test-translations-locally.md) per vedere se i titoli hanno la giusta lunghezza. Ogni titolo deve rimanere su una sola riga e non andare sulla successiva. +You will want to [build the translated client locally](how-to-enable-new-languages.md) to see if the titles have the right length. Ogni titolo deve rimanere su una sola riga e non andare sulla successiva. ### Come aggiornare gli articoli di tendenza nel cdn diff --git a/docs/i18n/japanese/_sidebar.md b/docs/i18n/japanese/_sidebar.md index 27fc885fab190b..827f907c6ff806 100644 --- a/docs/i18n/japanese/_sidebar.md +++ b/docs/i18n/japanese/_sidebar.md @@ -19,11 +19,10 @@ - [ドキュメントに貢献する](how-to-work-on-the-docs-theme.md) - [コンポーネントライブラリに貢献する](how-to-work-on-the-component-library.md) - **その他のガイド** - - [翻訳をローカルでテストする](how-to-test-translations-locally.md) - - [カリキュラムのファイル構造を理解する](curriculum-file-structure.md) - - [送信メールをローカルでデバッグする](how-to-catch-outgoing-emails-locally.md) - - [Windows (WSL) で freeCodeCamp 開発環境を構築する](how-to-setup-wsl.md) - - [ユーザートークンワークフロー](user-token-workflow.md) + - [Understand the curriculum file structure](curriculum-file-structure.md) + - [Debug outgoing emails locally](how-to-catch-outgoing-emails-locally.md) + - [Set up freeCodeCamp on Windows (WSL)](how-to-setup-wsl.md) + - [User Token Workflow](user-token-workflow.md) --- @@ -32,6 +31,7 @@ - [ランゲージリードハンドブック](language-lead-handbook.md) - [DevOps ハンドブック](devops.md) - [VSCode 拡張機能「Courses」](courses-vscode-extension.md) + - [Enable New Language](how-to-enable-new-languages.md) --- diff --git a/docs/i18n/japanese/how-to-enable-new-languages.md b/docs/i18n/japanese/how-to-enable-new-languages.md new file mode 100644 index 00000000000000..d0ee662a2a42c7 --- /dev/null +++ b/docs/i18n/japanese/how-to-enable-new-languages.md @@ -0,0 +1,279 @@ +# Deploying New Languages on `/learn` + +Before you can release a new language, you will need to allow the languages to download from Crowdin. + +## Updating Crowdin Settings + +In the `Curriculum` and `Learn UI` projects, you will need to select `Project Settings` from the sidebar. Then scroll down to `Language Mapping`, where you will see an option to add custom language codes. Add a new entry for the language you are releasing, selecting `language` as the `Placeholder` value, and entering a URL-friendly lower-case spelling of your language's name for the `Custom code`. If you aren't sure what to use, reach out in our contributor chat and we will assist you. + +## Updating Workflows + +You will need to add a step to the `crowdin-download.client-ui.yml` and `crowdin-download.curriculum.yml`. The step for these will be the same. For example, if you want to enable Dothraki downloads: + +```yml +##### Download Dothraki ##### +- name: Crowdin Download Dothraki Translations + uses: crowdin/github-action@master + # options: https://github.com/crowdin/github-action/blob/master/action.yml + with: + # uploads + upload_sources: false + upload_translations: false + auto_approve_imported: false + import_eq_suggestions: false + + # downloads + download_translations: true + download_language: mis + skip_untranslated_files: false + export_only_approved: true + + push_translations: false + + # pull-request + create_pull_request: false + + # global options + config: './crowdin-config.yml' + base_url: ${{ secrets.CROWDIN_BASE_URL_FCC }} + + # Uncomment below to debug + # dryrun_action: true +``` + +Note that the `download_language` key needs to be set to the language code displayed on Crowdin. + +## Enabling a Language + +> [!NOTE] The above section with updating the workflows should be completed before proceeding - these need to be done in separate steps or the builds will fail. + +There are a few steps to take in order to allow the codebase to build in your desired language. + +First, visit the `config/i18n/all-langs.ts` file to add the language to the available languages list and configure the values. There are several objects here. + +- `availableLangs`: For both the `client` and `curriculum` arrays, add the text name of the language. This is the value that will be used in the `.env` file later. +- `auditedCerts`: Add the text name of the language as the _key_, and add an array of `SuperBlocks.{cert}` variables as the _value_. This tells the client which certifications are fully translated. +- `i18nextCodes`: These are the ISO language codes for each language. You will need to add the appropriate ISO code for the language you are enabling. These do need to be unique for each language. +- `LangNames`: These are the display names for the language selector in the navigation menu. +- `LangCodes`: These are the language codes used for formatting dates and numbers. These should be Unicode CLDR codes instead of ISO codes. +- `hiddenLangs`: These languages will not be displayed in the navigation menu. This is used for languages that are not yet ready for release. + +As an example, if you wanted to enable Dothraki as a language, your `all-langs.js` objects should look like this: + +```js +export const availableLangs = { + client: ['english', 'espanol', 'chinese', 'chinese-traditional', 'dothraki'], + curriculum: [ + 'english', + 'espanol', + 'chinese', + 'chinese-traditional', + 'dothraki' + ] +}; + +export const auditedCerts = { + espanol: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis + ], + chinese: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis, + SuperBlocks.QualityAssurance, + SuperBlocks.SciCompPy, + SuperBlocks.DataAnalysisPy, + SuperBlocks.InfoSec, + SuperBlocks.MachineLearningPy + ], + 'chinese-traditional': [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis, + SuperBlocks.QualityAssurance, + SuperBlocks.SciCompPy, + SuperBlocks.DataAnalysisPy, + SuperBlocks.InfoSec, + SuperBlocks.MachineLearningPy + ], + dothraki: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs + ] +}; + +export const i18nextCodes = { + english: 'en', + espanol: 'es', + chinese: 'zh', + 'chinese-traditional': 'zh-Hant', + dothraki: 'mis' +}; + +export enum LangNames = { + english: 'English', + espanol: 'Español', + chinese: '中文(简体字)', + 'chinese-traditional': '中文(繁體字)', + dothraki: 'Dothraki' +}; + +export enum LangCodes = { + english: 'en-US', + espanol: 'es-419', + chinese: 'zh', + 'chinese-traditional': 'zh-Hant', + dothraki: 'mis' +}; + +export const hiddenLangs = ['dothraki']; +``` + +> [!NOTE] When a language has been set up in the deployment pipeline AND has a public `/news` instance live, it can be removed from the `hiddenLangs` array and be made available to the public. + +Next, open the `client/src/utils/algolia-locale-setup.ts` file. This data is used for the search bar that loads `/news` articles. While it is unlikely that you are going to test this functionality, missing the data for your language can lead to errors when attempting to build the codebase locally. + +Add an object for your language to the `algoliaIndices` object. You should use the the same values as the `english` object for local testing, replacing the `english` key with your language's `availableLangs` value. + +> [!NOTE] If we have already deployed an instance of news in your target language, you can update the values to reflect the live instance. Otherwise, use the English values. + +If you were to add Dothraki: + +```js +const algoliaIndices = { + english: { + name: 'news', + searchPage: 'https://www.freecodecamp.org/news/search/' + }, + espanol: { + name: 'news-es', + searchPage: 'https://www.freecodecamp.org/espanol/news/search/' + }, + chinese: { + name: 'news-zh', + searchPage: 'https://chinese.freecodecamp.org/news/search/' + }, + 'chinese-traditional': { + name: 'news-zh', + searchPage: 'https://chinese.freecodecamp.org/news/search' + }, + dothraki: { + name: 'news', + searchPage: 'https://www.freecodecamp.org/news/search/' + } +}; +``` + +### Releasing a Superblock + +After a superblock has been fully translated into a language, there are two steps to release it. First add the superblock enum to that language's `auditedCerts` array. So, if you want to release the new Responsive Web Design superblock for Dothraki, the array should look like this: + +```ts +export const auditedCerts = { + // other languages + dothraki: [ + SuperBlocks.RespWebDesignNew, // the newly translated superblock + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs + ] +}; +``` + +Finally, if the superblock is in a "new" state (that is, replacing a legacy superblock), the `languagesWithAuditedBetaReleases` array should be updated to include the new language like this: + +```ts +export const languagesWithAuditedBetaReleases: ['english', 'dothraki']; +``` + +This will move the new superblock to the correct place in the curriculum map on `/learn`. + +## Enabling Localized Videos + +For the video challenges, you need to change a few things. First add the new locale to the GraphQL query in the `client/src/templates/Challenges/video/Show.tsx` file. For example, adding Dothraki to the query: + +```tsx + query VideoChallenge($slug: String!) { + challengeNode(fields: { slug: { eq: $slug } }) { + videoId + videoLocaleIds { + espanol + italian + portuguese + dothraki + } + ... +``` + +Then add an id for the new language to any video challenge in an audited block. For example, if `auditedCerts` in `all-langs.ts` includes `scientific-computing-with-python` for `dothraki`, then you must add a `dothraki` entry in `videoLocaleIds`. The frontmatter should then look like this: + +```yml +videoLocaleIds: + espanol: 3muQV-Im3Z0 + italian: hiRTRAqNlpE + portuguese: AelGAcoMXbI + dothraki: new-id-here +dashedName: introduction-why-program +--- +``` + +Update the `VideoLocaleIds` interface in `client/src/redux/prop-types` to include the new language. + +```ts +export interface VideoLocaleIds { + espanol?: string; + italian?: string; + portuguese?: string; + dothraki?: string; +} +``` + +And finally update the challenge schema in `curriculum/schema/challengeSchema.js`. + +```js +videoLocaleIds: Joi.when('challengeType', { + is: challengeTypes.video, + then: Joi.object().keys({ + espanol: Joi.string(), + italian: Joi.string(), + portuguese: Joi.string(), + dothraki: Joi.string() + }) +}), +``` + +## Client UI + +You will need to take an additional step to handle the client UI translations. + +The Crowdin workflows will automatically pull down _some_ of the UI translations, but there are a couple of files that need to be moved manually. + +You will want to copy the following files from `/client/i18n/locales/english` to `/client/i18n/locales/`, and apply translations as needed: + +- `links.json` +- `meta-tags.json` +- `motivation.json` +- `trending.json` + +## Testing Translations Locally + +If you would like to test translations locally, before adding them to our main repository - skip the Crowdin workflow changes. Follow the steps for enabling a language, then download the translations from Crowdin and load them into your local code. + +Because the language has not been approved for production, our scripts are not automatically downloading the translations yet. Only staff have the access to directly download the translations - you are welcome to reach out to us in our [contributors chat room](https://discord.gg/PRyKn3Vbay), or you can translate the English markdown files locally for testing purposes. + +Once you have the files, you will need to place them in the correct directory. For the curriculum challenges, you should place the certification folders (i.e. `01-responsive-web-design`) within the `curriculum/challenges/{lang}` directory. For our Dothraki translations, this would be `curriculum/challenges/dothraki`. The client translation `.json` files will go in the `client/i18n/locales/{lang}` directory. + +Update your `.env` file to use your new language for `CLIENT_LOCALE` and `CURRICULUM_LOCALE`. + +Once these are in place, you should be able to run `npm run develop` to view your translated version of freeCodeCamp. + +> [!ATTENTION] While you may perform translations locally for the purpose of testing, we remind everyone that translations should _not_ be submitted through GitHub and should only be done through Crowdin. Be sure to reset your local codebase after you are done testing. diff --git a/docs/i18n/japanese/language-lead-handbook.md b/docs/i18n/japanese/language-lead-handbook.md index fbd057794e01c5..1f45dbd196bbaa 100644 --- a/docs/i18n/japanese/language-lead-handbook.md +++ b/docs/i18n/japanese/language-lead-handbook.md @@ -65,7 +65,7 @@ This is an example of how part of the `trending.json` file has to look. } ``` -You will want to [build the translated client locally](how-to-test-translations-locally.md) to see if the titles have the right length. Each title must stay on a single line and not go to a new line. +You will want to [build the translated client locally](how-to-enable-new-languages.md) to see if the titles have the right length. Each title must stay on a single line and not go to a new line. ### How to update the trending articles in the cdn diff --git a/docs/i18n/portuguese/_sidebar.md b/docs/i18n/portuguese/_sidebar.md index b99bdfcc813e1a..fe0fecefa124ea 100644 --- a/docs/i18n/portuguese/_sidebar.md +++ b/docs/i18n/portuguese/_sidebar.md @@ -19,11 +19,10 @@ - [Trabalhar com a documentação](how-to-work-on-the-docs-theme.md) - [Trabalhar na biblioteca de componentes](how-to-work-on-the-component-library.md) - **Guias adicionais** - - [Testar traduções localmente](how-to-test-translations-locally.md) - - [Compreender a estrutura do arquivo do currículo](curriculum-file-structure.md) - - [Depurar e-mails enviados localmente](how-to-catch-outgoing-emails-locally.md) - - [Configurar freeCodeCamp no Windows (WSL)](how-to-setup-wsl.md) - - [Fluxo de trabalho do token de usuário](user-token-workflow.md) + - [Understand the curriculum file structure](curriculum-file-structure.md) + - [Debug outgoing emails locally](how-to-catch-outgoing-emails-locally.md) + - [Set up freeCodeCamp on Windows (WSL)](how-to-setup-wsl.md) + - [User Token Workflow](user-token-workflow.md) --- @@ -32,6 +31,7 @@ - [Manual do líder do idioma](language-lead-handbook.md) - [Manual do DevOps](devops.md) - [Extensão do VSCode Courses](courses-vscode-extension.md) + - [Enable New Language](how-to-enable-new-languages.md) --- diff --git a/docs/i18n/portuguese/how-to-enable-new-languages.md b/docs/i18n/portuguese/how-to-enable-new-languages.md new file mode 100644 index 00000000000000..d0ee662a2a42c7 --- /dev/null +++ b/docs/i18n/portuguese/how-to-enable-new-languages.md @@ -0,0 +1,279 @@ +# Deploying New Languages on `/learn` + +Before you can release a new language, you will need to allow the languages to download from Crowdin. + +## Updating Crowdin Settings + +In the `Curriculum` and `Learn UI` projects, you will need to select `Project Settings` from the sidebar. Then scroll down to `Language Mapping`, where you will see an option to add custom language codes. Add a new entry for the language you are releasing, selecting `language` as the `Placeholder` value, and entering a URL-friendly lower-case spelling of your language's name for the `Custom code`. If you aren't sure what to use, reach out in our contributor chat and we will assist you. + +## Updating Workflows + +You will need to add a step to the `crowdin-download.client-ui.yml` and `crowdin-download.curriculum.yml`. The step for these will be the same. For example, if you want to enable Dothraki downloads: + +```yml +##### Download Dothraki ##### +- name: Crowdin Download Dothraki Translations + uses: crowdin/github-action@master + # options: https://github.com/crowdin/github-action/blob/master/action.yml + with: + # uploads + upload_sources: false + upload_translations: false + auto_approve_imported: false + import_eq_suggestions: false + + # downloads + download_translations: true + download_language: mis + skip_untranslated_files: false + export_only_approved: true + + push_translations: false + + # pull-request + create_pull_request: false + + # global options + config: './crowdin-config.yml' + base_url: ${{ secrets.CROWDIN_BASE_URL_FCC }} + + # Uncomment below to debug + # dryrun_action: true +``` + +Note that the `download_language` key needs to be set to the language code displayed on Crowdin. + +## Enabling a Language + +> [!NOTE] The above section with updating the workflows should be completed before proceeding - these need to be done in separate steps or the builds will fail. + +There are a few steps to take in order to allow the codebase to build in your desired language. + +First, visit the `config/i18n/all-langs.ts` file to add the language to the available languages list and configure the values. There are several objects here. + +- `availableLangs`: For both the `client` and `curriculum` arrays, add the text name of the language. This is the value that will be used in the `.env` file later. +- `auditedCerts`: Add the text name of the language as the _key_, and add an array of `SuperBlocks.{cert}` variables as the _value_. This tells the client which certifications are fully translated. +- `i18nextCodes`: These are the ISO language codes for each language. You will need to add the appropriate ISO code for the language you are enabling. These do need to be unique for each language. +- `LangNames`: These are the display names for the language selector in the navigation menu. +- `LangCodes`: These are the language codes used for formatting dates and numbers. These should be Unicode CLDR codes instead of ISO codes. +- `hiddenLangs`: These languages will not be displayed in the navigation menu. This is used for languages that are not yet ready for release. + +As an example, if you wanted to enable Dothraki as a language, your `all-langs.js` objects should look like this: + +```js +export const availableLangs = { + client: ['english', 'espanol', 'chinese', 'chinese-traditional', 'dothraki'], + curriculum: [ + 'english', + 'espanol', + 'chinese', + 'chinese-traditional', + 'dothraki' + ] +}; + +export const auditedCerts = { + espanol: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis + ], + chinese: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis, + SuperBlocks.QualityAssurance, + SuperBlocks.SciCompPy, + SuperBlocks.DataAnalysisPy, + SuperBlocks.InfoSec, + SuperBlocks.MachineLearningPy + ], + 'chinese-traditional': [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis, + SuperBlocks.QualityAssurance, + SuperBlocks.SciCompPy, + SuperBlocks.DataAnalysisPy, + SuperBlocks.InfoSec, + SuperBlocks.MachineLearningPy + ], + dothraki: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs + ] +}; + +export const i18nextCodes = { + english: 'en', + espanol: 'es', + chinese: 'zh', + 'chinese-traditional': 'zh-Hant', + dothraki: 'mis' +}; + +export enum LangNames = { + english: 'English', + espanol: 'Español', + chinese: '中文(简体字)', + 'chinese-traditional': '中文(繁體字)', + dothraki: 'Dothraki' +}; + +export enum LangCodes = { + english: 'en-US', + espanol: 'es-419', + chinese: 'zh', + 'chinese-traditional': 'zh-Hant', + dothraki: 'mis' +}; + +export const hiddenLangs = ['dothraki']; +``` + +> [!NOTE] When a language has been set up in the deployment pipeline AND has a public `/news` instance live, it can be removed from the `hiddenLangs` array and be made available to the public. + +Next, open the `client/src/utils/algolia-locale-setup.ts` file. This data is used for the search bar that loads `/news` articles. While it is unlikely that you are going to test this functionality, missing the data for your language can lead to errors when attempting to build the codebase locally. + +Add an object for your language to the `algoliaIndices` object. You should use the the same values as the `english` object for local testing, replacing the `english` key with your language's `availableLangs` value. + +> [!NOTE] If we have already deployed an instance of news in your target language, you can update the values to reflect the live instance. Otherwise, use the English values. + +If you were to add Dothraki: + +```js +const algoliaIndices = { + english: { + name: 'news', + searchPage: 'https://www.freecodecamp.org/news/search/' + }, + espanol: { + name: 'news-es', + searchPage: 'https://www.freecodecamp.org/espanol/news/search/' + }, + chinese: { + name: 'news-zh', + searchPage: 'https://chinese.freecodecamp.org/news/search/' + }, + 'chinese-traditional': { + name: 'news-zh', + searchPage: 'https://chinese.freecodecamp.org/news/search' + }, + dothraki: { + name: 'news', + searchPage: 'https://www.freecodecamp.org/news/search/' + } +}; +``` + +### Releasing a Superblock + +After a superblock has been fully translated into a language, there are two steps to release it. First add the superblock enum to that language's `auditedCerts` array. So, if you want to release the new Responsive Web Design superblock for Dothraki, the array should look like this: + +```ts +export const auditedCerts = { + // other languages + dothraki: [ + SuperBlocks.RespWebDesignNew, // the newly translated superblock + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs + ] +}; +``` + +Finally, if the superblock is in a "new" state (that is, replacing a legacy superblock), the `languagesWithAuditedBetaReleases` array should be updated to include the new language like this: + +```ts +export const languagesWithAuditedBetaReleases: ['english', 'dothraki']; +``` + +This will move the new superblock to the correct place in the curriculum map on `/learn`. + +## Enabling Localized Videos + +For the video challenges, you need to change a few things. First add the new locale to the GraphQL query in the `client/src/templates/Challenges/video/Show.tsx` file. For example, adding Dothraki to the query: + +```tsx + query VideoChallenge($slug: String!) { + challengeNode(fields: { slug: { eq: $slug } }) { + videoId + videoLocaleIds { + espanol + italian + portuguese + dothraki + } + ... +``` + +Then add an id for the new language to any video challenge in an audited block. For example, if `auditedCerts` in `all-langs.ts` includes `scientific-computing-with-python` for `dothraki`, then you must add a `dothraki` entry in `videoLocaleIds`. The frontmatter should then look like this: + +```yml +videoLocaleIds: + espanol: 3muQV-Im3Z0 + italian: hiRTRAqNlpE + portuguese: AelGAcoMXbI + dothraki: new-id-here +dashedName: introduction-why-program +--- +``` + +Update the `VideoLocaleIds` interface in `client/src/redux/prop-types` to include the new language. + +```ts +export interface VideoLocaleIds { + espanol?: string; + italian?: string; + portuguese?: string; + dothraki?: string; +} +``` + +And finally update the challenge schema in `curriculum/schema/challengeSchema.js`. + +```js +videoLocaleIds: Joi.when('challengeType', { + is: challengeTypes.video, + then: Joi.object().keys({ + espanol: Joi.string(), + italian: Joi.string(), + portuguese: Joi.string(), + dothraki: Joi.string() + }) +}), +``` + +## Client UI + +You will need to take an additional step to handle the client UI translations. + +The Crowdin workflows will automatically pull down _some_ of the UI translations, but there are a couple of files that need to be moved manually. + +You will want to copy the following files from `/client/i18n/locales/english` to `/client/i18n/locales/`, and apply translations as needed: + +- `links.json` +- `meta-tags.json` +- `motivation.json` +- `trending.json` + +## Testing Translations Locally + +If you would like to test translations locally, before adding them to our main repository - skip the Crowdin workflow changes. Follow the steps for enabling a language, then download the translations from Crowdin and load them into your local code. + +Because the language has not been approved for production, our scripts are not automatically downloading the translations yet. Only staff have the access to directly download the translations - you are welcome to reach out to us in our [contributors chat room](https://discord.gg/PRyKn3Vbay), or you can translate the English markdown files locally for testing purposes. + +Once you have the files, you will need to place them in the correct directory. For the curriculum challenges, you should place the certification folders (i.e. `01-responsive-web-design`) within the `curriculum/challenges/{lang}` directory. For our Dothraki translations, this would be `curriculum/challenges/dothraki`. The client translation `.json` files will go in the `client/i18n/locales/{lang}` directory. + +Update your `.env` file to use your new language for `CLIENT_LOCALE` and `CURRICULUM_LOCALE`. + +Once these are in place, you should be able to run `npm run develop` to view your translated version of freeCodeCamp. + +> [!ATTENTION] While you may perform translations locally for the purpose of testing, we remind everyone that translations should _not_ be submitted through GitHub and should only be done through Crowdin. Be sure to reset your local codebase after you are done testing. diff --git a/docs/i18n/portuguese/language-lead-handbook.md b/docs/i18n/portuguese/language-lead-handbook.md index a0c81b6d58d4b8..00d0c7fed83c20 100644 --- a/docs/i18n/portuguese/language-lead-handbook.md +++ b/docs/i18n/portuguese/language-lead-handbook.md @@ -65,7 +65,7 @@ Este é um exemplo de como deve ser a aparência de parte do arquivo `trending.j } ``` -Você vai querer [fazer a build do client traduzido localmente](how-to-test-translations-locally.md) para ver se os títulos têm o comprimento correto. Cada título deve permanecer em uma única linha e não deve ir para uma nova linha. +You will want to [build the translated client locally](how-to-enable-new-languages.md) to see if the titles have the right length. Cada título deve permanecer em uma única linha e não deve ir para uma nova linha. ### Como atualizar os artigos em destaque no cdn diff --git a/docs/i18n/ukrainian/_sidebar.md b/docs/i18n/ukrainian/_sidebar.md index b85072739aada5..9a18ca3b4a7a8c 100644 --- a/docs/i18n/ukrainian/_sidebar.md +++ b/docs/i18n/ukrainian/_sidebar.md @@ -19,11 +19,10 @@ - [Працюйте над документацією](how-to-work-on-the-docs-theme.md) - [Працюйте над компонентною бібліотекою](how-to-work-on-the-component-library.md) - **Додаткові інструкції** - - [Тестування перекладів локально](how-to-test-translations-locally.md) - - [Ознайомлення зі структурою файлів навчальної програми](curriculum-file-structure.md) - - [Налагодження вихідних електронних листів локально](how-to-catch-outgoing-emails-locally.md) - - [Встановлення freeCodeCamp на Windows (WSL)](how-to-setup-wsl.md) - - [Робочий процес токенів користувача](user-token-workflow.md) + - [Understand the curriculum file structure](curriculum-file-structure.md) + - [Debug outgoing emails locally](how-to-catch-outgoing-emails-locally.md) + - [Set up freeCodeCamp on Windows (WSL)](how-to-setup-wsl.md) + - [User Token Workflow](user-token-workflow.md) --- @@ -32,6 +31,7 @@ - [Довідник мовного керівника](language-lead-handbook.md) - [Довідник DevOps](devops.md) - [Розширення курсів VSCode](courses-vscode-extension.md) + - [Enable New Language](how-to-enable-new-languages.md) --- diff --git a/docs/i18n/ukrainian/how-to-enable-new-languages.md b/docs/i18n/ukrainian/how-to-enable-new-languages.md new file mode 100644 index 00000000000000..d0ee662a2a42c7 --- /dev/null +++ b/docs/i18n/ukrainian/how-to-enable-new-languages.md @@ -0,0 +1,279 @@ +# Deploying New Languages on `/learn` + +Before you can release a new language, you will need to allow the languages to download from Crowdin. + +## Updating Crowdin Settings + +In the `Curriculum` and `Learn UI` projects, you will need to select `Project Settings` from the sidebar. Then scroll down to `Language Mapping`, where you will see an option to add custom language codes. Add a new entry for the language you are releasing, selecting `language` as the `Placeholder` value, and entering a URL-friendly lower-case spelling of your language's name for the `Custom code`. If you aren't sure what to use, reach out in our contributor chat and we will assist you. + +## Updating Workflows + +You will need to add a step to the `crowdin-download.client-ui.yml` and `crowdin-download.curriculum.yml`. The step for these will be the same. For example, if you want to enable Dothraki downloads: + +```yml +##### Download Dothraki ##### +- name: Crowdin Download Dothraki Translations + uses: crowdin/github-action@master + # options: https://github.com/crowdin/github-action/blob/master/action.yml + with: + # uploads + upload_sources: false + upload_translations: false + auto_approve_imported: false + import_eq_suggestions: false + + # downloads + download_translations: true + download_language: mis + skip_untranslated_files: false + export_only_approved: true + + push_translations: false + + # pull-request + create_pull_request: false + + # global options + config: './crowdin-config.yml' + base_url: ${{ secrets.CROWDIN_BASE_URL_FCC }} + + # Uncomment below to debug + # dryrun_action: true +``` + +Note that the `download_language` key needs to be set to the language code displayed on Crowdin. + +## Enabling a Language + +> [!NOTE] The above section with updating the workflows should be completed before proceeding - these need to be done in separate steps or the builds will fail. + +There are a few steps to take in order to allow the codebase to build in your desired language. + +First, visit the `config/i18n/all-langs.ts` file to add the language to the available languages list and configure the values. There are several objects here. + +- `availableLangs`: For both the `client` and `curriculum` arrays, add the text name of the language. This is the value that will be used in the `.env` file later. +- `auditedCerts`: Add the text name of the language as the _key_, and add an array of `SuperBlocks.{cert}` variables as the _value_. This tells the client which certifications are fully translated. +- `i18nextCodes`: These are the ISO language codes for each language. You will need to add the appropriate ISO code for the language you are enabling. These do need to be unique for each language. +- `LangNames`: These are the display names for the language selector in the navigation menu. +- `LangCodes`: These are the language codes used for formatting dates and numbers. These should be Unicode CLDR codes instead of ISO codes. +- `hiddenLangs`: These languages will not be displayed in the navigation menu. This is used for languages that are not yet ready for release. + +As an example, if you wanted to enable Dothraki as a language, your `all-langs.js` objects should look like this: + +```js +export const availableLangs = { + client: ['english', 'espanol', 'chinese', 'chinese-traditional', 'dothraki'], + curriculum: [ + 'english', + 'espanol', + 'chinese', + 'chinese-traditional', + 'dothraki' + ] +}; + +export const auditedCerts = { + espanol: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis + ], + chinese: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis, + SuperBlocks.QualityAssurance, + SuperBlocks.SciCompPy, + SuperBlocks.DataAnalysisPy, + SuperBlocks.InfoSec, + SuperBlocks.MachineLearningPy + ], + 'chinese-traditional': [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs, + SuperBlocks.DataVis, + SuperBlocks.BackEndDevApis, + SuperBlocks.QualityAssurance, + SuperBlocks.SciCompPy, + SuperBlocks.DataAnalysisPy, + SuperBlocks.InfoSec, + SuperBlocks.MachineLearningPy + ], + dothraki: [ + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs + ] +}; + +export const i18nextCodes = { + english: 'en', + espanol: 'es', + chinese: 'zh', + 'chinese-traditional': 'zh-Hant', + dothraki: 'mis' +}; + +export enum LangNames = { + english: 'English', + espanol: 'Español', + chinese: '中文(简体字)', + 'chinese-traditional': '中文(繁體字)', + dothraki: 'Dothraki' +}; + +export enum LangCodes = { + english: 'en-US', + espanol: 'es-419', + chinese: 'zh', + 'chinese-traditional': 'zh-Hant', + dothraki: 'mis' +}; + +export const hiddenLangs = ['dothraki']; +``` + +> [!NOTE] When a language has been set up in the deployment pipeline AND has a public `/news` instance live, it can be removed from the `hiddenLangs` array and be made available to the public. + +Next, open the `client/src/utils/algolia-locale-setup.ts` file. This data is used for the search bar that loads `/news` articles. While it is unlikely that you are going to test this functionality, missing the data for your language can lead to errors when attempting to build the codebase locally. + +Add an object for your language to the `algoliaIndices` object. You should use the the same values as the `english` object for local testing, replacing the `english` key with your language's `availableLangs` value. + +> [!NOTE] If we have already deployed an instance of news in your target language, you can update the values to reflect the live instance. Otherwise, use the English values. + +If you were to add Dothraki: + +```js +const algoliaIndices = { + english: { + name: 'news', + searchPage: 'https://www.freecodecamp.org/news/search/' + }, + espanol: { + name: 'news-es', + searchPage: 'https://www.freecodecamp.org/espanol/news/search/' + }, + chinese: { + name: 'news-zh', + searchPage: 'https://chinese.freecodecamp.org/news/search/' + }, + 'chinese-traditional': { + name: 'news-zh', + searchPage: 'https://chinese.freecodecamp.org/news/search' + }, + dothraki: { + name: 'news', + searchPage: 'https://www.freecodecamp.org/news/search/' + } +}; +``` + +### Releasing a Superblock + +After a superblock has been fully translated into a language, there are two steps to release it. First add the superblock enum to that language's `auditedCerts` array. So, if you want to release the new Responsive Web Design superblock for Dothraki, the array should look like this: + +```ts +export const auditedCerts = { + // other languages + dothraki: [ + SuperBlocks.RespWebDesignNew, // the newly translated superblock + SuperBlocks.RespWebDesign, + SuperBlocks.JsAlgoDataStruct, + SuperBlocks.FrontEndDevLibs + ] +}; +``` + +Finally, if the superblock is in a "new" state (that is, replacing a legacy superblock), the `languagesWithAuditedBetaReleases` array should be updated to include the new language like this: + +```ts +export const languagesWithAuditedBetaReleases: ['english', 'dothraki']; +``` + +This will move the new superblock to the correct place in the curriculum map on `/learn`. + +## Enabling Localized Videos + +For the video challenges, you need to change a few things. First add the new locale to the GraphQL query in the `client/src/templates/Challenges/video/Show.tsx` file. For example, adding Dothraki to the query: + +```tsx + query VideoChallenge($slug: String!) { + challengeNode(fields: { slug: { eq: $slug } }) { + videoId + videoLocaleIds { + espanol + italian + portuguese + dothraki + } + ... +``` + +Then add an id for the new language to any video challenge in an audited block. For example, if `auditedCerts` in `all-langs.ts` includes `scientific-computing-with-python` for `dothraki`, then you must add a `dothraki` entry in `videoLocaleIds`. The frontmatter should then look like this: + +```yml +videoLocaleIds: + espanol: 3muQV-Im3Z0 + italian: hiRTRAqNlpE + portuguese: AelGAcoMXbI + dothraki: new-id-here +dashedName: introduction-why-program +--- +``` + +Update the `VideoLocaleIds` interface in `client/src/redux/prop-types` to include the new language. + +```ts +export interface VideoLocaleIds { + espanol?: string; + italian?: string; + portuguese?: string; + dothraki?: string; +} +``` + +And finally update the challenge schema in `curriculum/schema/challengeSchema.js`. + +```js +videoLocaleIds: Joi.when('challengeType', { + is: challengeTypes.video, + then: Joi.object().keys({ + espanol: Joi.string(), + italian: Joi.string(), + portuguese: Joi.string(), + dothraki: Joi.string() + }) +}), +``` + +## Client UI + +You will need to take an additional step to handle the client UI translations. + +The Crowdin workflows will automatically pull down _some_ of the UI translations, but there are a couple of files that need to be moved manually. + +You will want to copy the following files from `/client/i18n/locales/english` to `/client/i18n/locales/`, and apply translations as needed: + +- `links.json` +- `meta-tags.json` +- `motivation.json` +- `trending.json` + +## Testing Translations Locally + +If you would like to test translations locally, before adding them to our main repository - skip the Crowdin workflow changes. Follow the steps for enabling a language, then download the translations from Crowdin and load them into your local code. + +Because the language has not been approved for production, our scripts are not automatically downloading the translations yet. Only staff have the access to directly download the translations - you are welcome to reach out to us in our [contributors chat room](https://discord.gg/PRyKn3Vbay), or you can translate the English markdown files locally for testing purposes. + +Once you have the files, you will need to place them in the correct directory. For the curriculum challenges, you should place the certification folders (i.e. `01-responsive-web-design`) within the `curriculum/challenges/{lang}` directory. For our Dothraki translations, this would be `curriculum/challenges/dothraki`. The client translation `.json` files will go in the `client/i18n/locales/{lang}` directory. + +Update your `.env` file to use your new language for `CLIENT_LOCALE` and `CURRICULUM_LOCALE`. + +Once these are in place, you should be able to run `npm run develop` to view your translated version of freeCodeCamp. + +> [!ATTENTION] While you may perform translations locally for the purpose of testing, we remind everyone that translations should _not_ be submitted through GitHub and should only be done through Crowdin. Be sure to reset your local codebase after you are done testing. diff --git a/docs/i18n/ukrainian/language-lead-handbook.md b/docs/i18n/ukrainian/language-lead-handbook.md index 98edf6c081e4e4..a0b55ebd4a3241 100644 --- a/docs/i18n/ukrainian/language-lead-handbook.md +++ b/docs/i18n/ukrainian/language-lead-handbook.md @@ -65,7 +65,7 @@ This is an example of how part of the `trending.json` file has to look. } ``` -You will want to [build the translated client locally](how-to-test-translations-locally.md) to see if the titles have the right length. Each title must stay on a single line and not go to a new line. +You will want to [build the translated client locally](how-to-enable-new-languages.md) to see if the titles have the right length. Each title must stay on a single line and not go to a new line. ### How to update the trending articles in the cdn From 0718771168bfd1bee758ecb74c916f70c1eff549 Mon Sep 17 00:00:00 2001 From: Arielle D <72934694+adameshg@users.noreply.github.com> Date: Fri, 2 Sep 2022 11:58:08 -0500 Subject: [PATCH 009/129] Changed descriptions of id from properties to attributes (#47432) * Changed descriptions of id from properties to attributes * Update curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8b9dab5ac88e4d3d43a3.md Co-authored-by: Muhammed Mustafa * Update curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8e998d3e7eae14d6ae3b.md Co-authored-by: Muhammed Mustafa * Update curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff919a7b5612c0670923a5.md Co-authored-by: Muhammed Mustafa Co-authored-by: Muhammed Mustafa --- .../62ff8b9dab5ac88e4d3d43a3.md | 2 +- .../62ff8e998d3e7eae14d6ae3b.md | 2 +- .../62ff919a7b5612c0670923a5.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8b9dab5ac88e4d3d43a3.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8b9dab5ac88e4d3d43a3.md index fa49a72a0a0fcd..2b3231f3732770 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8b9dab5ac88e4d3d43a3.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8b9dab5ac88e4d3d43a3.md @@ -9,7 +9,7 @@ dashedName: step-17 Following accessibility best practices, link the `input` elements and the `label` elements together using the `for` attribute. -Use these values for the respective `id` properties: `first-name`, `last-name`, `email`, `new-password` +Use `first-name`, `last-name`, `email`, and `new-password` as values for the respective `id` attributes. # --hints-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8e998d3e7eae14d6ae3b.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8e998d3e7eae14d6ae3b.md index 99eb397da874fc..d7c0b7e4535ffa 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8e998d3e7eae14d6ae3b.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8e998d3e7eae14d6ae3b.md @@ -9,7 +9,7 @@ dashedName: step-28 Follow accessibility best practices by linking the `input` elements and the `label` elements in the second `fieldset`. -Use these values for the respective `id` properties: `personal-account`, `business-account`, `terms-and-conditions` +Use `personal-account`, `business-account`, and `terms-and-conditions` as values for the respective `id` attributes. # --hints-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff919a7b5612c0670923a5.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff919a7b5612c0670923a5.md index e9b871ba7f7970..816afe0fcb37ae 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff919a7b5612c0670923a5.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff919a7b5612c0670923a5.md @@ -9,7 +9,7 @@ dashedName: step-37 Link the applicable form elements and their `label` elements together. -Use these values for the respective `id` properties: `profile-picture`, `age`, `referrer`, `bio` +Use `profile-picture`, `age`, `referrer`, and `bio` as values for the respective `id` attributes. # --hints-- From 62b7e90b75e97e7f45fea24d329c6afcb27c9607 Mon Sep 17 00:00:00 2001 From: CryoSolace <100377930+CryoSolace@users.noreply.github.com> Date: Fri, 2 Sep 2022 17:58:42 +0100 Subject: [PATCH 010/129] fix(curriculum): Fix typo in step 96 of learn CSS variables project (#47435) Update 5d822fd413a79914d39e9929.md Minor typo Only three more building to go. -> Only three more buildings to go. --- .../5d822fd413a79914d39e9929.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9929.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9929.md index 60a445ccd6c705..ad6a18db3d881c 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9929.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e9929.md @@ -7,7 +7,7 @@ dashedName: step-96 # --description-- -Only three more building to go. Nest two new `div` elements within the `.fb4` element and give them the classes of `fb4a` and `fb4b`, in that order. Remember that you sort of flipped the location of `.fb4` and `.fb5`, so it's the rightmost purple building you are working on now. +Only three more buildings to go. Nest two new `div` elements within the `.fb4` element and give them the classes of `fb4a` and `fb4b`, in that order. Remember that you sort of flipped the location of `.fb4` and `.fb5`, so it's the rightmost purple building you are working on now. # --hints-- From a9d2198aba5493deafb9b5e7c4e7e560068af49a Mon Sep 17 00:00:00 2001 From: Santiago Miranda Date: Fri, 2 Sep 2022 19:01:08 +0200 Subject: [PATCH 011/129] Better wording of exercise description (#47431) Update mutate-an-array-declared-with-const.md Fixed unclear part of the exercise description. As cited by user [in the forum](https://forum.freecodecamp.org/t/cannot-understand-the-following-line-in-question/549786/3) --- .../es6/mutate-an-array-declared-with-const.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/curriculum/challenges/english/02-javascript-algorithms-and-data-structures/es6/mutate-an-array-declared-with-const.md b/curriculum/challenges/english/02-javascript-algorithms-and-data-structures/es6/mutate-an-array-declared-with-const.md index fd6918ccee3de3..a00656a24c7bea 100644 --- a/curriculum/challenges/english/02-javascript-algorithms-and-data-structures/es6/mutate-an-array-declared-with-const.md +++ b/curriculum/challenges/english/02-javascript-algorithms-and-data-structures/es6/mutate-an-array-declared-with-const.md @@ -23,7 +23,7 @@ s[2] = 45; console.log(s); ``` -`s = [1, 2, 3]` will result in an error. The `console.log` will display the value `[5, 6, 45]`. +`s = [1, 2, 3]` will result in an error. After commenting out that line, the `console.log` will display the value `[5, 6, 45]`. As you can see, you can mutate the object `[5, 6, 7]` itself and the variable `s` will still point to the altered array `[5, 6, 45]`. Like all arrays, the array elements in `s` are mutable, but because `const` was used, you cannot use the variable identifier `s` to point to a different array using the assignment operator. From 103cdb3405f776e7931ef6f070314c398689a8ad Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 3 Sep 2022 03:50:58 +0000 Subject: [PATCH 012/129] chore(deps): update github/codeql-action digest to 7cce9bb --- .github/workflows/codeql-analysis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index b602ca2bc36038..cb381bd77b0994 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -32,8 +32,8 @@ jobs: - name: Checkout repository uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # tag=v3 - name: Setup CodeQL - uses: github/codeql-action/init@d5cec099b513fccc2cfcc9247113ecc9edbdacc5 # tag=v1 + uses: github/codeql-action/init@7cce9bbfb550e880420fd42bdb2f6a2908df139e # tag=v1 with: languages: ${{ matrix.language }} - name: Perform Analysis - uses: github/codeql-action/analyze@d5cec099b513fccc2cfcc9247113ecc9edbdacc5 # tag=v1 + uses: github/codeql-action/analyze@7cce9bbfb550e880420fd42bdb2f6a2908df139e # tag=v1 From 41c0a81e0a0987a6c5001f397882b7e7279e371c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 3 Sep 2022 13:31:26 +0000 Subject: [PATCH 013/129] chore(deps): update dependency @types/react to v17.0.49 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3138c2984c6ffe..3df942bf66b10a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -52,7 +52,7 @@ "@types/prismjs": "1.26.0", "@types/psl": "1.1.0", "@types/reach__router": "1.3.10", - "@types/react": "17.0.48", + "@types/react": "17.0.49", "@types/react-dom": "17.0.17", "@types/react-helmet": "6.1.5", "@types/react-instantsearch-dom": "6.12.1", @@ -14294,9 +14294,9 @@ } }, "node_modules/@types/react": { - "version": "17.0.48", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.48.tgz", - "integrity": "sha512-zJ6IYlJ8cYYxiJfUaZOQee4lh99mFihBoqkOSEGV+dFi9leROW6+PgstzQ+w3gWTnUfskALtQPGHK6dYmPj+2A==", + "version": "17.0.49", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.49.tgz", + "integrity": "sha512-CCBPMZaPhcKkYUTqFs/hOWqKjPxhTEmnZWjlHHgIMop67DsXywf9B5Os9Hz8KSacjNOgIdnZVJamwl232uxoPg==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -64531,9 +64531,9 @@ } }, "@types/react": { - "version": "17.0.48", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.48.tgz", - "integrity": "sha512-zJ6IYlJ8cYYxiJfUaZOQee4lh99mFihBoqkOSEGV+dFi9leROW6+PgstzQ+w3gWTnUfskALtQPGHK6dYmPj+2A==", + "version": "17.0.49", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.49.tgz", + "integrity": "sha512-CCBPMZaPhcKkYUTqFs/hOWqKjPxhTEmnZWjlHHgIMop67DsXywf9B5Os9Hz8KSacjNOgIdnZVJamwl232uxoPg==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", diff --git a/package.json b/package.json index e0b86549a2030b..4380e91051d87b 100644 --- a/package.json +++ b/package.json @@ -132,7 +132,7 @@ "@types/prismjs": "1.26.0", "@types/psl": "1.1.0", "@types/reach__router": "1.3.10", - "@types/react": "17.0.48", + "@types/react": "17.0.49", "@types/react-dom": "17.0.17", "@types/react-helmet": "6.1.5", "@types/react-instantsearch-dom": "6.12.1", From 6b6a03913c2a55c0f198ad20456513f4093845bb Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 3 Sep 2022 17:19:11 +0000 Subject: [PATCH 014/129] fix(deps): update dependency react-instantsearch-dom to v6.32.1 --- client/package.json | 2 +- package-lock.json | 32 ++++++++++++++++---------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/client/package.json b/client/package.json index 3c18ca5c6525d2..f45e6991811373 100644 --- a/client/package.json +++ b/client/package.json @@ -100,7 +100,7 @@ "react-helmet": "6.1.0", "react-hotkeys": "2.0.0", "react-i18next": "11.18.5", - "react-instantsearch-dom": "6.32.0", + "react-instantsearch-dom": "6.32.1", "react-lazy-load": "3.1.14", "react-monaco-editor": "0.40.0", "react-redux": "5.1.2", diff --git a/package-lock.json b/package-lock.json index 3df942bf66b10a..74f8c5bbf965c8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -504,7 +504,7 @@ "react-helmet": "6.1.0", "react-hotkeys": "2.0.0", "react-i18next": "11.18.5", - "react-instantsearch-dom": "6.32.0", + "react-instantsearch-dom": "6.32.1", "react-lazy-load": "3.1.14", "react-monaco-editor": "0.40.0", "react-redux": "5.1.2", @@ -42684,9 +42684,9 @@ } }, "node_modules/react-instantsearch-core": { - "version": "6.32.0", - "resolved": "https://registry.npmjs.org/react-instantsearch-core/-/react-instantsearch-core-6.32.0.tgz", - "integrity": "sha512-bCqrgXIf+P6/BEh9xEjuI1h3oVdzyTegPSpExFnOTsEZkYtQMFvTjK7xA0PRhxr1xhyVMJ+t0U8ZGmENr3Xx8g==", + "version": "6.32.1", + "resolved": "https://registry.npmjs.org/react-instantsearch-core/-/react-instantsearch-core-6.32.1.tgz", + "integrity": "sha512-R8VivvJmFemsW6Urp5KGiqjVZ8XkgYNm8qt6t9WVHXOoo7B8Txi/7yOMNRwT8PWNWBMpYlYMEWZ9PClMuX0Zsg==", "dependencies": { "@babel/runtime": "^7.1.2", "algoliasearch-helper": "^3.10.0", @@ -42699,16 +42699,16 @@ } }, "node_modules/react-instantsearch-dom": { - "version": "6.32.0", - "resolved": "https://registry.npmjs.org/react-instantsearch-dom/-/react-instantsearch-dom-6.32.0.tgz", - "integrity": "sha512-fJdQ+qd9xVvTxAPvvAhv6Q/Uv0PZiUqavukMKwte+V4IvD4t/kuFY4QgTxIYUftEADBMyNp0AecTQvZXamxZEw==", + "version": "6.32.1", + "resolved": "https://registry.npmjs.org/react-instantsearch-dom/-/react-instantsearch-dom-6.32.1.tgz", + "integrity": "sha512-oditYXY6zNbAY6txhGBLOPaEie95Eii+nCEgysuoo4fnOQDUxuHXMruiTkYJlfJJ5HAKBJyTdjtKoGeuJL6G1w==", "dependencies": { "@babel/runtime": "^7.1.2", "algoliasearch-helper": "^3.10.0", "classnames": "^2.2.5", "prop-types": "^15.6.2", "react-fast-compare": "^3.0.0", - "react-instantsearch-core": "6.32.0" + "react-instantsearch-core": "6.32.1" }, "peerDependencies": { "algoliasearch": ">= 3.1 < 5", @@ -56430,7 +56430,7 @@ "react-helmet": "6.1.0", "react-hotkeys": "2.0.0", "react-i18next": "11.18.5", - "react-instantsearch-dom": "6.32.0", + "react-instantsearch-dom": "6.32.1", "react-lazy-load": "3.1.14", "react-monaco-editor": "0.40.0", "react-redux": "5.1.2", @@ -83353,9 +83353,9 @@ } }, "react-instantsearch-core": { - "version": "6.32.0", - "resolved": "https://registry.npmjs.org/react-instantsearch-core/-/react-instantsearch-core-6.32.0.tgz", - "integrity": "sha512-bCqrgXIf+P6/BEh9xEjuI1h3oVdzyTegPSpExFnOTsEZkYtQMFvTjK7xA0PRhxr1xhyVMJ+t0U8ZGmENr3Xx8g==", + "version": "6.32.1", + "resolved": "https://registry.npmjs.org/react-instantsearch-core/-/react-instantsearch-core-6.32.1.tgz", + "integrity": "sha512-R8VivvJmFemsW6Urp5KGiqjVZ8XkgYNm8qt6t9WVHXOoo7B8Txi/7yOMNRwT8PWNWBMpYlYMEWZ9PClMuX0Zsg==", "requires": { "@babel/runtime": "^7.1.2", "algoliasearch-helper": "^3.10.0", @@ -83364,16 +83364,16 @@ } }, "react-instantsearch-dom": { - "version": "6.32.0", - "resolved": "https://registry.npmjs.org/react-instantsearch-dom/-/react-instantsearch-dom-6.32.0.tgz", - "integrity": "sha512-fJdQ+qd9xVvTxAPvvAhv6Q/Uv0PZiUqavukMKwte+V4IvD4t/kuFY4QgTxIYUftEADBMyNp0AecTQvZXamxZEw==", + "version": "6.32.1", + "resolved": "https://registry.npmjs.org/react-instantsearch-dom/-/react-instantsearch-dom-6.32.1.tgz", + "integrity": "sha512-oditYXY6zNbAY6txhGBLOPaEie95Eii+nCEgysuoo4fnOQDUxuHXMruiTkYJlfJJ5HAKBJyTdjtKoGeuJL6G1w==", "requires": { "@babel/runtime": "^7.1.2", "algoliasearch-helper": "^3.10.0", "classnames": "^2.2.5", "prop-types": "^15.6.2", "react-fast-compare": "^3.0.0", - "react-instantsearch-core": "6.32.0" + "react-instantsearch-core": "6.32.1" } }, "react-is": { From e877720f88b3a3b62368a52edc9ba86e34d60451 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 3 Sep 2022 20:40:08 +0000 Subject: [PATCH 015/129] chore(deps): update codesee to v0.364.0 --- client/package.json | 4 ++-- package-lock.json | 32 ++++++++++++++++---------------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/client/package.json b/client/package.json index f45e6991811373..1337ea4cb166f2 100644 --- a/client/package.json +++ b/client/package.json @@ -131,8 +131,8 @@ }, "devDependencies": { "@babel/types": "7.18.13", - "@codesee/babel-plugin-instrument": "0.359.0", - "@codesee/tracker": "0.359.0", + "@codesee/babel-plugin-instrument": "0.364.0", + "@codesee/tracker": "0.364.0", "@testing-library/jest-dom": "5.16.5", "@testing-library/react": "12.1.5", "autoprefixer": "10.4.8", diff --git a/package-lock.json b/package-lock.json index 74f8c5bbf965c8..8839ad1912cd5f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -535,8 +535,8 @@ }, "devDependencies": { "@babel/types": "7.18.13", - "@codesee/babel-plugin-instrument": "0.359.0", - "@codesee/tracker": "0.359.0", + "@codesee/babel-plugin-instrument": "0.364.0", + "@codesee/tracker": "0.364.0", "@testing-library/jest-dom": "5.16.5", "@testing-library/react": "12.1.5", "autoprefixer": "10.4.8", @@ -2966,9 +2966,9 @@ } }, "node_modules/@codesee/babel-plugin-instrument": { - "version": "0.359.0", - "resolved": "https://registry.npmjs.org/@codesee/babel-plugin-instrument/-/babel-plugin-instrument-0.359.0.tgz", - "integrity": "sha512-LCK//6kuuWLb6yJvdd7MGT9NdXyq5VajFdd9711oEJf7NJXuQY+ZRnZl9ROWhFC/RTTH1661vW5W1ZMfJZc0dA==", + "version": "0.364.0", + "resolved": "https://registry.npmjs.org/@codesee/babel-plugin-instrument/-/babel-plugin-instrument-0.364.0.tgz", + "integrity": "sha512-QfG2SX7ds2sWEX4ee1ZufV+7AvDMnpTdV7XJthZbgrhpUgXbJah6hkZ5gUIOtJyZxDcjvSfM9barZSK7sEZ1KQ==", "dev": true, "dependencies": { "@babel/plugin-syntax-jsx": "^7.12.13", @@ -2983,9 +2983,9 @@ } }, "node_modules/@codesee/tracker": { - "version": "0.359.0", - "resolved": "https://registry.npmjs.org/@codesee/tracker/-/tracker-0.359.0.tgz", - "integrity": "sha512-3tUTXLt1jjb51tI6uz5GrmyYYLxbo5Y2kwsnZhqd8/VG0mR0YZbTfW5hJqgkMgiPCe6fTu41PB0FkeaLxfvmMw==", + "version": "0.364.0", + "resolved": "https://registry.npmjs.org/@codesee/tracker/-/tracker-0.364.0.tgz", + "integrity": "sha512-nHFV9OjBn+ewHDfsREuN82+5hOhQfzhZ0DCmhe4sKz0wLi1JvBJKKFRvQuiVTEEbFF5NbudoYQrI/XLXTTEwNQ==", "dev": true }, "node_modules/@cspotcode/source-map-support": { @@ -55725,9 +55725,9 @@ } }, "@codesee/babel-plugin-instrument": { - "version": "0.359.0", - "resolved": "https://registry.npmjs.org/@codesee/babel-plugin-instrument/-/babel-plugin-instrument-0.359.0.tgz", - "integrity": "sha512-LCK//6kuuWLb6yJvdd7MGT9NdXyq5VajFdd9711oEJf7NJXuQY+ZRnZl9ROWhFC/RTTH1661vW5W1ZMfJZc0dA==", + "version": "0.364.0", + "resolved": "https://registry.npmjs.org/@codesee/babel-plugin-instrument/-/babel-plugin-instrument-0.364.0.tgz", + "integrity": "sha512-QfG2SX7ds2sWEX4ee1ZufV+7AvDMnpTdV7XJthZbgrhpUgXbJah6hkZ5gUIOtJyZxDcjvSfM9barZSK7sEZ1KQ==", "dev": true, "requires": { "@babel/plugin-syntax-jsx": "^7.12.13", @@ -55739,9 +55739,9 @@ } }, "@codesee/tracker": { - "version": "0.359.0", - "resolved": "https://registry.npmjs.org/@codesee/tracker/-/tracker-0.359.0.tgz", - "integrity": "sha512-3tUTXLt1jjb51tI6uz5GrmyYYLxbo5Y2kwsnZhqd8/VG0mR0YZbTfW5hJqgkMgiPCe6fTu41PB0FkeaLxfvmMw==", + "version": "0.364.0", + "resolved": "https://registry.npmjs.org/@codesee/tracker/-/tracker-0.364.0.tgz", + "integrity": "sha512-nHFV9OjBn+ewHDfsREuN82+5hOhQfzhZ0DCmhe4sKz0wLi1JvBJKKFRvQuiVTEEbFF5NbudoYQrI/XLXTTEwNQ==", "dev": true }, "@cspotcode/source-map-support": { @@ -56357,8 +56357,8 @@ "@babel/preset-react": "7.18.6", "@babel/standalone": "7.18.13", "@babel/types": "7.18.13", - "@codesee/babel-plugin-instrument": "0.359.0", - "@codesee/tracker": "0.359.0", + "@codesee/babel-plugin-instrument": "0.364.0", + "@codesee/tracker": "0.364.0", "@fortawesome/fontawesome-svg-core": "6.1.2", "@fortawesome/free-brands-svg-icons": "6.1.2", "@fortawesome/free-solid-svg-icons": "6.1.2", From b436b5b3370a166abe1b709e606a931c3bd4d2f5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 4 Sep 2022 00:08:49 +0000 Subject: [PATCH 016/129] chore(deps): update dependency rollup to v2.79.0 --- package-lock.json | 16 ++++++++-------- tools/ui-components/package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8839ad1912cd5f..1006e257f841fb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45699,9 +45699,9 @@ "license": "MIT" }, "node_modules/rollup": { - "version": "2.78.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz", - "integrity": "sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==", + "version": "2.79.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.0.tgz", + "integrity": "sha512-x4KsrCgwQ7ZJPcFA/SUu6QVcYlO7uRLfLAy0DSA4NS2eG8japdbpM50ToH7z4iObodRYOJ0soneF0iaQRJ6zhA==", "bin": { "rollup": "dist/bin/rollup" }, @@ -54196,7 +54196,7 @@ "postcss": "8.4.16", "postcss-import": "14.1.0", "rimraf": "3.0.2", - "rollup": "2.78.1", + "rollup": "2.79.0", "rollup-plugin-postcss": "4.0.2", "rollup-plugin-terser": "7.0.2", "tailwindcss": "3.1.8" @@ -56735,7 +56735,7 @@ "react": "16.14.0", "react-dom": "16.14.0", "rimraf": "3.0.2", - "rollup": "2.78.1", + "rollup": "2.79.0", "rollup-plugin-postcss": "4.0.2", "rollup-plugin-terser": "7.0.2", "tailwindcss": "3.1.8", @@ -85357,9 +85357,9 @@ "version": "1.2.0" }, "rollup": { - "version": "2.78.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz", - "integrity": "sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==", + "version": "2.79.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.0.tgz", + "integrity": "sha512-x4KsrCgwQ7ZJPcFA/SUu6QVcYlO7uRLfLAy0DSA4NS2eG8japdbpM50ToH7z4iObodRYOJ0soneF0iaQRJ6zhA==", "requires": { "fsevents": "~2.3.2" } diff --git a/tools/ui-components/package.json b/tools/ui-components/package.json index ec72fb0d5c4391..f4a6d408d29452 100644 --- a/tools/ui-components/package.json +++ b/tools/ui-components/package.json @@ -50,7 +50,7 @@ "postcss": "8.4.16", "postcss-import": "14.1.0", "rimraf": "3.0.2", - "rollup": "2.78.1", + "rollup": "2.79.0", "rollup-plugin-postcss": "4.0.2", "rollup-plugin-terser": "7.0.2", "tailwindcss": "3.1.8" From c280e8a363b119af4100ecd74c8742bff96ffbec Mon Sep 17 00:00:00 2001 From: Tom <20648924+moT01@users.noreply.github.com> Date: Sun, 4 Sep 2022 06:15:54 -0500 Subject: [PATCH 017/129] feat: add preview popout window (#46251) * feat: add preview popout window * fix: remove unused * fix: add title to window * fix: add preview to window title * feat: it works * chore: clean up * chore: more clean up * fix: add better screen reader messages --- client/i18n/locales/english/translations.json | 6 ++ .../Challenges/classic/action-row.tsx | 51 ++++++++-- .../Challenges/classic/desktop-layout.tsx | 42 +++++--- .../src/templates/Challenges/classic/show.tsx | 6 +- .../Challenges/components/preview-portal.tsx | 97 +++++++++++++++++++ .../Challenges/redux/action-types.js | 2 + .../redux/execute-challenge-saga.js | 6 +- .../src/templates/Challenges/redux/index.js | 20 +++- 8 files changed, 206 insertions(+), 24 deletions(-) create mode 100644 client/src/templates/Challenges/components/preview-portal.tsx diff --git a/client/i18n/locales/english/translations.json b/client/i18n/locales/english/translations.json index d872b38e89cb4d..9b4d3801515dd5 100644 --- a/client/i18n/locales/english/translations.json +++ b/client/i18n/locales/english/translations.json @@ -488,6 +488,12 @@ "breadcrumb-nav": "breadcrumb", "submit": "Use Ctrl + Enter to submit.", "running-tests": "Running tests", + "hide-preview": "Hide the preview", + "move-preview-to-new-window": "Move the preview to a new window and focus it", + "move-preview-to-main-window": "Move the preview to this window and close the external preview window", + "close-external-preview-window": "Close the external preview window", + "show-preview": "Show the preview in this window", + "open-preview-in-new-window": "Open the preview in a new window and focus it", "step": "Step", "steps": "Steps", "steps-for": "Steps for {{blockTitle}}" diff --git a/client/src/templates/Challenges/classic/action-row.tsx b/client/src/templates/Challenges/classic/action-row.tsx index 3fedc739580d88..68a40bd28678c8 100644 --- a/client/src/templates/Challenges/classic/action-row.tsx +++ b/client/src/templates/Challenges/classic/action-row.tsx @@ -1,4 +1,6 @@ import React from 'react'; +import { faExternalLinkAlt } from '@fortawesome/free-solid-svg-icons'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { useTranslation } from 'react-i18next'; import BreadCrumb from '../components/bread-crumb'; @@ -11,7 +13,8 @@ interface ActionRowProps { showConsole: boolean; showNotes: boolean; showInstructions: boolean; - showPreview: boolean; + showPreviewPane: boolean; + showPreviewPortal: boolean; superBlock: string; togglePane: (pane: string) => void; } @@ -20,7 +23,8 @@ const ActionRow = ({ hasNotes, togglePane, showNotes, - showPreview, + showPreviewPane, + showPreviewPortal, showConsole, showInstructions, isProjectBasedChallenge, @@ -28,6 +32,29 @@ const ActionRow = ({ block }: ActionRowProps): JSX.Element => { const { t } = useTranslation(); + + // sets screen reader text for the two preview buttons + function getPreviewBtnsSrText() { + // no preview open + const previewBtnsSrText = { + pane: t('aria.show-preview'), + portal: t('aria.open-preview-in-new-window') + }; + + // preview open in main window + if (showPreviewPane && !showPreviewPortal) { + previewBtnsSrText.pane = t('aria.hide-preview'); + previewBtnsSrText.portal = t('aria.move-preview-to-new-window'); + + // preview open in external window + } else if (showPreviewPortal && !showPreviewPane) { + previewBtnsSrText.pane = t('aria.move-preview-to-main-window'); + previewBtnsSrText.portal = t('aria.close-external-preview-window'); + } + + return previewBtnsSrText; + } + return (
@@ -36,7 +63,7 @@ const ActionRow = ({
{!isProjectBasedChallenge && ( {hasNotes && ( )} +
diff --git a/client/src/templates/Challenges/classic/desktop-layout.tsx b/client/src/templates/Challenges/classic/desktop-layout.tsx index 7aa62f7f7d6a93..df8362ba06e929 100644 --- a/client/src/templates/Challenges/classic/desktop-layout.tsx +++ b/client/src/templates/Challenges/classic/desktop-layout.tsx @@ -8,6 +8,7 @@ import { ChallengeFiles, ResizeProps } from '../../../redux/prop-types'; +import PreviewPortal from '../components/preview-portal'; import ActionRow from './action-row'; type Pane = { flex: number }; @@ -34,6 +35,7 @@ interface DesktopLayoutProps { resizeProps: ResizeProps; superBlock: string; testOutput: ReactElement; + windowTitle: string; } const reflexProps = { @@ -42,14 +44,20 @@ const reflexProps = { const DesktopLayout = (props: DesktopLayoutProps): JSX.Element => { const [showNotes, setShowNotes] = useState(false); - const [showPreview, setShowPreview] = useState(true); + const [showPreviewPane, setShowPreviewPane] = useState(true); + const [showPreviewPortal, setShowPreviewPortal] = useState(false); const [showConsole, setShowConsole] = useState(false); const [showInstructions, setShowInstuctions] = useState(true); const togglePane = (pane: string): void => { switch (pane) { - case 'showPreview': - setShowPreview(!showPreview); + case 'showPreviewPane': + if (!showPreviewPane && showPreviewPortal) setShowPreviewPortal(false); + setShowPreviewPane(!showPreviewPane); + break; + case 'showPreviewPortal': + if (!showPreviewPortal && showPreviewPane) setShowPreviewPane(false); + setShowPreviewPortal(!showPreviewPortal); break; case 'showConsole': setShowConsole(!showConsole); @@ -61,9 +69,10 @@ const DesktopLayout = (props: DesktopLayoutProps): JSX.Element => { setShowInstuctions(!showInstructions); break; default: - setShowInstuctions(false); + setShowInstuctions(true); setShowConsole(false); - setShowPreview(false); + setShowPreviewPane(true); + setShowPreviewPortal(false); setShowNotes(false); } }; @@ -86,17 +95,16 @@ const DesktopLayout = (props: DesktopLayoutProps): JSX.Element => { notes, preview, hasEditableBoundaries, - superBlock + superBlock, + windowTitle } = props; const challengeFile = getChallengeFile(); const projectBasedChallenge = hasEditableBoundaries; const isMultifileCertProject = challengeType === challengeTypes.multifileCertProject; - const displayPreview = - projectBasedChallenge || isMultifileCertProject - ? showPreview && hasPreview - : hasPreview; + const displayPreviewPane = hasPreview && showPreviewPane; + const displayPreviewPortal = hasPreview && showPreviewPortal; const displayNotes = projectBasedChallenge ? showNotes && hasNotes : false; const displayConsole = projectBasedChallenge || isMultifileCertProject ? showConsole : true; @@ -119,7 +127,8 @@ const DesktopLayout = (props: DesktopLayoutProps): JSX.Element => { showConsole={showConsole} showNotes={showNotes} showInstructions={showInstructions} - showPreview={showPreview} + showPreviewPane={showPreviewPane} + showPreviewPortal={showPreviewPortal} superBlock={superBlock} togglePane={togglePane} /> @@ -169,13 +178,20 @@ const DesktopLayout = (props: DesktopLayoutProps): JSX.Element => { )} - {displayPreview && } - {displayPreview && ( + {displayPreviewPane && ( + + )} + {displayPreviewPane && ( {preview} )} + {displayPreviewPortal && ( + + {preview} + + )}
); }; diff --git a/client/src/templates/Challenges/classic/show.tsx b/client/src/templates/Challenges/classic/show.tsx index 0b976c03f45dec..845a256be6af4e 100644 --- a/client/src/templates/Challenges/classic/show.tsx +++ b/client/src/templates/Challenges/classic/show.tsx @@ -476,6 +476,9 @@ class ShowClassic extends Component { t } = this.props; + const blockNameTitle = this.getBlockNameTitle(t); + const windowTitle = `${blockNameTitle} | freeCodeCamp.org`; + return ( { usesMultifileEditor={usesMultifileEditor} > - + { resizeProps={this.resizeProps} superBlock={superBlock} testOutput={this.renderTestOutput()} + windowTitle={windowTitle} /> void; + windowTitle: string; + t: TFunction; + storePortalDocument: (document: Document | undefined) => void; + removePortalDocument: () => void; +} + +const mapDispatchToProps = { + storePortalDocument, + removePortalDocument +}; + +class PreviewPortal extends Component { + static displayName = 'PreviewPortal'; + mainWindow: Window; + externalWindow: Window | null = null; + containerEl; + titleEl; + styleEl; + + constructor(props: PreviewPortalProps) { + super(props); + + this.mainWindow = window; + this.externalWindow = null; + this.containerEl = document.createElement('div'); + this.titleEl = document.createElement('title'); + this.styleEl = document.createElement('style'); + } + + componentDidMount() { + const { t, windowTitle } = this.props; + + this.titleEl.innerText = `${t( + 'learn.editor-tabs.preview' + )} | ${windowTitle}`; + + this.styleEl.innerHTML = ` + #fcc-main-frame { + width: 100%; + height: 100%; + border: none; + } + `; + + this.externalWindow = window.open( + '', + '', + 'width=960,height=540,left=100,top=100' + ); + + this.externalWindow?.document.head.appendChild(this.titleEl); + this.externalWindow?.document.head.appendChild(this.styleEl); + this.externalWindow?.document.body.setAttribute( + 'style', + ` + margin: 0px; + padding: 0px; + overflow: hidden; + ` + ); + this.externalWindow?.document.body.appendChild(this.containerEl); + this.externalWindow?.addEventListener('beforeunload', () => { + this.props.togglePane('showPreviewPortal'); + }); + + this.props.storePortalDocument(this.externalWindow?.document); + + this.mainWindow?.addEventListener('beforeunload', () => { + this.externalWindow?.close(); + }); + } + + componentWillUnmount() { + this.externalWindow?.close(); + this.props.removePortalDocument(); + } + + render() { + return ReactDOM.createPortal(this.props.children, this.containerEl); + } +} + +PreviewPortal.displayName = 'PreviewPortal'; + +export default connect( + null, + mapDispatchToProps +)(withTranslation()(PreviewPortal)); diff --git a/client/src/templates/Challenges/redux/action-types.js b/client/src/templates/Challenges/redux/action-types.js index d7488e90b0239f..955194836a32ee 100644 --- a/client/src/templates/Challenges/redux/action-types.js +++ b/client/src/templates/Challenges/redux/action-types.js @@ -33,6 +33,8 @@ export const actionTypes = createTypes( 'previewMounted', 'projectPreviewMounted', + 'storePortalDocument', + 'removePortalDocument', 'challengeMounted', 'checkChallenge', 'executeChallenge', diff --git a/client/src/templates/Challenges/redux/execute-challenge-saga.js b/client/src/templates/Challenges/redux/execute-challenge-saga.js index ff4465feba2512..fd171e041c10c5 100644 --- a/client/src/templates/Challenges/redux/execute-challenge-saga.js +++ b/client/src/templates/Challenges/redux/execute-challenge-saga.js @@ -36,6 +36,7 @@ import { } from '../../../utils/challenge-request-helpers'; import { actionTypes } from './action-types'; import { + portalDocumentSelector, challengeDataSelector, challengeMetaSelector, challengeTestsSelector, @@ -243,7 +244,10 @@ function* previewChallengeSaga({ flushLogs = true } = {}) { // evaluate the user code in the preview frame or in the worker if (challengeHasPreview(challengeData)) { const document = yield getContext('document'); - yield call(updatePreview, buildData, document, proxyLogger); + const portalDocument = yield select(portalDocumentSelector); + const finalDocument = portalDocument || document; + + yield call(updatePreview, buildData, finalDocument, proxyLogger); } else if (isJavaScriptChallenge(challengeData)) { const runUserCode = getTestRunner(buildData, { proxyLogger, diff --git a/client/src/templates/Challenges/redux/index.js b/client/src/templates/Challenges/redux/index.js index 7180f9b94d2f39..0364e590e1660e 100644 --- a/client/src/templates/Challenges/redux/index.js +++ b/client/src/templates/Challenges/redux/index.js @@ -42,6 +42,7 @@ const initialState = { projectPreview: false, shortcuts: false }, + portalDocument: false, projectFormValues: {}, successMessage: 'Happy Coding!' }; @@ -112,6 +113,14 @@ export const previewMounted = createAction(actionTypes.previewMounted); export const projectPreviewMounted = createAction( actionTypes.projectPreviewMounted ); + +export const storePortalDocument = createAction( + actionTypes.storePortalDocument +); +export const removePortalDocument = createAction( + actionTypes.removePortalDocument +); + export const challengeMounted = createAction(actionTypes.challengeMounted); export const checkChallenge = createAction(actionTypes.checkChallenge); export const executeChallenge = createAction(actionTypes.executeChallenge); @@ -155,6 +164,8 @@ export const successMessageSelector = state => state[ns].successMessage; export const projectFormValuesSelector = state => state[ns].projectFormValues || {}; +export const portalDocumentSelector = state => state[ns].portalDocument; + export const challengeDataSelector = state => { const { challengeType } = challengeMetaSelector(state); let challengeData = { challengeType }; @@ -322,7 +333,14 @@ export const reducer = handleActions( ...state, isBuildEnabled: false }), - + [actionTypes.storePortalDocument]: (state, { payload }) => ({ + ...state, + portalDocument: payload + }), + [actionTypes.removePortalDocument]: state => ({ + ...state, + portalDocument: false + }), [actionTypes.updateSuccessMessage]: (state, { payload }) => ({ ...state, successMessage: payload From 5aa83c96536e59ed7f36f83d82a90223baa557e6 Mon Sep 17 00:00:00 2001 From: David Abakelia-Chartia <107882602+acdavit@users.noreply.github.com> Date: Sun, 4 Sep 2022 05:31:42 -0600 Subject: [PATCH 018/129] feat(curriculum): Add links for the MP3 files (#47380) * Added links for the MP3 files Had to go through the trouble of finding audio clips in the source code of the sample project to finish mine. * Apply suggestions from code review Co-authored-by: Naomi Carrigan Co-authored-by: Naomi Carrigan --- .../build-a-drum-machine.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/curriculum/challenges/english/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-drum-machine.md b/curriculum/challenges/english/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-drum-machine.md index ceeb65987a054d..74aaee3214440d 100644 --- a/curriculum/challenges/english/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-drum-machine.md +++ b/curriculum/challenges/english/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-drum-machine.md @@ -28,6 +28,18 @@ You can use any mix of HTML, JavaScript, CSS, Bootstrap, SASS, React, Redux, and **User Story #7:** When a `.drum-pad` is triggered, a string describing the associated audio clip is displayed as the inner text of the `#display` element (each string must be unique). +Here are some audio samples you can use for your drum machine: + +- [Heater 1](https://s3.amazonaws.com/freecodecamp/drums/Heater-1.mp3) +- [Heater 2](https://s3.amazonaws.com/freecodecamp/drums/Heater-2.mp3) +- [Heater 3](https://s3.amazonaws.com/freecodecamp/drums/Heater-3.mp3) +- [Heater 4](https://s3.amazonaws.com/freecodecamp/drums/Heater-4_1.mp3) +- [Clap](https://s3.amazonaws.com/freecodecamp/drums/Heater-6.mp3) +- [Open-HH](https://s3.amazonaws.com/freecodecamp/drums/Dsc_Oh.mp3) +- [Kick-n'-Hat](https://s3.amazonaws.com/freecodecamp/drums/Kick_n_Hat.mp3) +- [Kick](https://s3.amazonaws.com/freecodecamp/drums/RP4_KICK_1.mp3) +- [Closed-HH](https://s3.amazonaws.com/freecodecamp/drums/Cev_H2.mp3) + You can build your project by using this CodePen template and clicking `Save` to create your own pen. Or you can use this CDN link to run the tests in any environment you like: `https://cdn.freecodecamp.org/testable-projects-fcc/v1/bundle.js` Once you're done, submit the URL to your working project with all its tests passing. From 921a8fdc4eb59f151cb51a52a6e32751cf73bcd5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 4 Sep 2022 13:42:10 +0000 Subject: [PATCH 019/129] chore(deps): update typescript-eslint monorepo to v5.36.1 --- package-lock.json | 162 +++++++++++++++++++++++----------------------- package.json | 4 +- 2 files changed, 84 insertions(+), 82 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1006e257f841fb..b1897f87480ebf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -66,8 +66,8 @@ "@types/sanitize-html": "2.6.2", "@types/store": "2.0.2", "@types/validator": "13.7.6", - "@typescript-eslint/eslint-plugin": "5.35.1", - "@typescript-eslint/parser": "5.35.1", + "@typescript-eslint/eslint-plugin": "5.36.1", + "@typescript-eslint/parser": "5.36.1", "babel-eslint": "10.1.0", "babel-plugin-transform-imports": "2.0.0", "cross-env": "7.0.3", @@ -14671,13 +14671,13 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.35.1.tgz", - "integrity": "sha512-RBZZXZlI4XCY4Wzgy64vB+0slT9+yAPQRjj/HSaRwUot33xbDjF1oN9BLwOLTewoOI0jothIltZRe9uJCHf8gg==", + "version": "5.36.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.36.1.tgz", + "integrity": "sha512-iC40UK8q1tMepSDwiLbTbMXKDxzNy+4TfPWgIL661Ym0sD42vRcQU93IsZIrmi+x292DBr60UI/gSwfdVYexCA==", "dependencies": { - "@typescript-eslint/scope-manager": "5.35.1", - "@typescript-eslint/type-utils": "5.35.1", - "@typescript-eslint/utils": "5.35.1", + "@typescript-eslint/scope-manager": "5.36.1", + "@typescript-eslint/type-utils": "5.36.1", + "@typescript-eslint/utils": "5.36.1", "debug": "^4.3.4", "functional-red-black-tree": "^1.0.1", "ignore": "^5.2.0", @@ -14924,13 +14924,13 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/@typescript-eslint/parser": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.35.1.tgz", - "integrity": "sha512-XL2TBTSrh3yWAsMYpKseBYTVpvudNf69rPOWXWVBI08My2JVT5jR66eTt4IgQFHA/giiKJW5dUD4x/ZviCKyGg==", + "version": "5.36.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.36.1.tgz", + "integrity": "sha512-/IsgNGOkBi7CuDfUbwt1eOqUXF9WGVBW9dwEe1pi+L32XrTsZIgmDFIi2RxjzsvB/8i+MIf5JIoTEH8LOZ368A==", "dependencies": { - "@typescript-eslint/scope-manager": "5.35.1", - "@typescript-eslint/types": "5.35.1", - "@typescript-eslint/typescript-estree": "5.35.1", + "@typescript-eslint/scope-manager": "5.36.1", + "@typescript-eslint/types": "5.36.1", + "@typescript-eslint/typescript-estree": "5.36.1", "debug": "^4.3.4" }, "engines": { @@ -14971,12 +14971,12 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.35.1.tgz", - "integrity": "sha512-kCYRSAzIW9ByEIzmzGHE50NGAvAP3wFTaZevgWva7GpquDyFPFcmvVkFJGWJJktg/hLwmys/FZwqM9EKr2u24Q==", + "version": "5.36.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.36.1.tgz", + "integrity": "sha512-pGC2SH3/tXdu9IH3ItoqciD3f3RRGCh7hb9zPdN2Drsr341zgd6VbhP5OHQO/reUqihNltfPpMpTNihFMarP2w==", "dependencies": { - "@typescript-eslint/types": "5.35.1", - "@typescript-eslint/visitor-keys": "5.35.1" + "@typescript-eslint/types": "5.36.1", + "@typescript-eslint/visitor-keys": "5.36.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -14987,11 +14987,12 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.35.1.tgz", - "integrity": "sha512-8xT8ljvo43Mp7BiTn1vxLXkjpw8wS4oAc00hMSB4L1/jIiYbjjnc3Qp2GAUOG/v8zsNCd1qwcqfCQ0BuishHkw==", + "version": "5.36.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.36.1.tgz", + "integrity": "sha512-xfZhfmoQT6m3lmlqDvDzv9TiCYdw22cdj06xY0obSznBsT///GK5IEZQdGliXpAOaRL34o8phEvXzEo/VJx13Q==", "dependencies": { - "@typescript-eslint/utils": "5.35.1", + "@typescript-eslint/typescript-estree": "5.36.1", + "@typescript-eslint/utils": "5.36.1", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -15033,9 +15034,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/@typescript-eslint/types": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.35.1.tgz", - "integrity": "sha512-FDaujtsH07VHzG0gQ6NDkVVhi1+rhq0qEvzHdJAQjysN+LHDCKDKCBRlZFFE0ec0jKxiv0hN63SNfExy0KrbQQ==", + "version": "5.36.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.36.1.tgz", + "integrity": "sha512-jd93ShpsIk1KgBTx9E+hCSEuLCUFwi9V/urhjOWnOaksGZFbTOxAT47OH2d4NLJnLhkVD+wDbB48BuaycZPLBg==", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -15045,12 +15046,12 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.35.1.tgz", - "integrity": "sha512-JUqE1+VRTGyoXlDWWjm6MdfpBYVq+hixytrv1oyjYIBEOZhBCwtpp5ZSvBt4wIA1MKWlnaC2UXl2XmYGC3BoQA==", + "version": "5.36.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.36.1.tgz", + "integrity": "sha512-ih7V52zvHdiX6WcPjsOdmADhYMDN15SylWRZrT2OMy80wzKbc79n8wFW0xpWpU0x3VpBz/oDgTm2xwDAnFTl+g==", "dependencies": { - "@typescript-eslint/types": "5.35.1", - "@typescript-eslint/visitor-keys": "5.35.1", + "@typescript-eslint/types": "5.36.1", + "@typescript-eslint/visitor-keys": "5.36.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -15122,14 +15123,14 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/@typescript-eslint/utils": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.35.1.tgz", - "integrity": "sha512-v6F8JNXgeBWI4pzZn36hT2HXXzoBBBJuOYvoQiaQaEEjdi5STzux3Yj8v7ODIpx36i/5s8TdzuQ54TPc5AITQQ==", + "version": "5.36.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.36.1.tgz", + "integrity": "sha512-lNj4FtTiXm5c+u0pUehozaUWhh7UYKnwryku0nxJlYUEWetyG92uw2pr+2Iy4M/u0ONMKzfrx7AsGBTCzORmIg==", "dependencies": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.35.1", - "@typescript-eslint/types": "5.35.1", - "@typescript-eslint/typescript-estree": "5.35.1", + "@typescript-eslint/scope-manager": "5.36.1", + "@typescript-eslint/types": "5.36.1", + "@typescript-eslint/typescript-estree": "5.36.1", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -15145,11 +15146,11 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.35.1.tgz", - "integrity": "sha512-cEB1DvBVo1bxbW/S5axbGPE6b7FIMAbo3w+AGq6zNDA7+NYJOIkKj/sInfTv4edxd4PxJSgdN4t6/pbvgA+n5g==", + "version": "5.36.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.36.1.tgz", + "integrity": "sha512-ojB9aRyRFzVMN3b5joSYni6FAS10BBSCAfKJhjJAV08t/a95aM6tAhz+O1jF+EtgxktuSO3wJysp2R+Def/IWQ==", "dependencies": { - "@typescript-eslint/types": "5.35.1", + "@typescript-eslint/types": "5.36.1", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -64854,13 +64855,13 @@ "version": "1.9.2" }, "@typescript-eslint/eslint-plugin": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.35.1.tgz", - "integrity": "sha512-RBZZXZlI4XCY4Wzgy64vB+0slT9+yAPQRjj/HSaRwUot33xbDjF1oN9BLwOLTewoOI0jothIltZRe9uJCHf8gg==", + "version": "5.36.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.36.1.tgz", + "integrity": "sha512-iC40UK8q1tMepSDwiLbTbMXKDxzNy+4TfPWgIL661Ym0sD42vRcQU93IsZIrmi+x292DBr60UI/gSwfdVYexCA==", "requires": { - "@typescript-eslint/scope-manager": "5.35.1", - "@typescript-eslint/type-utils": "5.35.1", - "@typescript-eslint/utils": "5.35.1", + "@typescript-eslint/scope-manager": "5.36.1", + "@typescript-eslint/type-utils": "5.36.1", + "@typescript-eslint/utils": "5.36.1", "debug": "^4.3.4", "functional-red-black-tree": "^1.0.1", "ignore": "^5.2.0", @@ -65005,13 +65006,13 @@ } }, "@typescript-eslint/parser": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.35.1.tgz", - "integrity": "sha512-XL2TBTSrh3yWAsMYpKseBYTVpvudNf69rPOWXWVBI08My2JVT5jR66eTt4IgQFHA/giiKJW5dUD4x/ZviCKyGg==", + "version": "5.36.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.36.1.tgz", + "integrity": "sha512-/IsgNGOkBi7CuDfUbwt1eOqUXF9WGVBW9dwEe1pi+L32XrTsZIgmDFIi2RxjzsvB/8i+MIf5JIoTEH8LOZ368A==", "requires": { - "@typescript-eslint/scope-manager": "5.35.1", - "@typescript-eslint/types": "5.35.1", - "@typescript-eslint/typescript-estree": "5.35.1", + "@typescript-eslint/scope-manager": "5.36.1", + "@typescript-eslint/types": "5.36.1", + "@typescript-eslint/typescript-estree": "5.36.1", "debug": "^4.3.4" }, "dependencies": { @@ -65031,20 +65032,21 @@ } }, "@typescript-eslint/scope-manager": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.35.1.tgz", - "integrity": "sha512-kCYRSAzIW9ByEIzmzGHE50NGAvAP3wFTaZevgWva7GpquDyFPFcmvVkFJGWJJktg/hLwmys/FZwqM9EKr2u24Q==", + "version": "5.36.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.36.1.tgz", + "integrity": "sha512-pGC2SH3/tXdu9IH3ItoqciD3f3RRGCh7hb9zPdN2Drsr341zgd6VbhP5OHQO/reUqihNltfPpMpTNihFMarP2w==", "requires": { - "@typescript-eslint/types": "5.35.1", - "@typescript-eslint/visitor-keys": "5.35.1" + "@typescript-eslint/types": "5.36.1", + "@typescript-eslint/visitor-keys": "5.36.1" } }, "@typescript-eslint/type-utils": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.35.1.tgz", - "integrity": "sha512-8xT8ljvo43Mp7BiTn1vxLXkjpw8wS4oAc00hMSB4L1/jIiYbjjnc3Qp2GAUOG/v8zsNCd1qwcqfCQ0BuishHkw==", + "version": "5.36.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.36.1.tgz", + "integrity": "sha512-xfZhfmoQT6m3lmlqDvDzv9TiCYdw22cdj06xY0obSznBsT///GK5IEZQdGliXpAOaRL34o8phEvXzEo/VJx13Q==", "requires": { - "@typescript-eslint/utils": "5.35.1", + "@typescript-eslint/typescript-estree": "5.36.1", + "@typescript-eslint/utils": "5.36.1", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -65065,17 +65067,17 @@ } }, "@typescript-eslint/types": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.35.1.tgz", - "integrity": "sha512-FDaujtsH07VHzG0gQ6NDkVVhi1+rhq0qEvzHdJAQjysN+LHDCKDKCBRlZFFE0ec0jKxiv0hN63SNfExy0KrbQQ==" + "version": "5.36.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.36.1.tgz", + "integrity": "sha512-jd93ShpsIk1KgBTx9E+hCSEuLCUFwi9V/urhjOWnOaksGZFbTOxAT47OH2d4NLJnLhkVD+wDbB48BuaycZPLBg==" }, "@typescript-eslint/typescript-estree": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.35.1.tgz", - "integrity": "sha512-JUqE1+VRTGyoXlDWWjm6MdfpBYVq+hixytrv1oyjYIBEOZhBCwtpp5ZSvBt4wIA1MKWlnaC2UXl2XmYGC3BoQA==", + "version": "5.36.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.36.1.tgz", + "integrity": "sha512-ih7V52zvHdiX6WcPjsOdmADhYMDN15SylWRZrT2OMy80wzKbc79n8wFW0xpWpU0x3VpBz/oDgTm2xwDAnFTl+g==", "requires": { - "@typescript-eslint/types": "5.35.1", - "@typescript-eslint/visitor-keys": "5.35.1", + "@typescript-eslint/types": "5.36.1", + "@typescript-eslint/visitor-keys": "5.36.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -65120,24 +65122,24 @@ } }, "@typescript-eslint/utils": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.35.1.tgz", - "integrity": "sha512-v6F8JNXgeBWI4pzZn36hT2HXXzoBBBJuOYvoQiaQaEEjdi5STzux3Yj8v7ODIpx36i/5s8TdzuQ54TPc5AITQQ==", + "version": "5.36.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.36.1.tgz", + "integrity": "sha512-lNj4FtTiXm5c+u0pUehozaUWhh7UYKnwryku0nxJlYUEWetyG92uw2pr+2Iy4M/u0ONMKzfrx7AsGBTCzORmIg==", "requires": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.35.1", - "@typescript-eslint/types": "5.35.1", - "@typescript-eslint/typescript-estree": "5.35.1", + "@typescript-eslint/scope-manager": "5.36.1", + "@typescript-eslint/types": "5.36.1", + "@typescript-eslint/typescript-estree": "5.36.1", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" } }, "@typescript-eslint/visitor-keys": { - "version": "5.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.35.1.tgz", - "integrity": "sha512-cEB1DvBVo1bxbW/S5axbGPE6b7FIMAbo3w+AGq6zNDA7+NYJOIkKj/sInfTv4edxd4PxJSgdN4t6/pbvgA+n5g==", + "version": "5.36.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.36.1.tgz", + "integrity": "sha512-ojB9aRyRFzVMN3b5joSYni6FAS10BBSCAfKJhjJAV08t/a95aM6tAhz+O1jF+EtgxktuSO3wJysp2R+Def/IWQ==", "requires": { - "@typescript-eslint/types": "5.35.1", + "@typescript-eslint/types": "5.36.1", "eslint-visitor-keys": "^3.3.0" }, "dependencies": { diff --git a/package.json b/package.json index 4380e91051d87b..49053422d93397 100644 --- a/package.json +++ b/package.json @@ -146,8 +146,8 @@ "@types/sanitize-html": "2.6.2", "@types/store": "2.0.2", "@types/validator": "13.7.6", - "@typescript-eslint/eslint-plugin": "5.35.1", - "@typescript-eslint/parser": "5.35.1", + "@typescript-eslint/eslint-plugin": "5.36.1", + "@typescript-eslint/parser": "5.36.1", "babel-eslint": "10.1.0", "babel-plugin-transform-imports": "2.0.0", "cross-env": "7.0.3", From 14df18a158ba0bc74245af8811247ec57ecfaeee Mon Sep 17 00:00:00 2001 From: Vasilica Olariu Date: Mon, 5 Sep 2022 15:14:40 +0300 Subject: [PATCH 020/129] TCA-354 - fix handler for external urls when url is fcc lesson --- client/src/components/layouts/tc-integration.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/components/layouts/tc-integration.tsx b/client/src/components/layouts/tc-integration.tsx index 136cd7f7acd1a3..6b5d61eca74c67 100755 --- a/client/src/components/layouts/tc-integration.tsx +++ b/client/src/components/layouts/tc-integration.tsx @@ -144,7 +144,7 @@ class TcIntegrationLayout extends Component { // provider. // set the pathname for the 2 flavors of lesson URL - const platformPathPrefix = 'learn/freecodecamp'; + const platformPathPrefix = 'learn/freeCodeCamp'; const learnPrefix = '/learn/'; let updateHost = false; if (url.host === `learn.${fccHost}`) { From 145521b3d48cb4b979da44b9a4e2641a055614c8 Mon Sep 17 00:00:00 2001 From: Manabu Matsumoto Date: Wed, 7 Sep 2022 02:21:38 +0900 Subject: [PATCH 021/129] fix(UI): restore keyboard accessibility (#47427) * fix: restore keyboard accessibility * fix/ make code easier to maintain --- .../Header/components/nav-links.tsx | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/client/src/components/Header/components/nav-links.tsx b/client/src/components/Header/components/nav-links.tsx index 3f23162748639d..998c9a2499ec89 100644 --- a/client/src/components/Header/components/nav-links.tsx +++ b/client/src/components/Header/components/nav-links.tsx @@ -35,7 +35,9 @@ import LanguageGlobe from '../../../assets/icons/language-globe'; const { clientLocale, radioLocation, apiLocation } = envData; -const locales = availableLangs.client; +const locales = availableLangs.client.filter( + lang => !hiddenLangs.includes(lang) +); export interface NavLinksProps { displayMenu?: boolean; @@ -428,29 +430,27 @@ export class NavLinks extends Component { {t('buttons.cancel-change')} - {locales - .filter(lang => !hiddenLangs.includes(lang)) - .map((lang, index) => ( -
  • - -
  • - ))} + {locales.map((lang, index) => ( +
  • + +
  • + ))} From 6271c9732c215db9625e2b69f5635c26b41a3482 Mon Sep 17 00:00:00 2001 From: Chris McCann Date: Tue, 6 Sep 2022 11:36:26 -0700 Subject: [PATCH 022/129] Removes logging of Mongo URL --- .husky/pre-commit | 4 ---- api-server/src/server/middlewares/sessions.js | 2 -- 2 files changed, 6 deletions(-) delete mode 100755 .husky/pre-commit diff --git a/.husky/pre-commit b/.husky/pre-commit deleted file mode 100755 index 36af219892fda8..00000000000000 --- a/.husky/pre-commit +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" - -npx lint-staged diff --git a/api-server/src/server/middlewares/sessions.js b/api-server/src/server/middlewares/sessions.js index f24141c7038fea..219ed97724a5b8 100644 --- a/api-server/src/server/middlewares/sessions.js +++ b/api-server/src/server/middlewares/sessions.js @@ -5,8 +5,6 @@ const MongoStore = MongoStoreFactory(session); const sessionSecret = process.env.SESSION_SECRET; const url = process.env.MONGODB || process.env.MONGOHQ_URL; -console.log('session DB url', url); - export default function sessionsMiddleware() { return session({ // 900 day session cookie From 35794441f83d0bff9a96942f26d67fcd5a208ca7 Mon Sep 17 00:00:00 2001 From: Brooke Date: Tue, 6 Sep 2022 12:13:50 -0700 Subject: [PATCH 023/129] TCA-397 #comment This commit adds the gtm module declaration #time 5m --- client/src/declarations.d.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/client/src/declarations.d.ts b/client/src/declarations.d.ts index 53d7d2fe927ce2..5591e3a3edc2f9 100644 --- a/client/src/declarations.d.ts +++ b/client/src/declarations.d.ts @@ -4,6 +4,7 @@ declare module '@freecodecamp/strip-comments'; declare module '@types/react-redux'; declare module '@types/validator'; declare module '@types/lodash-es'; +declare module 'react-gtm-module'; declare module 'react-lazy-load'; declare module '*.svg' { const content: string; From 95bf94ba667baa30c15192c5b252a8184af1bf22 Mon Sep 17 00:00:00 2001 From: Brooke Date: Tue, 6 Sep 2022 12:15:07 -0700 Subject: [PATCH 024/129] TCA-397 #comment This commit adds the pre-commit check back to the dev branch #time 5m --- .husky/pre-commit | 4 ++++ 1 file changed, 4 insertions(+) create mode 100755 .husky/pre-commit diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 00000000000000..36af219892fda8 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +npx lint-staged From 617639bdfd115f89ba9b5638a264ab9f8aba3faa Mon Sep 17 00:00:00 2001 From: Brooke Date: Tue, 6 Sep 2022 12:32:46 -0700 Subject: [PATCH 025/129] TCA-397 #comment This commit adds more loggingn to the call to save a challenge #time 15m --- api-server/src/server/boot/challenge.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/api-server/src/server/boot/challenge.js b/api-server/src/server/boot/challenge.js index 4ead5426a9e277..27357ab5c0dae7 100644 --- a/api-server/src/server/boot/challenge.js +++ b/api-server/src/server/boot/challenge.js @@ -258,16 +258,24 @@ export function isValidChallengeCompletion(req, res, next) { message: 'That does not appear to be a valid challenge submission.' }; + console.debug('console.debug'); + console.info('console.info'); + console.error('console.error'); + console.log('console.log'); + if (!ObjectID.isValid(id)) { log('isObjectId', id, ObjectID.isValid(id)); + console.debug('isObjectId', id, ObjectID.isValid(id)); return res.status(403).json(isValidChallengeCompletionErrorMsg); } if ('challengeType' in req.body && !isNumeric(String(challengeType))) { log('challengeType', challengeType, isNumeric(challengeType)); + console.debug('challengeType', challengeType, isNumeric(challengeType)); return res.status(403).json(isValidChallengeCompletionErrorMsg); } if ('solution' in req.body && !isURL(solution)) { - log('isObjectId', id, ObjectID.isValid(id)); + log('solution', solution, !isURL(solution)); + console.debug('solution', solution, !isURL(solution)); return res.status(403).json(isValidChallengeCompletionErrorMsg); } return next(); From 54b1a70b96fe3b74440a92f2f47b522fbeee3b06 Mon Sep 17 00:00:00 2001 From: Brooke Date: Tue, 6 Sep 2022 12:34:20 -0700 Subject: [PATCH 026/129] TCA-397 revert errant changes #time 5m --- api-server/src/server/boot/challenge.js | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/api-server/src/server/boot/challenge.js b/api-server/src/server/boot/challenge.js index 27357ab5c0dae7..4ead5426a9e277 100644 --- a/api-server/src/server/boot/challenge.js +++ b/api-server/src/server/boot/challenge.js @@ -258,24 +258,16 @@ export function isValidChallengeCompletion(req, res, next) { message: 'That does not appear to be a valid challenge submission.' }; - console.debug('console.debug'); - console.info('console.info'); - console.error('console.error'); - console.log('console.log'); - if (!ObjectID.isValid(id)) { log('isObjectId', id, ObjectID.isValid(id)); - console.debug('isObjectId', id, ObjectID.isValid(id)); return res.status(403).json(isValidChallengeCompletionErrorMsg); } if ('challengeType' in req.body && !isNumeric(String(challengeType))) { log('challengeType', challengeType, isNumeric(challengeType)); - console.debug('challengeType', challengeType, isNumeric(challengeType)); return res.status(403).json(isValidChallengeCompletionErrorMsg); } if ('solution' in req.body && !isURL(solution)) { - log('solution', solution, !isURL(solution)); - console.debug('solution', solution, !isURL(solution)); + log('isObjectId', id, ObjectID.isValid(id)); return res.status(403).json(isValidChallengeCompletionErrorMsg); } return next(); From 775209423b92539e00e9faacc354c8ccb7b6b12e Mon Sep 17 00:00:00 2001 From: Brooke Date: Tue, 6 Sep 2022 12:36:02 -0700 Subject: [PATCH 027/129] TCA-385 #comment This commit adds logging #time 5m --- api-server/src/server/boot/challenge.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/api-server/src/server/boot/challenge.js b/api-server/src/server/boot/challenge.js index 4ead5426a9e277..27357ab5c0dae7 100644 --- a/api-server/src/server/boot/challenge.js +++ b/api-server/src/server/boot/challenge.js @@ -258,16 +258,24 @@ export function isValidChallengeCompletion(req, res, next) { message: 'That does not appear to be a valid challenge submission.' }; + console.debug('console.debug'); + console.info('console.info'); + console.error('console.error'); + console.log('console.log'); + if (!ObjectID.isValid(id)) { log('isObjectId', id, ObjectID.isValid(id)); + console.debug('isObjectId', id, ObjectID.isValid(id)); return res.status(403).json(isValidChallengeCompletionErrorMsg); } if ('challengeType' in req.body && !isNumeric(String(challengeType))) { log('challengeType', challengeType, isNumeric(challengeType)); + console.debug('challengeType', challengeType, isNumeric(challengeType)); return res.status(403).json(isValidChallengeCompletionErrorMsg); } if ('solution' in req.body && !isURL(solution)) { - log('isObjectId', id, ObjectID.isValid(id)); + log('solution', solution, !isURL(solution)); + console.debug('solution', solution, !isURL(solution)); return res.status(403).json(isValidChallengeCompletionErrorMsg); } return next(); From 8c6936cd46d013bbee13aaf92f78689a35d9f82d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 6 Sep 2022 20:53:12 +0000 Subject: [PATCH 028/129] chore(deps): update dependency eslint-plugin-react to v7.31.7 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index b1897f87480ebf..096065a934362b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -81,7 +81,7 @@ "eslint-plugin-jsx-a11y": "6.6.1", "eslint-plugin-no-only-tests": "2.6.0", "eslint-plugin-prefer-object-spread": "1.2.1", - "eslint-plugin-react": "7.31.1", + "eslint-plugin-react": "7.31.7", "eslint-plugin-react-hooks": "4.6.0", "eslint-plugin-testing-library": "4.12.4", "execa": "5.1.1", @@ -23690,9 +23690,9 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.31.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.1.tgz", - "integrity": "sha512-j4/2xWqt/R7AZzG8CakGHA6Xa/u7iR8Q3xCxY+AUghdT92bnIDOBEefV456OeH0QvBcroVc0eyvrrLSyQGYIfg==", + "version": "7.31.7", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.7.tgz", + "integrity": "sha512-8NldBTeYp/kQoTV1uT0XF6HcmDqbgZ0lNPkN0wlRw8DJKXEnaWu+oh/6gt3xIhzvQ35wB2Y545fJhIbJSZ2NNw==", "dependencies": { "array-includes": "^3.1.5", "array.prototype.flatmap": "^1.3.0", @@ -71256,9 +71256,9 @@ "requires": {} }, "eslint-plugin-react": { - "version": "7.31.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.1.tgz", - "integrity": "sha512-j4/2xWqt/R7AZzG8CakGHA6Xa/u7iR8Q3xCxY+AUghdT92bnIDOBEefV456OeH0QvBcroVc0eyvrrLSyQGYIfg==", + "version": "7.31.7", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.7.tgz", + "integrity": "sha512-8NldBTeYp/kQoTV1uT0XF6HcmDqbgZ0lNPkN0wlRw8DJKXEnaWu+oh/6gt3xIhzvQ35wB2Y545fJhIbJSZ2NNw==", "requires": { "array-includes": "^3.1.5", "array.prototype.flatmap": "^1.3.0", diff --git a/package.json b/package.json index 49053422d93397..842b6160a90698 100644 --- a/package.json +++ b/package.json @@ -161,7 +161,7 @@ "eslint-plugin-jsx-a11y": "6.6.1", "eslint-plugin-no-only-tests": "2.6.0", "eslint-plugin-prefer-object-spread": "1.2.1", - "eslint-plugin-react": "7.31.1", + "eslint-plugin-react": "7.31.7", "eslint-plugin-react-hooks": "4.6.0", "eslint-plugin-testing-library": "4.12.4", "execa": "5.1.1", From ee95a5e9741f7c1724f5df67a2f8697b65b130e3 Mon Sep 17 00:00:00 2001 From: Gunasekar-K Date: Wed, 7 Sep 2022 12:42:10 +0530 Subject: [PATCH 029/129] Delete Jenkinsfile --- Jenkinsfile | 160 ---------------------------------------------------- 1 file changed, 160 deletions(-) delete mode 100644 Jenkinsfile diff --git a/Jenkinsfile b/Jenkinsfile deleted file mode 100644 index 663064f06fe2fe..00000000000000 --- a/Jenkinsfile +++ /dev/null @@ -1,160 +0,0 @@ -// Define Application name -def APPNAME = "freecodecamp" - -// Define which branch build and deploy need to run in the below array -def branchfilter = ['dev', 'prod'] - -if (!branchfilter.contains(env.BRANCH_NAME)) { - println 'Now is not the time to run the pipeline.' - println 'Exiting without running subsequent stages.' - println env.BRANCH_NAME - currentBuild.result = 'SUCCESS' - return -} - -// Define dev-specific vars -if (env.BRANCH_NAME == 'dev') { - DEPLOY_ENV = 'DEV' - LOGICAL_ENV = 'dev' - IS_BUILD = true - IS_DEPLOY = true - IS_APP_DEPLOY = true - IS_API_DEPLOY = true - ENABLE_CACHE = false -} - -// Define prod-specific vars -if (env.BRANCH_NAME == 'prod') { - DEPLOY_ENV = 'PROD' - LOGICAL_ENV = 'prod' - IS_BUILD = true - IS_DEPLOY = true - IS_APP_DEPLOY = true - IS_API_DEPLOY = true - ENABLE_CACHE = true -} - -pipeline { - agent { - label 'tc-ecs-agent-large' - } - - environment { - CI_AUTH0_URL = credentials('CI_AUTH0_URL') - CI_AUTH0_CLIENTID = credentials('CI_AUTH0_CLIENTID') - CI_AUTH0_CLIENTSECRET = credentials('CI_AUTH0_CLIENTSECRET') - CI_AUTH0_AUDIENCE = credentials('CI_AUTH0_AUDIENCE') - } - - options { skipDefaultCheckout() } - - stages - { - stage('checkout') - { - steps { - //cheking out code - checkout scm - script { - giturltoken = scm.getUserRemoteConfigs()[0].getUrl().tokenize('/') - env.TC_GIT_ORG = giturltoken.get(giturltoken.size()-2) - env.TC_REPONAME = scm.getUserRemoteConfigs()[0].getUrl().tokenize('/').last().split("\\.")[0] - env.TC_GIT_COMMIT_MSG = sh (script: 'git log -1 --pretty=%B ${GIT_COMMIT}', returnStdout: true).trim() - env.TC_GIT_AUTHOR = sh (script: 'git log -1 --pretty=%an ${GIT_COMMIT}', returnStdout: true).trim() - env.TC_GIT_HASH = sh (script: 'git log -1 --pretty=%h ${GIT_COMMIT}', returnStdout: true).trim() - if (sh(script: "git log -1 --pretty=%B | fgrep -ie '[skip ci]' -e '[ci skip]'", returnStatus: true) == 0) { - currentBuild.result = 'NOT_BUILT' - error 'Aborting because commit message contains [skip ci]' - } - } - } - - } - stage('pre-req install') - { - steps { - //Installing required pre-req software - sh ''' - #!/bin/bash - apt update -y - apt install awscli jq curl sudo -y - curl https://get.docker.com/ > dockerinstall && chmod 777 dockerinstall && ./dockerinstall - git clone --branch dev-jenkins https://github.com/topcoder-platform/tc-deploy-scripts ../buildscript - cp ./../buildscript/master_deploy.sh . - cp ./../buildscript/buildenv.sh . - cp ./../buildscript/awsconfiguration.sh . - curl -sL https://deb.nodesource.com/setup_16.x | sudo bash - - apt -y install nodejs - ''' - } - } - stage('fetching configuration') - { - steps { - //fetching pre-req - sh """ - #!/bin/bash - ./awsconfiguration.sh ${DEPLOY_ENV} - echo "Fetching deployvar" - ./buildenv.sh -e ${DEPLOY_ENV} -b ${LOGICAL_ENV}-${APPNAME}-deployvarj - mv buildenvvar deployenvvar - mv buildenvvarg deployenvvarg - echo "Fetching Buildvar" - ./buildenv.sh -e ${DEPLOY_ENV} -b ${LOGICAL_ENV}-${APPNAME}-buildvar - aws s3 cp s3://tc-platform-${LOGICAL_ENV}/securitymanager/${LOGICAL_ENV}-freecodecamp.env ./.env - """ - load 'awsenvconfg' - load 'deployenvvarg' - load 'buildenvvarg' - } - } - stage('build application') - { - //Building Application - when { expression { IS_BUILD } } - steps { - // Doing Build - sh """ - #!/bin/bash - node --version - npm --version - git config --global url."https://git@".insteadOf git:// - npm ci - npm run build - ls -lath - """ - } - } - stage('appdeploy') - { - //Deploying app - when { expression { IS_APP_DEPLOY } } - steps { - //Doing Deployment - echo "Deploying application" - //input(message: 'Hello World!', ok: 'Submit') - sh """ - #!/bin/bash - ./master_deploy.sh -d CFRONT -e $DEPLOY_ENV -c $ENABLE_CACHE - """ - } - } - stage('apideploy') - { - //Deploying app - when { expression { IS_API_DEPLOY } } - steps { - //Doing Deployment - echo "Deploying Api" - // input(message: 'Hello World!', ok: 'Submit') - sh """ - #!/bin/bash - sed -i '/node_modules/d' ./.dockerignore - docker build -f docker/api/ECSDockerfile -t $APPNAME-api:latest . - ./master_deploy.sh -d ECS -e $DEPLOY_ENV -t latest -s ${LOGICAL_ENV}-${APPNAME}-appvar -i ${APPNAME}-api - """ - } - } - } - -} From 70823678f8d53a1e6ffe75b0e6f65afed36573fb Mon Sep 17 00:00:00 2001 From: Gunasekar-K Date: Wed, 7 Sep 2022 12:45:29 +0530 Subject: [PATCH 030/129] Create Jenkinsfile --- Jenkinsfile | 160 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 Jenkinsfile diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 00000000000000..663064f06fe2fe --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,160 @@ +// Define Application name +def APPNAME = "freecodecamp" + +// Define which branch build and deploy need to run in the below array +def branchfilter = ['dev', 'prod'] + +if (!branchfilter.contains(env.BRANCH_NAME)) { + println 'Now is not the time to run the pipeline.' + println 'Exiting without running subsequent stages.' + println env.BRANCH_NAME + currentBuild.result = 'SUCCESS' + return +} + +// Define dev-specific vars +if (env.BRANCH_NAME == 'dev') { + DEPLOY_ENV = 'DEV' + LOGICAL_ENV = 'dev' + IS_BUILD = true + IS_DEPLOY = true + IS_APP_DEPLOY = true + IS_API_DEPLOY = true + ENABLE_CACHE = false +} + +// Define prod-specific vars +if (env.BRANCH_NAME == 'prod') { + DEPLOY_ENV = 'PROD' + LOGICAL_ENV = 'prod' + IS_BUILD = true + IS_DEPLOY = true + IS_APP_DEPLOY = true + IS_API_DEPLOY = true + ENABLE_CACHE = true +} + +pipeline { + agent { + label 'tc-ecs-agent-large' + } + + environment { + CI_AUTH0_URL = credentials('CI_AUTH0_URL') + CI_AUTH0_CLIENTID = credentials('CI_AUTH0_CLIENTID') + CI_AUTH0_CLIENTSECRET = credentials('CI_AUTH0_CLIENTSECRET') + CI_AUTH0_AUDIENCE = credentials('CI_AUTH0_AUDIENCE') + } + + options { skipDefaultCheckout() } + + stages + { + stage('checkout') + { + steps { + //cheking out code + checkout scm + script { + giturltoken = scm.getUserRemoteConfigs()[0].getUrl().tokenize('/') + env.TC_GIT_ORG = giturltoken.get(giturltoken.size()-2) + env.TC_REPONAME = scm.getUserRemoteConfigs()[0].getUrl().tokenize('/').last().split("\\.")[0] + env.TC_GIT_COMMIT_MSG = sh (script: 'git log -1 --pretty=%B ${GIT_COMMIT}', returnStdout: true).trim() + env.TC_GIT_AUTHOR = sh (script: 'git log -1 --pretty=%an ${GIT_COMMIT}', returnStdout: true).trim() + env.TC_GIT_HASH = sh (script: 'git log -1 --pretty=%h ${GIT_COMMIT}', returnStdout: true).trim() + if (sh(script: "git log -1 --pretty=%B | fgrep -ie '[skip ci]' -e '[ci skip]'", returnStatus: true) == 0) { + currentBuild.result = 'NOT_BUILT' + error 'Aborting because commit message contains [skip ci]' + } + } + } + + } + stage('pre-req install') + { + steps { + //Installing required pre-req software + sh ''' + #!/bin/bash + apt update -y + apt install awscli jq curl sudo -y + curl https://get.docker.com/ > dockerinstall && chmod 777 dockerinstall && ./dockerinstall + git clone --branch dev-jenkins https://github.com/topcoder-platform/tc-deploy-scripts ../buildscript + cp ./../buildscript/master_deploy.sh . + cp ./../buildscript/buildenv.sh . + cp ./../buildscript/awsconfiguration.sh . + curl -sL https://deb.nodesource.com/setup_16.x | sudo bash - + apt -y install nodejs + ''' + } + } + stage('fetching configuration') + { + steps { + //fetching pre-req + sh """ + #!/bin/bash + ./awsconfiguration.sh ${DEPLOY_ENV} + echo "Fetching deployvar" + ./buildenv.sh -e ${DEPLOY_ENV} -b ${LOGICAL_ENV}-${APPNAME}-deployvarj + mv buildenvvar deployenvvar + mv buildenvvarg deployenvvarg + echo "Fetching Buildvar" + ./buildenv.sh -e ${DEPLOY_ENV} -b ${LOGICAL_ENV}-${APPNAME}-buildvar + aws s3 cp s3://tc-platform-${LOGICAL_ENV}/securitymanager/${LOGICAL_ENV}-freecodecamp.env ./.env + """ + load 'awsenvconfg' + load 'deployenvvarg' + load 'buildenvvarg' + } + } + stage('build application') + { + //Building Application + when { expression { IS_BUILD } } + steps { + // Doing Build + sh """ + #!/bin/bash + node --version + npm --version + git config --global url."https://git@".insteadOf git:// + npm ci + npm run build + ls -lath + """ + } + } + stage('appdeploy') + { + //Deploying app + when { expression { IS_APP_DEPLOY } } + steps { + //Doing Deployment + echo "Deploying application" + //input(message: 'Hello World!', ok: 'Submit') + sh """ + #!/bin/bash + ./master_deploy.sh -d CFRONT -e $DEPLOY_ENV -c $ENABLE_CACHE + """ + } + } + stage('apideploy') + { + //Deploying app + when { expression { IS_API_DEPLOY } } + steps { + //Doing Deployment + echo "Deploying Api" + // input(message: 'Hello World!', ok: 'Submit') + sh """ + #!/bin/bash + sed -i '/node_modules/d' ./.dockerignore + docker build -f docker/api/ECSDockerfile -t $APPNAME-api:latest . + ./master_deploy.sh -d ECS -e $DEPLOY_ENV -t latest -s ${LOGICAL_ENV}-${APPNAME}-appvar -i ${APPNAME}-api + """ + } + } + } + +} From b7fefbf8a5f7c21f897e9e151619b413d69bcd82 Mon Sep 17 00:00:00 2001 From: camperbot Date: Wed, 7 Sep 2022 12:54:39 +0530 Subject: [PATCH 031/129] chore(i18n,client): processed translations (#47450) --- .../i18n/locales/chinese-traditional/translations.json | 6 ++++++ client/i18n/locales/chinese/translations.json | 6 ++++++ client/i18n/locales/espanol/translations.json | 6 ++++++ client/i18n/locales/german/translations.json | 6 ++++++ client/i18n/locales/italian/translations.json | 10 ++++++++-- client/i18n/locales/japanese/translations.json | 6 ++++++ client/i18n/locales/portuguese/translations.json | 6 ++++++ client/i18n/locales/ukrainian/translations.json | 6 ++++++ 8 files changed, 50 insertions(+), 2 deletions(-) diff --git a/client/i18n/locales/chinese-traditional/translations.json b/client/i18n/locales/chinese-traditional/translations.json index 256993a47989e9..ed565344c6691a 100644 --- a/client/i18n/locales/chinese-traditional/translations.json +++ b/client/i18n/locales/chinese-traditional/translations.json @@ -488,6 +488,12 @@ "breadcrumb-nav": "麪包屑導航", "submit": "按下 Ctrl + Enter 鍵提交。", "running-tests": "正在運行測試", + "hide-preview": "Hide the preview", + "move-preview-to-new-window": "Move the preview to a new window and focus it", + "move-preview-to-main-window": "Move the preview to this window and close the external preview window", + "close-external-preview-window": "Close the external preview window", + "show-preview": "Show the preview in this window", + "open-preview-in-new-window": "Open the preview in a new window and focus it", "step": "步驟", "steps": "步驟", "steps-for": "{{blockTitle}} 的步驟" diff --git a/client/i18n/locales/chinese/translations.json b/client/i18n/locales/chinese/translations.json index 67b268d8d3f9b5..899dc438922a14 100644 --- a/client/i18n/locales/chinese/translations.json +++ b/client/i18n/locales/chinese/translations.json @@ -488,6 +488,12 @@ "breadcrumb-nav": "面包屑导航", "submit": "按下 Ctrl + Enter 键提交。", "running-tests": "正在运行测试", + "hide-preview": "Hide the preview", + "move-preview-to-new-window": "Move the preview to a new window and focus it", + "move-preview-to-main-window": "Move the preview to this window and close the external preview window", + "close-external-preview-window": "Close the external preview window", + "show-preview": "Show the preview in this window", + "open-preview-in-new-window": "Open the preview in a new window and focus it", "step": "步骤", "steps": "步骤", "steps-for": "{{blockTitle}} 的步骤" diff --git a/client/i18n/locales/espanol/translations.json b/client/i18n/locales/espanol/translations.json index f3053812137b0e..77490b6f56ec50 100644 --- a/client/i18n/locales/espanol/translations.json +++ b/client/i18n/locales/espanol/translations.json @@ -488,6 +488,12 @@ "breadcrumb-nav": "migas de pan", "submit": "Utiliza Ctrl + Enter para enviar.", "running-tests": "Ejecutando pruebas", + "hide-preview": "Hide the preview", + "move-preview-to-new-window": "Move the preview to a new window and focus it", + "move-preview-to-main-window": "Move the preview to this window and close the external preview window", + "close-external-preview-window": "Close the external preview window", + "show-preview": "Show the preview in this window", + "open-preview-in-new-window": "Open the preview in a new window and focus it", "step": "Step", "steps": "Steps", "steps-for": "Steps for {{blockTitle}}" diff --git a/client/i18n/locales/german/translations.json b/client/i18n/locales/german/translations.json index 6dcc79ad6d283c..260ea6323287af 100644 --- a/client/i18n/locales/german/translations.json +++ b/client/i18n/locales/german/translations.json @@ -488,6 +488,12 @@ "breadcrumb-nav": "Breadcrumb", "submit": "Verwende Strg + Enter zum Absenden.", "running-tests": "Tests werden durchgeführt", + "hide-preview": "Vorschau ausblenden", + "move-preview-to-new-window": "Verschiebe die Vorschau in ein neues Fenster und fokussiere sie", + "move-preview-to-main-window": "Verschiebe die Vorschau in dieses Fenster und schließe das externe Vorschaufenster", + "close-external-preview-window": "Schließe das externe Vorschaufenster", + "show-preview": "Zeige die Vorschau in diesem Fenster", + "open-preview-in-new-window": "Öffne die Vorschau in einem neuen Fenster und fokussiere sie", "step": "Schritt", "steps": "Schritte", "steps-for": "Schritte für {{blockTitle}}" diff --git a/client/i18n/locales/italian/translations.json b/client/i18n/locales/italian/translations.json index 1e3939b5065e38..6b97a84c54e34a 100644 --- a/client/i18n/locales/italian/translations.json +++ b/client/i18n/locales/italian/translations.json @@ -286,7 +286,7 @@ "percent-complete": "{{percent}}% completato", "tried-rsa": "Se hai già provato il metodo <0>Leggi-Cerca-Chiedi, allora puoi chiedere aiuto sul forum freeCodeCamp.", "rsa": "Leggi, cerca, chiedi", - "rsa-forum": "Before making a new post please see if your question has <0>already been answered on the forum.", + "rsa-forum": "Prima di creare un nuovo post per favore, controlla se <0>la tua domanda ha già una risposta sul forum.", "reset": "Vuoi resettare questa lezione?", "reset-warn": "Sei sicuro di voler resettare questa lezione? Gli editor e i test saranno resettati.", "reset-warn-2": "Questa operazione non potrà essere annullata", @@ -451,7 +451,7 @@ "change-theme": "Accedi per modificare il tema.", "translation-pending": "Aiutaci a tradurlo", "certification-project": "Progetto della certificazione", - "iframe-preview": "{{title}} preview", + "iframe-preview": "Anteprima {{title}}", "iframe-alert": "Solitamente questo link ti porterebbe su un altro sito web! Funziona. Questo è un link per {{externalLink}}", "document-notfound": "documento non trovato" }, @@ -488,6 +488,12 @@ "breadcrumb-nav": "percorso", "submit": "Usa Ctrl + Invio per inviare.", "running-tests": "Test in corso", + "hide-preview": "Nascondi l'anteprima", + "move-preview-to-new-window": "Sposta l'anteprima in una nuova finestra e selezionala", + "move-preview-to-main-window": "Sposta l'anteprima in questa finestra e chiudi la finestra di anteprima esterna", + "close-external-preview-window": "Chiudi la finestra di anteprima esterna", + "show-preview": "Mostra l'anteprima in questa finestra", + "open-preview-in-new-window": "Apri l'anteprima in una nuova finestra e selezionala", "step": "Step", "steps": "Step", "steps-for": "Step per {{blockTitle}}" diff --git a/client/i18n/locales/japanese/translations.json b/client/i18n/locales/japanese/translations.json index b4c835bd8c8470..eee0e5a8e1d74a 100644 --- a/client/i18n/locales/japanese/translations.json +++ b/client/i18n/locales/japanese/translations.json @@ -488,6 +488,12 @@ "breadcrumb-nav": "パンくずリスト", "submit": "提出するには Ctrl + Enter を押してください。", "running-tests": "テスト実行中", + "hide-preview": "Hide the preview", + "move-preview-to-new-window": "Move the preview to a new window and focus it", + "move-preview-to-main-window": "Move the preview to this window and close the external preview window", + "close-external-preview-window": "Close the external preview window", + "show-preview": "Show the preview in this window", + "open-preview-in-new-window": "Open the preview in a new window and focus it", "step": "ステップ", "steps": "ステップ一覧", "steps-for": "「{{blockTitle}}」のステップ一覧" diff --git a/client/i18n/locales/portuguese/translations.json b/client/i18n/locales/portuguese/translations.json index 60ed22b5504817..707750f6a0ce4f 100644 --- a/client/i18n/locales/portuguese/translations.json +++ b/client/i18n/locales/portuguese/translations.json @@ -488,6 +488,12 @@ "breadcrumb-nav": "breadcrumb", "submit": "Use Ctrl + Enter para enviar.", "running-tests": "Executando testes", + "hide-preview": "Ocultar a visualização", + "move-preview-to-new-window": "Mover a visualização para uma nova janela e focá-la", + "move-preview-to-main-window": "Mover a visualização para esta janela e fechar a janela de visualização externa", + "close-external-preview-window": "Fechar a janela de visualização externa", + "show-preview": "Mostrar a visualização nesta janela", + "open-preview-in-new-window": "Abrir a visualização em uma nova janela e focá-la", "step": "Passo", "steps": "Passos", "steps-for": "Passos para {{blockTitle}}" diff --git a/client/i18n/locales/ukrainian/translations.json b/client/i18n/locales/ukrainian/translations.json index ccc1e2eb87f482..bb716d8ec2ae32 100644 --- a/client/i18n/locales/ukrainian/translations.json +++ b/client/i18n/locales/ukrainian/translations.json @@ -488,6 +488,12 @@ "breadcrumb-nav": "навігаційна стежка", "submit": "Використайте Ctrl + Enter, щоб відправити.", "running-tests": "Запущені тести", + "hide-preview": "Hide the preview", + "move-preview-to-new-window": "Move the preview to a new window and focus it", + "move-preview-to-main-window": "Move the preview to this window and close the external preview window", + "close-external-preview-window": "Close the external preview window", + "show-preview": "Show the preview in this window", + "open-preview-in-new-window": "Open the preview in a new window and focus it", "step": "Крок", "steps": "Кроки", "steps-for": "Кроки для {{blockTitle}}" From dd03da4f5166f9c63513441657a42e06d4c0ebf9 Mon Sep 17 00:00:00 2001 From: camperbot Date: Wed, 7 Sep 2022 18:04:53 +0530 Subject: [PATCH 032/129] chore(i18n,learn): processed translations (#47434) --- .../convert-celsius-to-fahrenheit.md | 33 +- ...ray-of-all-object-keys-with-object.keys.md | 2 +- ...-of-an-object-with-a-for...in-statement.md | 2 +- ...s-multi-dimensional-arrays-with-indexes.md | 8 +- .../assignment-with-a-returned-value.md | 2 +- ...oncatenating-strings-with-plus-operator.md | 12 +- ...g-strings-with-the-plus-equals-operator.md | 6 + .../constructing-strings-with-variables.md | 2 +- .../basic-javascript/counting-cards.md | 27 +- .../create-decimal-numbers-with-javascript.md | 2 +- ...ad-only-variable-with-the-const-keyword.md | 9 +- .../escaping-literal-quotes-in-strings.md | 2 +- ...nerate-random-fractions-with-javascript.md | 2 +- .../global-scope-and-functions.md | 2 +- .../basic-javascript/golf-code.md | 2 +- ...terate-with-javascript-do...while-loops.md | 2 +- .../return-early-pattern-for-functions.md | 2 +- ...returning-boolean-values-from-functions.md | 2 +- .../use-recursion-to-create-a-countdown.md | 2 +- .../using-objects-for-lookups.md | 8 +- .../basic-javascript/word-blanks.md | 20 +- ...pare-scopes-of-the-var-and-let-keywords.md | 2 +- ...tand-functional-programming-terminology.md | 2 +- .../dna-pairing.md | 10 +- .../map-the-debris.md | 17 +- .../roman-numeral-converter.md | 18 +- .../telephone-number-validator.md | 2 +- .../find-more-than-the-first-match.md | 2 +- .../convert-celsius-to-fahrenheit.md | 33 +- ...ray-of-all-object-keys-with-object.keys.md | 2 +- ...-of-an-object-with-a-for...in-statement.md | 2 +- ...s-multi-dimensional-arrays-with-indexes.md | 8 +- .../assignment-with-a-returned-value.md | 2 +- ...oncatenating-strings-with-plus-operator.md | 12 +- ...g-strings-with-the-plus-equals-operator.md | 6 + .../constructing-strings-with-variables.md | 2 +- .../basic-javascript/counting-cards.md | 27 +- .../create-decimal-numbers-with-javascript.md | 2 +- ...ad-only-variable-with-the-const-keyword.md | 9 +- .../escaping-literal-quotes-in-strings.md | 2 +- ...nerate-random-fractions-with-javascript.md | 2 +- .../global-scope-and-functions.md | 2 +- .../basic-javascript/golf-code.md | 2 +- ...terate-with-javascript-do...while-loops.md | 2 +- .../return-early-pattern-for-functions.md | 2 +- ...returning-boolean-values-from-functions.md | 2 +- .../use-recursion-to-create-a-countdown.md | 2 +- .../using-objects-for-lookups.md | 8 +- .../basic-javascript/word-blanks.md | 20 +- ...pare-scopes-of-the-var-and-let-keywords.md | 2 +- ...tand-functional-programming-terminology.md | 2 +- .../dna-pairing.md | 10 +- .../map-the-debris.md | 17 +- .../roman-numeral-converter.md | 18 +- .../telephone-number-validator.md | 2 +- .../find-more-than-the-first-match.md | 2 +- .../adjust-the-hue-of-a-color.md | 2 +- ...tand-functional-programming-terminology.md | 2 +- .../wherefore-art-thou.md | 9 + .../build-a-javascript-calculator.md | 4 +- .../build-a-tribute-page.md | 2 +- .../build-a-survey-form.md | 518 ++++++++++++++++++ .../build-a-tribute-page.md | 325 +++++++++++ .../mutate-an-array-declared-with-const.md | 2 +- .../build-a-drum-machine.md | 14 +- .../62ff8b9dab5ac88e4d3d43a3.md | 2 +- .../62ff8e998d3e7eae14d6ae3b.md | 2 +- .../62ff919a7b5612c0670923a5.md | 2 +- .../5dc24614f86c76b9248c6ebd.md | 79 +++ .../5ddbd81294d8ddc1510a8e56.md | 57 ++ .../7cf9b03d81a65668421804c3.md | 103 ++++ .../60f027c87bc98f050395c139.md | 67 +++ .../60f0286404aefb0562a4fdf9.md | 56 ++ .../60f1922fcbd2410527b3bd89.md | 55 ++ .../60f5c3e399ff1a05629964e4.md | 63 +++ .../60f5d2776c854e069560fbe6.md | 62 +++ .../60f5dc35c07ac1078f140916.md | 82 +++ .../mutate-an-array-declared-with-const.md | 2 +- .../build-a-drum-machine.md | 14 +- .../62ff8b9dab5ac88e4d3d43a3.md | 2 +- .../62ff8e998d3e7eae14d6ae3b.md | 2 +- .../62ff919a7b5612c0670923a5.md | 2 +- 82 files changed, 1765 insertions(+), 169 deletions(-) create mode 100644 curriculum/challenges/german/14-responsive-web-design-22/build-a-survey-form-project/build-a-survey-form.md create mode 100644 curriculum/challenges/german/14-responsive-web-design-22/build-a-tribute-page-project/build-a-tribute-page.md create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc24614f86c76b9248c6ebd.md create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ddbd81294d8ddc1510a8e56.md create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/7cf9b03d81a65668421804c3.md create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f027c87bc98f050395c139.md create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f0286404aefb0562a4fdf9.md create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f1922fcbd2410527b3bd89.md create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f5c3e399ff1a05629964e4.md create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f5d2776c854e069560fbe6.md create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f5dc35c07ac1078f140916.md diff --git a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-algorithm-scripting/convert-celsius-to-fahrenheit.md b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-algorithm-scripting/convert-celsius-to-fahrenheit.md index 7d6aad7e37213d..7c553e573937b9 100644 --- a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-algorithm-scripting/convert-celsius-to-fahrenheit.md +++ b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-algorithm-scripting/convert-celsius-to-fahrenheit.md @@ -14,40 +14,40 @@ dashedName: convert-celsius-to-fahrenheit # --hints-- -`convertToF(0)` 應返回一個數字。 +`convertCtoF(0)` 應該返回一個數字 ```js -assert(typeof convertToF(0) === 'number'); +assert(typeof convertCtoF(0) === 'number'); ``` -`convertToF(-30)` 應返回 `-22`。 +`convertCtoF(-30)` 應該返回 `-22` 的值 ```js -assert(convertToF(-30) === -22); +assert(convertCtoF(-30) === -22); ``` -`convertToF(-10)` 應返回 `14`。 +`convertCtoF(-10)` 應該返回 `14` 的值 ```js -assert(convertToF(-10) === 14); +assert(convertCtoF(-10) === 14); ``` -`convertToF(0)` 應返回 `32`。 +`convertCtoF(0)` 應該返回 `32` 的值 ```js -assert(convertToF(0) === 32); +assert(convertCtoF(0) === 32); ``` -`convertToF(20)` 應返回 `68`。 +`convertCtoF(20)` 應該返回 `68` 的值 ```js -assert(convertToF(20) === 68); +assert(convertCtoF(20) === 68); ``` -`convertToF(30)` 應返回 `86`。 +`convertCtoF(30)` 應該返回 `86` 的值 ```js -assert(convertToF(30) === 86); +assert(convertCtoF(30) === 86); ``` # --seed-- @@ -55,22 +55,21 @@ assert(convertToF(30) === 86); ## --seed-contents-- ```js -function convertToF(celsius) { +function convertCtoF(celsius) { let fahrenheit; return fahrenheit; } -convertToF(30); +convertCtoF(30); ``` # --solutions-- ```js -function convertToF(celsius) { +function convertCtoF(celsius) { let fahrenheit = celsius * 9/5 + 32; - return fahrenheit; } -convertToF(30); +convertCtoF(30); ``` diff --git a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-data-structures/generate-an-array-of-all-object-keys-with-object.keys.md b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-data-structures/generate-an-array-of-all-object-keys-with-object.keys.md index 0c9c3c5166152a..817a92a603439c 100644 --- a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-data-structures/generate-an-array-of-all-object-keys-with-object.keys.md +++ b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-data-structures/generate-an-array-of-all-object-keys-with-object.keys.md @@ -8,7 +8,7 @@ dashedName: generate-an-array-of-all-object-keys-with-object-keys # --description-- -我們可以給 `Object.keys()` 方法傳入一個對象作爲參數,來生成包含對象所有鍵的數組。 這會返回一個由對象中所有屬性(字符串)組成的數組。 需要注意的是,數組中元素的順序是不確定的。 +我們可以給 `Object.keys()` 方法傳入一個對象作爲參數,來生成包含對象所有鍵的數組。 這個方法將對象作爲參數並返回代表對象中每個屬性的字符串數組。 需要注意的是,數組中元素的順序是不確定的。 # --instructions-- diff --git a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-data-structures/iterate-through-the-keys-of-an-object-with-a-for...in-statement.md b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-data-structures/iterate-through-the-keys-of-an-object-with-a-for...in-statement.md index 58100126b25f09..c6238b203bedce 100644 --- a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-data-structures/iterate-through-the-keys-of-an-object-with-a-for...in-statement.md +++ b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-data-structures/iterate-through-the-keys-of-an-object-with-a-for...in-statement.md @@ -16,7 +16,7 @@ for (let user in users) { } ``` -這將在控制檯打印 `Alan`、`Jeff`、`Sarah` 和 `Ryan` - 每個值佔一行。 +這將記錄 `Alan`、`Jeff` 和 `Sarah` - 每個值都在自己的行中。 在上面的代碼中,我們定義了一個 `user` 變量。 可以觀察到,這個變量在遍歷對象的語句執行過程中會一直被重置並賦予新值,結果就是不同的用戶名打印到了 console 中。 diff --git a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/access-multi-dimensional-arrays-with-indexes.md b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/access-multi-dimensional-arrays-with-indexes.md index 9378814a42380a..b556174cc1db24 100644 --- a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/access-multi-dimensional-arrays-with-indexes.md +++ b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/access-multi-dimensional-arrays-with-indexes.md @@ -21,12 +21,12 @@ const arr = [ [[10, 11, 12], 13, 14] ]; -arr[3]; -arr[3][0]; -arr[3][0][1]; +const subarray = arr[3]; +const nestedSubarray = arr[3][0]; +const element = arr[3][0][1]; ``` -`arr[3]` 爲 `[[10, 11, 12], 13, 14]`,`arr[3][0]` 爲 `[10, 11, 12]`,並且 `arr[3][0][1]` 爲 `11`。 +在這個例子中,`subarray` 的值爲 `[[10, 11, 12], 13, 14]`, `nestedSubarray` 的值爲 `[10, 11, 12]`,`element` 的值爲 `11` 。 **注意:** 數組名與方括號之間不應該有任何空格,比如 `array [0][0]` 甚至是 `array [0] [0]` 都是不允許的。 儘管 JavaScript 能夠正確處理這種情況,但是當其他程序員閱讀你寫的代碼時,這可能讓他們感到困惑。 diff --git a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/assignment-with-a-returned-value.md b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/assignment-with-a-returned-value.md index cb47eeaa15c18e..2be7e6e63f721c 100644 --- a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/assignment-with-a-returned-value.md +++ b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/assignment-with-a-returned-value.md @@ -9,7 +9,7 @@ dashedName: assignment-with-a-returned-value # --description-- -如果你還記得我們在[使用賦值運算符存儲值](/learn/javascript-algorithms-and-data-structures/basic-javascript/storing-values-with-the-assignment-operator)中的討論的話,等號右側的所有操作都會在賦值之前完成。 這意味着我們可以獲取函數的返回值,並將其賦值給一個變量。 +如果你還記得我們在這一節使用賦值運算符存儲值中的討論,賦值之前,先完成等號右邊的操作。 這意味着我們可以獲取函數的返回值,並將其賦值給一個變量。 假設我們有一個預先定義的函數 `sum` ,它將兩個數相加,然後: diff --git a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/concatenating-strings-with-plus-operator.md b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/concatenating-strings-with-plus-operator.md index 6e832947bce91d..924cc5dcd25a6f 100644 --- a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/concatenating-strings-with-plus-operator.md +++ b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/concatenating-strings-with-plus-operator.md @@ -32,13 +32,19 @@ const ourStr = "I come first. " + "I come second."; # --hints-- -`myStr` 的值應該是 `This is the start. This is the end.` +`myStr` 應該在兩個字符串之間有一個空格字符。 + +```js +assert(/start\. This/.test(myStr)); +``` + +`myStr` 的值應該是字符串 `This is the start. This is the end.` ```js assert(myStr === 'This is the start. This is the end.'); ``` -應使用 `+` 操作符創建 `myStr`。 +應該使用 `+` 運算符來構建 `myStr`。 ```js assert(code.match(/(["']).*\1\s*\+\s*(["']).*\2/g)); @@ -50,7 +56,7 @@ assert(code.match(/(["']).*\1\s*\+\s*(["']).*\2/g)); assert(/const\s+myStr/.test(code)); ``` -應把結果賦值給 `myStr` 變量。 +應該將結果分配給 `myStr` 變量。 ```js assert(/myStr\s*=/.test(code)); diff --git a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/concatenating-strings-with-the-plus-equals-operator.md b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/concatenating-strings-with-the-plus-equals-operator.md index 6c93e3a8913249..e7f7deecf4d24d 100644 --- a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/concatenating-strings-with-the-plus-equals-operator.md +++ b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/concatenating-strings-with-the-plus-equals-operator.md @@ -28,6 +28,12 @@ ourStr += "I come second."; # --hints-- +`myStr` 應該在兩個字符串之間有一個空格字符。 + +```js +assert(/sentence\. This/.test(myStr)); +``` + `myStr` 的值應該是字符串 `This is the first sentence. This is the second sentence.` ```js diff --git a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/constructing-strings-with-variables.md b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/constructing-strings-with-variables.md index 61655e5ba6b99d..a8a05660bfec1a 100644 --- a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/constructing-strings-with-variables.md +++ b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/constructing-strings-with-variables.md @@ -9,7 +9,7 @@ dashedName: constructing-strings-with-variables # --description-- -有時候你需要創建一個類似 [Mad Libs](https://en.wikipedia.org/wiki/Mad_Libs)(填詞遊戲)風格的字符串。 通過使用連接運算符(`+`),你可以插入一個或多個變量來組成一個字符串。 +有時候你需要構建一個字符串。 通過使用連接運算符(`+`),你可以插入一個或多個變量來組成一個字符串。 例如: diff --git a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/counting-cards.md b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/counting-cards.md index facfb5dedd4c18..b658aa36f13452 100644 --- a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/counting-cards.md +++ b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/counting-cards.md @@ -9,7 +9,7 @@ dashedName: counting-cards # --description-- -在賭場 21 點遊戲中,玩家可以通過計算牌桌上已經發放的卡牌的高低值來讓自己在遊戲中保持優勢。 這就叫 [21 點算法](https://en.wikipedia.org/wiki/Card_counting)。 +在 21 點遊戲中,玩家可以通過計算牌桌上已經發放的卡牌的高低值來讓自己在遊戲中保持優勢。 這被稱爲卡片計數。 牌桌上的大值的卡牌更多,對玩家有利。 根據下面的表格,每張卡牌都被分配了一個值。 如果卡牌的值大於 0,那麼玩家應該追加賭注。 如果卡牌的值爲 0 或負數,玩家應該追加少許賭注甚至不追加賭注。 @@ -25,6 +25,19 @@ dashedName: counting-cards # --hints-- +你的函數應返回計數值和文本(`Bet` 或 `Hold`),它們之間有一個空格字符。 + +```js +assert(// + (function () { + count = 0; + let out = cc(10); + const hasSpace = /-?\d+ (Bet|Hold)/.test('' + out); + return hasSpace; + })() +); +``` + 卡片序列 2、3、4、5、6 應返回字符串 `5 Bet` ```js @@ -44,7 +57,7 @@ assert( ); ``` -卡牌序列 7、8、9 應該返回 `0 Hold` +卡片序列 7、8、9 應返回字符串 `0 Hold` ```js assert( @@ -61,7 +74,7 @@ assert( ); ``` -卡牌序列 10、J、Q、K、A 應該返回 `-5 Hold` +卡片序列 10、J、Q、K、A 應返回字符串 `-5 Hold` ```js assert( @@ -80,7 +93,7 @@ assert( ); ``` -卡牌序列 3、7、Q、8、A 應該返回 `-1 Hold` +卡片序列 3、7、Q、8、A 應返回字符串 `-1 Hold` ```js assert( @@ -99,7 +112,7 @@ assert( ); ``` -卡牌序列 2、J、9、2、7 應該返回 `1 Bet` +卡片序列 2、J、9、2、7 應返回字符串 `1 Bet` ```js assert( @@ -118,7 +131,7 @@ assert( ); ``` -卡牌序列 2、2、10 應該返回 `1 Bet` +卡片序列 2、2、10 應返回字符串 `1 Bet` ```js assert( @@ -135,7 +148,7 @@ assert( ); ``` -卡牌序列 3、2、A、10、K 應該返回 `-1 Hold` +卡片序列 3、2、A、10、K 應返回字符串 `-1 Hold` ```js assert( diff --git a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/create-decimal-numbers-with-javascript.md b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/create-decimal-numbers-with-javascript.md index b29629c78825e9..e1ea1258befbbe 100644 --- a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/create-decimal-numbers-with-javascript.md +++ b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/create-decimal-numbers-with-javascript.md @@ -11,7 +11,7 @@ dashedName: create-decimal-numbers-with-javascript 我們也可以把小數存儲到變量中。 小數有時候也被稱作浮點數或者 floats。 -**提示:** 不是所有的實數都可以用浮點數(floating point)來表示。 因爲可能產生四捨五入的錯誤, [點擊這裏瞭解細節](https://en.wikipedia.org/wiki/Floating-point_arithmetic#Accuracy_problems)。 +**注意:** 當你計算數字時,它們是以有限的精確度計算的。 使用浮點數的運算可能產生不同於預期結果的結果。 如果你生成了一個非預期的結果,請在 freeCodeCamp 論壇上創建一個話題進行說明。 # --instructions-- diff --git a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/declare-a-read-only-variable-with-the-const-keyword.md b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/declare-a-read-only-variable-with-the-const-keyword.md index a60941f01cb9b4..edc77cf5d07599 100644 --- a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/declare-a-read-only-variable-with-the-const-keyword.md +++ b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/declare-a-read-only-variable-with-the-const-keyword.md @@ -25,7 +25,7 @@ FAV_PET = "Dogs"; # --instructions-- -更改代碼,以便使用 `let` 或 `const` 聲明所有變量。 當你想要改變變量時使用 `let`,當你想要變量保持不變時使用 `const`。 此外,重命名使用 `const` 聲明的變量以符合慣例。 +更改代碼,以便使用 `let` 或 `const` 聲明所有變量。 當你想要改變變量時使用 `let`,當你想要變量保持不變時使用 `const`。 此外,重命名使用 `const` 聲明的變量以符合慣例。 請勿更改分配給變量的字符串。 # --hints-- @@ -45,10 +45,15 @@ assert.notMatch(code, /(fCC)/); `FCC` 應該是一個用 `const` 聲明的常量。 ```js -assert.equal(FCC, 'freeCodeCamp'); assert.match(code, /const\s+FCC/); ``` +分配給 `FCC` 的字符串不應更改。 + +```js +assert.equal(FCC, 'freeCodeCamp'); +``` + `fact` 應該用 `let` 聲明。 ```js diff --git a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/escaping-literal-quotes-in-strings.md b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/escaping-literal-quotes-in-strings.md index 54e3c539f7d56c..f73c76399a353b 100644 --- a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/escaping-literal-quotes-in-strings.md +++ b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/escaping-literal-quotes-in-strings.md @@ -39,7 +39,7 @@ I am a "double quoted" string inside "double quotes". assert(code.match(/\\"/g).length === 4 && code.match(/[^\\]"/g).length === 2); ``` -變量 myStr 應該包含字符串 `I am a "double quoted" string inside "double quotes".` +變量 `myStr` 應該包含字符串 `I am a "double quoted" string inside "double quotes".` ```js assert(/I am a "double quoted" string inside "double quotes(\."|"\.)$/.test(myStr)); diff --git a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/generate-random-fractions-with-javascript.md b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/generate-random-fractions-with-javascript.md index edb435a0741819..dbaac0798ee008 100644 --- a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/generate-random-fractions-with-javascript.md +++ b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/generate-random-fractions-with-javascript.md @@ -13,7 +13,7 @@ dashedName: generate-random-fractions-with-javascript 在 JavaScript 中,可以用 `Math.random()` 生成一個在`0`(包括 0)到 `1`(不包括 1)之間的隨機小數。 因此 `Math.random()` 可能返回 `0`,但絕不會返回 `1`。 -**提示:**[使用賦值運算符存儲值](/learn/javascript-algorithms-and-data-structures/basic-javascript/storing-values-with-the-assignment-operator)這一節講過,所有函數調用將在 `return` 執行之前結束,因此我們可以 `return`(返回)`Math.random()` 函數的值。 +**提示:**使用賦值運算符存儲值這一節講過,所有函數調用將在 `return` 執行之前結束,因此我們可以 `return`(返回)`Math.random()` 函數的值。 # --instructions-- diff --git a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/global-scope-and-functions.md b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/global-scope-and-functions.md index fac07588aef4da..09d5f5478b0694 100644 --- a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/global-scope-and-functions.md +++ b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/global-scope-and-functions.md @@ -17,7 +17,7 @@ dashedName: global-scope-and-functions 使用 `let` 或 `const`,在任何函數之外聲明一個名爲 `myGlobal` 的全局變量。 並給它一個初始值 `10`。 -在函數 `fun1` 中,***不要*** 使用 `let` 或 `const` 關鍵字,將 `5` 分配給 `oopsGlobal` 。 +在函數 `fun1`中,賦值 `5` 給 `oopsGlobal`,***不使用*** `var`、`let` 或 `const` 關鍵字。 # --hints-- diff --git a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/golf-code.md b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/golf-code.md index da6e34d887c145..88c70f87e1addc 100644 --- a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/golf-code.md +++ b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/golf-code.md @@ -9,7 +9,7 @@ dashedName: golf-code # --description-- -在[高爾夫](https://en.wikipedia.org/wiki/Golf)遊戲中,每個洞都有自己的標準桿數 `par`,代表着把球打進洞所揮杆的平均次數 `strokes`。 根據你把球打進洞所揮杆的次數 `strokes` 高於或低於 `par` 多少,有一個不同的暱稱(代表打高爾夫球的水平)。 +在高爾夫遊戲中,每個洞都有自己的標準桿數`par`,意思是一個高爾夫球員爲了把球打進洞裏完成比賽,預計要揮杆的平均次數 `strokes`。 根據你把球打進洞所揮杆的次數 `strokes` 高於或低於 `par` 多少,有一個不同的暱稱(代表打高爾夫球的水平)。 函數將會傳送兩個參數,`par` 和 `strokes`。 根據下表返回正確的字符串。下表列出不同揮杆次數(從高到低)對應的字符串。 diff --git a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/iterate-with-javascript-do...while-loops.md b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/iterate-with-javascript-do...while-loops.md index 9eb71f2857f3d3..1c611e6d48e62d 100644 --- a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/iterate-with-javascript-do...while-loops.md +++ b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/iterate-with-javascript-do...while-loops.md @@ -21,7 +21,7 @@ do { } while (i < 5); ``` -上面的示例行爲類似於其他類型的循環,由此產生的數組將看起來像 `[0, 1, 2, 3, 4]`。 然而,`do...while` 不同於其他循環的地方,是第一次循環檢查失敗時的行爲。 讓我們看看代碼中的區別:這裏是一個常規的 `while` 循環,只要 `i < 5`,就會在循環中運行代碼: +上面的示例行爲類似於其他類型的循環,由此產生的數組將看起來像 `[0, 1, 2, 3, 4]`。 然而,`do...while` 不同於其他循環的地方,是第一次循環檢查失敗時的行爲。 讓我們看看代碼示例。 這裏是一個常規的 `while` 循環,只要 `i < 5`,就會在循環中運行代碼: ```js const ourArray = []; diff --git a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/return-early-pattern-for-functions.md b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/return-early-pattern-for-functions.md index 0f3506948b9461..1ce471dbbb4aa2 100644 --- a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/return-early-pattern-for-functions.md +++ b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/return-early-pattern-for-functions.md @@ -29,7 +29,7 @@ myFun(); 修改函數 `abTest` 當 `a` 或 `b` 小於 `0` 時,函數立即返回一個 `undefined` 並退出。 **提示** -記住 [`undefined` 是一個關鍵字](https://chinese.freecodecamp.org/news/how-to-install-arch-linux/#how-to-install-arch-linux),而不是一個字符串。 +記住 undefined 是關鍵字 ,不是字符串. # --hints-- diff --git a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/returning-boolean-values-from-functions.md b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/returning-boolean-values-from-functions.md index f4a451224064c0..cae224e413c365 100644 --- a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/returning-boolean-values-from-functions.md +++ b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/returning-boolean-values-from-functions.md @@ -9,7 +9,7 @@ dashedName: returning-boolean-values-from-functions # --description-- -你應該還記得[相等運算符](/learn/javascript-algorithms-and-data-structures/basic-javascript/comparison-with-the-equality-operator)這道挑戰題。 在那裏我們提到,所有比較操作符都會返回 boolean:要麼是 `true` 要麼是 `false`。 +你應該還記得 相等運算符 這道挑戰題。在那裏我們提到,所有比較操作符都會返回布爾值:要麼是`true`,要麼是`false`。 有時人們通過 `if/else` 語句來做比較,像這樣。 diff --git a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/use-recursion-to-create-a-countdown.md b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/use-recursion-to-create-a-countdown.md index ad360925158bb3..830cd6c96096a4 100644 --- a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/use-recursion-to-create-a-countdown.md +++ b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/use-recursion-to-create-a-countdown.md @@ -8,7 +8,7 @@ dashedName: use-recursion-to-create-a-countdown # --description-- -在上一個[挑戰](/learn/javascript-algorithms-and-data-structures/basic-javascript/replace-loops-using-recursion),學習了怎樣用遞歸來代替 `for` 循環。 現在來學習一個更復雜的函數,函數返回一個從 `1` 到傳遞給函數的指定數字的連續數字數組。 +在上一個挑戰中,你學習了怎樣用遞歸來代替 `for` 循環。 現在來學習一個更復雜的函數,函數返回一個從 `1` 到傳遞給函數的指定數字的連續數字數組。 正如上一個挑戰提到的,會有一個 base case。 base case 告訴遞歸函數什麼時候不再需要調用其自身。 這是簡單 情況,返回得到的值。 還有 recursive call,繼續用不同的參數調用自身。 如果函數無誤,一直執行直到 base case 爲止。 diff --git a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/using-objects-for-lookups.md b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/using-objects-for-lookups.md index 009bbea997d8d9..8c9daa67762399 100644 --- a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/using-objects-for-lookups.md +++ b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/using-objects-for-lookups.md @@ -25,14 +25,14 @@ const alpha = { 26:"A" }; -alpha[2]; -alpha[24]; +const thirdLetter = alpha[2]; +const lastLetter = alpha[24]; const value = 2; -alpha[value]; +const valueLookup = alpha[value]; ``` -`alpha[2]` 是字符串 `Y`,`alpha[24]` 是字符串 `C`,`alpha[value]` 是字符串 `Y`。 +`thirdLetter` 是字符串 `Y`,`lastLetter` 是字符串 `C`,`valueLookup` 是字符串 `Y`。 # --instructions-- diff --git a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/word-blanks.md b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/word-blanks.md index 23a1655c388641..a6d73aa9c14d0e 100644 --- a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/word-blanks.md +++ b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/basic-javascript/word-blanks.md @@ -9,11 +9,9 @@ dashedName: word-blanks # --description-- -現在,我們來用字符串的相關知識實現一個 "[Mad Libs](https://en.wikipedia.org/wiki/Mad_Libs)" 類的文字遊戲,稱爲 "Word Blanks"。 你將創建一個(可選幽默的)“填空”樣式句子。 +給你一些不完整的句子,這些句子會缺少一些例如名詞、動詞、形容詞或者副詞之類的字詞。 然後你需要使用你選擇的詞語去填補這些缺失的地方,使得這個句子變得完整且有意義。 -在 "Mad Libs" 遊戲中,提供一個缺少一些單詞的句子,缺少的單詞包括名詞、動詞、形容詞和副詞等。 然後,你選擇一些單詞填寫句子缺失的地方,使句子完整並且有意義。 - -思考一下這句話 - It was really **\_\_\_\_**, and we **\_\_\_\_** ourselves **\_\_\_\_**。 這句話有三個缺失的部分 - 形容詞、動詞和副詞,選擇合適單詞填入完成它。 然後將完成的句子賦值給變量,如下所示: +思考一下這個句子:它真的非常**\_\_\_\_**,我們**\_\_\_\_**我們自己**\_\_\_\_**。 這個句子有三處缺失:一個形容詞、一個動詞和一個副詞。我們可以將選擇的詞語加進去完成它。 然後我們可以將完成的句子賦給一個變量,如下所示: ```js const sentence = "It was really " + "hot" + ", and we " + "laughed" + " ourselves " + "silly" + "."; @@ -21,21 +19,21 @@ const sentence = "It was really " + "hot" + ", and we " + "laughed" + " ourselve # --instructions-- -在這個挑戰中,我們爲你提供名詞、動詞、形容詞和副詞。 你需要使用合適單詞以及我們提供的單詞來形成完整的句子。 +在這個挑戰中,我們會提供給你一個名詞、一個動詞、一個形容詞和一個副詞。 你需要在我們提供的詞語中,選擇你要使用的詞語來使這個句子變得完整。 -你需要使用字符串連接運算符 `+` 來拼接字符串變量:`myNoun`、`myAdjective`、`myVerb` 和 `myAdverb` 來構建一個新字符串。 然後,將新字符串賦給 `wordBlanks` 變量。 您不應該更改分配給變量的單詞。 +你需要使用字符串連接操作符 `+` 和提供的變量 `myNoun`、`myAdjective`、`myVerb` 和 `myAdverb` 來構建一個新的字符串。 然後,將這個改好的新字符串賦值給 `wordBlanks` 變量。 不要去更改已經賦值給這些變量的單詞。 -你還需要考慮字符串中的空格,確保句子的所有單詞之間有空格。 結果應該是一個完整的句子。 +你還需要確認字符串裏的空格,以確保最後的句子裏的每個單詞之間都有空格。 最後的結果應該是一個完整的句子。 # --hints-- -`wordBlanks` 應該返回一個字符串。 +`wordBlanks` 應該是一個字符串. ```js assert(typeof wordBlanks === 'string'); ``` -不能改變 `myNoun`、`myVerb`、`myAdjective` 或者 `myAdverb` 的值。 +不要改變賦值給 `myNoun`, `myVerb`、`myAdjective` 或者`myAdverb` 這些變量的值。 ```js assert( @@ -46,7 +44,7 @@ assert( ); ``` -您不應該直接使用 `dog`、`ran`、`big` 或 `quickly` 來創建 `wordBlanks`。 +不要直接使用 `dog`、`ran`、`big` 或者 `quickly` 的值去創建 `wordBlanks`。 ```js const newCode = removeAssignments(code); @@ -58,7 +56,7 @@ assert( ); ``` -`wordBlanks` 應包含賦值給變量 `myNoun`、`myVerb`、`myAdjective` 和 `myAdverb` 的所有單詞,並用非單詞字符(以及 madlib 中的其它單詞)分隔。 +`wordBlanks` 應該包含分配給變量 `myNoun`、`myVerb`、`myAdjective` 和 `myAdverb` 的所有單詞,用非單詞字符(和你選擇的任何其他單詞)分隔。 ```js assert( diff --git a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/es6/compare-scopes-of-the-var-and-let-keywords.md b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/es6/compare-scopes-of-the-var-and-let-keywords.md index d9bcb65e7cefbf..212ee120458556 100644 --- a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/es6/compare-scopes-of-the-var-and-let-keywords.md +++ b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/es6/compare-scopes-of-the-var-and-let-keywords.md @@ -8,7 +8,7 @@ dashedName: compare-scopes-of-the-var-and-let-keywords # --description-- -如果你不熟悉 `let`,請查看 [這個挑戰](/learn/javascript-algorithms-and-data-structures/basic-javascript/explore-differences-between-the-var-and-let-keywords)。 +如果你不熟悉 `let`的話, 請查看 這個介紹 letvar 關鍵字之間的差異的挑戰 使用 `var` 關鍵字聲明變量時,它是全局聲明的,如果在函數內部聲明則是局部聲明的。 diff --git a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/functional-programming/understand-functional-programming-terminology.md b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/functional-programming/understand-functional-programming-terminology.md index 5dd2bccb00cd9d..1bc630dc413529 100644 --- a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/functional-programming/understand-functional-programming-terminology.md +++ b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/functional-programming/understand-functional-programming-terminology.md @@ -18,7 +18,7 @@ FCC 團隊需求有變更,現在想要兩種茶:綠茶(green tea)和紅 函數就像其他正常值一樣,可以賦值給變量、傳遞給另一個函數,或從其它函數返回,這種函數叫做頭等 first class 函數。 在 JavaScript 中,所有函數都是頭等函數。 -將函數爲參數或返回值的函數叫做高階 ( higher order) 函數。 +將函數作爲參數或將函數作爲返回值返回的函數叫作高階函數。 當函數被傳遞給另一個函數或從另一個函數返回時,那些傳入或返回的函數可以叫做 lambda。 diff --git a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/dna-pairing.md b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/dna-pairing.md index cb00fb35bf42f5..5b5b00f8f3fa60 100644 --- a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/dna-pairing.md +++ b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/dna-pairing.md @@ -1,22 +1,20 @@ --- id: afd15382cdfb22c9efe8b7de title: DNA 配對 -challengeType: 5 +challengeType: 1 forumTopicId: 16009 dashedName: dna-pairing --- # --description-- -給出的 DNA 鏈上缺少配對元素。 請基於每個字符,獲取與其配對的元素,並將結果作爲二維數組返回。 +脫氧核糖核酸組由核酸對組成。 基本配對的字符是 AT and CG,這些字符形成了 DNA 雙螺旋的構件。 -DNA 的[鹼基對](http://en.wikipedia.org/wiki/Base_pair) 有兩種形式:一種是 A 與 T,一種是 C 與 G。 請爲參數中給出的每個字符配對相應的鹼基。 - -注意,參數中給出的字符應作爲每個子數組中的第一個元素返回。 +DNA 鏈缺少配對元素。 寫一個函數來匹配缺失的 DNA 字符串。 對於提供的字符串中的每個字符,找出基本的配對字符。 返回二維數組的結果。 例如,傳入 `GCG` 時,應返回 `[["G", "C"], ["C","G"], ["G", "C"]]`。 -字符和它的配對組成一個數組中,所有配對數組放在一個數組裏。 +字符和它的配對組成一個數組,所有配對數組放在一個數組裏。 # --hints-- diff --git a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/map-the-debris.md b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/map-the-debris.md index 821ecee1b1ffac..55c881dbffa407 100644 --- a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/map-the-debris.md +++ b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/map-the-debris.md @@ -1,20 +1,27 @@ --- id: af4afb223120f7348cdfc9fd title: 計算軌道週期 -challengeType: 5 +challengeType: 1 forumTopicId: 16021 dashedName: map-the-debris --- # --description-- -在這道題目中,我們需要寫一個計算天體軌道週期(單位是秒)的函數。 +根據開普勒第三定律,在環狀或橢圓軌道上在軌兩個點質量的 $T$ 軌道期爲: -它接收一個對象數組參數 arr,對象中包含表示天體名稱的 name 屬性,及表示天體表面平均海拔的 avgAlt 屬性。 就像這樣:`{name: 'name', avgAlt: avgAlt}`。 +$$ T = 2 \pi \sqrt{\frac{a^{3}}{\mu}} $$ -你可以在這條[維基百科](http://en.wikipedia.org/wiki/Orbital_period)的鏈接中找到軌道週期的計算公式: +- $a$ 是軌道的半主軸 +- $μ = GM$ 是標準重力參數 +- $G$ 是引力常量 +- $M$ 是較大天體的質量 -最終的計算結果應取整到最接近的整數。 在這裏計算地球的軌道週期。 +返回一個新數組,將元素的平均高度轉換爲軌道週期(以秒爲單位)。 + +數組將包含 `{name: 'name', avgAlt: avgAlt}` 格式的對象 。 + +最終的計算結果應取整到最接近的整數。 正在軌道上的物體是地球。 地球半徑爲 6367.4447 公里,地球的 GM 值爲 398600.4418 km 3 s -2 。 diff --git a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/roman-numeral-converter.md b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/roman-numeral-converter.md index 6b006547bcd105..474fa4c1ad3aac 100644 --- a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/roman-numeral-converter.md +++ b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/roman-numeral-converter.md @@ -10,7 +10,23 @@ dashedName: roman-numeral-converter 把傳入的數字轉爲羅馬數字。 -轉換後的[羅馬數字](http://www.mathsisfun.com/roman-numerals.html)字母必須都是大寫。 +| 羅馬數字 | 阿拉伯數字 | +| ---- | ----- | +| M | 1000 | +| CM | 900 | +| D | 500 | +| CD | 400 | +| C | 100 | +| XC | 90 | +| L | 50 | +| XL | 40 | +| X | 10 | +| IX | 9 | +| V | 5 | +| IV | 4 | +| I | 1 | + +所有羅馬數字答案都應該大寫。 # --hints-- diff --git a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/telephone-number-validator.md b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/telephone-number-validator.md index acb1bc3ec8e556..a15dcc4bbff044 100644 --- a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/telephone-number-validator.md +++ b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/telephone-number-validator.md @@ -12,7 +12,7 @@ dashedName: telephone-number-validator 只要是有效的美國電話號碼的格式,用戶可以按照他們的方式填寫表單中的電話號碼。 以下是一些正確的例子(其他格式變形請參考以下例子): -
    555-555-5555
    (555)555-5555
    (555)555-5555
    555 555 5555
    5555555555
    1 555 555 5555
    +
    555-555-5555
    (555)555-5555
    (555) 555-5555
    555 555 5555
    5555555555
    1 555 555 5555
    在這個挑戰中,參數可能是 `800-692-7753` 或者 `8oo-six427676;laskdjf` 的號碼。 你的任務是根據上面不同的格式組合,判斷它是否爲有效的電話號碼。 其中,地區碼(電話號碼中的前三位)是必須的。 如果提供國家代碼,則國家代碼只能爲 `1`。 如果傳入的參數是有效的美國電話號碼就返回 `true`,否則返回 `false`。 diff --git a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/regular-expressions/find-more-than-the-first-match.md b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/regular-expressions/find-more-than-the-first-match.md index 43101d69eeb1cc..efd9db720bd0dc 100644 --- a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/regular-expressions/find-more-than-the-first-match.md +++ b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/regular-expressions/find-more-than-the-first-match.md @@ -18,7 +18,7 @@ testStr.match(ourRegex); 在這裏 `match` 將返回 `["Repeat"]`。 -若要多次搜尋或提取模式匹配,可以使用 `g` 標誌。 +要多次搜索或提取模型,你可以使用全局搜索標誌: `g`。 ```js let repeatRegex = /Repeat/g; diff --git a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-algorithm-scripting/convert-celsius-to-fahrenheit.md b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-algorithm-scripting/convert-celsius-to-fahrenheit.md index 160ec0143a7894..cccf06144f17f4 100644 --- a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-algorithm-scripting/convert-celsius-to-fahrenheit.md +++ b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-algorithm-scripting/convert-celsius-to-fahrenheit.md @@ -14,40 +14,40 @@ dashedName: convert-celsius-to-fahrenheit # --hints-- -`convertToF(0)` 应返回一个数字。 +`convertCtoF(0)` 应该返回一个数字 ```js -assert(typeof convertToF(0) === 'number'); +assert(typeof convertCtoF(0) === 'number'); ``` -`convertToF(-30)` 应返回 `-22`。 +`convertCtoF(-30)` 应该返回 `-22` 的值 ```js -assert(convertToF(-30) === -22); +assert(convertCtoF(-30) === -22); ``` -`convertToF(-10)` 应返回 `14`。 +`convertCtoF(-10)` 应该返回 `14` 的值 ```js -assert(convertToF(-10) === 14); +assert(convertCtoF(-10) === 14); ``` -`convertToF(0)` 应返回 `32`。 +`convertCtoF(0)` 应该返回 `32` 的值 ```js -assert(convertToF(0) === 32); +assert(convertCtoF(0) === 32); ``` -`convertToF(20)` 应返回 `68`。 +`convertCtoF(20)` 应该返回 `68` 的值 ```js -assert(convertToF(20) === 68); +assert(convertCtoF(20) === 68); ``` -`convertToF(30)` 应返回 `86`。 +`convertCtoF(30)` 应该返回 `86` 的值 ```js -assert(convertToF(30) === 86); +assert(convertCtoF(30) === 86); ``` # --seed-- @@ -55,22 +55,21 @@ assert(convertToF(30) === 86); ## --seed-contents-- ```js -function convertToF(celsius) { +function convertCtoF(celsius) { let fahrenheit; return fahrenheit; } -convertToF(30); +convertCtoF(30); ``` # --solutions-- ```js -function convertToF(celsius) { +function convertCtoF(celsius) { let fahrenheit = celsius * 9/5 + 32; - return fahrenheit; } -convertToF(30); +convertCtoF(30); ``` diff --git a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-data-structures/generate-an-array-of-all-object-keys-with-object.keys.md b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-data-structures/generate-an-array-of-all-object-keys-with-object.keys.md index b5b6e308fc7742..a85bcc6aa3145c 100644 --- a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-data-structures/generate-an-array-of-all-object-keys-with-object.keys.md +++ b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-data-structures/generate-an-array-of-all-object-keys-with-object.keys.md @@ -8,7 +8,7 @@ dashedName: generate-an-array-of-all-object-keys-with-object-keys # --description-- -我们可以给 `Object.keys()` 方法传入一个对象作为参数,来生成包含对象所有键的数组。 这会返回一个由对象中所有属性(字符串)组成的数组。 需要注意的是,数组中元素的顺序是不确定的。 +我们可以给 `Object.keys()` 方法传入一个对象作为参数,来生成包含对象所有键的数组。 这个方法将对象作为参数并返回代表对象中每个属性的字符串数组。 需要注意的是,数组中元素的顺序是不确定的。 # --instructions-- diff --git a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-data-structures/iterate-through-the-keys-of-an-object-with-a-for...in-statement.md b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-data-structures/iterate-through-the-keys-of-an-object-with-a-for...in-statement.md index 2278d103cabc83..d4d6a2855a9327 100644 --- a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-data-structures/iterate-through-the-keys-of-an-object-with-a-for...in-statement.md +++ b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-data-structures/iterate-through-the-keys-of-an-object-with-a-for...in-statement.md @@ -16,7 +16,7 @@ for (let user in users) { } ``` -这将在控制台打印 `Alan`、`Jeff`、`Sarah` 和 `Ryan` - 每个值占一行。 +这将记录 `Alan`、`Jeff` 和 `Sarah` - 每个值都在自己的行中。 在上面的代码中,我们定义了一个 `user` 变量。 可以观察到,这个变量在遍历对象的语句执行过程中会一直被重置并赋予新值,结果就是不同的用户名打印到了 console 中。 diff --git a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/access-multi-dimensional-arrays-with-indexes.md b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/access-multi-dimensional-arrays-with-indexes.md index f59a45b5753e84..40d9a4b65454ff 100644 --- a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/access-multi-dimensional-arrays-with-indexes.md +++ b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/access-multi-dimensional-arrays-with-indexes.md @@ -21,12 +21,12 @@ const arr = [ [[10, 11, 12], 13, 14] ]; -arr[3]; -arr[3][0]; -arr[3][0][1]; +const subarray = arr[3]; +const nestedSubarray = arr[3][0]; +const element = arr[3][0][1]; ``` -`arr[3]` 为 `[[10, 11, 12], 13, 14]`,`arr[3][0]` 为 `[10, 11, 12]`,并且 `arr[3][0][1]` 为 `11`。 +在这个例子中,`subarray` 的值为 `[[10, 11, 12], 13, 14]`, `nestedSubarray` 的值为 `[10, 11, 12]`,`element` 的值为 `11` 。 **注意:** 数组名与方括号之间不应该有任何空格,比如 `array [0][0]` 甚至是 `array [0] [0]` 都是不允许的。 尽管 JavaScript 能够正确处理这种情况,但是当其他程序员阅读你写的代码时,这可能让他们感到困惑。 diff --git a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/assignment-with-a-returned-value.md b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/assignment-with-a-returned-value.md index 1f45c15abba141..4b03a286f4b7cd 100644 --- a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/assignment-with-a-returned-value.md +++ b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/assignment-with-a-returned-value.md @@ -9,7 +9,7 @@ dashedName: assignment-with-a-returned-value # --description-- -如果你还记得我们在[使用赋值运算符存储值](/learn/javascript-algorithms-and-data-structures/basic-javascript/storing-values-with-the-assignment-operator)中的讨论的话,等号右侧的所有操作都会在赋值之前完成。 这意味着我们可以获取函数的返回值,并将其赋值给一个变量。 +如果你还记得我们在这一节使用赋值运算符存储值中的讨论,赋值之前,先完成等号右边的操作。 这意味着我们可以获取函数的返回值,并将其赋值给一个变量。 假设我们有一个预先定义的函数 `sum` ,它将两个数相加,然后: diff --git a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/concatenating-strings-with-plus-operator.md b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/concatenating-strings-with-plus-operator.md index 36d5680572354a..21fad49fda2035 100644 --- a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/concatenating-strings-with-plus-operator.md +++ b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/concatenating-strings-with-plus-operator.md @@ -32,13 +32,19 @@ const ourStr = "I come first. " + "I come second."; # --hints-- -`myStr` 的值应该是 `This is the start. This is the end.` +`myStr` 应该在两个字符串之间有一个空格字符。 + +```js +assert(/start\. This/.test(myStr)); +``` + +`myStr` 的值应该是字符串 `This is the start. This is the end.` ```js assert(myStr === 'This is the start. This is the end.'); ``` -应使用 `+` 操作符创建 `myStr`。 +应该使用 `+` 运算符来构建 `myStr`。 ```js assert(code.match(/(["']).*\1\s*\+\s*(["']).*\2/g)); @@ -50,7 +56,7 @@ assert(code.match(/(["']).*\1\s*\+\s*(["']).*\2/g)); assert(/const\s+myStr/.test(code)); ``` -应把结果赋值给 `myStr` 变量。 +应该将结果分配给 `myStr` 变量。 ```js assert(/myStr\s*=/.test(code)); diff --git a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/concatenating-strings-with-the-plus-equals-operator.md b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/concatenating-strings-with-the-plus-equals-operator.md index 72e538fae15753..2c62ea85d774be 100644 --- a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/concatenating-strings-with-the-plus-equals-operator.md +++ b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/concatenating-strings-with-the-plus-equals-operator.md @@ -28,6 +28,12 @@ ourStr += "I come second."; # --hints-- +`myStr` 应该在两个字符串之间有一个空格字符。 + +```js +assert(/sentence\. This/.test(myStr)); +``` + `myStr` 的值应该是字符串 `This is the first sentence. This is the second sentence.` ```js diff --git a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/constructing-strings-with-variables.md b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/constructing-strings-with-variables.md index 1376c034709250..5a835cf0a5427e 100644 --- a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/constructing-strings-with-variables.md +++ b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/constructing-strings-with-variables.md @@ -9,7 +9,7 @@ dashedName: constructing-strings-with-variables # --description-- -有时候你需要创建一个类似 [Mad Libs](https://en.wikipedia.org/wiki/Mad_Libs)(填词游戏)风格的字符串。 通过使用连接运算符(`+`),你可以插入一个或多个变量来组成一个字符串。 +有时候你需要构建一个字符串。 通过使用连接运算符(`+`),你可以插入一个或多个变量来组成一个字符串。 例如: diff --git a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/counting-cards.md b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/counting-cards.md index 251ccf7b2b7f33..9b144cdb30ea38 100644 --- a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/counting-cards.md +++ b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/counting-cards.md @@ -9,7 +9,7 @@ dashedName: counting-cards # --description-- -在赌场 21 点游戏中,玩家可以通过计算牌桌上已经发放的卡牌的高低值来让自己在游戏中保持优势。 这就叫 [21 点算法](https://en.wikipedia.org/wiki/Card_counting)。 +在 21 点游戏中,玩家可以通过计算牌桌上已经发放的卡牌的高低值来让自己在游戏中保持优势。 这被称为卡片计数。 牌桌上的大值的卡牌更多,对玩家有利。 根据下面的表格,每张卡牌都被分配了一个值。 如果卡牌的值大于 0,那么玩家应该追加赌注。 如果卡牌的值为 0 或负数,玩家应该追加少许赌注甚至不追加赌注。 @@ -25,6 +25,19 @@ dashedName: counting-cards # --hints-- +你的函数应返回计数值和文本(`Bet` 或 `Hold`),它们之间有一个空格字符。 + +```js +assert(// + (function () { + count = 0; + let out = cc(10); + const hasSpace = /-?\d+ (Bet|Hold)/.test('' + out); + return hasSpace; + })() +); +``` + 卡片序列 2、3、4、5、6 应返回字符串 `5 Bet` ```js @@ -44,7 +57,7 @@ assert( ); ``` -卡牌序列 7、8、9 应该返回 `0 Hold` +卡片序列 7、8、9 应返回字符串 `0 Hold` ```js assert( @@ -61,7 +74,7 @@ assert( ); ``` -卡牌序列 10、J、Q、K、A 应该返回 `-5 Hold` +卡片序列 10、J、Q、K、A 应返回字符串 `-5 Hold` ```js assert( @@ -80,7 +93,7 @@ assert( ); ``` -卡牌序列 3、7、Q、8、A 应该返回 `-1 Hold` +卡片序列 3、7、Q、8、A 应返回字符串 `-1 Hold` ```js assert( @@ -99,7 +112,7 @@ assert( ); ``` -卡牌序列 2、J、9、2、7 应该返回 `1 Bet` +卡片序列 2、J、9、2、7 应返回字符串 `1 Bet` ```js assert( @@ -118,7 +131,7 @@ assert( ); ``` -卡牌序列 2、2、10 应该返回 `1 Bet` +卡片序列 2、2、10 应返回字符串 `1 Bet` ```js assert( @@ -135,7 +148,7 @@ assert( ); ``` -卡牌序列 3、2、A、10、K 应该返回 `-1 Hold` +卡片序列 3、2、A、10、K 应返回字符串 `-1 Hold` ```js assert( diff --git a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/create-decimal-numbers-with-javascript.md b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/create-decimal-numbers-with-javascript.md index f4a2fd37a75a94..1b8ed8d20940b3 100644 --- a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/create-decimal-numbers-with-javascript.md +++ b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/create-decimal-numbers-with-javascript.md @@ -11,7 +11,7 @@ dashedName: create-decimal-numbers-with-javascript 我们也可以把小数存储到变量中。 小数有时候也被称作浮点数或者 floats。 -**提示:** 不是所有的实数都可以用浮点数(floating point)来表示。 因为可能产生四舍五入的错误, [点击这里了解细节](https://en.wikipedia.org/wiki/Floating-point_arithmetic#Accuracy_problems)。 +**注意:** 当你计算数字时,它们是以有限的精确度计算的。 使用浮点数的运算可能产生不同于预期结果的结果。 如果你生成了一个非预期的结果,请在 freeCodeCamp 论坛上创建一个话题进行说明。 # --instructions-- diff --git a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/declare-a-read-only-variable-with-the-const-keyword.md b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/declare-a-read-only-variable-with-the-const-keyword.md index 77ad94805d9824..59ecfa39b64bd3 100644 --- a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/declare-a-read-only-variable-with-the-const-keyword.md +++ b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/declare-a-read-only-variable-with-the-const-keyword.md @@ -25,7 +25,7 @@ FAV_PET = "Dogs"; # --instructions-- -更改代码,以便使用 `let` 或 `const` 声明所有变量。 当你想要改变变量时使用 `let`,当你想要变量保持不变时使用 `const`。 此外,重命名使用 `const` 声明的变量以符合惯例。 +更改代码,以便使用 `let` 或 `const` 声明所有变量。 当你想要改变变量时使用 `let`,当你想要变量保持不变时使用 `const`。 此外,重命名使用 `const` 声明的变量以符合惯例。 请勿更改分配给变量的字符串。 # --hints-- @@ -45,10 +45,15 @@ assert.notMatch(code, /(fCC)/); `FCC` 应该是一个用 `const` 声明的常量。 ```js -assert.equal(FCC, 'freeCodeCamp'); assert.match(code, /const\s+FCC/); ``` +分配给 `FCC` 的字符串不应更改。 + +```js +assert.equal(FCC, 'freeCodeCamp'); +``` + `fact` 应该用 `let` 声明。 ```js diff --git a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/escaping-literal-quotes-in-strings.md b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/escaping-literal-quotes-in-strings.md index 12d0718e3359e4..dc2d088dfc195c 100644 --- a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/escaping-literal-quotes-in-strings.md +++ b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/escaping-literal-quotes-in-strings.md @@ -39,7 +39,7 @@ I am a "double quoted" string inside "double quotes". assert(code.match(/\\"/g).length === 4 && code.match(/[^\\]"/g).length === 2); ``` -变量 myStr 应该包含字符串 `I am a "double quoted" string inside "double quotes".` +变量 `myStr` 应该包含字符串 `I am a "double quoted" string inside "double quotes".` ```js assert(/I am a "double quoted" string inside "double quotes(\."|"\.)$/.test(myStr)); diff --git a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/generate-random-fractions-with-javascript.md b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/generate-random-fractions-with-javascript.md index 5706d0d2a34f75..4ce91e487c7376 100644 --- a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/generate-random-fractions-with-javascript.md +++ b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/generate-random-fractions-with-javascript.md @@ -13,7 +13,7 @@ dashedName: generate-random-fractions-with-javascript 在 JavaScript 中,可以用 `Math.random()` 生成一个在`0`(包括 0)到 `1`(不包括 1)之间的随机小数。 因此 `Math.random()` 可能返回 `0`,但绝不会返回 `1`。 -**提示:**[使用赋值运算符存储值](/learn/javascript-algorithms-and-data-structures/basic-javascript/storing-values-with-the-assignment-operator)这一节讲过,所有函数调用将在 `return` 执行之前结束,因此我们可以 `return`(返回)`Math.random()` 函数的值。 +**提示:**使用赋值运算符存储值这一节讲过,所有函数调用将在 `return` 执行之前结束,因此我们可以 `return`(返回)`Math.random()` 函数的值。 # --instructions-- diff --git a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/global-scope-and-functions.md b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/global-scope-and-functions.md index bcf2885307f3c1..2070e38ce4e8e3 100644 --- a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/global-scope-and-functions.md +++ b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/global-scope-and-functions.md @@ -17,7 +17,7 @@ dashedName: global-scope-and-functions 使用 `let` 或 `const`,在任何函数之外声明一个名为 `myGlobal` 的全局变量。 并给它一个初始值 `10`。 -在函数 `fun1` 中,***不要*** 使用 `let` 或 `const` 关键字,将 `5` 分配给 `oopsGlobal` 。 +在函数 `fun1`中,赋值 `5` 给 `oopsGlobal`,***不使用*** `var`、`let` 或 `const` 关键字。 # --hints-- diff --git a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/golf-code.md b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/golf-code.md index ad741ccb52a0c8..a7d91c4d6caaf6 100644 --- a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/golf-code.md +++ b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/golf-code.md @@ -9,7 +9,7 @@ dashedName: golf-code # --description-- -在[高尔夫](https://en.wikipedia.org/wiki/Golf)游戏中,每个洞都有自己的标准杆数 `par`,代表着把球打进洞所挥杆的平均次数 `strokes`。 根据你把球打进洞所挥杆的次数 `strokes` 高于或低于 `par` 多少,有一个不同的昵称(代表打高尔夫球的水平)。 +在高尔夫游戏中,每个洞都有自己的标准杆数`par`,意思是一个高尔夫球员为了把球打进洞里完成比赛,预计要挥杆的平均次数 `strokes`。 根据你把球打进洞所挥杆的次数 `strokes` 高于或低于 `par` 多少,有一个不同的昵称(代表打高尔夫球的水平)。 函数将会传送两个参数,`par` 和 `strokes`。 根据下表返回正确的字符串。下表列出不同挥杆次数(从高到低)对应的字符串。 diff --git a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/iterate-with-javascript-do...while-loops.md b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/iterate-with-javascript-do...while-loops.md index 338de200474d43..3fcbfeb0807f14 100644 --- a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/iterate-with-javascript-do...while-loops.md +++ b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/iterate-with-javascript-do...while-loops.md @@ -21,7 +21,7 @@ do { } while (i < 5); ``` -上面的示例行为类似于其他类型的循环,由此产生的数组将看起来像 `[0, 1, 2, 3, 4]`。 然而,`do...while` 不同于其他循环的地方,是第一次循环检查失败时的行为。 让我们看看代码中的区别:这里是一个常规的 `while` 循环,只要 `i < 5`,就会在循环中运行代码: +上面的示例行为类似于其他类型的循环,由此产生的数组将看起来像 `[0, 1, 2, 3, 4]`。 然而,`do...while` 不同于其他循环的地方,是第一次循环检查失败时的行为。 让我们看看代码示例。 这里是一个常规的 `while` 循环,只要 `i < 5`,就会在循环中运行代码: ```js const ourArray = []; diff --git a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/return-early-pattern-for-functions.md b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/return-early-pattern-for-functions.md index f7ebc2f84f1f17..119f199173ce56 100644 --- a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/return-early-pattern-for-functions.md +++ b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/return-early-pattern-for-functions.md @@ -29,7 +29,7 @@ myFun(); 修改函数 `abTest` 当 `a` 或 `b` 小于 `0` 时,函数立即返回一个 `undefined` 并退出。 **提示** -记住 [`undefined` 是一个关键字](https://chinese.freecodecamp.org/news/how-to-install-arch-linux/#how-to-install-arch-linux),而不是一个字符串。 +记住 undefined 是关键字 ,不是字符串. # --hints-- diff --git a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/returning-boolean-values-from-functions.md b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/returning-boolean-values-from-functions.md index 0c4a9d72ad6612..ef6b4dfa71f1b2 100644 --- a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/returning-boolean-values-from-functions.md +++ b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/returning-boolean-values-from-functions.md @@ -9,7 +9,7 @@ dashedName: returning-boolean-values-from-functions # --description-- -你应该还记得[相等运算符](/learn/javascript-algorithms-and-data-structures/basic-javascript/comparison-with-the-equality-operator)这道挑战题。 在那里我们提到,所有比较操作符都会返回 boolean:要么是 `true` 要么是 `false`。 +你应该还记得 相等运算符 这道挑战题。在那里我们提到,所有比较操作符都会返回布尔值:要么是`true`,要么是`false`。 有时人们通过 `if/else` 语句来做比较,像这样。 diff --git a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/use-recursion-to-create-a-countdown.md b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/use-recursion-to-create-a-countdown.md index 138d65b7f1ba92..1a0482dd519ea5 100644 --- a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/use-recursion-to-create-a-countdown.md +++ b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/use-recursion-to-create-a-countdown.md @@ -8,7 +8,7 @@ dashedName: use-recursion-to-create-a-countdown # --description-- -在上一个[挑战](/learn/javascript-algorithms-and-data-structures/basic-javascript/replace-loops-using-recursion),学习了怎样用递归来代替 `for` 循环。 现在来学习一个更复杂的函数,函数返回一个从 `1` 到传递给函数的指定数字的连续数字数组。 +在上一个挑战中,你学习了怎样用递归来代替 `for` 循环。 现在来学习一个更复杂的函数,函数返回一个从 `1` 到传递给函数的指定数字的连续数字数组。 正如上一个挑战提到的,会有一个 base case。 base case 告诉递归函数什么时候不再需要调用其自身。 这是简单 情况,返回得到的值。 还有 recursive call,继续用不同的参数调用自身。 如果函数无误,一直执行直到 base case 为止。 diff --git a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/using-objects-for-lookups.md b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/using-objects-for-lookups.md index fa7e32d9c243f5..9e19467969c20a 100644 --- a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/using-objects-for-lookups.md +++ b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/using-objects-for-lookups.md @@ -25,14 +25,14 @@ const alpha = { 26:"A" }; -alpha[2]; -alpha[24]; +const thirdLetter = alpha[2]; +const lastLetter = alpha[24]; const value = 2; -alpha[value]; +const valueLookup = alpha[value]; ``` -`alpha[2]` 是字符串 `Y`,`alpha[24]` 是字符串 `C`,`alpha[value]` 是字符串 `Y`。 +`thirdLetter` 是字符串 `Y`,`lastLetter` 是字符串 `C`,`valueLookup` 是字符串 `Y`。 # --instructions-- diff --git a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/word-blanks.md b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/word-blanks.md index db8d8538783070..75231a6ddf0a72 100644 --- a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/word-blanks.md +++ b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/basic-javascript/word-blanks.md @@ -9,11 +9,9 @@ dashedName: word-blanks # --description-- -现在,我们来用字符串的相关知识实现一个 "[Mad Libs](https://en.wikipedia.org/wiki/Mad_Libs)" 类的文字游戏,称为 "Word Blanks"。 你将创建一个(可选幽默的)“填空”样式句子。 +给你一些不完整的句子,这些句子会缺少一些例如名词、动词、形容词或者副词之类的字词。 然后你需要使用你选择的词语去填补这些缺失的地方,使得这个句子变得完整且有意义。 -在 "Mad Libs" 游戏中,提供一个缺少一些单词的句子,缺少的单词包括名词、动词、形容词和副词等。 然后,你选择一些单词填写句子缺失的地方,使句子完整并且有意义。 - -思考一下这句话 - It was really **\_\_\_\_**, and we **\_\_\_\_** ourselves **\_\_\_\_**。 这句话有三个缺失的部分 - 形容词、动词和副词,选择合适单词填入完成它。 然后将完成的句子赋值给变量,如下所示: +思考一下这个句子:它真的非常**\_\_\_\_**,我们**\_\_\_\_**我们自己**\_\_\_\_**。 这个句子有三处缺失:一个形容词、一个动词和一个副词。我们可以将选择的词语加进去完成它。 然后我们可以将完成的句子赋给一个变量,如下所示: ```js const sentence = "It was really " + "hot" + ", and we " + "laughed" + " ourselves " + "silly" + "."; @@ -21,21 +19,21 @@ const sentence = "It was really " + "hot" + ", and we " + "laughed" + " ourselve # --instructions-- -在这个挑战中,我们为你提供名词、动词、形容词和副词。 你需要使用合适单词以及我们提供的单词来形成完整的句子。 +在这个挑战中,我们会提供给你一个名词、一个动词、一个形容词和一个副词。 你需要在我们提供的词语中,选择你要使用的词语来使这个句子变得完整。 -你需要使用字符串连接运算符 `+` 来拼接字符串变量:`myNoun`、`myAdjective`、`myVerb` 和 `myAdverb` 来构建一个新字符串。 然后,将新字符串赋给 `wordBlanks` 变量。 您不应该更改分配给变量的单词。 +你需要使用字符串连接操作符 `+` 和提供的变量 `myNoun`、`myAdjective`、`myVerb` 和 `myAdverb` 来构建一个新的字符串。 然后,将这个改好的新字符串赋值给 `wordBlanks` 变量。 不要去更改已经赋值给这些变量的单词。 -你还需要考虑字符串中的空格,确保句子的所有单词之间有空格。 结果应该是一个完整的句子。 +你还需要确认字符串里的空格,以确保最后的句子里的每个单词之间都有空格。 最后的结果应该是一个完整的句子。 # --hints-- -`wordBlanks` 应该返回一个字符串。 +`wordBlanks` 应该是一个字符串. ```js assert(typeof wordBlanks === 'string'); ``` -不能改变 `myNoun`、`myVerb`、`myAdjective` 或者 `myAdverb` 的值。 +不要改变赋值给 `myNoun`, `myVerb`、`myAdjective` 或者`myAdverb` 这些变量的值。 ```js assert( @@ -46,7 +44,7 @@ assert( ); ``` -您不应该直接使用 `dog`、`ran`、`big` 或 `quickly` 来创建 `wordBlanks`。 +不要直接使用 `dog`、`ran`、`big` 或者 `quickly` 的值去创建 `wordBlanks`。 ```js const newCode = removeAssignments(code); @@ -58,7 +56,7 @@ assert( ); ``` -`wordBlanks` 应包含赋值给变量 `myNoun`、`myVerb`、`myAdjective` 和 `myAdverb` 的所有单词,并用非单词字符(以及 madlib 中的其它单词)分隔。 +`wordBlanks` 应该包含分配给变量 `myNoun`、`myVerb`、`myAdjective` 和 `myAdverb` 的所有单词,用非单词字符(和你选择的任何其他单词)分隔。 ```js assert( diff --git a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/es6/compare-scopes-of-the-var-and-let-keywords.md b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/es6/compare-scopes-of-the-var-and-let-keywords.md index 45c95fc28a4d59..4292606ca7f718 100644 --- a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/es6/compare-scopes-of-the-var-and-let-keywords.md +++ b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/es6/compare-scopes-of-the-var-and-let-keywords.md @@ -8,7 +8,7 @@ dashedName: compare-scopes-of-the-var-and-let-keywords # --description-- -如果你不熟悉 `let`,请查看 [这个挑战](/learn/javascript-algorithms-and-data-structures/basic-javascript/explore-differences-between-the-var-and-let-keywords)。 +如果你不熟悉 `let`的话, 请查看 这个介绍 letvar 关键字之间的差异的挑战 使用 `var` 关键字声明变量时,它是全局声明的,如果在函数内部声明则是局部声明的。 diff --git a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/functional-programming/understand-functional-programming-terminology.md b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/functional-programming/understand-functional-programming-terminology.md index 7ac9ac10c6ebe3..467469a6519e38 100644 --- a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/functional-programming/understand-functional-programming-terminology.md +++ b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/functional-programming/understand-functional-programming-terminology.md @@ -18,7 +18,7 @@ FCC 团队需求有变更,现在想要两种茶:绿茶(green tea)和红 函数就像其他正常值一样,可以赋值给变量、传递给另一个函数,或从其它函数返回,这种函数叫做头等 first class 函数。 在 JavaScript 中,所有函数都是头等函数。 -将函数为参数或返回值的函数叫做高阶 ( higher order) 函数。 +将函数作为参数或将函数作为返回值返回的函数叫作高阶函数。 当函数被传递给另一个函数或从另一个函数返回时,那些传入或返回的函数可以叫做 lambda。 diff --git a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/dna-pairing.md b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/dna-pairing.md index 6b26aa7ca1f71f..143f4c797c39a0 100644 --- a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/dna-pairing.md +++ b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/dna-pairing.md @@ -1,22 +1,20 @@ --- id: afd15382cdfb22c9efe8b7de title: DNA 配对 -challengeType: 5 +challengeType: 1 forumTopicId: 16009 dashedName: dna-pairing --- # --description-- -给出的 DNA 链上缺少配对元素。 请基于每个字符,获取与其配对的元素,并将结果作为二维数组返回。 +脱氧核糖核酸组由核酸对组成。 基本配对的字符是 AT and CG,这些字符形成了 DNA 双螺旋的构件。 -DNA 的[碱基对](http://en.wikipedia.org/wiki/Base_pair) 有两种形式:一种是 A 与 T,一种是 C 与 G。 请为参数中给出的每个字符配对相应的碱基。 - -注意,参数中给出的字符应作为每个子数组中的第一个元素返回。 +DNA 链缺少配对元素。 写一个函数来匹配缺失的 DNA 字符串。 对于提供的字符串中的每个字符,找出基本的配对字符。 返回二维数组的结果。 例如,传入 `GCG` 时,应返回 `[["G", "C"], ["C","G"], ["G", "C"]]`。 -字符和它的配对组成一个数组中,所有配对数组放在一个数组里。 +字符和它的配对组成一个数组,所有配对数组放在一个数组里。 # --hints-- diff --git a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/map-the-debris.md b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/map-the-debris.md index d53ca443dbeca0..c5d9e0ffcc4be7 100644 --- a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/map-the-debris.md +++ b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/map-the-debris.md @@ -1,20 +1,27 @@ --- id: af4afb223120f7348cdfc9fd title: 计算轨道周期 -challengeType: 5 +challengeType: 1 forumTopicId: 16021 dashedName: map-the-debris --- # --description-- -在这道题目中,我们需要写一个计算天体轨道周期(单位是秒)的函数。 +根据开普勒第三定律,在环状或椭圆轨道上在轨两个点质量的 $T$ 轨道期为: -它接收一个对象数组参数 arr,对象中包含表示天体名称的 name 属性,及表示天体表面平均海拔的 avgAlt 属性。 就像这样:`{name: 'name', avgAlt: avgAlt}`。 +$$ T = 2 \pi \sqrt{\frac{a^{3}}{\mu}} $$ -你可以在这条[维基百科](http://en.wikipedia.org/wiki/Orbital_period)的链接中找到轨道周期的计算公式: +- $a$ 是轨道的半主轴 +- $μ = GM$ 是标准重力参数 +- $G$ 是引力常量 +- $M$ 是较大天体的质量 -最终的计算结果应取整到最接近的整数。 在这里计算地球的轨道周期。 +返回一个新数组,将元素的平均高度转换为轨道周期(以秒为单位)。 + +数组将包含 `{name: 'name', avgAlt: avgAlt}` 格式的对象 。 + +最终的计算结果应取整到最接近的整数。 正在轨道上的物体是地球。 地球半径为 6367.4447 公里,地球的 GM 值为 398600.4418 km 3 s -2 。 diff --git a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/roman-numeral-converter.md b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/roman-numeral-converter.md index ea66bf38ebb95b..6e4e2519162bfc 100644 --- a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/roman-numeral-converter.md +++ b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/roman-numeral-converter.md @@ -10,7 +10,23 @@ dashedName: roman-numeral-converter 把传入的数字转为罗马数字。 -转换后的[罗马数字](http://www.mathsisfun.com/roman-numerals.html)字母必须都是大写。 +| 罗马数字 | 阿拉伯数字 | +| ---- | ----- | +| M | 1000 | +| CM | 900 | +| D | 500 | +| CD | 400 | +| C | 100 | +| XC | 90 | +| L | 50 | +| XL | 40 | +| X | 10 | +| IX | 9 | +| V | 5 | +| IV | 4 | +| I | 1 | + +所有罗马数字答案都应该大写。 # --hints-- diff --git a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/telephone-number-validator.md b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/telephone-number-validator.md index fcb7dee45c980e..6b2c274694f52f 100644 --- a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/telephone-number-validator.md +++ b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/telephone-number-validator.md @@ -12,7 +12,7 @@ dashedName: telephone-number-validator 只要是有效的美国电话号码的格式,用户可以按照他们的方式填写表单中的电话号码。 以下是一些正确的例子(其他格式变形请参考以下例子): -
    555-555-5555
    (555)555-5555
    (555)555-5555
    555 555 5555
    5555555555
    1 555 555 5555
    +
    555-555-5555
    (555)555-5555
    (555) 555-5555
    555 555 5555
    5555555555
    1 555 555 5555
    在这个挑战中,参数可能是 `800-692-7753` 或者 `8oo-six427676;laskdjf` 的号码。 你的任务是根据上面不同的格式组合,判断它是否为有效的电话号码。 其中,地区码(电话号码中的前三位)是必须的。 如果提供国家代码,则国家代码只能为 `1`。 如果传入的参数是有效的美国电话号码就返回 `true`,否则返回 `false`。 diff --git a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/regular-expressions/find-more-than-the-first-match.md b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/regular-expressions/find-more-than-the-first-match.md index a96dac59fbd9ba..01491519fdfe48 100644 --- a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/regular-expressions/find-more-than-the-first-match.md +++ b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/regular-expressions/find-more-than-the-first-match.md @@ -18,7 +18,7 @@ testStr.match(ourRegex); 在这里 `match` 将返回 `["Repeat"]`。 -若要多次搜寻或提取模式匹配,可以使用 `g` 标志。 +要多次搜索或提取模型,你可以使用全局搜索标志: `g`。 ```js let repeatRegex = /Repeat/g; diff --git a/curriculum/challenges/espanol/01-responsive-web-design/applied-visual-design/adjust-the-hue-of-a-color.md b/curriculum/challenges/espanol/01-responsive-web-design/applied-visual-design/adjust-the-hue-of-a-color.md index 08f8a588e97fbb..ae321d9abd8c1e 100644 --- a/curriculum/challenges/espanol/01-responsive-web-design/applied-visual-design/adjust-the-hue-of-a-color.md +++ b/curriculum/challenges/espanol/01-responsive-web-design/applied-visual-design/adjust-the-hue-of-a-color.md @@ -19,7 +19,7 @@ Se suele pensar que **Hue** es el "color". Si imaginas un espectro de colores co Aquí hay algunos ejemplos de `hsl()` con colores de iluminación normales y completamente saturados: -
    ColorHSL
    rojohsl(0, 100 %, 50 %)
    amarillohsl(60, 100 %, 50 %)
    verdehsl(120, 100 %, 50 %)
    cianhsl(180, 100 %, 50 %)
    azulhsl(240, 100 %, 50 %)
    magentahsl(300, 100 %, 50 %)
    +
    ColorHSL
    rojohsl(0, 100%, 50%)
    amarillohsl(60, 100%, 50%)
    verdehsl(120, 100%, 50%)
    cianhsl(180, 100%, 50%)
    azulhsl(240, 100%, 50%)
    magentahsl(300, 100%, 50%)
    # --instructions-- diff --git a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/functional-programming/understand-functional-programming-terminology.md b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/functional-programming/understand-functional-programming-terminology.md index 49903652292c8e..1c748ae66d7dd4 100644 --- a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/functional-programming/understand-functional-programming-terminology.md +++ b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/functional-programming/understand-functional-programming-terminology.md @@ -18,7 +18,7 @@ Pero primero, cubramos alguna terminología de la programación funcional: Las funciones que pueden ser asignadas a una variable, pasadas a otra función o devueltas desde otra función como cualquier otro valor normal, se llaman funciones de primera clase. En JavaScript, todas las funciones son funciones de primera clase. -Las funciones que toman una función como argumento o devuelven una función como valor de retorno se llaman funciones de orden superior. +Las funciones que toman una función como argumento, o devuelven una función como valor de retorno, se denominan funciones higher order. Cuando las funciones se pasan o se devuelven desde otra función, las funciones que se pasaron o devolvieron se pueden llamar lambda. diff --git a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/wherefore-art-thou.md b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/wherefore-art-thou.md index db82d579ca690b..1f8126609f787a 100644 --- a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/wherefore-art-thou.md +++ b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/wherefore-art-thou.md @@ -97,6 +97,15 @@ assert.deepEqual( ); ``` +`whatIsInAName([{"a": 1, "b": 2, "c": 3, "d": 9999}], {"a": 1, "b": 9999, "c": 3})` debe devolver `[]` + +```js +assert.deepEqual( + whatIsInAName([{ a: 1, b: 2, c: 3, d: 9999 }], { a: 1, b: 9999, c: 3 }), + [] +); +``` + # --seed-- ## --seed-contents-- diff --git a/curriculum/challenges/espanol/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-javascript-calculator.md b/curriculum/challenges/espanol/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-javascript-calculator.md index b51149f1b6c7e6..79af810e54e181 100644 --- a/curriculum/challenges/espanol/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-javascript-calculator.md +++ b/curriculum/challenges/espanol/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-javascript-calculator.md @@ -8,7 +8,7 @@ dashedName: build-a-javascript-calculator # --description-- -**Objetivo:** Crear una aplicación que sea funcionalmente similar a . +**Objetivo:** Crea una aplicación que sea funcionalmente similar a esta: https://codepen.io/freeCodeCamp/full/wgGVVX. Completa las historias de usuario a continuación y obtén todas las pruebas para aprobar. Utiliza cualquier librería o API que necesites. Dale tu propio estilo. @@ -51,7 +51,7 @@ Puedes utilizar cualquier combinación de HTML, JavaScript, CSS, Bootstrap, SASS - **Lógica de ejecución inmediata:** `11.5` - **Fórmula/Expresión lógica:** `32.5` -Puedes construir tu proyecto con usando esta plantilla CodePen y haciendo clic en `Save` para crear tu propio pen. O puedes utilizar este enlace CDN para ejecutar las pruebas en cualquier entorno que desees: `https://cdn.freecodecamp.org/testable-projects-fcc/v1/bundle.js` +Puedes construir tu proyecto utilizando esta plantilla CodePen y haciendo clic en `Save` para crear tu propio bolígrafo. O puedes utilizar este enlace CDN para ejecutar las pruebas en cualquier entorno que desees: `https://cdn.freecodecamp.org/testable-projects-fcc/v1/bundle.js` Una vez que hayas terminado, envía la URL de tu proyecto funcional con todas las pruebas pasadas. diff --git a/curriculum/challenges/german/01-responsive-web-design/responsive-web-design-projects/build-a-tribute-page.md b/curriculum/challenges/german/01-responsive-web-design/responsive-web-design-projects/build-a-tribute-page.md index a48423ca42baca..4c9862087fc1d6 100644 --- a/curriculum/challenges/german/01-responsive-web-design/responsive-web-design-projects/build-a-tribute-page.md +++ b/curriculum/challenges/german/01-responsive-web-design/responsive-web-design-projects/build-a-tribute-page.md @@ -19,7 +19,7 @@ dashedName: build-a-tribute-page 1. Du solltest innerhalb des `#img-div`-Elements ein Element mit zugehöriger `id="img-caption"` sehen, der einen Text enthält, der das in `#img-div` angezeigte Bild beschreibt. 1. Du solltest ein Element mit zugehöriger `id="tribute-info"` sehen, welches das Thema der Gedenkseite beschreibenden Textinhalt enthält 1. Du solltest ein `a`-Element mit zugehöriger `id="tribute-link"` sehen, welches auf eine externe Seite verweist, die zusätzliche Informationen über das Thema der Gedenkseite enthält. TIPP: Du musst deinem Element ein Attribut von `target` zuweisen und es auf `_blank` setzen, damit der Link in einem neuen Tab geöffnet werden kann -1. Dein `#image` sollte die `max-width` und `height` Eigenschaften verwenden, um die Größenänderung responsiv zu gestalten, daher relativ zur Breite des übergeordneten Elements, ohne dessen Originalgröße zu überschreiten +1. Dein `#image` sollte die `max-width`- und `height`-Eigenschaften verwenden, um die Größenänderung responsiv zu gestalten, d. h. relativ zur Breite des Elternelements, ohne dessen Originalgröße zu überschreiten 1. Dein `img`-Element sollte innerhalb des Elternelements zentriert werden Erfülle die folgenden User Stories und bestehe alle Tests, um dieses Projekt abzuschließen. Gib dem Ganzen deinen persönlichen Stil. Viel Spaß beim Programmieren! diff --git a/curriculum/challenges/german/14-responsive-web-design-22/build-a-survey-form-project/build-a-survey-form.md b/curriculum/challenges/german/14-responsive-web-design-22/build-a-survey-form-project/build-a-survey-form.md new file mode 100644 index 00000000000000..251e35f52b0a3b --- /dev/null +++ b/curriculum/challenges/german/14-responsive-web-design-22/build-a-survey-form-project/build-a-survey-form.md @@ -0,0 +1,518 @@ +--- +id: 587d78af367417b2b2512b03 +title: Erstelle ein Umfrageformular +challengeType: 14 +forumTopicId: 301145 +dashedName: build-a-survey-form +--- + +# --description-- + +**Aufgabe:** Erstelle eine Anwendung, die eine ähnliche Funktionalität wie https://survey-form.freecodecamp.rocks aufweist + +**User Stories:** + +1. Du solltest einen Seitentitel in einem `h1`-Element mit einer `id` von `title` haben +1. Du solltest eine kurze Erklärung in einem `p`-Element mit einer `id` von `description` haben +1. Du solltest ein `form`-Element mit einer `id` von `survey-form` haben +1. Innerhalb des Formular-Elements **musst** du deinen Namen in ein `input`-Feld mit einer `id` von `name` und einem `type` von `text` eingeben +1. Innerhalb des Formular-Elements **musst** du deine E-Mail in ein `input`-Feld mit einer `id` von `email` eingeben +1. Wenn du eine falsch formatierte E-Mail angibst, wird dir ein HTML5-Validierungsfehler ausgegeben +1. Innerhalb des Formulars kannst du eine Zahl in das `input`-Feld, das die `id` von `number` hat, eingeben +1. Wenn du eine nicht-numerische Eingabe in das Nummern-Feld eingibst, wird dir ein HTML5-Validierungsfehler ausgegeben +1. Wenn du eine Nummer eingibst, die außerhalb des Bereichs der Zahleneingabe liegt, wird dir ein HTML5-Validierungsfehler ausgegeben. Der genannte Bereich wird durch die `min`- und `max`-Attribute festgelegt +1. Für die Namen-, E-Mail- und Nummern-Eingabefelder findest du zugehörige `label`-Elemente im Formular, welches den Nutzen jedes Felds der folgenden IDs beschreibt: `id="name-label"`, `id="email-label"`, und `id="number-label"` +1. Für die Namen-, E-Mail- und Nummern-Eingabefelder findest du einen Platzhalter-Text, der eine Beschreibung oder Anweisung für jedes Feld enthält +1. Innerhalb des Formular-Elements solltest du ein `select`-Dropdown-Element auffinden, welches sowohl über eine `id` von `dropdown` als auch über mindestens zwei Optionen zum Auswählen verfügt +1. Innerhalb des Fomular-Elements kannst du aus einer Gruppe von mindestens zwei Radio-Buttons, die mit dem `name`-Attribut unterteilt wurden, auswählen +1. Innerhalb des Formular-Elements kannst du mehrere Felder aus einer Reihe von Checkboxen auswählen, die alle über ein `value`-Attribut verfügen müssen +1. Innerhalb des Formular-Elements findest du eine `textarea` mit zusätzlichen Kommentaren +1. Innerhalb des Formular-Elements wird dir ein Button mit der `id` von `submit` angezeigt, um alle Eingaben abzuschicken + +Erfülle die folgenden User Stories und bestehe alle Tests, um dieses Projekt abzuschließen. Gib dem Ganzen deinen persönlichen Stil. Viel Spaß beim Programmieren! + +**Hinweis:** Füge unbedingt `` in dein HTML ein, um dein Stylesheet zu verlinken und dein CSS anzuwenden + +# --hints-- + +Du solltest ein `h1`-Element mit einer `id` von `title` haben. + +```js +const el = document.getElementById('title') +assert(!!el && el.tagName === 'H1') +``` + +Dein `#title` sollte nicht leer sein. + +```js +const el = document.getElementById('title') +assert(!!el && el.innerText.length > 0) +``` + +Du solltest ein `p`-Element mit einer `id` von `description` haben. + +```js +const el = document.getElementById('description') +assert(!!el && el.tagName === 'P') +``` + +Deine `#description` sollte nicht leer sein. + +```js +const el = document.getElementById('description') +assert(!!el && el.innerText.length > 0) +``` + +Du solltest ein `form`-Element mit einer `id` von `survey-form` haben. + +```js +const el = document.getElementById('survey-form') +assert(!!el && el.tagName === 'FORM') +``` + +Du solltest ein `input`-Element mit einer `id` von `name` haben. + +```js +const el = document.getElementById('name') +assert(!!el && el.tagName === 'INPUT') +``` + +Dein `#name` sollte einen `type` von `text` haben. + +```js +const el = document.getElementById('name') +assert(!!el && el.type === 'text') +``` + +Dein `#name` sollte eine Eingabe benötigen. + +```js +const el = document.getElementById('name') +assert(!!el && el.required) +``` + +Dein `#name` sollte ein Nachfahre von `#survey-form` sein. + +```js +const el = document.querySelector('#survey-form #name') +assert(!!el) +``` + +Du solltest ein `input`-Element mit einer `id` von `email` haben. + +```js +const el = document.getElementById('email') +assert(!!el && el.tagName === 'INPUT') +``` + +Deine `#email` sollte einen `type` von `email` haben. + +```js +const el = document.getElementById('email') +assert(!!el && el.type === 'email') +``` + +Deine `#email` sollte eine Eingabe benötigen. + +```js +const el = document.getElementById('email') +assert(!!el && el.required) +``` + +Deine `#email` sollte ein Nachfahre von `#survey-form` sein + +```js +const el = document.querySelector('#survey-form #email') +assert(!!el) +``` + +Du solltest ein `input`-Element mit einer `id` von `number` haben. + +```js +const el = document.getElementById('number') +assert(!!el && el.tagName === 'INPUT') +``` + +Deine `#number` sollte ein Nachfahre von `#survey-form` sein. + +```js +const el = document.querySelector('#survey-form #number') +assert(!!el) +``` + +Deine `#number` sollte einen `type` von `number` haben. + +```js +const el = document.getElementById('number') +assert(!!el && el.type === 'number') +``` + +Deine `#number` sollte ein `min`-Attribut mit einem numerischen Wert haben. + +```js +const el = document.getElementById('number') +assert(!!el && el.min && isFinite(el.min)) +``` + +Deine `#number` sollte ein `max`-Attribut mit einem numerischen Wert haben. + +```js +const el = document.getElementById('number') +assert(!!el && el.max && isFinite(el.max)) +``` + +Du solltest ein `label`-Element mit einer `id` von `name-label` haben. + +```js +const el = document.getElementById('name-label') +assert(!!el && el.tagName === 'LABEL') +``` + +Du solltest ein `label`-Element mit einer `id` von `email-label` haben. + +```js +const el = document.getElementById('email-label') +assert(!!el && el.tagName === 'LABEL') +``` + +Du solltest ein `label`-Element mit einer `id` von `number-label` haben. + +```js +const el = document.getElementById('number-label') +assert(!!el && el.tagName === 'LABEL') +``` + +Dein `#name-label` sollte Text enthalten, der die Eingabe beschreibt. + +```js +const el = document.getElementById('name-label') +assert(!!el && el.innerText.length > 0) +``` + +Dein `#email-label` sollte Text enthalten, der die Eingabe beschreibt. + +```js +const el = document.getElementById('email-label') +assert(!!el && el.innerText.length > 0) +``` + +Dein `#number-label` sollte Text enthalten, der die Eingabe beschreibt. + +```js +const el = document.getElementById('number-label') +assert(!!el && el.innerText.length > 0) +``` + +Dein `#name-label` sollte ein Nachfahre von `#survey-form` sein. + +```js +const el = document.querySelector('#survey-form #name-label') +assert(!!el) +``` + +Dein `#email-label` sollte ein Nachfahre von `#survey-form` sein. + +```js +const el = document.querySelector('#survey-form #email-label') +assert(!!el) +``` + +Dein `#number-label` sollte ein Nachfahre von `#survey-form` sein. + +```js +const el = document.querySelector('#survey-form #number-label') +assert(!!el) +``` + +Dein `#name` sollte einen `placeholder`-Attribut und -Wert haben. + +```js +const el = document.getElementById('name') +assert(!!el && !!el.placeholder && el.placeholder.length > 0) +``` + +Deine `#email` sollte einen `placeholder`-Attribut und -Wert haben. + +```js +const el = document.getElementById('email') +assert(!!el && !!el.placeholder && el.placeholder.length > 0) +``` + +Deine `#number` sollte einen `placeholder`-Attribut und -Wert haben. + +```js +const el = document.getElementById('number') +assert(!!el && !!el.placeholder && el.placeholder.length > 0) +``` + +Du solltest ein `select`-Feld mit einer `id` von `dropdown` haben. + +```js +const el = document.getElementById('dropdown') +assert(!!el && el.tagName === 'SELECT') +``` + +Dein `#dropdown` sollte mindestens zwei auswählbare (nicht deaktivierte) `option`-Elemente haben. + +```js +const els = document.querySelectorAll('#dropdown option:not([disabled])') +assert(els.length >= 2) +``` + +Dein `#dropdown` sollte ein Nachfahre (descendant) von `#survey-form` sein. + +```js +const el = document.querySelector('#survey-form #dropdown') +assert(!!el) +``` + +Du solltest mindestens zwei `input`-Elemente mit einem `type` von `radio` (Radio Buttons) haben. + +```js +const els = document.querySelectorAll('input[type="radio"]') +assert(els.length >= 2) +``` + +Du solltest mindestens zwei Radio-Buttons haben, die Nachfahren (descendants) der `#survey-form` sind. + +```js +const els = document.querySelectorAll('#survey-form input[type="radio"]') +assert(els.length >= 2) +``` + +All deine Radio-Buttons sollten ein `value`-Attribut und -Wert haben. + +```js +const els1 = document.querySelectorAll('input[type="radio"]') +const els2 = document.querySelectorAll('input[type="radio"][value=""], input[type="radio"]:not([value])') +assert(els1.length > 0 && els2.length === 0) +``` + +All deine Radio-Buttons sollten ein `name`-Attribut und -Wert haben. + +```js +const els1 = document.querySelectorAll('input[type="radio"]') +const els2 = document.querySelectorAll('input[type="radio"][name=""], input[type="radio"]:not([name])') +assert(els1.length > 0 && els2.length === 0) +``` + +Jede Gruppe der Radio-Buttons sollte mindestens 2 Radio-Buttons enthalten. + +```js +const radioButtons = document.querySelectorAll('input[type="radio"]'); +const groups = {} + +if (radioButtons) { + radioButtons.forEach(el => { + if (!groups[el.name]) groups[el.name] = [] + groups[el.name].push(el) + }) +} + +const groupKeys = Object.keys(groups) + +groupKeys.forEach(key => { + if (groups[key].length < 2) assert(false) +}) + +assert(groupKeys.length > 0) +``` + +Du solltest mindestens zwei `input`-Elemente mit einem `type` von `checkbox` (Checkboxen) haben, die Nachfahren von `#survey-form` sind. + +```js +const els = document.querySelectorAll('#survey-form input[type="checkbox"]'); +assert(els.length >= 2) +``` + +All deine Checkboxen innerhalb von `#survey-form` sollten ein `value`-Attribut und -Wert haben. + +```js +const els1 = document.querySelectorAll('#survey-form input[type="checkbox"]') +const els2 = document.querySelectorAll('#survey-form input[type="checkbox"][value=""], #survey-form input[type="checkbox"]:not([value])') +assert(els1.length > 0 && els2.length === 0) +``` + +Du solltest mindestens ein `textarea`-Element haben, das ein Nachfahre (descendant) der `#survey-form` ist. + +```js +const el = document.querySelector('#survey-form textarea') +assert(!!el) +``` + +Du solltest ein `input`- oder `button`-Element mit einer `id` von `submit` haben. + +```js +const el = document.getElementById('submit') +assert(!!el && (el.tagName === 'INPUT' || el.tagName === 'BUTTON')) +``` + +Dein `#submit` sollte einen `type` von `submit` haben. + +```js +const el = document.getElementById('submit') +assert(!!el && el.type === 'submit') +``` + +Dein `#submit` sollte ein Nachfahre (descendant) von `#survey-form` sein. + +```js +const el = document.querySelector('#survey-form #submit') +assert(!!el) +``` + +# --seed-- + +## --seed-contents-- + +```html + +``` + +```css + +``` + +## --solutions-- + +```html + + + + + + Survey Form + + +

    Survey Form

    +

    The card below was built as a sample survey form for freeCodeCamp.

    +
    +

    Join the Togepi Fan Club!

    +

    + Enter your information here to receive updates about club activities, + our monthly newsletter, and other email communications. +

    +
    + + + + +

    Who is your favourite Pokemon?

    + + + +

    Which communications do you want to receive?

    + + + +

    Any other information you would like to share?

    + +

    + Please note: This form is a proof of concept. Submitting the form + will not actually transmit your data. +

    + +
    +
    + + + +``` + +```css +main { + text-align: center; + background-color: #92869c; + background-blend-mode: lighten; + max-width: 500px; + margin: 20px auto; + border-radius: 50px; + box-shadow: 10px 10px rgba(0, 0, 0, 0.5); + color: black; +} +body { + text-align: center; + background: #3a3240; + color: white; +} +input, textarea, select, button { + background: #3a3240; + color: white; +} +a { + color: white; +} +``` diff --git a/curriculum/challenges/german/14-responsive-web-design-22/build-a-tribute-page-project/build-a-tribute-page.md b/curriculum/challenges/german/14-responsive-web-design-22/build-a-tribute-page-project/build-a-tribute-page.md new file mode 100644 index 00000000000000..2f7b5216f6ab5c --- /dev/null +++ b/curriculum/challenges/german/14-responsive-web-design-22/build-a-tribute-page-project/build-a-tribute-page.md @@ -0,0 +1,325 @@ +--- +id: bd7158d8c442eddfaeb5bd18 +title: Erstelle eine Gedenkseite +challengeType: 14 +forumTopicId: 301147 +dashedName: build-a-tribute-page +--- + +# --description-- + +**Aufgabe:** Erstelle eine Anwendung, die eine ähnliche Funktionalität wie https://tribute-page.freecodecamp.rocks aufweist + +**User Stories:** + +1. Deine Gedenkseite sollte über ein `main`-Element mit einer zugehörigen `id` von `main` verfügen, die alle anderen Elemente enthält +1. Du solltest ein Element mit einer `id` von `title` sehen, das einen String (d.h. Text) enthält, der das Thema der Gedenkseite beschreibt (z.B. „Dr. Norman Borlaug“) +1. Du solltest entweder ein `figure`- oder ein `div`-Element mit einer `id` von `img-div` sehen +1. Du solltest innerhalb des `#img-div`-Elements ein `img`-Element mit zugehöriger `id="image"` sehen +1. Du solltest innerhalb des `#img-div`-Elements ein Element mit zugehöriger `id="img-caption"` sehen, der einen Text enthält, der das in `#img-div` angezeigte Bild beschreibt +1. Du solltest ein Element mit zugehöriger `id="tribute-info"` sehen, welches das Thema der Gedenkseite beschreibenden Textinhalt enthält +1. Du solltest ein `a`-Element mit zugehöriger `id="tribute-link"` sehen, welches auf eine externe Seite verweist, die zusätzliche Informationen über das Thema der Gedenkseite enthält. TIPP: Du musst deinem Element ein Attribut von `target` zuweisen und es auf `_blank` setzen, damit der Link in einem neuen Tab geöffnet werden kann +1. Dein `#image` sollte die `max-width`- und `height`-Eigenschaften verwenden, um die Größenänderung responsiv zu gestalten, d. h. relativ zur Breite des Elternelements, ohne dessen Originalgröße zu überschreiten +1. Dein `img`-Element sollte innerhalb des Elternelements zentriert werden + +Erfülle die folgenden User Stories und bestehe alle Tests, um dieses Projekt abzuschließen. Gib dem Ganzen deinen persönlichen Stil. Viel Spaß beim Programmieren! + +**Hinweis:** Füge unbedingt `` in dein HTML ein, um dein Stylesheet zu verlinken und dein CSS anzuwenden + +# --hints-- + +Du solltest ein `main`-Element mit einer `id` von `main` haben. + +```js +const el = document.getElementById('main') +assert(!!el && el.tagName === 'MAIN') +``` + +Dein `#img-div`, `#image`, `#img-caption`, `#tribute-info` und `#tribute-link` sollten alle Nachfahren (descendants) von `#main` sein. + +```js +const el1 = document.querySelector('#main #img-div') +const el2 = document.querySelector('#main #image') +const el3 = document.querySelector('#main #img-caption') +const el4 = document.querySelector('#main #tribute-info') +const el5 = document.querySelector('#main #tribute-link') +assert(!!el1 & !!el2 && !!el3 && !!el4 && !!el5) +``` + +Du solltest ein Element mit einer `id` von `title` haben. + +```js +const el = document.getElementById('title') +assert(!!el) +``` + +Dein `#title` sollte nicht leer sein. + +```js +const el = document.getElementById('title') +assert(!!el && el.innerText.length > 0) + +``` + +Du solltest ein `figure`- oder `div`-Element mit einer `id` von `img-div` haben. + +```js +const el = document.getElementById('img-div') +assert(!!el && (el.tagName === 'DIV' || el.tagName === 'FIGURE')) +``` + +Du solltest ein `img`-Element mit einer `id` von `image` haben. + +```js +const el = document.getElementById('image') +assert(!!el && el.tagName === 'IMG') +``` + +Dein `#image` sollte ein Nachfahre (descendant) von `#img-div` sein. + +```js +const el = document.querySelector('#img-div #image') +assert(!!el) +``` + +Du solltest ein `figcaption`- oder `div`-Element mit einer `id` von `img-caption` haben. + +```js +const el = document.getElementById('img-caption') +assert(!!el && (el.tagName === 'DIV' || el.tagName === 'FIGCAPTION')) +``` + +Dein `#img-caption` sollte ein Nachfahre (descendant) von `#img-div` sein. + +```js +const el = document.querySelector('#img-div #img-caption') +assert(!!el) +``` + +Dein `#img-caption` darf nicht leer sein. + +```js +const el = document.getElementById('img-caption') +assert(!!el && el.innerText.length > 0) +``` + +Du solltest ein Element mit einer `id` von `tribute-info` haben. + +```js +const el = document.getElementById('tribute-info') +assert(!!el) +``` + +Dein `#tribute-info` darf nicht leer sein. + +```js +const el = document.getElementById('tribute-info') +assert(!!el && el.innerText.length > 0) +``` + +Du solltest ein `a`-Element mit einer `id` von `tribute-link` haben. + +```js +const el = document.getElementById('tribute-link') +assert(!!el && el.tagName === 'A') +``` + +Dein `#tribute-link` sollte ein `href`-Attribut und -Wert haben. + +```js +const el = document.getElementById('tribute-link') +assert(!!el && !!el.href && el.href.length > 0) +``` + +Dein `#tribute-link` sollte ein, auf `_blank` gesetztes, `target`-Attribut haben. + +```js +const el = document.getElementById('tribute-link') +assert(!!el && el.target === '_blank') +``` + +Dein `img`-Element sollte ein `display` von `block` enthalten. + +```js +const img = document.getElementById('image'); +const imgStyle = window.getComputedStyle(img); +const style = imgStyle?.getPropertyValue('display') +assert(style === 'block') +``` + +Dein `#image` sollte eine `max-width` von `100%` haben. + +```js +const img = document.getElementById('image'); +const imgStyle = window.getComputedStyle(img); +const style = imgStyle?.getPropertyValue('max-width') +assert(style === '100%') +``` + +Dein `#image` sollte eine `height` von `auto` haben. + +```js +// taken from the testable-projects repo +const img = document.getElementById('image'); +const imgStyle = window.getComputedStyle(img); +const oldDisplayValue = imgStyle.getPropertyValue('display'); +const oldDisplayPriority = imgStyle.getPropertyPriority('display'); +img?.style.setProperty('display', 'none', 'important'); +const heightValue = imgStyle?.getPropertyValue('height') +img?.style.setProperty('display', oldDisplayValue, oldDisplayPriority); +assert(heightValue === 'auto') +``` + +Dein `#image` sollte innerhalb der Elternklasse zentriert sein. + +```js +// taken from the testable-projects repo +const img = document.getElementById('image'), + imgParent = img?.parentElement, + imgLeft = img?.getBoundingClientRect().left, + imgRight = img?.getBoundingClientRect().right, + parentLeft = imgParent?.getBoundingClientRect().left, + parentRight = imgParent?.getBoundingClientRect().right, + leftMargin = imgLeft - parentLeft, + rightMargin = parentRight - imgRight; +assert(leftMargin - rightMargin < 6 && rightMargin - leftMargin < 6) +``` + +# --seed-- + +## --seed-contents-- + +```html + +``` + +```css + +``` + +## --solutions-- + +```html + + + + + + + + Tribute Page + + +

    Tribute Page

    +

    The below card was designed as a tribute page for freeCodeCamp.

    +
    +
    + An image of Togepi +
    Togepi, happy as always.
    +
    +

    Togepi

    +
    +
    +

    + Togepi was first discovered in the Johto region, when Ash Ketchum + discovered a mysterious egg. However, when the egg hatched, Togepi saw + Ash's friend Misty first and imprinted on her. Like many other + creatures, this imprinting process created a bond and Togepi views + Misty as his mother. +

    +

    + Togepi is a very childlike Pokemon, and is very emotionally + expressive. He demonstrates extreme levels of joy and sadness. +

    +
    +

    Battle Information

    +
      +
    • Type: Fairy
    • +
    • Evolutions: Togepi -> Togetic -> Togekiss
    • +
    • Moves: Growl, Pound, Sweet Kiss, Charm
    • +
    • Weaknesses: Poison, Steel
    • +
    • Resistances: Dragon
    • +
    +

    + Check out this + Bulbapedia article on Togepi + for more information on this great Pokemon. +

    +
    +
    + + + +``` + +```css +body { + background-color: #3a3240; + color: white; +} +main { + background-color: #92869c; + font-family: Lobster; + max-width: 500px; + margin: 20px auto; + color: black; + border-radius: 50px; + box-shadow: 10px 10px rgba(0, 0, 0, 0.5); +} +h2 { + text-align: center; + font-size: 20pt; + font-family: Pacifico; +} +body { + text-align: center; + font-size: 12pt; +} +footer { + text-align: center; + font-size: 10pt; +} +.border { + border-color: black; + border-width: 5px; + border-style: solid; +} +#image { + height: auto; + display: block; + margin: auto; + max-width: 100%; + border-radius: 50%; +} +#img-caption { + font-size: 10pt; +} +a:not(#tribute-link) { + color: white; +} +hr { + border-color: black; +} +``` diff --git a/curriculum/challenges/italian/02-javascript-algorithms-and-data-structures/es6/mutate-an-array-declared-with-const.md b/curriculum/challenges/italian/02-javascript-algorithms-and-data-structures/es6/mutate-an-array-declared-with-const.md index dd06f100bc785e..b582f1791d4b60 100644 --- a/curriculum/challenges/italian/02-javascript-algorithms-and-data-structures/es6/mutate-an-array-declared-with-const.md +++ b/curriculum/challenges/italian/02-javascript-algorithms-and-data-structures/es6/mutate-an-array-declared-with-const.md @@ -23,7 +23,7 @@ s[2] = 45; console.log(s); ``` -`s = [1, 2, 3]` comporterà un errore. Il comando `console.log` mostrerà il valore `[5, 6, 45]`. +`s = [1, 2, 3]` comporterà un errore. Dopo aver trasformato la riga in un commento, il `console.log` mostrerà il valore `[5, 6, 45]`. Come puoi vedere, puoi mutare l'oggetto `[5, 6, 7]` stesso e la variabile `s` punterà ancora all'array alterato `[5, 6, 45]`. Come tutti gli array, gli elementi in `s` sono mutabili, ma poiché è stata usata `const`, non è possibile utilizzare l'identificatore di variabile `s` per puntare ad un array diverso utilizzando l'operatore di assegnazione. diff --git a/curriculum/challenges/italian/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-drum-machine.md b/curriculum/challenges/italian/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-drum-machine.md index 41609b957eb882..4f2ba24bedaea0 100644 --- a/curriculum/challenges/italian/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-drum-machine.md +++ b/curriculum/challenges/italian/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-drum-machine.md @@ -28,9 +28,21 @@ Puoi utilizzare qualsiasi mix di HTML, JavaScript, CSS, Bootstrap, SASS, React, **User Story #7:** Quando un `.drum-pad` viene attivato, viene visualizzata una stringa che descrive la clip audio associata come testo interno dell'elemento `#display` (ogni stringa deve essere unica). +Ecco alcuni campioni audio che puoi usare per la tua batteria: + +- [Heater 1](https://s3.amazonaws.com/freecodecamp/drums/Heater-1.mp3) +- [Heater 2](https://s3.amazonaws.com/freecodecamp/drums/Heater-2.mp3) +- [Heater 3](https://s3.amazonaws.com/freecodecamp/drums/Heater-3.mp3) +- [Heater 4](https://s3.amazonaws.com/freecodecamp/drums/Heater-4_1.mp3) +- [Clap](https://s3.amazonaws.com/freecodecamp/drums/Heater-6.mp3) +- [Open-HH](https://s3.amazonaws.com/freecodecamp/drums/Dsc_Oh.mp3) +- [Kick-n'-Hat](https://s3.amazonaws.com/freecodecamp/drums/Kick_n_Hat.mp3) +- [Kick](https://s3.amazonaws.com/freecodecamp/drums/RP4_KICK_1.mp3) +- [Closed-HH](https://s3.amazonaws.com/freecodecamp/drums/Cev_H2.mp3) + Puoi costruire il tuo progetto usando questo modello CodePen e facendo click su `Save` per creare il tuo pen. Oppure puoi usare questo link CDN per eseguire i test in qualsiasi ambiente tu voglia: `https://cdn.freecodecamp.org/testable-projects-fcc/v1/bundle.js` -Una volta fatto, invia l'URL del tuo progetto di lavoro con tutti i suoi test passati. +Una volta fatto, invia l'URL del tuo progetto di lavoro con tutti i suoi test superati. # --solutions-- diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8b9dab5ac88e4d3d43a3.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8b9dab5ac88e4d3d43a3.md index 2e6b6967390592..44f277b4815d22 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8b9dab5ac88e4d3d43a3.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8b9dab5ac88e4d3d43a3.md @@ -9,7 +9,7 @@ dashedName: step-17 Per seguire le buone pratiche di accessibilità, collega gli elementi `input` e gli elementi `label` usando l'attributo `for`. -Usa questi valori per i rispettivi attributi `id`: `first-name`, `last-name`, `email`, `new-password` +Usa `first-name`, `last-name`, `email` e `new-password` come valori dei rispettivi attributi `id`. # --hints-- diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8e998d3e7eae14d6ae3b.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8e998d3e7eae14d6ae3b.md index 49febbe46ca80d..881518e01e4ad2 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8e998d3e7eae14d6ae3b.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8e998d3e7eae14d6ae3b.md @@ -9,7 +9,7 @@ dashedName: step-28 Segui le buone pratiche di accessibilità collegando gli elementi `input` e gli elementi `label` nel secondo `fieldset`. -Usa questi valori per i rispettivi attributi `id`: `personal-account`, `business-account`, `terms-and-conditions` +Usa `personal-account`, `business-account` e `terms-and-conditions` come valori dei rispettivi attributi `id`. # --hints-- diff --git a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff919a7b5612c0670923a5.md b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff919a7b5612c0670923a5.md index 896a4a461d93da..ce72737ed324a1 100644 --- a/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff919a7b5612c0670923a5.md +++ b/curriculum/challenges/italian/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff919a7b5612c0670923a5.md @@ -9,7 +9,7 @@ dashedName: step-37 Collega gli elementi inviabili del modulo con il rispettivo elemento `label`. -Usa questi valori per i rispettivi attributi `id`: `profile-picture`, `age`, `referrer`, `bio` +Usa `profile-picture`, `age`, `referrer` e `bio` come valori dei rispettivi attributi `id`. # --hints-- diff --git a/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc24614f86c76b9248c6ebd.md b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc24614f86c76b9248c6ebd.md new file mode 100644 index 00000000000000..826cc5f2167943 --- /dev/null +++ b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc24614f86c76b9248c6ebd.md @@ -0,0 +1,79 @@ +--- +id: 5dc24614f86c76b9248c6ebd +title: ステップ 10 +challengeType: 0 +dashedName: step-10 +--- + +# --description-- + +アンカー (`a`) 要素を使うと、他のページにリンクすることができます。 例えば、`` と書くと `freecodecamp.org` にリンクします。 + +段落要素の後に、`https://freecatphotoapp.com` へとリンクするアンカー要素を追加してください。 この時点では、プレビューにリンクは表示されません。 + +# --hints-- + +アンカー (`a`) 要素には開始タグが必要です。 開始タグは `` のような形式の構文です。 + +```js +assert(document.querySelector('a')); +``` + +アンカー (`a`) 要素には終了タグが必要です。 終了タグは `<` の直後に `/` があります。 + +```js +assert(code.match(/<\/a\>/)); +``` + +アンカー (`a`) 要素は `p` 要素の下に置く必要があります。 順番が誤っているようです。 + +```js +const collection = [...document.querySelectorAll('a, p')].map( + (node) => node.nodeName +); +assert(collection.indexOf('P') < collection.indexOf('A')); +``` + +アンカー (`a`) 要素に `href` 属性がありません。 開始タグのタグ名の後にスペースがあることと、すべての属性名の前にスペースがあることを確認してください。 + +```js +assert(document.querySelector('a').hasAttribute('href')); +``` + +アンカー (`a`) 要素は `https://freecatphotoapp.com` にリンクされる必要があります。 URL が設定されていないか、誤字脱字があります。 + +```js +assert( + document.querySelector('a').getAttribute('href') === + 'https://freecatphotoapp.com' +); +``` + +アンカー ('a') 要素の `href` は正しいリンクに設定されていますが、属性の値は常に引用符 (") で囲むことが推奨されています。 + +```js +assert( + !/\ + +

    CatPhotoApp

    +
    +

    Cat Photos

    + +--fcc-editable-region-- +

    Click here to view more cat photos.

    +--fcc-editable-region-- + A cute orange cat lying on its back. +
    + + +``` + diff --git a/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ddbd81294d8ddc1510a8e56.md b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ddbd81294d8ddc1510a8e56.md new file mode 100644 index 00000000000000..597f8f42ba0082 --- /dev/null +++ b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ddbd81294d8ddc1510a8e56.md @@ -0,0 +1,57 @@ +--- +id: 5ddbd81294d8ddc1510a8e56 +title: ステップ 11 +challengeType: 0 +dashedName: step-11 +--- + +# --description-- + +リンクのテキストは、アンカー (`a`) 要素の開始タグと終了タグの間に配置します。 例えば `click here to go to freeCodeCamp.org` と書くと、`click here to go to freeCodeCamp.org` というテキストのリンクになります。 + +アンカー要素に、`cat photos` というアンカーテキストを追加してください。 これがリンクのテキストになります。 + +# --hints-- + +アンカー (`a`) 要素には開始タグが必要です。 開始タグは `` のような形式の構文です。 + +```js +assert(document.querySelector('a')); +``` + +アンカー (`a`) 要素には終了タグが必要です。 終了タグは `<` の直後に `/` があります。 + +```js +assert(code.match(/<\/a\>/)); +``` + +アンカー (`a`) 要素のテキストは `cat photos` でなければなりません。 リンクテキストがアンカー (`a`) 要素の開始タグと終了タグの間に置かれていることを確認してください。 + +```js +assert( + document.querySelector('a').innerText.toLowerCase().replace(/\s+/g, ' ') === + 'cat photos' +); +``` + +# --seed-- + +## --seed-contents-- + +```html + + +

    CatPhotoApp

    +
    +

    Cat Photos

    + +

    Click here to view more cat photos.

    +--fcc-editable-region-- + +--fcc-editable-region-- + A cute orange cat lying on its back. +
    + + +``` + diff --git a/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/7cf9b03d81a65668421804c3.md b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/7cf9b03d81a65668421804c3.md new file mode 100644 index 00000000000000..4e7dbac421bd54 --- /dev/null +++ b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/7cf9b03d81a65668421804c3.md @@ -0,0 +1,103 @@ +--- +id: 7cf9b03d81a65668421804c3 +title: ステップ 38 +challengeType: 0 +dashedName: step-38 +--- + +# --description-- + +`action` 属性で指定された場所でフォームのデータにアクセスできるようにするには、テキストフィールドに `name` 属性を追加し、送信されるデータを表す値を設定しなければなりません。 例えばメールアドレス用のテキストフィールドであれば、次のような構文を使用できます: `` + +テキストフィールドに、`name` 属性と値 `catphotourl` を追加してください。 + +# --hints-- + +`input` 要素が削除されているか、構文が正しくありません。 属性値は引用符で囲む必要があります。 + +```js +assert($('input').length); +``` + +`form` には `input` 要素だけが含まれるようにしてください。 `form` 要素内の余分な HTML 要素やテキストは削除してください。 + +```js +assert( + $('form')[0].children.length === 1 && + $('form')[0].innerText.trim().length === 0 +); +``` + +`input` 要素に `name` 属性がありません。 開始タグのタグ名の後にスペースがあることと、すべての属性名の前にスペースがあることを確認してください。 + +```js +assert($('input')[0].hasAttribute('name')); +``` + +`input` 要素に `name` 属性があり、値 `catphotourl` が設定されている必要があります。 値が設定されていないか、誤字脱字があります。 属性値は引用符で囲むことを忘れないでください。 + +```js +assert( + $('input')[0] + .getAttribute('name') + .match(/^catphotourl$/i) +); +``` + +`input` 要素の `name` 属性は `catphotourl` に設定されていますが、属性の値は常に引用符で囲むことが推奨されています。 + +```js +assert(!/\<\s*input\s+.*\s*=\s*catphotourl/.test(code)); +``` + +# --seed-- + +## --seed-contents-- + +```html + + +

    CatPhotoApp

    +
    +
    +

    Cat Photos

    + +

    Click here to view more cat photos.

    + A cute orange cat lying on its back. +
    +
    +

    Cat Lists

    +

    Things cats love:

    +
      +
    • cat nip
    • +
    • laser pointers
    • +
    • lasagna
    • +
    +
    + A slice of lasagna on a plate. +
    Cats love lasagna.
    +
    +

    Top 3 things cats hate:

    +
      +
    1. flea treatment
    2. +
    3. thunder
    4. +
    5. other cats
    6. +
    +
    + Five cats looking around a field. +
    Cats hate other cats.
    +
    +
    +
    +

    Cat Form

    +
    +--fcc-editable-region-- + +--fcc-editable-region-- +
    +
    +
    + + +``` + diff --git a/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f027c87bc98f050395c139.md b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f027c87bc98f050395c139.md new file mode 100644 index 00000000000000..0818e6c12c8c02 --- /dev/null +++ b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f027c87bc98f050395c139.md @@ -0,0 +1,67 @@ +--- +id: 60f027c87bc98f050395c139 +title: ステップ 3 +challengeType: 0 +dashedName: step-3 +--- + +# --description-- + +次に、`html` 要素内に `head` タグと `body` タグの開始タグおよび終了タグを追加してください。 + +# --hints-- + +`head` の開始タグが 1 つ必要です。 + +```js +assert(code.match(//i)); +``` + +`head` の終了タグが 1 つ必要です。 + +```js +assert(code.match(/<\/head\s*>/i)); +``` + +`body` の開始タグが 1 つ必要です。 + +```js +assert(code.match(//i)); +``` + +`body` の終了タグが 1 つ必要です。 + +```js +assert(code.match(/<\/body\s*>/i)); +``` + +`head` 要素と `body` 要素は兄弟要素である必要があります。 + +```js +assert(document.querySelector('head')?.nextElementSibling.localName === 'body'); +``` + +`head` 要素は `html` 要素の中にある必要があります。 + +```js +assert([...document.querySelector('html')?.children].some(x => x?.localName === 'head')); +``` + +`body` 要素は `html` 要素の中にある必要があります。 + +```js +assert([...document.querySelector('html')?.children].some(x => x?.localName === 'body')); +``` + +# --seed-- + +## --seed-contents-- + +```html +--fcc-editable-region-- + + + + +--fcc-editable-region-- +``` diff --git a/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f0286404aefb0562a4fdf9.md b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f0286404aefb0562a4fdf9.md new file mode 100644 index 00000000000000..f5d3f53e8b66e8 --- /dev/null +++ b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f0286404aefb0562a4fdf9.md @@ -0,0 +1,56 @@ +--- +id: 60f0286404aefb0562a4fdf9 +title: ステップ 4 +challengeType: 0 +dashedName: step-4 +--- + +# --description-- + +`head` 内に、`title` 要素と `meta` 要素を追加してください。 プロジェクトのタイトルは `Registration Form` とし、`meta` 要素には `charset` 属性と値 `UTF-8` を設定してください。 + +# --hints-- + +コードには `title` 要素が 1 つ必要です。 + +```js +const title = document.querySelector('title'); +assert.exists(title); +``` + +`title` 要素は `head` 要素内にある必要があります。 + +```js +assert.exists(document.querySelector('head > title')); +``` + +プロジェクトには `Registration Form` というタイトルが必要です。 + +```js +const title = document.querySelector('title'); +assert.equal(title.text.toLowerCase(), 'registration form') +``` + +タイトルについて、大文字小文字の区別とスペルに気をつけましょう。 + +```js +const title = document.querySelector('title'); +assert.equal(title.text, 'Registration Form'); +``` + +# --seed-- + +## --seed-contents-- + +```html + + + --fcc-editable-region-- + + + +--fcc-editable-region-- + + + +``` diff --git a/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f1922fcbd2410527b3bd89.md b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f1922fcbd2410527b3bd89.md new file mode 100644 index 00000000000000..08ba203047825f --- /dev/null +++ b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f1922fcbd2410527b3bd89.md @@ -0,0 +1,55 @@ +--- +id: 60f1922fcbd2410527b3bd89 +title: ステップ 8 +challengeType: 0 +dashedName: step-8 +--- + +# --description-- + +プロジェクトの見た目を整えるために、CSS を追加しましょう。 まず、`body` の `width` を `100%` に、`height` を `100vh` に設定してください。 + +# --hints-- + +`body` 要素セレクターを使用する必要があります。 + +```js +assert.exists(new __helpers.CSSHelp(document).getStyle('body')); +``` + +`body` の `width` を `100%` に設定する必要があります。 + +```js +assert.equal(new __helpers.CSSHelp(document).getStyle('body')?.width, '100%'); +``` + +`body` の `height` を `100vh` に設定する必要があります。 + +```js +assert.equal(new __helpers.CSSHelp(document).getStyle('body')?.height, '100vh'); +``` + +# --seed-- + +## --seed-contents-- + +```html + + + + + Registration Form + + + +

    Registration Form

    +

    Please fill out this form with the required information

    + + +``` + +```css +--fcc-editable-region-- + +--fcc-editable-region-- +``` diff --git a/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f5c3e399ff1a05629964e4.md b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f5c3e399ff1a05629964e4.md new file mode 100644 index 00000000000000..03b13041aeba61 --- /dev/null +++ b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f5c3e399ff1a05629964e4.md @@ -0,0 +1,63 @@ +--- +id: 60f5c3e399ff1a05629964e4 +title: ステップ 11 +challengeType: 0 +dashedName: step-11 +--- + +# --description-- + +タイトルから分かるように、ここではフォームを作成しています。 なので、`p` 要素の後に `form` を挿入して、`action` 属性の送信先を `https://register-demo.freecodecamp.org` に設定してください。 + +# --hints-- + +`p` 要素の直後に `form` 要素を追加する必要があります。 + +```js +assert.exists(document.querySelector('p + form')); +``` + +`form` には `action` 属性を追加する必要があります。 + +```js +// Default action points to window location +assert.notEqual(document.querySelector('form')?.action, window?.location?.href); +``` + +`action` の値を `https://register-demo.freecodecamp.org` に設定する必要があります。 + +```js +assert.equal(document.querySelector('form')?.action, 'https://register-demo.freecodecamp.org/'); +``` + +# --seed-- + +## --seed-contents-- + +```html + + + + + Registration Form + + +--fcc-editable-region-- + +

    Registration Form

    +

    Please fill out this form with the required information

    + + +--fcc-editable-region-- + +``` + +```css +body { + width: 100%; + height: 100vh; + margin: 0; + background-color: #1b1b32; + color: #f5f6f7; +} +``` diff --git a/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f5d2776c854e069560fbe6.md b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f5d2776c854e069560fbe6.md new file mode 100644 index 00000000000000..8df0757331a756 --- /dev/null +++ b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f5d2776c854e069560fbe6.md @@ -0,0 +1,62 @@ +--- +id: 60f5d2776c854e069560fbe6 +title: ステップ 13 +challengeType: 0 +dashedName: step-13 +--- + +# --description-- + +1 つ目の `fieldset` には、名前、メールアドレス、パスワードを入れます。 まずは 1 つ目の `fieldset` に `label` 要素を 4 つ追加してください。 + +# --hints-- + +`label` 要素を 4 つ追加する必要があります。 + +```js +assert.equal(document.querySelectorAll('label')?.length, 4); +``` + +1 つ目の `fieldset` に `label` 要素を追加してください。 + +```js +assert.equal(document.querySelector('fieldset')?.querySelectorAll('label')?.length, 4); +``` + +# --seed-- + +## --seed-contents-- + +```html + + + + + Registration Form + + + +

    Registration Form

    +

    Please fill out this form with the required information

    +--fcc-editable-region-- +
    +
    + +
    +
    +
    +
    +--fcc-editable-region-- + + +``` + +```css +body { + width: 100%; + height: 100vh; + margin: 0; + background-color: #1b1b32; + color: #f5f6f7; +} +``` diff --git a/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f5dc35c07ac1078f140916.md b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f5dc35c07ac1078f140916.md new file mode 100644 index 00000000000000..ceedecb22b869d --- /dev/null +++ b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f5dc35c07ac1078f140916.md @@ -0,0 +1,82 @@ +--- +id: 60f5dc35c07ac1078f140916 +title: ステップ 14 +challengeType: 0 +dashedName: step-14 +--- + +# --description-- + +`label` 要素に以下のテキストを追加してください: + +- `Enter Your First Name:` +- `Enter Your Last Name:` +- `Enter Your Email:` +- `Create a New Password:` + +# --hints-- + +1 つ目の `label` には、テキスト `Enter Your First Name:` が必要です。 + +```js +assert.match(document.querySelector('label')?.innerHTML, /Enter Your First Name:/i); +``` + +2 つ目の `label` には、テキスト `Enter Your Last Name:` が必要です。 + +```js +assert.match(document.querySelector('fieldset > label:nth-child(2)')?.innerHTML, /Enter Your Last Name:/i); +``` + +3 つ目の `label` には、テキスト `Enter Your Email:` が必要です。 + +```js +assert.match(document.querySelector('fieldset > label:nth-child(3)')?.innerHTML, /Enter Your Email:/i); +``` + +4 つ目の `label` には、テキスト `Create a New Password:` が必要です。 + +```js +assert.match(document.querySelector('fieldset > label:nth-child(4)')?.innerHTML, /Create a New Password:/i); +``` + +# --seed-- + +## --seed-contents-- + +```html + + + + + Registration Form + + + +

    Registration Form

    +

    Please fill out this form with the required information

    +
    +--fcc-editable-region-- +
    + + + + +
    +--fcc-editable-region-- +
    +
    +
    + + +``` + +```css +body { + width: 100%; + height: 100vh; + margin: 0; + background-color: #1b1b32; + color: #f5f6f7; +} +``` diff --git a/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/es6/mutate-an-array-declared-with-const.md b/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/es6/mutate-an-array-declared-with-const.md index 6595fc75df8b15..6cb41f7bb8f0d8 100644 --- a/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/es6/mutate-an-array-declared-with-const.md +++ b/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/es6/mutate-an-array-declared-with-const.md @@ -23,7 +23,7 @@ s[2] = 45; console.log(s); ``` -`s = [1, 2, 3]` resultará em um erro. `console.log` exibirá o valor `[5, 6, 45]`. +`s = [1, 2, 3]` resultará em um erro. Depois de comentar essa linha, o `console.log` exibirá o valor `[5, 6, 45]`. Como você pode ver, você pode alterar o objeto `[5, 6, 7]` e a variável `s` ainda apontará para o array alterado `[5, 6, 45]`. Assim como em qualquer outro array, os elementos dentro de `s` também são mutáveis. Mas como `const` foi usado, você não pode usar o identificador da variável `s` para apontar para uma matriz diferente (ou qualquer outro valor) usando o operador de atribuição. diff --git a/curriculum/challenges/portuguese/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-drum-machine.md b/curriculum/challenges/portuguese/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-drum-machine.md index 0672d89d5ab61c..9bb2e2e449cda1 100644 --- a/curriculum/challenges/portuguese/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-drum-machine.md +++ b/curriculum/challenges/portuguese/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-drum-machine.md @@ -28,9 +28,21 @@ Você pode usar qualquer mistura de HTML, JavaScript, CSS, Bootstrap, SASS, Reac **História de usuário nº 7:** quando um `.drum-pad` é acionado, uma string descrevendo o clipe de áudio associado é exibido como o texto interno do elemento `#display` (cada string precisa ser única). +Aqui estão algumas amostras de áudio que você pode usar para sua bateria eletrônica: + +- [Heater 1](https://s3.amazonaws.com/freecodecamp/drums/Heater-1.mp3) +- [Heater 2](https://s3.amazonaws.com/freecodecamp/drums/Heater-2.mp3) +- [Heater 3](https://s3.amazonaws.com/freecodecamp/drums/Heater-3.mp3) +- [Heater 4](https://s3.amazonaws.com/freecodecamp/drums/Heater-4_1.mp3) +- [Clap](https://s3.amazonaws.com/freecodecamp/drums/Heater-6.mp3) +- [Open-HH](https://s3.amazonaws.com/freecodecamp/drums/Dsc_Oh.mp3) +- [Kick-n'-Hat](https://s3.amazonaws.com/freecodecamp/drums/Kick_n_Hat.mp3) +- [Kick](https://s3.amazonaws.com/freecodecamp/drums/RP4_KICK_1.mp3) +- [Closed-HH](https://s3.amazonaws.com/freecodecamp/drums/Cev_H2.mp3) + Você pode fazer o seu projeto usando este modelo da CodePen e clicando em `Save` para criar seu próprio pen. Ou você pode usar esse link CDN para rodar os testes em qualquer ambiente que você goste:`https://cdn.freecodecamp.org/testable-projects-fcc/v1/bundle.js` -Quando você terminar, envie a URL para o seu projeto em trabalho com todos os testes passando. +Quando você terminar, envie o URL do seu projeto depois de ele haver passado em todos os testes. # --solutions-- diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8b9dab5ac88e4d3d43a3.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8b9dab5ac88e4d3d43a3.md index 091d17a8eae8ca..8c300e1862509e 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8b9dab5ac88e4d3d43a3.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8b9dab5ac88e4d3d43a3.md @@ -9,7 +9,7 @@ dashedName: step-17 Seguindo as melhores práticas de acessibilidade, vincule os elementos `input` e `label` utilizando o atributo `for`. -Use estes valores para as respectivas propriedades de `id`: `first-name`, `last-name`, `email` e `new-password` +Use `first-name`, `last-name`, `email` e `new-password` como valores para os respectivos atributos `id`. # --hints-- diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8e998d3e7eae14d6ae3b.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8e998d3e7eae14d6ae3b.md index 67bea8ac7104dc..c58d637763455c 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8e998d3e7eae14d6ae3b.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff8e998d3e7eae14d6ae3b.md @@ -9,7 +9,7 @@ dashedName: step-28 Siga as melhores práticas de acessibilidade vinculando os elementos `input` e `label` no segundo `fieldset`. -Use estes valores para as respectivas propriedades de `id`: `personal-account`, `business-account` e `terms-and-conditions` +Use `personal-account`, `business-account` e `terms-and-conditions` como valores para os respectivos atributos `id`. # --hints-- diff --git a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff919a7b5612c0670923a5.md b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff919a7b5612c0670923a5.md index d7b4d9a2216527..d35e67013cd537 100644 --- a/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff919a7b5612c0670923a5.md +++ b/curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/62ff919a7b5612c0670923a5.md @@ -9,7 +9,7 @@ dashedName: step-37 Vincule os elementos de formulário aplicáveis e os elementos `label`. -Use estes valores para as respectivas propriedades de `id`: `profile-picture`, `age`, `referrer` e `bio` +Use `profile-picture`, `age`, `referrer` e `bio` como valores para os respectivos atributos `id`. # --hints-- From 1e4d5a3ee18a428f899610b3389f80ef3defeb27 Mon Sep 17 00:00:00 2001 From: camperbot Date: Wed, 7 Sep 2022 19:40:19 +0530 Subject: [PATCH 033/129] chore(i18n,docs): processed translations (#47433) --- docs/i18n/german/courses-vscode-extension.md | 38 +-- .../german/how-to-enable-new-languages.md | 84 +++---- ...o-setup-freecodecamp-mobile-app-locally.md | 234 +++++++++--------- docs/i18n/german/how-to-setup-wsl.md | 2 +- docs/i18n/italian/_sidebar.md | 10 +- .../italian/how-to-enable-new-languages.md | 89 ++++--- docs/i18n/italian/language-lead-handbook.md | 2 +- docs/i18n/portuguese/_sidebar.md | 10 +- .../portuguese/how-to-enable-new-languages.md | 88 +++---- .../i18n/portuguese/language-lead-handbook.md | 2 +- 10 files changed, 279 insertions(+), 280 deletions(-) diff --git a/docs/i18n/german/courses-vscode-extension.md b/docs/i18n/german/courses-vscode-extension.md index 65f690496a69a5..15686d29b2f92b 100644 --- a/docs/i18n/german/courses-vscode-extension.md +++ b/docs/i18n/german/courses-vscode-extension.md @@ -1,41 +1,41 @@ -# Courses VSCode Extension +# Kurse VSCode Erweiterung -This details the maintenance guidelines for the [freeCodeCamp/courses-vscode-extension](https://github.com/freeCodeCamp/courses-vscode-extension) repository which contains the source code for the [freeCodeCamp - Courses](https://marketplace.visualstudio.com/items?itemName=freeCodeCamp.freecodecamp-courses) extension. +Dies beschreibt die Wartungsrichtlinien für das [freeCodeCamp/courses-vscode-extension](https://github.com/freeCodeCamp/courses-vscode-extension) Repository, das den Quellcode für die [freeCodeCamp - Courses](https://marketplace.visualstudio.com/items?itemName=freeCodeCamp.freecodecamp-courses) Erweiterung enthält. -## Publishing the Extension +## Veröffentlichung der Erweiterung -A GitHub Action automagically publishes the extension to the Visual Studio Marketplace, on the release of a new GitHub Release. +Eine GitHub-Aktion veröffentlicht automatisch die Erweiterung im Visual Studio Marketplace bei der Veröffentlichung einer neuen GitHub-Version. -1. Package a new version of the extension: +1. Packe eine neue Version der Erweiterung: ```bash npm run pack -- ``` -Where `` is one of: `major`, `minor`, `patch`. +Dabei ist `` eines von: `major`, `minor`, `patch`. -2. Push the new version to `main`: +2. Schiebe die neue Version nach `main`: ```bash git commit -am "(): " git push ``` -Optionally, you can push directly to `upstream/main`, but opening a new PR is recommended for a sanity check. +Optional kannst du direkt zu `upstream/main` pushen, aber es wird empfohlen, einen neuen PR zu eröffnen, um die Richtigkeit zu überprüfen. -3. Create a new GitHub Release using the GitHub UI: +3. Erstelle eine neues GitHub-Release über die GitHub-Benutzeroberfläche: -- Correctly increment the version number, when creating a new tag. -- Upload the `.vsix` file with the release. -- Publish the release, and confirm the action succeeded. +- Erhöhe die Versionsnummer korrekt, wenn du einen neuen Tag erstellst. +- Lade die `.vsix`-Datei mit dem Release hoch. +- Veröffentliche das Release und bestätige, dass die Aktion erfolgreich war. -> [!NOTE] Creating a release requires write access to the `freeCodeCamp/courses-vscode-extension` repository. +> [!NOTE] Das Erstellen einer Version erfordert Schreibzugriff auf das `freeCodeCamp/courses-vscode-extension` Repository. -## Manually Publishing the Extension +## Manuelles Veröffentlichen der Erweiterung -A manual upload to the Visual Studio Marketplace can be achieved, by following these steps: +Ein manueller Upload auf den Visual Studio Marketplace kann mit den folgenden Schritten durchgeführt werden: -1. Visit https://marketplace.visualstudio.com/ and sign in -2. Navigate to the [freeCodeCamp Publisher page](https://marketplace.visualstudio.com/manage/publishers/freecodecamp) -3. Select the relevant extension, and select `Update` -4. Upload the file from your local files +1. Besuche https://marketplace.visualstudio.com/ und melde dich an +2. Navigiere zur [freeCodeCamp Publisher Seite](https://marketplace.visualstudio.com/manage/publishers/freecodecamp) +3. Wähle die entsprechende Erweiterung aus und wähle `Update` +4. Lade die Datei aus deinen lokalen Dateien hoch diff --git a/docs/i18n/german/how-to-enable-new-languages.md b/docs/i18n/german/how-to-enable-new-languages.md index d0ee662a2a42c7..18d1034b088e52 100644 --- a/docs/i18n/german/how-to-enable-new-languages.md +++ b/docs/i18n/german/how-to-enable-new-languages.md @@ -1,14 +1,14 @@ -# Deploying New Languages on `/learn` +# Neue Sprachen auf `/learn` bereitstellen -Before you can release a new language, you will need to allow the languages to download from Crowdin. +Bevor du eine neue Sprache freigeben kannst, musst du zulassen, dass die Sprachen von Crowdin heruntergeladen werden können. -## Updating Crowdin Settings +## Aktualisierung der Crowdin-Einstellungen -In the `Curriculum` and `Learn UI` projects, you will need to select `Project Settings` from the sidebar. Then scroll down to `Language Mapping`, where you will see an option to add custom language codes. Add a new entry for the language you are releasing, selecting `language` as the `Placeholder` value, and entering a URL-friendly lower-case spelling of your language's name for the `Custom code`. If you aren't sure what to use, reach out in our contributor chat and we will assist you. +In den Projekten `Curriculum` und `Learn UI` musst du `Project Settings` in der Seitenleiste auswählen. Danach scrollst du nach unten zu `Language Mapping`, wo du eine Option zum Hinzufügen eigener Sprachcodes findest. Füge einen neuen Eintrag für die Sprache hinzu, die du veröffentlichen willst, indem du `language` als `Placeholder`-Wert auswählst und eine URL-freundliche Kleinschreibung des Namens deiner Sprache für den `Custom code` einträgst. Wenn du dir nicht sicher bist, was du verwenden sollst, melde dich in unserem "Contributor"-Chat und wir werden dir helfen. -## Updating Workflows +## Workflows aktualisieren -You will need to add a step to the `crowdin-download.client-ui.yml` and `crowdin-download.curriculum.yml`. The step for these will be the same. For example, if you want to enable Dothraki downloads: +Du musst einen Schritt in der `crowdin-download.client-ui.yml` und `crowdin-download.curriculum.yml` hinzufügen. Der Schritt für die beiden ist der gleiche. Zum Beispiel, wenn du Dothraki-Downloads aktivieren möchtest: ```yml ##### Download Dothraki ##### @@ -41,24 +41,24 @@ You will need to add a step to the `crowdin-download.client-ui.yml` and `crowdin # dryrun_action: true ``` -Note that the `download_language` key needs to be set to the language code displayed on Crowdin. +Beachte, dass der Schlüssel `download_language` auf den Sprachcode festgelegt werden muss, der auf Crowdin angezeigt wird. -## Enabling a Language +## Eine Sprache aktivieren -> [!NOTE] The above section with updating the workflows should be completed before proceeding - these need to be done in separate steps or the builds will fail. +> [!NOTE] Der obige Abschnitt mit der Aktualisierung der Workflows sollte abgeschlossen sein, bevor du fortfährst - dies muss in getrennten Schritten geschehen, sonst schlagen die Builds fehl. -There are a few steps to take in order to allow the codebase to build in your desired language. +Es gibt ein paar Schritte, die du unternehmen musst, damit die Codebasis in deiner gewünschten Sprache erstellt werden kann. -First, visit the `config/i18n/all-langs.ts` file to add the language to the available languages list and configure the values. There are several objects here. +Gehe zuerst in die Datei `config/i18n/all-langs.ts`, um die Sprache zur Liste der verfügbaren Sprachen hinzuzufügen und die Werte zu konfigurieren. Hier gibt es mehrere Objekte. -- `availableLangs`: For both the `client` and `curriculum` arrays, add the text name of the language. This is the value that will be used in the `.env` file later. -- `auditedCerts`: Add the text name of the language as the _key_, and add an array of `SuperBlocks.{cert}` variables as the _value_. This tells the client which certifications are fully translated. -- `i18nextCodes`: These are the ISO language codes for each language. You will need to add the appropriate ISO code for the language you are enabling. These do need to be unique for each language. -- `LangNames`: These are the display names for the language selector in the navigation menu. -- `LangCodes`: These are the language codes used for formatting dates and numbers. These should be Unicode CLDR codes instead of ISO codes. -- `hiddenLangs`: These languages will not be displayed in the navigation menu. This is used for languages that are not yet ready for release. +- `availableLangs`: Füge sowohl für den `client` als auch für das `curriculum`-Array den Textnamen der Sprache hinzu. Dies ist der Wert, der später in der `.env`-Datei verwendet wird. +- `auditedCerts`: Füge den Textnamen der Sprache als _Schlüssel_ und ein Array mit `SuperBlocks.{cert}`-Variablen als _Wert_ hinzu. Dies teilt dem Client mit, welche Zertifikate vollständig übersetzt sind. +- `i18nextCodes`: Dies sind die ISO-Sprachcodes für jede Sprache. Du musst den entsprechenden ISO-Code für die Sprache hinzufügen, die du aktivieren möchtest. Diese müssen für jede Sprache einzigartig sein. +- `LangNames`: Dies sind die Anzeigenamen für die Sprachauswahl im Navigationsmenü. +- `LangCodes`: Dies sind die Sprachcodes, die für die Formatierung von Datumsangaben und Zahlen verwendet werden. Dies sollten Unicode CLDR-Codes statt ISO-Codes sein. +- `hiddenLangs`: Diese Sprachen werden im Navigationsmenü nicht angezeigt. Dies wird für Sprachen verwendet, die noch nicht zur Veröffentlichung bereit sind. -As an example, if you wanted to enable Dothraki as a language, your `all-langs.js` objects should look like this: +Wenn du zum Beispiel Dothraki als Sprache aktivieren möchtest, sollten deine `all-langs.js`-Objekte wie folgt aussehen: ```js export const availableLangs = { @@ -138,15 +138,15 @@ export enum LangCodes = { export const hiddenLangs = ['dothraki']; ``` -> [!NOTE] When a language has been set up in the deployment pipeline AND has a public `/news` instance live, it can be removed from the `hiddenLangs` array and be made available to the public. +> [!NOTE] Wenn eine Sprache in der Deployment-Pipeline eingerichtet wurde UND eine öffentliche `/news`-Instanz live ist, kann sie aus dem `hiddenLangs`-Array entfernt und der Öffentlichkeit zugänglich gemacht werden. -Next, open the `client/src/utils/algolia-locale-setup.ts` file. This data is used for the search bar that loads `/news` articles. While it is unlikely that you are going to test this functionality, missing the data for your language can lead to errors when attempting to build the codebase locally. +Als nächstes öffnest du die Datei `client/src/utils/algolia-locale-setup.ts`. Diese Daten werden für die Suchleiste verwendet, die `/news `-Artikel lädt. Es ist zwar unwahrscheinlich, dass du diese Funktion testen wirst, aber das Fehlen der Daten für deine Sprache kann zu Fehlern führen, wenn du versuchst, die Codebasis lokal zu erstellen. -Add an object for your language to the `algoliaIndices` object. You should use the the same values as the `english` object for local testing, replacing the `english` key with your language's `availableLangs` value. +Füge ein Objekt für deine Sprache zum `algoliaIndices`-Objekt hinzu. Du solltest die gleichen Werte wie das `english`-Objekt für lokale Tests verwenden, indem du den `english`-Schlüssel durch den `availableLangs`-Wert deiner Sprache ersetzt. -> [!NOTE] If we have already deployed an instance of news in your target language, you can update the values to reflect the live instance. Otherwise, use the English values. +> [!NOTE] Wenn wir bereits eine Instanz von news in deiner Zielsprache bereitgestellt haben, kannst du die Werte aktualisieren, damit sie die Live-Instanz widerspiegeln. Andernfalls verwendest du die englischen Werte. -If you were to add Dothraki: +Wenn du Dothraki hinzufügen würdest: ```js const algoliaIndices = { @@ -173,9 +173,9 @@ const algoliaIndices = { }; ``` -### Releasing a Superblock +### Freigabe eines Superblocks -After a superblock has been fully translated into a language, there are two steps to release it. First add the superblock enum to that language's `auditedCerts` array. So, if you want to release the new Responsive Web Design superblock for Dothraki, the array should look like this: +Nachdem ein Superblock vollständig in eine Sprache übersetzt worden ist, gibt es zwei Schritte, um ihn freizugeben. Füge zunächst den Superblock enum zum Array `auditedCerts` dieser Sprache hinzu. Wenn du also den neuen Responsive Web Design-Superblock für Dothraki freigeben willst, sollte das Array wie folgt aussehen: ```ts export const auditedCerts = { @@ -189,17 +189,17 @@ export const auditedCerts = { }; ``` -Finally, if the superblock is in a "new" state (that is, replacing a legacy superblock), the `languagesWithAuditedBetaReleases` array should be updated to include the new language like this: +Wenn sich der Superblock in einem "neuen" Zustand befindet (d. h. einen alten Superblock ersetzt), sollte das Array `languagesWithAuditedBetaReleases` wie folgt aktualisiert werden, um die neue Sprache aufzunehmen: ```ts export const languagesWithAuditedBetaReleases: ['english', 'dothraki']; ``` -This will move the new superblock to the correct place in the curriculum map on `/learn`. +Dadurch wird der neue Superblock an die richtige Stelle in der Lehrplanübersicht auf `/learn` verschoben. -## Enabling Localized Videos +## Aktivieren von lokalisierten Videos -For the video challenges, you need to change a few things. First add the new locale to the GraphQL query in the `client/src/templates/Challenges/video/Show.tsx` file. For example, adding Dothraki to the query: +Für die Videoaufgaben musst du ein paar Dinge ändern. Füge zunächst das neue Gebietsschema zur GraphQL-Abfrage in der Datei `client/src/templates/Challenges/video/Show.tsx` ein. Zum Beispiel, indem man Dothraki zur Abfrage hinzufügt: ```tsx query VideoChallenge($slug: String!) { @@ -214,7 +214,7 @@ For the video challenges, you need to change a few things. First add the new loc ... ``` -Then add an id for the new language to any video challenge in an audited block. For example, if `auditedCerts` in `all-langs.ts` includes `scientific-computing-with-python` for `dothraki`, then you must add a `dothraki` entry in `videoLocaleIds`. The frontmatter should then look like this: +Füge dann eine ID für die neue Sprache zu jeder Videoaufgabe in einem geprüften Block hinzu. Wenn zum Beispiel `auditedCerts` in `all-langs.ts` `scientific-computing-with-python` für `dothraki` enthält, dann musst du einen `dothraki` Eintrag in `videoLocaleIds` hinzufügen. Das Front Matter sollte dann so aussehen: ```yml videoLocaleIds: @@ -226,7 +226,7 @@ dashedName: introduction-why-program --- ``` -Update the `VideoLocaleIds` interface in `client/src/redux/prop-types` to include the new language. +Aktualisiere das `VideoLocaleIds`-Interface in `client/src/redux/prop-types`, um die neue Sprache aufzunehmen. ```ts export interface VideoLocaleIds { @@ -237,7 +237,7 @@ export interface VideoLocaleIds { } ``` -And finally update the challenge schema in `curriculum/schema/challengeSchema.js`. +Aktualisiere schließlich das Challenge-Schema in `curriculum/schema/challengeSchema.js`. ```js videoLocaleIds: Joi.when('challengeType', { @@ -253,27 +253,27 @@ videoLocaleIds: Joi.when('challengeType', { ## Client UI -You will need to take an additional step to handle the client UI translations. +Du musst einen zusätzlichen Schritt unternehmen, um die Übersetzungen der Client-UI zu übernehmen. -The Crowdin workflows will automatically pull down _some_ of the UI translations, but there are a couple of files that need to be moved manually. +Die Crowdin-Workflows ziehen automatisch _einige_ der UI-Übersetzungen herunter, aber es gibt ein paar Dateien, die manuell verschoben werden müssen. -You will want to copy the following files from `/client/i18n/locales/english` to `/client/i18n/locales/`, and apply translations as needed: +Du musst die folgenden Dateien von `/client/i18n/locales/english` nach `/client/i18n/locales/` kopieren und die Übersetzungen nach Bedarf durchführen: - `links.json` - `meta-tags.json` - `motivation.json` - `trending.json` -## Testing Translations Locally +## Übersetzungen lokal testen -If you would like to test translations locally, before adding them to our main repository - skip the Crowdin workflow changes. Follow the steps for enabling a language, then download the translations from Crowdin and load them into your local code. +Wenn du Übersetzungen lokal testen möchtest, bevor du sie zu unserem main-Repository hinzufügst, kannst du die Änderungen am Crowdin-Workflow überspringen. Folge den Schritten zur Aktivierung einer Sprache, lade dann die Übersetzungen von Crowdin herunter und lade sie in deinen lokalen Code. -Because the language has not been approved for production, our scripts are not automatically downloading the translations yet. Only staff have the access to directly download the translations - you are welcome to reach out to us in our [contributors chat room](https://discord.gg/PRyKn3Vbay), or you can translate the English markdown files locally for testing purposes. +Da die Sprache noch nicht für die Produktion freigegeben wurde, laden unsere Skripte die Übersetzungen noch nicht automatisch herunter. Nur Mitarbeiter haben die Möglichkeit, die Übersetzungen direkt herunterzuladen - Du kannst uns gerne in unserem ["Contributors" Chatraum](https://discord.gg/PRyKn3Vbay) ansprechen, oder du kannst die englischen Markdown-Dateien lokal zu Testzwecken übersetzen. -Once you have the files, you will need to place them in the correct directory. For the curriculum challenges, you should place the certification folders (i.e. `01-responsive-web-design`) within the `curriculum/challenges/{lang}` directory. For our Dothraki translations, this would be `curriculum/challenges/dothraki`. The client translation `.json` files will go in the `client/i18n/locales/{lang}` directory. +Sobald du die Dateien hast, musst du sie im richtigen Verzeichnis ablegen. Für die Studienplanaufgaben solltest du die Zertifizierungsordner (z.B. `01-responsive-web-design`) in das Verzeichnis `curriculum/challenges/{lang}` ablegen. Für unsere Dothraki-Übersetzungen wäre dies `curriculum/challenges/dothraki`. Die Client-Übersetzungsdateien `.json` werden im Verzeichnis `client/i18n/locales/{lang}` abgelegt. -Update your `.env` file to use your new language for `CLIENT_LOCALE` and `CURRICULUM_LOCALE`. +Aktualisiere deine `.env`-Datei, um deine neue Sprache für `CLIENT_LOCALE` und `CURRICULUM_LOCALE` zu verwenden. -Once these are in place, you should be able to run `npm run develop` to view your translated version of freeCodeCamp. +Sobald du diese Einstellungen vorgenommen hast, solltest du `npm run develop` ausführen können, um deine übersetzte Version von freeCodeCamp anzuzeigen. -> [!ATTENTION] While you may perform translations locally for the purpose of testing, we remind everyone that translations should _not_ be submitted through GitHub and should only be done through Crowdin. Be sure to reset your local codebase after you are done testing. +> [!ATTENTION] Du kannst zwar lokal Übersetzungen zu Testzwecken vornehmen, aber wir erinnern alle daran, dass Übersetzungen _nicht_ über GitHub eingereicht werden sollten und nur über Crowdin erfolgen sollten. Achte darauf, dass du deine lokale Codebasis zurücksetzt, wenn du mit dem Testen fertig bist. diff --git a/docs/i18n/german/how-to-setup-freecodecamp-mobile-app-locally.md b/docs/i18n/german/how-to-setup-freecodecamp-mobile-app-locally.md index 9c83fa67caf49f..975d220bbf010e 100644 --- a/docs/i18n/german/how-to-setup-freecodecamp-mobile-app-locally.md +++ b/docs/i18n/german/how-to-setup-freecodecamp-mobile-app-locally.md @@ -1,110 +1,110 @@ -Follow this guide for setting up the freeCodeCamp mobile app locally on your system. This is highly recommended if you want to contribute regularly. +Folge dieser Anleitung, um die freeCodeCamp mobile App lokal auf deinem System einzurichten. Dies ist sehr empfehlenswert, wenn du regelmäßig einen Beitrag leisten willst. -Some of the contribution workflows – like fixing bugs in the codebase – need you to run freeCodeCamp app locally. +Für einige der Arbeitsabläufe - wie das Beheben von Fehlern in der Codebasis - musst du die freeCodeCamp-App lokal ausführen. -### How to prepare your local machine +### Wie du deinen lokalen Rechner vorbereitest -Start by installing the prerequisite software for your operating system. +Installiere zunächst die erforderliche Software für dein Betriebssystem. -#### Prerequisites: +#### Voraussetzungen: -| Prerequisite | Version | Notes | -| --------------------------------- | ------- | ---------------------------------------- | -| [Flutter](https://flutter.dev/) | `3.x` | - | -| Dart (comes bundled with Flutter) | `2.x` | We use the version bundled with Flutter. | +| Voraussetzung | Version | Notizen | +| --------------------------------------------- | ------- | ------------------------------------------------------------- | +| [Flutter](https://flutter.dev/) | `3.x` | - | +| Dart (wird zusammen mit Flutter ausgeliefert) | `2.x` | Wir verwenden die Version, die mit Flutter ausgeliefert wird. | -> [!ATTENTION] If you have a different version, please install the recommended version. We can only support installation issues for recommended versions. +> [!ATTENTION] Wenn du eine andere Version hast, installiere bitte die empfohlene Version. Wir können nur Installationsprobleme für die empfohlenen Versionen unterstützen. -If Flutter is already installed on your machine, run the following commands to validate the versions: +Wenn Flutter bereits auf deinem Rechner installiert ist, führe die folgenden Befehle aus, um die Versionen zu überprüfen: ```console flutter --version dart --version ``` -> [!TIP] We highly recommend updating to the latest stable releases of the software listed above. +> [!TIP] Wir empfehlen dringend, auf die neuesten stabilen Versionen der oben aufgeführten Software zu aktualisieren. -Once you have the prerequisites installed, you need to prepare your development environment. This is common for many development workflows, and you will only need to do this once. +Sobald du die notwendigen Ressourcen installiert hast, musst du deine Entwicklungsumgebung vorbereiten. Dies ist bei vielen Entwicklungsabläufen üblich, und du musst dies nur einmal tun. -##### Follow these steps to get your development environment ready: +##### Befolge diese Schritte, um deine Entwicklungsumgebung vorzubereiten: -1. Install [Git](https://git-scm.com/) or your favorite Git client, if you haven't already. Update to the latest version; the version that came bundled with your OS may be outdated. +1. Installiere [Git](https://git-scm.com/) oder deinen bevorzugten Git-Client, falls du das nicht schon getan hast. Aktualisiere die neueste Version; die Version, die mit deinem Betriebssystem mitgeliefert wurde, ist möglicherweise veraltet. -2. Setup [Android Studio](https://developer.android.com/studio) and [Android Emulators](https://developer.android.com/studio/run/managing-avds) with the latest released Android version. We recommend using the Pixel 3a XL and Nexus One(for emulating smaller screens). +2. Richte [Android Studio](https://developer.android.com/studio) und [Android Emulatoren](https://developer.android.com/studio/run/managing-avds) mit der neuesten Android-Version ein. Wir empfehlen die Verwendung des Pixel 3a XL und Nexus One (für die Emulation kleinerer Bildschirme). -3. (Optional for MacOS) Setup Xcode and iOS Simulator with the latest released iOS version. +3. (Optional für MacOS) Richte Xcode und den iOS-Simulator mit der neuesten veröffentlichten iOS-Version ein. -4. (Optional but recommended) [Set up an SSH Key](https://help.github.com/articles/generating-an-ssh-key/) for GitHub. +4. (Optional, aber empfohlen) [Richte einen SSH-Schlüssel](https://help.github.com/articles/generating-an-ssh-key/) für GitHub ein. -5. Install a code editor of your choice. +5. Installiere einen Code-Editor deiner Wahl. - We highly recommend using [Visual Studio Code](https://code.visualstudio.com/) or Android Studio. We also recommend installing the official [extensions](https://docs.flutter.dev/get-started/editor?tab=vscode). + Wir empfehlen dringend die Verwendung von [Visual Studio Code](https://code.visualstudio.com/) oder Android Studio. Wir empfehlen auch die Installation der offiziellen [Erweiterungen](https://docs.flutter.dev/get-started/editor?tab=vscode). -## Fork the repository on GitHub +## Forke das Repository auf GitHub -[Forking](https://help.github.com/articles/about-forks/) is a step where you get your own copy of the repository (a.k.a _repo_) on GitHub. +[Forking](https://help.github.com/articles/about-forks/) ist ein Schritt, bei dem du deine eigene Kopie des Repositorys (auch bekannt als _Repo_) auf GitHub erhältst. -This is essential, as it allows you to work on your own copy of freeCodeCamp mobile app on GitHub, or to download (clone) your repository to work on locally. Later, you will be able to request changes to be pulled into the main repository from your fork via a pull request (PR). +Dies ist wichtig, da es dir ermöglicht, an deiner eigenen Kopie der freeCodeCamp mobile App auf GitHub zu arbeiten oder dein Repository herunterzuladen (zu klonen), um lokal daran zu arbeiten. Später kannst du über einen Pull Request (PR) beantragen, dass Änderungen aus deinem Fork in das Haupt-Repository gezogen werden. -> [!TIP] The main repository at `https://github.com/freeCodeCamp/mobile` is often referred to as the `upstream` repository. +> [!TIP] Das Haupt-Repository unter `https://github.com/freeCodeCamp/mobile` wird oft als `upstream`-Repository bezeichnet. > -> Your fork at `https://github.com/YOUR_USER_NAME/mobile` is often referred to as the `origin` repository. `YOUR_USER_NAME` would be replaced with your GitHub username. +> Dein Fork unter `https://github.com/YOUR_USER_NAME/mobile` wird oft als `origin`-Repository bezeichnet. `YOUR_USER_NAME` wird durch deinen GitHub-Benutzernamen ersetzt. -**Follow these steps to fork the `https://github.com/freeCodeCamp/mobile` repository:** +**Folge diesen Schritten, um das `https://github.com/freeCodeCamp/mobile`-Repository zu forken:** -1. Go to the freeCodeCamp mobile repository on GitHub: +1. Gehe zum freeCodeCamp mobile Repository auf GitHub: -2. Click the "Fork" Button in the upper right-hand corner of the interface ([More Details Here](https://help.github.com/articles/fork-a-repo/)) +2. Klicke auf den "Fork"-Button in der oberen rechten Ecke der Benutzeroberfläche ([Mehr Details hier](https://help.github.com/articles/fork-a-repo/)) -3. After the repository has been forked, you will be taken to your copy of the repository at `https://github.com/YOUR_USER_NAME/mobile` (`YOUR_USER_NAME` would be replaced with your GitHub user name.) +3. Nachdem das Repository geforkt wurde, gelangst du zu deiner Kopie des Repositorys unter `https://github.com/YOUR_USER_NAME/mobile` (`YOUR_USER_NAME` würde durch deinen GitHub-Benutzernamen ersetzt werden) -## Clone your fork from GitHub +## Klone deinen Fork von GitHub -[Cloning](https://help.github.com/articles/cloning-a-repository/) is where you **download** a copy of a repository from a `remote` location that is either owned by you or by someone else. In your case, this remote location is your `fork` of freeCodeCamp's repository that should be available at `https://github.com/YOUR_USER_NAME/mobile`. (`YOUR_USER_NAME` would be replaced with your GitHub user name.) +Beim [Klonen](https://help.github.com/articles/cloning-a-repository/) **downloadest ** du eine Kopie eines Repositorys von einem `remote`- Ort, der entweder dir oder einer anderen Person gehört. In deinem Fall ist dieser Remote-Speicherort dein `Fork` des freeCodeCamp-Repositorys, das unter `https://github.com/YOUR_USER_NAME/mobile` verfügbar sein sollte. (`YOUR_USER_NAME` wird durch deinen GitHub-Benutzernamen ersetzt.) -Run these commands on your local machine: +Führe diese Befehle auf deinem lokalen Rechner aus: -1. Open a Terminal / Command Prompt / Shell in your projects directory +1. Öffne ein Terminal / Command Prompt / Shell in deinem Projektverzeichnis - _i.e.: `/yourprojectsdirectory/`_ + _z.B.: `/yourprojectsdirectory/`_ -2. Clone your fork of freeCodeCamp, replacing `YOUR_USER_NAME` with your GitHub Username +2. Klone deinen Fork von freeCodeCamp und ersetze `YOUR_USER_NAME` durch deinen GitHub Benutzernamen ```console git clone --depth=1 https://github.com/YOUR_USER_NAME/mobile.git ``` -This will download the entire freeCodeCamp mobile repository to your projects directory. +Dadurch wird das gesamte freeCodeCamp mobile Repository in dein Projektverzeichnis heruntergeladen. -Note: `--depth=1` creates a shallow clone of your fork, with only the most recent history/commit. +Hinweis: `--depth=1` erstellt einen oberflächlichen Klon deines Forks, der nur den jüngsten Verlauf/Commit enthält. -## Set up syncing from parent +## Synchronisierung vom übergeordneten System konfigurieren -Now that you have downloaded a copy of your fork, you will need to set up an `upstream` remote to the parent repository. +Jetzt, wo du eine Kopie deines Forks heruntergeladen hast, musst du einen `upstream` zum übergeordneten Repository einrichten. -[As mentioned earlier](#fork-the-repository-on-github), the main repository is referred `upstream` repository. Your fork referred to as the `origin` repository. +[Wie bereits erwähnt](#fork-the-repository-on-github), wird das Haupt-Repository als `upstream`-Repository bezeichnet. Dein Fork wird als `origin`-Repository bezeichnet. -You need a reference from your local clone to the `upstream` repository in addition to the `origin` repository. This is so that you can sync changes from the main repository without the requirement of forking and cloning repeatedly. +Du benötigst eine Referenz von deinem lokalen Klon auf das `upstream`-Repository zusätzlich zum `origin`-Repository. Auf diese Weise kannst du Änderungen aus dem Haupt-Repository synchronisieren, ohne dass du wiederholt forken und klonen musst. -1. Change directory to the new `mobile` directory: +1. Wechsle in das neue `mobile`-Verzeichnis: ```console cd mobile ``` -2. Add a remote reference to the main freeCodeCamp mobile repository: +2. Füge eine Remote-Referenz zum Haupt-Repository von freeCodeCamp mobile hinzu: ```console git remote add upstream https://github.com/freeCodeCamp/mobile.git ``` -3. Ensure the configuration looks correct: +3. Stelle sicher, dass die Konfiguration korrekt aussieht: ```console git remote -v ``` - The output should look something like below (replacing `YOUR_USER_NAME` with your GitHub username): + Die Ausgabe sollte in etwas so aussehen wie unten (ersetze `YOUR_USER_NAME` durch deinen GitHub Benutzernamen): ```console origin https://github.com/YOUR_USER_NAME/mobile.git (fetch) @@ -113,25 +113,25 @@ You need a reference from your local clone to the `upstream` repository in addit upstream https://github.com/freeCodeCamp/mobile.git (push) ``` -## Running freeCodeCamp mobile app locally +## freeCodeCamp mobile App lokal ausführen -Now that you have a local copy of the mobile app, you can follow these instructions to run it locally. +Jetzt, da du eine lokale Kopie der mobilen Anwendung hast, kannst du die folgenden Anweisungen befolgen, um sie lokal auszuführen. -If you do run into issues, first perform a web search for your issue and see if it has already been answered. If you cannot find a solution, please search our [GitHub issues](https://github.com/freeCodeCamp/mobile/issues) page for a solution and report the issue if it has not yet been reported. +Wenn du auf Probleme stößt, führe zunächst eine Suche nach deinem Problem im Web durch und siehe nach, ob es bereits beantwortet wurde. Wenn du keine Lösung findest, suche bitte auf unserer [GitHub issues](https://github.com/freeCodeCamp/mobile/issues) Seite nach einer Lösung und melde das Problem, falls es noch nicht gemeldet wurde. -And as always, feel free to ask questions on the ['Contributors' category on our forum](https://forum.freecodecamp.org/c/contributors) or [our chat server](https://discord.gg/PRyKn3Vbay). +Und wie immer kannst du Fragen in der [Kategorie 'Contributors' in unserem Forum](https://forum.freecodecamp.org/c/contributors) oder [auf unserem Chat-Server](https://discord.gg/PRyKn3Vbay) stellen. -> [!NOTE] The `mobile` directory contains two folders ie. `mobile-api` and `mobile-app`. `mobile-api` contains the API code used for serving the podcasts. `mobile-app` contains the Flutter app which is where you should be when you follow the below steps. +> [!NOTE] Das Verzeichnis `mobile` enthält zwei Ordner, nämlich `mobile-api` und `mobile-app`. `mobile-api` enthält den API-Code, der für die Bereitstellung der Podcasts verwendet wird. `mobile-app` enthält die Flutter-App. Dort solltest du dich befinden, wenn du die folgenden Schritte befolgst. -### Configuring dependencies +### Konfigurieren der Abhängigkeiten -#### Step 1: Set up the environment variable file +#### Schritt 1: Einrichten der Umgebungsvariablendatei -The default API keys and environment variables are stored in the file `sample.env`. This file needs to be copied to a new file named `.env` that is accessed dynamically during the installation step. Remember to change the directory to `mobile-app` before running the following commands. +Die Standard-API-Schlüssel und Umgebungsvariablen sind in der Datei `sample.env` gespeichert. Diese Datei muss in eine neue Datei namens `.env` kopiert werden, auf die während des Installationsschritts dynamisch zugegriffen wird. Denke daran, das Verzeichnis in `mobile-app` zu ändern, bevor du die folgenden Befehle ausführst. ```console -# Create a copy of the "sample.env" and name it ".env". -# Populate it with the necessary API keys and secrets: +# Erstelle eine Kopie der "sample.env" und benenne sie ".env". +# Trage die notwendigen API-Schlüssel und Secrets in die Datei ein: ``` @@ -150,41 +150,41 @@ copy sample.env .env -The keys in the `.env` file are _not_ required to be changed to run the app locally. You can leave the default values copied over from `sample.env` as-is. +Die Schlüssel in der `.env` Datei müssen _nicht_ geändert werden, um die App lokal auszuführen. Du kannst die aus `sample.env` kopierten Standardwerte so belassen, wie sie sind. -#### Step 2: Install dependencies +#### Schritt 2: Installieren von Abhängigkeiten -This step will install the dependencies required for the application to run: +In diesem Schritt werden die für die Ausführung der Anwendung erforderlichen Abhängigkeiten installiert: ```console flutter pub get ``` -#### Step 3: Start the freeCodeCamp mobile app +#### Schritt 3: Starte die freeCodeCamp mobile App -Start the emulator of your choice(Android or iOS) and wait for the bootup process to complete. +Starte den Emulator deiner Wahl (Android oder iOS) und warte, bis der Startvorgang abgeschlossen ist. -You can now start the app by running the following command: +Du kannst die App nun mit folgendem Befehl starten: ```console flutter run ``` -> [!TIP] If you're using VSCode or Android Studio then you can easily start the app without having to execute any terminal commands. More information [here](https://docs.flutter.dev/get-started/test-drive). +> [!TIP] Wenn du VSCode oder Android Studio verwendest, kannst du die App ganz einfach starten, ohne Terminalbefehle ausführen zu müssen. Mehr Informationen dazu [hier](https://docs.flutter.dev/get-started/test-drive). -## Making changes locally +## Änderungen lokal vornehmen -You can now make changes to files and commit your changes to your local clone of your fork. +Du kannst jetzt Änderungen an Dateien vornehmen und deine Änderungen an deinen lokalen Klon deines Forks übertragen. -Follow these steps: +Folge diesen Schritten: -1. Validate that you are on the `main` branch: +1. Überprüfe, ob du dich auf dem `main`-Branch befindest: ```console git status ``` - You should get an output like this: + Du solltest eine Ausgabe wie diese erhalten: ```console On branch main @@ -193,59 +193,59 @@ Follow these steps: nothing to commit, working directory clean ``` - If you are not on main or your working directory is not clean, resolve any outstanding files/commits and checkout `main`: + Wenn du nicht auf main bist oder dein Arbeitsverzeichnis nicht bereinigt ist, löse alle ausstehenden Dateien/Commits auf und checke `main` aus: ```console git checkout main ``` -2. Sync the latest changes from the upstream `main` branch to your local main branch: +2. Synchronisiere die letzten Änderungen aus dem Upstream `main`-Zweig mit deinem lokalen Hauptzweig: - > [!WARNING] If you have any outstanding pull request that you made from the `main` branch of your fork, you will lose them at the end of this step. + > [!WARNING] Wenn du noch ausstehende Pull Requests aus dem `main`-Zweig deines Forks besitzt, verlierst du sie am Ende dieses Schrittes. > - > You should ensure your pull request is merged by a moderator before performing this step. To avoid this scenario, you should **always** work on a branch other than the `main`. + > Du solltest sicherstellen, dass dein Pull-Request von einem Moderator zusammengeführt wird, bevor du diesen Schritt ausführst. Um dieses Szenario zu vermeiden, solltest du **immer** auf einem anderen Zweig als dem `main` arbeiten. - This step **will sync the latest changes** from the main repository of freeCodeCamp mobile. It is important that you rebase your branch on top of the latest `upstream/main` as often as possible to avoid conflicts later. + Dieser Schritt **synchronisiert die letzten Änderungen** aus dem Haupt-Repository von freeCodeCamp mobile. Es ist wichtig, dass du deinen Zweig so oft wie möglich auf den neuesten `upstream/main` zurücksetzt, um spätere Konflikte zu vermeiden. - Update your local copy of the freeCodeCamp mobile upstream repository: + Aktualisiere deine lokale Kopie des freeCodeCamp mobile Upstream-Repository: ```console git fetch upstream ``` - Hard reset your main branch with the freeCodeCamp mobile main: + Führe einen Hard Reset deines Hauptzweiges mit dem freeCodeCamp mobile main durch: ```console git reset --hard upstream/main ``` - Push your main branch to your origin to have a clean history on your fork on GitHub: + Schiebe deinen Hauptbranch in deinen origin, um einen sauberen Verlauf deines Forks auf GitHub zu haben: ```console git push origin main --force ``` - You can validate your current main matches the upstream/main by performing a diff: + Du kannst überprüfen, ob dein aktueller main mit dem upstream/main übereinstimmt, indem du einen diff durchführst: ```console git diff upstream/main ``` - The resulting output should be empty. + Die resultierende Ausgabe sollte leer sein. -3. Create a fresh new branch: +3. Erstelle einen neuen Zweig: - Working on a separate branch for each issue helps you keep your local work copy clean. You should never work on the `main`. This will soil your copy of freeCodeCamp mobile and you may have to start over with a fresh clone or fork. + Die Arbeit an einem separaten Zweig für jede Ausgabe hilft dir, deine lokale Arbeitskopie sauber zu halten. Du solltest niemals am `main` arbeiten. Dadurch wird deine Kopie von freeCodeCamp mobile verunreinigt und du musst eventuell mit einem neuen Klon oder Fork neu beginnen. - Check that you are on `main` as explained previously, and branch off from there: + Vergewissere dich, dass du auf `main` bist, wie zuvor erklärt, und zweige von dort ab: ```console git checkout -b fix/update-guide-for-xyz ``` - Your branch name should start with a `fix/`, `feat/`, `docs/`, etc. Avoid using issue numbers in branches. Keep them short, meaningful and unique. + Dein Zweigname sollte mit `fix/`, `feat/`, `docs/` usw. beginnen. Vermeide die Verwendung von Issue-Nummern in Zweigen. Halte sie kurz, aussagekräftig und einzigartig. - Some examples of good branch names are: + Einige Beispiele für gute Zweignamen sind: ```md fix/update-challenges-for-react @@ -255,19 +255,19 @@ Follow these steps: translate/add-spanish-basic-html ``` -4. Edit pages and work on code in your favorite text editor. +4. Bearbeite Seiten und arbeite am Code in deinem bevorzugten Texteditor. -5. Once you are happy with the changes you should optionally run the mobile app locally to preview the changes. +5. Wenn du mit den Änderungen zufrieden bist, solltest du die mobile App optional lokal ausführen, um eine Vorschau der Änderungen zu erhalten. -6. Make sure you fix any errors and check the formatting of your changes. +6. Stelle sicher, dass du alle Fehler korrigierst und die Formatierung deiner Änderungen überprüfst. -7. Check and confirm the files you are updating: +7. Überprüfe und bestätige die Dateien, die du aktualisierst: ```console git status ``` - This should show a list of `unstaged` files that you have edited. + Dies sollte eine Liste `unstaged`-Dateien anzeigen, die du verändert hast. ```console On branch feat/documentation @@ -282,27 +282,27 @@ Follow these steps: ... ``` -8. Stage the changes and make a commit: +8. Führe die Änderungen durch und mache einen Commit: - In this step, you should only mark files that you have edited or added yourself. You can perform a reset and resolve files that you did not intend to change if needed. + In diesem Schritt solltest du nur Dateien markieren, die du selbst bearbeitet oder hinzugefügt hast. Bei Bedarf kannst du einen Reset durchführen und Dateien lösen, die du nicht ändern wolltest. ```console git add path/to/my/changed/file.ext ``` - Or you can add all the `unstaged` files to the staging area: + Oder du kannst alle `unstaged`-Dateien zum Staging-Bereich hinzufügen: ```console git add . ``` - Only the files that were moved to the staging area will be added when you make a commit. + Nur die Dateien, die in den Staging-Bereich verschoben wurden, werden hinzugefügt, wenn du einen Commit durchführst. ```console git status ``` - Output: + Ausgabe: ```console On branch feat/documentation @@ -315,13 +315,13 @@ Follow these steps: modified: mobile-app/lib/main.dart ``` - Now, you can commit your changes with a short message like so: + Jetzt kannst du deine Änderungen mit einer kurzen Nachricht wie dieser übertragen: ```console git commit -m "fix: my short commit message" ``` - Some examples: + Einige Beispiele: ```md fix: update guide article for Java - for loop @@ -330,9 +330,9 @@ Follow these steps: Optional: - We highly recommend making a conventional commit message. This is a good practice that you will see on some of the popular Open Source repositories. As a developer, this encourages you to follow standard practices. + Wir empfehlen dringend eine konventionelle Commit-Nachricht zu verfassen. Dies ist eine gute Praxis, die du bei einigen der beliebten Open-Source-Repositories sehen kannst. Dies ermutigt dich als Entwickler, Standardverfahren zu befolgen. - Some examples of conventional commit messages are: + Einige Beispiele für konventionelle Commit-Meldungen sind: ```md fix: update HTML guide article @@ -341,29 +341,29 @@ Follow these steps: docs: update contributing guidelines ``` - Keep these short, not more than 50 characters. You can always add additional information in the description of the commit message. + Halte sie kurz, nicht länger als 50 Zeichen. Du kannst jederzeit zusätzliche Informationen in der Beschreibung der Commit-Nachricht hinzufügen. - This does not take any additional time than an unconventional message like 'update file' or 'add index.md' + Das dauert nicht länger als eine unkonventionelle Meldung wie "update file" oder "add index.md" - You can learn more about why you should use conventional commits [here](https://www.conventionalcommits.org/en/v1.0.0-beta.2/#why-use-conventional-commits). + Mehr darüber, warum du konventionelle Commits verwenden solltest, erfährst du [hier](https://www.conventionalcommits.org/en/v1.0.0-beta.2/#why-use-conventional-commits). -9. If you realize that you need to edit a file or update the commit message after making a commit you can do so after editing the files with: +9. Wenn du feststellst, dass du eine Datei bearbeiten oder die Commit-Nachricht aktualisieren musst, nachdem du einen Commit gemacht hast, kannst du das nach der Bearbeitung der Dateien wie folgt tun: ```console git commit --amend ``` - This will open up a default text editor like `nano` or `vi` where you can edit the commit message title and add/edit the description. + Dies öffnet einen Standard-Texteditor wie `nano` oder `vi`, in dem du den Titel der Commit-Nachricht bearbeiten und die Beschreibung hinzufügen/bearbeiten kannst. -10. Next, you can push your changes to your fork: +10. Als nächstes kannst du deine Änderungen in deinen Fork schieben: ```console git push origin branch/name-here ``` -## Proposing a Pull Request (PR) +## Einen Pull Request (PR) vorschlagen -After you've committed your changes, check here for [how to open a Pull Request](how-to-open-a-pull-request.md). +Nachdem du deine Änderungen übertragen hast, kannst du hier nachlesen, [wie man einen Pull Request erstellt](how-to-open-a-pull-request.md). -## Troubleshooting +## Fehlerbehebung -### Issues with installing the recommended prerequisites +### Probleme bei der Installation der empfohlenen Voraussetzungen -We regularly develop on the latest or most popular operating systems like macOS 10.15 or later, Ubuntu 18.04 or later, and Windows 10 (with WSL2). +Wir entwickeln regelmäßig auf den neuesten oder beliebtesten Betriebssystemen wie macOS 10.15 oder höher, Ubuntu 18.04 oder höher und Windows 10 (mit WSL2). -It is recommended to research your specific issue on resources such as Google, Stack Overflow, and Stack Exchange. There is a good chance that someone has faced the same issue and there is already an answer to your specific query. +Es wird empfohlen, dein spezifisches Problem auf Ressourcen wie Google, Stack Overflow und Stack Exchange zu untersuchen. Es besteht eine gute Chance, dass jemand mit demselben Problem konfrontiert war und bereits eine Antwort auf deine spezifische Frage gefunden hat. -If you are on a different OS and/or are still running into issues, see [getting help](#getting-help). +Wenn du mit einem anderen Betriebssystem arbeitest und/oder immer noch Probleme hast, lese bitte [Hilfe erhalten](#getting-help). -### Issues with the UI, build errors, etc. +### Probleme mit der Benutzeroberfläche, Build-Fehler usw. -If you face issues with the UI, or builds errors a cleanup can be useful: +Wenn du Probleme mit der Benutzeroberfläche oder Build-Fehler hast, kann eine Bereinigung nützlich sein: ```console flutter clean ``` -### Issues installing dependencies +### Probleme bei der Installation von Abhängigkeiten -If you get errors while installing the dependencies, please make sure that you are not in a restricted network or your firewall settings do not prevent you from accessing resources. +Wenn du bei der Installation der Abhängigkeiten Fehler erhältst, vergewissere dich bitte, dass du dich nicht in einem eingeschränkten Netzwerk befindest oder dass deine Firewall-Einstellungen den Zugriff auf die Ressourcen nicht verhindern. -Be patient as the first time setup can take a while depending on your network bandwidth. +Sei geduldig, denn die Ersteinrichtung kann je nach Netzwerkbandbreite eine Weile dauern. -## Getting Help +## Hilfe bekommen -If you are stuck and need help, feel free to ask questions on the ['Contributors' category on our forum](https://forum.freecodecamp.org/c/contributors) or [the contributors chat room](https://discord.gg/PRyKn3Vbay). +Wenn du nicht weiterkommst und Hilfe brauchst, kannst du deine Fragen in der [Kategorie "Contributors" in unserem Forum](https://forum.freecodecamp.org/c/contributors) oder im ["Contributors "Chatraum](https://discord.gg/PRyKn3Vbay) stellen. -There might be an error in the console of your browser or in Bash / Terminal / Command Line that will help identify the problem. Provide this error message in your problem description so others can more easily identify the issue and help you find a resolution. +In der Konsole deines Browsers oder in der Bash / Terminal / Kommandozeile kann eine Fehlermeldung erscheinen, die dir hilft, das Problem zu identifizieren. Gib diese Fehlermeldung in deiner Problembeschreibung an, damit andere das Problem leichter identifizieren und dir bei der Suche nach einer Lösung helfen können. diff --git a/docs/i18n/german/how-to-setup-wsl.md b/docs/i18n/german/how-to-setup-wsl.md index a981f71f0878e7..a4fe0c77b9b14c 100644 --- a/docs/i18n/german/how-to-setup-wsl.md +++ b/docs/i18n/german/how-to-setup-wsl.md @@ -127,7 +127,7 @@ Nachdem du nun die Voraussetzungen erfüllt hast, folge [unserem Leitfaden zur l ## Nützliche Links -- [A WSL2 Dev Setup with Ubuntu 20.04, Node.js, MongoDB, VS Code and Docker](https://hn.mrugesh.dev/wsl2-dev-setup-with-ubuntu-nodejs-mongodb-and-docker) - an article by Mrugesh Mohapatra (Staff Developer at freeCodeCamp.org) +- [Ein WSL2 Dev Setup mit Ubuntu 20.04, Node.js, MongoDB, VS Code und Docker](https://hn.mrugesh.dev/wsl2-dev-setup-with-ubuntu-nodejs-mongodb-and-docker) - ein Artikel von Mrugesh Mohapatra (Staff Developer bei freeCodeCamp.org) - Häufig gestellte Fragen zu: - [Windows Subsystem für Linux](https://docs.microsoft.com/en-us/windows/wsl/faq) - [Docker Desktop für Windows](https://docs.docker.com/docker-for-windows/faqs) diff --git a/docs/i18n/italian/_sidebar.md b/docs/i18n/italian/_sidebar.md index fb617be40a24e6..59ec20e8427485 100644 --- a/docs/i18n/italian/_sidebar.md +++ b/docs/i18n/italian/_sidebar.md @@ -19,10 +19,10 @@ - [Lavorare sulla documentazione](how-to-work-on-the-docs-theme.md) - [Lavorare sulla libreria dei componenti](how-to-work-on-the-component-library.md) - **Guide aggiuntive** - - [Understand the curriculum file structure](curriculum-file-structure.md) - - [Debug outgoing emails locally](how-to-catch-outgoing-emails-locally.md) - - [Set up freeCodeCamp on Windows (WSL)](how-to-setup-wsl.md) - - [User Token Workflow](user-token-workflow.md) + - [Capire la struttura dei file del curriculum](curriculum-file-structure.md) + - [Fare il debug delle email in uscita localmente](how-to-catch-outgoing-emails-locally.md) + - [Settare freeCodeCamp su Windows (WSL)](how-to-setup-wsl.md) + - [Workflow con il Token Utente](user-token-workflow.md) --- @@ -31,7 +31,7 @@ - [Manuale del Leader di lingua](language-lead-handbook.md) - [Manuale di DevOps](devops.md) - [Estensione di VSCode per i corsi](courses-vscode-extension.md) - - [Enable New Language](how-to-enable-new-languages.md) + - [Attivare una nuova lingua](how-to-enable-new-languages.md) --- diff --git a/docs/i18n/italian/how-to-enable-new-languages.md b/docs/i18n/italian/how-to-enable-new-languages.md index d0ee662a2a42c7..aba028cda07c35 100644 --- a/docs/i18n/italian/how-to-enable-new-languages.md +++ b/docs/i18n/italian/how-to-enable-new-languages.md @@ -1,14 +1,14 @@ -# Deploying New Languages on `/learn` +# Rilasciare nuove lingue su `/learn` -Before you can release a new language, you will need to allow the languages to download from Crowdin. +Prima di poter rilasciare una nuova lingua, è necessario consentire alle lingue di fare il download da Crowdin. -## Updating Crowdin Settings +## Aggiornare le impostazioni di Crowdin -In the `Curriculum` and `Learn UI` projects, you will need to select `Project Settings` from the sidebar. Then scroll down to `Language Mapping`, where you will see an option to add custom language codes. Add a new entry for the language you are releasing, selecting `language` as the `Placeholder` value, and entering a URL-friendly lower-case spelling of your language's name for the `Custom code`. If you aren't sure what to use, reach out in our contributor chat and we will assist you. +Nei progetti `Curriculum` e `Learn UI`, dovrai selezionare `Project Settings` dalla barra laterale. Poi scorri fino a `Language Mapping`, dove vedrai un'opzione per aggiungere dei codici personalizzati per le lingue. Aggiungi una nuova voce per la lingua che vuoi rilasciare, selezionando `language` come valore `Placeholder` e inserendo il nome della lingua in minuscolo e in un formato adatto a un URL per il `Custom code`. Se non sei sicuro di cosa usare, contattaci nella chat per contributori e ti aiuteremo. -## Updating Workflows +## Aggiornare i processi automatici -You will need to add a step to the `crowdin-download.client-ui.yml` and `crowdin-download.curriculum.yml`. The step for these will be the same. For example, if you want to enable Dothraki downloads: +Dovrai aggiungere uno step a `crowdin-download.client-ui.yml` e `crowdin-download.curriculum.yml`. Lo step sarà lo stesso per entrambi. Ad esempio, se vuoi abilitare il download per il Dothraki: ```yml ##### Download Dothraki ##### @@ -41,24 +41,24 @@ You will need to add a step to the `crowdin-download.client-ui.yml` and `crowdin # dryrun_action: true ``` -Note that the `download_language` key needs to be set to the language code displayed on Crowdin. +Nota che la chiave `download_language` deve essere impostata sul codice della lingua mostrato su Crowdin. -## Enabling a Language +## Attivare una lingua -> [!NOTE] The above section with updating the workflows should be completed before proceeding - these need to be done in separate steps or the builds will fail. +> [!NOTE] Prima di procedere dovresti completare la sezione precedente aggiornando i processi automatici - devono essere effettuate in step separati o il build fallirà. -There are a few steps to take in order to allow the codebase to build in your desired language. +Ci sono alcuni step da svolgere per consentire il build del codebase nella lingua scelta. -First, visit the `config/i18n/all-langs.ts` file to add the language to the available languages list and configure the values. There are several objects here. +Per prima cosa, visita il file `config/i18n/all-langs.ts` per aggiungere la lingua alle lingue disponibili nella lista e configurare i valori. Qui ci sono diversi oggetti. -- `availableLangs`: For both the `client` and `curriculum` arrays, add the text name of the language. This is the value that will be used in the `.env` file later. -- `auditedCerts`: Add the text name of the language as the _key_, and add an array of `SuperBlocks.{cert}` variables as the _value_. This tells the client which certifications are fully translated. -- `i18nextCodes`: These are the ISO language codes for each language. You will need to add the appropriate ISO code for the language you are enabling. These do need to be unique for each language. -- `LangNames`: These are the display names for the language selector in the navigation menu. -- `LangCodes`: These are the language codes used for formatting dates and numbers. These should be Unicode CLDR codes instead of ISO codes. -- `hiddenLangs`: These languages will not be displayed in the navigation menu. This is used for languages that are not yet ready for release. +- `availableLangs`: per entrambi gli array `client` e `curriculum`, aggiungi il testo del nome della lingua. Questo è il valore che sarà usato nel file `.env` più tardi. +- `auditedCerts`: Aggiungi il nome della lingua come _chiave_ e aggiungi un array di variabili `SuperBlocks.{cert}` come _valore_. Questo dice al client quali certificazioni sono completamente tradotte. +- `i18nextCodes`: Questi sono i codici ISO per le varie lingue. Dovrai aggiungere il codice ISO appropriato per la lingua che stai attivando. Devono essere unici per ogni lingua. +- `LangNames`: Questi sono i nomi delle lingue visualizzati nel menu di navigazione. +- `LangCodes`: Questi sono i codici delle lingue usati per formattare date e numeri. Questi devono essere codici Unicode CLDR invece di codici ISO. +- `hiddenLangs`: Queste lingue non saranno mostrate nel menu di navigazione. Viene usato per le lingue che non sono ancora pronte per il rilascio. -As an example, if you wanted to enable Dothraki as a language, your `all-langs.js` objects should look like this: +Per esempio, se vuoi attivare la lingua Dothraki, il tuo oggetto `all-langs.js` dovrebbe essere come segue: ```js export const availableLangs = { @@ -138,15 +138,15 @@ export enum LangCodes = { export const hiddenLangs = ['dothraki']; ``` -> [!NOTE] When a language has been set up in the deployment pipeline AND has a public `/news` instance live, it can be removed from the `hiddenLangs` array and be made available to the public. +> [!NOTE] Quando è stato impostato il deployment per una lingua che ha già una sezione `/news` live, può essere rimossa dall'array `hiddenLangs` e resa disponibile al pubblico. -Next, open the `client/src/utils/algolia-locale-setup.ts` file. This data is used for the search bar that loads `/news` articles. While it is unlikely that you are going to test this functionality, missing the data for your language can lead to errors when attempting to build the codebase locally. +Poi, apri il file `client/src/utils/algolia-locale-setup.ts`. Questi dati sono usati dalla barra di ricerca che carica gli articoli in `/news`. Anche se è poco probabile che tu stia testando questa funzione, se questi dati mancano per la tua lingua possono esserci degli errori nel costruire il codebase localmente. -Add an object for your language to the `algoliaIndices` object. You should use the the same values as the `english` object for local testing, replacing the `english` key with your language's `availableLangs` value. +Aggiungi un oggetto per la tua lingua all'oggetto `algoliaIndices`. Dovresti usare gli stessi valori dell'oggetto `english` per testare in locale, sostituendo la chiave `english` con il valore della tua lingua in `availableLangs`. -> [!NOTE] If we have already deployed an instance of news in your target language, you can update the values to reflect the live instance. Otherwise, use the English values. +> [!NOTE] Se abbiamo già distribuito un'istanza della pubblicazione nella tua lingua target, puoi aggiornare i valori così da rispecchiare le istanze live. Altrimenti, usa i valori della pubblicazione inglese. -If you were to add Dothraki: +Se volessi aggiungere Dothraki: ```js const algoliaIndices = { @@ -173,9 +173,9 @@ const algoliaIndices = { }; ``` -### Releasing a Superblock +### Rilasciare un superblocco -After a superblock has been fully translated into a language, there are two steps to release it. First add the superblock enum to that language's `auditedCerts` array. So, if you want to release the new Responsive Web Design superblock for Dothraki, the array should look like this: +Dopo che un superblocco è stato completamente tradotto in una lingua, ci sono due step per rilasciarlo. Come prima cosa aggiungi il superblocco enum all'array `auditedCerts` di quella lingua. Quindi, se vuoi rilasciare il nuovo superblocco Web Design Responsivo per Dothraki, l'array dovrebbe essere così: ```ts export const auditedCerts = { @@ -186,20 +186,19 @@ export const auditedCerts = { SuperBlocks.JsAlgoDataStruct, SuperBlocks.FrontEndDevLibs ] -}; ``` -Finally, if the superblock is in a "new" state (that is, replacing a legacy superblock), the `languagesWithAuditedBetaReleases` array should be updated to include the new language like this: +Infine, se il superblocco è nello stato "nuovo" (cioè sostituisce un superblocco legacy), l'array `languagesWithAuditedBetaReleases` dovrebbe essere aggiornato per includere la nuova lingua in questo modo: ```ts export const languagesWithAuditedBetaReleases: ['english', 'dothraki']; ``` -This will move the new superblock to the correct place in the curriculum map on `/learn`. +Questo sposterà il nuovo superblocco nel posto corretto nella mappa del curriculum su `/learn`. -## Enabling Localized Videos +## Attivare video localizzati -For the video challenges, you need to change a few things. First add the new locale to the GraphQL query in the `client/src/templates/Challenges/video/Show.tsx` file. For example, adding Dothraki to the query: +Per le sfide video, devi cambiare alcune cose. Come prima cosa aggiungi la nuova lingua alla query per GraphQL nel file `client/src/templates/Challenges/video/Show.tsx`. Per esempio, in questo modo aggiungeresti Dothraki alla query: ```tsx query VideoChallenge($slug: String!) { @@ -214,19 +213,19 @@ For the video challenges, you need to change a few things. First add the new loc ... ``` -Then add an id for the new language to any video challenge in an audited block. For example, if `auditedCerts` in `all-langs.ts` includes `scientific-computing-with-python` for `dothraki`, then you must add a `dothraki` entry in `videoLocaleIds`. The frontmatter should then look like this: +Quindi aggiungi un id per la nuova lingua ogni sfida video in un blocco verificato (`auditedCerts`). Per esempio, se `auditedCerts` in `all-langs.ts` include `scientific-computing-with-python` per `dothraki`, allora devi aggiungere `dothraki` in `videoLocaleIds`. Il frontespizio dovrebbe essere simile a questo: ```yml videoLocaleIds: espanol: 3muQV-Im3Z0 italian: hiRTRAqNlpE portuguese: AelGAcoMXbI - dothraki: new-id-here + dothraki: nuovo-id-qui dashedName: introduction-why-program --- ``` -Update the `VideoLocaleIds` interface in `client/src/redux/prop-types` to include the new language. +Aggiorna l'interfaccia `VideoLocaleIds` in `client/src/redux/prop-types` così che includa la nuova lingua. ```ts export interface VideoLocaleIds { @@ -237,7 +236,7 @@ export interface VideoLocaleIds { } ``` -And finally update the challenge schema in `curriculum/schema/challengeSchema.js`. +Infine aggiorna lo schema delle sfide in `curriculum/schema/challengeSchema.js`. ```js videoLocaleIds: Joi.when('challengeType', { @@ -251,29 +250,29 @@ videoLocaleIds: Joi.when('challengeType', { }), ``` -## Client UI +## Interfaccia utente client -You will need to take an additional step to handle the client UI translations. +Dovrai fare un ulteriore passo per gestire le traduzioni dell'interfaccia utente client. -The Crowdin workflows will automatically pull down _some_ of the UI translations, but there are a couple of files that need to be moved manually. +I processi automatici scaricano da Crowdin _una parte_ delle traduzioni dell'interfaccia, ma ci sono alcuni file che devono essere creati manualmente. -You will want to copy the following files from `/client/i18n/locales/english` to `/client/i18n/locales/`, and apply translations as needed: +Dovrai copiare i seguenti file da `/client/i18n/locales/english` a `/client/i18n/locales/` e applicare le traduzioni se necessario: - `links.json` - `meta-tags.json` - `motivation.json` - `trending.json` -## Testing Translations Locally +## Testare traduzioni in locale -If you would like to test translations locally, before adding them to our main repository - skip the Crowdin workflow changes. Follow the steps for enabling a language, then download the translations from Crowdin and load them into your local code. +Se desideri testare le traduzioni localmente, prima di aggiungerle al nostro repository principale - salta i cambiamenti delle procedure di Crowdin. Segui i passaggi per abilitare una lingua, quindi scarica le traduzioni da Crowdin e caricale nel tuo codice locale. -Because the language has not been approved for production, our scripts are not automatically downloading the translations yet. Only staff have the access to directly download the translations - you are welcome to reach out to us in our [contributors chat room](https://discord.gg/PRyKn3Vbay), or you can translate the English markdown files locally for testing purposes. +Poiché la lingua non è ancora stata approvata per la produzione, i nostri script non scaricheranno automaticamente le traduzioni. Solo lo staff ha accesso al download diretto delle traduzioni - sei il benvenuto a rivolgerti a noi attraverso la [chat room per i contributori](https://discord.gg/PRyKn3Vbay), o puoi tradurre i file markdown inglesi per le esigenze di test. -Once you have the files, you will need to place them in the correct directory. For the curriculum challenges, you should place the certification folders (i.e. `01-responsive-web-design`) within the `curriculum/challenges/{lang}` directory. For our Dothraki translations, this would be `curriculum/challenges/dothraki`. The client translation `.json` files will go in the `client/i18n/locales/{lang}` directory. +Una volta che avrai i file, li dovrai mettere nelle cartelle giuste. Per le sfide del curriculum, dovresti mettere le cartelle dei certificati (ad esempio `01-responsive-web-design`) nella cartella `curriculum/challenges/{lang}`. Per la nostra traduzione in Dothraki, sarebbe `curriculum/challenges/dothraki`. I file `.json` con le traduzioni del client vanno nella cartella `client/i18n/locales/{lang}`. -Update your `.env` file to use your new language for `CLIENT_LOCALE` and `CURRICULUM_LOCALE`. +Aggiorna il file `.env` in modo da poter utilizzare la tua lingua per `CLIENT_LOCALE` e `CURRICULUM_LOCALE`. -Once these are in place, you should be able to run `npm run develop` to view your translated version of freeCodeCamp. +Una volta che questi saranno in posizione, dovresti essere in grado di eseguire `npm run develop` per vedere la versione tradotta di freeCodeCamp. -> [!ATTENTION] While you may perform translations locally for the purpose of testing, we remind everyone that translations should _not_ be submitted through GitHub and should only be done through Crowdin. Be sure to reset your local codebase after you are done testing. +> [!ATTENTION] Anche se puoi farei delle traduzioni localmente per i test, ricordiamo che le traduzioni _non_ devono essere inviate attraverso GitHub ma solo tramite Crowdin. Assicurati di resettare il tuo codebase locale dopo che avrai finito con i test. diff --git a/docs/i18n/italian/language-lead-handbook.md b/docs/i18n/italian/language-lead-handbook.md index 7b02d5e0c0f72f..9f7200ce98c537 100644 --- a/docs/i18n/italian/language-lead-handbook.md +++ b/docs/i18n/italian/language-lead-handbook.md @@ -65,7 +65,7 @@ Questo è un esempio di come deve essere una parte del file `trending.json`. } ``` -You will want to [build the translated client locally](how-to-enable-new-languages.md) to see if the titles have the right length. Ogni titolo deve rimanere su una sola riga e non andare sulla successiva. +Dovrai [fare il build in locale del client tradotto](how-to-enable-new-languages.md) per vedere se i titoli hanno la giusta lunghezza. Ogni titolo deve rimanere su una sola riga e non andare sulla successiva. ### Come aggiornare gli articoli di tendenza nel cdn diff --git a/docs/i18n/portuguese/_sidebar.md b/docs/i18n/portuguese/_sidebar.md index fe0fecefa124ea..b6dc907d7d9493 100644 --- a/docs/i18n/portuguese/_sidebar.md +++ b/docs/i18n/portuguese/_sidebar.md @@ -19,10 +19,10 @@ - [Trabalhar com a documentação](how-to-work-on-the-docs-theme.md) - [Trabalhar na biblioteca de componentes](how-to-work-on-the-component-library.md) - **Guias adicionais** - - [Understand the curriculum file structure](curriculum-file-structure.md) - - [Debug outgoing emails locally](how-to-catch-outgoing-emails-locally.md) - - [Set up freeCodeCamp on Windows (WSL)](how-to-setup-wsl.md) - - [User Token Workflow](user-token-workflow.md) + - [Compreender a estrutura do arquivo do currículo](curriculum-file-structure.md) + - [Depurar e-mails enviados localmente](how-to-catch-outgoing-emails-locally.md) + - [Configurar freeCodeCamp no Windows (WSL)](how-to-setup-wsl.md) + - [Fluxo de trabalho do token de usuário](user-token-workflow.md) --- @@ -31,7 +31,7 @@ - [Manual do líder do idioma](language-lead-handbook.md) - [Manual do DevOps](devops.md) - [Extensão do VSCode Courses](courses-vscode-extension.md) - - [Enable New Language](how-to-enable-new-languages.md) + - [Habilitar um novo um idioma ](how-to-enable-new-languages.md) --- diff --git a/docs/i18n/portuguese/how-to-enable-new-languages.md b/docs/i18n/portuguese/how-to-enable-new-languages.md index d0ee662a2a42c7..b3bd5ea63e49dc 100644 --- a/docs/i18n/portuguese/how-to-enable-new-languages.md +++ b/docs/i18n/portuguese/how-to-enable-new-languages.md @@ -1,14 +1,14 @@ -# Deploying New Languages on `/learn` +# Implantar novos idiomas no `/learn` -Before you can release a new language, you will need to allow the languages to download from Crowdin. +Antes de lançar um novo idioma, você precisará permitir que os idiomas sejam baixados do Crowdin. -## Updating Crowdin Settings +## Atualizar as configurações do Crowdin -In the `Curriculum` and `Learn UI` projects, you will need to select `Project Settings` from the sidebar. Then scroll down to `Language Mapping`, where you will see an option to add custom language codes. Add a new entry for the language you are releasing, selecting `language` as the `Placeholder` value, and entering a URL-friendly lower-case spelling of your language's name for the `Custom code`. If you aren't sure what to use, reach out in our contributor chat and we will assist you. +Nos projetos `Curriculum` e `Learn UI`, você precisará selecionar `Projects Settings`, na barra lateral. Em seguida, desça até `Language Mapping`, onde você verá uma opção para adicionar códigos de idioma personalizados. Adicione uma nova entrada para o idioma que você está liberando, selecionando `language` como o valor de `Placeholder` e digitando um URL amigável em letras minúsculas do nome do seu idioma para o `Custom code`. Se você não tiver certeza do que usar, fale conosco pelo nosso chat de colaboradores e nós o ajudaremos. -## Updating Workflows +## Atualizar os fluxos de trabalho -You will need to add a step to the `crowdin-download.client-ui.yml` and `crowdin-download.curriculum.yml`. The step for these will be the same. For example, if you want to enable Dothraki downloads: +Você precisará adicionar um passo em `crowdin-download.client-ui.yml` e em `crowdin-download.curriculum.yml`. O passo para ambos será o mesmo. Por exemplo, se você quiser habilitar os downloads de Dothraki: ```yml ##### Download Dothraki ##### @@ -41,24 +41,24 @@ You will need to add a step to the `crowdin-download.client-ui.yml` and `crowdin # dryrun_action: true ``` -Note that the `download_language` key needs to be set to the language code displayed on Crowdin. +Observe que a chave `download_language` precisa ser definida como código do idioma exibido no Crowdin. -## Enabling a Language +## Habilitar um idioma -> [!NOTE] The above section with updating the workflows should be completed before proceeding - these need to be done in separate steps or the builds will fail. +> [!NOTE] A seção acima com a atualização dos fluxos de trabalho deve ser concluída antes de prosseguir - isso precisa ser feito em etapas separadas. Caso contrário, as compilações falharão. -There are a few steps to take in order to allow the codebase to build in your desired language. +Existem algumas etapas a serem seguidas para permitir que a base de código seja compilada no idioma desejado. -First, visit the `config/i18n/all-langs.ts` file to add the language to the available languages list and configure the values. There are several objects here. +Primeiro, visite o arquivo `config/i18n/all-langs.ts` para adicionar o idioma à lista de idiomas disponíveis e configurar os valores. Existem vários objetos aqui. -- `availableLangs`: For both the `client` and `curriculum` arrays, add the text name of the language. This is the value that will be used in the `.env` file later. -- `auditedCerts`: Add the text name of the language as the _key_, and add an array of `SuperBlocks.{cert}` variables as the _value_. This tells the client which certifications are fully translated. -- `i18nextCodes`: These are the ISO language codes for each language. You will need to add the appropriate ISO code for the language you are enabling. These do need to be unique for each language. -- `LangNames`: These are the display names for the language selector in the navigation menu. -- `LangCodes`: These are the language codes used for formatting dates and numbers. These should be Unicode CLDR codes instead of ISO codes. -- `hiddenLangs`: These languages will not be displayed in the navigation menu. This is used for languages that are not yet ready for release. +- `availableLangs`: tanto para o array `client` quanto para o array `curriculum`, adicione o nome do idioma. Esse valor é o que será usado no arquivo `.env` depois. +- `auditedCerts`: adicione o nome do texto do idioma como a _chave_ e adicione um array de variáveis `SuperBlocks.{cert}` como o _valor_. Isto informa ao cliente quais certificações estão totalmente traduzidas. +- `i18nextCodes`: esses são os códigos ISO de cada linguagem. Você vai precisar do código ISO apropriado para o idioma que você está habilitando. Eles precisam ser únicos para cada idioma. +- `LangNames`: esses são os nomes dos idiomas que aparecerão para a seleção no menu de navegação. +- `LangCodes`: esses são os códigos de idiomas usados para formatar datas e números. Esses deverão ser códigos Unicode CLDR ao invés de códigos ISO. +- `hiddenLangs`: Esses idiomas não serão exibidos no menu de navegação. Isto é usado para idiomas que ainda não estão prontos para liberação. -As an example, if you wanted to enable Dothraki as a language, your `all-langs.js` objects should look like this: +Como um exemplo, se você tivesse que habilitar o idioma Dothraki como seu idioma, os objetos `all-langs.js` devem ficar assim: ```js export const availableLangs = { @@ -138,15 +138,15 @@ export enum LangCodes = { export const hiddenLangs = ['dothraki']; ``` -> [!NOTE] When a language has been set up in the deployment pipeline AND has a public `/news` instance live, it can be removed from the `hiddenLangs` array and be made available to the public. +> [!NOTE] Quando um idioma for configurado no pipeline de implantação E tiver uma instância pública de `/news` ativa, ele pode ser removido da matriz `hiddenLangs` e ser disponibilizado ao público. -Next, open the `client/src/utils/algolia-locale-setup.ts` file. This data is used for the search bar that loads `/news` articles. While it is unlikely that you are going to test this functionality, missing the data for your language can lead to errors when attempting to build the codebase locally. +Agora, abra o arquivo `client/src/utils/algolia-locale-setup.ts`. Esse dado é usado para a barra de busca que carrega os artigos `/news`. Embora seja improvável que você venha a testar essa funcionalidade, não ter os dados para o seu idioma pode levar a erros quando tentar criar a base de código localmente. -Add an object for your language to the `algoliaIndices` object. You should use the the same values as the `english` object for local testing, replacing the `english` key with your language's `availableLangs` value. +Adicione um objeto para seu idioma no objeto `algoliaIndices`. Você deve usar os mesmos valores do objeto `english` para o teste local, substituindo a chave `english` pelo valor de `availableLangs` do seu idioma. -> [!NOTE] If we have already deployed an instance of news in your target language, you can update the values to reflect the live instance. Otherwise, use the English values. +> [!NOTE] Se nós já implantamos uma instância do editorial em sua língua-alvo, você pode atualizar os valores para refletir a instância que já está implantada. Do contrário, use os valores em inglês. -If you were to add Dothraki: +Se você fosse adicionar Dothraki: ```js const algoliaIndices = { @@ -173,9 +173,9 @@ const algoliaIndices = { }; ``` -### Releasing a Superblock +### Liberar um superbloco -After a superblock has been fully translated into a language, there are two steps to release it. First add the superblock enum to that language's `auditedCerts` array. So, if you want to release the new Responsive Web Design superblock for Dothraki, the array should look like this: +Após um superbloco ter sido totalmente traduzido para um idioma, há duas etapas necessárias para seu lançamento. Primeiro, adicione o enum do superblock ao array `auditedCerts` do idioma. Assim, se você quiser liberar o novo superbloco de Design Responsivo para a Web para o dothraki, o array deverá ter essa aparência: ```ts export const auditedCerts = { @@ -189,17 +189,17 @@ export const auditedCerts = { }; ``` -Finally, if the superblock is in a "new" state (that is, replacing a legacy superblock), the `languagesWithAuditedBetaReleases` array should be updated to include the new language like this: +Finalmente, se o superbloco estiver em um estado "new" (ou seja, substituindo um superbloco legado), o array de `languagesWithAuditedBetaReleases` deve ser atualizado para incluir o novo idioma, assim: ```ts export const languagesWithAuditedBetaReleases: ['english', 'dothraki']; ``` -This will move the new superblock to the correct place in the curriculum map on `/learn`. +Isso moverá o novo superbloco para o lugar correto no mapa do currículo em `/learn`. -## Enabling Localized Videos +## Ativando vídeos localizados -For the video challenges, you need to change a few things. First add the new locale to the GraphQL query in the `client/src/templates/Challenges/video/Show.tsx` file. For example, adding Dothraki to the query: +Para os desafios em vídeo, você precisa fazer algumas alterações. Primeiro, adicione o novo idioma (locale) à consulta do GraphQL no arquivo `client/src/templates/Challenges/video/Show.tsx`. Por exemplo, para adicionar Dothraki à consulta: ```tsx query VideoChallenge($slug: String!) { @@ -214,7 +214,7 @@ For the video challenges, you need to change a few things. First add the new loc ... ``` -Then add an id for the new language to any video challenge in an audited block. For example, if `auditedCerts` in `all-langs.ts` includes `scientific-computing-with-python` for `dothraki`, then you must add a `dothraki` entry in `videoLocaleIds`. The frontmatter should then look like this: +Em seguida, adicione um id para o novo idioma para qualquer desafio em vídeo em um bloco auditado. Por exemplo, se `auditedCerts` em `all-langs.ts` inclui `scientific-computing-with-python` para `dothraki`, você deve adicionar uma entrada em `dothraki` em `videoLocaleIds`. O frontmatter dever ter essa aparência: ```yml videoLocaleIds: @@ -222,11 +222,11 @@ videoLocaleIds: italian: hiRTRAqNlpE portuguese: AelGAcoMXbI dothraki: new-id-here -dashedName: introduction-why-program +nomeComTracos: introducao-por-que-programa --- ``` -Update the `VideoLocaleIds` interface in `client/src/redux/prop-types` to include the new language. +Atualize a interface de `VideoLocaleIds` em `client/src/redux/prop-types` para que ela inclua o novo idioma. ```ts export interface VideoLocaleIds { @@ -237,7 +237,7 @@ export interface VideoLocaleIds { } ``` -And finally update the challenge schema in `curriculum/schema/challengeSchema.js`. +Por fim, atualize o schema de desafios em `curriculum/schema/challengeSchema.js`. ```js videoLocaleIds: Joi.when('challengeType', { @@ -251,29 +251,29 @@ videoLocaleIds: Joi.when('challengeType', { }), ``` -## Client UI +## Interface do client -You will need to take an additional step to handle the client UI translations. +Você precisará dar um passo adicional para lidar com as traduções da interface do client. -The Crowdin workflows will automatically pull down _some_ of the UI translations, but there are a couple of files that need to be moved manually. +Os fluxos de trabalho do Crowdin serão automaticamente puxados _algumas_ das traduções da UI, mas há alguns arquivos que precisam ser movidos manualmente. -You will want to copy the following files from `/client/i18n/locales/english` to `/client/i18n/locales/`, and apply translations as needed: +Você vai querer copiar os seguintes arquivos de `/client/i18n/locales/english` para `/client/i18n/locales/` e aplicar as traduções conforme necessário: - `links.json` - `meta-tags.json` - `motivation.json` - `trending.json` -## Testing Translations Locally +## Testar traduções localmente -If you would like to test translations locally, before adding them to our main repository - skip the Crowdin workflow changes. Follow the steps for enabling a language, then download the translations from Crowdin and load them into your local code. +Se quiser testar as traduções localmente, antes de adicioná-las ao nosso repositório principal - pule as alterações de fluxo de trabalho do Crowdin. Siga as etapas para habilitar um idioma e, em seguida, baixe as traduções do Crowdin e as carregue em seu código local. -Because the language has not been approved for production, our scripts are not automatically downloading the translations yet. Only staff have the access to directly download the translations - you are welcome to reach out to us in our [contributors chat room](https://discord.gg/PRyKn3Vbay), or you can translate the English markdown files locally for testing purposes. +Como o idioma ainda não foi aprovado para produção, nossos scripts ainda não estão baixando automaticamente as traduções. Somente membros da equipe têm acesso para baixar as traduções diretamente – entre em contato conosco quando quiser em nossa [sala de chat dos contribuidores](https://discord.gg/PRyKn3Vbay) ou traduza os arquivos de markdown em inglês localmente para fins de teste. -Once you have the files, you will need to place them in the correct directory. For the curriculum challenges, you should place the certification folders (i.e. `01-responsive-web-design`) within the `curriculum/challenges/{lang}` directory. For our Dothraki translations, this would be `curriculum/challenges/dothraki`. The client translation `.json` files will go in the `client/i18n/locales/{lang}` directory. +Quando tiver os arquivos em mãos, você precisará colocá-los no diretório correto. Para os desafios do currículo, você deve colocar as pastas de certificação (por exemplo, `01-responsive-web-design`) no diretório `curriculum/challenges/{lang}`. Para nossas traduções em Dothraki, esse diretório seria `curriculum/challenges/dothraki`. Os arquivos `.json` de tradução do client vão no diretório `client/i18n/locales/{lang}`. -Update your `.env` file to use your new language for `CLIENT_LOCALE` and `CURRICULUM_LOCALE`. +Atualize seu arquivo `.env` para usar seu novo idioma para `CLIENT_LOCALE` e `CURRICULUM_LOCALE`. -Once these are in place, you should be able to run `npm run develop` to view your translated version of freeCodeCamp. +Quando estes arquivos estiverem no local certo, você deve poder usar `npm run develop` para ver sua versão traduzida do freeCodeCamp. -> [!ATTENTION] While you may perform translations locally for the purpose of testing, we remind everyone that translations should _not_ be submitted through GitHub and should only be done through Crowdin. Be sure to reset your local codebase after you are done testing. +> [!ATTENTION] Embora você possa realizar as traduções localmente para fins de teste, lembramos a todos que as traduções _não_ devem ser enviadas pelo GitHub e devem ser feitas somente pelo Crowdin. Certifique-se de reiniciar sua base de código local após realizar os testes. diff --git a/docs/i18n/portuguese/language-lead-handbook.md b/docs/i18n/portuguese/language-lead-handbook.md index 00d0c7fed83c20..e5000496e228bd 100644 --- a/docs/i18n/portuguese/language-lead-handbook.md +++ b/docs/i18n/portuguese/language-lead-handbook.md @@ -65,7 +65,7 @@ Este é um exemplo de como deve ser a aparência de parte do arquivo `trending.j } ``` -You will want to [build the translated client locally](how-to-enable-new-languages.md) to see if the titles have the right length. Cada título deve permanecer em uma única linha e não deve ir para uma nova linha. +Você vai querer [fazer a build do client traduzido localmente](how-to-enable-new-languages.md) para ver se os títulos têm o comprimento correto. Cada título deve permanecer em uma única linha e não deve ir para uma nova linha. ### Como atualizar os artigos em destaque no cdn From 46d08d324f1963fa104c19cb4987f94e060a58eb Mon Sep 17 00:00:00 2001 From: camperbot Date: Wed, 7 Sep 2022 19:41:41 +0530 Subject: [PATCH 034/129] chore(i18n,client): processed translations (#47458) --- client/i18n/locales/ukrainian/translations.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/client/i18n/locales/ukrainian/translations.json b/client/i18n/locales/ukrainian/translations.json index bb716d8ec2ae32..cf89ca006cbda5 100644 --- a/client/i18n/locales/ukrainian/translations.json +++ b/client/i18n/locales/ukrainian/translations.json @@ -68,7 +68,7 @@ "submit-and-go": "Відправити та перейти до наступного завдання", "go-to-next": "Перейти до наступного завдання", "ask-later": "Запитати пізніше", - "start-coding": "Почніть кодувати!", + "start-coding": "Розпочати кодувати!", "go-to-settings": "Перейдіть до налаштувань, щоб отримати сертифікацію", "click-start-course": "Розпочати курс", "click-start-project": "Розпочати проєкт", @@ -346,9 +346,9 @@ "confirm-4": "Підтвердьте свій внесок у розмірі ${{usd}} на рік", "wallet-label": "Внесок ${{usd}} для FreeCodeCamp", "wallet-label-1": "Внесок ${{usd}} на місяць для FreeCodeCamp", - "your-donation": "Ваш внесок у розмірі ${{usd}} надаватиме {{hours}} годин навчання людям у всьому світі.", - "your-donation-2": "Ваш внесок у розмірі ${{usd}} щомісяця надаватиме {{hours}} годин навчання людям у всьому світі.", - "your-donation-3": "Ваш внесок у розмірі ${{usd}} щороку надаватиме {{hours}} годин навчання людям у всьому світі.", + "your-donation": "Ваш внесок у розмірі ${{usd}} надаватиме {{hours}} год навчання людям у всьому світі.", + "your-donation-2": "Ваш внесок у розмірі ${{usd}} щомісяця надаватиме {{hours}} год навчання людям у всьому світі.", + "your-donation-3": "Ваш внесок у розмірі ${{usd}} щороку надаватиме {{hours}} год навчання людям у всьому світі.", "duration": "Станьте одноразовим спонсором нашої некомерційної організації.", "duration-2": "Станьте спонсором нашої некомерційної організації (щомісячний внесок).", "duration-3": "Станьте спонсором нашої некомерційної організації (щорічний внесок).", @@ -583,7 +583,7 @@ "executive": "Виконавчий директор, freeCodeCamp.org", "verify": "Перевірити сертифікацію за посиланням {{certURL}}", "issued": "Виданий", - "fulltext": "<0>Цей сертифікат засвідчує, що <1>{{user}} <2>успішно закінчив(-ла) сертифікацію <3>{{title}} <4>від freeCodeCamp.org, виконавши приблизно {{time}} годин навчання на курсі.", + "fulltext": "<0>Цей сертифікат засвідчує, що <1>{{user}} <2>успішно закінчив(-ла) сертифікацію <3>{{title}} <4>від freeCodeCamp.org, виконавши приблизно {{time}} год навчання на курсі.", "project": { "heading-legacy-full-stack": "В рамках сертифікації програмного забезпечення повного циклу {{user}} отримав(-ла) такі сертифікації:", "heading": "У рамках цієї сертифікації {{user}} створив(-ла) такі проєкти і успішно пройшов(-ла) усі автоматизовані тестування:", From 14076cbde01b0e56a409404b062cdcaa1049752b Mon Sep 17 00:00:00 2001 From: Tuukka Hastrup Date: Wed, 7 Sep 2022 20:35:41 +0300 Subject: [PATCH 035/129] fix(curriculum): Clarify understand-string-immutability (#47448) * Clarify understand-string-immutability Remove some misleading explanation (immutability is orthogonal to literals). * Remove extraneous whitespace Co-authored-by: Jeremy L Thompson * Improve explanation per review suggestion Co-authored-by: Jeremy L Thompson Co-authored-by: Jeremy L Thompson --- .../basic-javascript/understand-string-immutability.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/curriculum/challenges/english/02-javascript-algorithms-and-data-structures/basic-javascript/understand-string-immutability.md b/curriculum/challenges/english/02-javascript-algorithms-and-data-structures/basic-javascript/understand-string-immutability.md index 4a330b813a17ef..2564240ae8c5b5 100644 --- a/curriculum/challenges/english/02-javascript-algorithms-and-data-structures/basic-javascript/understand-string-immutability.md +++ b/curriculum/challenges/english/02-javascript-algorithms-and-data-structures/basic-javascript/understand-string-immutability.md @@ -11,14 +11,14 @@ dashedName: understand-string-immutability In JavaScript, `String` values are immutable, which means that they cannot be altered once created. -For example, the following code: +For example, the following code will produce an error because the letter `B` in the string `Bob` cannot be changed to the letter `J`: ```js let myStr = "Bob"; myStr[0] = "J"; ``` -cannot change the value of `myStr` to `Job`, because the contents of `myStr` cannot be altered. Note that this does *not* mean that `myStr` cannot be changed, just that the individual characters of a string literal cannot be changed. The only way to change `myStr` would be to assign it with a new string, like this: +Note that this does *not* mean that `myStr` could not be re-assigned. The only way to change `myStr` would be to assign it with a new value, like this: ```js let myStr = "Bob"; From e833c37e7cf3b8c37fbf1503c2aaa6aeb7944956 Mon Sep 17 00:00:00 2001 From: Brooke Date: Wed, 7 Sep 2022 12:10:11 -0700 Subject: [PATCH 036/129] TCA-397 #comment This commit fixes a lint issue that only appears in github #time 5m --- client/src/analytics/index.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/client/src/analytics/index.tsx b/client/src/analytics/index.tsx index 7979177022806b..8362761097bd8e 100644 --- a/client/src/analytics/index.tsx +++ b/client/src/analytics/index.tsx @@ -7,8 +7,10 @@ import envData from '../../../config/env.json'; const { deploymentEnv } = envData; -const analyticsId = - deploymentEnv === 'staging' ? devAnalyticsId : prodAnalyticsId; +const analyticsId: string = + deploymentEnv === 'staging' + ? (devAnalyticsId as string) + : (prodAnalyticsId as string); ReactGA.initialize(analyticsId); From d90953407a323f0b6d6ec089fcd8a314b230f815 Mon Sep 17 00:00:00 2001 From: camperbot Date: Thu, 8 Sep 2022 01:05:53 +0530 Subject: [PATCH 037/129] chore(i18n,learn): processed translations (#47460) --- .../614e0e503b110f76d3ac2ff6.md | 256 ++++++++++++++++++ .../60f805f813eaf2049bc2ceea.md | 95 +++++++ .../60f80e0081e0f2052ae5b505.md | 87 ++++++ .../60f83e7bfc09900959f41e20.md | 74 +++++ .../60f84ec41116b209c280ba91.md | 82 ++++++ .../60f852f645b5310a8264f555.md | 76 ++++++ .../60f85a62fb30c80bcea0cedb.md | 85 ++++++ .../60f8604682407e0d017bbf7f.md | 82 ++++++ 8 files changed, 837 insertions(+) create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/614e0e503b110f76d3ac2ff6.md create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f805f813eaf2049bc2ceea.md create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f80e0081e0f2052ae5b505.md create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f83e7bfc09900959f41e20.md create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f84ec41116b209c280ba91.md create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f852f645b5310a8264f555.md create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f85a62fb30c80bcea0cedb.md create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8604682407e0d017bbf7f.md diff --git a/curriculum/challenges/japanese/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/614e0e503b110f76d3ac2ff6.md b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/614e0e503b110f76d3ac2ff6.md new file mode 100644 index 00000000000000..05aadbdebd25d0 --- /dev/null +++ b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/614e0e503b110f76d3ac2ff6.md @@ -0,0 +1,256 @@ +--- +id: 614e0e503b110f76d3ac2ff6 +title: ステップ 43 +challengeType: 0 +dashedName: step-43 +--- + +# --description-- + +`.hero-img` の CSS を書く前に、一時的に設定されている `width` 属性を取り除いておく必要があります。 + +# --hints-- + +`.hero-img` には `width` 属性は必要ありません。 + +```js +assert.isNull(document.querySelector('.hero-img')?.getAttribute('width')); +``` + +# --seed-- + +## --seed-contents-- + +```html + + + + + + Magazine + + + + + +
    +
    +
    +--fcc-editable-region-- + freecodecamp logo +

    OUR NEW CURRICULUM

    +

    + Our efforts to restructure our curriculum with a more project-based + focus +

    +--fcc-editable-region-- +
    +
    +

    + By + freeCodeCamp +

    +

    March 7, 2019

    +
    + +
    +
    +

    + Soon the freeCodeCamp curriculum will be 100% project-driven learning. Instead of a series of coding challenges, you'll learn through building projects - step by step. Before we get into the details, let me emphasize: we are not changing the certifications. All 6 certifications will still have the same 5 required projects. We are only changing the optional coding challenges. +

    +

    + After years - years - of pondering these two problems and how to solve them, I slipped, hit my head on the sink, and when I came to I had a revelation! A vision! A picture in my head! A picture of this! This is what makes time travel possible: the flux capacitor! +

    +

    + It wasn't as dramatic as Doc's revelation in Back to the Future. It + just occurred to me while I was going for a run. The revelation: the entire curriculum should be a series of projects. Instead of individual coding challenges, we'll just have projects, each with their own seamless series of tests. Each test gives you just enough information to figure out how to get it to pass. (And you can view hints if that isn't enough.) +

    +
    +
    +

    + The entire curriculum should be a series of projects +

    +
    +
    +

    + No more walls of explanatory text. No more walls of tests. Just one + test at a time, as you build up a working project. Over the course of passing thousands of tests, you build up projects and your own understanding of coding fundamentals. There is no transition between lessons and projects, because the lessons themselves are baked into projects. And there's plenty of repetition to help you retain everything because - hey - building projects in real life has plenty of repetition. +

    +

    + The main design challenge is taking what is currently paragraphs of explanation and instructions and packing them into a single test description text. Each project will involve dozens of tests like this. People will be coding the entire time, rather than switching back and forth from "reading mode" to "coding mode". +

    +

    + Instead of a series of coding challenges, people will be in their code editor passing one test after another, quickly building up a project. People will get into a real flow state, similar to what they experience when they build the required projects at the end of each certification. They'll get that sense of forward progress right from the beginning. And freeCodeCamp will be a much smoother experience. +

    +
    +
    +
    +

    A Brief History

    +

    Of the Curriculum

    +
      +
    • +

      V1 - 2014

      +

      + We launched freeCodeCamp with a simple list of 15 resources, + including Harvard's CS50 and Stanford's Database Class. +

      +
    • +
    • +

      V2 - 2015

      +

      We added interactive algorithm challenges.

      +
    • +
    • +

      V3 - 2015

      +

      + We added our own HTML+CSS challenges (before we'd been relying on + General Assembly's Dash course for these). +

      +
    • +
    • +

      V4 - 2016

      +

      + We expanded the curriculum to 3 certifications, including Front + End, Back End, and Data Visualization. They each had 10 required + projects, but only the Front End section had its own challenges. + For the other certs, we were still using external resources like + Node School. +

      +
    • +
    • +

      V5 - 2017

      +

      We added the back end and data visualization challenges.

      +
    • +
    • +

      V6 - 2018

      +

      + We launched 6 new certifications to replace our old ones. This was + the biggest curriculum improvement to date. +

      +
    • +
    +
    + +
    +
    + + +``` + +```css +*, +::before, +::after { + padding: 0; + margin: 0; +} + +html { + font-size: 62.5%; + box-sizing: border-box; +} + +body { + font-family: 'Baskervville', serif; + color: linen; + background-color: rgb(20, 30, 40); +} + +h1 { + font-family: 'Anton', sans-serif; +} + +h2, h3, h4, h5, h6 { + font-family: 'Raleway', sans-serif; +} + +a { + text-decoration: none; + color: linen; +} + +main { + display: grid; + grid-template-columns: minmax(2rem, 1fr) minmax(min-content, 94rem) minmax(2rem, 1fr); + row-gap: 3rem; +} + +.heading { + grid-column: 2 / 3; + display: grid; + grid-template-columns: repeat(2, 1fr); + row-gap: 1.5rem; +} + +.text { + grid-column: 2 / 3; +} + +.hero { + grid-column: 1 / -1; + position: relative; +} +``` diff --git a/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f805f813eaf2049bc2ceea.md b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f805f813eaf2049bc2ceea.md new file mode 100644 index 00000000000000..7f76633eb83eea --- /dev/null +++ b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f805f813eaf2049bc2ceea.md @@ -0,0 +1,95 @@ +--- +id: 60f805f813eaf2049bc2ceea +title: ステップ 16 +challengeType: 0 +dashedName: step-16 +--- + +# --description-- + +各 `label` 内に、`input` 要素を 1 つずつネストしてください。 各 `input` は `label` のテキストの後に追加し、コロンの後にスペースを入れるようにしてください。 + +# --hints-- + +`fieldset` 要素に `input` 要素を 4 つ追加する必要があります。 + +```js +assert.equal(document.querySelectorAll('fieldset input')?.length, 4); +``` + +`input` 要素は `label` 要素内にネストする必要があります。 + +```js +assert.equal(document.querySelectorAll('label input')?.length, 4); +``` + +`label` のテキスト `Enter Your First Name:` の後に 1 つ目の `input` を追加し、コロンの後にはスペースを入れてください。 + +```js +assert.equal(document.querySelectorAll('label')?.[0]?.innerHTML.trim(), 'Enter Your First Name: '); +``` + +`label` のテキスト `Enter Your Last Name:` の後に 2 つ目の `input` を追加し、コロンの後にはスペースを入れてください。 + +```js +assert.equal(document.querySelectorAll('label')?.[1]?.innerHTML.trim(), 'Enter Your Last Name: '); +``` + +`label` のテキスト `Enter Your Email:` の後に 3 つ目の `input` を追加し、コロンの後にはスペースを入れてください。 + +```js +assert.equal(document.querySelectorAll('label')?.[2]?.innerHTML.trim(), 'Enter Your Email: '); +``` + +`label` のテキスト `Create a New Password:` の後に 4 つ目の `input` を追加し、コロンの後にはスペースを入れてください。 + +```js +assert.equal(document.querySelectorAll('label')?.[3]?.innerHTML.trim(), 'Create a New Password: '); +``` + +# --seed-- + +## --seed-contents-- + +```html + + + + + Registration Form + + + +

    Registration Form

    +

    Please fill out this form with the required information

    +
    + --fcc-editable-region-- +
    + + + + +
    +--fcc-editable-region-- +
    +
    +
    + + +``` + +```css +body { + width: 100%; + height: 100vh; + margin: 0; + background-color: #1b1b32; + color: #f5f6f7; +} + +label { + display: block; + margin: 0.5rem 0; +} + +``` diff --git a/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f80e0081e0f2052ae5b505.md b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f80e0081e0f2052ae5b505.md new file mode 100644 index 00000000000000..ac35cee4aed9e8 --- /dev/null +++ b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f80e0081e0f2052ae5b505.md @@ -0,0 +1,87 @@ +--- +id: 60f80e0081e0f2052ae5b505 +title: ステップ 18 +challengeType: 0 +dashedName: step-18 +--- + +# --description-- + +期待するデータの種類をブラウザーに伝えるために、フォーム要素の `type` 属性を指定することが重要です。 `type` が指定されていない場合、ブラウザーはデフォルトで `text` を使用します。 + +最初の 2 つの `input` 要素の `type` 属性を `text` に設定し、3 つ目の `type` 属性は `email`、4 つ目の `type` 属性は `password` に設定してください。 + +`email` タイプは、`@` とドメイン内の `.` が含まれるメールアドレスのみを受け付けます。 `password` タイプは入力内容を隠し、また、サイトが HTTPS を使用していない場合に警告を表示します。 + +# --hints-- + +1 つ目の `input` 要素の `type` 属性を `text` に設定する必要があります。 + +```js +assert.equal(document.querySelector('input')?.type, 'text'); +``` + +2 つ目の `input` 要素の `type` 属性を `text` に設定する必要があります。 + +```js +assert.equal(document.querySelectorAll('input')?.[1]?.type, 'text'); +``` + +3 つ目の `input` 要素の `type` 属性を `email` に設定する必要があります。 + +```js +assert.equal(document.querySelectorAll('input')?.[2]?.type, 'email'); +``` + +4 つ目の `input` 要素の `type` 属性を `password` に設定する必要があります。 + +```js +assert.equal(document.querySelectorAll('input')?.[3]?.type, 'password'); +``` + +# --seed-- + +## --seed-contents-- + +```html + + + + + Registration Form + + + +

    Registration Form

    +

    Please fill out this form with the required information

    +
    +--fcc-editable-region-- +
    + + + + +
    +--fcc-editable-region-- +
    +
    +
    + + +``` + +```css +body { + width: 100%; + height: 100vh; + margin: 0; + background-color: #1b1b32; + color: #f5f6f7; +} + +label { + display: block; + margin: 0.5rem 0; +} + +``` diff --git a/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f83e7bfc09900959f41e20.md b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f83e7bfc09900959f41e20.md new file mode 100644 index 00000000000000..56c0b9cef28799 --- /dev/null +++ b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f83e7bfc09900959f41e20.md @@ -0,0 +1,74 @@ +--- +id: 60f83e7bfc09900959f41e20 +title: ステップ 21 +challengeType: 0 +dashedName: step-21 +--- + +# --description-- + +いくつかの `type` 属性値には組み込みのフォームバリデーション (入力値の検証機能) が備わっています。 例えば `type="email"` は、入力値が有効なメールアドレスでなければなりません。 + +パスワードの `input` 要素にカスタムバリデーションを追加するため、`minlength` 属性に `8` という値を設定してください。 これにより、8 文字未満の入力が送信されることを防げます。 + +# --hints-- + +パスワードの `input` 要素に `minlength` 属性を追加してください。 + +```js +assert.notEqual(document.querySelector('input[type="password"]')?.minLength, -1); +``` + +`minlength` 属性の値を `8` に設定する必要があります。 + +```js +assert.equal(document.querySelector('input[type="password"]')?.minLength, 8); +``` + +# --seed-- + +## --seed-contents-- + +```html + + + + + Registration Form + + + +

    Registration Form

    +

    Please fill out this form with the required information

    +
    +--fcc-editable-region-- +
    + + + + +
    +--fcc-editable-region-- +
    +
    + +
    + + +``` + +```css +body { + width: 100%; + height: 100vh; + margin: 0; + background-color: #1b1b32; + color: #f5f6f7; +} + +label { + display: block; + margin: 0.5rem 0; +} + +``` diff --git a/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f84ec41116b209c280ba91.md b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f84ec41116b209c280ba91.md new file mode 100644 index 00000000000000..cc5c632771c94f --- /dev/null +++ b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f84ec41116b209c280ba91.md @@ -0,0 +1,82 @@ +--- +id: 60f84ec41116b209c280ba91 +title: ステップ 22 +challengeType: 0 +dashedName: step-22 +--- + +# --description-- + +`type="password"` を設定した場合、`pattern` 属性を使用して、有効なパスワードと見なされるためにマッチすべき正規表現を定義できます。 + +パスワードの `input` 要素に `pattern` 属性を追加して、入力値が `[a-z0-5]{8,}` にマッチしなければならないように設定してください。 + +上記は、8 文字以上の小文字のアルファベットまたは `0` ~ `5` の数字にマッチする正規表現です。 次に、`minlength` 属性を削除して入力欄の動作を試してみてください。 + +# --hints-- + +パスワードの `input` 要素に `pattern` 属性を追加してください。 + +```js +assert.isNotEmpty(document.querySelector('input[type="password"]')?.pattern); +``` + +`pattern` 属性の値を `[a-z0-5]{8,}` に設定する必要があります。 + +```js +assert.equal(document.querySelector('input[type="password"]')?.pattern, '[a-z0-5]{8,}'); +``` + +パスワードの `input` 要素から `minlength` 属性を削除する必要があります。 + +```js +assert.equal(document.querySelector('input[type="password"]')?.minLength, -1); +``` + +# --seed-- + +## --seed-contents-- + +```html + + + + + Registration Form + + + +

    Registration Form

    +

    Please fill out this form with the required information

    +
    +--fcc-editable-region-- +
    + + + + +
    +--fcc-editable-region-- +
    +
    + +
    + + +``` + +```css +body { + width: 100%; + height: 100vh; + margin: 0; + background-color: #1b1b32; + color: #f5f6f7; +} + +label { + display: block; + margin: 0.5rem 0; +} + +``` diff --git a/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f852f645b5310a8264f555.md b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f852f645b5310a8264f555.md new file mode 100644 index 00000000000000..85fc3d326c62a7 --- /dev/null +++ b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f852f645b5310a8264f555.md @@ -0,0 +1,76 @@ +--- +id: 60f852f645b5310a8264f555 +title: ステップ 23 +challengeType: 0 +dashedName: step-23 +--- + +# --description-- + +登録フォームの次のパートに移りましょう。 このセクションでは、ユーザーが作成するアカウントの種類を尋ね、ユーザーが利用規約を読んだことを確認します。 + +まずは 2 つ目の `fieldset` に `label` 要素を 3 つ追加してください。 + +# --hints-- + +2 つ目の `fieldset` に `label` 要素を 3 つ追加してください。 + +```js +assert.equal(document.querySelectorAll('fieldset')?.[1]?.querySelectorAll('label')?.length, 3); +``` + +追加した `label` 要素は兄弟要素である必要があります。 + +```js +assert.exists(document.querySelector('fieldset:nth-child(2)')?.querySelector('label + label + label')); +``` + +# --seed-- + +## --seed-contents-- + +```html + + + + + Registration Form + + + +

    Registration Form

    +

    Please fill out this form with the required information

    +
    +
    + + + + +
    +--fcc-editable-region-- +
    + +
    +--fcc-editable-region-- +
    + +
    + + +``` + +```css +body { + width: 100%; + height: 100vh; + margin: 0; + background-color: #1b1b32; + color: #f5f6f7; +} + +label { + display: block; + margin: 0.5rem 0; +} + +``` diff --git a/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f85a62fb30c80bcea0cedb.md b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f85a62fb30c80bcea0cedb.md new file mode 100644 index 00000000000000..41833ce5a6d920 --- /dev/null +++ b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f85a62fb30c80bcea0cedb.md @@ -0,0 +1,85 @@ +--- +id: 60f85a62fb30c80bcea0cedb +title: ステップ 24 +challengeType: 0 +dashedName: step-24 +--- + +# --description-- + +ユーザーが `Personal Account` または `Business Account` のいずれかを選択できるようにします。 + +そのためには、最初の 2 つの `label` 要素内にそれぞれ 1 つずつ、`type="radio"` を持つ `input` 要素を追加してください。 + +# --hints-- + +`input` 要素を 2 つ追加する必要があります。 + +```js +assert.equal(document.querySelectorAll('fieldset:nth-child(2) input')?.length, 2); +``` + +最初の 2 つの `label` 要素内に、`input` を 1 つずつ追加する必要があります。 + +```js +assert.exists(document.querySelector('fieldset:nth-child(2) > label:nth-child(1) > input')); +assert.exists(document.querySelector('fieldset:nth-child(2) > label:nth-child(2) > input')); +``` + +両方の `input` 要素の `type` を `radio` に設定する必要があります。 + +```js +assert.equal(document.querySelectorAll('fieldset:nth-child(2) input[type="radio"]')?.length, 2); +``` + +# --seed-- + +## --seed-contents-- + +```html + + + + + Registration Form + + + +

    Registration Form

    +

    Please fill out this form with the required information

    +
    +
    + + + + +
    +--fcc-editable-region-- +
    + + + +
    +--fcc-editable-region-- +
    + +
    + + +``` + +```css +body { + width: 100%; + height: 100vh; + margin: 0; + background-color: #1b1b32; + color: #f5f6f7; +} + +label { + display: block; + margin: 0.5rem 0; +} + +``` diff --git a/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8604682407e0d017bbf7f.md b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8604682407e0d017bbf7f.md new file mode 100644 index 00000000000000..7af3a8d040b270 --- /dev/null +++ b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8604682407e0d017bbf7f.md @@ -0,0 +1,82 @@ +--- +id: 60f8604682407e0d017bbf7f +title: ステップ 25 +challengeType: 0 +dashedName: step-25 +--- + +# --description-- + +利用規約用に、3 つ目の `label` 要素内に `type` が `checkbox` の `input` を追加してください。 また、ユーザーに利用規約を読まずにサインアップしてほしくはないので、チェックボックスを `required` にしてください。 + +# --hints-- + +3 つ目の `label` 要素内に `input` を追加する必要があります。 + +```js +assert.exists(document.querySelector('fieldset:nth-child(2) label:nth-child(3) input')); +``` + +`input` 要素に `type` 属性を追加して、値を `checkbox` にする必要があります。 + +```js +assert.equal(document.querySelector('fieldset:nth-child(2) label:nth-child(3) input')?.type, 'checkbox'); +``` + +`input` 要素に `required` 属性を追加する必要があります。 + +```js +assert.equal(document.querySelector('fieldset:nth-child(2) label:nth-child(3) input')?.required, true); +``` + +# --seed-- + +## --seed-contents-- + +```html + + + + + Registration Form + + + +

    Registration Form

    +

    Please fill out this form with the required information

    +
    +
    + + + + +
    +--fcc-editable-region-- +
    + + + +
    +--fcc-editable-region-- +
    + +
    + + +``` + +```css +body { + width: 100%; + height: 100vh; + margin: 0; + background-color: #1b1b32; + color: #f5f6f7; +} + +label { + display: block; + margin: 0.5rem 0; +} + +``` From 26d9fdc0beb9213057aad6c0f5711a084a5acf64 Mon Sep 17 00:00:00 2001 From: Brooke Date: Wed, 7 Sep 2022 12:45:43 -0700 Subject: [PATCH 038/129] TCA-385 #comment This commit adds more logging to the request to save a challenge #time 10m --- api-server/src/server/boot/challenge.js | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/api-server/src/server/boot/challenge.js b/api-server/src/server/boot/challenge.js index 27357ab5c0dae7..3ba95a139f65a8 100644 --- a/api-server/src/server/boot/challenge.js +++ b/api-server/src/server/boot/challenge.js @@ -30,6 +30,12 @@ import { const log = debug('fcc:boot:challenges'); +console.debug('console.debug'); +console.info('console.info'); +console.error('console.error'); +console.log('console.log'); +log('log'); + export default async function bootChallenge(app, done) { const send200toNonUser = ifNoUserSend(true); const api = app.loopback.Router(); @@ -258,10 +264,11 @@ export function isValidChallengeCompletion(req, res, next) { message: 'That does not appear to be a valid challenge submission.' }; - console.debug('console.debug'); - console.info('console.info'); - console.error('console.error'); - console.log('console.log'); + console.debug('console.debug', 'isValidChallengeCompletion'); + console.info('console.info', 'isValidChallengeCompletion'); + console.error('console.error', 'isValidChallengeCompletion'); + console.log('console.log', 'isValidChallengeCompletion'); + log('log isValidChallengeCompletion'); if (!ObjectID.isValid(id)) { log('isObjectId', id, ObjectID.isValid(id)); From bf5b1c226cd398a3c7bc59559860d74823ee0de9 Mon Sep 17 00:00:00 2001 From: Brooke Date: Wed, 7 Sep 2022 14:29:38 -0700 Subject: [PATCH 039/129] TCA-385 #comment This commit adds more logging #time 5m --- api-server/src/server/utils/middleware.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/api-server/src/server/utils/middleware.js b/api-server/src/server/utils/middleware.js index 52f5551fc85fb3..3b6a7364eee2cf 100644 --- a/api-server/src/server/utils/middleware.js +++ b/api-server/src/server/utils/middleware.js @@ -24,7 +24,9 @@ export function ifNoUserRedirectHome(message, type = 'errors') { } export function ifNoUserSend(sendThis) { + console.debug('ifNoUserSend', sendThis); return function (req, res, next) { + console.debug('ifNoUserSend function', req.user); if (req.user) { return next(); } From acc966ac311c83bb719c994053319b62fd77bc3f Mon Sep 17 00:00:00 2001 From: kulraj chavda <75951205+kulraj710@users.noreply.github.com> Date: Thu, 8 Sep 2022 13:16:27 +0530 Subject: [PATCH 040/129] add visual separation in Change language menu UI (#47418) add visual seperation in Change language menu UI --- .../src/components/Header/components/universal-nav.css | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/client/src/components/Header/components/universal-nav.css b/client/src/components/Header/components/universal-nav.css index 40947e38215db9..e2ff2ab5dd803d 100644 --- a/client/src/components/Header/components/universal-nav.css +++ b/client/src/components/Header/components/universal-nav.css @@ -157,6 +157,10 @@ cursor: pointer; } +#nav-lang-menu li:first-child { + border-bottom: 0.1rem solid var(--gray-45) !important; +} + button.nav-link:focus { color: var(--tertiary-color); background-color: var(--tertiary-background); @@ -208,7 +212,6 @@ button.nav-link[aria-disabled='true'] { overflow-y: auto; scrollbar-width: auto; /* lang menu should always be full height */ - height: 19.9rem; } /* main menu must be at least as tall as lang menu (when displayed) @@ -241,6 +244,10 @@ button.nav-link[aria-disabled='true'] { background-color: var(--gray-10) !important; } +.nav-lang-menu li:first-child .nav-link:hover { + color: var(--love-dark) !important; +} + .nav-lang-button { display: flex; justify-content: space-between; From 2c0bac12cc127dfefa924b6ed95e7b5ecdf2ee79 Mon Sep 17 00:00:00 2001 From: Dylan R <48571264+DylanDevelops@users.noreply.github.com> Date: Thu, 8 Sep 2022 12:11:01 -0600 Subject: [PATCH 041/129] fix(curriculum): typo in 65 of building a magazine project (#47470) switch second to third --- .../6148d4d57b965358c9fa38bf.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148d4d57b965358c9fa38bf.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148d4d57b965358c9fa38bf.md index 213710b1e00430..16e04f302e75a6 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148d4d57b965358c9fa38bf.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-css-grid-by-building-a-magazine/6148d4d57b965358c9fa38bf.md @@ -7,7 +7,7 @@ dashedName: step-65 # --description-- -Now it's time to style your second `section`. Note that it has the `text` and `text-with-images` values for the `class` attribute, which means it is already inheriting the styles from your `.text` rule. +Now it's time to style your third `section`. Note that it has the `text` and `text-with-images` values for the `class` attribute, which means it is already inheriting the styles from your `.text` rule. Create a `.text-with-images` selector and set the `display` property to `grid`. From b68fa3f26491ff688c75705a5aa7b230a7804613 Mon Sep 17 00:00:00 2001 From: camperbot Date: Thu, 8 Sep 2022 23:42:15 +0530 Subject: [PATCH 042/129] chore(i18n,learn): processed translations (#47469) --- .../60f81167d0d4910809f88945.md | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81167d0d4910809f88945.md diff --git a/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81167d0d4910809f88945.md b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81167d0d4910809f88945.md new file mode 100644 index 00000000000000..20cdf9b2abb1f9 --- /dev/null +++ b/curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81167d0d4910809f88945.md @@ -0,0 +1,80 @@ +--- +id: 60f81167d0d4910809f88945 +title: ステップ 19 +challengeType: 0 +dashedName: step-19 +--- + +# --description-- + +`type` が `submit` に設定された最初の `input` 要素は、自動的に、一番近い親要素の `form` を送信するよう設定されます。 + +フォームの送信を処理するため、最後の `fieldset` 要素の後に `input` 要素を追加し、`type` 属性を `submit` に、`value` 属性を `Submit` に設定してください。 + +# --hints-- + +最後の `fieldset` 要素の後に `input` 要素を追加する必要があります。 + +```js +assert.exists(document.querySelectorAll('fieldset')?.[2]?.nextElementSibling?.tagName, 'input'); +``` + +`input` 要素の `type` 属性を `submit` に設定する必要があります。 + +```js +assert.exists(document.querySelector('fieldset + input[type="submit"]')); +``` + +`input` 要素の `value` 属性を `Submit` に設定する必要があります。 + +```js +assert.exists(document.querySelector('fieldset + input[value="Submit"]')); +``` + +# --seed-- + +## --seed-contents-- + +```html + + + + + Registration Form + + + +

    Registration Form

    +

    Please fill out this form with the required information

    +
    +--fcc-editable-region-- +
    + + + + +
    +
    +
    + +--fcc-editable-region-- +
    + + +``` + +```css +body { + width: 100%; + height: 100vh; + margin: 0; + background-color: #1b1b32; + color: #f5f6f7; +} + +label { + display: block; + margin: 0.5rem 0; +} + +``` From 79f937ea1d9190a40475113e2b7ecbfd6be730d2 Mon Sep 17 00:00:00 2001 From: Manabu Matsumoto Date: Fri, 9 Sep 2022 16:06:20 +0900 Subject: [PATCH 043/129] fix(curriculum): change the instruction text (#47461) * fix: change the instruction text * fix: make instruction sentence more straightforward Co-authored-by: Jeremy L Thompson Co-authored-by: Jeremy L Thompson --- .../60f8604682407e0d017bbf7f.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8604682407e0d017bbf7f.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8604682407e0d017bbf7f.md index 7b98beede25054..734deb63b612e0 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8604682407e0d017bbf7f.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8604682407e0d017bbf7f.md @@ -7,7 +7,7 @@ dashedName: step-25 # --description-- -For the terms and conditions, add an `input` with a `type` of `checkbox` to the third `label` element. Also, as we do not want users to sign up, without having read the terms and conditions, make it `required`. +For the terms and conditions, add an `input` with a `type` of `checkbox` to the third `label` element. Make this `input` element `required` because users should not sign up without reading the terms and conditions. # --hints-- From 4398cc3946aa28c9ad89825e41068611d49a08bd Mon Sep 17 00:00:00 2001 From: Brooke Date: Fri, 9 Sep 2022 08:42:59 -0700 Subject: [PATCH 044/129] TCA-385 remove extra logging #time 5m --- api-server/src/server/boot/challenge.js | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/api-server/src/server/boot/challenge.js b/api-server/src/server/boot/challenge.js index 3ba95a139f65a8..38ac25098e3a73 100644 --- a/api-server/src/server/boot/challenge.js +++ b/api-server/src/server/boot/challenge.js @@ -30,12 +30,6 @@ import { const log = debug('fcc:boot:challenges'); -console.debug('console.debug'); -console.info('console.info'); -console.error('console.error'); -console.log('console.log'); -log('log'); - export default async function bootChallenge(app, done) { const send200toNonUser = ifNoUserSend(true); const api = app.loopback.Router(); @@ -264,12 +258,6 @@ export function isValidChallengeCompletion(req, res, next) { message: 'That does not appear to be a valid challenge submission.' }; - console.debug('console.debug', 'isValidChallengeCompletion'); - console.info('console.info', 'isValidChallengeCompletion'); - console.error('console.error', 'isValidChallengeCompletion'); - console.log('console.log', 'isValidChallengeCompletion'); - log('log isValidChallengeCompletion'); - if (!ObjectID.isValid(id)) { log('isObjectId', id, ObjectID.isValid(id)); console.debug('isObjectId', id, ObjectID.isValid(id)); From af224577a9fc8acf16c706bb95b1855854bc1b7b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 10 Sep 2022 00:03:27 +0000 Subject: [PATCH 045/129] chore(deps): update actions/labeler digest to 2f7477e --- .github/workflows/labeler.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/labeler.yaml b/.github/workflows/labeler.yaml index ffe5a5d059db67..ee4f2731917a24 100644 --- a/.github/workflows/labeler.yaml +++ b/.github/workflows/labeler.yaml @@ -14,7 +14,7 @@ jobs: pull-requests: write runs-on: ubuntu-20.04 steps: - - uses: actions/labeler@9fd24f1f9d6ceb64ba34d181b329ee72f99978a0 # tag=v4 + - uses: actions/labeler@2f7477e3004bdfe4bba501d76fae0d81f6eac775 # tag=v4 with: repo-token: '${{ secrets.GITHUB_TOKEN }}' sync-labels: true From ccc4a82016c6bb86b46f10a18e8b40fe756ffef7 Mon Sep 17 00:00:00 2001 From: Jon Rutter Date: Sat, 10 Sep 2022 01:36:08 -0400 Subject: [PATCH 046/129] fix(curriculum): Update Registration Form step 29 seed code to correctly render a checkbox (#47481) Update seed code to render a checkbox --- .../60fab8367d35de04e5cb7929.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab8367d35de04e5cb7929.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab8367d35de04e5cb7929.md index f028eac0a4b98e..9b4d95382d82ac 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab8367d35de04e5cb7929.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab8367d35de04e5cb7929.md @@ -59,7 +59,7 @@ assert.equal(document.querySelector('fieldset:nth-child(2) > label:nth-child(3)
    - +
    --fcc-editable-region--
    From 72314fe5a6fe489012b690c347550e61844d16c6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 10 Sep 2022 05:56:21 +0000 Subject: [PATCH 047/129] chore(deps): update actions/setup-java digest to d854b6d --- .github/workflows/codesee-diagram.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/codesee-diagram.yml b/.github/workflows/codesee-diagram.yml index d5849fd7a6538e..523c38620c99e2 100644 --- a/.github/workflows/codesee-diagram.yml +++ b/.github/workflows/codesee-diagram.yml @@ -30,7 +30,7 @@ jobs: uses: Codesee-io/codesee-detect-languages-action@latest - name: Configure JDK 16 - uses: actions/setup-java@2c7a4878f5d120bd643426d54ae1209b29cc01a3 # tag=v3 + uses: actions/setup-java@d854b6da19cdadd9a010605529e522c2393ebd38 # tag=v3 if: ${{ fromJSON(steps.detect-languages.outputs.languages).java }} with: java-version: '16' From 14af408110ded089a996cd9b295055a61d0d037e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 10 Sep 2022 11:31:10 +0000 Subject: [PATCH 048/129] chore(deps): update dependency @types/node to v16.11.58 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 096065a934362b..3d055526c11bd6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -48,7 +48,7 @@ "@types/jquery": "3.5.14", "@types/loadable__component": "5.13.4", "@types/lodash-es": "4.17.6", - "@types/node": "16.11.56", + "@types/node": "16.11.58", "@types/prismjs": "1.26.0", "@types/psl": "1.1.0", "@types/reach__router": "1.3.10", @@ -14201,9 +14201,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "16.11.56", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.56.tgz", - "integrity": "sha512-aFcUkv7EddxxOa/9f74DINReQ/celqH8DiB3fRYgVDM2Xm5QJL8sl80QKuAnGvwAsMn+H3IFA6WCrQh1CY7m1A==" + "version": "16.11.58", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.58.tgz", + "integrity": "sha512-uMVxJ111wpHzkx/vshZFb6Qni3BOMnlWLq7q9jrwej7Yw/KvjsEbpxCCxw+hLKxexFMc8YmpG8J9tnEe/rKsIg==" }, "node_modules/@types/node-fetch": { "version": "2.5.12", @@ -64455,9 +64455,9 @@ "version": "0.7.31" }, "@types/node": { - "version": "16.11.56", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.56.tgz", - "integrity": "sha512-aFcUkv7EddxxOa/9f74DINReQ/celqH8DiB3fRYgVDM2Xm5QJL8sl80QKuAnGvwAsMn+H3IFA6WCrQh1CY7m1A==" + "version": "16.11.58", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.58.tgz", + "integrity": "sha512-uMVxJ111wpHzkx/vshZFb6Qni3BOMnlWLq7q9jrwej7Yw/KvjsEbpxCCxw+hLKxexFMc8YmpG8J9tnEe/rKsIg==" }, "@types/node-fetch": { "version": "2.5.12", diff --git a/package.json b/package.json index 842b6160a90698..13902af6e8143f 100644 --- a/package.json +++ b/package.json @@ -128,7 +128,7 @@ "@types/jquery": "3.5.14", "@types/loadable__component": "5.13.4", "@types/lodash-es": "4.17.6", - "@types/node": "16.11.56", + "@types/node": "16.11.58", "@types/prismjs": "1.26.0", "@types/psl": "1.1.0", "@types/reach__router": "1.3.10", From c4ffea5500443c679fdaefcef12ae72913779c26 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 10 Sep 2022 15:06:26 +0000 Subject: [PATCH 049/129] chore(deps): update dependency eslint-plugin-react to v7.31.8 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3d055526c11bd6..dcb107241f44a5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -81,7 +81,7 @@ "eslint-plugin-jsx-a11y": "6.6.1", "eslint-plugin-no-only-tests": "2.6.0", "eslint-plugin-prefer-object-spread": "1.2.1", - "eslint-plugin-react": "7.31.7", + "eslint-plugin-react": "7.31.8", "eslint-plugin-react-hooks": "4.6.0", "eslint-plugin-testing-library": "4.12.4", "execa": "5.1.1", @@ -23690,9 +23690,9 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.31.7", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.7.tgz", - "integrity": "sha512-8NldBTeYp/kQoTV1uT0XF6HcmDqbgZ0lNPkN0wlRw8DJKXEnaWu+oh/6gt3xIhzvQ35wB2Y545fJhIbJSZ2NNw==", + "version": "7.31.8", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.8.tgz", + "integrity": "sha512-5lBTZmgQmARLLSYiwI71tiGVTLUuqXantZM6vlSY39OaDSV0M7+32K5DnLkmFrwTe+Ksz0ffuLUC91RUviVZfw==", "dependencies": { "array-includes": "^3.1.5", "array.prototype.flatmap": "^1.3.0", @@ -71256,9 +71256,9 @@ "requires": {} }, "eslint-plugin-react": { - "version": "7.31.7", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.7.tgz", - "integrity": "sha512-8NldBTeYp/kQoTV1uT0XF6HcmDqbgZ0lNPkN0wlRw8DJKXEnaWu+oh/6gt3xIhzvQ35wB2Y545fJhIbJSZ2NNw==", + "version": "7.31.8", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.8.tgz", + "integrity": "sha512-5lBTZmgQmARLLSYiwI71tiGVTLUuqXantZM6vlSY39OaDSV0M7+32K5DnLkmFrwTe+Ksz0ffuLUC91RUviVZfw==", "requires": { "array-includes": "^3.1.5", "array.prototype.flatmap": "^1.3.0", diff --git a/package.json b/package.json index 13902af6e8143f..5f3fd787bce2d8 100644 --- a/package.json +++ b/package.json @@ -161,7 +161,7 @@ "eslint-plugin-jsx-a11y": "6.6.1", "eslint-plugin-no-only-tests": "2.6.0", "eslint-plugin-prefer-object-spread": "1.2.1", - "eslint-plugin-react": "7.31.7", + "eslint-plugin-react": "7.31.8", "eslint-plugin-react-hooks": "4.6.0", "eslint-plugin-testing-library": "4.12.4", "execa": "5.1.1", From 9f61523d08c34b148917b8fe427bfdec618acbe2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 10 Sep 2022 19:04:03 +0000 Subject: [PATCH 050/129] chore(deps): update dependency redux-saga-test-plan to v4.0.6 --- client/package.json | 2 +- package-lock.json | 24 ++++++++++-------------- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/client/package.json b/client/package.json index 1337ea4cb166f2..2891b956d69cdd 100644 --- a/client/package.json +++ b/client/package.json @@ -145,7 +145,7 @@ "monaco-editor-webpack-plugin": "4.2.0", "react-test-renderer": "16.14.0", "redux-mock-store": "1.5.4", - "redux-saga-test-plan": "4.0.5", + "redux-saga-test-plan": "4.0.6", "serve": "13.0.4", "ts-node": "10.9.1", "webpack": "5.74.0", diff --git a/package-lock.json b/package-lock.json index dcb107241f44a5..9508c2eb94f627 100644 --- a/package-lock.json +++ b/package-lock.json @@ -549,7 +549,7 @@ "monaco-editor-webpack-plugin": "4.2.0", "react-test-renderer": "16.14.0", "redux-mock-store": "1.5.4", - "redux-saga-test-plan": "4.0.5", + "redux-saga-test-plan": "4.0.6", "serve": "13.0.4", "ts-node": "10.9.1", "webpack": "5.74.0", @@ -44613,16 +44613,14 @@ } }, "node_modules/redux-saga-test-plan": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/redux-saga-test-plan/-/redux-saga-test-plan-4.0.5.tgz", - "integrity": "sha512-phNx9h+50JXRzD5siADURrwT+ZJpLs1x5r3CRWa6HDwSZErIhH2WW/EnNAXeuM9TxYqY+ikjTWTYR6pDUyDC2g==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/redux-saga-test-plan/-/redux-saga-test-plan-4.0.6.tgz", + "integrity": "sha512-ESdbFoDWCeJ/EiFdUNSCGtA2CC9tnuvHDm6k06gVFa98EIeR2hpzFkGk9kJ1/hpMUnYFp+OOEEITIrZeDYBfFg==", "dev": true, "dependencies": { - "core-js": "^2.4.1", "fsm-iterator": "^1.1.0", "lodash.isequal": "^4.5.0", - "lodash.ismatch": "^4.4.0", - "object-assign": "^4.1.0" + "lodash.ismatch": "^4.4.0" }, "peerDependencies": { "@redux-saga/is": "^1.0.1", @@ -56449,7 +56447,7 @@ "redux-mock-store": "1.5.4", "redux-observable": "1.2.0", "redux-saga": "1.2.1", - "redux-saga-test-plan": "4.0.5", + "redux-saga-test-plan": "4.0.6", "reselect": "4.1.6", "rxjs": "6.6.7", "sanitize-html": "2.7.1", @@ -84660,16 +84658,14 @@ } }, "redux-saga-test-plan": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/redux-saga-test-plan/-/redux-saga-test-plan-4.0.5.tgz", - "integrity": "sha512-phNx9h+50JXRzD5siADURrwT+ZJpLs1x5r3CRWa6HDwSZErIhH2WW/EnNAXeuM9TxYqY+ikjTWTYR6pDUyDC2g==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/redux-saga-test-plan/-/redux-saga-test-plan-4.0.6.tgz", + "integrity": "sha512-ESdbFoDWCeJ/EiFdUNSCGtA2CC9tnuvHDm6k06gVFa98EIeR2hpzFkGk9kJ1/hpMUnYFp+OOEEITIrZeDYBfFg==", "dev": true, "requires": { - "core-js": "^2.4.1", "fsm-iterator": "^1.1.0", "lodash.isequal": "^4.5.0", - "lodash.ismatch": "^4.4.0", - "object-assign": "^4.1.0" + "lodash.ismatch": "^4.4.0" } }, "redux-thunk": { From c123741f04e059af548105b82c6ffaf85ce6f345 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 10 Sep 2022 22:24:13 +0000 Subject: [PATCH 051/129] chore(deps): update typescript-eslint monorepo to v5.36.2 --- package-lock.json | 164 +++++++++++++++++++++++----------------------- package.json | 4 +- 2 files changed, 84 insertions(+), 84 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9508c2eb94f627..78d658b46efa3b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -66,8 +66,8 @@ "@types/sanitize-html": "2.6.2", "@types/store": "2.0.2", "@types/validator": "13.7.6", - "@typescript-eslint/eslint-plugin": "5.36.1", - "@typescript-eslint/parser": "5.36.1", + "@typescript-eslint/eslint-plugin": "5.36.2", + "@typescript-eslint/parser": "5.36.2", "babel-eslint": "10.1.0", "babel-plugin-transform-imports": "2.0.0", "cross-env": "7.0.3", @@ -14671,13 +14671,13 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.36.1.tgz", - "integrity": "sha512-iC40UK8q1tMepSDwiLbTbMXKDxzNy+4TfPWgIL661Ym0sD42vRcQU93IsZIrmi+x292DBr60UI/gSwfdVYexCA==", + "version": "5.36.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.36.2.tgz", + "integrity": "sha512-OwwR8LRwSnI98tdc2z7mJYgY60gf7I9ZfGjN5EjCwwns9bdTuQfAXcsjSB2wSQ/TVNYSGKf4kzVXbNGaZvwiXw==", "dependencies": { - "@typescript-eslint/scope-manager": "5.36.1", - "@typescript-eslint/type-utils": "5.36.1", - "@typescript-eslint/utils": "5.36.1", + "@typescript-eslint/scope-manager": "5.36.2", + "@typescript-eslint/type-utils": "5.36.2", + "@typescript-eslint/utils": "5.36.2", "debug": "^4.3.4", "functional-red-black-tree": "^1.0.1", "ignore": "^5.2.0", @@ -14924,13 +14924,13 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/@typescript-eslint/parser": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.36.1.tgz", - "integrity": "sha512-/IsgNGOkBi7CuDfUbwt1eOqUXF9WGVBW9dwEe1pi+L32XrTsZIgmDFIi2RxjzsvB/8i+MIf5JIoTEH8LOZ368A==", + "version": "5.36.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.36.2.tgz", + "integrity": "sha512-qS/Kb0yzy8sR0idFspI9Z6+t7mqk/oRjnAYfewG+VN73opAUvmYL3oPIMmgOX6CnQS6gmVIXGshlb5RY/R22pA==", "dependencies": { - "@typescript-eslint/scope-manager": "5.36.1", - "@typescript-eslint/types": "5.36.1", - "@typescript-eslint/typescript-estree": "5.36.1", + "@typescript-eslint/scope-manager": "5.36.2", + "@typescript-eslint/types": "5.36.2", + "@typescript-eslint/typescript-estree": "5.36.2", "debug": "^4.3.4" }, "engines": { @@ -14971,12 +14971,12 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.36.1.tgz", - "integrity": "sha512-pGC2SH3/tXdu9IH3ItoqciD3f3RRGCh7hb9zPdN2Drsr341zgd6VbhP5OHQO/reUqihNltfPpMpTNihFMarP2w==", + "version": "5.36.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.36.2.tgz", + "integrity": "sha512-cNNP51L8SkIFSfce8B1NSUBTJTu2Ts4nWeWbFrdaqjmn9yKrAaJUBHkyTZc0cL06OFHpb+JZq5AUHROS398Orw==", "dependencies": { - "@typescript-eslint/types": "5.36.1", - "@typescript-eslint/visitor-keys": "5.36.1" + "@typescript-eslint/types": "5.36.2", + "@typescript-eslint/visitor-keys": "5.36.2" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -14987,12 +14987,12 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.36.1.tgz", - "integrity": "sha512-xfZhfmoQT6m3lmlqDvDzv9TiCYdw22cdj06xY0obSznBsT///GK5IEZQdGliXpAOaRL34o8phEvXzEo/VJx13Q==", + "version": "5.36.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.36.2.tgz", + "integrity": "sha512-rPQtS5rfijUWLouhy6UmyNquKDPhQjKsaKH0WnY6hl/07lasj8gPaH2UD8xWkePn6SC+jW2i9c2DZVDnL+Dokw==", "dependencies": { - "@typescript-eslint/typescript-estree": "5.36.1", - "@typescript-eslint/utils": "5.36.1", + "@typescript-eslint/typescript-estree": "5.36.2", + "@typescript-eslint/utils": "5.36.2", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -15034,9 +15034,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/@typescript-eslint/types": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.36.1.tgz", - "integrity": "sha512-jd93ShpsIk1KgBTx9E+hCSEuLCUFwi9V/urhjOWnOaksGZFbTOxAT47OH2d4NLJnLhkVD+wDbB48BuaycZPLBg==", + "version": "5.36.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.36.2.tgz", + "integrity": "sha512-9OJSvvwuF1L5eS2EQgFUbECb99F0mwq501w0H0EkYULkhFa19Qq7WFbycdw1PexAc929asupbZcgjVIe6OK/XQ==", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -15046,12 +15046,12 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.36.1.tgz", - "integrity": "sha512-ih7V52zvHdiX6WcPjsOdmADhYMDN15SylWRZrT2OMy80wzKbc79n8wFW0xpWpU0x3VpBz/oDgTm2xwDAnFTl+g==", + "version": "5.36.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.36.2.tgz", + "integrity": "sha512-8fyH+RfbKc0mTspfuEjlfqA4YywcwQK2Amcf6TDOwaRLg7Vwdu4bZzyvBZp4bjt1RRjQ5MDnOZahxMrt2l5v9w==", "dependencies": { - "@typescript-eslint/types": "5.36.1", - "@typescript-eslint/visitor-keys": "5.36.1", + "@typescript-eslint/types": "5.36.2", + "@typescript-eslint/visitor-keys": "5.36.2", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -15123,14 +15123,14 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/@typescript-eslint/utils": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.36.1.tgz", - "integrity": "sha512-lNj4FtTiXm5c+u0pUehozaUWhh7UYKnwryku0nxJlYUEWetyG92uw2pr+2Iy4M/u0ONMKzfrx7AsGBTCzORmIg==", + "version": "5.36.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.36.2.tgz", + "integrity": "sha512-uNcopWonEITX96v9pefk9DC1bWMdkweeSsewJ6GeC7L6j2t0SJywisgkr9wUTtXk90fi2Eljj90HSHm3OGdGRg==", "dependencies": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.36.1", - "@typescript-eslint/types": "5.36.1", - "@typescript-eslint/typescript-estree": "5.36.1", + "@typescript-eslint/scope-manager": "5.36.2", + "@typescript-eslint/types": "5.36.2", + "@typescript-eslint/typescript-estree": "5.36.2", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -15146,11 +15146,11 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.36.1.tgz", - "integrity": "sha512-ojB9aRyRFzVMN3b5joSYni6FAS10BBSCAfKJhjJAV08t/a95aM6tAhz+O1jF+EtgxktuSO3wJysp2R+Def/IWQ==", + "version": "5.36.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.36.2.tgz", + "integrity": "sha512-BtRvSR6dEdrNt7Net2/XDjbYKU5Ml6GqJgVfXT0CxTCJlnIqK7rAGreuWKMT2t8cFUT2Msv5oxw0GMRD7T5J7A==", "dependencies": { - "@typescript-eslint/types": "5.36.1", + "@typescript-eslint/types": "5.36.2", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -64853,13 +64853,13 @@ "version": "1.9.2" }, "@typescript-eslint/eslint-plugin": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.36.1.tgz", - "integrity": "sha512-iC40UK8q1tMepSDwiLbTbMXKDxzNy+4TfPWgIL661Ym0sD42vRcQU93IsZIrmi+x292DBr60UI/gSwfdVYexCA==", + "version": "5.36.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.36.2.tgz", + "integrity": "sha512-OwwR8LRwSnI98tdc2z7mJYgY60gf7I9ZfGjN5EjCwwns9bdTuQfAXcsjSB2wSQ/TVNYSGKf4kzVXbNGaZvwiXw==", "requires": { - "@typescript-eslint/scope-manager": "5.36.1", - "@typescript-eslint/type-utils": "5.36.1", - "@typescript-eslint/utils": "5.36.1", + "@typescript-eslint/scope-manager": "5.36.2", + "@typescript-eslint/type-utils": "5.36.2", + "@typescript-eslint/utils": "5.36.2", "debug": "^4.3.4", "functional-red-black-tree": "^1.0.1", "ignore": "^5.2.0", @@ -65004,13 +65004,13 @@ } }, "@typescript-eslint/parser": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.36.1.tgz", - "integrity": "sha512-/IsgNGOkBi7CuDfUbwt1eOqUXF9WGVBW9dwEe1pi+L32XrTsZIgmDFIi2RxjzsvB/8i+MIf5JIoTEH8LOZ368A==", + "version": "5.36.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.36.2.tgz", + "integrity": "sha512-qS/Kb0yzy8sR0idFspI9Z6+t7mqk/oRjnAYfewG+VN73opAUvmYL3oPIMmgOX6CnQS6gmVIXGshlb5RY/R22pA==", "requires": { - "@typescript-eslint/scope-manager": "5.36.1", - "@typescript-eslint/types": "5.36.1", - "@typescript-eslint/typescript-estree": "5.36.1", + "@typescript-eslint/scope-manager": "5.36.2", + "@typescript-eslint/types": "5.36.2", + "@typescript-eslint/typescript-estree": "5.36.2", "debug": "^4.3.4" }, "dependencies": { @@ -65030,21 +65030,21 @@ } }, "@typescript-eslint/scope-manager": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.36.1.tgz", - "integrity": "sha512-pGC2SH3/tXdu9IH3ItoqciD3f3RRGCh7hb9zPdN2Drsr341zgd6VbhP5OHQO/reUqihNltfPpMpTNihFMarP2w==", + "version": "5.36.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.36.2.tgz", + "integrity": "sha512-cNNP51L8SkIFSfce8B1NSUBTJTu2Ts4nWeWbFrdaqjmn9yKrAaJUBHkyTZc0cL06OFHpb+JZq5AUHROS398Orw==", "requires": { - "@typescript-eslint/types": "5.36.1", - "@typescript-eslint/visitor-keys": "5.36.1" + "@typescript-eslint/types": "5.36.2", + "@typescript-eslint/visitor-keys": "5.36.2" } }, "@typescript-eslint/type-utils": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.36.1.tgz", - "integrity": "sha512-xfZhfmoQT6m3lmlqDvDzv9TiCYdw22cdj06xY0obSznBsT///GK5IEZQdGliXpAOaRL34o8phEvXzEo/VJx13Q==", + "version": "5.36.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.36.2.tgz", + "integrity": "sha512-rPQtS5rfijUWLouhy6UmyNquKDPhQjKsaKH0WnY6hl/07lasj8gPaH2UD8xWkePn6SC+jW2i9c2DZVDnL+Dokw==", "requires": { - "@typescript-eslint/typescript-estree": "5.36.1", - "@typescript-eslint/utils": "5.36.1", + "@typescript-eslint/typescript-estree": "5.36.2", + "@typescript-eslint/utils": "5.36.2", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -65065,17 +65065,17 @@ } }, "@typescript-eslint/types": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.36.1.tgz", - "integrity": "sha512-jd93ShpsIk1KgBTx9E+hCSEuLCUFwi9V/urhjOWnOaksGZFbTOxAT47OH2d4NLJnLhkVD+wDbB48BuaycZPLBg==" + "version": "5.36.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.36.2.tgz", + "integrity": "sha512-9OJSvvwuF1L5eS2EQgFUbECb99F0mwq501w0H0EkYULkhFa19Qq7WFbycdw1PexAc929asupbZcgjVIe6OK/XQ==" }, "@typescript-eslint/typescript-estree": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.36.1.tgz", - "integrity": "sha512-ih7V52zvHdiX6WcPjsOdmADhYMDN15SylWRZrT2OMy80wzKbc79n8wFW0xpWpU0x3VpBz/oDgTm2xwDAnFTl+g==", + "version": "5.36.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.36.2.tgz", + "integrity": "sha512-8fyH+RfbKc0mTspfuEjlfqA4YywcwQK2Amcf6TDOwaRLg7Vwdu4bZzyvBZp4bjt1RRjQ5MDnOZahxMrt2l5v9w==", "requires": { - "@typescript-eslint/types": "5.36.1", - "@typescript-eslint/visitor-keys": "5.36.1", + "@typescript-eslint/types": "5.36.2", + "@typescript-eslint/visitor-keys": "5.36.2", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -65120,24 +65120,24 @@ } }, "@typescript-eslint/utils": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.36.1.tgz", - "integrity": "sha512-lNj4FtTiXm5c+u0pUehozaUWhh7UYKnwryku0nxJlYUEWetyG92uw2pr+2Iy4M/u0ONMKzfrx7AsGBTCzORmIg==", + "version": "5.36.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.36.2.tgz", + "integrity": "sha512-uNcopWonEITX96v9pefk9DC1bWMdkweeSsewJ6GeC7L6j2t0SJywisgkr9wUTtXk90fi2Eljj90HSHm3OGdGRg==", "requires": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.36.1", - "@typescript-eslint/types": "5.36.1", - "@typescript-eslint/typescript-estree": "5.36.1", + "@typescript-eslint/scope-manager": "5.36.2", + "@typescript-eslint/types": "5.36.2", + "@typescript-eslint/typescript-estree": "5.36.2", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" } }, "@typescript-eslint/visitor-keys": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.36.1.tgz", - "integrity": "sha512-ojB9aRyRFzVMN3b5joSYni6FAS10BBSCAfKJhjJAV08t/a95aM6tAhz+O1jF+EtgxktuSO3wJysp2R+Def/IWQ==", + "version": "5.36.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.36.2.tgz", + "integrity": "sha512-BtRvSR6dEdrNt7Net2/XDjbYKU5Ml6GqJgVfXT0CxTCJlnIqK7rAGreuWKMT2t8cFUT2Msv5oxw0GMRD7T5J7A==", "requires": { - "@typescript-eslint/types": "5.36.1", + "@typescript-eslint/types": "5.36.2", "eslint-visitor-keys": "^3.3.0" }, "dependencies": { diff --git a/package.json b/package.json index 5f3fd787bce2d8..04b1078ff7d4f2 100644 --- a/package.json +++ b/package.json @@ -146,8 +146,8 @@ "@types/sanitize-html": "2.6.2", "@types/store": "2.0.2", "@types/validator": "13.7.6", - "@typescript-eslint/eslint-plugin": "5.36.1", - "@typescript-eslint/parser": "5.36.1", + "@typescript-eslint/eslint-plugin": "5.36.2", + "@typescript-eslint/parser": "5.36.2", "babel-eslint": "10.1.0", "babel-plugin-transform-imports": "2.0.0", "cross-env": "7.0.3", From 743d5a660d0bf4be9e48952c9fb1ad7583012bdd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 11 Sep 2022 01:29:47 +0000 Subject: [PATCH 052/129] fix(deps): update dependency react-i18next to v11.18.6 --- client/package.json | 2 +- package-lock.json | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/client/package.json b/client/package.json index 2891b956d69cdd..29a31e2828557d 100644 --- a/client/package.json +++ b/client/package.json @@ -99,7 +99,7 @@ "react-ga": "3.3.1", "react-helmet": "6.1.0", "react-hotkeys": "2.0.0", - "react-i18next": "11.18.5", + "react-i18next": "11.18.6", "react-instantsearch-dom": "6.32.1", "react-lazy-load": "3.1.14", "react-monaco-editor": "0.40.0", diff --git a/package-lock.json b/package-lock.json index 78d658b46efa3b..ce36480e7a6d72 100644 --- a/package-lock.json +++ b/package-lock.json @@ -503,7 +503,7 @@ "react-ga": "3.3.1", "react-helmet": "6.1.0", "react-hotkeys": "2.0.0", - "react-i18next": "11.18.5", + "react-i18next": "11.18.6", "react-instantsearch-dom": "6.32.1", "react-lazy-load": "3.1.14", "react-monaco-editor": "0.40.0", @@ -42651,9 +42651,9 @@ } }, "node_modules/react-i18next": { - "version": "11.18.5", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-11.18.5.tgz", - "integrity": "sha512-cKcyuuzIv0YUZ4l9WORflVNuhISPAqQShOAsxwFyYuJoCA7HlLmHm7XnvO6hfAGmGpDNRhJHoBX8hG49Cb2xZQ==", + "version": "11.18.6", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-11.18.6.tgz", + "integrity": "sha512-yHb2F9BiT0lqoQDt8loZ5gWP331GwctHz9tYQ8A2EIEUu+CcEdjBLQWli1USG3RdWQt3W+jqQLg/d4rrQR96LA==", "dependencies": { "@babel/runtime": "^7.14.5", "html-parse-stringify": "^3.0.1" @@ -56428,7 +56428,7 @@ "react-ga": "3.3.1", "react-helmet": "6.1.0", "react-hotkeys": "2.0.0", - "react-i18next": "11.18.5", + "react-i18next": "11.18.6", "react-instantsearch-dom": "6.32.1", "react-lazy-load": "3.1.14", "react-monaco-editor": "0.40.0", @@ -83335,9 +83335,9 @@ } }, "react-i18next": { - "version": "11.18.5", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-11.18.5.tgz", - "integrity": "sha512-cKcyuuzIv0YUZ4l9WORflVNuhISPAqQShOAsxwFyYuJoCA7HlLmHm7XnvO6hfAGmGpDNRhJHoBX8hG49Cb2xZQ==", + "version": "11.18.6", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-11.18.6.tgz", + "integrity": "sha512-yHb2F9BiT0lqoQDt8loZ5gWP331GwctHz9tYQ8A2EIEUu+CcEdjBLQWli1USG3RdWQt3W+jqQLg/d4rrQR96LA==", "requires": { "@babel/runtime": "^7.14.5", "html-parse-stringify": "^3.0.1" From 460335599dba97b5e072d6b1a44fcf6763d36b51 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 11 Sep 2022 04:34:22 +0000 Subject: [PATCH 053/129] fix(deps): update dependency typescript to v4.8.3 --- client/package.json | 2 +- curriculum-server/package.json | 2 +- package-lock.json | 34 ++++++++++----------- package.json | 2 +- tools/challenge-editor/api/package.json | 2 +- tools/challenge-editor/client/package.json | 2 +- tools/challenge-helper-scripts/package.json | 2 +- tools/ui-components/package.json | 2 +- 8 files changed, 24 insertions(+), 24 deletions(-) diff --git a/client/package.json b/client/package.json index 29a31e2828557d..017d20ef764fa3 100644 --- a/client/package.json +++ b/client/package.json @@ -124,7 +124,7 @@ "store": "2.0.12", "stream-browserify": "3.0.0", "tone": "14.7.77", - "typescript": "4.8.2", + "typescript": "4.8.3", "util": "0.12.4", "uuid": "8.3.2", "validator": "13.7.0" diff --git a/curriculum-server/package.json b/curriculum-server/package.json index a8825be0be6ed5..a99f165002af17 100644 --- a/curriculum-server/package.json +++ b/curriculum-server/package.json @@ -28,6 +28,6 @@ }, "devDependencies": { "ts-node": "10.9.1", - "typescript": "4.8.2" + "typescript": "4.8.3" } } diff --git a/package-lock.json b/package-lock.json index ce36480e7a6d72..fe2c29a65a8713 100644 --- a/package-lock.json +++ b/package-lock.json @@ -101,7 +101,7 @@ "rimraf": "3.0.2", "start-server-and-test": "1.14.0", "ts-node": "10.9.1", - "typescript": "4.8.2", + "typescript": "4.8.3", "webpack-bundle-analyzer": "4.6.1" }, "engines": { @@ -528,7 +528,7 @@ "store": "2.0.12", "stream-browserify": "3.0.0", "tone": "14.7.77", - "typescript": "4.8.2", + "typescript": "4.8.3", "util": "0.12.4", "uuid": "8.3.2", "validator": "13.7.0" @@ -50166,9 +50166,9 @@ } }, "node_modules/typescript": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.2.tgz", - "integrity": "sha512-C0I1UsrrDHo2fYI5oaCGbSejwX4ch+9Y5jTQELvovfmFkK3HHSZJB8MSJcWLmCUBzQBchCrZ9rMRV6GuNrvGtw==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", + "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -53868,7 +53868,7 @@ "@types/express": "4.17.13", "dotenv": "16.0.1", "shx": "0.3.4", - "typescript": "4.8.2" + "typescript": "4.8.3" } }, "tools/challenge-editor/api/node_modules/dotenv": { @@ -53893,7 +53893,7 @@ "react-dom": "16.14.0", "react-router-dom": "6.3.0", "react-scripts": "5.0.1", - "typescript": "4.8.2" + "typescript": "4.8.3" }, "devDependencies": { "@types/codemirror": "5.60.5", @@ -53914,7 +53914,7 @@ "inquirer": "8.2.4", "prettier": "2.7.1", "ts-node": "10.9.1", - "typescript": "4.8.2" + "typescript": "4.8.3" }, "engines": { "node": ">=16", @@ -54167,7 +54167,7 @@ "@babel/preset-typescript": "7.18.6", "react": "16.14.0", "react-dom": "16.14.0", - "typescript": "4.8.2" + "typescript": "4.8.3" }, "devDependencies": { "@babel/core": "7.18.13", @@ -56228,7 +56228,7 @@ "gray-matter": "4.0.3", "shx": "0.3.4", "ts-node": "10.9.1", - "typescript": "4.8.2" + "typescript": "4.8.3" }, "dependencies": { "dotenv": { @@ -56254,7 +56254,7 @@ "react-router-dom": "6.3.0", "react-scripts": "5.0.1", "shx": "0.3.4", - "typescript": "4.8.2" + "typescript": "4.8.3" } }, "@freecodecamp/challenge-parser": { @@ -56458,7 +56458,7 @@ "stream-browserify": "3.0.0", "tone": "14.7.77", "ts-node": "10.9.1", - "typescript": "4.8.2", + "typescript": "4.8.3", "util": "0.12.4", "uuid": "8.3.2", "validator": "13.7.0", @@ -56591,7 +56591,7 @@ "inquirer": "8.2.4", "prettier": "2.7.1", "ts-node": "10.9.1", - "typescript": "4.8.2" + "typescript": "4.8.3" } }, "@freecodecamp/curriculum-helpers": { @@ -56738,7 +56738,7 @@ "rollup-plugin-postcss": "4.0.2", "rollup-plugin-terser": "7.0.2", "tailwindcss": "3.1.8", - "typescript": "4.8.2" + "typescript": "4.8.3" } }, "@gar/promisify": { @@ -88343,9 +88343,9 @@ } }, "typescript": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.2.tgz", - "integrity": "sha512-C0I1UsrrDHo2fYI5oaCGbSejwX4ch+9Y5jTQELvovfmFkK3HHSZJB8MSJcWLmCUBzQBchCrZ9rMRV6GuNrvGtw==" + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", + "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==" }, "typescript-compare": { "version": "0.0.2", diff --git a/package.json b/package.json index 04b1078ff7d4f2..8f636bae54153d 100644 --- a/package.json +++ b/package.json @@ -181,7 +181,7 @@ "rimraf": "3.0.2", "start-server-and-test": "1.14.0", "ts-node": "10.9.1", - "typescript": "4.8.2", + "typescript": "4.8.3", "webpack-bundle-analyzer": "4.6.1" } } diff --git a/tools/challenge-editor/api/package.json b/tools/challenge-editor/api/package.json index 4e77f301fd9077..6887ee7e4c40ad 100644 --- a/tools/challenge-editor/api/package.json +++ b/tools/challenge-editor/api/package.json @@ -19,6 +19,6 @@ "@types/express": "4.17.13", "dotenv": "16.0.1", "shx": "0.3.4", - "typescript": "4.8.2" + "typescript": "4.8.3" } } diff --git a/tools/challenge-editor/client/package.json b/tools/challenge-editor/client/package.json index 061148f40e1022..351cfb9a5a44ec 100644 --- a/tools/challenge-editor/client/package.json +++ b/tools/challenge-editor/client/package.json @@ -11,7 +11,7 @@ "react-dom": "16.14.0", "react-router-dom": "6.3.0", "react-scripts": "5.0.1", - "typescript": "4.8.2" + "typescript": "4.8.3" }, "scripts": { "start": "cross-env PORT=3300 react-scripts start", diff --git a/tools/challenge-helper-scripts/package.json b/tools/challenge-helper-scripts/package.json index 054cbf7d630be1..a13bbb60c60adb 100644 --- a/tools/challenge-helper-scripts/package.json +++ b/tools/challenge-helper-scripts/package.json @@ -30,6 +30,6 @@ "inquirer": "8.2.4", "prettier": "2.7.1", "ts-node": "10.9.1", - "typescript": "4.8.2" + "typescript": "4.8.3" } } diff --git a/tools/ui-components/package.json b/tools/ui-components/package.json index f4a6d408d29452..df8fcfdac0646b 100644 --- a/tools/ui-components/package.json +++ b/tools/ui-components/package.json @@ -22,7 +22,7 @@ "@babel/preset-typescript": "7.18.6", "react": "16.14.0", "react-dom": "16.14.0", - "typescript": "4.8.2" + "typescript": "4.8.3" }, "devDependencies": { "@babel/core": "7.18.13", From 132426ebf9e3fda8dae7dd0ae3c04515ef6462b6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 11 Sep 2022 09:25:30 +0000 Subject: [PATCH 054/129] chore(deps): update babel monorepo to v7.19.0 --- client/package.json | 6 +- curriculum/package.json | 4 +- package-lock.json | 428 ++++++++++++++++--------------- package.json | 2 +- tools/ui-components/package.json | 4 +- 5 files changed, 223 insertions(+), 221 deletions(-) diff --git a/client/package.json b/client/package.json index 017d20ef764fa3..42bd8d27d095d4 100644 --- a/client/package.json +++ b/client/package.json @@ -36,9 +36,9 @@ "@babel/plugin-proposal-export-default-from": "7.18.10", "@babel/plugin-proposal-function-bind": "7.18.9", "@babel/polyfill": "7.12.1", - "@babel/preset-env": "7.18.10", + "@babel/preset-env": "7.19.0", "@babel/preset-react": "7.18.6", - "@babel/standalone": "7.18.13", + "@babel/standalone": "7.19.0", "@fortawesome/fontawesome-svg-core": "6.1.2", "@fortawesome/free-brands-svg-icons": "6.1.2", "@fortawesome/free-solid-svg-icons": "6.1.2", @@ -130,7 +130,7 @@ "validator": "13.7.0" }, "devDependencies": { - "@babel/types": "7.18.13", + "@babel/types": "7.19.0", "@codesee/babel-plugin-instrument": "0.364.0", "@codesee/tracker": "0.364.0", "@testing-library/jest-dom": "5.16.5", diff --git a/curriculum/package.json b/curriculum/package.json index 1b89f4bcaaf641..262a72cef7f710 100644 --- a/curriculum/package.json +++ b/curriculum/package.json @@ -29,9 +29,9 @@ "test:full-output": "cross-env FULL_OUTPUT=true ts-node ../node_modules/mocha/bin/mocha --delay --reporter progress" }, "devDependencies": { - "@babel/core": "7.18.13", + "@babel/core": "7.19.0", "@babel/polyfill": "7.12.1", - "@babel/preset-env": "7.18.10", + "@babel/preset-env": "7.19.0", "@babel/preset-typescript": "7.18.6", "@babel/register": "7.18.9", "acorn": "8.8.0", diff --git a/package-lock.json b/package-lock.json index fe2c29a65a8713..400bad0981a571 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,7 +30,7 @@ "devDependencies": { "@babel/eslint-parser": "7.18.9", "@babel/plugin-proposal-function-bind": "7.18.9", - "@babel/preset-env": "7.18.10", + "@babel/preset-env": "7.19.0", "@babel/preset-react": "7.18.6", "@babel/preset-typescript": "7.18.6", "@testing-library/cypress": "8.0.3", @@ -440,9 +440,9 @@ "@babel/plugin-proposal-export-default-from": "7.18.10", "@babel/plugin-proposal-function-bind": "7.18.9", "@babel/polyfill": "7.12.1", - "@babel/preset-env": "7.18.10", + "@babel/preset-env": "7.19.0", "@babel/preset-react": "7.18.6", - "@babel/standalone": "7.18.13", + "@babel/standalone": "7.19.0", "@fortawesome/fontawesome-svg-core": "6.1.2", "@fortawesome/free-brands-svg-icons": "6.1.2", "@fortawesome/free-solid-svg-icons": "6.1.2", @@ -534,7 +534,7 @@ "validator": "13.7.0" }, "devDependencies": { - "@babel/types": "7.18.13", + "@babel/types": "7.19.0", "@codesee/babel-plugin-instrument": "0.364.0", "@codesee/tracker": "0.364.0", "@testing-library/jest-dom": "5.16.5", @@ -639,9 +639,9 @@ "version": "0.0.0-next.4", "license": "(BSD-3-Clause AND CC-BY-SA-4.0)", "devDependencies": { - "@babel/core": "7.18.13", + "@babel/core": "7.19.0", "@babel/polyfill": "7.12.1", - "@babel/preset-env": "7.18.10", + "@babel/preset-env": "7.19.0", "@babel/preset-typescript": "7.18.6", "@babel/register": "7.18.9", "acorn": "8.8.0", @@ -931,28 +931,28 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", - "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.0.tgz", + "integrity": "sha512-y5rqgTTPTmaF5e2nVhOxw+Ur9HDJLsWb6U/KpgUzRZEdPfE6VOubXBKLdbcUTijzRptednSBDQbYZBOSqJxpJw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.13.tgz", - "integrity": "sha512-ZisbOvRRusFktksHSG6pjj1CSvkPkcZq/KHD45LAkVP/oiHJkNBZWfpvlLmX8OtHDG8IuzsFlVRWo08w7Qxn0A==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.0.tgz", + "integrity": "sha512-reM4+U7B9ss148rh2n1Qs9ASS+w94irYXga7c2jaQv9RVzpS7Mv1a9rnYYwuDa45G+DkORt9g6An2k/V4d9LbQ==", "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.13", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.13", + "@babel/generator": "^7.19.0", + "@babel/helper-compilation-targets": "^7.19.0", + "@babel/helper-module-transforms": "^7.19.0", + "@babel/helpers": "^7.19.0", + "@babel/parser": "^7.19.0", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.13", - "@babel/types": "^7.18.13", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -1006,11 +1006,11 @@ } }, "node_modules/@babel/generator": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.13.tgz", - "integrity": "sha512-CkPg8ySSPuHTYPJYo7IRALdqyjM9HCbt/3uOBEFbzyGVP6Mn8bwFPB0jX6982JVNBlYzM1nnPkfjuXSOPtQeEQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz", + "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==", "dependencies": { - "@babel/types": "^7.18.13", + "@babel/types": "^7.19.0", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, @@ -1042,11 +1042,11 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", - "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.0.tgz", + "integrity": "sha512-Ai5bNWXIvwDvWM7njqsG3feMlL9hCVQsPYXodsZyLwshYkZVJt59Gftau4VrE8S9IT9asd2uSP1hG6wCNw+sXA==", "dependencies": { - "@babel/compat-data": "^7.18.8", + "@babel/compat-data": "^7.19.0", "@babel/helper-validator-option": "^7.18.6", "browserslist": "^4.20.2", "semver": "^6.3.0" @@ -1079,9 +1079,9 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz", - "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz", + "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "regexpu-core": "^5.1.0" @@ -1148,12 +1148,12 @@ } }, "node_modules/@babel/helper-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", - "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", "dependencies": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.9" + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -1193,18 +1193,18 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", - "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz", + "integrity": "sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==", "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", "@babel/helper-simple-access": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -1222,9 +1222,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", - "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", + "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==", "engines": { "node": ">=6.9.0" } @@ -1333,13 +1333,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", - "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.0.tgz", + "integrity": "sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg==", "dependencies": { - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -1393,9 +1393,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.13.tgz", - "integrity": "sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.0.tgz", + "integrity": "sha512-74bEXKX2h+8rrfQUfsBfuZZHzsEs6Eql4pqy/T4Nn6Y9wNPggQOqD6z6pn5Bl8ZfysKouFZT/UXEH94ummEeQw==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1450,12 +1450,12 @@ } }, "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz", - "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.19.0.tgz", + "integrity": "sha512-nhEByMUTx3uZueJ/QkJuSlCfN4FGg+xy+vRsfGQGzSauq5ks2Deid2+05Q3KhfaUjvec1IGhw/Zm3cFm8JigTQ==", "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-remap-async-to-generator": "^7.18.9", "@babel/plugin-syntax-async-generators": "^7.8.4" }, @@ -2053,15 +2053,16 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz", - "integrity": "sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.19.0.tgz", + "integrity": "sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.19.0", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-replace-supers": "^7.18.9", "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" @@ -2088,9 +2089,9 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz", - "integrity": "sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA==", + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.13.tgz", + "integrity": "sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.9" }, @@ -2251,13 +2252,13 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz", - "integrity": "sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.0.tgz", + "integrity": "sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A==", "dependencies": { "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-module-transforms": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-validator-identifier": "^7.18.6", "babel-plugin-dynamic-import-node": "^2.3.3" }, @@ -2284,12 +2285,12 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz", - "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.0.tgz", + "integrity": "sha512-HDSuqOQzkU//kfGdiHBt71/hkDTApw4U/cMVgKgX7PqfB3LOaK+2GtCEsBu1dL9CkswDm0Gwehht1dCr421ULQ==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -2491,11 +2492,11 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz", - "integrity": "sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz", + "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" }, "engines": { @@ -2601,17 +2602,17 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz", - "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.0.tgz", + "integrity": "sha512-1YUju1TAFuzjIQqNM9WsF4U6VbD/8t3wEAlw3LFYuuEr+ywqLRcSXxFKz4DCEj+sN94l/XTDiUXYRrsvMpz9WQ==", "dependencies": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/compat-data": "^7.19.0", + "@babel/helper-compilation-targets": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-validator-option": "^7.18.6", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.18.10", + "@babel/plugin-proposal-async-generator-functions": "^7.19.0", "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/plugin-proposal-class-static-block": "^7.18.6", "@babel/plugin-proposal-dynamic-import": "^7.18.6", @@ -2645,9 +2646,9 @@ "@babel/plugin-transform-async-to-generator": "^7.18.6", "@babel/plugin-transform-block-scoped-functions": "^7.18.6", "@babel/plugin-transform-block-scoping": "^7.18.9", - "@babel/plugin-transform-classes": "^7.18.9", + "@babel/plugin-transform-classes": "^7.19.0", "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.18.13", "@babel/plugin-transform-dotall-regex": "^7.18.6", "@babel/plugin-transform-duplicate-keys": "^7.18.9", "@babel/plugin-transform-exponentiation-operator": "^7.18.6", @@ -2657,9 +2658,9 @@ "@babel/plugin-transform-member-expression-literals": "^7.18.6", "@babel/plugin-transform-modules-amd": "^7.18.6", "@babel/plugin-transform-modules-commonjs": "^7.18.6", - "@babel/plugin-transform-modules-systemjs": "^7.18.9", + "@babel/plugin-transform-modules-systemjs": "^7.19.0", "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.0", "@babel/plugin-transform-new-target": "^7.18.6", "@babel/plugin-transform-object-super": "^7.18.6", "@babel/plugin-transform-parameters": "^7.18.8", @@ -2667,14 +2668,14 @@ "@babel/plugin-transform-regenerator": "^7.18.6", "@babel/plugin-transform-reserved-words": "^7.18.6", "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.18.9", + "@babel/plugin-transform-spread": "^7.19.0", "@babel/plugin-transform-sticky-regex": "^7.18.6", "@babel/plugin-transform-template-literals": "^7.18.9", "@babel/plugin-transform-typeof-symbol": "^7.18.9", "@babel/plugin-transform-unicode-escapes": "^7.18.10", "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.10", + "@babel/types": "^7.19.0", "babel-plugin-polyfill-corejs2": "^0.3.2", "babel-plugin-polyfill-corejs3": "^0.5.3", "babel-plugin-polyfill-regenerator": "^0.4.0", @@ -2867,9 +2868,9 @@ } }, "node_modules/@babel/standalone": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.18.13.tgz", - "integrity": "sha512-5hjvvFkaXyfQri+s4CAZtx6FTKclfTNd2QN2RwgzCVJhnYYgKh4YFBCnNJSxurzvpSKD2NmpCkoWAkMc+j9y+g==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.19.0.tgz", + "integrity": "sha512-P8lYynBl10MYpgkhGEV1fOsGDE/6lQSYp+e2YvqUPMWHT4JaQrOkM49FizjswrRzJ6KZTgG6ZY90/1GYvAR3/Q==", "engines": { "node": ">=6.9.0" } @@ -2888,18 +2889,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.13.tgz", - "integrity": "sha512-N6kt9X1jRMLPxxxPYWi7tgvJRH/rtoU+dbKAPDM44RFHiMH8igdsaSBgFeskhSl/kLWLDUvIh1RXCrTmg0/zvA==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.0.tgz", + "integrity": "sha512-4pKpFRDh+utd2mbRC8JLnlsMUii3PMHjpL6a0SZ4NMZy7YFP9aXORxEhdMVOc9CpWtDF09IkciQLEhK7Ml7gRA==", "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.13", + "@babel/generator": "^7.19.0", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.13", - "@babel/types": "^7.18.13", + "@babel/parser": "^7.19.0", + "@babel/types": "^7.19.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -2927,9 +2928,9 @@ "license": "MIT" }, "node_modules/@babel/types": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.13.tgz", - "integrity": "sha512-ePqfTihzW0W6XAU+aMw2ykilisStJfDnsejDCXRchCcMJ4O0+8DhPXf2YUbZ6wjBlsEmZwLK/sPweWtu8hcJYQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", + "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", "dependencies": { "@babel/helper-string-parser": "^7.18.10", "@babel/helper-validator-identifier": "^7.18.6", @@ -54170,8 +54171,8 @@ "typescript": "4.8.3" }, "devDependencies": { - "@babel/core": "7.18.13", - "@babel/preset-env": "7.18.10", + "@babel/core": "7.19.0", + "@babel/preset-env": "7.19.0", "@rollup/plugin-babel": "5.3.1", "@rollup/plugin-commonjs": "19.0.2", "@rollup/plugin-node-resolve": "13.3.0", @@ -54408,25 +54409,25 @@ } }, "@babel/compat-data": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", - "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==" + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.0.tgz", + "integrity": "sha512-y5rqgTTPTmaF5e2nVhOxw+Ur9HDJLsWb6U/KpgUzRZEdPfE6VOubXBKLdbcUTijzRptednSBDQbYZBOSqJxpJw==" }, "@babel/core": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.13.tgz", - "integrity": "sha512-ZisbOvRRusFktksHSG6pjj1CSvkPkcZq/KHD45LAkVP/oiHJkNBZWfpvlLmX8OtHDG8IuzsFlVRWo08w7Qxn0A==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.0.tgz", + "integrity": "sha512-reM4+U7B9ss148rh2n1Qs9ASS+w94irYXga7c2jaQv9RVzpS7Mv1a9rnYYwuDa45G+DkORt9g6An2k/V4d9LbQ==", "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.13", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.13", + "@babel/generator": "^7.19.0", + "@babel/helper-compilation-targets": "^7.19.0", + "@babel/helper-module-transforms": "^7.19.0", + "@babel/helpers": "^7.19.0", + "@babel/parser": "^7.19.0", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.13", - "@babel/types": "^7.18.13", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -54460,11 +54461,11 @@ } }, "@babel/generator": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.13.tgz", - "integrity": "sha512-CkPg8ySSPuHTYPJYo7IRALdqyjM9HCbt/3uOBEFbzyGVP6Mn8bwFPB0jX6982JVNBlYzM1nnPkfjuXSOPtQeEQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz", + "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==", "requires": { - "@babel/types": "^7.18.13", + "@babel/types": "^7.19.0", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" } @@ -54487,11 +54488,11 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", - "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.0.tgz", + "integrity": "sha512-Ai5bNWXIvwDvWM7njqsG3feMlL9hCVQsPYXodsZyLwshYkZVJt59Gftau4VrE8S9IT9asd2uSP1hG6wCNw+sXA==", "requires": { - "@babel/compat-data": "^7.18.8", + "@babel/compat-data": "^7.19.0", "@babel/helper-validator-option": "^7.18.6", "browserslist": "^4.20.2", "semver": "^6.3.0" @@ -54512,9 +54513,9 @@ } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz", - "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz", + "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==", "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "regexpu-core": "^5.1.0" @@ -54558,12 +54559,12 @@ } }, "@babel/helper-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", - "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", "requires": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.9" + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" } }, "@babel/helper-hoist-variables": { @@ -54591,18 +54592,18 @@ } }, "@babel/helper-module-transforms": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", - "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz", + "integrity": "sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==", "requires": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", "@babel/helper-simple-access": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" } }, "@babel/helper-optimise-call-expression": { @@ -54614,9 +54615,9 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", - "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==" + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", + "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==" }, "@babel/helper-remap-async-to-generator": { "version": "7.18.9", @@ -54692,13 +54693,13 @@ } }, "@babel/helpers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", - "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.0.tgz", + "integrity": "sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg==", "requires": { - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" } }, "@babel/highlight": { @@ -54734,9 +54735,9 @@ } }, "@babel/parser": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.13.tgz", - "integrity": "sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg==" + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.0.tgz", + "integrity": "sha512-74bEXKX2h+8rrfQUfsBfuZZHzsEs6Eql4pqy/T4Nn6Y9wNPggQOqD6z6pn5Bl8ZfysKouFZT/UXEH94ummEeQw==" }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.18.6", @@ -54769,12 +54770,12 @@ } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz", - "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.19.0.tgz", + "integrity": "sha512-nhEByMUTx3uZueJ/QkJuSlCfN4FGg+xy+vRsfGQGzSauq5ks2Deid2+05Q3KhfaUjvec1IGhw/Zm3cFm8JigTQ==", "requires": { "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-remap-async-to-generator": "^7.18.9", "@babel/plugin-syntax-async-generators": "^7.8.4" } @@ -55122,15 +55123,16 @@ } }, "@babel/plugin-transform-classes": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz", - "integrity": "sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.19.0.tgz", + "integrity": "sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==", "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.19.0", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-replace-supers": "^7.18.9", "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" @@ -55145,9 +55147,9 @@ } }, "@babel/plugin-transform-destructuring": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz", - "integrity": "sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA==", + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.13.tgz", + "integrity": "sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==", "requires": { "@babel/helper-plugin-utils": "^7.18.9" } @@ -55241,13 +55243,13 @@ } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz", - "integrity": "sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.0.tgz", + "integrity": "sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A==", "requires": { "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-module-transforms": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-validator-identifier": "^7.18.6", "babel-plugin-dynamic-import-node": "^2.3.3" } @@ -55262,12 +55264,12 @@ } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz", - "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.0.tgz", + "integrity": "sha512-HDSuqOQzkU//kfGdiHBt71/hkDTApw4U/cMVgKgX7PqfB3LOaK+2GtCEsBu1dL9CkswDm0Gwehht1dCr421ULQ==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0" } }, "@babel/plugin-transform-new-target": { @@ -55383,11 +55385,11 @@ } }, "@babel/plugin-transform-spread": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz", - "integrity": "sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz", + "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==", "requires": { - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" } }, @@ -55450,17 +55452,17 @@ } }, "@babel/preset-env": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz", - "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.0.tgz", + "integrity": "sha512-1YUju1TAFuzjIQqNM9WsF4U6VbD/8t3wEAlw3LFYuuEr+ywqLRcSXxFKz4DCEj+sN94l/XTDiUXYRrsvMpz9WQ==", "requires": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/compat-data": "^7.19.0", + "@babel/helper-compilation-targets": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-validator-option": "^7.18.6", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.18.10", + "@babel/plugin-proposal-async-generator-functions": "^7.19.0", "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/plugin-proposal-class-static-block": "^7.18.6", "@babel/plugin-proposal-dynamic-import": "^7.18.6", @@ -55494,9 +55496,9 @@ "@babel/plugin-transform-async-to-generator": "^7.18.6", "@babel/plugin-transform-block-scoped-functions": "^7.18.6", "@babel/plugin-transform-block-scoping": "^7.18.9", - "@babel/plugin-transform-classes": "^7.18.9", + "@babel/plugin-transform-classes": "^7.19.0", "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.18.13", "@babel/plugin-transform-dotall-regex": "^7.18.6", "@babel/plugin-transform-duplicate-keys": "^7.18.9", "@babel/plugin-transform-exponentiation-operator": "^7.18.6", @@ -55506,9 +55508,9 @@ "@babel/plugin-transform-member-expression-literals": "^7.18.6", "@babel/plugin-transform-modules-amd": "^7.18.6", "@babel/plugin-transform-modules-commonjs": "^7.18.6", - "@babel/plugin-transform-modules-systemjs": "^7.18.9", + "@babel/plugin-transform-modules-systemjs": "^7.19.0", "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.0", "@babel/plugin-transform-new-target": "^7.18.6", "@babel/plugin-transform-object-super": "^7.18.6", "@babel/plugin-transform-parameters": "^7.18.8", @@ -55516,14 +55518,14 @@ "@babel/plugin-transform-regenerator": "^7.18.6", "@babel/plugin-transform-reserved-words": "^7.18.6", "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.18.9", + "@babel/plugin-transform-spread": "^7.19.0", "@babel/plugin-transform-sticky-regex": "^7.18.6", "@babel/plugin-transform-template-literals": "^7.18.9", "@babel/plugin-transform-typeof-symbol": "^7.18.9", "@babel/plugin-transform-unicode-escapes": "^7.18.10", "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.10", + "@babel/types": "^7.19.0", "babel-plugin-polyfill-corejs2": "^0.3.2", "babel-plugin-polyfill-corejs3": "^0.5.3", "babel-plugin-polyfill-regenerator": "^0.4.0", @@ -55652,9 +55654,9 @@ } }, "@babel/standalone": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.18.13.tgz", - "integrity": "sha512-5hjvvFkaXyfQri+s4CAZtx6FTKclfTNd2QN2RwgzCVJhnYYgKh4YFBCnNJSxurzvpSKD2NmpCkoWAkMc+j9y+g==" + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.19.0.tgz", + "integrity": "sha512-P8lYynBl10MYpgkhGEV1fOsGDE/6lQSYp+e2YvqUPMWHT4JaQrOkM49FizjswrRzJ6KZTgG6ZY90/1GYvAR3/Q==" }, "@babel/template": { "version": "7.18.10", @@ -55667,18 +55669,18 @@ } }, "@babel/traverse": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.13.tgz", - "integrity": "sha512-N6kt9X1jRMLPxxxPYWi7tgvJRH/rtoU+dbKAPDM44RFHiMH8igdsaSBgFeskhSl/kLWLDUvIh1RXCrTmg0/zvA==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.0.tgz", + "integrity": "sha512-4pKpFRDh+utd2mbRC8JLnlsMUii3PMHjpL6a0SZ4NMZy7YFP9aXORxEhdMVOc9CpWtDF09IkciQLEhK7Ml7gRA==", "requires": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.13", + "@babel/generator": "^7.19.0", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.13", - "@babel/types": "^7.18.13", + "@babel/parser": "^7.19.0", + "@babel/types": "^7.19.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -55695,9 +55697,9 @@ } }, "@babel/types": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.13.tgz", - "integrity": "sha512-ePqfTihzW0W6XAU+aMw2ykilisStJfDnsejDCXRchCcMJ4O0+8DhPXf2YUbZ6wjBlsEmZwLK/sPweWtu8hcJYQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", + "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", "requires": { "@babel/helper-string-parser": "^7.18.10", "@babel/helper-validator-identifier": "^7.18.6", @@ -56352,10 +56354,10 @@ "@babel/plugin-proposal-export-default-from": "7.18.10", "@babel/plugin-proposal-function-bind": "7.18.9", "@babel/polyfill": "7.12.1", - "@babel/preset-env": "7.18.10", + "@babel/preset-env": "7.19.0", "@babel/preset-react": "7.18.6", - "@babel/standalone": "7.18.13", - "@babel/types": "7.18.13", + "@babel/standalone": "7.19.0", + "@babel/types": "7.19.0", "@codesee/babel-plugin-instrument": "0.364.0", "@codesee/tracker": "0.364.0", "@fortawesome/fontawesome-svg-core": "6.1.2", @@ -56526,9 +56528,9 @@ "@freecodecamp/curriculum": { "version": "file:curriculum", "requires": { - "@babel/core": "7.18.13", + "@babel/core": "7.19.0", "@babel/polyfill": "7.12.1", - "@babel/preset-env": "7.18.10", + "@babel/preset-env": "7.19.0", "@babel/preset-typescript": "7.18.6", "@babel/register": "7.18.9", "acorn": "8.8.0", @@ -56706,8 +56708,8 @@ "@freecodecamp/ui": { "version": "file:tools/ui-components", "requires": { - "@babel/core": "7.18.13", - "@babel/preset-env": "7.18.10", + "@babel/core": "7.19.0", + "@babel/preset-env": "7.19.0", "@babel/preset-typescript": "7.18.6", "@rollup/plugin-babel": "5.3.1", "@rollup/plugin-commonjs": "19.0.2", diff --git a/package.json b/package.json index 8f636bae54153d..dcf67004211be9 100644 --- a/package.json +++ b/package.json @@ -110,7 +110,7 @@ "devDependencies": { "@babel/eslint-parser": "7.18.9", "@babel/plugin-proposal-function-bind": "7.18.9", - "@babel/preset-env": "7.18.10", + "@babel/preset-env": "7.19.0", "@babel/preset-react": "7.18.6", "@babel/preset-typescript": "7.18.6", "@testing-library/cypress": "8.0.3", diff --git a/tools/ui-components/package.json b/tools/ui-components/package.json index df8fcfdac0646b..0c82de74be649d 100644 --- a/tools/ui-components/package.json +++ b/tools/ui-components/package.json @@ -25,8 +25,8 @@ "typescript": "4.8.3" }, "devDependencies": { - "@babel/core": "7.18.13", - "@babel/preset-env": "7.18.10", + "@babel/core": "7.19.0", + "@babel/preset-env": "7.19.0", "@rollup/plugin-babel": "5.3.1", "@rollup/plugin-commonjs": "19.0.2", "@rollup/plugin-node-resolve": "13.3.0", From 1a6f67aa2cc6d829680554eb2d2b7cde78861628 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 11 Sep 2022 12:28:52 +0000 Subject: [PATCH 055/129] chore(deps): update dependency @rollup/plugin-typescript to v8.5.0 --- package-lock.json | 16 ++++++++-------- tools/ui-components/package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 400bad0981a571..1e3a824e4aa727 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5363,9 +5363,9 @@ } }, "node_modules/@rollup/plugin-typescript": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-8.4.0.tgz", - "integrity": "sha512-QssfoOP6V4/6skX12EfOW5UzJAv/c334F4OJWmQpe2kg3agEa0JwVCckwmfuvEgDixyX+XyxjFenH7M2rDKUyQ==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-8.5.0.tgz", + "integrity": "sha512-wMv1/scv0m/rXx21wD2IsBbJFba8wGF3ErJIr6IKRfRj49S85Lszbxb4DCo8iILpluTjk2GAAu9CoZt4G3ppgQ==", "dev": true, "dependencies": { "@rollup/pluginutils": "^3.1.0", @@ -54176,7 +54176,7 @@ "@rollup/plugin-babel": "5.3.1", "@rollup/plugin-commonjs": "19.0.2", "@rollup/plugin-node-resolve": "13.3.0", - "@rollup/plugin-typescript": "8.4.0", + "@rollup/plugin-typescript": "8.5.0", "@storybook/addon-a11y": "6.5.10", "@storybook/addon-actions": "6.5.10", "@storybook/addon-docs": "6.5.10", @@ -56714,7 +56714,7 @@ "@rollup/plugin-babel": "5.3.1", "@rollup/plugin-commonjs": "19.0.2", "@rollup/plugin-node-resolve": "13.3.0", - "@rollup/plugin-typescript": "8.4.0", + "@rollup/plugin-typescript": "8.5.0", "@storybook/addon-a11y": "6.5.10", "@storybook/addon-actions": "6.5.10", "@storybook/addon-docs": "6.5.10", @@ -58013,9 +58013,9 @@ } }, "@rollup/plugin-typescript": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-8.4.0.tgz", - "integrity": "sha512-QssfoOP6V4/6skX12EfOW5UzJAv/c334F4OJWmQpe2kg3agEa0JwVCckwmfuvEgDixyX+XyxjFenH7M2rDKUyQ==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-8.5.0.tgz", + "integrity": "sha512-wMv1/scv0m/rXx21wD2IsBbJFba8wGF3ErJIr6IKRfRj49S85Lszbxb4DCo8iILpluTjk2GAAu9CoZt4G3ppgQ==", "dev": true, "requires": { "@rollup/pluginutils": "^3.1.0", diff --git a/tools/ui-components/package.json b/tools/ui-components/package.json index 0c82de74be649d..c094894d41a4d7 100644 --- a/tools/ui-components/package.json +++ b/tools/ui-components/package.json @@ -30,7 +30,7 @@ "@rollup/plugin-babel": "5.3.1", "@rollup/plugin-commonjs": "19.0.2", "@rollup/plugin-node-resolve": "13.3.0", - "@rollup/plugin-typescript": "8.4.0", + "@rollup/plugin-typescript": "8.5.0", "@storybook/addon-a11y": "6.5.10", "@storybook/addon-actions": "6.5.10", "@storybook/addon-docs": "6.5.10", From 6b432c006b0e9c49e4b35594d887fc26b48e1be6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 11 Sep 2022 15:44:12 +0000 Subject: [PATCH 056/129] fix(deps): update dependency @freecodecamp/curriculum-helpers to v1.1.0 --- client/package.json | 2 +- package-lock.json | 1106 ++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 1047 insertions(+), 61 deletions(-) diff --git a/client/package.json b/client/package.json index 42bd8d27d095d4..b4d1b4e7bb49dd 100644 --- a/client/package.json +++ b/client/package.json @@ -43,7 +43,7 @@ "@fortawesome/free-brands-svg-icons": "6.1.2", "@fortawesome/free-solid-svg-icons": "6.1.2", "@fortawesome/react-fontawesome": "0.2.0", - "@freecodecamp/curriculum-helpers": "1.0.5", + "@freecodecamp/curriculum-helpers": "1.1.0", "@freecodecamp/loop-protect": "3.0.0", "@freecodecamp/react-bootstrap": "0.32.3", "@freecodecamp/react-calendar-heatmap": "1.0.0", diff --git a/package-lock.json b/package-lock.json index 1e3a824e4aa727..b2cf847faec0e2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -447,7 +447,7 @@ "@fortawesome/free-brands-svg-icons": "6.1.2", "@fortawesome/free-solid-svg-icons": "6.1.2", "@fortawesome/react-fontawesome": "0.2.0", - "@freecodecamp/curriculum-helpers": "1.0.5", + "@freecodecamp/curriculum-helpers": "1.1.0", "@freecodecamp/loop-protect": "3.0.0", "@freecodecamp/react-bootstrap": "0.32.3", "@freecodecamp/react-calendar-heatmap": "1.0.0", @@ -3397,11 +3397,11 @@ "link": true }, "node_modules/@freecodecamp/curriculum-helpers": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@freecodecamp/curriculum-helpers/-/curriculum-helpers-1.0.5.tgz", - "integrity": "sha512-GjaJXju1slWKtNb01xY6lbDjhuIQLEcLysdhi8d1eIfnvx94Jaxh1tBvxYiFbeI1xf+oeS+6gAy/GIEa7PP0KQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@freecodecamp/curriculum-helpers/-/curriculum-helpers-1.1.0.tgz", + "integrity": "sha512-cS2ZZj9Z6hMcd1oPFgAj9zk8ttETkFpMW8bHD2zAB0OnE2iHxwC46HH+ZPJ0jDugpo63KT+3RypYrtBvtKOgmA==", "dependencies": { - "@freecodecamp/strip-comments": "^3.0.1" + "browserify": "^17.0.0" }, "engines": { "npm": ">= 4.0.0" @@ -18452,15 +18452,100 @@ "version": "1.2.0", "license": "Unlicence" }, + "node_modules/browser-pack": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", + "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", + "dependencies": { + "combine-source-map": "~0.8.0", + "defined": "^1.0.0", + "JSONStream": "^1.0.3", + "safe-buffer": "^5.1.1", + "through2": "^2.0.0", + "umd": "^3.0.0" + }, + "bin": { + "browser-pack": "bin/cmd.js" + } + }, "node_modules/browser-process-hrtime": { "version": "1.0.0", "license": "BSD-2-Clause" }, + "node_modules/browser-resolve": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", + "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", + "dependencies": { + "resolve": "^1.17.0" + } + }, "node_modules/browser-stdout": { "version": "1.3.1", "dev": true, "license": "ISC" }, + "node_modules/browserify": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-17.0.0.tgz", + "integrity": "sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w==", + "dependencies": { + "assert": "^1.4.0", + "browser-pack": "^6.0.1", + "browser-resolve": "^2.0.0", + "browserify-zlib": "~0.2.0", + "buffer": "~5.2.1", + "cached-path-relative": "^1.0.0", + "concat-stream": "^1.6.0", + "console-browserify": "^1.1.0", + "constants-browserify": "~1.0.0", + "crypto-browserify": "^3.0.0", + "defined": "^1.0.0", + "deps-sort": "^2.0.1", + "domain-browser": "^1.2.0", + "duplexer2": "~0.1.2", + "events": "^3.0.0", + "glob": "^7.1.0", + "has": "^1.0.0", + "htmlescape": "^1.1.0", + "https-browserify": "^1.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^7.2.1", + "JSONStream": "^1.0.3", + "labeled-stream-splicer": "^2.0.0", + "mkdirp-classic": "^0.5.2", + "module-deps": "^6.2.3", + "os-browserify": "~0.3.0", + "parents": "^1.0.1", + "path-browserify": "^1.0.0", + "process": "~0.11.0", + "punycode": "^1.3.2", + "querystring-es3": "~0.2.0", + "read-only-stream": "^2.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.4", + "shasum-object": "^1.0.0", + "shell-quote": "^1.6.1", + "stream-browserify": "^3.0.0", + "stream-http": "^3.0.0", + "string_decoder": "^1.1.1", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^2.0.0", + "timers-browserify": "^1.0.1", + "tty-browserify": "0.0.1", + "url": "~0.11.0", + "util": "~0.12.0", + "vm-browserify": "^1.0.0", + "xtend": "^4.0.0" + }, + "bin": { + "browserify": "bin/cmd.js" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/browserify-aes": { "version": "1.2.0", "license": "MIT", @@ -18537,11 +18622,116 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, "dependencies": { "pako": "~1.0.5" } }, + "node_modules/browserify/node_modules/assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dependencies": { + "object-assign": "^4.1.1", + "util": "0.10.3" + } + }, + "node_modules/browserify/node_modules/assert/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==" + }, + "node_modules/browserify/node_modules/assert/node_modules/util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==", + "dependencies": { + "inherits": "2.0.1" + } + }, + "node_modules/browserify/node_modules/buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", + "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "node_modules/browserify/node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/browserify/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + }, + "node_modules/browserify/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/browserify/node_modules/stream-http": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + } + }, + "node_modules/browserify/node_modules/stream-http/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/browserify/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/browserify/node_modules/timers-browserify": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", + "integrity": "sha512-PIxwAupJZiYU4JmVZYwXp9FKsHMXb5h0ZEFyuXTAn8WLHOlcij+FEcbrvDsom1o5dr1YggEtFbECvGCW2sT53Q==", + "dependencies": { + "process": "~0.11.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/browserify/node_modules/tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==" + }, "node_modules/browserslist": { "version": "4.21.3", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", @@ -18649,8 +18839,7 @@ "node_modules/builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", - "dev": true + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==" }, "node_modules/busboy": { "version": "0.2.14", @@ -18995,6 +19184,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cached-path-relative": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.1.0.tgz", + "integrity": "sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==" + }, "node_modules/cachedir": { "version": "2.3.0", "dev": true, @@ -19872,6 +20066,27 @@ "node": ">=0.1.90" } }, + "node_modules/combine-source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha512-UlxQ9Vw0b/Bt/KYwCFqdEwsQ1eL8d1gibiFb7lxQJFdvTgc2hIZi6ugsg+kyhzhPV+QEpUiEIwInIAIrgoEkrg==", + "dependencies": { + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" + } + }, + "node_modules/combine-source-map/node_modules/convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha512-Y8L5rp6jo+g9VEPgvqNfEopjTR4OTYct8lXlS8iVQdmnjDvbdbzYe9rjtFCB9egC86JoNCU61WRY+ScjkZpnIg==" + }, + "node_modules/combine-source-map/node_modules/lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha512-eDn9kqrAmVUC1wmZvlQ6Uhde44n+tXpqPrN8olQJbttgh0oKclk+SF54P47VEGE9CEiMeRwAP8BaM7UHvBkz2A==" + }, "node_modules/combined-stream": { "version": "1.0.8", "license": "MIT", @@ -20084,8 +20299,7 @@ "node_modules/console-browserify": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" }, "node_modules/console-control-strings": { "version": "1.1.0", @@ -20094,8 +20308,7 @@ "node_modules/constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", - "dev": true + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==" }, "node_modules/content-disposition": { "version": "0.5.4", @@ -21549,6 +21762,11 @@ "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" }, + "node_modules/dash-ast": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", + "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==" + }, "node_modules/dashdash": { "version": "1.14.1", "license": "MIT", @@ -22004,6 +22222,20 @@ "version": "2.3.1", "license": "ISC" }, + "node_modules/deps-sort": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz", + "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==", + "dependencies": { + "JSONStream": "^1.0.3", + "shasum-object": "^1.0.0", + "subarg": "^1.0.0", + "through2": "^2.0.0" + }, + "bin": { + "deps-sort": "bin/cmd.js" + } + }, "node_modules/dequal": { "version": "2.0.2", "license": "MIT", @@ -22462,7 +22694,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true, "engines": { "node": ">=0.4", "npm": ">=1.2" @@ -22572,6 +22803,36 @@ "version": "0.1.2", "license": "MIT" }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/duplexer2/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexer2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/duplexer3": { "version": "0.1.4", "license": "BSD-3-Clause" @@ -28108,6 +28369,11 @@ "node": ">=6.9.0" } }, + "node_modules/get-assigned-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", + "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==" + }, "node_modules/get-caller-file": { "version": "1.0.3", "dev": true, @@ -29318,6 +29584,14 @@ "node": ">=6" } }, + "node_modules/htmlescape": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "integrity": "sha512-eVcrzgbR4tim7c7soKQKtxa/kQM4TzjnlU83rcZ9bHU6t31ehfV7SktN6McWgwPWg+JYMA/O3qpGxBvFq1z2Jg==", + "engines": { + "node": ">=0.10" + } + }, "node_modules/htmlparser2": { "version": "6.1.0", "funding": [ @@ -29639,8 +29913,7 @@ "node_modules/https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", - "dev": true + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==" }, "node_modules/https-proxy-agent": { "version": "5.0.0", @@ -29957,6 +30230,14 @@ "node": ">=10" } }, + "node_modules/inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha512-0mVWSSbNDvedDWIN4wxLsdPM4a7cIPcpyMxj3QZ406QRwQ6ePGB1YIHxVPjqpcUGbWQ5C+nHTwGNWAGvt7ggVA==", + "dependencies": { + "source-map": "~0.5.3" + } + }, "node_modules/inline-style-parser": { "version": "0.1.1", "license": "MIT" @@ -30072,6 +30353,26 @@ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true }, + "node_modules/insert-module-globals": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.1.tgz", + "integrity": "sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==", + "dependencies": { + "acorn-node": "^1.5.2", + "combine-source-map": "^0.8.0", + "concat-stream": "^1.6.1", + "is-buffer": "^1.1.0", + "JSONStream": "^1.0.3", + "path-is-absolute": "^1.0.1", + "process": "~0.11.0", + "through2": "^2.0.0", + "undeclared-identifiers": "^1.1.2", + "xtend": "^4.0.0" + }, + "bin": { + "insert-module-globals": "bin/cmd.js" + } + }, "node_modules/internal-ip": { "version": "4.3.0", "license": "MIT", @@ -33448,6 +33749,15 @@ "node": ">= 8" } }, + "node_modules/labeled-stream-splicer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", + "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", + "dependencies": { + "inherits": "^2.0.1", + "stream-splicer": "^2.0.0" + } + }, "node_modules/language-subtag-registry": { "version": "0.3.21", "license": "ODC-By-1.0" @@ -37556,6 +37866,56 @@ "node": ">=0.10.0" } }, + "node_modules/module-deps": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.3.tgz", + "integrity": "sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==", + "dependencies": { + "browser-resolve": "^2.0.0", + "cached-path-relative": "^1.0.2", + "concat-stream": "~1.6.0", + "defined": "^1.0.0", + "detective": "^5.2.0", + "duplexer2": "^0.1.2", + "inherits": "^2.0.1", + "JSONStream": "^1.0.3", + "parents": "^1.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.4.0", + "stream-combiner2": "^1.1.1", + "subarg": "^1.0.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" + }, + "bin": { + "module-deps": "bin/cmd.js" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/module-deps/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/module-deps/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/moment": { "version": "2.29.1", "license": "MIT", @@ -39285,8 +39645,7 @@ "node_modules/os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", - "dev": true + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==" }, "node_modules/os-homedir": { "version": "1.0.2", @@ -39754,8 +40113,7 @@ "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" }, "node_modules/parallel-transform": { "version": "1.2.0", @@ -39821,6 +40179,14 @@ "node": ">= 0.4.0" } }, + "node_modules/parents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", + "integrity": "sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg==", + "dependencies": { + "path-platform": "~0.11.15" + } + }, "node_modules/parse-asn1": { "version": "5.1.6", "license": "ISC", @@ -40198,6 +40564,14 @@ "version": "1.0.7", "license": "MIT" }, + "node_modules/path-platform": { + "version": "0.11.15", + "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", + "integrity": "sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==", + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/path-to-regexp": { "version": "0.1.7", "license": "MIT" @@ -42114,7 +42488,6 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", - "dev": true, "engines": { "node": ">=0.4.x" } @@ -44346,6 +44719,36 @@ "pify": "^2.3.0" } }, + "node_modules/read-only-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", + "integrity": "sha512-3ALe0bjBVZtkdWKIcThYpQCLbBMd/+Tbh2CDSrAIDO3UsZ4Xs+tnyjv2MjCOMMgBG+AsUOeuP1cgtY1INISc8w==", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/read-only-stream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/read-only-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/read-pkg": { "version": "3.0.0", "dev": true, @@ -46901,6 +47304,14 @@ "version": "4.0.0", "license": "ISC" }, + "node_modules/shasum-object": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz", + "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==", + "dependencies": { + "fast-safe-stringify": "^2.0.7" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "license": "MIT", @@ -48018,6 +48429,37 @@ "duplexer": "~0.1.1" } }, + "node_modules/stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", + "dependencies": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-combiner2/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/stream-combiner2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/stream-each": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", @@ -48075,6 +48517,37 @@ "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", "dev": true }, + "node_modules/stream-splicer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", + "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-splicer/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/stream-splicer/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/streamsearch": { "version": "0.1.2", "engines": { @@ -48831,6 +49304,14 @@ "postcss": "^8.2.15" } }, + "node_modules/subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==", + "dependencies": { + "minimist": "^1.1.0" + } + }, "node_modules/subscriptions-transport-ws": { "version": "0.9.19", "license": "MIT", @@ -49095,6 +49576,14 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/syntax-error": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", + "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", + "dependencies": { + "acorn-node": "^1.2.0" + } + }, "node_modules/table": { "version": "6.7.5", "license": "BSD-3-Clause", @@ -49578,7 +50067,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, "dependencies": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" @@ -49588,7 +50076,6 @@ "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -49603,7 +50090,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -50227,6 +50713,14 @@ "node_modules/uid2": { "version": "0.0.3" }, + "node_modules/umd": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", + "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", + "bin": { + "umd": "bin/cli.js" + } + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -50290,6 +50784,21 @@ "react": ">=15.0.0" } }, + "node_modules/undeclared-identifiers": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", + "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", + "dependencies": { + "acorn-node": "^1.3.0", + "dash-ast": "^1.0.0", + "get-assigned-identifiers": "^1.2.0", + "simple-concat": "^1.0.0", + "xtend": "^4.0.1" + }, + "bin": { + "undeclared-identifiers": "bin.js" + } + }, "node_modules/undefsafe": { "version": "2.0.5", "dev": true, @@ -50916,7 +51425,6 @@ }, "node_modules/url": { "version": "0.11.0", - "devOptional": true, "license": "MIT", "dependencies": { "punycode": "1.3.2", @@ -50981,12 +51489,10 @@ }, "node_modules/url/node_modules/punycode": { "version": "1.3.2", - "devOptional": true, "license": "MIT" }, "node_modules/url/node_modules/querystring": { "version": "0.2.0", - "devOptional": true, "engines": { "node": ">=0.4.x" } @@ -51235,8 +51741,7 @@ "node_modules/vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" }, "node_modules/void-elements": { "version": "3.1.0", @@ -56364,7 +56869,7 @@ "@fortawesome/free-brands-svg-icons": "6.1.2", "@fortawesome/free-solid-svg-icons": "6.1.2", "@fortawesome/react-fontawesome": "0.2.0", - "@freecodecamp/curriculum-helpers": "1.0.5", + "@freecodecamp/curriculum-helpers": "1.1.0", "@freecodecamp/loop-protect": "3.0.0", "@freecodecamp/react-bootstrap": "0.32.3", "@freecodecamp/react-calendar-heatmap": "1.0.0", @@ -56597,11 +57102,11 @@ } }, "@freecodecamp/curriculum-helpers": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@freecodecamp/curriculum-helpers/-/curriculum-helpers-1.0.5.tgz", - "integrity": "sha512-GjaJXju1slWKtNb01xY6lbDjhuIQLEcLysdhi8d1eIfnvx94Jaxh1tBvxYiFbeI1xf+oeS+6gAy/GIEa7PP0KQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@freecodecamp/curriculum-helpers/-/curriculum-helpers-1.1.0.tgz", + "integrity": "sha512-cS2ZZj9Z6hMcd1oPFgAj9zk8ttETkFpMW8bHD2zAB0OnE2iHxwC46HH+ZPJ0jDugpo63KT+3RypYrtBvtKOgmA==", "requires": { - "@freecodecamp/strip-comments": "^3.0.1" + "browserify": "^17.0.0" } }, "@freecodecamp/fcc-source-challenges": { @@ -67603,13 +68108,192 @@ "browser-cookies": { "version": "1.2.0" }, + "browser-pack": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", + "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", + "requires": { + "combine-source-map": "~0.8.0", + "defined": "^1.0.0", + "JSONStream": "^1.0.3", + "safe-buffer": "^5.1.1", + "through2": "^2.0.0", + "umd": "^3.0.0" + } + }, "browser-process-hrtime": { "version": "1.0.0" }, + "browser-resolve": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", + "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", + "requires": { + "resolve": "^1.17.0" + } + }, "browser-stdout": { "version": "1.3.1", "dev": true }, + "browserify": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-17.0.0.tgz", + "integrity": "sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w==", + "requires": { + "assert": "^1.4.0", + "browser-pack": "^6.0.1", + "browser-resolve": "^2.0.0", + "browserify-zlib": "~0.2.0", + "buffer": "~5.2.1", + "cached-path-relative": "^1.0.0", + "concat-stream": "^1.6.0", + "console-browserify": "^1.1.0", + "constants-browserify": "~1.0.0", + "crypto-browserify": "^3.0.0", + "defined": "^1.0.0", + "deps-sort": "^2.0.1", + "domain-browser": "^1.2.0", + "duplexer2": "~0.1.2", + "events": "^3.0.0", + "glob": "^7.1.0", + "has": "^1.0.0", + "htmlescape": "^1.1.0", + "https-browserify": "^1.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^7.2.1", + "JSONStream": "^1.0.3", + "labeled-stream-splicer": "^2.0.0", + "mkdirp-classic": "^0.5.2", + "module-deps": "^6.2.3", + "os-browserify": "~0.3.0", + "parents": "^1.0.1", + "path-browserify": "^1.0.0", + "process": "~0.11.0", + "punycode": "^1.3.2", + "querystring-es3": "~0.2.0", + "read-only-stream": "^2.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.4", + "shasum-object": "^1.0.0", + "shell-quote": "^1.6.1", + "stream-browserify": "^3.0.0", + "stream-http": "^3.0.0", + "string_decoder": "^1.1.1", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^2.0.0", + "timers-browserify": "^1.0.1", + "tty-browserify": "0.0.1", + "url": "~0.11.0", + "util": "~0.12.0", + "vm-browserify": "^1.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==", + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", + "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "stream-http": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "timers-browserify": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", + "integrity": "sha512-PIxwAupJZiYU4JmVZYwXp9FKsHMXb5h0ZEFyuXTAn8WLHOlcij+FEcbrvDsom1o5dr1YggEtFbECvGCW2sT53Q==", + "requires": { + "process": "~0.11.0" + } + }, + "tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==" + } + } + }, "browserify-aes": { "version": "1.2.0", "requires": { @@ -67668,7 +68352,6 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, "requires": { "pako": "~1.0.5" } @@ -67728,8 +68411,7 @@ "builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", - "dev": true + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==" }, "busboy": { "version": "0.2.14", @@ -67971,6 +68653,11 @@ } } }, + "cached-path-relative": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.1.0.tgz", + "integrity": "sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==" + }, "cachedir": { "version": "2.3.0", "dev": true @@ -68523,6 +69210,29 @@ "version": "1.4.0", "dev": true }, + "combine-source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha512-UlxQ9Vw0b/Bt/KYwCFqdEwsQ1eL8d1gibiFb7lxQJFdvTgc2hIZi6ugsg+kyhzhPV+QEpUiEIwInIAIrgoEkrg==", + "requires": { + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" + }, + "dependencies": { + "convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha512-Y8L5rp6jo+g9VEPgvqNfEopjTR4OTYct8lXlS8iVQdmnjDvbdbzYe9rjtFCB9egC86JoNCU61WRY+ScjkZpnIg==" + }, + "lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha512-eDn9kqrAmVUC1wmZvlQ6Uhde44n+tXpqPrN8olQJbttgh0oKclk+SF54P47VEGE9CEiMeRwAP8BaM7UHvBkz2A==" + } + } + }, "combined-stream": { "version": "1.0.8", "requires": { @@ -68670,8 +69380,7 @@ "console-browserify": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" }, "console-control-strings": { "version": "1.1.0" @@ -68679,8 +69388,7 @@ "constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", - "dev": true + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==" }, "content-disposition": { "version": "0.5.4", @@ -69683,6 +70391,11 @@ "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" }, + "dash-ast": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", + "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==" + }, "dashdash": { "version": "1.14.1", "requires": { @@ -69982,6 +70695,17 @@ "deprecation": { "version": "2.3.1" }, + "deps-sort": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz", + "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==", + "requires": { + "JSONStream": "^1.0.3", + "shasum-object": "^1.0.0", + "subarg": "^1.0.0", + "through2": "^2.0.0" + } + }, "dequal": { "version": "2.0.2" }, @@ -70315,8 +71039,7 @@ "domain-browser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" }, "domelementtype": { "version": "2.2.0" @@ -70383,6 +71106,38 @@ "duplexer": { "version": "0.1.2" }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "requires": { + "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "duplexer3": { "version": "0.1.4" }, @@ -74008,6 +74763,11 @@ "gensync": { "version": "1.0.0-beta.2" }, + "get-assigned-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", + "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==" + }, "get-caller-file": { "version": "1.0.3", "dev": true @@ -74794,6 +75554,11 @@ } } }, + "htmlescape": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "integrity": "sha512-eVcrzgbR4tim7c7soKQKtxa/kQM4TzjnlU83rcZ9bHU6t31ehfV7SktN6McWgwPWg+JYMA/O3qpGxBvFq1z2Jg==" + }, "htmlparser2": { "version": "6.1.0", "requires": { @@ -75027,8 +75792,7 @@ "https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", - "dev": true + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==" }, "https-proxy-agent": { "version": "5.0.0", @@ -75205,6 +75969,14 @@ "ini": { "version": "2.0.0" }, + "inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha512-0mVWSSbNDvedDWIN4wxLsdPM4a7cIPcpyMxj3QZ406QRwQ6ePGB1YIHxVPjqpcUGbWQ5C+nHTwGNWAGvt7ggVA==", + "requires": { + "source-map": "~0.5.3" + } + }, "inline-style-parser": { "version": "0.1.1" }, @@ -75297,6 +76069,23 @@ } } }, + "insert-module-globals": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.1.tgz", + "integrity": "sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==", + "requires": { + "acorn-node": "^1.5.2", + "combine-source-map": "^0.8.0", + "concat-stream": "^1.6.1", + "is-buffer": "^1.1.0", + "JSONStream": "^1.0.3", + "path-is-absolute": "^1.0.1", + "process": "~0.11.0", + "through2": "^2.0.0", + "undeclared-identifiers": "^1.1.2", + "xtend": "^4.0.0" + } + }, "internal-ip": { "version": "4.3.0", "optional": true, @@ -77385,6 +78174,15 @@ "klona": { "version": "2.0.5" }, + "labeled-stream-splicer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", + "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", + "requires": { + "inherits": "^2.0.1", + "stream-splicer": "^2.0.0" + } + }, "language-subtag-registry": { "version": "0.3.21" }, @@ -80086,6 +80884,52 @@ } } }, + "module-deps": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.3.tgz", + "integrity": "sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==", + "requires": { + "browser-resolve": "^2.0.0", + "cached-path-relative": "^1.0.2", + "concat-stream": "~1.6.0", + "defined": "^1.0.0", + "detective": "^5.2.0", + "duplexer2": "^0.1.2", + "inherits": "^2.0.1", + "JSONStream": "^1.0.3", + "parents": "^1.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.4.0", + "stream-combiner2": "^1.1.1", + "subarg": "^1.0.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "moment": { "version": "2.29.1" }, @@ -81292,8 +82136,7 @@ "os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", - "dev": true + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==" }, "os-homedir": { "version": "1.0.2", @@ -81590,8 +82433,7 @@ "pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" }, "parallel-transform": { "version": "1.2.0", @@ -81652,6 +82494,14 @@ "version": "1.0.0", "dev": true }, + "parents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", + "integrity": "sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg==", + "requires": { + "path-platform": "~0.11.15" + } + }, "parse-asn1": { "version": "5.1.6", "requires": { @@ -81915,6 +82765,11 @@ "path-parse": { "version": "1.0.7" }, + "path-platform": { + "version": "0.11.15", + "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", + "integrity": "sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==" + }, "path-to-regexp": { "version": "0.1.7" }, @@ -82988,8 +83843,7 @@ "querystring-es3": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", - "dev": true + "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==" }, "querystringify": { "version": "2.2.0", @@ -84467,6 +85321,38 @@ "pify": "^2.3.0" } }, + "read-only-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", + "integrity": "sha512-3ALe0bjBVZtkdWKIcThYpQCLbBMd/+Tbh2CDSrAIDO3UsZ4Xs+tnyjv2MjCOMMgBG+AsUOeuP1cgtY1INISc8w==", + "requires": { + "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "read-pkg": { "version": "3.0.0", "dev": true, @@ -86212,6 +87098,14 @@ } } }, + "shasum-object": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz", + "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==", + "requires": { + "fast-safe-stringify": "^2.0.7" + } + }, "shebang-command": { "version": "2.0.0", "requires": { @@ -86961,6 +87855,39 @@ "duplexer": "~0.1.1" } }, + "stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", + "requires": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "stream-each": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", @@ -87019,6 +87946,39 @@ "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", "dev": true }, + "stream-splicer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", + "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "streamsearch": { "version": "0.1.2" }, @@ -87477,6 +88437,14 @@ "postcss-selector-parser": "^6.0.4" } }, + "subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==", + "requires": { + "minimist": "^1.1.0" + } + }, "subscriptions-transport-ws": { "version": "0.9.19", "requires": { @@ -87655,6 +88623,14 @@ "version": "2.0.15", "dev": true }, + "syntax-error": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", + "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", + "requires": { + "acorn-node": "^1.2.0" + } + }, "table": { "version": "6.7.5", "requires": { @@ -87960,7 +88936,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, "requires": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" @@ -87970,7 +88945,6 @@ "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -87985,7 +88959,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -88384,6 +89357,11 @@ "uid2": { "version": "0.0.3" }, + "umd": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", + "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==" + }, "unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -88422,6 +89400,18 @@ "invariant": "^2.2.4" } }, + "undeclared-identifiers": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", + "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", + "requires": { + "acorn-node": "^1.3.0", + "dash-ast": "^1.0.0", + "get-assigned-identifiers": "^1.2.0", + "simple-concat": "^1.0.0", + "xtend": "^4.0.1" + } + }, "undefsafe": { "version": "2.0.5", "dev": true @@ -88823,19 +89813,16 @@ }, "url": { "version": "0.11.0", - "devOptional": true, "requires": { "punycode": "1.3.2", "querystring": "0.2.0" }, "dependencies": { "punycode": { - "version": "1.3.2", - "devOptional": true + "version": "1.3.2" }, "querystring": { - "version": "0.2.0", - "devOptional": true + "version": "0.2.0" } } }, @@ -89023,8 +90010,7 @@ "vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" }, "void-elements": { "version": "3.1.0" From b3b5beb543bba152a532671890f9ff81a7b910e7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 11 Sep 2022 18:34:08 +0000 Subject: [PATCH 057/129] chore(deps): update dependency concurrently to v7.4.0 --- web/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/package.json b/web/package.json index 5a1f7a797f40c6..1d8fd1ff1e58ca 100644 --- a/web/package.json +++ b/web/package.json @@ -32,6 +32,6 @@ "react-dom": "18.2.0" }, "devDependencies": { - "concurrently": "7.3.0" + "concurrently": "7.4.0" } } From c37260e4791153b15d46a6f0c2675f0c85c8ff01 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 11 Sep 2022 22:04:08 +0000 Subject: [PATCH 058/129] fix(deps): update dependency next to v12.3.0 --- web/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/package.json b/web/package.json index 1d8fd1ff1e58ca..cca04e562e52ef 100644 --- a/web/package.json +++ b/web/package.json @@ -27,7 +27,7 @@ }, "dependencies": { "@monaco-editor/react": "4.4.5", - "next": "12.2.5", + "next": "12.3.0", "react": "18.2.0", "react-dom": "18.2.0" }, From 0c3be348fdda8278e5866bae5367003c8ccb0d6b Mon Sep 17 00:00:00 2001 From: Jeremy L Thompson Date: Sun, 11 Sep 2022 20:36:25 -0600 Subject: [PATCH 059/129] fix(curriculum): Split Cat App Step 12 into two parts (#47320) --- .../meta.json | 116 +++++++++--------- .../5dfa22d1b521be39a3de7be0.md | 12 +- .../5dfa2407b521be39a3de7be1.md | 4 +- .../5dfa30b9eacea3f48c6300ad.md | 4 +- .../5dfa3589eacea3f48c6300ae.md | 4 +- .../5dfa371beacea3f48c6300af.md | 4 +- .../5dfa37b9eacea3f48c6300b0.md | 4 +- .../5dfb5ecbeacea3f48c6300b1.md | 4 +- .../5dfb6250eacea3f48c6300b2.md | 4 +- .../5dfb655eeacea3f48c6300b3.md | 4 +- .../5dfb6a35eacea3f48c6300b4.md | 4 +- .../5ef9b03c81a63668521804d0.md | 4 +- .../5ef9b03c81a63668521804d1.md | 4 +- .../5ef9b03c81a63668521804d2.md | 4 +- .../5ef9b03c81a63668521804d3.md | 4 +- .../5ef9b03c81a63668521804d4.md | 4 +- .../5ef9b03c81a63668521804d5.md | 4 +- .../5ef9b03c81a63668521804d6.md | 4 +- .../5ef9b03c81a63668521804d7.md | 4 +- .../5ef9b03c81a63668521804d8.md | 4 +- .../5ef9b03c81a63668521804d9.md | 4 +- .../5ef9b03c81a63668521804da.md | 4 +- .../5ef9b03c81a63668521804db.md | 4 +- .../5ef9b03c81a63668521804dc.md | 4 +- .../5ef9b03c81a63668521804dd.md | 4 +- .../5ef9b03c81a63668521804de.md | 4 +- .../5ef9b03c81a63668521804df.md | 4 +- .../5ef9b03c81a63668521804e1.md | 4 +- .../5ef9b03c81a63668521804e2.md | 4 +- .../5ef9b03c81a63668521804e3.md | 4 +- .../5ef9b03c81a63668521804e5.md | 4 +- .../5ef9b03c81a63668521804e7.md | 4 +- .../5ef9b03c81a63668521804e8.md | 4 +- .../5ef9b03c81a63668521804e9.md | 4 +- .../5ef9b03c81a63668521804ea.md | 4 +- .../5ef9b03c81a63668521804eb.md | 4 +- .../5ef9b03c81a63668521804ec.md | 4 +- .../5ef9b03c81a63668521804ee.md | 4 +- .../5efada803cbd2bbdab94e332.md | 4 +- .../5efae0543cbd2bbdab94e333.md | 4 +- .../5efae16e3cbd2bbdab94e334.md | 4 +- .../5efb23e70dc218d6c85f89b1.md | 4 +- .../5efb2c990dc218d6c85f89b2.md | 4 +- .../5efc4f528d6a74d05e68af74.md | 4 +- .../5efc518e8d6a74d05e68af75.md | 4 +- .../5efc54138d6a74d05e68af76.md | 4 +- .../5efc575c8d6a74d05e68af77.md | 4 +- .../5f05a1d8e233dff4a68508d8.md | 4 +- .../5f07be6ef7412fbad0c5626b.md | 4 +- .../5f07c98cdb9413cbd4b16750.md | 4 +- .../5f07fb1579dc934717801375.md | 4 +- .../5f0d48e7b435f13ab6550051.md | 4 +- .../5f0d4ab1b435f13ab6550052.md | 4 +- .../5f0d4d04b435f13ab6550053.md | 4 +- .../5f1a80975fc4bcae0edb3497.md | 4 +- .../5f1a89f1190aff21ae42105a.md | 4 +- .../62bb4009e3458a128ff57d5d.md | 4 +- .../62dabe2ef403a12d5d295273.md | 84 +++++++++++++ .../7cf9b03d81a65668421804c3.md | 4 +- 59 files changed, 260 insertions(+), 176 deletions(-) create mode 100644 curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/62dabe2ef403a12d5d295273.md diff --git a/curriculum/challenges/_meta/learn-html-by-building-a-cat-photo-app/meta.json b/curriculum/challenges/_meta/learn-html-by-building-a-cat-photo-app/meta.json index eb9d2fa62ea12f..508ba7bd29d5b4 100644 --- a/curriculum/challenges/_meta/learn-html-by-building-a-cat-photo-app/meta.json +++ b/curriculum/challenges/_meta/learn-html-by-building-a-cat-photo-app/meta.json @@ -59,228 +59,232 @@ "Step 12" ], [ - "5dfa2407b521be39a3de7be1", + "62dabe2ef403a12d5d295273", "Step 13" ], [ - "5dfa30b9eacea3f48c6300ad", + "5dfa2407b521be39a3de7be1", "Step 14" ], [ - "5f07be6ef7412fbad0c5626b", + "5dfa30b9eacea3f48c6300ad", "Step 15" ], [ - "5f07c98cdb9413cbd4b16750", + "5f07be6ef7412fbad0c5626b", "Step 16" ], [ - "5dfa3589eacea3f48c6300ae", + "5f07c98cdb9413cbd4b16750", "Step 17" ], [ - "5dfa371beacea3f48c6300af", + "5dfa3589eacea3f48c6300ae", "Step 18" ], [ - "5dfa37b9eacea3f48c6300b0", + "5dfa371beacea3f48c6300af", "Step 19" ], [ - "5dfb5ecbeacea3f48c6300b1", + "5dfa37b9eacea3f48c6300b0", "Step 20" ], [ - "5dfb6250eacea3f48c6300b2", + "5dfb5ecbeacea3f48c6300b1", "Step 21" ], [ - "5dfb655eeacea3f48c6300b3", + "5dfb6250eacea3f48c6300b2", "Step 22" ], [ - "5dfb6a35eacea3f48c6300b4", + "5dfb655eeacea3f48c6300b3", "Step 23" ], [ - "5ef9b03c81a63668521804d0", + "5dfb6a35eacea3f48c6300b4", "Step 24" ], [ - "5ef9b03c81a63668521804d1", + "5ef9b03c81a63668521804d0", "Step 25" ], [ - "5ef9b03c81a63668521804d2", + "5ef9b03c81a63668521804d1", "Step 26" ], [ - "5ef9b03c81a63668521804d3", + "5ef9b03c81a63668521804d2", "Step 27" ], [ - "5efada803cbd2bbdab94e332", + "5ef9b03c81a63668521804d3", "Step 28" ], [ - "5efae0543cbd2bbdab94e333", + "5efada803cbd2bbdab94e332", "Step 29" ], [ - "5efae16e3cbd2bbdab94e334", + "5efae0543cbd2bbdab94e333", "Step 30" ], [ - "5ef9b03c81a63668521804d4", + "5efae16e3cbd2bbdab94e334", "Step 31" ], [ - "5f07fb1579dc934717801375", + "5ef9b03c81a63668521804d4", "Step 32" ], [ - "5ef9b03c81a63668521804d5", + "5f07fb1579dc934717801375", "Step 33" ], [ - "5ef9b03c81a63668521804d6", + "5ef9b03c81a63668521804d5", "Step 34" ], [ - "5ef9b03c81a63668521804d7", + "5ef9b03c81a63668521804d6", "Step 35" ], [ - "5ef9b03c81a63668521804d8", + "5ef9b03c81a63668521804d7", "Step 36" ], [ - "5efb23e70dc218d6c85f89b1", + "5ef9b03c81a63668521804d8", "Step 37" ], [ - "7cf9b03d81a65668421804c3", + "5efb23e70dc218d6c85f89b1", "Step 38" ], [ - "5ef9b03c81a63668521804d9", + "7cf9b03d81a65668421804c3", "Step 39" ], [ - "5ef9b03c81a63668521804db", + "5ef9b03c81a63668521804d9", "Step 40" ], [ - "5ef9b03c81a63668521804da", + "5ef9b03c81a63668521804db", "Step 41" ], [ - "5efb2c990dc218d6c85f89b2", + "5ef9b03c81a63668521804da", "Step 42" ], [ - "5ef9b03c81a63668521804dc", + "5efb2c990dc218d6c85f89b2", "Step 43" ], [ - "5ef9b03c81a63668521804dd", + "5ef9b03c81a63668521804dc", "Step 44" ], [ - "5ef9b03c81a63668521804df", + "5ef9b03c81a63668521804dd", "Step 45" ], [ - "5f05a1d8e233dff4a68508d8", + "5ef9b03c81a63668521804df", "Step 46" ], [ - "5ef9b03c81a63668521804de", + "5f05a1d8e233dff4a68508d8", "Step 47" ], [ - "5f1a80975fc4bcae0edb3497", + "5ef9b03c81a63668521804de", "Step 48" ], [ - "5ef9b03c81a63668521804e1", + "5f1a80975fc4bcae0edb3497", "Step 49" ], [ - "5f0d48e7b435f13ab6550051", + "5ef9b03c81a63668521804e1", "Step 50" ], [ - "5f0d4ab1b435f13ab6550052", + "5f0d48e7b435f13ab6550051", "Step 51" ], [ - "5f0d4d04b435f13ab6550053", + "5f0d4ab1b435f13ab6550052", "Step 52" ], [ - "5ef9b03c81a63668521804e2", + "5f0d4d04b435f13ab6550053", "Step 53" ], [ - "5efc54138d6a74d05e68af76", + "5ef9b03c81a63668521804e2", "Step 54" ], [ - "5efc4f528d6a74d05e68af74", + "5efc54138d6a74d05e68af76", "Step 55" ], [ - "5efc518e8d6a74d05e68af75", + "5efc4f528d6a74d05e68af74", "Step 56" ], [ - "5ef9b03c81a63668521804e3", + "5efc518e8d6a74d05e68af75", "Step 57" ], [ - "5efc575c8d6a74d05e68af77", + "5ef9b03c81a63668521804e3", "Step 58" ], [ - "5f1a89f1190aff21ae42105a", + "5efc575c8d6a74d05e68af77", "Step 59" ], [ - "5ef9b03c81a63668521804e5", + "5f1a89f1190aff21ae42105a", "Step 60" ], [ - "5ef9b03c81a63668521804e7", + "5ef9b03c81a63668521804e5", "Step 61" ], [ - "5ef9b03c81a63668521804e8", + "5ef9b03c81a63668521804e7", "Step 62" ], [ - "5ef9b03c81a63668521804e9", + "5ef9b03c81a63668521804e8", "Step 63" ], [ - "5ef9b03c81a63668521804ea", + "5ef9b03c81a63668521804e9", "Step 64" ], [ - "5ef9b03c81a63668521804eb", + "5ef9b03c81a63668521804ea", "Step 65" ], [ - "5ef9b03c81a63668521804ec", + "5ef9b03c81a63668521804eb", "Step 66" ], [ - "5ef9b03c81a63668521804ee", + "5ef9b03c81a63668521804ec", "Step 67" ], [ - "62bb4009e3458a128ff57d5d", + "5ef9b03c81a63668521804ee", "Step 68" + ], + [ + "62bb4009e3458a128ff57d5d", + "Step 69" ] ] } diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa22d1b521be39a3de7be0.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa22d1b521be39a3de7be0.md index 695463b2e43edb..d8e09c091bc1ae 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa22d1b521be39a3de7be0.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa22d1b521be39a3de7be0.md @@ -7,17 +7,13 @@ dashedName: step-12 # --description-- -You can see the words `cat photos` underlined next to the image in the preview now. That's your link; feel free to give it a click. In the text of your `p` element, turn the words `cat photos` into a link to `https://freecatphotoapp.com`. When you are done, remove the old anchor tag and text below the paragraph. +You can see the words `cat photos` underlined next to the image in the preview now. That's your link; feel free to give it a click. -# --hints-- - -Your code should only contain one anchor (`a`) element. Remove any extra anchor elements. +In the text of your `p` element, turn the words `cat photos` into a link to `https://freecatphotoapp.com` by nesting these words inside of a new anchor element. -```js -assert(document.querySelectorAll('a').length === 1); -``` +# --hints-- -Your anchor (`a`) element should be nested within the `p` element. +You should nest a new anchor (`a`) element within the `p` element. ```js assert($('p > a').length); diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa2407b521be39a3de7be1.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa2407b521be39a3de7be1.md index 790143c56d59f6..3764857275910a 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa2407b521be39a3de7be1.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa2407b521be39a3de7be1.md @@ -1,8 +1,8 @@ --- id: 5dfa2407b521be39a3de7be1 -title: Step 13 +title: Step 14 challengeType: 0 -dashedName: step-13 +dashedName: step-14 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa30b9eacea3f48c6300ad.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa30b9eacea3f48c6300ad.md index 82836e6ce431b4..ff7e61a245cae6 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa30b9eacea3f48c6300ad.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa30b9eacea3f48c6300ad.md @@ -1,8 +1,8 @@ --- id: 5dfa30b9eacea3f48c6300ad -title: Step 14 +title: Step 15 challengeType: 0 -dashedName: step-14 +dashedName: step-15 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa3589eacea3f48c6300ae.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa3589eacea3f48c6300ae.md index 523a531a919af0..ab4c4fa31038aa 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa3589eacea3f48c6300ae.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa3589eacea3f48c6300ae.md @@ -1,8 +1,8 @@ --- id: 5dfa3589eacea3f48c6300ae -title: Step 17 +title: Step 18 challengeType: 0 -dashedName: step-17 +dashedName: step-18 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa371beacea3f48c6300af.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa371beacea3f48c6300af.md index 62f06dd56fa63e..4b4342dd6c418b 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa371beacea3f48c6300af.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa371beacea3f48c6300af.md @@ -1,8 +1,8 @@ --- id: 5dfa371beacea3f48c6300af -title: Step 18 +title: Step 19 challengeType: 0 -dashedName: step-18 +dashedName: step-19 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa37b9eacea3f48c6300b0.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa37b9eacea3f48c6300b0.md index 67b3b9d484cabe..711ae2b68dac7f 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa37b9eacea3f48c6300b0.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfa37b9eacea3f48c6300b0.md @@ -1,8 +1,8 @@ --- id: 5dfa37b9eacea3f48c6300b0 -title: Step 19 +title: Step 20 challengeType: 0 -dashedName: step-19 +dashedName: step-20 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfb5ecbeacea3f48c6300b1.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfb5ecbeacea3f48c6300b1.md index c57944bca3b398..9b484623c8e995 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfb5ecbeacea3f48c6300b1.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfb5ecbeacea3f48c6300b1.md @@ -1,8 +1,8 @@ --- id: 5dfb5ecbeacea3f48c6300b1 -title: Step 20 +title: Step 21 challengeType: 0 -dashedName: step-20 +dashedName: step-21 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfb6250eacea3f48c6300b2.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfb6250eacea3f48c6300b2.md index 92769108ae4d8e..7e589da96199c8 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfb6250eacea3f48c6300b2.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfb6250eacea3f48c6300b2.md @@ -1,8 +1,8 @@ --- id: 5dfb6250eacea3f48c6300b2 -title: Step 21 +title: Step 22 challengeType: 0 -dashedName: step-21 +dashedName: step-22 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfb655eeacea3f48c6300b3.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfb655eeacea3f48c6300b3.md index 788633df18e99a..d68eb162431d9f 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfb655eeacea3f48c6300b3.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfb655eeacea3f48c6300b3.md @@ -1,8 +1,8 @@ --- id: 5dfb655eeacea3f48c6300b3 -title: Step 22 +title: Step 23 challengeType: 0 -dashedName: step-22 +dashedName: step-23 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfb6a35eacea3f48c6300b4.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfb6a35eacea3f48c6300b4.md index 124984fe18bcb5..be65ed4768d32c 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfb6a35eacea3f48c6300b4.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dfb6a35eacea3f48c6300b4.md @@ -1,8 +1,8 @@ --- id: 5dfb6a35eacea3f48c6300b4 -title: Step 23 +title: Step 24 challengeType: 0 -dashedName: step-23 +dashedName: step-24 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d0.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d0.md index 356e4a05bea8ef..04482564d768aa 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d0.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d0.md @@ -1,8 +1,8 @@ --- id: 5ef9b03c81a63668521804d0 -title: Step 24 +title: Step 25 challengeType: 0 -dashedName: step-24 +dashedName: step-25 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d1.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d1.md index 6f24831c87e700..c137f9332074a3 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d1.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d1.md @@ -1,8 +1,8 @@ --- id: 5ef9b03c81a63668521804d1 -title: Step 25 +title: Step 26 challengeType: 0 -dashedName: step-25 +dashedName: step-26 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d2.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d2.md index 7f24f79087e6c6..eb1aad2684aa21 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d2.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d2.md @@ -1,8 +1,8 @@ --- id: 5ef9b03c81a63668521804d2 -title: Step 26 +title: Step 27 challengeType: 0 -dashedName: step-26 +dashedName: step-27 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d3.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d3.md index eec907e982bacc..904b244415a143 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d3.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d3.md @@ -1,8 +1,8 @@ --- id: 5ef9b03c81a63668521804d3 -title: Step 27 +title: Step 28 challengeType: 0 -dashedName: step-27 +dashedName: step-28 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d4.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d4.md index 802e8d08f8445a..a51561e7e7bcf0 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d4.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d4.md @@ -1,8 +1,8 @@ --- id: 5ef9b03c81a63668521804d4 -title: Step 31 +title: Step 32 challengeType: 0 -dashedName: step-31 +dashedName: step-32 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d5.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d5.md index c2ff943883d609..f2be9553a65ec0 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d5.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d5.md @@ -1,8 +1,8 @@ --- id: 5ef9b03c81a63668521804d5 -title: Step 33 +title: Step 34 challengeType: 0 -dashedName: step-33 +dashedName: step-34 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d6.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d6.md index 09a6507b83acbc..c0374bbf0139a8 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d6.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d6.md @@ -1,8 +1,8 @@ --- id: 5ef9b03c81a63668521804d6 -title: Step 34 +title: Step 35 challengeType: 0 -dashedName: step-34 +dashedName: step-35 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d7.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d7.md index 3407548e86772d..441f899bc1961c 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d7.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d7.md @@ -1,8 +1,8 @@ --- id: 5ef9b03c81a63668521804d7 -title: Step 35 +title: Step 36 challengeType: 0 -dashedName: step-35 +dashedName: step-36 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d8.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d8.md index 5e5a2079366ef5..1065ebee1e7c2b 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d8.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d8.md @@ -1,8 +1,8 @@ --- id: 5ef9b03c81a63668521804d8 -title: Step 36 +title: Step 37 challengeType: 0 -dashedName: step-36 +dashedName: step-37 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d9.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d9.md index 19af12e5118c1b..2d92177a4ff6ce 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d9.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804d9.md @@ -1,8 +1,8 @@ --- id: 5ef9b03c81a63668521804d9 -title: Step 39 +title: Step 40 challengeType: 0 -dashedName: step-39 +dashedName: step-40 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804da.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804da.md index 7992ca4515433f..14529f19faaa59 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804da.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804da.md @@ -1,8 +1,8 @@ --- id: 5ef9b03c81a63668521804da -title: Step 41 +title: Step 42 challengeType: 0 -dashedName: step-41 +dashedName: step-42 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804db.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804db.md index 39cff003e0de56..a31cebfc365fca 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804db.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804db.md @@ -1,8 +1,8 @@ --- id: 5ef9b03c81a63668521804db -title: Step 40 +title: Step 41 challengeType: 0 -dashedName: step-40 +dashedName: step-41 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804dc.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804dc.md index 425f6137bf6a18..bc9ec88249a419 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804dc.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804dc.md @@ -1,8 +1,8 @@ --- id: 5ef9b03c81a63668521804dc -title: Step 43 +title: Step 44 challengeType: 0 -dashedName: step-43 +dashedName: step-44 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804dd.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804dd.md index 7f6d112008593a..236358b2a67924 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804dd.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804dd.md @@ -1,8 +1,8 @@ --- id: 5ef9b03c81a63668521804dd -title: Step 44 +title: Step 45 challengeType: 0 -dashedName: step-44 +dashedName: step-45 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804de.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804de.md index fab7ed8d219c80..a4d5a991dac073 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804de.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804de.md @@ -1,8 +1,8 @@ --- id: 5ef9b03c81a63668521804de -title: Step 47 +title: Step 48 challengeType: 0 -dashedName: step-47 +dashedName: step-48 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804df.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804df.md index 3ceb752707b157..7d2c2f24846052 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804df.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804df.md @@ -1,8 +1,8 @@ --- id: 5ef9b03c81a63668521804df -title: Step 45 +title: Step 46 challengeType: 0 -dashedName: step-45 +dashedName: step-46 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e1.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e1.md index 4a7f2b7dc43b29..eb2ccaba81dcb8 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e1.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e1.md @@ -1,8 +1,8 @@ --- id: 5ef9b03c81a63668521804e1 -title: Step 49 +title: Step 50 challengeType: 0 -dashedName: step-49 +dashedName: step-50 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e2.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e2.md index dfe804ce0289f0..79083546f0b114 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e2.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e2.md @@ -1,8 +1,8 @@ --- id: 5ef9b03c81a63668521804e2 -title: Step 53 +title: Step 54 challengeType: 0 -dashedName: step-53 +dashedName: step-54 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e3.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e3.md index 32afe5dd1a2c37..5acc0f732c4a4c 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e3.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e3.md @@ -1,8 +1,8 @@ --- id: 5ef9b03c81a63668521804e3 -title: Step 57 +title: Step 58 challengeType: 0 -dashedName: step-57 +dashedName: step-58 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e5.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e5.md index 6ecff52e877f41..afb1b6591b64ea 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e5.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e5.md @@ -1,8 +1,8 @@ --- id: 5ef9b03c81a63668521804e5 -title: Step 60 +title: Step 61 challengeType: 0 -dashedName: step-60 +dashedName: step-61 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e7.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e7.md index 9ef05985470894..83f2b1d46cdb84 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e7.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e7.md @@ -1,8 +1,8 @@ --- id: 5ef9b03c81a63668521804e7 -title: Step 61 +title: Step 62 challengeType: 0 -dashedName: step-61 +dashedName: step-62 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e8.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e8.md index d764e0affe0fb0..98699662324d11 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e8.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e8.md @@ -1,8 +1,8 @@ --- id: 5ef9b03c81a63668521804e8 -title: Step 62 +title: Step 63 challengeType: 0 -dashedName: step-62 +dashedName: step-63 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e9.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e9.md index a4d099ed5b9b89..7d787a04ff1bda 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e9.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804e9.md @@ -1,8 +1,8 @@ --- id: 5ef9b03c81a63668521804e9 -title: Step 63 +title: Step 64 challengeType: 0 -dashedName: step-63 +dashedName: step-64 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804ea.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804ea.md index 301f781b01305e..1f4c8848cca95b 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804ea.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804ea.md @@ -1,8 +1,8 @@ --- id: 5ef9b03c81a63668521804ea -title: Step 64 +title: Step 65 challengeType: 0 -dashedName: step-64 +dashedName: step-65 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804eb.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804eb.md index 8fd100ef65d6a8..82fce08b831eec 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804eb.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804eb.md @@ -1,8 +1,8 @@ --- id: 5ef9b03c81a63668521804eb -title: Step 65 +title: Step 66 challengeType: 0 -dashedName: step-65 +dashedName: step-66 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804ec.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804ec.md index 44dd823fc9d53b..3aebab798ca519 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804ec.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804ec.md @@ -1,8 +1,8 @@ --- id: 5ef9b03c81a63668521804ec -title: Step 66 +title: Step 67 challengeType: 0 -dashedName: step-66 +dashedName: step-67 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804ee.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804ee.md index 79f7c2cabf499b..d84baddf6fed06 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804ee.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5ef9b03c81a63668521804ee.md @@ -1,8 +1,8 @@ --- id: 5ef9b03c81a63668521804ee -title: Step 67 +title: Step 68 challengeType: 0 -dashedName: step-67 +dashedName: step-68 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efada803cbd2bbdab94e332.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efada803cbd2bbdab94e332.md index d56cf7ddc25c5a..d1e26fc9389c85 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efada803cbd2bbdab94e332.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efada803cbd2bbdab94e332.md @@ -1,8 +1,8 @@ --- id: 5efada803cbd2bbdab94e332 -title: Step 28 +title: Step 29 challengeType: 0 -dashedName: step-28 +dashedName: step-29 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efae0543cbd2bbdab94e333.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efae0543cbd2bbdab94e333.md index 5e89d59a9e92d9..8ed32563dec345 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efae0543cbd2bbdab94e333.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efae0543cbd2bbdab94e333.md @@ -1,8 +1,8 @@ --- id: 5efae0543cbd2bbdab94e333 -title: Step 29 +title: Step 30 challengeType: 0 -dashedName: step-29 +dashedName: step-30 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efae16e3cbd2bbdab94e334.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efae16e3cbd2bbdab94e334.md index adc349c99bb091..29adade6b85bda 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efae16e3cbd2bbdab94e334.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efae16e3cbd2bbdab94e334.md @@ -1,8 +1,8 @@ --- id: 5efae16e3cbd2bbdab94e334 -title: Step 30 +title: Step 31 challengeType: 0 -dashedName: step-30 +dashedName: step-31 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efb23e70dc218d6c85f89b1.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efb23e70dc218d6c85f89b1.md index 12b2ae60dc0eb9..090aa7c21b51a7 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efb23e70dc218d6c85f89b1.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efb23e70dc218d6c85f89b1.md @@ -1,8 +1,8 @@ --- id: 5efb23e70dc218d6c85f89b1 -title: Step 37 +title: Step 38 challengeType: 0 -dashedName: step-37 +dashedName: step-38 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efb2c990dc218d6c85f89b2.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efb2c990dc218d6c85f89b2.md index f8c951a6dbccbb..26fdb25ba95349 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efb2c990dc218d6c85f89b2.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efb2c990dc218d6c85f89b2.md @@ -1,8 +1,8 @@ --- id: 5efb2c990dc218d6c85f89b2 -title: Step 42 +title: Step 43 challengeType: 0 -dashedName: step-42 +dashedName: step-43 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efc4f528d6a74d05e68af74.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efc4f528d6a74d05e68af74.md index cc6828c3bc6036..8bef1417888f46 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efc4f528d6a74d05e68af74.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efc4f528d6a74d05e68af74.md @@ -1,8 +1,8 @@ --- id: 5efc4f528d6a74d05e68af74 -title: Step 55 +title: Step 56 challengeType: 0 -dashedName: step-55 +dashedName: step-56 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efc518e8d6a74d05e68af75.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efc518e8d6a74d05e68af75.md index 2b47442e63d472..0a3ee46e95d371 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efc518e8d6a74d05e68af75.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efc518e8d6a74d05e68af75.md @@ -1,8 +1,8 @@ --- id: 5efc518e8d6a74d05e68af75 -title: Step 56 +title: Step 57 challengeType: 0 -dashedName: step-56 +dashedName: step-57 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efc54138d6a74d05e68af76.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efc54138d6a74d05e68af76.md index 833427a5fc7d48..b1cb8f4638a66f 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efc54138d6a74d05e68af76.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efc54138d6a74d05e68af76.md @@ -1,8 +1,8 @@ --- id: 5efc54138d6a74d05e68af76 -title: Step 54 +title: Step 55 challengeType: 0 -dashedName: step-54 +dashedName: step-55 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efc575c8d6a74d05e68af77.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efc575c8d6a74d05e68af77.md index 6ba79e3dd8d997..93261a3ae8c26c 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efc575c8d6a74d05e68af77.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5efc575c8d6a74d05e68af77.md @@ -1,8 +1,8 @@ --- id: 5efc575c8d6a74d05e68af77 -title: Step 58 +title: Step 59 challengeType: 0 -dashedName: step-58 +dashedName: step-59 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f05a1d8e233dff4a68508d8.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f05a1d8e233dff4a68508d8.md index 5d4541c0f10fdc..02b68a7436454f 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f05a1d8e233dff4a68508d8.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f05a1d8e233dff4a68508d8.md @@ -1,8 +1,8 @@ --- id: 5f05a1d8e233dff4a68508d8 -title: Step 46 +title: Step 47 challengeType: 0 -dashedName: step-46 +dashedName: step-47 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f07be6ef7412fbad0c5626b.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f07be6ef7412fbad0c5626b.md index adf4f4c79f661c..f5fe2291a99643 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f07be6ef7412fbad0c5626b.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f07be6ef7412fbad0c5626b.md @@ -1,8 +1,8 @@ --- id: 5f07be6ef7412fbad0c5626b -title: Step 15 +title: Step 16 challengeType: 0 -dashedName: step-15 +dashedName: step-16 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f07c98cdb9413cbd4b16750.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f07c98cdb9413cbd4b16750.md index 6be452b82c7fb8..22f110f335f180 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f07c98cdb9413cbd4b16750.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f07c98cdb9413cbd4b16750.md @@ -1,8 +1,8 @@ --- id: 5f07c98cdb9413cbd4b16750 -title: Step 16 +title: Step 17 challengeType: 0 -dashedName: step-16 +dashedName: step-17 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f07fb1579dc934717801375.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f07fb1579dc934717801375.md index 7f620d6f74e58e..a89d064c7ae9c4 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f07fb1579dc934717801375.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f07fb1579dc934717801375.md @@ -1,8 +1,8 @@ --- id: 5f07fb1579dc934717801375 -title: Step 32 +title: Step 33 challengeType: 0 -dashedName: step-32 +dashedName: step-33 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f0d48e7b435f13ab6550051.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f0d48e7b435f13ab6550051.md index aa4669e5e051ea..6d8d400ded574b 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f0d48e7b435f13ab6550051.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f0d48e7b435f13ab6550051.md @@ -1,8 +1,8 @@ --- id: 5f0d48e7b435f13ab6550051 -title: Step 50 +title: Step 51 challengeType: 0 -dashedName: step-50 +dashedName: step-51 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f0d4ab1b435f13ab6550052.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f0d4ab1b435f13ab6550052.md index c45d7b8081c468..dc2708bc0b1c1e 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f0d4ab1b435f13ab6550052.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f0d4ab1b435f13ab6550052.md @@ -1,8 +1,8 @@ --- id: 5f0d4ab1b435f13ab6550052 -title: Step 51 +title: Step 52 challengeType: 0 -dashedName: step-51 +dashedName: step-52 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f0d4d04b435f13ab6550053.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f0d4d04b435f13ab6550053.md index 6e9654dd6335dc..5cdd00de5726e5 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f0d4d04b435f13ab6550053.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f0d4d04b435f13ab6550053.md @@ -1,8 +1,8 @@ --- id: 5f0d4d04b435f13ab6550053 -title: Step 52 +title: Step 53 challengeType: 0 -dashedName: step-52 +dashedName: step-53 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f1a80975fc4bcae0edb3497.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f1a80975fc4bcae0edb3497.md index fa7b9beb9bff74..8b69ede0fd904d 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f1a80975fc4bcae0edb3497.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f1a80975fc4bcae0edb3497.md @@ -1,8 +1,8 @@ --- id: 5f1a80975fc4bcae0edb3497 -title: Step 48 +title: Step 49 challengeType: 0 -dashedName: step-48 +dashedName: step-49 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f1a89f1190aff21ae42105a.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f1a89f1190aff21ae42105a.md index 38ffcd2935691c..31dfaf842e987f 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f1a89f1190aff21ae42105a.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5f1a89f1190aff21ae42105a.md @@ -1,8 +1,8 @@ --- id: 5f1a89f1190aff21ae42105a -title: Step 59 +title: Step 60 challengeType: 0 -dashedName: step-59 +dashedName: step-60 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/62bb4009e3458a128ff57d5d.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/62bb4009e3458a128ff57d5d.md index 0ad41be8d0d48e..c94850083571e6 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/62bb4009e3458a128ff57d5d.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/62bb4009e3458a128ff57d5d.md @@ -1,8 +1,8 @@ --- id: 62bb4009e3458a128ff57d5d -title: Step 68 +title: Step 69 challengeType: 0 -dashedName: step-68 +dashedName: step-69 --- # --description-- diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/62dabe2ef403a12d5d295273.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/62dabe2ef403a12d5d295273.md new file mode 100644 index 00000000000000..129f85ca270969 --- /dev/null +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/62dabe2ef403a12d5d295273.md @@ -0,0 +1,84 @@ +--- +id: 62dabe2ef403a12d5d295273 +title: Step 13 +challengeType: 0 +dashedName: step-13 +--- + +# --description-- + +Now that you turned the text `cat photos` inside the `p` element into a link, you don't need the second link below the `p` element. Delete the entire anchor element below the `p` element. + +# --hints-- + +Your code should only have one anchor (`a`) element. + +```js +assert(document.querySelectorAll('a').length === 1); +``` + +The `p` element should still have the anchor (`a`) element inside of it. + +```js +assert($('p > a').length); +``` + +The link's `href` value should be `https://freecatphotoapp.com`. You have either omitted the `href` value or have a typo. + +```js +const nestedAnchor = $('p > a')[0]; +assert( + nestedAnchor.getAttribute('href') === 'https://freecatphotoapp.com' +); +``` + +The link's text should be `cat photos`. You have either omitted the text or have a typo. + +```js +const nestedAnchor = $('p > a')[0]; +assert( + nestedAnchor.innerText.toLowerCase().replace(/\s+/g, ' ') === 'cat photos' +); +``` + +The `p` element content visible in the browser should be `Click here to view more cat photos.` Double check the text, spacing, or punctuation of both the `p` and nested anchor element. + +```js +const pText = document + .querySelector('p') + .innerText.toLowerCase() + .replace(/\s+/g, ' '); +assert(pText.match(/click here to view more cat photos\.?$/)); +``` + +There should not be `cat photos` text below the `p` element. + +```js +const pNextSibling = document.querySelector('p').nextSibling; +assert( + pNextSibling.nodeName === '#text' && !/cat\s*photos/.test(pNextSibling.nodeValue) || + pNextSibling.nodeName === 'IMG' +); +``` + + +# --seed-- + +## --seed-contents-- + +```html + + +

    CatPhotoApp

    +
    +

    Cat Photos

    + +--fcc-editable-region-- +

    Click here to view more cat photos.

    + cat photos +--fcc-editable-region-- + A cute orange cat lying on its back. +
    + + +``` diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/7cf9b03d81a65668421804c3.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/7cf9b03d81a65668421804c3.md index 041e41ad3e4883..c32179b567216b 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/7cf9b03d81a65668421804c3.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/7cf9b03d81a65668421804c3.md @@ -1,8 +1,8 @@ --- id: 7cf9b03d81a65668421804c3 -title: Step 38 +title: Step 39 challengeType: 0 -dashedName: step-38 +dashedName: step-39 --- # --description-- From d02dda9dc6663d0c6497fd406ad83aeeef601432 Mon Sep 17 00:00:00 2001 From: Matias Osorio <65029771+matiasosorio1999@users.noreply.github.com> Date: Mon, 12 Sep 2022 02:44:14 -0400 Subject: [PATCH 060/129] fix(curriculum): update description on step 15 of Building a City Skyline (#47501) Update 5d822fd413a79914d39e98d7.md --- .../5d822fd413a79914d39e98d7.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98d7.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98d7.md index 6c0397c69cb9d8..a99a0ca5b7e442 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98d7.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-css-variables-by-building-a-city-skyline/5d822fd413a79914d39e98d7.md @@ -7,7 +7,9 @@ dashedName: step-15 # --description-- -To use a variable, put the variable name in parentheses with `var` in front of them like this: `var(--variable-name)`. Add your variable as the value of the `background-color` property of the `.bb1a` class. Whatever value you gave the variable will be applied to whatever property you use it on. In this case, your variable has the value of `#999`. So `#999` will be used as the value for the `background-color` property. +To use a variable, put the variable name in parentheses with `var` in front of them like this: `var(--variable-name)`. Whatever value you gave the variable will be applied to whatever property you use it on. + +Add the variable `--building-color-1` you created in the previous step as the value of the `background-color` property of the `.bb1a` class. # --hints-- From 761dddeae36525700e82a6fe58847206430003a2 Mon Sep 17 00:00:00 2001 From: camperbot Date: Mon, 12 Sep 2022 15:50:49 +0530 Subject: [PATCH 061/129] chore(i18n,learn): processed translations (#47477) --- .../basic-javascript/understand-string-immutability.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/basic-javascript/understand-string-immutability.md b/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/basic-javascript/understand-string-immutability.md index 0ad2fe93dc2774..385bb79a96c860 100644 --- a/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/basic-javascript/understand-string-immutability.md +++ b/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/basic-javascript/understand-string-immutability.md @@ -11,14 +11,14 @@ dashedName: understand-string-immutability Em JavaScript, valores `String` são imutáveis, o que significa que elas não podem ser alteradas após serem criadas. -Por exemplo, o código a seguir: +Por exemplo, o código a seguir produzirá um erro porque a letra `B` na cadeia de caracteres `Bob` não pode ser alterada para a letra `J`: ```js let myStr = "Bob"; myStr[0] = "J"; ``` -não permite alterar o valor de `myStr` para `Job`, porque o conteúdo de `myStr` não pode ser alterado. Note que isso *não* significa que `myStr` não pode ser alterado, apenas que os caracteres individuais de uma string literal não podem ser alterados. A única forma de alterar `myStr` seria atribuindo a ela uma nova string, dessa forma: +Observe que isso *não* significa que `myStr` não possa ser reatribuída. A única forma de alterar `myStr` seria atribuindo a ela um novo valor, deste modo: ```js let myStr = "Bob"; From 00665d96f3d60934243ead2a53917fe691fe688f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Sep 2022 15:51:52 +0530 Subject: [PATCH 062/129] fix(deps): update dependency @stripe/stripe-js to v1.36.0 (#47498) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- client/package.json | 2 +- package-lock.json | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/client/package.json b/client/package.json index b4d1b4e7bb49dd..3f8df4a528697b 100644 --- a/client/package.json +++ b/client/package.json @@ -52,7 +52,7 @@ "@reach/router": "1.3.4", "@sentry/gatsby": "6.19.7", "@stripe/react-stripe-js": "1.10.0", - "@stripe/stripe-js": "1.35.0", + "@stripe/stripe-js": "1.36.0", "@types/react-scrollable-anchor": "0.6.1", "algoliasearch": "4.14.2", "assert": "2.0.0", diff --git a/package-lock.json b/package-lock.json index b2cf847faec0e2..2b22daf8f3f9a9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -456,7 +456,7 @@ "@reach/router": "1.3.4", "@sentry/gatsby": "6.19.7", "@stripe/react-stripe-js": "1.10.0", - "@stripe/stripe-js": "1.35.0", + "@stripe/stripe-js": "1.36.0", "@types/react-scrollable-anchor": "0.6.1", "algoliasearch": "4.14.2", "assert": "2.0.0", @@ -13189,9 +13189,9 @@ } }, "node_modules/@stripe/stripe-js": { - "version": "1.35.0", - "resolved": "https://registry.npmjs.org/@stripe/stripe-js/-/stripe-js-1.35.0.tgz", - "integrity": "sha512-UIuzpbJqgXCTvJhY/aZYvBtaKdMfQgnIv6kkLlfRJ9smZcC4zoPvq3j7k9wobYI+idHAWP4BRiPnqA8lvzJCtg==" + "version": "1.36.0", + "resolved": "https://registry.npmjs.org/@stripe/stripe-js/-/stripe-js-1.36.0.tgz", + "integrity": "sha512-m45BD9JxOfIBT0Tz4MupiKzM8M58NX/We8wKlf+54TCZpW1RVAyFpJ58CbtyU/LxAM+opT6cewHRVfs7bTUtBA==" }, "node_modules/@surma/rollup-plugin-off-main-thread": { "version": "2.2.3", @@ -56878,7 +56878,7 @@ "@reach/router": "1.3.4", "@sentry/gatsby": "6.19.7", "@stripe/react-stripe-js": "1.10.0", - "@stripe/stripe-js": "1.35.0", + "@stripe/stripe-js": "1.36.0", "@testing-library/jest-dom": "5.16.5", "@testing-library/react": "12.1.5", "@types/react-scrollable-anchor": "0.6.1", @@ -64242,9 +64242,9 @@ } }, "@stripe/stripe-js": { - "version": "1.35.0", - "resolved": "https://registry.npmjs.org/@stripe/stripe-js/-/stripe-js-1.35.0.tgz", - "integrity": "sha512-UIuzpbJqgXCTvJhY/aZYvBtaKdMfQgnIv6kkLlfRJ9smZcC4zoPvq3j7k9wobYI+idHAWP4BRiPnqA8lvzJCtg==" + "version": "1.36.0", + "resolved": "https://registry.npmjs.org/@stripe/stripe-js/-/stripe-js-1.36.0.tgz", + "integrity": "sha512-m45BD9JxOfIBT0Tz4MupiKzM8M58NX/We8wKlf+54TCZpW1RVAyFpJ58CbtyU/LxAM+opT6cewHRVfs7bTUtBA==" }, "@surma/rollup-plugin-off-main-thread": { "version": "2.2.3", From 9a95f232e1e5d698342d07fad095f0560541da32 Mon Sep 17 00:00:00 2001 From: hanswang123456 <50556568+hanswang123456@users.noreply.github.com> Date: Mon, 12 Sep 2022 07:19:55 -0400 Subject: [PATCH 063/129] fix(curriculum): Provide Example for Media Query (#47422) * Update 612ec19d5268da7074941f84.md * Switched order * Update curriculum/challenges/english/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ec19d5268da7074941f84.md Co-authored-by: Muhammed Mustafa * Update 612ec19d5268da7074941f84.md * Update 612ec19d5268da7074941f84.md * Update 612ec19d5268da7074941f84.md * Update curriculum/challenges/english/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ec19d5268da7074941f84.md Co-authored-by: Jeremy L Thompson Co-authored-by: Muhammed Mustafa Co-authored-by: Jeremy L Thompson --- .../612ec19d5268da7074941f84.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ec19d5268da7074941f84.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ec19d5268da7074941f84.md index a574e2712ff41b..3fe55b02de0a21 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ec19d5268da7074941f84.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ec19d5268da7074941f84.md @@ -7,7 +7,17 @@ dashedName: step-32 # --description-- -Add another `@media` rule to apply if the browser window is bigger than `769px` but smaller than `1199px`. +Logical operators can be used to construct more complex media queries. The `and` logical operator is used to query two media conditions. + +For example, a media query that targets a display width between 500px and 1000px would be: + +``` +@media (min-width: 500px) and (max-width: 1000px){ + +} +``` + +Add another `@media` rule to apply if the browser window is wider than `769px` but smaller than `1199px`. # --hints-- From 5ff719a4c894b66080674ff3c76b3efcd243edf5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Sep 2022 17:16:32 +0530 Subject: [PATCH 064/129] fix(deps): update font awesome to v6.2.0 (#47443) * fix(deps): update font awesome to v6.2.0 * fix: update snapshots Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Mrugesh Mohapatra <1884376+raisedadead@users.noreply.github.com> --- client/package.json | 6 +- .../__snapshots__/profile.test.tsx.snap | 6 +- package-lock.json | 72 +++++++++---------- 3 files changed, 42 insertions(+), 42 deletions(-) diff --git a/client/package.json b/client/package.json index 3f8df4a528697b..f2f85cdccc897c 100644 --- a/client/package.json +++ b/client/package.json @@ -39,9 +39,9 @@ "@babel/preset-env": "7.19.0", "@babel/preset-react": "7.18.6", "@babel/standalone": "7.19.0", - "@fortawesome/fontawesome-svg-core": "6.1.2", - "@fortawesome/free-brands-svg-icons": "6.1.2", - "@fortawesome/free-solid-svg-icons": "6.1.2", + "@fortawesome/fontawesome-svg-core": "6.2.0", + "@fortawesome/free-brands-svg-icons": "6.2.0", + "@fortawesome/free-solid-svg-icons": "6.2.0", "@fortawesome/react-fontawesome": "0.2.0", "@freecodecamp/curriculum-helpers": "1.1.0", "@freecodecamp/loop-protect": "3.0.0", diff --git a/client/src/components/profile/__snapshots__/profile.test.tsx.snap b/client/src/components/profile/__snapshots__/profile.test.tsx.snap index 512fdb959a3b79..bcb90fcb3d525f 100644 --- a/client/src/components/profile/__snapshots__/profile.test.tsx.snap +++ b/client/src/components/profile/__snapshots__/profile.test.tsx.snap @@ -210,7 +210,7 @@ exports[` renders correctly 1`] = ` xmlns="http://www.w3.org/2000/svg" > @@ -232,7 +232,7 @@ exports[` renders correctly 1`] = ` xmlns="http://www.w3.org/2000/svg" > @@ -254,7 +254,7 @@ exports[` renders correctly 1`] = ` xmlns="http://www.w3.org/2000/svg" > diff --git a/package-lock.json b/package-lock.json index 2b22daf8f3f9a9..df61b3b1882d36 100644 --- a/package-lock.json +++ b/package-lock.json @@ -443,9 +443,9 @@ "@babel/preset-env": "7.19.0", "@babel/preset-react": "7.18.6", "@babel/standalone": "7.19.0", - "@fortawesome/fontawesome-svg-core": "6.1.2", - "@fortawesome/free-brands-svg-icons": "6.1.2", - "@fortawesome/free-solid-svg-icons": "6.1.2", + "@fortawesome/fontawesome-svg-core": "6.2.0", + "@fortawesome/free-brands-svg-icons": "6.2.0", + "@fortawesome/free-solid-svg-icons": "6.2.0", "@fortawesome/react-fontawesome": "0.2.0", "@freecodecamp/curriculum-helpers": "1.1.0", "@freecodecamp/loop-protect": "3.0.0", @@ -3308,45 +3308,45 @@ } }, "node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.1.2.tgz", - "integrity": "sha512-wBaAPGz1Awxg05e0PBRkDRuTsy4B3dpBm+zreTTyd9TH4uUM27cAL4xWyWR0rLJCrRwzVsQ4hF3FvM6rqydKPA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.2.0.tgz", + "integrity": "sha512-rBevIsj2nclStJ7AxTdfsa3ovHb1H+qApwrxcTVo+NNdeJiB9V75hsKfrkG5AwNcRUNxrPPiScGYCNmLMoh8pg==", "hasInstallScript": true, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/fontawesome-svg-core": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.1.2.tgz", - "integrity": "sha512-853G/Htp0BOdXnPoeCPTjFrVwyrJHpe8MhjB/DYE9XjwhnNDfuBCd3aKc2YUYbEfHEcBws4UAA0kA9dymZKGjA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.2.0.tgz", + "integrity": "sha512-Cf2mAAeMWFMzpLC7Y9H1I4o3wEU+XovVJhTiNG8ZNgSQj53yl7OCJaS80K4YjrABWZzbAHVaoHE1dVJ27AAYXw==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "6.1.2" + "@fortawesome/fontawesome-common-types": "6.2.0" }, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/free-brands-svg-icons": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.1.2.tgz", - "integrity": "sha512-b2eMfXQBsSxh52pcPtYchURQs6BWNh3zVTG8XH8Lv6V4kDhEg7D0kHN+K1SZniDiPb/e5tBlaygsinMUvetITA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.2.0.tgz", + "integrity": "sha512-fm1y4NyZ2qKYNmYhdMz9VAWRw1Et7PMHNunSw3W0SVAwKwv6o0qiJworLH3Y9SnmhHzAymXJwCX1op22FFvGiA==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "6.1.2" + "@fortawesome/fontawesome-common-types": "6.2.0" }, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/free-solid-svg-icons": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.1.2.tgz", - "integrity": "sha512-lTgZz+cMpzjkHmCwOG3E1ilUZrnINYdqMmrkv30EC3XbRsGlbIOL8H9LaNp5SV4g0pNJDfQ4EdTWWaMvdwyLiQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.2.0.tgz", + "integrity": "sha512-UjCILHIQ4I8cN46EiQn0CZL/h8AwCGgR//1c4R96Q5viSRwuKVo0NdQEc4bm+69ZwC0dUvjbDqAHF1RR5FA3XA==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "6.1.2" + "@fortawesome/fontawesome-common-types": "6.2.0" }, "engines": { "node": ">=6" @@ -56440,32 +56440,32 @@ } }, "@fortawesome/fontawesome-common-types": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.1.2.tgz", - "integrity": "sha512-wBaAPGz1Awxg05e0PBRkDRuTsy4B3dpBm+zreTTyd9TH4uUM27cAL4xWyWR0rLJCrRwzVsQ4hF3FvM6rqydKPA==" + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.2.0.tgz", + "integrity": "sha512-rBevIsj2nclStJ7AxTdfsa3ovHb1H+qApwrxcTVo+NNdeJiB9V75hsKfrkG5AwNcRUNxrPPiScGYCNmLMoh8pg==" }, "@fortawesome/fontawesome-svg-core": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.1.2.tgz", - "integrity": "sha512-853G/Htp0BOdXnPoeCPTjFrVwyrJHpe8MhjB/DYE9XjwhnNDfuBCd3aKc2YUYbEfHEcBws4UAA0kA9dymZKGjA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.2.0.tgz", + "integrity": "sha512-Cf2mAAeMWFMzpLC7Y9H1I4o3wEU+XovVJhTiNG8ZNgSQj53yl7OCJaS80K4YjrABWZzbAHVaoHE1dVJ27AAYXw==", "requires": { - "@fortawesome/fontawesome-common-types": "6.1.2" + "@fortawesome/fontawesome-common-types": "6.2.0" } }, "@fortawesome/free-brands-svg-icons": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.1.2.tgz", - "integrity": "sha512-b2eMfXQBsSxh52pcPtYchURQs6BWNh3zVTG8XH8Lv6V4kDhEg7D0kHN+K1SZniDiPb/e5tBlaygsinMUvetITA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.2.0.tgz", + "integrity": "sha512-fm1y4NyZ2qKYNmYhdMz9VAWRw1Et7PMHNunSw3W0SVAwKwv6o0qiJworLH3Y9SnmhHzAymXJwCX1op22FFvGiA==", "requires": { - "@fortawesome/fontawesome-common-types": "6.1.2" + "@fortawesome/fontawesome-common-types": "6.2.0" } }, "@fortawesome/free-solid-svg-icons": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.1.2.tgz", - "integrity": "sha512-lTgZz+cMpzjkHmCwOG3E1ilUZrnINYdqMmrkv30EC3XbRsGlbIOL8H9LaNp5SV4g0pNJDfQ4EdTWWaMvdwyLiQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.2.0.tgz", + "integrity": "sha512-UjCILHIQ4I8cN46EiQn0CZL/h8AwCGgR//1c4R96Q5viSRwuKVo0NdQEc4bm+69ZwC0dUvjbDqAHF1RR5FA3XA==", "requires": { - "@fortawesome/fontawesome-common-types": "6.1.2" + "@fortawesome/fontawesome-common-types": "6.2.0" } }, "@fortawesome/react-fontawesome": { @@ -56865,9 +56865,9 @@ "@babel/types": "7.19.0", "@codesee/babel-plugin-instrument": "0.364.0", "@codesee/tracker": "0.364.0", - "@fortawesome/fontawesome-svg-core": "6.1.2", - "@fortawesome/free-brands-svg-icons": "6.1.2", - "@fortawesome/free-solid-svg-icons": "6.1.2", + "@fortawesome/fontawesome-svg-core": "6.2.0", + "@fortawesome/free-brands-svg-icons": "6.2.0", + "@fortawesome/free-solid-svg-icons": "6.2.0", "@fortawesome/react-fontawesome": "0.2.0", "@freecodecamp/curriculum-helpers": "1.1.0", "@freecodecamp/loop-protect": "3.0.0", From c15fd16ffe5d4a6ad6454ee975f0be339e324455 Mon Sep 17 00:00:00 2001 From: Mrugesh Mohapatra <1884376+raisedadead@users.noreply.github.com> Date: Mon, 12 Sep 2022 19:25:45 +0530 Subject: [PATCH 065/129] docs: update devops documents for client (#47358) * docs: update devops documents for client * chore: apply suggestions from code review Co-authored-by: Oliver Eyton-Williams Co-authored-by: Oliver Eyton-Williams --- docs/devops.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/devops.md b/docs/devops.md index 4503af6ff2b9c3..fd6e87e75db67c 100644 --- a/docs/devops.md +++ b/docs/devops.md @@ -564,8 +564,8 @@ Provisioning VMs with the Code ```console npm i -g npm@8 - npm i -g pm2 - npm install -g serve + npm i -g pm2@4 + npm install -g serve@13 pm2 install pm2-logrotate pm2 startup ``` @@ -583,11 +583,11 @@ Provisioning VMs with the Code > Todo: This setup needs to move to S3 or Azure Blob storage ```console - echo "serve -c ../../serve.json www -p 50505" >> client-start-primary.sh + echo "serve -c ../serve.json -p 50505 www" > client-start-primary.sh chmod +x client-start-primary.sh pm2 delete client-primary pm2 start ./client-start-primary.sh --name client-primary - echo "serve -c ../../serve.json www -p 52525" >> client-start-secondary.sh + echo "serve -c ../serve.json -p 52525 www" > client-start-secondary.sh chmod +x client-start-secondary.sh pm2 delete client-secondary pm2 start ./client-start-secondary.sh --name client-secondary From 9355406aed5372a838985b8bd9880ff2b9f6273d Mon Sep 17 00:00:00 2001 From: Oliver Eyton-Williams Date: Mon, 12 Sep 2022 22:42:56 +0200 Subject: [PATCH 066/129] refactor: add explanation of instruction width (#47504) --- client/src/templates/Challenges/classic/editor.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/src/templates/Challenges/classic/editor.css b/client/src/templates/Challenges/classic/editor.css index ee436c098db1cd..64e7110dd75ae2 100644 --- a/client/src/templates/Challenges/classic/editor.css +++ b/client/src/templates/Challenges/classic/editor.css @@ -45,6 +45,8 @@ textarea.inputarea { background-color: var(--secondary-background); padding: 1rem; border: 2px solid var(--quaternary-background); + /* the max-width is set to keep the characters in a line at below ~70 to help + with readability */ max-width: 600px; } From cd53a612028f4f09a82da90e727ee4dbebd61c89 Mon Sep 17 00:00:00 2001 From: TROLLGE <79172470+yashkoli836@users.noreply.github.com> Date: Tue, 13 Sep 2022 04:04:47 +0530 Subject: [PATCH 067/129] fix(curriculum): changed the description of the instructions (#47502) --- .../5dc1798ff86c76b9248c6eb3.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc1798ff86c76b9248c6eb3.md b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc1798ff86c76b9248c6eb3.md index 401b5e20bc3c95..14441801779c1d 100644 --- a/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc1798ff86c76b9248c6eb3.md +++ b/curriculum/challenges/english/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/5dc1798ff86c76b9248c6eb3.md @@ -7,7 +7,7 @@ dashedName: step-2 # --description-- -The `h1` to `h6` heading elements are used to signify the importance of content below them. The lower the number, the higher the importance, so `h2` elements have less importance than `h1` elements. Only use one `h1` element per page and place lower importance headings below higher importance headings. +The `h1` through `h6` heading elements are used to signify the importance of content below them. The lower the number, the higher the importance, so `h2` elements have less importance than `h1` elements. Only use one `h1` element per page and place lower importance headings below higher importance headings. Below the `h1` element, add an `h2` element with this text: From 533c0345e4d9a99159150adce7cb54a2ea247504 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20B=C4=85ba?= <81487891+maciek5000@users.noreply.github.com> Date: Tue, 13 Sep 2022 00:46:20 +0200 Subject: [PATCH 068/129] fix(learn): lack of block code declaration (#47506) Fix lack of block code declaration --- .../basic-javascript/practice-comparing-different-values.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/curriculum/challenges/english/02-javascript-algorithms-and-data-structures/basic-javascript/practice-comparing-different-values.md b/curriculum/challenges/english/02-javascript-algorithms-and-data-structures/basic-javascript/practice-comparing-different-values.md index 020af1ac5f1f09..ee683c59fa185c 100644 --- a/curriculum/challenges/english/02-javascript-algorithms-and-data-structures/basic-javascript/practice-comparing-different-values.md +++ b/curriculum/challenges/english/02-javascript-algorithms-and-data-structures/basic-javascript/practice-comparing-different-values.md @@ -15,7 +15,7 @@ If the values being compared are not of the same type, the equality operator wil **Examples** -`3 == '3'` returns `true` because JavaScript performs type conversion from string to number. `3 === '3'` returns false because the types are different and type conversion is not performed. +`3 == '3'` returns `true` because JavaScript performs type conversion from string to number. `3 === '3'` returns `false` because the types are different and type conversion is not performed. **Note:** In JavaScript, you can determine the type of a variable or a value with the `typeof` operator, as follows: From 415bd8222605687f06b1ff1e021e83e2718321d5 Mon Sep 17 00:00:00 2001 From: Naffy Dharni <64461700+naffydharni006@users.noreply.github.com> Date: Tue, 13 Sep 2022 10:07:14 +0530 Subject: [PATCH 069/129] misc: correct typo in README.md (#47500) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cba5e2d6053ab1..5d489d9d0f9671 100644 --- a/README.md +++ b/README.md @@ -146,7 +146,7 @@ Once you have earned the Responsive Web Design, Algorithms and Data Structures, #### Legacy Certifications -We also have 4 legacy certifications dating back to our 2015 curriculum, which is still available. All of the required projects for these legacy certifications will remain available on freeCodeCamp.org. +We also have 4 legacy certifications dating back to our 2015 curriculum, which are still available. All of the required projects for these legacy certifications will remain available on freeCodeCamp.org. - Legacy Front End Development Certification - Legacy Data Visualization Certification From f9f9cae7e9452f150be2863e94cf46b794364365 Mon Sep 17 00:00:00 2001 From: Naomi Carrigan Date: Tue, 13 Sep 2022 00:41:49 -0700 Subject: [PATCH 070/129] fix(tools): download more ram (#47508) --- .github/workflows/node.js-tests-upcoming.yml | 2 ++ .github/workflows/node.js-tests.yml | 1 + 2 files changed, 3 insertions(+) diff --git a/.github/workflows/node.js-tests-upcoming.yml b/.github/workflows/node.js-tests-upcoming.yml index 601db6e258668a..3e2dd7a326b293 100644 --- a/.github/workflows/node.js-tests-upcoming.yml +++ b/.github/workflows/node.js-tests-upcoming.yml @@ -82,4 +82,6 @@ jobs: npm run build:curriculum - name: Run Tests + env: + NODE_OPTIONS: '--max_old_space_size=6144' run: npm test diff --git a/.github/workflows/node.js-tests.yml b/.github/workflows/node.js-tests.yml index 68ca47d176c570..8cc4b6b592613f 100644 --- a/.github/workflows/node.js-tests.yml +++ b/.github/workflows/node.js-tests.yml @@ -162,4 +162,5 @@ jobs: env: CURRICULUM_LOCALE: ${{ matrix.locale }} CLIENT_LOCALE: ${{ matrix.locale }} + NODE_OPTIONS: '--max_old_space_size=6144' run: npm test From 7ce2179f2b682aa19824e48493957df53137eec0 Mon Sep 17 00:00:00 2001 From: camperbot Date: Tue, 13 Sep 2022 22:51:59 +0530 Subject: [PATCH 071/129] chore(i18n,docs): processed translations (#47511) --- docs/i18n/chinese-traditional/devops.md | 8 ++++---- docs/i18n/chinese/devops.md | 8 ++++---- docs/i18n/espanol/devops.md | 8 ++++---- docs/i18n/german/devops.md | 8 ++++---- docs/i18n/italian/devops.md | 8 ++++---- docs/i18n/japanese/devops.md | 8 ++++---- docs/i18n/portuguese/devops.md | 8 ++++---- docs/i18n/ukrainian/devops.md | 8 ++++---- docs/i18n/ukrainian/security.md | 10 +++++----- 9 files changed, 37 insertions(+), 37 deletions(-) diff --git a/docs/i18n/chinese-traditional/devops.md b/docs/i18n/chinese-traditional/devops.md index a43752fb581651..8dadcca1670fe5 100644 --- a/docs/i18n/chinese-traditional/devops.md +++ b/docs/i18n/chinese-traditional/devops.md @@ -537,8 +537,8 @@ Provisioning VMs with the Code ```console npm i -g npm@8 - npm i -g pm2 - npm install -g serve + npm i -g pm2@4 + npm install -g serve@13 pm2 install pm2-logrotate pm2 startup ``` @@ -555,11 +555,11 @@ Provisioning VMs with the Code > Todo: This setup needs to move to S3 or Azure Blob storage > > ```console - > echo "serve -c ../../serve.json www -p 50505" >> client-start-primary.sh + > echo "serve -c ../serve.json -p 50505 www" > client-start-primary.sh > chmod +x client-start-primary.sh > pm2 delete client-primary > pm2 start ./client-start-primary.sh --name client-primary - > echo "serve -c ../../serve.json www -p 52525" >> client-start-secondary.sh + > echo "serve -c ../serve.json -p 52525 www" > client-start-secondary.sh > chmod +x client-start-secondary.sh > pm2 delete client-secondary > pm2 start ./client-start-secondary.sh --name client-secondary diff --git a/docs/i18n/chinese/devops.md b/docs/i18n/chinese/devops.md index a43752fb581651..8dadcca1670fe5 100644 --- a/docs/i18n/chinese/devops.md +++ b/docs/i18n/chinese/devops.md @@ -537,8 +537,8 @@ Provisioning VMs with the Code ```console npm i -g npm@8 - npm i -g pm2 - npm install -g serve + npm i -g pm2@4 + npm install -g serve@13 pm2 install pm2-logrotate pm2 startup ``` @@ -555,11 +555,11 @@ Provisioning VMs with the Code > Todo: This setup needs to move to S3 or Azure Blob storage > > ```console - > echo "serve -c ../../serve.json www -p 50505" >> client-start-primary.sh + > echo "serve -c ../serve.json -p 50505 www" > client-start-primary.sh > chmod +x client-start-primary.sh > pm2 delete client-primary > pm2 start ./client-start-primary.sh --name client-primary - > echo "serve -c ../../serve.json www -p 52525" >> client-start-secondary.sh + > echo "serve -c ../serve.json -p 52525 www" > client-start-secondary.sh > chmod +x client-start-secondary.sh > pm2 delete client-secondary > pm2 start ./client-start-secondary.sh --name client-secondary diff --git a/docs/i18n/espanol/devops.md b/docs/i18n/espanol/devops.md index d39e419ad95f38..86398023018bff 100644 --- a/docs/i18n/espanol/devops.md +++ b/docs/i18n/espanol/devops.md @@ -537,8 +537,8 @@ Aprovisionamiento de MVs con el código ```console npm i -g npm@8 - npm i -g pm2 - npm install -g serve + npm i -g pm2@4 + npm install -g serve@13 pm2 install pm2-logrotate pm2 startup ``` @@ -555,11 +555,11 @@ Aprovisionamiento de MVs con el código > Todo: Esta configuración debe moverse a S3 o al almacenamiento de Azure Blob > > ```console - > echo "serve -c ../../serve.json www -p 50505" >> client-start-primary.sh + > echo "serve -c ../serve.json -p 50505 www" > client-start-primary.sh > chmod +x client-start-primary.sh > pm2 delete client-primary > pm2 start ./client-start-primary.sh --name client-primary - > echo "serve -c ../../serve.json www -p 52525" >> client-start-secondary.sh + > echo "serve -c ../serve.json -p 52525 www" > client-start-secondary.sh > chmod +x client-start-secondary.sh > pm2 delete client-secondary > pm2 start ./client-start-secondary.sh --name client-secondary diff --git a/docs/i18n/german/devops.md b/docs/i18n/german/devops.md index 5c2c6ad3723d3e..a5346bebe732a7 100644 --- a/docs/i18n/german/devops.md +++ b/docs/i18n/german/devops.md @@ -537,8 +537,8 @@ Bereitstellung von VMs mit dem Code ```console npm i -g npm@8 - npm i -g pm2 - npm install -g serve + npm i -g pm2@4 + npm install -g serve@13 pm2 install pm2-logrotate pm2 startup ``` @@ -555,11 +555,11 @@ Bereitstellung von VMs mit dem Code > Todo: Dieses Setup muss zu S3 oder Azure Blob Storage verschoben werden > > ```console - > echo "serve -c ../../serve.json www -p 50505" >> client-start-primary.sh + > echo "serve -c ../serve.json -p 50505 www" > client-start-primary.sh > chmod +x client-start-primary.sh > pm2 delete client-primary > pm2 start ./client-start-primary.sh --name client-primary - > echo "serve -c ../../serve.json www -p 52525" >> client-start-secondary.sh + > echo "serve -c ../serve.json -p 52525 www" > client-start-secondary.sh > chmod +x client-start-secondary.sh > pm2 delete client-secondary > pm2 start ./client-start-secondary.sh --name client-secondary diff --git a/docs/i18n/italian/devops.md b/docs/i18n/italian/devops.md index a11b9388b6584d..a48c0481035625 100644 --- a/docs/i18n/italian/devops.md +++ b/docs/i18n/italian/devops.md @@ -537,8 +537,8 @@ Fare provisioning delle VM con il codice ```console npm i -g npm@8 - npm i -g pm2 - npm install -g serve + npm i -g pm2@4 + npm install -g serve@13 pm2 install pm2-logrotate pm2 startup ``` @@ -555,11 +555,11 @@ Fare provisioning delle VM con il codice > Todo: questo setup deve essere spostato a S3 o Azure Blob storage > > ```console - > echo "serve -c ../../serve.json www -p 50505" >> client-start-primary.sh + > echo "serve -c ../serve.json -p 50505 www" > client-start-primary.sh > chmod +x client-start-primary.sh > pm2 delete client-primary > pm2 start ./client-start-primary.sh --name client-primary - > echo "serve -c ../../serve.json www -p 52525" >> client-start-secondary.sh + > echo "serve -c ../serve.json -p 52525 www" > client-start-secondary.sh > chmod +x client-start-secondary.sh > pm2 delete client-secondary > pm2 start ./client-start-secondary.sh --name client-secondary diff --git a/docs/i18n/japanese/devops.md b/docs/i18n/japanese/devops.md index 62e55d32caa765..eb0990d6c54b1a 100644 --- a/docs/i18n/japanese/devops.md +++ b/docs/i18n/japanese/devops.md @@ -537,8 +537,8 @@ sudo apt install build-essential ```console npm i -g npm@8 - npm i -g pm2 - npm install -g serve + npm i -g pm2@4 + npm install -g serve@13 pm2 install pm2-logrotate pm2 startup ``` @@ -555,11 +555,11 @@ sudo apt install build-essential > Todo: この設定は S3 または Azure Blob ストレージに移動する必要があります。 > > ```console - > echo "serve -c ../../serve.json www -p 50505" >> client-start-primary.sh + > echo "serve -c ../serve.json -p 50505 www" > client-start-primary.sh > chmod +x client-start-primary.sh > pm2 delete client-primary > pm2 start ./client-start-primary.sh --name client-primary - > echo "serve -c ../../serve.json www -p 52525" >> client-start-secondary.sh + > echo "serve -c ../serve.json -p 52525 www" > client-start-secondary.sh > chmod +x client-start-secondary.sh > pm2 delete client-secondary > pm2 start ./client-start-secondary.sh --name client-secondary diff --git a/docs/i18n/portuguese/devops.md b/docs/i18n/portuguese/devops.md index e53c28e394fd00..e51885f57808b1 100644 --- a/docs/i18n/portuguese/devops.md +++ b/docs/i18n/portuguese/devops.md @@ -537,8 +537,8 @@ Provisionando MVs com o código ```console npm i -g npm@8 - npm i -g pm2 - npm install -g serve + npm i -g pm2@4 + npm install -g serve@13 pm2 install pm2-logrotate pm2 startup ``` @@ -555,11 +555,11 @@ Provisionando MVs com o código > A fazer: Esta configuração precisa ser movida para S3 ou armazenamento Azure Blob > > ```console - > echo "serve -c ../../serve.json www -p 50505" >> client-start-primary.sh + > echo "serve -c ../serve.json -p 50505 www" > client-start-primary.sh > chmod +x client-start-primary.sh > pm2 delete client-primary > pm2 start ./client-start-primary.sh --name client-primary - > echo "serve -c ../../serve.json www -p 52525" >> client-start-secondary.sh + > echo "serve -c ../serve.json -p 52525 www" > client-start-secondary.sh > chmod +x client-start-secondary.sh > pm2 delete client-secondary > pm2 start ./client-start-secondary.sh --name client-secondary diff --git a/docs/i18n/ukrainian/devops.md b/docs/i18n/ukrainian/devops.md index 880a7b1a0b2f52..9d4903dec6696c 100644 --- a/docs/i18n/ukrainian/devops.md +++ b/docs/i18n/ukrainian/devops.md @@ -537,8 +537,8 @@ Provisioning VMs with the Code ```console npm i -g npm@8 - npm i -g pm2 - npm install -g serve + npm i -g pm2@4 + npm install -g serve@13 pm2 install pm2-logrotate pm2 startup ``` @@ -555,11 +555,11 @@ Provisioning VMs with the Code > Todo: This setup needs to move to S3 or Azure Blob storage > > ```console - > echo "serve -c ../../serve.json www -p 50505" >> client-start-primary.sh + > echo "serve -c ../serve.json -p 50505 www" > client-start-primary.sh > chmod +x client-start-primary.sh > pm2 delete client-primary > pm2 start ./client-start-primary.sh --name client-primary - > echo "serve -c ../../serve.json www -p 52525" >> client-start-secondary.sh + > echo "serve -c ../serve.json -p 52525 www" > client-start-secondary.sh > chmod +x client-start-secondary.sh > pm2 delete client-secondary > pm2 start ./client-start-secondary.sh --name client-secondary diff --git a/docs/i18n/ukrainian/security.md b/docs/i18n/ukrainian/security.md index 00abf7dc7eaf3d..3a9c4461c42e75 100644 --- a/docs/i18n/ukrainian/security.md +++ b/docs/i18n/ukrainian/security.md @@ -1,14 +1,14 @@ -# freeCodeCamp.org's Security Policy +# Політика безпеки freeCodeCamp.org -This document outlines our security policy for the codebases, platforms that we operate, and how to report vulnerabilities. +Цей документ визначає нашу політику безпеки для бази кодів, платформ, які ми використовуємо, та як повідомити про вразливість. ## Повідомлення про вразливість -> [!NOTE] If you think you have found a vulnerability, **please report it responsibly**. Do not create GitHub issues for security issues. Instead, follow this guide. +> [!NOTE] Якщо ви вважаєте, що знайшли вразливість, **будь ласка, повідомте про це**. Не створюйте обговорення на GitHub з питань безпеки. Натомість слідуйте цій інструкції. -### Guidelines +### Настанови -We appreciate responsible disclosure of vulnerabilities that might impact the integrity of our platforms and users. In the interest of saving everyone time, we encourage you to report vulnerabilities with these in mind: +Ми цінуємо відповідальне розкриття інформації, що може вплинути на цілісність наших платформ та користувачів. В інтересах збереження часу ми просимо вас повідомити про вразливість, враховуючи наступне: 1. Ensure that you are using the **latest**, **stable**, and **updated** versions of the Operating System and Web Browser(s) available to you on your machine. 2. We consider using tools & online utilities to report issues with SPF & DKIM configs, SSL Server tests, etc., in the category of ["beg bounties"](https://www.troyhunt.com/beg-bounties) and are unable to respond to these reports. From 408968f0b95c00a63f98a42d24ff98bbacac56e1 Mon Sep 17 00:00:00 2001 From: camperbot Date: Wed, 14 Sep 2022 22:00:37 +0530 Subject: [PATCH 072/129] chore(i18n,learn): processed translations (#47510) * chore(i18n,learn): processed translations * Update Ukrainian file to match state on crowdin Co-authored-by: Ilenia --- ...-of-an-object-with-a-for...in-statement.md | 2 +- ...s-multi-dimensional-arrays-with-indexes.md | 8 +- ...essing-object-properties-with-variables.md | 26 +- .../assignment-with-a-returned-value.md | 2 +- ...oncatenating-strings-with-plus-operator.md | 14 +- ...g-strings-with-the-plus-equals-operator.md | 10 +- .../basic-javascript/counting-cards.md | 13 + .../create-decimal-numbers-with-javascript.md | 2 +- .../escaping-literal-quotes-in-strings.md | 2 +- ...nerate-random-fractions-with-javascript.md | 2 +- .../global-scope-and-functions.md | 2 +- ...terate-with-javascript-do...while-loops.md | 2 +- .../return-early-pattern-for-functions.md | 4 +- ...returning-boolean-values-from-functions.md | 2 +- .../use-recursion-to-create-a-countdown.md | 2 +- .../using-objects-for-lookups.md | 8 +- .../basic-javascript/word-blanks.md | 12 +- ...pare-scopes-of-the-var-and-let-keywords.md | 2 +- .../mutate-an-array-declared-with-const.md | 4 +- .../arguments-optional.md | 6 + .../dna-pairing.md | 4 +- .../caesars-cipher.md | 4 +- .../build-a-25-5-clock.md | 4 +- .../build-a-markdown-previewer.md | 4 +- .../build-a-random-quote-machine.md | 4 +- ...nge-text-inside-an-element-using-jquery.md | 2 +- .../moving-forward-from-here.md | 2 +- .../react/create-a-stateful-component.md | 16 +- .../react/introducing-inline-styles.md | 2 +- .../react/render-conditionally-from-props.md | 10 +- .../react/set-state-with-this.setstate.md | 2 +- ...rray.map-to-dynamically-render-elements.md | 2 +- ...roptypes-to-define-the-props-you-expect.md | 2 +- ...the-lifecycle-method-componentwillmount.md | 2 +- .../redux/create-a-redux-store.md | 2 +- .../exercise-tracker.md | 16 +- .../file-metadata-microservice.md | 6 +- .../request-header-parser-microservice.md | 6 +- .../timestamp-microservice.md | 6 +- .../url-shortener-microservice.md | 6 +- ...hain-middleware-to-create-a-time-server.md | 4 +- .../meet-the-node-console.md | 4 +- .../use-body-parser-to-parse-post-requests.md | 4 +- .../use-the-.env-file.md | 4 +- ...project-with-external-packages-from-npm.md | 18 +- ...e-of-any-node.js-project-or-npm-package.md | 6 +- ...es-by-understanding-semantic-versioning.md | 16 +- ...remove-a-package-from-your-dependencies.md | 10 +- .../mongodb-and-mongoose/create-a-model.md | 2 +- .../install-and-set-up-mongoose.md | 36 +- ...-updates-by-running-find-edit-then-save.md | 2 +- .../announce-new-users.md | 2 +- .../authentication-strategies.md | 4 +- .../authentication-with-socket.io.md | 4 +- .../clean-up-your-project-with-modules.md | 2 +- .../communicate-by-emitting.md | 2 +- .../create-new-middleware.md | 2 +- .../how-to-use-passport-strategies.md | 2 +- ...ementation-of-social-authentication-iii.md | 2 +- ...implementation-of-social-authentication.md | 4 +- .../send-and-display-chat-messages.md | 2 +- .../use-a-template-engines-powers.md | 2 +- ...ality-with-.deepequal-and-.notdeepequal.md | 2 +- .../compare-the-properties-of-two-elements.md | 8 +- .../learn-how-javascript-assertions-work.md | 4 +- ...sponse-using-chai-http-iii---put-method.md | 2 +- ...esponse-using-chai-http-iv---put-method.md | 2 +- ...sts-on-api-endpoints-using-chai-http-ii.md | 2 +- ...-tests-on-api-endpoints-using-chai-http.md | 2 +- ...nctional-tests-using-a-headless-browser.md | 2 +- ...mulate-actions-using-a-headless-browser.md | 2 +- .../test-for-truthiness.md | 2 +- .../test-if-a-string-contains-a-substring.md | 2 +- ...f-a-value-falls-within-a-specific-range.md | 2 +- .../test-if-a-value-is-a-string.md | 2 +- .../test-if-a-value-is-an-array.md | 2 +- ...ue-is-of-a-specific-data-structure-type.md | 2 +- ...st-if-a-variable-or-function-is-defined.md | 2 +- .../test-if-an-array-contains-an-item.md | 2 +- .../test-if-an-object-has-a-property.md | 2 +- ...-object-is-an-instance-of-a-constructor.md | 2 +- ...s-below-or-at-least-as-large-as-another.md | 2 +- .../use-assert.isok-and-assert.isnotok.md | 4 +- ...se-regular-expressions-to-test-a-string.md | 2 +- ...se-the-double-equals-to-assert-equality.md | 2 +- ...triple-equals-to-assert-strict-equality.md | 2 +- .../american-british-translator.md | 6 +- .../issue-tracker.md | 6 +- .../metric-imperial-converter.md | 6 +- .../personal-library.md | 6 +- .../build-your-own-functions.md | 2 +- .../comparing-and-sorting-tuples.md | 2 +- .../dictionaries-and-loops.md | 2 +- .../files-as-a-sequence.md | 2 +- ...services-api-rate-limiting-and-security.md | 8 +- .../budget-app.md | 2 +- .../polygon-area-calculator.md | 2 +- .../time-calculator.md | 2 +- .../introduction-to-data-analysis.md | 9 +- ...ash-and-compare-passwords-synchronously.md | 16 +- .../install-and-require-helmet.md | 6 +- .../developing-a-banner-grabber.md | 10 +- .../developing-a-port-scanner.md | 14 +- .../developing-an-nmap-scanner-part-1.md | 8 +- .../introduction-and-setup.md | 14 +- ...nding-sockets-and-creating-a-tcp-server.md | 8 +- ...ocessing-with-rnns-sentimental-analysis.md | 10 +- .../build-a-survey-form.md | 518 +++++++++++++++ .../build-a-tribute-page.md | 325 ++++++++++ .../6140827cff96e906bd38fc2b.md | 2 +- .../6145f8f8bcd4370f6509078e.md | 2 - .../6148e41c728f65138addf9cc.md | 360 +++++++++++ .../5f33071498eb2472b87ddee4.md | 6 +- .../5f3477ae34c1239cafe128be.md | 2 +- .../5f3477aefa51bfc29327200b.md | 6 +- .../5f3477cb2e27333b1ab2b955.md | 5 +- .../5f3c866dbf362f99b9a0c6d0.md | 117 ++++ .../5f3c866de7a5b784048f94b1.md | 108 ++++ .../5f3cade9fa77275d9f4efe62.md | 4 +- .../5f3ef6e01f288a026d709587.md | 158 +++++ .../5f3ef6e03d719d5ac4738993.md | 122 ++++ .../5f3ef6e04559b939080db057.md | 147 +++++ .../5f3ef6e050279c7a4a7101d3.md | 144 +++++ .../5f3ef6e056bdde6ae6892ba2.md | 138 ++++ .../5f3ef6e06d34faac0447fc44.md | 135 ++++ .../5f3ef6e07276f782bb46b93d.md | 149 +++++ .../5f3ef6e087d56ed3ffdc36be.md | 134 ++++ .../5f3ef6e0a81099d9a697b550.md | 17 +- .../5f3ef6e0b431cc215bb16f55.md | 141 +++++ .../5f3ef6e0e9629bad967cd71e.md | 121 ++++ .../5f3ef6e0eaa7da26e3d34d78.md | 135 ++++ .../5f3ef6e0f8c230bdd2349716.md | 147 +++++ .../5f3f26fa39591db45e5cd7a0.md | 156 +++++ .../5f459225127805351a6ad057.md | 148 +++++ .../5f459a7ceb8b5c446656d88b.md | 152 +++++ .../5f459cf202c2a3472fae6a9f.md | 153 +++++ .../5f459fd48bdc98491ca6d1a3.md | 150 +++++ .../5f45a05977e2fa49d9119437.md | 150 +++++ .../5f45a276c093334f0f6e9df4.md | 176 ++++++ .../5f45a5a7c49a8251f0bdb527.md | 162 +++++ .../5f45a66d4a2b0453301e5a26.md | 178 ++++++ .../5f45b0731d39e15d54df4dfc.md | 175 ++++++ .../5f45b25e7ec2405f166b9de1.md | 182 ++++++ .../5f45b3c93c027860d9298dbd.md | 186 ++++++ .../5f45b45d099f3e621fbbb256.md | 189 ++++++ .../5f45b4c81cea7763550e40df.md | 182 ++++++ .../5f45b715301bbf667badc04a.md | 184 ++++++ .../5f46e270702a8456a664f0df.md | 183 ++++++ .../5f46e36e745ead58487aabf2.md | 195 ++++++ .../5f46e7a4750dd05b5a673920.md | 191 ++++++ .../5f46e8284aae155c83015dee.md | 194 ++++++ .../5f46ede1ff8fec5ba656b44c.md | 155 +++++ .../5f46fc57528aa1c4b5ea7c2e.md | 167 +++++ .../5f4701b942c824109626c3d8.md | 2 +- .../5f475bb508746c16c9431d42.md | 223 +++++++ .../5f475e1c7f71a61d913836c6.md | 199 ++++++ .../5f47fe7e31980053a8d4403b.md | 363 +++++++++++ .../5f716bee5838c354c728a7c5.md | 153 +++++ .../5f76967fad478126d6552b0d.md | 102 +++ .../6140c7e645d8e905819f1dd4.md | 181 ++++++ .../6140c9d35015ae0ba0c250e8.md | 79 +++ .../6140d263016325162fd076fe.md | 111 ++++ .../61695197ac34f0407e339882.md | 66 ++ .../61695ab9f6ffe951c16d03dd.md | 103 +++ .../61695c4aad56f95497c19583.md | 56 ++ .../61695d1fbc003856628bf561.md | 52 ++ .../616965351e74d4689eb6de30.md | 53 ++ .../616968c2c94c8071b349c146.md | 72 +++ .../61696ef7ac756c829f9e4048.md | 65 ++ .../616971b3cd990186b66c99a1.md | 59 ++ .../616d3a67ccf800ad94ec89ae.md | 71 +++ .../616d47bc9eedc4bc7f621bec.md | 66 ++ .../616d4a84b756d9c4b8255093.md | 68 ++ .../616d50b93ba424d6282c99cf.md | 62 ++ .../616d525007b8c5d8b3308b1c.md | 60 ++ .../616d55bd160a95e22453a081.md | 91 +++ .../616d595270d902f0e7086e18.md | 65 ++ .../61764c602bee6974e7790f35.md | 76 +++ .../61764f23ea21477b76f3b80f.md | 61 ++ .../61764f7e5240eb7ccc7f6a0a.md | 68 ++ .../61764fdda535587e1fefb3aa.md | 86 +++ .../617b8b38f32bf2080a140675.md | 90 +++ .../619b7396e57b771f903be90d.md | 77 +++ .../619bcf239fc15905ecd66fce.md | 145 +++++ .../5dc174fcf86c76b9248c6eb2.md | 6 +- .../5dc17d3bf86c76b9248c6eb4.md | 4 +- .../5dc23991f86c76b9248c6eb8.md | 39 +- .../5dc24073f86c76b9248c6ebb.md | 2 +- .../60eebd07ea685b0e777b5583.md | 52 ++ .../60f027099a15b00485563dd2.md | 8 +- .../60f027c87bc98f050395c139.md | 67 ++ .../60f0286404aefb0562a4fdf9.md | 56 ++ .../60f02e7361b68405e27b62a5.md | 13 +- .../60f030d388cb74067cf291c3.md | 55 ++ .../60f1922fcbd2410527b3bd89.md | 55 ++ .../60f1a5e2d2c23707a4f9a660.md | 15 +- .../60f1a9cbd23023082e149fee.md | 15 +- .../60f5c3e399ff1a05629964e4.md | 19 +- .../60f5cb8875ab6a0610f05071.md | 13 +- .../60f5d2776c854e069560fbe6.md | 17 +- .../60f5dc35c07ac1078f140916.md | 13 +- .../60f803d5241e6a0433a523a1.md | 73 +++ .../60f805f813eaf2049bc2ceea.md | 95 +++ .../60f80e0081e0f2052ae5b505.md | 87 +++ .../60f81167d0d4910809f88945.md | 80 +++ .../60f81616cff80508badf9ad5.md | 94 +++ .../60f83e7bfc09900959f41e20.md | 74 +++ .../60f84ec41116b209c280ba91.md | 82 +++ .../60f852f645b5310a8264f555.md | 76 +++ .../60f85a62fb30c80bcea0cedb.md | 85 +++ .../60f8618d191b940d62038513.md | 106 ++++ .../60fab4a123ce4b04526b082b.md | 84 +++ .../60fab8367d35de04e5cb7929.md | 86 +++ .../60fab9f17fa294054b74228c.md | 88 +++ .../60fabf0dd4959805dbae09e6.md | 103 +++ .../60fac4095512d3066053d73c.md | 84 +++ .../60fac56271087806def55b33.md | 100 +++ .../60fad1cafcde010995e15306.md | 155 +++++ .../61fd5a93fd62bb35968adeab.md | 22 +- .../61fd6343fb42013d99bcd7f3.md | 48 ++ .../61fd66c687e610436494c6f1.md | 52 ++ .../61fd67a656743144844941cb.md | 78 +++ .../61fd6ab779390f49148773bb.md | 65 ++ .../61fd6b7c83dbf54a08cf0498.md | 79 +++ .../61fd6cc9475a784b7776233e.md | 80 +++ .../61fd70336ebb3e4f62ee81ba.md | 73 +++ .../61fd719788899952e67692b9.md | 86 +++ .../61fd71d596e8f253b9408b39.md | 86 +++ .../61fd75ea7f663457612dba02.md | 125 ++++ .../61fd7648a7ba2e5882436831.md | 96 +++ .../61fd778081276b59d59abad6.md | 134 ++++ .../61fd77f7ad2aeb5ae34d07d6.md | 138 ++++ .../61fd78621573aa5e8b512f5e.md | 142 +++++ .../61fd7a160ed17960e971f28b.md | 140 +++++ .../61fd9126aa72a474301fc49f.md | 131 ++++ .../61fd933ba685de776a94997e.md | 169 +++++ .../61fd94056e0355785fbba4d3.md | 173 +++++ .../61fd986ddbcbd47ba8fbc5ec.md | 177 ++++++ .../61fd990577d8227dd93fbeeb.md | 181 ++++++ .../61fd9ad665a4a282c8106be3.md | 198 ++++++ .../61fd9d9fbdfe078800317055.md | 158 +++++ .../61fda307bde0b091cf7d884a.md | 168 +++++ .../61fda339eadcfd92a6812bed.md | 171 +++++ .../61fdac1e31692f9a9ad97295.md | 178 ++++++ .../61fdaea3999cb19d76ce717b.md | 173 +++++ .../61fdaf9ff894b6a084ecdc1b.md | 175 ++++++ .../61fdafe6f07fd7a1c6785bc2.md | 183 ++++++ .../61fdb04d9939f0a26ca51c2b.md | 193 ++++++ .../620159cd5431aa34bc6a4c9c.md | 199 ++++++ .../62015a5da1c95c358f079ebb.md | 195 ++++++ .../62015cd2654a1139321a89d2.md | 197 ++++++ .../62015d8942384c3aed48329e.md | 213 +++++++ .../620167374bb8b4455cd11125.md | 225 +++++++ .../620174ed519dd7506c1a4b61.md | 213 +++++++ .../620175b3710a0951cfa86edf.md | 230 +++++++ .../6201782cc420715562f36271.md | 233 +++++++ .../620179bc0a6a2358c72b90ad.md | 225 +++++++ .../62017b6f47454059bf2d3bd1.md | 231 +++++++ .../62017f47c87be96457c49f46.md | 299 +++++++++ .../62017fa5bbef406580ceb44f.md | 237 +++++++ .../62018243f046a368fab8ffb6.md | 239 +++++++ .../6201830cb0c74b69f1b41635.md | 243 +++++++ .../620186f4b6b8356d2def576b.md | 253 ++++++++ .../62018ba1aa263770c953be66.md | 252 ++++++++ .../62018c3e94434a71af1d5eaa.md | 262 ++++++++ .../62018ec29b3ae674f40bef31.md | 256 ++++++++ .../62019093fe30e278e797d2f6.md | 266 ++++++++ .../620191707bc65579ddd3ce15.md | 271 ++++++++ .../620192a767533a7ad19d96d7.md | 278 ++++++++ .../6201995d9ab88e80f1989dce.md | 275 ++++++++ .../620199c7a7a32c81d4db3410.md | 279 +++++++++ .../6201a1a7af32c287bd6b8183.md | 285 +++++++++ .../6201a1cc668a34888f5b2f52.md | 289 +++++++++ .../6201a20d742f5c89736c8cfb.md | 303 +++++++++ .../6201a42e39bf3b95b6a33bf3.md | 321 ++++++++++ .../6201a4adcc6414968b391592.md | 297 +++++++++ .../6201a5258af7b398b030bfaf.md | 313 ++++++++++ .../6201a59be346d399c21d10b1.md | 591 ++++++++++++++++++ .../612e6afc009b450a437940a1.md | 133 ++++ .../612e77aba7ca691f598feb02.md | 64 ++ .../612e78af05201622d4bab8aa.md | 57 ++ .../612e7d1c29fb872d6384379c.md | 60 ++ .../612e804c54d5e7308d7ebe56.md | 60 ++ .../612e813b3ba67633222cbe54.md | 95 +++ .../612e8279827a28352ce83a72.md | 74 +++ .../612e83ec2eca1e370f830511.md | 102 +++ .../612e89562043183c86df287c.md | 77 +++ .../612e89d254fe5d3df7d6693d.md | 83 +++ .../612e8eebe3a6dc3fcc33a66f.md | 95 +++ .../612e95ef2e4bdf41f69067f9.md | 81 +++ .../612e96fc87fe8e44f69f7ec5.md | 102 +++ .../612e98f3245c98475e49cfc6.md | 88 +++ .../612e9a21381a1949327512e6.md | 89 +++ .../612e9d142affc44a453655db.md | 117 ++++ .../612e9f1e7e5ccd4fa9ada0be.md | 103 +++ .../612ea4c4993aba52ab4aa32e.md | 119 ++++ .../612ea97df5742154772f312e.md | 110 ++++ .../612ead8788d28655ef8db056.md | 112 ++++ .../612eaf56b7ba3257fdbfb0db.md | 144 +++++ .../612eb4893b63c75bb9251ddf.md | 129 ++++ .../612eb75153591b5e3b1ab65e.md | 115 ++++ .../612eb7ca8c275d5f89c73333.md | 116 ++++ .../612eb8e984cd73677a92b7e9.md | 117 ++++ .../612eb934f64a4d6890a45518.md | 118 ++++ .../612ebcba99bfa46a15370b11.md | 139 ++++ .../612ebe7fe6d07e6b76d1cae2.md | 133 ++++ .../612ebedec97e096c8bf64999.md | 136 ++++ .../612ebf9a210f2b6d77001e68.md | 139 ++++ .../612ec0490ae8626e9adf82e4.md | 133 ++++ .../612ec29c84b9a6718b1f5cec.md | 288 +++++++++ .../60a3e3396c7b40068ad6996a.md | 55 ++ .../615f3e4af8008c5d494d3afe.md | 78 +++ .../614394fb41985e0d2012a93e.md | 4 +- .../understand-string-immutability.md | 4 +- .../6148d4d57b965358c9fa38bf.md | 2 +- .../5d822fd413a79914d39e98d7.md | 4 +- .../5dfa22d1b521be39a3de7be0.md | 12 +- .../5dfa2407b521be39a3de7be1.md | 4 +- .../5dfa30b9eacea3f48c6300ad.md | 4 +- .../5dfa3589eacea3f48c6300ae.md | 4 +- .../5dfa371beacea3f48c6300af.md | 4 +- .../5dfa37b9eacea3f48c6300b0.md | 4 +- .../5dfb5ecbeacea3f48c6300b1.md | 4 +- .../5dfb6250eacea3f48c6300b2.md | 4 +- .../5dfb655eeacea3f48c6300b3.md | 4 +- .../5dfb6a35eacea3f48c6300b4.md | 4 +- .../5ef9b03c81a63668521804d0.md | 4 +- .../5ef9b03c81a63668521804d1.md | 4 +- .../5ef9b03c81a63668521804d2.md | 4 +- .../5ef9b03c81a63668521804d3.md | 4 +- .../5ef9b03c81a63668521804d4.md | 4 +- .../5ef9b03c81a63668521804d5.md | 4 +- .../5ef9b03c81a63668521804d6.md | 4 +- .../5ef9b03c81a63668521804d7.md | 4 +- .../5ef9b03c81a63668521804d8.md | 4 +- .../5ef9b03c81a63668521804d9.md | 4 +- .../5ef9b03c81a63668521804da.md | 4 +- .../5ef9b03c81a63668521804db.md | 4 +- .../5ef9b03c81a63668521804dc.md | 4 +- .../5ef9b03c81a63668521804dd.md | 4 +- .../5ef9b03c81a63668521804de.md | 4 +- .../5ef9b03c81a63668521804df.md | 4 +- .../5ef9b03c81a63668521804e1.md | 4 +- .../5ef9b03c81a63668521804e2.md | 4 +- .../5ef9b03c81a63668521804e3.md | 4 +- .../5ef9b03c81a63668521804e5.md | 4 +- .../5ef9b03c81a63668521804e7.md | 4 +- .../5ef9b03c81a63668521804e8.md | 4 +- .../5ef9b03c81a63668521804e9.md | 4 +- .../5ef9b03c81a63668521804ea.md | 4 +- .../5ef9b03c81a63668521804eb.md | 4 +- .../5ef9b03c81a63668521804ec.md | 4 +- .../5ef9b03c81a63668521804ee.md | 4 +- .../5efada803cbd2bbdab94e332.md | 4 +- .../5efae0543cbd2bbdab94e333.md | 4 +- .../5efae16e3cbd2bbdab94e334.md | 4 +- .../5efb23e70dc218d6c85f89b1.md | 4 +- .../5efb2c990dc218d6c85f89b2.md | 4 +- .../5efc4f528d6a74d05e68af74.md | 4 +- .../5efc518e8d6a74d05e68af75.md | 4 +- .../5efc54138d6a74d05e68af76.md | 4 +- .../5efc575c8d6a74d05e68af77.md | 4 +- .../5f05a1d8e233dff4a68508d8.md | 4 +- .../5f07be6ef7412fbad0c5626b.md | 4 +- .../5f07c98cdb9413cbd4b16750.md | 4 +- .../5f07fb1579dc934717801375.md | 4 +- .../5f0d48e7b435f13ab6550051.md | 4 +- .../5f0d4ab1b435f13ab6550052.md | 4 +- .../5f0d4d04b435f13ab6550053.md | 4 +- .../5f1a80975fc4bcae0edb3497.md | 4 +- .../5f1a89f1190aff21ae42105a.md | 4 +- .../62bb4009e3458a128ff57d5d.md | 4 +- .../62dabe2ef403a12d5d295273.md | 84 +++ .../7cf9b03d81a65668421804c3.md | 4 +- .../60f8604682407e0d017bbf7f.md | 2 +- .../60fab8367d35de04e5cb7929.md | 2 +- .../612ec19d5268da7074941f84.md | 10 + .../understand-string-immutability.md | 4 +- .../mutate-an-array-declared-with-const.md | 2 +- .../visualize-data-with-a-bar-chart.md | 4 +- .../visualize-data-with-a-choropleth-map.md | 4 +- .../visualize-data-with-a-heat-map.md | 4 +- ...visualize-data-with-a-scatterplot-graph.md | 4 +- .../visualize-data-with-a-treemap-diagram.md | 4 +- .../exercise-tracker.md | 16 +- .../file-metadata-microservice.md | 6 +- .../request-header-parser-microservice.md | 6 +- .../timestamp-microservice.md | 6 +- .../url-shortener-microservice.md | 6 +- ...hain-middleware-to-create-a-time-server.md | 2 +- .../meet-the-node-console.md | 4 +- .../use-body-parser-to-parse-post-requests.md | 4 +- .../use-the-.env-file.md | 4 +- ...project-with-external-packages-from-npm.md | 18 +- ...e-of-any-node.js-project-or-npm-package.md | 6 +- ...es-by-understanding-semantic-versioning.md | 16 +- ...remove-a-package-from-your-dependencies.md | 8 +- ...he-latest-minor-version-of-a-dependency.md | 18 +- ...he-latest-patch-version-of-a-dependency.md | 18 +- .../mongodb-and-mongoose/create-a-model.md | 2 +- .../install-and-set-up-mongoose.md | 36 +- ...-updates-by-running-find-edit-then-save.md | 2 +- .../announce-new-users.md | 2 +- .../authentication-strategies.md | 4 +- .../authentication-with-socket.io.md | 4 +- .../clean-up-your-project-with-modules.md | 2 +- .../communicate-by-emitting.md | 2 +- .../create-new-middleware.md | 2 +- .../handle-a-disconnect.md | 2 +- .../hashing-your-passwords.md | 4 +- .../how-to-put-a-profile-together.md | 2 +- .../how-to-use-passport-strategies.md | 2 +- ...nt-the-serialization-of-a-passport-user.md | 4 +- ...lementation-of-social-authentication-ii.md | 10 +- ...ementation-of-social-authentication-iii.md | 2 +- ...implementation-of-social-authentication.md | 4 +- .../logging-a-user-out.md | 4 +- .../registration-of-new-users.md | 2 +- .../send-and-display-chat-messages.md | 2 +- .../serialization-of-a-user-object.md | 4 +- .../set-up-a-template-engine.md | 14 +- .../set-up-passport.md | 10 +- .../set-up-the-environment.md | 4 +- ...ality-with-.deepequal-and-.notdeepequal.md | 2 +- .../compare-the-properties-of-two-elements.md | 6 +- .../learn-how-javascript-assertions-work.md | 4 +- ...sponse-using-chai-http-iii---put-method.md | 2 +- ...esponse-using-chai-http-iv---put-method.md | 2 +- ...sts-on-api-endpoints-using-chai-http-ii.md | 2 +- ...-tests-on-api-endpoints-using-chai-http.md | 2 +- ...ional-tests-using-a-headless-browser-ii.md | 4 +- ...nctional-tests-using-a-headless-browser.md | 2 +- ...mulate-actions-using-a-headless-browser.md | 2 +- .../test-for-truthiness.md | 2 +- .../test-if-a-string-contains-a-substring.md | 2 +- ...f-a-value-falls-within-a-specific-range.md | 2 +- .../test-if-a-value-is-a-string.md | 2 +- .../test-if-a-value-is-an-array.md | 2 +- ...ue-is-of-a-specific-data-structure-type.md | 2 +- ...st-if-a-variable-or-function-is-defined.md | 2 +- .../test-if-an-array-contains-an-item.md | 2 +- .../test-if-an-object-has-a-property.md | 2 +- ...-object-is-an-instance-of-a-constructor.md | 2 +- ...s-below-or-at-least-as-large-as-another.md | 2 +- .../use-assert.isok-and-assert.isnotok.md | 4 +- ...se-regular-expressions-to-test-a-string.md | 2 +- ...se-the-double-equals-to-assert-equality.md | 2 +- ...triple-equals-to-assert-strict-equality.md | 2 +- .../american-british-translator.md | 6 +- .../issue-tracker.md | 6 +- .../metric-imperial-converter.md | 6 +- .../personal-library.md | 6 +- .../sudoku-solver.md | 28 +- .../data-visualization-mailing-lists.md | 14 +- .../60fab8367d35de04e5cb7929.md | 86 +++ .../60fab9f17fa294054b74228c.md | 88 +++ .../60fabf0dd4959805dbae09e6.md | 103 +++ .../60fac4095512d3066053d73c.md | 84 +++ .../60fac8d7fdfaee0796934f20.md | 116 ++++ .../60faca286cb48b07f6482970.md | 110 ++++ .../60facde2d0dc61085b41063f.md | 105 ++++ .../60facf914c7b9b08d7510c2c.md | 95 +++ .../60fad0a812d9890938524f50.md | 95 +++ .../60fad1cafcde010995e15306.md | 155 +++++ .../60fad6dfcc0d930a59becf12.md | 102 +++ .../practice-comparing-different-values.md | 2 +- .../6148d4d57b965358c9fa38bf.md | 2 +- .../5d822fd413a79914d39e98d7.md | 4 +- .../5dfa22d1b521be39a3de7be0.md | 12 +- .../5dfa2407b521be39a3de7be1.md | 4 +- .../5dfa30b9eacea3f48c6300ad.md | 4 +- .../5dfa3589eacea3f48c6300ae.md | 4 +- .../5dfa371beacea3f48c6300af.md | 4 +- .../5dfa37b9eacea3f48c6300b0.md | 4 +- .../5dfb5ecbeacea3f48c6300b1.md | 4 +- .../5dfb6250eacea3f48c6300b2.md | 4 +- .../5dfb655eeacea3f48c6300b3.md | 4 +- .../5dfb6a35eacea3f48c6300b4.md | 4 +- .../5ef9b03c81a63668521804d0.md | 4 +- .../5ef9b03c81a63668521804d1.md | 4 +- .../5ef9b03c81a63668521804d2.md | 4 +- .../5ef9b03c81a63668521804d3.md | 4 +- .../5ef9b03c81a63668521804d4.md | 4 +- .../5ef9b03c81a63668521804d5.md | 4 +- .../5ef9b03c81a63668521804d6.md | 4 +- .../5ef9b03c81a63668521804d7.md | 4 +- .../5ef9b03c81a63668521804d8.md | 4 +- .../5ef9b03c81a63668521804d9.md | 4 +- .../5ef9b03c81a63668521804da.md | 4 +- .../5ef9b03c81a63668521804db.md | 4 +- .../5ef9b03c81a63668521804dc.md | 4 +- .../5ef9b03c81a63668521804dd.md | 4 +- .../5ef9b03c81a63668521804de.md | 4 +- .../5ef9b03c81a63668521804df.md | 4 +- .../5ef9b03c81a63668521804e1.md | 4 +- .../5ef9b03c81a63668521804e2.md | 6 +- .../5ef9b03c81a63668521804e3.md | 4 +- .../5ef9b03c81a63668521804e5.md | 4 +- .../5ef9b03c81a63668521804e7.md | 4 +- .../5ef9b03c81a63668521804e8.md | 4 +- .../5ef9b03c81a63668521804e9.md | 4 +- .../5ef9b03c81a63668521804ea.md | 4 +- .../5ef9b03c81a63668521804eb.md | 4 +- .../5ef9b03c81a63668521804ec.md | 4 +- .../5ef9b03c81a63668521804ee.md | 4 +- .../5efada803cbd2bbdab94e332.md | 4 +- .../5efae0543cbd2bbdab94e333.md | 4 +- .../5efae16e3cbd2bbdab94e334.md | 4 +- .../5efb23e70dc218d6c85f89b1.md | 4 +- .../5efb2c990dc218d6c85f89b2.md | 4 +- .../5efc4f528d6a74d05e68af74.md | 4 +- .../5efc518e8d6a74d05e68af75.md | 4 +- .../5efc54138d6a74d05e68af76.md | 4 +- .../5efc575c8d6a74d05e68af77.md | 4 +- .../5f05a1d8e233dff4a68508d8.md | 4 +- .../5f07be6ef7412fbad0c5626b.md | 4 +- .../5f07c98cdb9413cbd4b16750.md | 4 +- .../5f07fb1579dc934717801375.md | 4 +- .../5f0d48e7b435f13ab6550051.md | 4 +- .../5f0d4ab1b435f13ab6550052.md | 4 +- .../5f0d4d04b435f13ab6550053.md | 4 +- .../5f1a80975fc4bcae0edb3497.md | 4 +- .../5f1a89f1190aff21ae42105a.md | 4 +- .../62bb4009e3458a128ff57d5d.md | 4 +- .../62dabe2ef403a12d5d295273.md | 84 +++ .../7cf9b03d81a65668421804c3.md | 4 +- .../60f8604682407e0d017bbf7f.md | 2 +- .../60fab8367d35de04e5cb7929.md | 2 +- .../612ec19d5268da7074941f84.md | 12 +- .../5dc1798ff86c76b9248c6eb3.md | 2 +- .../5dfa22d1b521be39a3de7be0.md | 12 +- .../5dfa2407b521be39a3de7be1.md | 4 +- .../5dfa30b9eacea3f48c6300ad.md | 4 +- .../5dfa3589eacea3f48c6300ae.md | 4 +- .../5dfa371beacea3f48c6300af.md | 4 +- .../5dfa37b9eacea3f48c6300b0.md | 4 +- .../5dfb5ecbeacea3f48c6300b1.md | 4 +- .../5dfb6250eacea3f48c6300b2.md | 4 +- .../5dfb655eeacea3f48c6300b3.md | 4 +- .../5dfb6a35eacea3f48c6300b4.md | 4 +- .../5ef9b03c81a63668521804d0.md | 4 +- .../5ef9b03c81a63668521804d1.md | 4 +- .../5ef9b03c81a63668521804d2.md | 4 +- .../5ef9b03c81a63668521804d3.md | 4 +- .../5ef9b03c81a63668521804d4.md | 4 +- .../5ef9b03c81a63668521804d5.md | 4 +- .../5ef9b03c81a63668521804d6.md | 4 +- .../5ef9b03c81a63668521804d7.md | 4 +- .../5ef9b03c81a63668521804d8.md | 4 +- .../5ef9b03c81a63668521804d9.md | 4 +- .../5ef9b03c81a63668521804da.md | 4 +- .../5ef9b03c81a63668521804db.md | 4 +- .../5ef9b03c81a63668521804dc.md | 4 +- .../5ef9b03c81a63668521804dd.md | 4 +- .../5ef9b03c81a63668521804de.md | 4 +- .../5ef9b03c81a63668521804df.md | 4 +- .../5ef9b03c81a63668521804e1.md | 4 +- .../5ef9b03c81a63668521804e2.md | 4 +- .../5ef9b03c81a63668521804e3.md | 4 +- .../5ef9b03c81a63668521804e5.md | 4 +- .../5ef9b03c81a63668521804e7.md | 4 +- .../5ef9b03c81a63668521804e8.md | 4 +- .../5ef9b03c81a63668521804e9.md | 4 +- .../5ef9b03c81a63668521804ea.md | 4 +- .../5ef9b03c81a63668521804eb.md | 4 +- .../5ef9b03c81a63668521804ec.md | 4 +- .../5ef9b03c81a63668521804ee.md | 4 +- .../5efada803cbd2bbdab94e332.md | 4 +- .../5efae0543cbd2bbdab94e333.md | 4 +- .../5efae16e3cbd2bbdab94e334.md | 4 +- .../5efb23e70dc218d6c85f89b1.md | 4 +- .../5efb2c990dc218d6c85f89b2.md | 4 +- .../5efc4f528d6a74d05e68af74.md | 4 +- .../5efc518e8d6a74d05e68af75.md | 4 +- .../5efc54138d6a74d05e68af76.md | 4 +- .../5efc575c8d6a74d05e68af77.md | 4 +- .../5f05a1d8e233dff4a68508d8.md | 4 +- .../5f07be6ef7412fbad0c5626b.md | 4 +- .../5f07c98cdb9413cbd4b16750.md | 4 +- .../5f07fb1579dc934717801375.md | 4 +- .../5f0d48e7b435f13ab6550051.md | 4 +- .../5f0d4ab1b435f13ab6550052.md | 4 +- .../5f0d4d04b435f13ab6550053.md | 4 +- .../5f1a80975fc4bcae0edb3497.md | 4 +- .../5f1a89f1190aff21ae42105a.md | 4 +- .../62bb4009e3458a128ff57d5d.md | 4 +- .../62dabe2ef403a12d5d295273.md | 84 +++ .../7cf9b03d81a65668421804c3.md | 4 +- .../60fab8367d35de04e5cb7929.md | 2 +- 589 files changed, 29458 insertions(+), 955 deletions(-) create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/build-a-survey-form-project/build-a-survey-form.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/build-a-tribute-page-project/build-a-tribute-page.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-accessibility-by-building-a-quiz/6148e41c728f65138addf9cc.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3c866dbf362f99b9a0c6d0.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3c866de7a5b784048f94b1.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3ef6e01f288a026d709587.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3ef6e03d719d5ac4738993.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3ef6e04559b939080db057.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3ef6e050279c7a4a7101d3.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3ef6e056bdde6ae6892ba2.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3ef6e06d34faac0447fc44.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3ef6e07276f782bb46b93d.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3ef6e087d56ed3ffdc36be.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3ef6e0b431cc215bb16f55.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3ef6e0e9629bad967cd71e.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3ef6e0eaa7da26e3d34d78.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3ef6e0f8c230bdd2349716.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3f26fa39591db45e5cd7a0.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f459225127805351a6ad057.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f459a7ceb8b5c446656d88b.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f459cf202c2a3472fae6a9f.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f459fd48bdc98491ca6d1a3.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f45a05977e2fa49d9119437.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f45a276c093334f0f6e9df4.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f45a5a7c49a8251f0bdb527.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f45a66d4a2b0453301e5a26.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f45b0731d39e15d54df4dfc.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f45b25e7ec2405f166b9de1.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f45b3c93c027860d9298dbd.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f45b45d099f3e621fbbb256.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f45b4c81cea7763550e40df.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f45b715301bbf667badc04a.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f46e270702a8456a664f0df.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f46e36e745ead58487aabf2.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f46e7a4750dd05b5a673920.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f46e8284aae155c83015dee.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f46ede1ff8fec5ba656b44c.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f46fc57528aa1c4b5ea7c2e.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f475bb508746c16c9431d42.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f475e1c7f71a61d913836c6.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f47fe7e31980053a8d4403b.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f716bee5838c354c728a7c5.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f76967fad478126d6552b0d.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-css-animation-by-building-a-ferris-wheel/6140c7e645d8e905819f1dd4.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-css-animation-by-building-a-ferris-wheel/6140c9d35015ae0ba0c250e8.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-css-animation-by-building-a-ferris-wheel/6140d263016325162fd076fe.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61695197ac34f0407e339882.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61695ab9f6ffe951c16d03dd.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61695c4aad56f95497c19583.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61695d1fbc003856628bf561.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/616965351e74d4689eb6de30.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/616968c2c94c8071b349c146.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61696ef7ac756c829f9e4048.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/616971b3cd990186b66c99a1.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/616d3a67ccf800ad94ec89ae.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/616d47bc9eedc4bc7f621bec.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/616d4a84b756d9c4b8255093.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/616d50b93ba424d6282c99cf.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/616d525007b8c5d8b3308b1c.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/616d55bd160a95e22453a081.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/616d595270d902f0e7086e18.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61764c602bee6974e7790f35.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61764f23ea21477b76f3b80f.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61764f7e5240eb7ccc7f6a0a.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/61764fdda535587e1fefb3aa.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/617b8b38f32bf2080a140675.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-css-colors-by-building-a-set-of-colored-markers/619b7396e57b771f903be90d.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-css-transforms-by-building-a-penguin/619bcf239fc15905ecd66fce.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60eebd07ea685b0e777b5583.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f027c87bc98f050395c139.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f0286404aefb0562a4fdf9.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f030d388cb74067cf291c3.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f1922fcbd2410527b3bd89.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f803d5241e6a0433a523a1.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f805f813eaf2049bc2ceea.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f80e0081e0f2052ae5b505.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81167d0d4910809f88945.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f81616cff80508badf9ad5.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f83e7bfc09900959f41e20.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f84ec41116b209c280ba91.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f852f645b5310a8264f555.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f85a62fb30c80bcea0cedb.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60f8618d191b940d62038513.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab4a123ce4b04526b082b.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab8367d35de04e5cb7929.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab9f17fa294054b74228c.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fabf0dd4959805dbae09e6.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac4095512d3066053d73c.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac56271087806def55b33.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad1cafcde010995e15306.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd6343fb42013d99bcd7f3.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd66c687e610436494c6f1.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd67a656743144844941cb.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd6ab779390f49148773bb.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd6b7c83dbf54a08cf0498.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd6cc9475a784b7776233e.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd70336ebb3e4f62ee81ba.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd719788899952e67692b9.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd71d596e8f253b9408b39.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd75ea7f663457612dba02.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd7648a7ba2e5882436831.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd778081276b59d59abad6.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd77f7ad2aeb5ae34d07d6.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd78621573aa5e8b512f5e.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd7a160ed17960e971f28b.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd9126aa72a474301fc49f.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd933ba685de776a94997e.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd94056e0355785fbba4d3.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd986ddbcbd47ba8fbc5ec.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd990577d8227dd93fbeeb.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd9ad665a4a282c8106be3.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fd9d9fbdfe078800317055.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fda307bde0b091cf7d884a.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fda339eadcfd92a6812bed.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fdac1e31692f9a9ad97295.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fdaea3999cb19d76ce717b.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fdaf9ff894b6a084ecdc1b.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fdafe6f07fd7a1c6785bc2.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/61fdb04d9939f0a26ca51c2b.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620159cd5431aa34bc6a4c9c.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62015a5da1c95c358f079ebb.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62015cd2654a1139321a89d2.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62015d8942384c3aed48329e.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620167374bb8b4455cd11125.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620174ed519dd7506c1a4b61.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620175b3710a0951cfa86edf.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201782cc420715562f36271.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620179bc0a6a2358c72b90ad.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62017b6f47454059bf2d3bd1.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62017f47c87be96457c49f46.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62017fa5bbef406580ceb44f.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62018243f046a368fab8ffb6.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201830cb0c74b69f1b41635.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620186f4b6b8356d2def576b.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62018ba1aa263770c953be66.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62018c3e94434a71af1d5eaa.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62018ec29b3ae674f40bef31.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/62019093fe30e278e797d2f6.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620191707bc65579ddd3ce15.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620192a767533a7ad19d96d7.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201995d9ab88e80f1989dce.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/620199c7a7a32c81d4db3410.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201a1a7af32c287bd6b8183.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201a1cc668a34888f5b2f52.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201a20d742f5c89736c8cfb.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201a42e39bf3b95b6a33bf3.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201a4adcc6414968b391592.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201a5258af7b398b030bfaf.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet/6201a59be346d399c21d10b1.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e6afc009b450a437940a1.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e77aba7ca691f598feb02.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e78af05201622d4bab8aa.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e7d1c29fb872d6384379c.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e804c54d5e7308d7ebe56.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e813b3ba67633222cbe54.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e8279827a28352ce83a72.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e83ec2eca1e370f830511.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e89562043183c86df287c.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e89d254fe5d3df7d6693d.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e8eebe3a6dc3fcc33a66f.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e95ef2e4bdf41f69067f9.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e96fc87fe8e44f69f7ec5.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e98f3245c98475e49cfc6.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e9a21381a1949327512e6.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e9d142affc44a453655db.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612e9f1e7e5ccd4fa9ada0be.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ea4c4993aba52ab4aa32e.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ea97df5742154772f312e.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ead8788d28655ef8db056.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612eaf56b7ba3257fdbfb0db.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612eb4893b63c75bb9251ddf.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612eb75153591b5e3b1ab65e.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612eb7ca8c275d5f89c73333.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612eb8e984cd73677a92b7e9.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612eb934f64a4d6890a45518.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ebcba99bfa46a15370b11.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ebe7fe6d07e6b76d1cae2.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ebedec97e096c8bf64999.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ebf9a210f2b6d77001e68.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ec0490ae8626e9adf82e4.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-responsive-web-design-by-building-a-piano/612ec29c84b9a6718b1f5cec.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-the-css-box-model-by-building-a-rothko-painting/60a3e3396c7b40068ad6996a.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f3e4af8008c5d494d3afe.md create mode 100644 curriculum/challenges/italian/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/62dabe2ef403a12d5d295273.md create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab8367d35de04e5cb7929.md create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fab9f17fa294054b74228c.md create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fabf0dd4959805dbae09e6.md create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac4095512d3066053d73c.md create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fac8d7fdfaee0796934f20.md create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60faca286cb48b07f6482970.md create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60facde2d0dc61085b41063f.md create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60facf914c7b9b08d7510c2c.md create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad0a812d9890938524f50.md create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad1cafcde010995e15306.md create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-html-forms-by-building-a-registration-form/60fad6dfcc0d930a59becf12.md create mode 100644 curriculum/challenges/portuguese/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/62dabe2ef403a12d5d295273.md create mode 100644 curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-html-by-building-a-cat-photo-app/62dabe2ef403a12d5d295273.md diff --git a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-data-structures/iterate-through-the-keys-of-an-object-with-a-for...in-statement.md b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-data-structures/iterate-through-the-keys-of-an-object-with-a-for...in-statement.md index fccfd7fcc109a0..9400d309b6f8f3 100644 --- a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-data-structures/iterate-through-the-keys-of-an-object-with-a-for...in-statement.md +++ b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-data-structures/iterate-through-the-keys-of-an-object-with-a-for...in-statement.md @@ -16,7 +16,7 @@ for (let user in users) { } ``` -Esto registrará `Alan`, `Jeff`, `Sarah`, y `Ryan`, cada valor en su propia línea. +Esto devolvería `Alan`, `Jeff`, y `Sarah` - cada valor en su propia línea. En esta sentencia, definimos una variable `user`, y como puedes ver, esta variable se restablece durante cada iteración a cada una de las claves del objeto a medida que la sentencia hace un bucle a través del objeto, dando como resultado que el nombre de cada usuario se imprima en la consola. diff --git a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/access-multi-dimensional-arrays-with-indexes.md b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/access-multi-dimensional-arrays-with-indexes.md index ebbaf87236f2e7..1ea0e7fdf5079a 100644 --- a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/access-multi-dimensional-arrays-with-indexes.md +++ b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/access-multi-dimensional-arrays-with-indexes.md @@ -21,12 +21,12 @@ const arr = [ [[10, 11, 12], 13, 14] ]; -arr[3]; -arr[3][0]; -arr[3][0][1]; +const subarray = arr[3]; +const nestedSubarray = arr[3][0]; +const element = arr[3][0][1]; ``` -`arr[3]` es `[[10, 11, 12], 13, 14]`, `arr[3][0]` es `[10, 11, 12]` y `arr[3][0][1]` es `11`. +En este ejemplo, `subarray` tiene el valor `[[10, 11, 12], 13, 14]`, `nestedSubarray` tiene el valor `[10, 11, 12]`, y `element` tiene el valor `11`. **Nota:** No debe haber ningún espacio entre el nombre del arreglo y los corchetes, ni `array [0][0]` o `array [0] [0]` están permitidos. Aunque JavaScript pueda procesar esto correctamente, puedes confundir a otros programadores al leer tu código. diff --git a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/accessing-object-properties-with-variables.md b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/accessing-object-properties-with-variables.md index 03419b61091051..aa99545fb81673 100644 --- a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/accessing-object-properties-with-variables.md +++ b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/accessing-object-properties-with-variables.md @@ -27,29 +27,11 @@ console.log(myBreed); La cadena `Doberman` se mostrará en la consola. -Otra forma de usar este concepto es cuando el nombre de la propiedad se recoge dinámicamente durante la ejecución del programa, de la siguiente manera: - -```js -const someObj = { - propName: "John" -}; - -function propPrefix(str) { - const s = "prop"; - return s + str; -} - -const someProp = propPrefix("Name"); -console.log(someObj[someProp]); -``` - -`someProp` tendrá una cadena con un valor `propName` y la cadena `John` se mostrará en la consola. - -Ten en cuenta que *no* usamos comillas alrededor del nombre de la variable cuando la usamos para acceder a la propiedad porque utilizamos el *valor* de la variable, no el *nombre*. +Ten en cuenta que *no* utilizamos comillas alrededor del nombre de la variable cuando la usamos para acceder a la propiedad porque utilizamos el *valor* de la variable, no el *nombre*. # --instructions-- -Establece la variable `playerNumber` a `16`. Luego, usa la variable para buscar el nombre del jugador y asignarlo a `player`. +Asigna la variable `playerNumber` a `16`. Luego, usa la variable para buscar el nombre del jugador y asignarlo a `player`. # --hints-- @@ -71,7 +53,7 @@ El valor de `player` debe ser la cadena `Montana` assert(player === 'Montana'); ``` -Debes usar la notación de corchete para acceder a `testObj` +Debes usar la notación de corchetes para acceder a `testObj` ```js assert(/testObj\s*?\[.*?\]/.test(code)); @@ -83,7 +65,7 @@ No debes asignar el valor de `Montana` a la variable `player` directamente. assert(!code.match(/player\s*=\s*"|\'\s*Montana\s*"|\'\s*;/gi)); ``` -Debes usar la variable `playerNumber` en tu notación de corchete +Debes usar la variable `playerNumber` en tu notación de corchetes ```js assert(/testObj\s*?\[\s*playerNumber\s*\]/.test(code)); diff --git a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/assignment-with-a-returned-value.md b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/assignment-with-a-returned-value.md index f4197e2ed20f4d..4c134547e33591 100644 --- a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/assignment-with-a-returned-value.md +++ b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/assignment-with-a-returned-value.md @@ -9,7 +9,7 @@ dashedName: assignment-with-a-returned-value # --description-- -Si recuerdas de nuestra discusión sobre [almacenar valores con el operador de asignación](/learn/javascript-algorithms-and-data-structures/basic-javascript/storing-values-with-the-assignment-operator), todo a la derecha del signo de igualdad se resuelve antes de asignar el valor. Esto significa que podemos tomar el valor devuelto de una función y asignarlo a una variable. +Si recuerda nuestra discusión sobre el almacenamiento de valores con el operador de asignación, todo lo que está a la derecha del signo de igualdad se resuelve antes de asignar el valor. Esto significa que podemos tomar el valor devuelto de una función y asignarlo a una variable. Supongamos que hemos predefinido una función `sum` que suma dos números juntos, entonces: diff --git a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/concatenating-strings-with-plus-operator.md b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/concatenating-strings-with-plus-operator.md index 9390cce0a521ef..aad95864f85939 100644 --- a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/concatenating-strings-with-plus-operator.md +++ b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/concatenating-strings-with-plus-operator.md @@ -25,26 +25,32 @@ Ejemplo: const ourStr = "I come first. " + "I come second."; ``` -La cadena `I come first. I come second.` se mostrará en la consola. +La cadena `I come first. I come second.` se mostraría en la consola. # --instructions-- Construye `myStr` a partir de las cadenas `This is the start.` y `This is the end.` utilizando el operador `+`. Asegúrate de incluir un espacio entre las dos cadenas. # --hints-- -`myStr` debe tener una cadena con valor `This is the start. This is the end.` +`myStr` Debe tener un solo carácter de espacio entre las dos cadenas. + +```js +assert(/start\. This/.test(myStr)); +``` + +`myStr` debe tener un valor de la cadena `This is the start. This is the end.` ```js assert(myStr === 'This is the start. This is the end.'); ``` -Debes usar el operador `+` para construir `myStr`. +Deberías usar el operador `+` para construir `myStr`. ```js assert(code.match(/(["']).*\1\s*\+\s*(["']).*\2/g)); ``` -`myStr` debe ser creada usando la palabra clave `const`. +`myStr` Debe crearse una variable con la palabra reservada `const`. ```js assert(/const\s+myStr/.test(code)); diff --git a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/concatenating-strings-with-the-plus-equals-operator.md b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/concatenating-strings-with-the-plus-equals-operator.md index 71f31f0e0b9763..ae6eb1acbb1a50 100644 --- a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/concatenating-strings-with-the-plus-equals-operator.md +++ b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/concatenating-strings-with-the-plus-equals-operator.md @@ -28,13 +28,19 @@ Construye `myStr` en varias líneas concatenando estas dos cadenas: `This is the # --hints-- -`myStr` debe tener una cadena con valor `This is the first sentence. This is the second sentence.` +`myStr` Debe tener un solo carácter de espacio entre las dos cadenas. + +```js +assert(/sentence\. This/.test(myStr)); +``` + +`myStr` Debe tener un valor de la cadena `This is the first sentence. This is the second sentence.` ```js assert(myStr === 'This is the first sentence. This is the second sentence.'); ``` -Debes usar el operador `+=` para construir `myStr`. +Deberías usar el operador `+=` para construir `myStr`. ```js assert(code.match(/myStr\s*\+=\s*(["']).*\1/g)); diff --git a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/counting-cards.md b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/counting-cards.md index cb4dc04a670ea9..7655489d51210d 100644 --- a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/counting-cards.md +++ b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/counting-cards.md @@ -25,6 +25,19 @@ NO incluyas comillas (individuales o dobles) en el resultado. # --hints-- +Su función debe devolver un valor para el conteo y el texto (`Bet` o `Hold`) con un carácter de espacio entre ellos. + +```js +assert(// + (function () { + count = 0; + let out = cc(10); + const hasSpace = /-?\d+ (Bet|Hold)/.test('' + out); + return hasSpace; + })() +); +``` + La secuencia de cartas 2, 3, 4, 5, 6 debe devolver la cadena `5 Bet` ```js diff --git a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/create-decimal-numbers-with-javascript.md b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/create-decimal-numbers-with-javascript.md index d3bd35862fee58..a37c0ac1d118ce 100644 --- a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/create-decimal-numbers-with-javascript.md +++ b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/create-decimal-numbers-with-javascript.md @@ -11,7 +11,7 @@ dashedName: create-decimal-numbers-with-javascript También podemos almacenar números decimales en variables. Los números decimales a veces se denominan números de coma flotante o flotantes. -**Nota:** computadoras representan números con precisión finita. Por eso las operaciones de punto flotante no pueden representar exactamente verdaderas operaciones aritméticas, y esto conduce a muchas situaciones sorprendentes. si te enfrentas con uno de estos problemas, abre el tema en el [foro de freeCodeCamp](https://forum.freecodecamp.org/). +**Nota:** cuando calculas números, se calculan con precisión finita. Las operaciones con puntos flotantes pueden producir resultados diferentes a los deseados. Si obtiene uno de estos resultados, abra un tema en el foro de freeCodeCamp. # --instructions-- diff --git a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/escaping-literal-quotes-in-strings.md b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/escaping-literal-quotes-in-strings.md index a4d96b882509b0..25c378b2e5efbc 100644 --- a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/escaping-literal-quotes-in-strings.md +++ b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/escaping-literal-quotes-in-strings.md @@ -39,7 +39,7 @@ Debes usar dos comillas dobles (`"`) y cuatro comillas dobles escapadas (`\"`). assert(code.match(/\\"/g).length === 4 && code.match(/[^\\]"/g).length === 2); ``` -La variable myStr debe contener la cadena: `I am a "double quoted" string inside "double quotes".` +La variable `myStr` debe contener la cadena: `I am a "double quoted" string inside "double quotes".` ```js assert(/I am a "double quoted" string inside "double quotes(\."|"\.)$/.test(myStr)); diff --git a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/generate-random-fractions-with-javascript.md b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/generate-random-fractions-with-javascript.md index 60edb42b85d742..a5e13cd8883ff5 100644 --- a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/generate-random-fractions-with-javascript.md +++ b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/generate-random-fractions-with-javascript.md @@ -13,7 +13,7 @@ Los números aleatorios son útiles para crear comportamientos aleatorios. JavaScript tiene una función `Math.random()` que genera un número decimal aleatorio entre `0` (inclusivo) y `1` (exclusivo). Así que `Math.random()` puede devolver un `0` pero nunca devuelve un `1`. -**Nota:** Así como aprendimos en [almacenando valores con el operador de igualdad](/learn/javascript-algorithms-and-data-structures/basic-javascript/storing-values-with-the-assignment-operator), todas las llamadas de funciones se resolverán antes de que el `return` se ejecute, así que podemos devolver (`return`) el valor de la función `Math.random()`. +**Nota:** Al igual que el almacenamiento de valores con el operador de asignación, todas las llamadas a la función se resolverán antes de que se ejecute el `return`, por lo que el `return` devuelve el valor de la función `Math.random()`. # --instructions-- diff --git a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/global-scope-and-functions.md b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/global-scope-and-functions.md index 5dc2a7d5cdcbaf..83b47185103a4d 100644 --- a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/global-scope-and-functions.md +++ b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/global-scope-and-functions.md @@ -17,7 +17,7 @@ Las variables que se declaran sin las palabras clave `let` o `const` se crean au Usando `let` o `const`, declara una variable global llamada `myGlobal` fuera de cualquier función. Inicialízala con un valor de `10`. -Dentro de la función `fun1`, asigna `5` a `oopsGlobal` ***sin*** usar las palabras clave `let` o `const`. +Dentro de la función `fun1`, asigna `5` a `oopsGlobal` ***sin usar*** las palabras clave `var`, `let` o `const`. # --hints-- diff --git a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/iterate-with-javascript-do...while-loops.md b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/iterate-with-javascript-do...while-loops.md index ec75b75adb2045..9cde8169f16d9a 100644 --- a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/iterate-with-javascript-do...while-loops.md +++ b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/iterate-with-javascript-do...while-loops.md @@ -21,7 +21,7 @@ do { } while (i < 5); ``` -El ejemplo anterior se comporta de forma similar a otros tipos de bucles, siendo el arreglo resultante `[0, 1, 2, 3, 4]`. Sin embargo, lo que hace que el bucle `do...while` sea diferente a otros bucles es cómo se comporta cuando la condición falla en la primera verificación. Veamos esto en acción: Aquí puedes ver un bucle `while` que ejecutará el código una y otra vez siempre que `i < 5`: +El ejemplo anterior se comporta de forma similar a otros tipos de bucles, siendo el arreglo resultante `[0, 1, 2, 3, 4]`. Sin embargo, lo que hace que el bucle `do...while` sea diferente a otros bucles es cómo se comporta cuando la condición falla en la primera verificación. Veamos esto en acción. Aquí hay un bucle `while` normal que ejecutara el código en el bucle mientras `i < 5`: ```js const ourArray = []; diff --git a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/return-early-pattern-for-functions.md b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/return-early-pattern-for-functions.md index 7d1507c0818372..d58c38fc7c3363 100644 --- a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/return-early-pattern-for-functions.md +++ b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/return-early-pattern-for-functions.md @@ -28,8 +28,8 @@ Lo anterior mostrará la cadena `Hello` en la consola y devolverá la cadena `Wo Modifica la función `abTest` para que cuando `a` o `b` sean menores que `0` la función salga inmediatamente con un valor `undefined`. -**Sugerencia** -Recuerda que [`undefined` es una palabra clave](https://www.freecodecamp.org/learn/javascript-algorithms-and-data-structures/basic-javascript/understanding-uninitialized-variables), no una cadena. +**Pista** +Recuerda que undefined es una palabra clave, no una cadena. # --hints-- diff --git a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/returning-boolean-values-from-functions.md b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/returning-boolean-values-from-functions.md index 400b79963f6574..92009939929623 100644 --- a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/returning-boolean-values-from-functions.md +++ b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/returning-boolean-values-from-functions.md @@ -9,7 +9,7 @@ dashedName: returning-boolean-values-from-functions # --description-- -Podrás recordar que en [Comparación con el operador de igualdad](/learn/javascript-algorithms-and-data-structures/basic-javascript/comparison-with-the-equality-operator) todos los operadores de comparación devuelven un valor booleano `true`, o `false`. +Puede recordar de la comparación con el operador de igualdad que todos los operadores de comparación devuelven un valor booleano `true` o `false`. A veces la gente usa una sentencia `if/else` para hacer una comparación, como esta: diff --git a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/use-recursion-to-create-a-countdown.md b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/use-recursion-to-create-a-countdown.md index 5f6c13ec6d6f02..69acdec7e29c18 100644 --- a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/use-recursion-to-create-a-countdown.md +++ b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/use-recursion-to-create-a-countdown.md @@ -8,7 +8,7 @@ dashedName: use-recursion-to-create-a-countdown # --description-- -En el [desafío anterior](/learn/javascript-algorithms-and-data-structures/basic-javascript/replace-loops-using-recursion), aprendiste como usar la recursión para reemplazar un bucle `for`. Ahora, echemos un vistazo a una función más compleja que devuelve un arreglo de enteros consecutivos empezando con `1` hasta el número pasado a la función. +En un reto anterior, aprendiste a utilizar la recursividad para sustituir un bucle `for`. Ahora, echemos un vistazo a una función más compleja que devuelve un arreglo de enteros consecutivos empezando con `1` hasta el número pasado a la función. Como se menciona en el desafío anterior, habrá un caso base. El caso base le dice a la función recursiva cuando no necesita llamarse a sí misma. Es un caso simple donde el valor de retorno ya se conoce. También habrá una llamada recursiva la cual ejecuta la función original con argumentos diferentes. Si la función se escribe correctamente, eventualmente el caso base será alcanzado. diff --git a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/using-objects-for-lookups.md b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/using-objects-for-lookups.md index 406b15066433f4..cbde8c3c26948c 100644 --- a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/using-objects-for-lookups.md +++ b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/using-objects-for-lookups.md @@ -25,14 +25,14 @@ const alpha = { 26:"A" }; -alpha[2]; -alpha[24]; +const thirdLetter = alpha[2]; +const lastLetter = alpha[24]; const value = 2; -alpha[value]; +const valueLookup = alpha[value]; ``` -`alpha[2]` es la cadena `Y`, `alpha[24]` es la cadena `C`, y `alpha[value]` es la cadena `Y`. +`thirdLetter` es la cadena `Y`, `lastLetter` es la cadena `C`, y `valueLookup` es la cadena `Y`. # --instructions-- diff --git a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/word-blanks.md b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/word-blanks.md index f75493b4e7fd97..c92697ecfe19e5 100644 --- a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/word-blanks.md +++ b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/basic-javascript/word-blanks.md @@ -9,11 +9,9 @@ dashedName: word-blanks # --description-- -Ahora vamos a usar nuestro conocimiento sobre cadenas para construir un juego de palabras estilo "Mad Libs" que llamaremos "Palabras en blanco". Crearás una frase (opcionalmente humorística) del estilo: Rellena los espacios vacíos. +Se te proporcionan oraciones con algunas palabras faltantes, como sustantivos, verbos, adjetivos y adverbios. Luego, completa las piezas que faltan con palabras de tu elección de una manera que la oración completa tenga sentido. -En un juego de "Mad Libs", se te proporcionan oraciones con algunas palabras faltantes, como sustantivos, verbos, adjetivos y adverbios. Luego, rellenas las piezas que faltan con palabras de tu elección de una manera que la frase completa tenga sentido. - -Considera esta oración: It was really **\_\_\_\_**, and we **\_\_\_\_** ourselves **\_\_\_\_**. Esta oración tiene tres piezas faltantes: un adjetivo, un verbo y un adverbio, y podemos añadir palabras de nuestra elección para completarla. A continuación, podemos asignar la oración completa a una variable de la siguiente manera: +Considera esta oración: It was really **\_\_\_\_**, and we **\_\_\_\_** ourselves **\_\_\_\_**. Esta oración tiene tres piezas faltantes: un adjetivo, un verbo y un adverbio, y podemos añadir palabras de nuestra elección para completarla. Luego podemos asignar la oración completa a una variable de la siguiente manera: ```js const sentence = "It was really " + "hot" + ", and we " + "laughed" + " ourselves " + "silly" + "."; @@ -21,9 +19,9 @@ const sentence = "It was really " + "hot" + ", and we " + "laughed" + " ourselve # --instructions-- -En este desafío, te proporcionamos un sustantivo, un verbo, un adjetivo y un adverbio. Necesita formar una oración completa usando palabras de tu elección, junto con las palabras que te proporcionamos. +En este desafío, te proporcionamos un sustantivo, un verbo, un adjetivo y un adverbio. Necesitas formar una oración completa usando palabras de tu elección, junto con las palabras que te proporcionamos. -Necesitarás usar el operador de concatenación de cadenas `+` para construir una nueva cadena, usando las variables proporcionadas: `myNoun`, `myAdjective`, `myVerb`, y `myAdverb`. Luego asignarás la cadena formada a la variable `wordBlanks`. No debes cambiar las palabras asignadas a las variables. +Necesitarás usar el operador de concatenación de cadenas `+` para construir una nueva cadena, usando las variables proporcionadas: `myNoun`, `myAdjective`, `myVerb`, y `myAdverb`. A continuación, asignarás la cadena formada a la variable `wordBlanks`. No debes cambiar las palabras asignadas a las variables. También tendrás que tener en cuenta los espacios en tu cadena, para que la frase final tenga espacios entre todas las palabras. El resultado debe ser una oración completa. @@ -58,7 +56,7 @@ assert( ); ``` -`wordBlanks` debe contener todas las palabras asignadas a las variables `myNoun`, `myVerb`, `myAdjective` y `myAdverb` separados por espacios (y cualquier palabra adicional en tu madlib). +`wordBlanks` debe contener todas las palabras asignadas a las variables `myNoun`, `myVerb`, `myAdjective` y `myAdverb` separadas por espacios (y cualquier palabra adicional a tu elección). ```js assert( diff --git a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/es6/compare-scopes-of-the-var-and-let-keywords.md b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/es6/compare-scopes-of-the-var-and-let-keywords.md index 78dcb12f162093..632e99456f0b4a 100644 --- a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/es6/compare-scopes-of-the-var-and-let-keywords.md +++ b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/es6/compare-scopes-of-the-var-and-let-keywords.md @@ -8,7 +8,7 @@ dashedName: compare-scopes-of-the-var-and-let-keywords # --description-- -Si no estás familiarizado con `let`, echa un vistazo a [este desafío](/learn/javascript-algorithms-and-data-structures/basic-javascript/explore-differences-between-the-var-and-let-keywords). +Si no estás familiarizado con `let`, verifica este desafío sobre la diferencia entre let y var. Cuando declaras una variable con la palabra clave `var`, esta es declarada globalmente o localmente sí es declarada dentro de una función. diff --git a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/es6/mutate-an-array-declared-with-const.md b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/es6/mutate-an-array-declared-with-const.md index 417754363622d6..7eabc5f17e1fa0 100644 --- a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/es6/mutate-an-array-declared-with-const.md +++ b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/es6/mutate-an-array-declared-with-const.md @@ -8,7 +8,7 @@ dashedName: mutate-an-array-declared-with-const # --description-- -Si no estás familiarizado con `const`, echa un vistazo a [este desafío](/learn/javascript-algorithms-and-data-structures/basic-javascript/declare-a-read-only-variable-with-the-const-keyword). +Si no estás familiarizada con `const`, verifica este desafío sobre la palabra clave const. La declaración `const` tiene muchos casos de uso, en el JavaScript moderno. @@ -23,7 +23,7 @@ s[2] = 45; console.log(s); ``` -`s = [1, 2, 3]` resultará en un error. El `console.log` mostrará el valor `[5, 6, 45]`. +`s = [1, 2, 3]` resultará en un error. Después de comentar esa línea, el `console.log` mostrará el valor `[5, 6, 45]`. Como puedes ver, puedes mutar el objeto `[5, 6, 7]` en sí mismo y la variable `s` seguirá apuntado al arreglo alterado `[5, 6, 45]`. Como todos los arreglos, los elementos del arreglo en `s` son mutables, pero debido a que se utilizó `const`, no puedes utilizar el identificador de la variable `s` para apuntar a un arreglo diferente usando el operador de asignación. diff --git a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/arguments-optional.md b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/arguments-optional.md index d63e8887e5ba96..fba7a65a59fb98 100644 --- a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/arguments-optional.md +++ b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/arguments-optional.md @@ -66,6 +66,12 @@ assert.isUndefined(addTogether(2)([3])); assert.isUndefined(addTogether('2', 3)); ``` +`addTogether(5, undefined)` Debería devolver `undefined`. + +```js +assert.isUndefined(addTogether(5, undefined)); +``` + # --seed-- ## --seed-contents-- diff --git a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/dna-pairing.md b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/dna-pairing.md index a4b874b0e18c8a..d9e5c7bb9854fd 100644 --- a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/dna-pairing.md +++ b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/dna-pairing.md @@ -1,14 +1,14 @@ --- id: afd15382cdfb22c9efe8b7de title: Emparejamiento de ADN -challengeType: 5 +challengeType: 1 forumTopicId: 16009 dashedName: dna-pairing --- # --description-- -Los pares de las cadenas de ADN consisten en pares de base de proteínas. Los pares de base son representados por los caracteres AT y CG, que forman bloques de doble hélix ADN. +El par de hebras del ADN esta formado por pares de nucleobases. Los pares de base son representados por los caracteres AT y CG, que forman bloques de doble hélix ADN. A la cadena de ADN le falta el elemento de emparejamiento. Escribe una función que coincida con los pares de base faltantes para la hebra de ADN proporcionada. Para cada carácter de la cadena proporcionada, encuentra el carácter de par base. Devuelve los resultados como un arreglo 2d. diff --git a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/caesars-cipher.md b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/caesars-cipher.md index 9c01b9c0d029b7..0c8ec8d934b3cf 100644 --- a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/caesars-cipher.md +++ b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/caesars-cipher.md @@ -10,9 +10,9 @@ dashedName: caesars-cipher Uno de los cifrados más simples y conocidos es el cifrado César, también conocido como cifrado por desplazamiento. En un cifrado por desplazamiento los significados de las letras se desplazan por una cantidad determinada. -Un uso moderno común es el cifrado [ROT13](https://www.freecodecamp.org/news/how-to-code-the-caesar-cipher-an-introduction-to-basic-encryption-3bf77b4e19f7/), donde los valores de las letras son desplazados por 13 lugares. Así que `A ↔ N`, `B ↔ O` y así sucesivamente. +Un uso moderno común es el cifrado ROT13, donde los valores de las letras son desplazados por 13 lugares. Así que `A ↔ N`, `B ↔ O` y así sucesivamente. -Escribe una función que reciba una cadena codificada en [ROT13](https://www.freecodecamp.org/news/how-to-code-the-caesar-cipher-an-introduction-to-basic-encryption-3bf77b4e19f7/) como entrada y devuelva una cadena decodificada. +Escribe una función que reciba una cadena codificada en ROT13 como entrada y devuelva una cadena decodificada. Todas las letras estarán en mayúsculas. No transformes ningún carácter no alfabético (espacios, puntuación, por ejemplo), pero si transmítelos. diff --git a/curriculum/challenges/espanol/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-25-5-clock.md b/curriculum/challenges/espanol/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-25-5-clock.md index 69bca9bb57e61a..7a4ebb394d2166 100644 --- a/curriculum/challenges/espanol/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-25-5-clock.md +++ b/curriculum/challenges/espanol/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-25-5-clock.md @@ -8,7 +8,7 @@ dashedName: build-a-25--5-clock # --description-- -**Objetivo:** Crear una aplicación que sea funcionalmente similar a . +**Objetivo:** Crea una aplicación que sea funcionalmente similar a esto: https://codepen.io/freeCodeCamp/full/XpKrrW. Completa las historias de usuario a continuación y obtén todas las pruebas para aprobar. Utiliza cualquier librería o API que necesites. Dale tu propio estilo. @@ -70,7 +70,7 @@ Puedes utilizar cualquier combinación de HTML, JavaScript, CSS, Bootstrap, SASS **Historia de usuario #28:** El elemento de audio con id: `beep` dejará de reproducirse y se reiniciará al hacer clic en el elemento con id: `reset`. -Puedes construir tu proyecto con usando esta plantilla CodePen y haciendo clic en `Save` para crear tu propio pen. O puedes utilizar este enlace CDN para ejecutar las pruebas en cualquier entorno que desees: `https://cdn.freecodecamp.org/testable-projects-fcc/v1/bundle.js` +Puedes construir tu proyecto usando esta plantilla CodePen y haciendo clic en `Save` para crear tu propio entorno. O puedes utilizar este enlace CDN para ejecutar las pruebas en cualquier entorno que desees: `https://cdn.freecodecamp.org/testable-projects-fcc/v1/bundle.js` Una vez que hayas terminado, envía la URL de tu proyecto funcional con todas las pruebas pasadas. diff --git a/curriculum/challenges/espanol/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-markdown-previewer.md b/curriculum/challenges/espanol/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-markdown-previewer.md index 9bf759237aa9d0..6bb74e95253a00 100644 --- a/curriculum/challenges/espanol/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-markdown-previewer.md +++ b/curriculum/challenges/espanol/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-markdown-previewer.md @@ -8,7 +8,7 @@ dashedName: build-a-markdown-previewer # --description-- -**Objetivo:** Crear una aplicación que sea funcionalmente similar a . +**Objetivo:** Crea una aplicación con funciones similares a esta: https://codepen.io/freeCodeCamp/full/GrZVVO. Completa las historias de usuario a continuación y obtén todas las pruebas para aprobar. Utiliza cualquier librería o API que necesites. Dale tu propio estilo. @@ -28,7 +28,7 @@ Puedes utilizar cualquier combinación de HTML, JavaScript, CSS, Bootstrap, SASS **Bonus opcional (No necesitas hacer esto para pasar esta prueba):** Mi previsualizador de markdown interpreta los retornos de carro y las renderiza como elementos `br` (salto de línea). -Puedes construir tu proyecto con usando esta plantilla CodePen y haciendo clic en `Save` para crear tu propio pen. O puedes utilizar este enlace CDN para ejecutar las pruebas en cualquier entorno que desees: `https://cdn.freecodecamp.org/testable-projects-fcc/v1/bundle.js` +Puedes crear tu proyecto usando esta plantilla, haciendo clic en `Save` para crear tu propio proyecto CodePen. O puedes utilizar este enlace CDN para ejecutar las pruebas en cualquier entorno que desees: `https://cdn.freecodecamp.org/testable-projects-fcc/v1/bundle.js` Una vez que hayas terminado, envía la URL de tu proyecto funcional con todas las pruebas pasadas. diff --git a/curriculum/challenges/espanol/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-random-quote-machine.md b/curriculum/challenges/espanol/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-random-quote-machine.md index 7b364ddc130a1d..0b7f87e3862e3c 100644 --- a/curriculum/challenges/espanol/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-random-quote-machine.md +++ b/curriculum/challenges/espanol/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-random-quote-machine.md @@ -8,7 +8,7 @@ dashedName: build-a-random-quote-machine # --description-- -**Objetivo:** Crear una aplicación que sea funcionalmente similar a . +**Objetivo:** Crea una aplicación con funciones similares a esta: https://codepen.io/freeCodeCamp/full/qRZeGZ. Completa las historias de usuario a continuación y obtén todas las pruebas para aprobar. Utiliza cualquier librería o API que necesites. Dale tu propio estilo. @@ -36,7 +36,7 @@ Puedes utilizar cualquier combinación de HTML, JavaScript, CSS, Bootstrap, SASS **Historia de usuario #11:** El elemento contenedor `#quote-box` debe estar centrado horizontalmente. Ejecuta las pruebas con el nivel de zoom del navegador al 100% y la página maximizada. -Puedes construir tu proyecto con usando esta plantilla CodePen y haciendo clic en `Save` para crear tu propio pen. O puedes utilizar este enlace CDN para ejecutar las pruebas en cualquier entorno que desees: `https://cdn.freecodecamp.org/testable-projects-fcc/v1/bundle.js` +Puedes construir tu proyecto utilizando esta plantilla CodePen y haciendo clic en `Save` para crear tu propio proyecto CodePen. O puedes utilizar este enlace CDN para ejecutar las pruebas en cualquier entorno que desees: `https://cdn.freecodecamp.org/testable-projects-fcc/v1/bundle.js` Una vez que hayas terminado, envía la URL de tu proyecto funcional con todas las pruebas pasadas. diff --git a/curriculum/challenges/espanol/03-front-end-development-libraries/jquery/change-text-inside-an-element-using-jquery.md b/curriculum/challenges/espanol/03-front-end-development-libraries/jquery/change-text-inside-an-element-using-jquery.md index c98ca7a0936e7c..dfe9a074624998 100644 --- a/curriculum/challenges/espanol/03-front-end-development-libraries/jquery/change-text-inside-an-element-using-jquery.md +++ b/curriculum/challenges/espanol/03-front-end-development-libraries/jquery/change-text-inside-an-element-using-jquery.md @@ -22,7 +22,7 @@ jQuery también tiene una función similar llamada `.text()` que solamente alter Cambia el botón con id `target4` enfatizando su texto. -[ Ve a nuestro artículo sobre <em>](https://www.freecodecamp.org/news/html-elements-explained-what-are-html-tags/#em-element) para aprender la diferencia entre `` y `` y sus usos. +Vea nuestro artículo de noticias para <em> aprender la diferencia entre `` y `` y sus usos. Ten en cuenta que mientras la etiqueta `` tradicionalmente se usaba para enfatizar texto, fue adaptada para ser usada como etiqueta para iconos. La etiqueta `` ahora es ampliamente aceptada como la etiqueta de énfasis. Cualquiera de las dos servirá para este desafío. diff --git a/curriculum/challenges/espanol/03-front-end-development-libraries/react-and-redux/moving-forward-from-here.md b/curriculum/challenges/espanol/03-front-end-development-libraries/react-and-redux/moving-forward-from-here.md index 1fe26eb71beb94..e1deded253c2a1 100644 --- a/curriculum/challenges/espanol/03-front-end-development-libraries/react-and-redux/moving-forward-from-here.md +++ b/curriculum/challenges/espanol/03-front-end-development-libraries/react-and-redux/moving-forward-from-here.md @@ -10,7 +10,7 @@ dashedName: moving-forward-from-here ¡Felicidades! Has terminado las lecciones sobre React y Redux. Hay un último punto que vale la pena señalar antes de seguir adelante. Por lo general, no escribirás aplicaciones React en un editor de código como este. Este desafío te da una idea de cómo es la sintaxis si trabajas con npm y un sistema de archivos en tu propia máquina. El código debería ser similar, excepto por el uso de las sentencias `import` (éstas traen todas las dependencias que se te han proporcionado en los desafíos). La sección "Gestión de paquetes con npm" cubre npm con más detalle. -Por último, escribir código React y Redux generalmente requiere cierta configuración. Esto puede complicarse rápidamente. Si te interesa experimentar en tu propia máquina, Create React App viene configurado y listo para funcionar. +Por último, escribir código React y Redux generalmente requiere cierta configuración. Esto puede complicarse rápidamente. Si te interesa experimentar en tu propia máquina, Create React App viene configurado y listo para funcionar. Alternativamente, puedes habilitar Babel como un preprocesador de JavaScript en CodePen, añadir React y ReactDOM como recursos externos de JavaScript, y trabajar allí también. diff --git a/curriculum/challenges/espanol/03-front-end-development-libraries/react/create-a-stateful-component.md b/curriculum/challenges/espanol/03-front-end-development-libraries/react/create-a-stateful-component.md index 9d1e65f39ececf..4f396acbc9a23d 100644 --- a/curriculum/challenges/espanol/03-front-end-development-libraries/react/create-a-stateful-component.md +++ b/curriculum/challenges/espanol/03-front-end-development-libraries/react/create-a-stateful-component.md @@ -22,7 +22,7 @@ Tienes acceso al objeto `state` a lo largo de la vida de tu componente. Puedes a # --instructions-- -Hay un componente en el editor de código que está intentando renderizar una propiedad `name` desde su `state`. Sin embargo, no hay ningún `state` definido. Inicializa el componente con `state` en el `constructor` y asigna tu nombre a una propiedad de `name`. +Hay un componente en el editor de código que está intentando renderizar una propiedad `firstName` desde su `state`. Sin embargo, no hay ningún `state` definido. Inicia el componente con `state` en el `constructor` y asigna tu nombre a la propiedad`firstName`. # --hints-- @@ -55,7 +55,7 @@ assert( ); ``` -El estado de `StatefulComponent` debe inicializarse con una propiedad `name` establecida a una cadena. +El estado de `StatefulComponent` debe iniciarse con la propiedad`firstName` establecida como un "string". ```js assert( @@ -65,13 +65,13 @@ assert( ); const initialState = mockedComponent.state(); return ( - typeof initialState === 'object' && typeof initialState.name === 'string' + typeof initialState === 'object' && typeof initialState.firstName === 'string' ); })() ); ``` -La propiedad `name` en el estado de `StatefulComponent` debe renderizarse en el elemento `h1`. +La propiedad `firstName` en el estado `StatefulComponent` debe renderizar en el elemento `h1`. ```js assert( @@ -80,7 +80,7 @@ assert( React.createElement(StatefulComponent) ); const initialState = mockedComponent.state(); - return mockedComponent.find('h1').text() === initialState.name; + return mockedComponent.find('h1').text() === initialState.firstName; })() ); ``` @@ -106,7 +106,7 @@ class StatefulComponent extends React.Component { render() { return (
    -

    {this.state.name}

    +

    {this.state.firstName}

    ); } @@ -120,13 +120,13 @@ class StatefulComponent extends React.Component { constructor(props) { super(props); this.state = { - name: 'freeCodeCamp!' + firstName: 'freeCodeCamp!' } } render() { return (
    -

    {this.state.name}

    +

    {this.state.firstName}

    ); } diff --git a/curriculum/challenges/espanol/03-front-end-development-libraries/react/introducing-inline-styles.md b/curriculum/challenges/espanol/03-front-end-development-libraries/react/introducing-inline-styles.md index a3bf96e7aa6b32..32de7ccc214127 100644 --- a/curriculum/challenges/espanol/03-front-end-development-libraries/react/introducing-inline-styles.md +++ b/curriculum/challenges/espanol/03-front-end-development-libraries/react/introducing-inline-styles.md @@ -8,7 +8,7 @@ dashedName: introducing-inline-styles # --description-- -Hay otros conceptos complejos que añaden poderosas capacidades a tu código de React. Pero tal vez te estés preguntando sobre el problema más sencillo de cómo dar estilo a esos elementos JSX que creas en React. Probablemente sepas que no será exactamente lo mismo que trabajar con HTML debido a [la manera en que aplicas clases a los elementos JSX](/learn/front-end-development-libraries/react/define-an-html-class-in-jsx). +Hay otros conceptos complejos que añaden poderosas capacidades a tu código de React. Pero tal vez te estés preguntando sobre el problema más sencillo de cómo dar estilo a esos elementos JSX que creas en React. Probablemente sepas que no será exactamente lo mismo que trabajar con HTML debido a la manera en que aplicas clases a los elementos JSX. Si importas estilos desde una hoja de estilos, esto no es muy diferente. Aplica una clase a tu elemento JSX usando el atributo `className`, y aplica estilos a la clase en tu hoja de estilos. Otra opción es aplicar estilos en línea, los cuales son muy comunes en el desarrollo de ReactJS. diff --git a/curriculum/challenges/espanol/03-front-end-development-libraries/react/render-conditionally-from-props.md b/curriculum/challenges/espanol/03-front-end-development-libraries/react/render-conditionally-from-props.md index 904b80a1bcc6d7..f724c4cd2b2865 100644 --- a/curriculum/challenges/espanol/03-front-end-development-libraries/react/render-conditionally-from-props.md +++ b/curriculum/challenges/espanol/03-front-end-development-libraries/react/render-conditionally-from-props.md @@ -123,7 +123,7 @@ Cada vez que se hace clic en el botón, el contador debe incrementarse por un va })(); ``` -Cuando el componente `GameOfChance` se monta por primera vez en el DOM y cada vez que se hace clic en el botón, un solo elemento `h1` debe ser devuelto, el cual renderiza aleatoriamente `You Win!` o `You Lose!`. +Cuando el componente `GameOfChance` se monta primero en el DOM y cada vez que se hace clic en el botón a partir de entonces, un solo `h1` debe devolverse un elemento que represente aleatoriamente `You Win!` o `You Lose!`. Nota: esto puede fallar aleatoriamente. Si eso sucede, inténtalo de nuevo. ```js (() => { @@ -265,6 +265,11 @@ class GameOfChance extends React.Component { # --solutions-- ```jsx +// We want this to be deterministic for testing purposes. +const randomSequence = [true, false, false, true, true, false, false, true, true, false]; +let index = 0; +const fiftyFifty = () => randomSequence[index++ % randomSequence.length]; + class Results extends React.Component { constructor(props) { super(props); @@ -290,11 +295,10 @@ class GameOfChance extends React.Component { }); } render() { - const expression = Math.random() >= 0.5; return (
    - +

    {'Turn: ' + this.state.counter}

    ); diff --git a/curriculum/challenges/espanol/03-front-end-development-libraries/react/set-state-with-this.setstate.md b/curriculum/challenges/espanol/03-front-end-development-libraries/react/set-state-with-this.setstate.md index dc6ceabf44b3dc..6c4139a69f8ca8 100644 --- a/curriculum/challenges/espanol/03-front-end-development-libraries/react/set-state-with-this.setstate.md +++ b/curriculum/challenges/espanol/03-front-end-development-libraries/react/set-state-with-this.setstate.md @@ -16,7 +16,7 @@ this.setState({ }); ``` -React espera que nunca modifiques `state` directamente. En su lugar, siempre usa `this.setState()` cuando ocurran cambios de estado. Además, ten en cuenta que React puede agrupar múltiples actualizaciones de estado con el fin de mejorar el rendimiento. Esto significa que las actualizaciones de estado a través del método `setState` pueden ser asíncronas. Existe una sintaxis alternativa para el método `setState` que proporciona una forma de evitar ese problema. Esto es raramente necesario, ¡pero es bueno tenerlo en cuenta! Por favor, consulta la [documentación de React](https://reactjs.org/docs/state-and-lifecycle.html#state-updates-may-be-asynchronous) para más información. +React espera que nunca modifiques `state` directamente. En su lugar, siempre usa `this.setState()` cuando ocurran cambios de estado. Además, ten en cuenta que React puede agrupar múltiples actualizaciones de estado con el fin de mejorar el rendimiento. Esto significa que las actualizaciones de estado a través del método `setState` pueden ser asíncronas. Existe una sintaxis alternativa para el método `setState` que proporciona una forma de evitar ese problema. Esto es raramente necesario, ¡pero es bueno tenerlo en cuenta! Por favor, consulte la documentación de React para más información. # --instructions-- diff --git a/curriculum/challenges/espanol/03-front-end-development-libraries/react/use-array.map-to-dynamically-render-elements.md b/curriculum/challenges/espanol/03-front-end-development-libraries/react/use-array.map-to-dynamically-render-elements.md index 74b6e13ef34a10..ebe68545138743 100644 --- a/curriculum/challenges/espanol/03-front-end-development-libraries/react/use-array.map-to-dynamically-render-elements.md +++ b/curriculum/challenges/espanol/03-front-end-development-libraries/react/use-array.map-to-dynamically-render-elements.md @@ -16,7 +16,7 @@ Por ejemplo, crea una aplicación simple "To Do List". Como programador, no tien El editor de código tiene la mayoría del componente `MyToDoList` configurado. Parte de este código debería parecer familiar si completaste el desafío de formulario controlado. Vas a notar un `textarea` y un `button`, junto con un par de métodos que rastrean sus estados, pero aún no se muestra nada a la página. -Dentro del `constructor`, crea un objeto `this.state` y define dos estados: `userInput` que debe inicializarse como una cadena vacía, y `toDoList` que debe inicializarse como un arreglo vacío. Luego, elimina el comentario junto a la variable `items` del método `render()`. En su lugar, utiliza la función map() para recorrer el arreglo `toDoList` almacenado en el estado interno del componente y renderizar un `li` por cada artículo. Intenta introducir la cadena `eat, code, sleep, repeat` dentro del `textarea`, haz clic en el botón y ve qué sucede. +Dentro del `constructor`, crea un objeto `this.state` y define dos estados: `userInput` que debe inicializarse como una cadena vacía, y `toDoList` que debe inicializarse como un arreglo vacío. Luego, elimina el valor `null` del método `render()` a un costado de la variable `items`. En su lugar, utiliza la función map() para recorrer el arreglo `toDoList` almacenado en el estado interno del componente y renderizar un `li` por cada artículo. Intenta introducir la cadena `eat, code, sleep, repeat` dentro del `textarea`, haz clic en el botón y ve qué sucede. **Nota:** Puede que sepas que todos los elementos hijos hermanos creados por una operación map como ésta necesitan poseer un atributo `key` único. No te preocupes, este es el tema de nuestro próximo desafío. diff --git a/curriculum/challenges/espanol/03-front-end-development-libraries/react/use-proptypes-to-define-the-props-you-expect.md b/curriculum/challenges/espanol/03-front-end-development-libraries/react/use-proptypes-to-define-the-props-you-expect.md index edc42096c08ccf..cbbd520c1fbdb8 100644 --- a/curriculum/challenges/espanol/03-front-end-development-libraries/react/use-proptypes-to-define-the-props-you-expect.md +++ b/curriculum/challenges/espanol/03-front-end-development-libraries/react/use-proptypes-to-define-the-props-you-expect.md @@ -16,7 +16,7 @@ Se considera una muy buena práctica definir los `propTypes` cuando conoces el t MyComponent.propTypes = { handleClick: PropTypes.func.isRequired } ``` -En el ejemplo anterior, la parte de `PropTypes.func` verifica que `handleClick` es una función. Añadir `isRequired` le dice a React que `handleClick` es una propiedad obligatoria para ese componente. Verás una advertencia si no se proporciona esa propiedad. También ten en cuenta que `func` representa `function`. Entre los siete tipos primitivos de JavaScript, `function` y `boolean` (escrito como `bool`) son los únicos dos que utilizan ortografía diferente. Además de los tipos primitivos, hay otros tipos disponibles. Por ejemplo, puedes validar si una prop es un elemento React. Por favor, consulta la [documentación](https://reactjs.org/docs/typechecking-with-proptypes.html#proptypes) para todas las opciones. +En el ejemplo anterior, la parte de `PropTypes.func` verifica que `handleClick` es una función. Añadir `isRequired` le dice a React que `handleClick` es una propiedad obligatoria para ese componente. Verás una advertencia si no se proporciona esa propiedad. También ten en cuenta que `func` representa `function`. Entre los siete tipos primitivos de JavaScript, `function` y `boolean` (escrito como `bool`) son los únicos dos que utilizan ortografía diferente. Además de los tipos primitivos, hay otros tipos disponibles. Por ejemplo, puedes validar si una prop es un elemento React. Por favor, consulta la documentación para todas las opciones. **Nota:** A partir de React v15.5.0, `PropTypes` se importa de manera independiente de React, así: `import PropTypes from 'prop-types';` diff --git a/curriculum/challenges/espanol/03-front-end-development-libraries/react/use-the-lifecycle-method-componentwillmount.md b/curriculum/challenges/espanol/03-front-end-development-libraries/react/use-the-lifecycle-method-componentwillmount.md index 18ba5d33d84d7c..8537bf937df862 100644 --- a/curriculum/challenges/espanol/03-front-end-development-libraries/react/use-the-lifecycle-method-componentwillmount.md +++ b/curriculum/challenges/espanol/03-front-end-development-libraries/react/use-the-lifecycle-method-componentwillmount.md @@ -10,7 +10,7 @@ dashedName: use-the-lifecycle-method-componentwillmount Los componentes React tienen varios métodos especiales que proporcionan oportunidades para realizar acciones en puntos específicos en el ciclo de vida de un componente. Estos se llaman métodos de ciclo de vida, o interceptores (hooks) de ciclo de vida, y te permiten interceptar componentes en determinados momentos del tiempo. Esto puede ser antes de que se rendericen, antes de que se actualicen, antes de que reciban las props, antes de que se desmonten, etc. Aquí hay una lista de algunos de los métodos principales del ciclo de vida: `componentWillMount()` `componentDidMount()` `shouldComponentUpdate()` `componentDidUpdate()` `componentWillUnmount()`. Las siguientes lecciones cubrirán algunos de los casos de uso básicos para estos métodos del ciclo de vida. -**Nota:** El método de ciclo de vida `componentWillMount` se desaprobará en una versión futura de 16.X y se eliminará en la versión 17. [(Fuente)](https://reactjs.org/blog/2018/03/27/update-on-async-rendering.html) +**Nota:** El método de ciclo de vida `componentWillMount` se desaprobará en una versión futura de 16.X y se eliminará en la versión 17. Más información en este artículo # --instructions-- diff --git a/curriculum/challenges/espanol/03-front-end-development-libraries/redux/create-a-redux-store.md b/curriculum/challenges/espanol/03-front-end-development-libraries/redux/create-a-redux-store.md index 43fcc0276deaec..ba52aafb00c6f4 100644 --- a/curriculum/challenges/espanol/03-front-end-development-libraries/redux/create-a-redux-store.md +++ b/curriculum/challenges/espanol/03-front-end-development-libraries/redux/create-a-redux-store.md @@ -20,7 +20,7 @@ El `store` (almacén) de Redux es un objeto que guarda y gestiona el `state` (es Declara una variable `store` y asígnala al método `createStore()`, pasando el `reducer` como argumento. -**Nota:** El código del editor utiliza la sintaxis de los argumentos por defecto de ES6 para inicializar este estado y mantener un valor de `5`. Si no estás familiarizado con los argumentos por defecto, puedes consultar la sección [ES6 en el Plan de Estudios](https://learn.freecodecamp.org/javascript-algorithms-and-data-structures/es6/set-default-parameters-for-your-functions) que cubre este tema. +**Nota:** El código del editor utiliza la sintaxis de los argumentos por defecto de ES6 para inicializar este estado y mantener un valor de `5`. Si no está familiarizado con los argumentos predeterminados, puede consultar elES6 section in the Curriculum que cubre este tema. # --hints-- diff --git a/curriculum/challenges/espanol/05-back-end-development-and-apis/back-end-development-and-apis-projects/exercise-tracker.md b/curriculum/challenges/espanol/05-back-end-development-and-apis/back-end-development-and-apis-projects/exercise-tracker.md index 5122a09bd2e92a..8b068dfa9ed512 100644 --- a/curriculum/challenges/espanol/05-back-end-development-and-apis/back-end-development-and-apis-projects/exercise-tracker.md +++ b/curriculum/challenges/espanol/05-back-end-development-and-apis/back-end-development-and-apis-projects/exercise-tracker.md @@ -8,10 +8,10 @@ dashedName: exercise-tracker # --description-- -Construye una aplicación full stack de JavaScript que sea funcionalmente similar a esta: . Trabajar en este proyecto implicará escribir tu código utilizando uno de los siguientes métodos: +Crea una aplicación full stack de JavaScript que sea funcionalmente similar a esta: https://exercise-tracker.freecodecamp.rocks/. Trabajar en este proyecto implicará escribir tu código utilizando uno de los siguientes métodos: -- Clona [este repositorio de GitHub](https://github.com/freeCodeCamp/boilerplate-project-exercisetracker/) y completa tu proyecto localmente. -- Usa [nuestro proyecto de inicio en Replit](https://replit.com/github/freeCodeCamp/boilerplate-project-exercisetracker) para completar tu proyecto. +- Clone este repositorio de GitHub y complete estos desafíos localmente. +- Usa este proyecto inicial de Replit para completar tu proyecto. - Utiliza un constructor de sitios de tu elección para completar el proyecto. Asegúrate de incorporar todos los archivos de nuestro repositorio de GitHub. Cuando hayas terminado, asegúrate de que un demo funcional de tu proyecto esté alojado en algún lugar público. Luego, envía la URL en el campo `Solution Link`. Opcionalmente, también envía un enlace al código fuente de tu proyecto en el campo `GitHub Link`. @@ -309,7 +309,7 @@ async (getUserInput) => { }; ``` -Una solicitud `GET` a `/api/users/:id/logs` devolverá el objeto de usuario con un arreglo `log` de todos los ejercicios añadidos. +Una solicitud `GET` a `/api/users/:_id/logs` devolverá el objeto de usuario con un arreglo `log` de todos los ejercicios añadidos. ```js async(getUserInput) => { @@ -353,7 +353,7 @@ async(getUserInput) => { }; ``` -Cada elemento en el arreglo `log` que es devuelto desde `GET /api/users/:id/logs` es un objeto que debe tener las propiedades `description`, `duration` y `date`. +Cada elemento en el arreglo `log` que es devuelto desde `GET /api/users/:_id/logs` es un objeto que debe tener las propiedades `description`, `duration` y `date`. ```js async(getUserInput) => { @@ -400,7 +400,7 @@ async(getUserInput) => { }; ``` -La propiedad `description` de cualquier objeto en el arreglo `log` que es devuelto desde `GET /api/users/:id/logs` debe ser una cadena. +La propiedad `description` de cualquier objeto en el arreglo `log` que es devuelto desde `GET /api/users/:_id/logs` debe ser una cadena. ```js async(getUserInput) => { @@ -447,7 +447,7 @@ async(getUserInput) => { }; ``` -La propiedad `duration` de cualquier objeto en el arreglo `log` que es devuelto desde `GET /api/users/:id/logs` debe ser un número. +La propiedad `duration` de cualquier objeto en el arreglo `log` que es devuelto desde `GET /api/users/:_id/logs` debe ser un número. ```js async(getUserInput) => { @@ -494,7 +494,7 @@ async(getUserInput) => { }; ``` -La propiedad `date` de cualquier objeto en el arrelgo `log` que es devuelto desde `GET /api/users/:id/logs` debe ser una cadena.. Utiliza el formato `dateString` de la API `Date`. +La propiedad `date` de cualquier objeto en el arrelgo `log` que es devuelto desde `GET /api/users/:_id/logs` debe ser una cadena. Utiliza el formato `dateString` de la API `Date`. ```js async(getUserInput) => { diff --git a/curriculum/challenges/espanol/05-back-end-development-and-apis/back-end-development-and-apis-projects/file-metadata-microservice.md b/curriculum/challenges/espanol/05-back-end-development-and-apis/back-end-development-and-apis-projects/file-metadata-microservice.md index 1e8106fea8c5ff..8f411ff3d6db7b 100644 --- a/curriculum/challenges/espanol/05-back-end-development-and-apis/back-end-development-and-apis-projects/file-metadata-microservice.md +++ b/curriculum/challenges/espanol/05-back-end-development-and-apis/back-end-development-and-apis-projects/file-metadata-microservice.md @@ -8,10 +8,10 @@ dashedName: file-metadata-microservice # --description-- -Construye una aplicación full stack de JavaScript que sea funcionalmente similar a esta: . Trabajar en este proyecto implicará escribir tu código utilizando uno de los siguientes métodos: +Crea una aplicación full stack de JavaScript que sea funcionalmente similar a esta: https://file-metadata-microservice.freecodecamp.rocks/. Trabajar en este proyecto implicará escribir tu código utilizando uno de los siguientes métodos: -- Clona [este repositorio de GitHub](https://github.com/freeCodeCamp/boilerplate-project-filemetadata/) y completa tu proyecto localmente. -- Usa [nuestro proyecto de inicio en Replit](https://replit.com/github/freeCodeCamp/boilerplate-project-filemetadata) para completar tu proyecto. +- Clone este repositorio de GitHub y complete estos desafíos localmente. +- Usa este proyecto inicial de Replit para completar tu proyecto. - Utiliza un constructor de sitios de tu elección para completar el proyecto. Asegúrate de incorporar todos los archivos de nuestro repositorio de GitHub. Cuando hayas terminado, asegúrate de que un demo funcional de tu proyecto esté alojado en algún lugar público. Luego, envía la URL en el campo `Solution Link`. Opcionalmente, también envía un enlace al código fuente de tu proyecto en el campo `GitHub Link`. diff --git a/curriculum/challenges/espanol/05-back-end-development-and-apis/back-end-development-and-apis-projects/request-header-parser-microservice.md b/curriculum/challenges/espanol/05-back-end-development-and-apis/back-end-development-and-apis-projects/request-header-parser-microservice.md index 38c4fca9bfa77d..78c0b8071709e1 100644 --- a/curriculum/challenges/espanol/05-back-end-development-and-apis/back-end-development-and-apis-projects/request-header-parser-microservice.md +++ b/curriculum/challenges/espanol/05-back-end-development-and-apis/back-end-development-and-apis-projects/request-header-parser-microservice.md @@ -8,10 +8,10 @@ dashedName: request-header-parser-microservice # --description-- -Construye una aplicación full stack de JavaScript que sea funcionalmente similar a esta: . Trabajar en este proyecto implicará escribir tu código utilizando uno de los siguientes métodos: +Crea una aplicación full stack de JavaScript que sea funcionalmente similar a esta: https://request-header-parser-microservice.freecodecamp.rocks/. Trabajar en este proyecto implicará escribir tu código utilizando uno de los siguientes métodos: -- Clona [este repositorio de GitHub](https://github.com/freeCodeCamp/boilerplate-project-headerparser/) y completa tu proyecto localmente. -- Usa [nuestro proyecto de inicio en Replit](https://replit.com/github/freeCodeCamp/boilerplate-project-headerparser) para completar tu proyecto. +- Clone este repositorio de GitHub y complete estos desafíos localmente. +- Usa este proyecto inicial de Replit para completar tu proyecto. - Utiliza un constructor de sitios de tu elección para completar el proyecto. Asegúrate de incorporar todos los archivos de nuestro repositorio de GitHub. Cuando hayas terminado, asegúrate de que un demo funcional de tu proyecto esté alojado en algún lugar público. Luego, envía la URL en el campo `Solution Link`. Opcionalmente, también envía un enlace al código fuente de tu proyecto en el campo `GitHub Link`. diff --git a/curriculum/challenges/espanol/05-back-end-development-and-apis/back-end-development-and-apis-projects/timestamp-microservice.md b/curriculum/challenges/espanol/05-back-end-development-and-apis/back-end-development-and-apis-projects/timestamp-microservice.md index d5fb065f4ad7ad..ce41efce5ee890 100644 --- a/curriculum/challenges/espanol/05-back-end-development-and-apis/back-end-development-and-apis-projects/timestamp-microservice.md +++ b/curriculum/challenges/espanol/05-back-end-development-and-apis/back-end-development-and-apis-projects/timestamp-microservice.md @@ -8,10 +8,10 @@ dashedName: timestamp-microservice # --description-- -Construye una aplicación full stack de JavaScript que sea funcionalmente similar a esta: . Trabajar en este proyecto implicará escribir tu código utilizando uno de los siguientes métodos: +Crea una aplicación full stack de JavaScript que sea funcionalmente similar a esta: https://timestamp-microservice.freecodecamp.rocks/. Trabajar en este proyecto implicará escribir tu código utilizando uno de los siguientes métodos: -- Clona [este repositorio de GitHub](https://github.com/freeCodeCamp/boilerplate-project-timestamp/) y completa tu proyecto localmente. -- Usa [nuestro proyecto de inicio en Replit](https://replit.com/github/freeCodeCamp/boilerplate-project-timestamp) para completar tu proyecto. +- Clone este repositorio de GitHub y complete estos desafíos localmente. +- Usa este proyecto inicial de Replit para completar tu proyecto. - Utiliza un constructor de sitios de tu elección para completar el proyecto. Asegúrate de incorporar todos los archivos de nuestro repositorio de GitHub. Cuando hayas terminado, asegúrate de que un demo funcional de tu proyecto esté alojado en algún lugar público. Luego, envía la URL en el campo `Solution Link`. Opcionalmente, también envía un enlace al código fuente de tu proyecto en el campo `GitHub Link`. diff --git a/curriculum/challenges/espanol/05-back-end-development-and-apis/back-end-development-and-apis-projects/url-shortener-microservice.md b/curriculum/challenges/espanol/05-back-end-development-and-apis/back-end-development-and-apis-projects/url-shortener-microservice.md index 69c796ebe9891b..dea295ac24de1b 100644 --- a/curriculum/challenges/espanol/05-back-end-development-and-apis/back-end-development-and-apis-projects/url-shortener-microservice.md +++ b/curriculum/challenges/espanol/05-back-end-development-and-apis/back-end-development-and-apis-projects/url-shortener-microservice.md @@ -8,10 +8,10 @@ dashedName: url-shortener-microservice # --description-- -Construye una aplicación full stack de JavaScript que sea funcionalmente similar a esta: . Trabajar en este proyecto implicará escribir tu código utilizando uno de los siguientes métodos: +Crea una aplicación full stack de JavaScript que sea funcionalmente similar a esta: https://url-shortener-microservice.freecodecamp.rocks/. Trabajar en este proyecto implicará escribir tu código utilizando uno de los siguientes métodos: -- Clona [este repositorio de GitHub](https://github.com/freeCodeCamp/boilerplate-project-urlshortener/) y completa tu proyecto localmente. -- Usa [nuestro proyecto de inicio en Replit](https://replit.com/github/freeCodeCamp/boilerplate-project-urlshortener) para completar tu proyecto. +- Clone este repositorio de GitHub y complete estos desafíos localmente. +- Usa este proyecto inicial de Replit para completar tu proyecto. - Utiliza un constructor de sitios de tu elección para completar el proyecto. Asegúrate de incorporar todos los archivos de nuestro repositorio de GitHub. Cuando hayas terminado, asegúrate de que un demo funcional de tu proyecto esté alojado en algún lugar público. Luego, envía la URL en el campo `Solution Link`. Opcionalmente, también envía un enlace al código fuente de tu proyecto en el campo `GitHub Link`. diff --git a/curriculum/challenges/espanol/05-back-end-development-and-apis/basic-node-and-express/chain-middleware-to-create-a-time-server.md b/curriculum/challenges/espanol/05-back-end-development-and-apis/basic-node-and-express/chain-middleware-to-create-a-time-server.md index 4f93504b3350cb..13aa836495fadc 100644 --- a/curriculum/challenges/espanol/05-back-end-development-and-apis/basic-node-and-express/chain-middleware-to-create-a-time-server.md +++ b/curriculum/challenges/espanol/05-back-end-development-and-apis/basic-node-and-express/chain-middleware-to-create-a-time-server.md @@ -8,7 +8,7 @@ dashedName: chain-middleware-to-create-a-time-server # --description-- -Un middleware se puede montar en una ruta especifica usando `app.METHOD(path, middlewareFunction)`. El middleware también se puede encadenar dentro de la definición de la ruta. +Un middleware se puede montar en una ruta especifica usando `app.METHOD(path, middlewareFunction)`. El middleware también se puede encadenar dentro de una definición de ruta. Veamos el siguiente ejemplo: @@ -49,7 +49,7 @@ El endpoint /now debe tener el middleware montado ); ``` -El endpoint /now debe devolver un tiempo que es +/- 20 segundos a partir de este momento +El endpoint `/now` debe devolver la hora actual. ```js (getUserInput) => diff --git a/curriculum/challenges/espanol/05-back-end-development-and-apis/basic-node-and-express/meet-the-node-console.md b/curriculum/challenges/espanol/05-back-end-development-and-apis/basic-node-and-express/meet-the-node-console.md index b33200dade16a0..60ff2d4ceb7fb1 100644 --- a/curriculum/challenges/espanol/05-back-end-development-and-apis/basic-node-and-express/meet-the-node-console.md +++ b/curriculum/challenges/espanol/05-back-end-development-and-apis/basic-node-and-express/meet-the-node-console.md @@ -10,8 +10,8 @@ dashedName: meet-the-node-console Trabajar en estos desafíos implica escribir tu código usando uno de los siguientes métodos: -- Clona [este repositorio de GitHub](https://github.com/freeCodeCamp/boilerplate-express/) y completa estos desafíos localmente. -- Usa [nuestro proyecto inicial de Replit](https://replit.com/github/freeCodeCamp/boilerplate-express) para completar estos desafíos. +- Clone este repositorio de GitHub y complete estos desafíos localmente. +- Usa nuestro proyecto de inicio Replit para completar estos desafíos. - Utiliza un constructor de sitios de tu elección para completar el proyecto. Asegúrate de incorporar todos los archivos de nuestro repositorio de GitHub. Cuando hayas terminado, asegúrate de que un demo funcional de tu proyecto esté alojado en algún lugar público. A continuación, envía la URL en el campo `Solution Link`. diff --git a/curriculum/challenges/espanol/05-back-end-development-and-apis/basic-node-and-express/use-body-parser-to-parse-post-requests.md b/curriculum/challenges/espanol/05-back-end-development-and-apis/basic-node-and-express/use-body-parser-to-parse-post-requests.md index 9008541c06c059..6a8d2075ac48b4 100644 --- a/curriculum/challenges/espanol/05-back-end-development-and-apis/basic-node-and-express/use-body-parser-to-parse-post-requests.md +++ b/curriculum/challenges/espanol/05-back-end-development-and-apis/basic-node-and-express/use-body-parser-to-parse-post-requests.md @@ -22,11 +22,11 @@ Content-Length: 20 name=John+Doe&age=25 ``` -Como puedes ver, el cuerpo está codificado como la cadena de consulta. Este es el formato por defecto utilizado por los formularios HTML. Con Ajax, también puedes utilizar JSON para manejar datos con una estructura más compleja. También hay otro tipo de codificación: multiparte/form-data. Este se utiliza para subir archivos binarios. En este ejercicio, usarás un cuerpo urlencoded. Para analizar los datos provenientes de peticiones POST, tienes que instalar el paquete `body-parser`. Este paquete te permite usar una serie de middleware, que pueden decodificar datos en diferentes formatos. +Como puedes ver, el cuerpo está codificado como la cadena de consulta. Este es el formato por defecto utilizado por los formularios HTML. Con Ajax, también puedes utilizar JSON para manejar datos con una estructura más compleja. También hay otro tipo de codificación: multiparte/form-data. Este se utiliza para subir archivos binarios. En este ejercicio, usarás un cuerpo codificado por URL. Para analizar los datos provenientes de peticiones POST, tendrás que usar el paquete `body-parser`. Este paquete te permite usar una serie de middleware, que pueden decodificar datos en diferentes formatos. # --instructions-- -Instala el módulo `body-parser` en tu `package.json`. Luego, agrega `require` en la parte superior del archivo con el nuevo módulo. Almacénelo en una variable llamada `bodyParser`. El middleware para manejar datos urlencoded es devuelto por `bodyParser.urlencoded({extended: false})`. Pasa la función devuelta por el método anterior llamada a `app.use()`. Como de costumbre, el middleware debe ser montado antes de todas las rutas que dependen de él. +`body-parser` ya ha sido instalado y está en el archivo `package.json` de tu proyecto. Usa `require` en la parte superior del archivo `myApp.js` y almacena los resultados en una variable llamada `bodyParser`. El middleware para manejar datos codificados por URL es devuelto por `bodyParser.urlencoded({extended: false})`. Pasa la función devuelta por la llamada al método anterior a `app.use()`. Como de costumbre, el middleware debe ser montado antes de todas las rutas que dependen de él. **Nota:** `extended` es una opción de configuración que le dice a `body-parser` qué análisis necesita ser usado. Cuando `extended=false`, utiliza la biblioteca `querystring` de codificación clásica. Cuando `extended=true` utiliza la biblioteca `qs` para analizar la sintaxis. diff --git a/curriculum/challenges/espanol/05-back-end-development-and-apis/basic-node-and-express/use-the-.env-file.md b/curriculum/challenges/espanol/05-back-end-development-and-apis/basic-node-and-express/use-the-.env-file.md index 12f586e435ead5..f5f20a9a65b3d6 100644 --- a/curriculum/challenges/espanol/05-back-end-development-and-apis/basic-node-and-express/use-the-.env-file.md +++ b/curriculum/challenges/espanol/05-back-end-development-and-apis/basic-node-and-express/use-the-.env-file.md @@ -18,11 +18,11 @@ Añadamos una variable de entorno como opción de configuración. Crea un archivo `.env` en la raíz del directorio de tu proyecto y almacena la variable `MESSAGE_STYLE=uppercase` en él. -Luego, en el manejador de rutas `/json` GET creado en el último desafío, transforma el mensaje del objeto de respuesta a mayúsculas si `process.env.MESSAGE_STYLE` es igual a `uppercase`. El objeto de respuesta debe ser `{"message": "Hello json"}` o `{"message": "HELLO JSON"}`, dependiendo del valor `MESSAGE_STYLE`. +Luego, en el manejador `/json` GET route que creaste en el último ejercicio accede a `process.env.MESSAGE_STYLE` y transformar el `message` del objeto de respuesta a mayúsculas si la variable es igual a `uppercase`. El objeto de respuesta debe ser `{"message": "Hello json"}` o `{"message": "HELLO JSON"}`, dependiendo del valor `MESSAGE_STYLE`. **Nota:** Si estás usando Replit, no puedes crear un archivo `.env`. En su lugar, utiliza la pestaña integrada SECRETS para añadir la variable. -Si estás trabajando localmente, necesitarás el paquete `dotenv`. Carga variables de entorno desde tu archivo `.env` en `process.env`. Instálalo con `npm install dotenv`. Luego, en la parte superior de tu archivo `myApp.js`, importa y carga las variables con `require('dotenv').config()`. +Si estás trabajando localmente, necesitarás el paquete `dotenv`. Carga variables de entorno desde tu archivo `.env` en `process.env`. El paquete `dotenv` se a instalado, y se aguardado en tu archivo `package.json` dentro del proyecto. Arriba de tu archivo `myApp.js`, importa y carga las variables con `require('dotenv').config()`. # --hints-- diff --git a/curriculum/challenges/espanol/05-back-end-development-and-apis/managing-packages-with-npm/expand-your-project-with-external-packages-from-npm.md b/curriculum/challenges/espanol/05-back-end-development-and-apis/managing-packages-with-npm/expand-your-project-with-external-packages-from-npm.md index 24082571fc6da7..0163622f22384e 100644 --- a/curriculum/challenges/espanol/05-back-end-development-and-apis/managing-packages-with-npm/expand-your-project-with-external-packages-from-npm.md +++ b/curriculum/challenges/espanol/05-back-end-development-and-apis/managing-packages-with-npm/expand-your-project-with-external-packages-from-npm.md @@ -22,13 +22,13 @@ En esta sección, los paquetes que tu proyecto necesita se almacenan usando el s # --instructions-- -Añade la versión "2.14.0" del paquete "moment" al campo `dependencies` del archivo package.json. +Añade la versión "1.1.0" del paquete `@freecodecamp/example` al campo `dependencies` del archivo `package.json`. -**Nota:** Moment es una biblioteca muy útil para trabajar con tiempo y fechas. +**Nota:** `@freecodecamp/example` es un paquete falso usado como una herramienta de aprendizaje. # --hints-- -"dependencies" debe incluir "moment" +`"dependencies"` debería incluir `"@freecodecamp/example"`. ```js (getUserInput) => @@ -37,8 +37,8 @@ Añade la versión "2.14.0" del paquete "moment" al campo `dependencies` del arc var packJson = JSON.parse(data); assert.property( packJson.dependencies, - 'moment', - '"dependencies" does not include "moment"' + '@freecodecamp/example', + '"dependencies" does not include "@freecodecamp/example"' ); }, (xhr) => { @@ -47,7 +47,7 @@ Añade la versión "2.14.0" del paquete "moment" al campo `dependencies` del arc ); ``` -la versión de "moment" debe ser "2.14.0" +`"@freecodecamp/example"` debería tener la versión `"1.1.0"`. ```js (getUserInput) => @@ -55,9 +55,9 @@ la versión de "moment" debe ser "2.14.0" (data) => { var packJson = JSON.parse(data); assert.match( - packJson.dependencies.moment, - /^[\^\~]?2\.14\.0/, - 'Wrong version of "moment" installed. It should be 2.14.0' + packJson.dependencies["@freecodecamp/example"], + /^[\^\~]?1\.1\.0/, + 'Wrong version of "@freecodecamp/example" installed. It should be 1.1.0' ); }, (xhr) => { diff --git a/curriculum/challenges/espanol/05-back-end-development-and-apis/managing-packages-with-npm/how-to-use-package.json-the-core-of-any-node.js-project-or-npm-package.md b/curriculum/challenges/espanol/05-back-end-development-and-apis/managing-packages-with-npm/how-to-use-package.json-the-core-of-any-node.js-project-or-npm-package.md index e565f15a4de063..c72e78ca96eaed 100644 --- a/curriculum/challenges/espanol/05-back-end-development-and-apis/managing-packages-with-npm/how-to-use-package.json-the-core-of-any-node.js-project-or-npm-package.md +++ b/curriculum/challenges/espanol/05-back-end-development-and-apis/managing-packages-with-npm/how-to-use-package.json-the-core-of-any-node.js-project-or-npm-package.md @@ -10,11 +10,11 @@ dashedName: how-to-use-package-json-the-core-of-any-node-js-project-or-npm-packa Trabajar en estos desafíos implica escribir tu código usando uno de los siguientes métodos: -- Clona [este repositorio de Github](https://github.com/freeCodeCamp/boilerplate-npm/) y completa estos desafíos localmente. -- Usa [nuestro proyecto modelo de Replit](https://replit.com/github/freeCodeCamp/boilerplate-npm) para completar estos retos. +- Clone este repositorio de GitHub y complete estos desafíos localmente. +- Usa nuestro proyecto de inicio Replit para completar estos desafíos. - Utiliza un constructor de sitios de tu elección para completar el proyecto. Asegúrate de incorporar todos los archivos de nuestro repositorio de GitHub. -Cuando hayas terminado, asegúrate de que un demo funcional de tu proyecto esté alojado en algún lugar público. Luego, envía la URL en el campo `Solution Link`. Opcionalmente, también envía un enlace al código fuente de tu proyecto en el campo `GitHub Link`. +Cuando hayas terminado, asegúrate de que un demo funcional de tu proyecto esté alojado en algún lugar público. Luego, envía la URL en el campo `Solution Link`. El archivo `package.json` es el centro de cualquier proyecto Node.js o paquete npm. Almacena información sobre tu proyecto, similar a cómo la sección <head> de un documento HTML describe el contenido de una página web. Consiste en un único objeto JSON donde la información se almacena en pares clave-valor. Sólo hay dos campos obligatorios; "name" y "version", pero es una buena práctica proporcionar información adicional sobre tu proyecto que podría ser útil para futuros usuarios o mantenedores. diff --git a/curriculum/challenges/espanol/05-back-end-development-and-apis/managing-packages-with-npm/manage-npm-dependencies-by-understanding-semantic-versioning.md b/curriculum/challenges/espanol/05-back-end-development-and-apis/managing-packages-with-npm/manage-npm-dependencies-by-understanding-semantic-versioning.md index d1d51f2f7d6ba9..5652341004122b 100644 --- a/curriculum/challenges/espanol/05-back-end-development-and-apis/managing-packages-with-npm/manage-npm-dependencies-by-understanding-semantic-versioning.md +++ b/curriculum/challenges/espanol/05-back-end-development-and-apis/managing-packages-with-npm/manage-npm-dependencies-by-understanding-semantic-versioning.md @@ -20,11 +20,11 @@ La versión MAJOR debe incrementarse cuando hagas cambios de API incompatibles. # --instructions-- -En la sección de dependencias de tu archivo package.json, cambia la `version` de moment para que coincida con la versión 2 de MAJOR, la versión 10 de MINOR y la versión 2 de PATCH +En la sección de dependencias de `package.json`, cambie la versión de `@freecodecamp/example` para que coincida con MAJOR versión 1, la MINOR versión 2 y PATCH versión 13 # --hints-- -"dependencies" debe incluir "moment" +`"dependencies"` debería incluir `"@freecodecamp/example"`. ```js (getUserInput) => @@ -33,8 +33,8 @@ En la sección de dependencias de tu archivo package.json, cambia la `version` d var packJson = JSON.parse(data); assert.property( packJson.dependencies, - 'moment', - '"dependencies" does not include "moment"' + '@freecodecamp/example', + '"dependencies" does not include "@freecodecamp/example"' ); }, (xhr) => { @@ -43,7 +43,7 @@ En la sección de dependencias de tu archivo package.json, cambia la `version` d ); ``` -la versión de "moment" debe ser "2.10.2" +`"@freecodecamp/example"` debería tener la versión `"1.2.13"`. ```js (getUserInput) => @@ -51,9 +51,9 @@ la versión de "moment" debe ser "2.10.2" (data) => { var packJson = JSON.parse(data); assert.equal( - packJson.dependencies.moment, - '2.10.2', - 'Wrong version of "moment". It should be 2.10.2' + packJson.dependencies["@freecodecamp/example"], + '1.2.13', + 'Wrong version of "@freecodecamp/example". It should be 1.2.13' ); }, (xhr) => { diff --git a/curriculum/challenges/espanol/05-back-end-development-and-apis/managing-packages-with-npm/remove-a-package-from-your-dependencies.md b/curriculum/challenges/espanol/05-back-end-development-and-apis/managing-packages-with-npm/remove-a-package-from-your-dependencies.md index 8208b6bc20cab9..50e9ad1d30458a 100644 --- a/curriculum/challenges/espanol/05-back-end-development-and-apis/managing-packages-with-npm/remove-a-package-from-your-dependencies.md +++ b/curriculum/challenges/espanol/05-back-end-development-and-apis/managing-packages-with-npm/remove-a-package-from-your-dependencies.md @@ -12,17 +12,17 @@ Ahora has probado algunas maneras en que puedes gestionar las dependencias de tu Pero, ¿Qué pasa si deseas eliminar un paquete externo que ya no necesitas? Puede que ya lo hayas adivinado, simplemente elimina el par clave-valor correspondiente a ese paquete de tus dependencias. -Este mismo método se aplica para eliminar otros campos de tu package.json +Este mismo método se aplica para eliminar otros zonas de tu package.json. # --instructions-- -Elimina el paquete moment de tus dependencias. +Retire el paquete `@freecodecamp/example` de sus dependencias. **Nota:** Asegúrate de que tienes la cantidad correcta de comas después de eliminarlo. # --hints-- -Las "dependencies" no deben incluir "moment" +`"dependencies"` no debe incluir `"@freecodecamp/example"`. ```js (getUserInput) => @@ -31,8 +31,8 @@ Las "dependencies" no deben incluir "moment" var packJson = JSON.parse(data); assert.notProperty( packJson.dependencies, - 'moment', - '"dependencies" still includes "moment"' + '@freecodecamp/example', + '"dependencies" still includes "@freecodecamp/example"' ); }, (xhr) => { diff --git a/curriculum/challenges/espanol/05-back-end-development-and-apis/mongodb-and-mongoose/create-a-model.md b/curriculum/challenges/espanol/05-back-end-development-and-apis/mongodb-and-mongoose/create-a-model.md index 0ce98085af2e56..c5ecedf3ed6f4b 100644 --- a/curriculum/challenges/espanol/05-back-end-development-and-apis/mongodb-and-mongoose/create-a-model.md +++ b/curriculum/challenges/espanol/05-back-end-development-and-apis/mongodb-and-mongoose/create-a-model.md @@ -38,7 +38,7 @@ age : number favoriteFoods : array of strings (*) ``` -Usa los tipos básicos de esquemas de Mongoose. Si quieres también puedes añadir más campos, utilizar validadores sencillos como required o unique, y establecer valores por defecto. Consulta la [documentación de Mongoose](http://mongoosejs.com/docs/guide.html). +Usa los tipos básicos de esquemas de Mongoose. Si quieres también puedes añadir más campos, utilizar validadores sencillos como required o unique, y establecer valores por defecto. Mira nuestro artículo sobre Mongoose . Ahora, crea un modelo llamado `Person` del `personSchema`. diff --git a/curriculum/challenges/espanol/05-back-end-development-and-apis/mongodb-and-mongoose/install-and-set-up-mongoose.md b/curriculum/challenges/espanol/05-back-end-development-and-apis/mongodb-and-mongoose/install-and-set-up-mongoose.md index f7990366683eda..a39cc9a8babd70 100644 --- a/curriculum/challenges/espanol/05-back-end-development-and-apis/mongodb-and-mongoose/install-and-set-up-mongoose.md +++ b/curriculum/challenges/espanol/05-back-end-development-and-apis/mongodb-and-mongoose/install-and-set-up-mongoose.md @@ -10,19 +10,23 @@ dashedName: install-and-set-up-mongoose Trabajar en estos desafíos implica escribir tu código usando uno de los siguientes métodos: -- Clona [este repositorio de GitHub](https://github.com/freeCodeCamp/boilerplate-mongomongoose/) y completa estos desafíos localmente. -- Usa [nuestro proyecto inicial de Replit](https://replit.com/github/freeCodeCamp/boilerplate-mongomongoose) para completar estos desafíos. +- Clone este repositorio de GitHub y complete estos desafíos localmente. +- Usa nuestro proyecto de inicio Replit para completar estos desafíos. - Utiliza un constructor de sitios de tu elección para completar el proyecto. Asegúrate de incorporar todos los archivos de nuestro repositorio de GitHub. Cuando hayas terminado, asegúrate de que un demo funcional de tu proyecto esté alojado en algún lugar público. Luego, envía la URL en el campo `Solution Link`. En este desafío, configurarás una base de datos de MongoDB Atlas e importarás los paquetes necesarios para conectarse a él. -Sigue este tutorial para configurar una base de datos alojada en MongoDB Atlas. +Sigue este tutorial para configurar una base de datos alojada en MongoDB Atlas. # --instructions-- -Añade `mongodb@~3.6.0` y `mongoose@~5.4.0` al `package.json` del proyecto. Luego, requiere mongoose como `mongoose` en `myApp.js`. Crea un archivo `.env` y añade una variable `MONGO_URI`. Su valor debe ser tu URI de base de datos de MongoDB Atlas. Asegúrate de envolver la URI con comillas simples o dobles, y recuerda que no puedes usar espacios alrededor de `=` en las variables de entorno. Por ejemplo, `MONGO_URI='VALUE'`. Cuando hayas terminado, conéctate a la base de datos usando la siguiente sintaxis: +`mongoose@^5.11.15` ha sido añadido al archivo `package.json` de su proyecto. Primero, requiere mongoose como `mongoose` en `myApp.js`. A continuación, cree un archivo `.env` y añada una variable `MONGO_URI` a él. Su valor debe ser tu URI de base de datos de MongoDB Atlas. Asegúrate de envolver la URI con comillas simples o dobles, y recuerda que no puedes usar espacios alrededor de `=` en las variables de entorno. Por ejemplo, `MONGO_URI='VALUE'`. + +**Nota:** Si estás usando Replit, no puedes crear un archivo `.env`. En su lugar, utiliza la pestaña integrada SECRETS para añadir la variable. No rodee los valores con comillas al usar la pestaña SECRETS. + +Cuando hayas terminado, conéctate a la base de datos usando la siguiente sintaxis: ```js mongoose.connect(, { useNewUrlParser: true, useUnifiedTopology: true }); @@ -30,22 +34,7 @@ mongoose.connect(, { useNewUrlParser: true, useUnifiedTopology: true } # --hints-- -la dependencia "mongodb" debe estar en package.json - -```js -(getUserInput) => - $.get(getUserInput('url') + '/_api/file/package.json').then( - (data) => { - var packJson = JSON.parse(data); - assert.property(packJson.dependencies, 'mongodb'); - }, - (xhr) => { - throw new Error(xhr.responseText); - } - ); -``` - -la dependencia "mongoose" debe estar en package.json +la dependencia "versión mongoose ^5.11.15" debería estar en package.json ```js (getUserInput) => @@ -53,6 +42,11 @@ la dependencia "mongoose" debe estar en package.json (data) => { var packJson = JSON.parse(data); assert.property(packJson.dependencies, 'mongoose'); + assert.match( + packJson.dependencies.mongoose, + /^\^5\.11\.15/, + 'Wrong version of "mongoose". It should be ^5.11.15' + ); }, (xhr) => { throw new Error(xhr.responseText); @@ -60,7 +54,7 @@ la dependencia "mongoose" debe estar en package.json ); ``` -"mongoose" debe estar conectado a una base de datos +"mongoose" debería estar conectado a una base de datos ```js (getUserInput) => diff --git a/curriculum/challenges/espanol/05-back-end-development-and-apis/mongodb-and-mongoose/perform-classic-updates-by-running-find-edit-then-save.md b/curriculum/challenges/espanol/05-back-end-development-and-apis/mongodb-and-mongoose/perform-classic-updates-by-running-find-edit-then-save.md index b610e212abbd25..932001f5a9388e 100644 --- a/curriculum/challenges/espanol/05-back-end-development-and-apis/mongodb-and-mongoose/perform-classic-updates-by-running-find-edit-then-save.md +++ b/curriculum/challenges/espanol/05-back-end-development-and-apis/mongodb-and-mongoose/perform-classic-updates-by-running-find-edit-then-save.md @@ -14,7 +14,7 @@ En los buenos tiempos, esto era lo que había que hacer si se quería editar un Modifica la función `findEditThenSave` para encontrar a una persona por `_id` (usa cualquiera de los métodos anteriores) con el parámetro `personId` como la clave de búsqueda. Añade `"hamburger"` a la lista de `favoriteFoods` (puedes usar `Array.push()`). Luego - dentro del callback de búsqueda: `save()` la `Person` actualizada. -**Nota:** Esto puede ser complicado, si está en tu esquema, declaraste `favoriteFoods` como un arreglo, sin especificar el tipo (por ejemplo `[String]`). En ese caso, `favoriteFoods` por defecto es de tipo Mixto, y tienes que marcarlo manualmente como editado usando `document.markModified('edited-field')`. Consulta la documentación de [Mongoose](https://mongoosejs.com/docs/schematypes.html#Mixed) +**Nota:** Esto puede ser complicado, si está en tu esquema, declaraste `favoriteFoods` como un arreglo, sin especificar el tipo (por ejemplo `[String]`). En ese caso, `favoriteFoods` por defecto es de tipo Mixto, y tienes que marcarlo manualmente como editado usando `document.markModified('edited-field')`. Mira nuestro artículo sobre Mongoose . # --hints-- diff --git a/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/announce-new-users.md b/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/announce-new-users.md index f4a2a2b988b1e3..5528be7dbbaafd 100644 --- a/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/announce-new-users.md +++ b/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/announce-new-users.md @@ -34,7 +34,7 @@ socket.on('user', data => { }); ``` -Envía tu página cuando creas que lo has hecho bien. Si te encuentras con errores, puedes revisar el proyecto completado hasta este punto [aquí](https://gist.github.com/camperbot/bf95a0f74b756cf0771cd62c087b8286). +Envía tu página cuando creas que lo has hecho bien. Si te encuentras con errores, puedes consultar el proyecto completado hasta este momento. # --hints-- diff --git a/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/authentication-strategies.md b/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/authentication-strategies.md index 5debb56e80c3f9..628889430759c3 100644 --- a/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/authentication-strategies.md +++ b/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/authentication-strategies.md @@ -10,7 +10,7 @@ dashedName: authentication-strategies Una estrategia es una manera de autenticar a un usuario. Puedes utilizar una estrategia para permitir que los usuarios se autentiquen basándose en la información guardada localmente (si les haces registrarse primero) o desde una variedad de proveedores como Google o GitHub. Para este proyecto, usaremos el agente intermedio Passport. Passport provee un comprensivo set de estrategias que soportan la autenticación usando un nombre de usuario y una contraseña, GitHub, Google, y más. -Agrega `passport-local@~1.0.0` como dependencia y agrégalo a tu servidor de la siguiente manera: `const LocalStrategy = require('passport-local');` +`passport-local@~1.0.0` ya ha sido añadido como una dependencia, así que añádela a tu servidor de la siguiente manera: `const LocalStrategy = require('passport-local');` Ahora tendrás que decirle a passport que **use** un objeto LocalStrategy instanciado con algunas configuraciones definidas. ¡Asegúrate que esto (al igual que todo lo que se haga a partir de ahora) esté encapsulado en la conexión a la base de datos, ya que depende de ella! @@ -34,7 +34,7 @@ Muchas estrategias se configuran con diferentes ajustes, pero generalmente es f En el siguiente paso, ¡configuraremos cómo llamar a la estrategia de autenticación para validar un usuario basado en los datos del formulario! -Envía tu página cuando creas que lo has hecho bien. Si te encuentras con errores, puedes revisar el proyecto completado hasta este punto [aquí](https://gist.github.com/camperbot/53b495c02b92adeee0aa1bd3f3be8a4b). +Envía tu página cuando creas que lo has hecho bien. Si te encuentras con errores, puedes consultar el proyecto completado hasta este momento. # --hints-- diff --git a/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/authentication-with-socket.io.md b/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/authentication-with-socket.io.md index 6fb5b11740847f..a519224ccd227f 100644 --- a/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/authentication-with-socket.io.md +++ b/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/authentication-with-socket.io.md @@ -10,7 +10,7 @@ dashedName: authentication-with-socket-io Actualmente, no puedes determinar quién está conectado a tu web socket. Mientras que `req.user` contiene el objeto user, eso es sólo cuando tu usuario interactúa con el servidor web, y con los web sockets no tienes la `req` (petición) y por lo tanto no hay datos del usuario. Una forma de resolver el problema de saber quién está conectado a tu socket web es analizando (parsing) y decodificando la cookie que contiene la sesión del pasaporte y luego deserializándola para obtener el objeto user. Por suerte, ¡hay un paquete en NPM sólo para esto que convierte una tarea antes compleja en algo sencillo! -Agrega `passport.socketio@~3.7.0`, `connect-mongo@~3.2.0`y `cookie-parser@~1.4.5` como dependencias y requiérelas como `passportSocketIo`, `MongoStore`y `cookieParser` respectivamente. Además, necesitamos inicializar un nuevo almacén de memoria, a partir de `express-session` que requerimos previamente. Debe verse así: +`passport.socketio@~3.7.0`, `connect-mongo@~3.2.0`, y `cookie-parser@~1.4.5` ya han sido añadidas como dependencias. Requerirlas como `passportSocketIo`, `MongoStore`y `cookieParser` respectivamente. También, necesitamos inicializar un nuevo almacenamiento de memoria, desde `express-session` que previamente requerimos. Debería verse así: ```js const MongoStore = require('connect-mongo')(session); @@ -65,7 +65,7 @@ console.log('user ' + socket.request.user.name + ' connected'); ¡Se registrará en la consola del servidor quién se ha conectado! -Envía tu página cuando creas que lo has hecho bien. Si te encuentras con errores, puedes revisar el proyecto completado hasta este punto [aquí](https://gist.github.com/camperbot/1414cc9433044e306dd7fd0caa1c6254). +Envía tu página cuando creas que lo has hecho bien. Si te encuentras con errores, puedes revisar el proyecto completado hasta este punto aquí. # --hints-- diff --git a/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/clean-up-your-project-with-modules.md b/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/clean-up-your-project-with-modules.md index 4e77ececd85403..1166cc8b254633 100644 --- a/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/clean-up-your-project-with-modules.md +++ b/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/clean-up-your-project-with-modules.md @@ -26,7 +26,7 @@ Sigue agregándolos hasta que no existan más errores, y tu archivo de servidor Ahora haz lo mismo en tu archivo auth.js con todas las cosas relacionadas con la autenticación como la serialización y la configuración de la estrategia local y bórralas de tu archivo del servidor. Asegúrate de agregar las dependencias y llamar a `auth(app, myDataBase)` en el servidor en el mismo lugar. -Envía tu página cuando creas que lo has hecho bien. Si te encuentras con errores, puedes revisar un ejemplo del proyecto completado [aquí](https://gist.github.com/camperbot/2d06ac5c7d850d8cf073d2c2c794cc92). +Envía tu página cuando creas que lo has hecho bien. Si te encuentras con errores, puedes consultar el proyecto completado hasta este momento. # --hints-- diff --git a/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/communicate-by-emitting.md b/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/communicate-by-emitting.md index c7869e0934592b..b2f87a3ecaf623 100644 --- a/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/communicate-by-emitting.md +++ b/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/communicate-by-emitting.md @@ -38,7 +38,7 @@ socket.on('user count', function(data) { Ahora, ¡intenta cargar tu aplicación, autentifica, y debes ver en tu consola "1" que representa el recuento de usuarios actual! Trata de cargar más clientes y de autentificar para ver cómo sube el número. -Envía tu página cuando creas que lo has hecho bien. Si te encuentras con errores, puedes revisar el proyecto completado hasta este punto [aquí](https://gist.github.com/camperbot/28ef7f1078f56eb48c7b1aeea35ba1f5). +Envía tu página cuando creas que lo has hecho bien. Si te encuentras con errores, puedes consultar el proyecto completado hasta este momento. # --hints-- diff --git a/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/create-new-middleware.md b/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/create-new-middleware.md index fc17465bb9e9cd..a4e01b073d6895 100644 --- a/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/create-new-middleware.md +++ b/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/create-new-middleware.md @@ -31,7 +31,7 @@ app }); ``` -Envía tu página cuando creas que lo has hecho bien. Si te encuentras con errores, puedes revisar el proyecto completado hasta este punto [aquí](https://gist.github.com/camperbot/ae49b8778cab87e93284a91343da0959). +Envía tu página cuando creas que lo has hecho bien. Si te encuentras con errores, puedes consultar el proyecto completado hasta este momento. # --hints-- diff --git a/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/how-to-use-passport-strategies.md b/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/how-to-use-passport-strategies.md index d2fdb123641a6a..1257e08889c01e 100644 --- a/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/how-to-use-passport-strategies.md +++ b/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/how-to-use-passport-strategies.md @@ -18,7 +18,7 @@ Si la autentificación fue exitosa, el user object se guardará en `req.user`. En este punto, si introduces un nombre de usuario y una contraseña en el formulario, debe redirigirse a la página de inicio `/`, y la consola de tu servidor debe mostrar `'User {USERNAME} attempted to log in.'`, ya que actualmente no podemos iniciar la sesión de un usuario que no está registrado. -Envía tu página cuando creas que lo has hecho bien. Si te encuentras con errores, puedes revisar el proyecto completado hasta este punto [aquí](https://gist.github.com/camperbot/7ad011ac54612ad53188b500c5e99cb9). +Envía tu página cuando creas que lo has hecho bien. Si te encuentras con errores, puedes consultar el proyecto completado hasta este momento. # --hints-- diff --git a/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/implementation-of-social-authentication-iii.md b/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/implementation-of-social-authentication-iii.md index cd30141dfeb3e0..87a13dd1822169 100644 --- a/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/implementation-of-social-authentication-iii.md +++ b/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/implementation-of-social-authentication-iii.md @@ -42,7 +42,7 @@ myDataBase.findOneAndUpdate( Deberías ser capaz de iniciar sesión en tu aplicación ahora... ¡pruébalo! -Envía tu página cuando creas que lo has hecho bien. Si te encuentras con errores, puedes revisar el proyecto completado hasta este punto [aquí](https://gist.github.com/camperbot/183e968f0e01d81dde015d45ba9d2745). +Envía tu página cuando creas que lo has hecho bien. Si te encuentras con errores, puedes consultar el proyecto completado hasta este momento. # --hints-- diff --git a/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/implementation-of-social-authentication.md b/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/implementation-of-social-authentication.md index 72bb90b3e57cd8..c399626766add5 100644 --- a/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/implementation-of-social-authentication.md +++ b/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/implementation-of-social-authentication.md @@ -18,7 +18,7 @@ La ruta básica que seguirá este tipo de autenticación en tu aplicación es: Las estrategias con OAuth requieren que tengas al menos un *Client ID* y un *Client Secret* que es una forma de que el servicio verifique de quién viene la solicitud de autentificación y si es válida. Estos se obtienen del sitio con el que intentas implementar la autentificación, como GitHub, y son únicos para tu aplicación: **NO SE DEBEN COMPARTIR** y nunca deben subirse a un repositorio público ni escribirse directamente en tu código. Una práctica común es ponerlos en tu archivo `.env` y referenciarlos así: `process.env.GITHUB_CLIENT_ID`. Para este desafío vamos a usar la estrategia de GitHub. -Obtener tu *Client ID y Secret* de GitHub se realiza en la configuración del perfil de tu cuenta, en 'developer settings', y luego en '[OAuth applications](https://github.com/settings/developers)'. Haz clic en 'Register a new application', dale un nombre a tu aplicación, pega la url de tu página de inicio de Replit (**No la url del código del proyecto**), y por último, para la url de callback, pega la misma url de la página de inicio pero con `/auth/github/callback` añadido. Aquí es donde los usuarios serán redirigidos para que los manejemos después de autentificarse en GitHub. Guarda la información devuelta como `'GITHUB_CLIENT_ID'` y `'GITHUB_CLIENT_SECRET'` en tu archivo `.env`. +El obtener tu *Client ID and Secret* de GitHub se realiza en la configuración del perfil de tu cuenta, en 'developer settings', y luego en 'OAuth applications. Haz clic en 'Register a new application', dale un nombre a tu aplicación, pega la url de tu página de inicio de Replit (**No la url del código del proyecto**), y por último, para la url de callback, pega la misma url de la página de inicio pero con `/auth/github/callback` añadido. Aquí es donde los usuarios serán redirigidos para que los manejemos después de autentificarse en GitHub. Guarda la información devuelta como `'GITHUB_CLIENT_ID'` y `'GITHUB_CLIENT_SECRET'` en tu archivo `.env`. En tu archivo `routes.js`, agrega `showSocialAuth: true` a la ruta de la página de inicio, después de `showRegistration: true`. Ahora, crea 2 rutas aceptando peticiones GET: `/auth/github` y `/auth/github/callback`. La primera solo debe llamar al passport para autentificar `'github'`. El segundo debe llamar a passport para autentificar `'github'` con una redirección de fallo a `/`, y luego si eso es exitoso redirigir a `/profile` (similar a nuestro último proyecto). @@ -31,7 +31,7 @@ app.route('/login') }); ``` -Envía tu página cuando creas que lo has hecho bien. Si te encuentras con errores, puedes revisar el proyecto completado hasta este punto [aquí](https://gist.github.com/camperbot/1f7f6f76adb178680246989612bea21e). +Envía tu página cuando creas que lo has hecho bien. Si te encuentras con errores, puedes revisar el proyecto completado hasta este punto aquí. # --hints-- diff --git a/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/send-and-display-chat-messages.md b/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/send-and-display-chat-messages.md index c5508db82d0629..3e478b3fa45621 100644 --- a/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/send-and-display-chat-messages.md +++ b/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/send-and-display-chat-messages.md @@ -28,7 +28,7 @@ En `client.js`, ahora debes escuchar el evento `'chat message'` y, una vez recib En este punto, ¡el chat debe ser totalmente funcional y enviar mensajes a todos los clientes! -Envía tu página cuando creas que lo has hecho bien. Si te encuentras con errores, puedes revisar el proyecto completado hasta este punto [aquí](https://gist.github.com/camperbot/d7af9864375207e254f73262976d2016). +Envía tu página cuando creas que lo has hecho bien. Si te encuentras con errores, puedes consultar el proyecto completado hasta este momento. # --hints-- diff --git a/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/use-a-template-engines-powers.md b/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/use-a-template-engines-powers.md index a3861f3101821d..2c212913d2092e 100644 --- a/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/use-a-template-engines-powers.md +++ b/curriculum/challenges/espanol/06-quality-assurance/advanced-node-and-express/use-a-template-engines-powers.md @@ -44,7 +44,7 @@ Para pasarlos desde nuestro servidor, debes agregar un objeto como segundo argum !Debe verse así: `res.render(process.cwd() + '/views/pug/index', {title: 'Hello', message: 'Please login'});` Ahora actualiza tu página y debes ver esos valores representados en tu vista en el lugar correcto como se establece en tu archivo `index.pug`! -Envía tu página cuando creas que la tienes correcta. Si te encuentras con errores, puedes consultar el [proyecto completado hasta este momento](https://gist.github.com/camperbot/4af125119ed36e6e6a8bb920db0c0871). +Envía tu página cuando creas que la tienes correcta. Si te encuentras con errores, puedes consultar el proyecto completado hasta este momento. # --hints-- diff --git a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/assert-deep-equality-with-.deepequal-and-.notdeepequal.md b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/assert-deep-equality-with-.deepequal-and-.notdeepequal.md index e7f67d818b6f1e..af500274d4b5a6 100644 --- a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/assert-deep-equality-with-.deepequal-and-.notdeepequal.md +++ b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/assert-deep-equality-with-.deepequal-and-.notdeepequal.md @@ -8,7 +8,7 @@ dashedName: assert-deep-equality-with--deepequal-and--notdeepequal # --description-- -Como recordatorio, este proyecto está siendo construido con base en el siguiente proyecto inicial [Replit](https://replit.com/github/freeCodeCamp/boilerplate-mochachai), o clonado desde [GitHub](https://github.com/freeCodeCamp/boilerplate-mochachai/). +Como recordatorio, este proyecto esta siendo construído con base en el siquiente proyecto inicial,Replit o clonado de GitHub. `deepEqual()` confirma que dos objetos son iguales en profundidad. diff --git a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/compare-the-properties-of-two-elements.md b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/compare-the-properties-of-two-elements.md index c09f47b56a95b5..71cc60773b310f 100644 --- a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/compare-the-properties-of-two-elements.md +++ b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/compare-the-properties-of-two-elements.md @@ -8,11 +8,11 @@ dashedName: compare-the-properties-of-two-elements # --description-- -Como recordatorio, este proyecto está siendo construido con base en el siguiente proyecto inicial [Replit](https://replit.com/github/freeCodeCamp/boilerplate-mochachai), o clonado desde [GitHub](https://github.com/freeCodeCamp/boilerplate-mochachai/). +Como recordatorio, este proyecto está siendo construido con base en el siguiente proyecto inicial Repl.it, o clonado desde GitHub. # --instructions-- -Dentro de `tests/1_unit-tests.js` bajo la prueba etiquetada `#8` en `Comparisons` suite, cambiar cada `assert` a `assert.isAbove` o `assert.isAtMost` para que el test sea superado (debe evaluarse a `true`). No modifiques los argumentos pasados ​​a los verificadores. +Dentro de `tests/1_unit-tests.js` bajo la prueba etiquetada `#8` en `Comparisons` suite, cambiar cada `assert` a `assert.isAbove` o `assert.isAtMost` para que el test sea aprovado (debe evaluarse a `true`). No modifiques los argumentos pasados ​​a los verificadores. # --hints-- @@ -48,7 +48,7 @@ Debe elegir el método correcto para la primera aserción - `isAbove` vs. `isAtM ); ``` -Debe elegir el método correcto para la segunda aserción - `isAbove` vs. `isAtMost`. +Debes elegir el método correcto para la segunda aserción - `isAbove` vs. `isAtMost`. ```js (getUserInput) => @@ -62,7 +62,7 @@ Debe elegir el método correcto para la segunda aserción - `isAbove` vs. `isAtM ); ``` -Debe elegir el método correcto para la tercera aserción - `isAbove` vs. `isAtMost`. +Debes elegir el método correcto para la tercera aserción - `isAbove` vs. `isAtMost`. ```js (getUserInput) => diff --git a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/learn-how-javascript-assertions-work.md b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/learn-how-javascript-assertions-work.md index e833ed1c419333..d6b01fe1878250 100644 --- a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/learn-how-javascript-assertions-work.md +++ b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/learn-how-javascript-assertions-work.md @@ -10,8 +10,8 @@ dashedName: learn-how-javascript-assertions-work Trabajar en estos desafíos implica escribir tu código usando uno de los siguientes métodos: -- Clona [este repositorio de Github](https://github.com/freeCodeCamp/boilerplate-mochachai/) y completa estos desafíos localmente. -- Usa [nuestro proyecto inicial de Replit](https://replit.com/github/freeCodeCamp/boilerplate-mochachai) para completar estos desafíos. +- Clone este repositorio de GitHub y complete estos desafíos localmente. +- Usa nuestro proyecto de inicio Replit para completar estos desafíos. - Utiliza un constructor de sitios web de tu elección para completar el proyecto. Asegúrate de incorporar todos los archivos de nuestro repositorio de GitHub. Cuando hayas terminado, asegúrate de que un demo funcional de tu proyecto esté alojado en algún lugar público. Luego, envía la URL en el campo `Solution Link`. diff --git a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/run-functional-tests-on-an-api-response-using-chai-http-iii---put-method.md b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/run-functional-tests-on-an-api-response-using-chai-http-iii---put-method.md index 96374eab6c24a3..5846918d971ad3 100644 --- a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/run-functional-tests-on-an-api-response-using-chai-http-iii---put-method.md +++ b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/run-functional-tests-on-an-api-response-using-chai-http-iii---put-method.md @@ -8,7 +8,7 @@ dashedName: run-functional-tests-on-an-api-response-using-chai-http-iii---put-me # --description-- -Como recordatorio, este proyecto está siendo construido con base en el siguiente proyecto inicial [Replit](https://replit.com/github/freeCodeCamp/boilerplate-mochachai), o clonado desde [GitHub](https://github.com/freeCodeCamp/boilerplate-mochachai/). +Como recordatorio, este proyecto está siendo construido con base en el siguiente proyecto inicial Repl.it, o clonado desde GitHub. Cuando se prueba una solicitud `PUT`, a menudo enviarás datos junto con ella. Los datos que incluye con su solicitud `PUT` se llama el body de la petición. diff --git a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/run-functional-tests-on-an-api-response-using-chai-http-iv---put-method.md b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/run-functional-tests-on-an-api-response-using-chai-http-iv---put-method.md index ee670f67449ce7..6c2a792ccefbb7 100644 --- a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/run-functional-tests-on-an-api-response-using-chai-http-iv---put-method.md +++ b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/run-functional-tests-on-an-api-response-using-chai-http-iv---put-method.md @@ -8,7 +8,7 @@ dashedName: run-functional-tests-on-an-api-response-using-chai-http-iv---put-met # --description-- -Como recordatorio, este proyecto está siendo construido con base en el siguiente proyecto inicial [Replit](https://replit.com/github/freeCodeCamp/boilerplate-mochachai), o clonado desde [GitHub](https://github.com/freeCodeCamp/boilerplate-mochachai/). +Como recordatorio, este proyecto está siendo construido con base en el siguiente proyecto inicial Repl.it, o clonado desde GitHub. Este ejercicio es similar al anterior. diff --git a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/run-functional-tests-on-api-endpoints-using-chai-http-ii.md b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/run-functional-tests-on-api-endpoints-using-chai-http-ii.md index 772e74ffcd3e15..9e00b161ddc1a9 100644 --- a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/run-functional-tests-on-api-endpoints-using-chai-http-ii.md +++ b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/run-functional-tests-on-api-endpoints-using-chai-http-ii.md @@ -8,7 +8,7 @@ dashedName: run-functional-tests-on-api-endpoints-using-chai-http-ii # --description-- -Como recordatorio, este proyecto está siendo construido con base en el siguiente proyecto inicial [Repl.it](https://replit.com/github/freeCodeCamp/boilerplate-mochachai), o clonado desde [GitHub](https://github.com/freeCodeCamp/boilerplate-mochachai/). +Como recordatorio, este proyecto está siendo construido con base en el siguiente proyecto inicial Repl.it, o clonado desde GitHub. # --instructions-- diff --git a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/run-functional-tests-on-api-endpoints-using-chai-http.md b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/run-functional-tests-on-api-endpoints-using-chai-http.md index d30b6787e3a61d..b366c701308515 100644 --- a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/run-functional-tests-on-api-endpoints-using-chai-http.md +++ b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/run-functional-tests-on-api-endpoints-using-chai-http.md @@ -8,7 +8,7 @@ dashedName: run-functional-tests-on-api-endpoints-using-chai-http # --description-- -Como recordatorio, este proyecto está siendo construido con base en el siguiente proyecto inicial [Replit](https://replit.com/github/freeCodeCamp/boilerplate-mochachai), o clonado desde [GitHub](https://github.com/freeCodeCamp/boilerplate-mochachai/). +Como recordatorio, este proyecto está siendo construido con base en el siguiente proyecto inicial Repl.it, o clonado desde GitHub. Mocha te permite comprobar operaciones asíncronas como llamadas a los endpoints de la API con un complemento llamado `chai-http`. diff --git a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/run-functional-tests-using-a-headless-browser.md b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/run-functional-tests-using-a-headless-browser.md index e780332fbf5f1f..9dead37043fca8 100644 --- a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/run-functional-tests-using-a-headless-browser.md +++ b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/run-functional-tests-using-a-headless-browser.md @@ -8,7 +8,7 @@ dashedName: run-functional-tests-using-a-headless-browser # --description-- -Como recordatorio, este proyecto está siendo construido con base en el siguiente proyecto inicial [Replit](https://replit.com/github/freeCodeCamp/boilerplate-mochachai), o clonado desde [GitHub](https://github.com/freeCodeCamp/boilerplate-mochachai/). +Como recordatorio, este proyecto está siendo construido con base en el siguiente proyecto inicial Repl.it, o clonado desde GitHub. En la página hay un formulario de entrada. Envía datos al endpoint `PUT /travellers` como una solicitud AJAX. diff --git a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/simulate-actions-using-a-headless-browser.md b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/simulate-actions-using-a-headless-browser.md index 816c29fff93575..facbc86e37066f 100644 --- a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/simulate-actions-using-a-headless-browser.md +++ b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/simulate-actions-using-a-headless-browser.md @@ -7,7 +7,7 @@ dashedName: simulate-actions-using-a-headless-browser # --description-- -Como recordatorio, este proyecto está siendo construido con base en el siguiente proyecto inicial [Replit](https://replit.com/github/freeCodeCamp/boilerplate-mochachai), o clonado desde [GitHub](https://github.com/freeCodeCamp/boilerplate-mochachai/). +Como recordatorio, este proyecto está siendo construido con base en el siguiente proyecto inicial Repl. it, o clonado desde GitHub. En los siguientes desafíos, simularás la interacción humana con una página usando un navegador sin interfaz gráfica. diff --git a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-for-truthiness.md b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-for-truthiness.md index 2ee32394e3f70b..63c9bc9c0520e4 100644 --- a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-for-truthiness.md +++ b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-for-truthiness.md @@ -8,7 +8,7 @@ dashedName: test-for-truthiness # --description-- -Como recordatorio, este proyecto está siendo construido con base en el siguiente proyecto inicial [Replit](https://replit.com/github/freeCodeCamp/boilerplate-mochachai), o clonado desde [GitHub](https://github.com/freeCodeCamp/boilerplate-mochachai/). +Recuerda, este proyecto se está construyendo partir de una plantilla en Replit o clonado de GitHub. `isTrue()` probará el valor booleano `true` y `isNotTrue()` pasará cuando se le dé cualquier cosa que no sea el valor booleano de `true`. diff --git a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-string-contains-a-substring.md b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-string-contains-a-substring.md index 4d0d8471710df0..3652e827356e31 100644 --- a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-string-contains-a-substring.md +++ b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-string-contains-a-substring.md @@ -8,7 +8,7 @@ dashedName: test-if-a-string-contains-a-substring # --description-- -Como recordatorio, este proyecto está siendo construido con base en el siguiente proyecto inicial [Replit](https://replit.com/github/freeCodeCamp/boilerplate-mochachai), o clonado desde [GitHub](https://github.com/freeCodeCamp/boilerplate-mochachai/). +Recuerda, este proyecto se está construyendo partir de una plantilla en Replit o clonado de GitHub. `include()` y `notInclude()` también funcionan con cadenas! `include()` comprueba que la cadena actual contiene el substring esperado. diff --git a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-value-falls-within-a-specific-range.md b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-value-falls-within-a-specific-range.md index 7469c374b8456b..de7330f6316531 100644 --- a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-value-falls-within-a-specific-range.md +++ b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-value-falls-within-a-specific-range.md @@ -8,7 +8,7 @@ dashedName: test-if-a-value-falls-within-a-specific-range # --description-- -Como recordatorio, este proyecto está siendo construido con base en el siguiente proyecto inicial [Repl.it](https://replit.com/github/freeCodeCamp/boilerplate-mochachai), o clonado desde [GitHub](https://github.com/freeCodeCamp/boilerplate-mochachai/). +Recuerda, este proyecto se está construyendo partir de una plantilla en Replit o clonado de GitHub. ```javascript .approximately(actual, expected, delta, [message]) diff --git a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-value-is-a-string.md b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-value-is-a-string.md index 9b62bbe2180ef0..23c09436c72b89 100644 --- a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-value-is-a-string.md +++ b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-value-is-a-string.md @@ -8,7 +8,7 @@ dashedName: test-if-a-value-is-a-string # --description-- -Como recordatorio, este proyecto está siendo construido con base en el siguiente proyecto inicial [Replit](https://replit.com/github/freeCodeCamp/boilerplate-mochachai), o clonado desde [GitHub](https://github.com/freeCodeCamp/boilerplate-mochachai/). +Recuerda, este proyecto se está construyendo partir de una plantilla en Replit o clonado de GitHub. `isString` o `isNotString` comprueba que el valor actual es una cadena. diff --git a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-value-is-an-array.md b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-value-is-an-array.md index 5bbc0a720f0add..123fa2fa7cfa69 100644 --- a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-value-is-an-array.md +++ b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-value-is-an-array.md @@ -8,7 +8,7 @@ dashedName: test-if-a-value-is-an-array # --description-- -Como recordatorio, este proyecto está siendo construido con base en el siguiente proyecto inicial [Replit](https://replit.com/github/freeCodeCamp/boilerplate-mochachai), o clonado desde [GitHub](https://github.com/freeCodeCamp/boilerplate-mochachai/). +Como recordatorio, este proyecto está siendo construido con base en el siguiente proyecto inicial Repl.it, o clonado desde GitHub. # --instructions-- diff --git a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-value-is-of-a-specific-data-structure-type.md b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-value-is-of-a-specific-data-structure-type.md index 498014e87df04d..5baf927dd1f956 100644 --- a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-value-is-of-a-specific-data-structure-type.md +++ b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-value-is-of-a-specific-data-structure-type.md @@ -8,7 +8,7 @@ dashedName: test-if-a-value-is-of-a-specific-data-structure-type # --description-- -Como recordatorio, este proyecto está siendo construido con base en el siguiente proyecto inicial [Repl.it](https://replit.com/github/freeCodeCamp/boilerplate-mochachai), o clonado desde [GitHub](https://github.com/freeCodeCamp/boilerplate-mochachai/). +Recuerda, este proyecto se está construyendo partir de una plantilla en Replit o clonado de GitHub. `#typeOf` verifica que el tipo de dato es string, como lo determina `Object.prototype.toString`. diff --git a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-variable-or-function-is-defined.md b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-variable-or-function-is-defined.md index 0e72aa5aef7d34..fb132b564264a0 100644 --- a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-variable-or-function-is-defined.md +++ b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-a-variable-or-function-is-defined.md @@ -8,7 +8,7 @@ dashedName: test-if-a-variable-or-function-is-defined # --description-- -Como recordatorio, este proyecto está siendo construido con base en el siguiente proyecto inicial [Replit](https://replit.com/github/freeCodeCamp/boilerplate-mochachai), o clonado desde [GitHub](https://github.com/freeCodeCamp/boilerplate-mochachai/). +Recuerda, este proyecto se está construyendo partir de una plantilla en Replit o clonado de GitHub. # --instructions-- diff --git a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-an-array-contains-an-item.md b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-an-array-contains-an-item.md index 1a48c590840594..5135717793142f 100644 --- a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-an-array-contains-an-item.md +++ b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-an-array-contains-an-item.md @@ -8,7 +8,7 @@ dashedName: test-if-an-array-contains-an-item # --description-- -Como recordatorio, este proyecto está siendo construido con base en el siguiente proyecto inicial [Repl.it](https://replit.com/github/freeCodeCamp/boilerplate-mochachai), o clonado desde [GitHub](https://github.com/freeCodeCamp/boilerplate-mochachai/). +Recuerda, este proyecto se está construyendo partir de una plantilla en Replit o clonado de GitHub. # --instructions-- diff --git a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-an-object-has-a-property.md b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-an-object-has-a-property.md index 41d5a084f2b4c4..cc9f2762a5da3b 100644 --- a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-an-object-has-a-property.md +++ b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-an-object-has-a-property.md @@ -8,7 +8,7 @@ dashedName: test-if-an-object-has-a-property # --description-- -Como recordatorio, este proyecto está siendo construido con base en el siguiente proyecto inicial [Replit](https://replit.com/github/freeCodeCamp/boilerplate-mochachai), o clonado desde [GitHub](https://github.com/freeCodeCamp/boilerplate-mochachai/). +Recuerda, este proyecto se está construyendo partir de una plantilla en Replit o clonado de GitHub. `property` verifica que el objeto actual tiene una propiedad determinada. diff --git a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-an-object-is-an-instance-of-a-constructor.md b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-an-object-is-an-instance-of-a-constructor.md index 9e4eb8d88df9a7..464b8a55012265 100644 --- a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-an-object-is-an-instance-of-a-constructor.md +++ b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-an-object-is-an-instance-of-a-constructor.md @@ -8,7 +8,7 @@ dashedName: test-if-an-object-is-an-instance-of-a-constructor # --description-- -Como recordatorio, este proyecto está siendo construido con base en el siguiente proyecto inicial [Replit](https://replit.com/github/freeCodeCamp/boilerplate-mochachai), o clonado desde [GitHub](https://github.com/freeCodeCamp/boilerplate-mochachai/). +Recuerda, este proyecto se está construyendo partir de una plantilla en Replit o clonado de GitHub. `#instanceOf` verifica que un objeto es una instancia de un constructor. diff --git a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-one-value-is-below-or-at-least-as-large-as-another.md b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-one-value-is-below-or-at-least-as-large-as-another.md index e031b2ff432d16..9666a20d96c48a 100644 --- a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-one-value-is-below-or-at-least-as-large-as-another.md +++ b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/test-if-one-value-is-below-or-at-least-as-large-as-another.md @@ -8,7 +8,7 @@ dashedName: test-if-one-value-is-below-or-at-least-as-large-as-another # --description-- -Como recordatorio, este proyecto está siendo construido con base en el siguiente proyecto inicial [Replit](https://replit.com/github/freeCodeCamp/boilerplate-mochachai), o clonado desde [GitHub](https://github.com/freeCodeCamp/boilerplate-mochachai/). +Recuerda, este proyecto se está construyendo partir de una plantilla en Replit o clonado de GitHub. # --instructions-- diff --git a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/use-assert.isok-and-assert.isnotok.md b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/use-assert.isok-and-assert.isnotok.md index a5ccc7ddf6b26e..23675b1bb1a554 100644 --- a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/use-assert.isok-and-assert.isnotok.md +++ b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/use-assert.isok-and-assert.isnotok.md @@ -8,11 +8,11 @@ dashedName: use-assert-isok-and-assert-isnotok # --description-- -Como recordatorio, este proyecto está siendo construido con base en el siguiente proyecto inicial [Replit](https://replit.com/github/freeCodeCamp/boilerplate-mochachai), o clonado desde [GitHub](https://github.com/freeCodeCamp/boilerplate-mochachai/). +Como recordatorio, este proyecto está siendo construido con base en el siguiente proyecto inicial Repl. it, o clonado desde GitHub. `isOk()` prueba un valor verdadero y `isNotOk()` prueba un valor falso. -Para aprender más sobre los valores verdaderos y falsos, prueba nuestro desafío de [Falsy Bouncer](https://www.freecodecamp.org/learn/javascript-algorithms-and-data-structures/basic-algorithm-scripting/falsy-bouncer). +Para aprender más sobre los valores verdaderos y falsos, prueba nuestro desafío de Falsy Bouncer. # --instructions-- diff --git a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/use-regular-expressions-to-test-a-string.md b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/use-regular-expressions-to-test-a-string.md index 9d51eea61fcb2d..8e6e60ff1e7684 100644 --- a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/use-regular-expressions-to-test-a-string.md +++ b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/use-regular-expressions-to-test-a-string.md @@ -8,7 +8,7 @@ dashedName: use-regular-expressions-to-test-a-string # --description-- -Como recordatorio, este proyecto está siendo construido con base en el siguiente proyecto inicial [Replit](https://replit.com/github/freeCodeCamp/boilerplate-mochachai), o clonado desde [GitHub](https://github.com/freeCodeCamp/boilerplate-mochachai/). +Recuerda, este proyecto se está construyendo partir de una plantilla en Replit o clonado de GitHub. `match()` verifica que el valor real coincide con la expresión regular del segundo argumento. diff --git a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/use-the-double-equals-to-assert-equality.md b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/use-the-double-equals-to-assert-equality.md index d6589cf719fd7c..2495a064476902 100644 --- a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/use-the-double-equals-to-assert-equality.md +++ b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/use-the-double-equals-to-assert-equality.md @@ -8,7 +8,7 @@ dashedName: use-the-double-equals-to-assert-equality # --description-- -Como recordatorio, este proyecto está siendo construido con base en el siguiente proyecto inicial [Replit](https://replit.com/github/freeCodeCamp/boilerplate-mochachai), o clonado desde [GitHub](https://github.com/freeCodeCamp/boilerplate-mochachai/). +Recuerda, este proyecto se está construyendo partir de una plantilla en Replit o clonado de GitHub. `equal()` compara objetos usando `==`. diff --git a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/use-the-triple-equals-to-assert-strict-equality.md b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/use-the-triple-equals-to-assert-strict-equality.md index 799ed0d9d3bf14..bdc60aebac44c9 100644 --- a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/use-the-triple-equals-to-assert-strict-equality.md +++ b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-and-testing-with-chai/use-the-triple-equals-to-assert-strict-equality.md @@ -8,7 +8,7 @@ dashedName: use-the-triple-equals-to-assert-strict-equality # --description-- -Como recordatorio, este proyecto está siendo construido con base en el siguiente proyecto inicial [Replit](https://replit.com/github/freeCodeCamp/boilerplate-mochachai), o clonado desde [GitHub](https://github.com/freeCodeCamp/boilerplate-mochachai/). +Recuerda, este proyecto se está construyendo partir de una plantilla en Replit o clonado de GitHub. `strictEqual()` compara objetos usando `===`. diff --git a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-projects/american-british-translator.md b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-projects/american-british-translator.md index f739688fca88ae..80047bac4b776c 100644 --- a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-projects/american-british-translator.md +++ b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-projects/american-british-translator.md @@ -8,10 +8,10 @@ dashedName: american-british-translator # --description-- -Construye una aplicación full stack de JavaScript que sea funcionalmente similar a esta: . Trabajar en este proyecto implicará escribir tu código utilizando uno de los siguientes métodos: +Crea una aplicación full stack de JavaScript que sea funcionalmente similar a esta: https://american-british-translator.freecodecamp.rocks/. Trabajar en este proyecto implicará escribir tu código utilizando uno de los siguientes métodos: -- Clona [este repositorio de GitHub](https://github.com/freeCodeCamp/boilerplate-project-american-british-english-translator/) y completa tu proyecto localmente. -- Usa [nuestro proyecto inicial de Replit](https://replit.com/github/freeCodeCamp/boilerplate-project-american-british-english-translator) para completar tu proyecto. +- Clone este repositorio de GitHub y complete estos desafíos localmente. +- Usa nuestro proyecto inicial de Replit para completar tu proyecto. - Usa un constructor de sitios de tu elección para completar el proyecto. Asegúrate de incorporar todos los archivos de nuestro repositorio de GitHub. Cuando hayas terminado, asegúrate de que una demostración funcional de tu proyecto esté alojado en algún lugar público. Luego, envía la URL en el campo `Solution Link`. Opcionalmente, también envía un enlace al código fuente de tu proyecto en el campo `GitHub Link`. diff --git a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-projects/issue-tracker.md b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-projects/issue-tracker.md index e44583de4eec74..148a284bb00033 100644 --- a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-projects/issue-tracker.md +++ b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-projects/issue-tracker.md @@ -8,10 +8,10 @@ dashedName: issue-tracker # --description-- -Construye una aplicación full stack de JavaScript que sea funcionalmente similar a esta: . Trabajar en este proyecto implicará escribir tu código utilizando uno de los siguientes métodos: +Crea una aplicación full stack de JavaScript que sea funcionalmente similar a esta: https://issue-tracker.freecodecamp.rocks/. Trabajar en este proyecto implicará escribir tu código utilizando uno de los siguientes métodos: -- Clona [este repositorio de GitHub](https://github.com/freeCodeCamp/boilerplate-project-issuetracker/) y completa tu proyecto localmente. -- Usa [nuestro proyecto inicial de Replit](https://replit.com/github/freeCodeCamp/boilerplate-project-issuetracker) para completar tu proyecto. +- Clone este repositorio de GitHub y complete estos desafíos localmente. +- Usa nuestro proyecto inicial de Replit para completar tu proyecto. - Usa un constructor de sitios de tu elección para completar el proyecto. Asegúrate de incorporar todos los archivos de nuestro repositorio de GitHub. Cuando hayas terminado, asegúrate de que una demostración funcional de tu proyecto esté alojado en algún lugar público. Luego, envía la URL en el campo `Solution Link`. Opcionalmente, también envía un enlace al código fuente de tu proyecto en el campo `GitHub Link`. diff --git a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-projects/metric-imperial-converter.md b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-projects/metric-imperial-converter.md index 4430fcbedcd4f8..d46522de9c2935 100644 --- a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-projects/metric-imperial-converter.md +++ b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-projects/metric-imperial-converter.md @@ -8,10 +8,10 @@ dashedName: metric-imperial-converter # --description-- -Construye una aplicación full stack de JavaScript que sea funcionalmente similar a esta: . Trabajar en este proyecto implicará escribir tu código utilizando uno de los siguientes métodos: +Crea una aplicación full stack de JavaScript que sea funcionalmente similar a esta: https://metric-imperial-converter.freecodecamp.rocks/. Trabajar en este proyecto implicará escribir tu código utilizando uno de los siguientes métodos: -- Clona [este repositorio de GitHub](https://github.com/freeCodeCamp/boilerplate-project-metricimpconverter/) y completa tu proyecto localmente. -- Usa [nuestro proyecto de inicio en Replit](https://replit.com/github/freeCodeCamp/boilerplate-project-metricimpconverter) para completar tu proyecto. +- Clone este repositorio de GitHub y complete estos desafíos localmente. +- Usa este proyecto inicial de Replit para completar tu proyecto. - Usa un constructor de sitios de tu elección para completar el proyecto. Asegúrate de incorporar todos los archivos de nuestro repositorio de GitHub. Cuando hayas terminado, asegúrate de que una demostración funcional de tu proyecto esté alojado en algún lugar público. Luego, envía la URL en el campo `Solution Link`. Opcionalmente, también envía un enlace al código fuente de tu proyecto en el campo `GitHub Link`. diff --git a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-projects/personal-library.md b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-projects/personal-library.md index 702dcb78578a10..f9ea7fd3e47f5d 100644 --- a/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-projects/personal-library.md +++ b/curriculum/challenges/espanol/06-quality-assurance/quality-assurance-projects/personal-library.md @@ -8,10 +8,10 @@ dashedName: personal-library # --description-- -Construye una aplicación full stack de JavaScript que sea funcionalmente similar a esta: . Trabajar en este proyecto implicará escribir tu código utilizando uno de los siguientes métodos: +Construye una aplicacion Javascript full stack que funcione similarmente a esta: https://personal-library.freecodecamp.rocks/. Trabajar en este proyecto implicará escribir tu código utilizando uno de los siguientes métodos: -- Clona [este repositorio de GitHub](https://github.com/freeCodeCamp/boilerplate-project-library) y completa tu proyecto localmente. -- Usa [nuestro proyecto inicial de Replit](https://replit.com/github/freeCodeCamp/boilerplate-project-library) para completar tu proyecto. +- Clona este repositorio de GitHub y complete estos desafíos localmente. +- Usa este proyecto inicial de Replit para completar tu proyecto. - Usa un constructor de sitios de tu elección para completar el proyecto. Asegúrate de incorporar todos los archivos de nuestro repositorio de GitHub. Cuando hayas terminado, asegúrate de que una demostración funcional de tu proyecto esté alojado en algún lugar público. Luego, envía la URL en el campo `Solution Link`. Opcionalmente, también envía un enlace al código fuente de tu proyecto en el campo `GitHub Link`. diff --git a/curriculum/challenges/espanol/07-scientific-computing-with-python/python-for-everybody/build-your-own-functions.md b/curriculum/challenges/espanol/07-scientific-computing-with-python/python-for-everybody/build-your-own-functions.md index c27ed3a632fa44..fd00ff51f4efda 100644 --- a/curriculum/challenges/espanol/07-scientific-computing-with-python/python-for-everybody/build-your-own-functions.md +++ b/curriculum/challenges/espanol/07-scientific-computing-with-python/python-for-everybody/build-your-own-functions.md @@ -14,7 +14,7 @@ dashedName: build-your-own-functions Más recursos: -\- [Ejercicio](https://www.youtube.com/watch?v=ksvGhDsjtpw) +\- Ejercicio # --question-- diff --git a/curriculum/challenges/espanol/07-scientific-computing-with-python/python-for-everybody/comparing-and-sorting-tuples.md b/curriculum/challenges/espanol/07-scientific-computing-with-python/python-for-everybody/comparing-and-sorting-tuples.md index b562909efe87d9..00a839c61496e2 100644 --- a/curriculum/challenges/espanol/07-scientific-computing-with-python/python-for-everybody/comparing-and-sorting-tuples.md +++ b/curriculum/challenges/espanol/07-scientific-computing-with-python/python-for-everybody/comparing-and-sorting-tuples.md @@ -14,7 +14,7 @@ dashedName: comparing-and-sorting-tuples Más recursos: -\- [Ejercicio](https://www.youtube.com/watch?v=EhQxwzyT16E) +\- Ejercicio # --question-- diff --git a/curriculum/challenges/espanol/07-scientific-computing-with-python/python-for-everybody/dictionaries-and-loops.md b/curriculum/challenges/espanol/07-scientific-computing-with-python/python-for-everybody/dictionaries-and-loops.md index 41162222424f64..4afcd95639be38 100644 --- a/curriculum/challenges/espanol/07-scientific-computing-with-python/python-for-everybody/dictionaries-and-loops.md +++ b/curriculum/challenges/espanol/07-scientific-computing-with-python/python-for-everybody/dictionaries-and-loops.md @@ -14,7 +14,7 @@ dashedName: dictionaries-and-loops Más recursos: -\- [Ejercicio](https://www.youtube.com/watch?v=PrhZ9qwBDD8) +\- Ejercicio # --question-- diff --git a/curriculum/challenges/espanol/07-scientific-computing-with-python/python-for-everybody/files-as-a-sequence.md b/curriculum/challenges/espanol/07-scientific-computing-with-python/python-for-everybody/files-as-a-sequence.md index 2da38392741767..dcf783a554261d 100644 --- a/curriculum/challenges/espanol/07-scientific-computing-with-python/python-for-everybody/files-as-a-sequence.md +++ b/curriculum/challenges/espanol/07-scientific-computing-with-python/python-for-everybody/files-as-a-sequence.md @@ -14,7 +14,7 @@ dashedName: files-as-a-sequence Más recursos: -\- [Ejercicios](https://www.youtube.com/watch?v=il1j4wkte2E) +\- Ejercicio # --question-- diff --git a/curriculum/challenges/espanol/07-scientific-computing-with-python/python-for-everybody/web-services-api-rate-limiting-and-security.md b/curriculum/challenges/espanol/07-scientific-computing-with-python/python-for-everybody/web-services-api-rate-limiting-and-security.md index 2efec620223b5d..1a4fc2a98a7eba 100644 --- a/curriculum/challenges/espanol/07-scientific-computing-with-python/python-for-everybody/web-services-api-rate-limiting-and-security.md +++ b/curriculum/challenges/espanol/07-scientific-computing-with-python/python-for-everybody/web-services-api-rate-limiting-and-security.md @@ -14,13 +14,13 @@ dashedName: web-services-api-rate-limiting-and-security Mas recursos: -\- [Ejercicio: GeoJSON](https://www.youtube.com/watch?v=TJGJN0T8tak) +\- Ejercicio: GeoJSON -\- [Ejercicio: JSON](https://www.youtube.com/watch?v=vTmw5RtfGMY) +\- Ejercicio: JSON -\- [Ejercicio: Twitter](https://www.youtube.com/watch?v=2c7YwhvpCro) +\- Ejercicio: Twitter -\- [Ejercicio: XML](https://www.youtube.com/watch?v=AopYOlDa-vY) +\- Ejercicio: XML # --question-- diff --git a/curriculum/challenges/espanol/07-scientific-computing-with-python/scientific-computing-with-python-projects/budget-app.md b/curriculum/challenges/espanol/07-scientific-computing-with-python/scientific-computing-with-python-projects/budget-app.md index bdd87a075fb423..e6a0e327a7e343 100644 --- a/curriculum/challenges/espanol/07-scientific-computing-with-python/scientific-computing-with-python-projects/budget-app.md +++ b/curriculum/challenges/espanol/07-scientific-computing-with-python/scientific-computing-with-python-projects/budget-app.md @@ -8,7 +8,7 @@ dashedName: budget-app # --description-- -Estarás [trabajando en este proyecto con nuestro código inicial de Replit](https://replit.com/github/freeCodeCamp/boilerplate-budget-app). +Estarás trabajando en este proyecto con nuestro código inicial en Replit. # --instructions-- diff --git a/curriculum/challenges/espanol/07-scientific-computing-with-python/scientific-computing-with-python-projects/polygon-area-calculator.md b/curriculum/challenges/espanol/07-scientific-computing-with-python/scientific-computing-with-python-projects/polygon-area-calculator.md index c8c17dfd44ee23..c8cc224643f6d0 100644 --- a/curriculum/challenges/espanol/07-scientific-computing-with-python/scientific-computing-with-python-projects/polygon-area-calculator.md +++ b/curriculum/challenges/espanol/07-scientific-computing-with-python/scientific-computing-with-python-projects/polygon-area-calculator.md @@ -8,7 +8,7 @@ dashedName: polygon-area-calculator # --description-- -Estarás [trabajando en este proyecto con nuestro código inicial de Replit](https://replit.com/github/freeCodeCamp/boilerplate-polygon-area-calculator). +Estarás trabajando en este proyecto con nuestro código inicial en Replit. # --instructions-- diff --git a/curriculum/challenges/espanol/07-scientific-computing-with-python/scientific-computing-with-python-projects/time-calculator.md b/curriculum/challenges/espanol/07-scientific-computing-with-python/scientific-computing-with-python-projects/time-calculator.md index 0afe42a9eb0db5..838cb822a78980 100644 --- a/curriculum/challenges/espanol/07-scientific-computing-with-python/scientific-computing-with-python-projects/time-calculator.md +++ b/curriculum/challenges/espanol/07-scientific-computing-with-python/scientific-computing-with-python-projects/time-calculator.md @@ -8,7 +8,7 @@ dashedName: time-calculator # --description-- -Estarás [trabajando en este proyecto con nuestro código inicial de Replit](https://replit.com/github/freeCodeCamp/boilerplate-time-calculator). +Estarás trabajando en este proyecto con nuestro código inicial en Replit. # --instructions-- diff --git a/curriculum/challenges/espanol/08-data-analysis-with-python/data-analysis-with-python-course/introduction-to-data-analysis.md b/curriculum/challenges/espanol/08-data-analysis-with-python/data-analysis-with-python-course/introduction-to-data-analysis.md index 6eb6b327cd028c..733903d6f0dcdc 100644 --- a/curriculum/challenges/espanol/08-data-analysis-with-python/data-analysis-with-python-course/introduction-to-data-analysis.md +++ b/curriculum/challenges/espanol/08-data-analysis-with-python/data-analysis-with-python-course/introduction-to-data-analysis.md @@ -11,16 +11,17 @@ dashedName: introduction-to-data-analysis --- # --description-- +El análisis de datos es el acto de convertir datos crudos y desordenados en información útil limpiando los datos, transformándolos, manipulándolos e inspeccionándolos. Más recursos: -\- [Diapositivas](https://docs.google.com/presentation/d/1cUIt8b2ySz-85_ykfeuuWsurccwTAuFPn782pZBzFsU/edit?usp=sharing) +\- Artículo de noticias # --question-- ## --text-- -¿Cuál de las siguientes opciones no **es** parte del Análisis de Datos? +¿Cuál de las siguientes opciones **no es** parte del Análisis de Datos? ## --answers-- @@ -28,7 +29,7 @@ Construcción de modelos estadísticos y visualización de datos. --- -Elegir una conclusión deseada para el análisis. +Selección de una conclusión deseada para el análisis. --- @@ -36,7 +37,7 @@ Corregir valores incorrectos y eliminar datos no válidos. --- -Transformación de datos en una estructura de datos apropiada. +Transformando datos en una estructura de datos apropiada. ## --video-solution-- diff --git a/curriculum/challenges/espanol/09-information-security/information-security-with-helmetjs/hash-and-compare-passwords-synchronously.md b/curriculum/challenges/espanol/09-information-security/information-security-with-helmetjs/hash-and-compare-passwords-synchronously.md index f7efd693685d97..dd42bd3990e9f6 100644 --- a/curriculum/challenges/espanol/09-information-security/information-security-with-helmetjs/hash-and-compare-passwords-synchronously.md +++ b/curriculum/challenges/espanol/09-information-security/information-security-with-helmetjs/hash-and-compare-passwords-synchronously.md @@ -1,6 +1,6 @@ --- id: 58a25bcff9fc0f352b528e7e -title: Hash and Compare Passwords Synchronously +title: Picar y comparar contraseñas sincrónicamente challengeType: 2 forumTopicId: 301579 dashedName: hash-and-compare-passwords-synchronously @@ -8,31 +8,31 @@ dashedName: hash-and-compare-passwords-synchronously # --description-- -As a reminder, this project is being built upon the following starter project on [Replit](https://replit.com/github/freeCodeCamp/boilerplate-bcrypt), or cloned from [GitHub](https://github.com/freeCodeCamp/boilerplate-bcrypt/). +Como recordatorio, este proyecto se basa en el siguiente proyecto inicial en Replit, o clonado de GitHub. -Hashing synchronously is just as easy to do but can cause lag if using it server side with a high cost or with hashing done very often. Hashing with this method is as easy as calling +Picar sincrónicamente es igual de fácil de hacer, pero puede causar retrasos si se usa en el lado del servidor con un alto costo o si se pica con mucha frecuencia. Picar con este método es tan fácil como llamar ```js var hash = bcrypt.hashSync(myPlaintextPassword, saltRounds); ``` -Add this method of hashing to your code and then log the result to the console. Again, the variables used are already defined in the server so you won't need to adjust them. You may notice even though you are hashing the same password as in the async function, the result in the console is different- this is due to the salt being randomly generated each time as seen by the first 22 characters in the third string of the hash. Now to compare a password input with the new sync hash, you would use the compareSync method: +Agrega este método de hash a tu código y luego registre el resultado en la consola. Nuevamente, las variables usadas ya están definidas en el servidor asique no necesitará ajustarlas. Tal vez notes que aunque estás hasheando la misma contraseña que en la función asincrónica, el resultado en la consola es diferente -esto es porque el salto está siendo generado al azar cada vez como se ve en los primeros 22 carácteres en la tercera string del hash. Ahora para comparar un input de contraseña con el hash sincronizado nuevo, deberás usar el método compareSync: ```js var result = bcrypt.compareSync(myPlaintextPassword, hash); ``` -with the result being a boolean true or false. +con el resultado siendo un booleano verdadero o falso. # --instructions-- -Add the function in and log the result to the console to see it working. +Añade la función y registra el resultado en la consola para ver cómo funciona. -Submit your page when you think you've got it right. +Envía tu página cuando creas que está correcto. # --hints-- -Sync hash should be generated and correctly compared. +Sync hash debe generarse y compararse correctamente. ```js (getUserInput) => diff --git a/curriculum/challenges/espanol/09-information-security/information-security-with-helmetjs/install-and-require-helmet.md b/curriculum/challenges/espanol/09-information-security/information-security-with-helmetjs/install-and-require-helmet.md index b55a943559e243..8aa0919e375261 100644 --- a/curriculum/challenges/espanol/09-information-security/information-security-with-helmetjs/install-and-require-helmet.md +++ b/curriculum/challenges/espanol/09-information-security/information-security-with-helmetjs/install-and-require-helmet.md @@ -10,8 +10,8 @@ dashedName: install-and-require-helmet Trabajar en estos desafíos implica escribir tu código usando uno de los siguientes métodos: -- Clona [este repositorio de Github](https://github.com/freeCodeCamp/boilerplate-infosec/) y completa estos desafíos localmente. -- Use [nuestro proyecto inicial de Replit](https://replit.com/github/freeCodeCamp/boilerplate-infosec) para completar estos desafios. +- Clona este repositorio de GitHub y completa esos retos localmente. +- Usa nuestro proyecto de inicial Replit para completar estos retos. - Utilice un constructor de sitios de su elección para completar el proyecto. Asegúrese de incorporar todos los archivos de nuestro repositorio de GitHub. Cuando haya terminado, asegúrese de que un demo funcional de su proyecto esté alojado en algún lugar público. A continuación, envíe la URL en el campo `Solution Link`. @@ -22,7 +22,7 @@ Helmet te ayuda a proteger tus aplicaciones Express configurando varias cabecera Todo su código para estas lecciones va en el archivo `myApp.js` entre las líneas de código con las que hemos iniciado. No cambie o elimine el código que hemos añadido para usted. -Instale la versión `3.21.3` de Helmet, luego requiérala. Puede instalar una versión específica de un paquete con `npm install --save-exact package@version`, o agregándolo a su paquete `package.json` directamente. +La versión de Helmet `3.21.3` ya ha sido instalada, así que requiera `helmet` en `myApp.js`. # --hints-- diff --git a/curriculum/challenges/espanol/09-information-security/python-for-penetration-testing/developing-a-banner-grabber.md b/curriculum/challenges/espanol/09-information-security/python-for-penetration-testing/developing-a-banner-grabber.md index 88f5f3fcfe16d0..6e5c2e2fcc19d3 100644 --- a/curriculum/challenges/espanol/09-information-security/python-for-penetration-testing/developing-a-banner-grabber.md +++ b/curriculum/challenges/espanol/09-information-security/python-for-penetration-testing/developing-a-banner-grabber.md @@ -1,8 +1,12 @@ --- id: 5ea9997bbec2e9bc47e94db3 -title: Developing a Banner Grabber +title: Desarrollar un grabador de estandarte challengeType: 11 videoId: CeGW761BIsA +bilibiliIds: + aid: 633014533 + bvid: BV1Sb4y127H9 + cid: 409036288 dashedName: developing-a-banner-grabber --- @@ -10,7 +14,7 @@ dashedName: developing-a-banner-grabber ## --text-- -Fill in the blanks to complete the `banner` function below: +Rellena los espacios en blanco para completar la función `banner` a continuación: ```py def banner(ip, port): @@ -23,7 +27,7 @@ def banner(ip, port): A: `connect` -B: `port` +B:`port` --- diff --git a/curriculum/challenges/espanol/09-information-security/python-for-penetration-testing/developing-a-port-scanner.md b/curriculum/challenges/espanol/09-information-security/python-for-penetration-testing/developing-a-port-scanner.md index a35002583eb06e..26b1978215e761 100644 --- a/curriculum/challenges/espanol/09-information-security/python-for-penetration-testing/developing-a-port-scanner.md +++ b/curriculum/challenges/espanol/09-information-security/python-for-penetration-testing/developing-a-port-scanner.md @@ -1,8 +1,12 @@ --- id: 5ea9997bbec2e9bc47e94db4 -title: Developing a Port Scanner +title: Desarrollar un escáner de puertos challengeType: 11 videoId: z_qkqZS7KZ4 +bilibiliIds: + aid: 208077317 + bvid: BV1Uh411p7HS + cid: 409036706 dashedName: developing-a-port-scanner --- @@ -10,19 +14,19 @@ dashedName: developing-a-port-scanner ## --text-- -What is the main difference between the `.connect()` and `.connect_ex()` methods? +¿Cuál es la diferencia principal entre los métodos `.connect()` y `.connect_ex()`? ## --answers-- -There is no difference between the two methods. +No hay diferencia entre ambos métodos. --- -If there is an error or if no host is found, `.connect()` returns an error code while `.connect_ex()` raises an exception. +Si hay un error o si no se encuentra un host, `.connect()` devuelve un código de error mientras `.connect_ex()` plantea una excepción. --- -If there is an error or if no host is found, `.connect()` raises an exception while `.connect_ex()` returns an error code. +Si hay un error o si no se encuentra un host, `.connect()` devuelve un código de error mientras `.connect_ex()` plantea una excepción. ## --video-solution-- diff --git a/curriculum/challenges/espanol/09-information-security/python-for-penetration-testing/developing-an-nmap-scanner-part-1.md b/curriculum/challenges/espanol/09-information-security/python-for-penetration-testing/developing-an-nmap-scanner-part-1.md index 8f26492699be03..deb50e2bedf908 100644 --- a/curriculum/challenges/espanol/09-information-security/python-for-penetration-testing/developing-an-nmap-scanner-part-1.md +++ b/curriculum/challenges/espanol/09-information-security/python-for-penetration-testing/developing-an-nmap-scanner-part-1.md @@ -1,8 +1,12 @@ --- id: 5ea9997bbec2e9bc47e94db1 -title: Developing an Nmap Scanner part 1 +title: Desarrollando un escáner de Nmap parte 1 challengeType: 11 videoId: jYk9XaGoAnk +bilibiliIds: + aid: 805657338 + bvid: BV1o34y1S7zf + cid: 414718986 dashedName: developing-an-nmap-scanner-part-1 --- @@ -10,7 +14,7 @@ dashedName: developing-an-nmap-scanner-part-1 ## --text-- -What is the correct command to install the Python 3 version of the `python-nmap` library? +¿Cuál es el comando correcto para instalar la versión de Python 3 de la librería `python-nmap`? ## --answers-- diff --git a/curriculum/challenges/espanol/09-information-security/python-for-penetration-testing/introduction-and-setup.md b/curriculum/challenges/espanol/09-information-security/python-for-penetration-testing/introduction-and-setup.md index c243ea29541615..bab62cab8fc552 100644 --- a/curriculum/challenges/espanol/09-information-security/python-for-penetration-testing/introduction-and-setup.md +++ b/curriculum/challenges/espanol/09-information-security/python-for-penetration-testing/introduction-and-setup.md @@ -1,8 +1,12 @@ --- id: 5ea9997bbec2e9bc47e94dae -title: Introduction and Setup +title: Introducción y configuración challengeType: 11 videoId: XeQ7ZKtb998 +bilibiliIds: + aid: 718017704 + bvid: BV13Q4y1k7hX + cid: 409033630 dashedName: introduction-and-setup --- @@ -10,19 +14,19 @@ dashedName: introduction-and-setup ## --text-- -What code editor and extension does the instructor recommend for developing penetration testing tools in Python? +¿Qué editor de código y extensión recomienda el instructor para desarrollar herramientas de prueba de penetración en Python? ## --answers-- -Atom and the atom-python-run extension. +Atom y la extensión atom-python-run. --- -VSCode and Microsoft's Python extension. +Extensión VSCode y Python de Microsoft. --- -Sublime Text and the Anaconda package. +Sublime Text y el paquete Anaconda. ## --video-solution-- diff --git a/curriculum/challenges/espanol/09-information-security/python-for-penetration-testing/understanding-sockets-and-creating-a-tcp-server.md b/curriculum/challenges/espanol/09-information-security/python-for-penetration-testing/understanding-sockets-and-creating-a-tcp-server.md index 7a0f528118f533..6c041d725c8598 100644 --- a/curriculum/challenges/espanol/09-information-security/python-for-penetration-testing/understanding-sockets-and-creating-a-tcp-server.md +++ b/curriculum/challenges/espanol/09-information-security/python-for-penetration-testing/understanding-sockets-and-creating-a-tcp-server.md @@ -1,8 +1,12 @@ --- id: 5ea9997bbec2e9bc47e94daf -title: Understanding Sockets and Creating a TCP Server +title: Entendiendo Sockets y Creando un Servidor TCP challengeType: 11 videoId: F1QI9tNuDQg +bilibiliIds: + aid: 848005038 + bvid: BV1bL4y1a7kJ + cid: 409034113 dashedName: understanding-sockets-and-creating-a-tcp-server --- @@ -10,7 +14,7 @@ dashedName: understanding-sockets-and-creating-a-tcp-server ## --text-- -Which of the following functions creates a socket object? +¿Cuál de las siguientes funciones crea un objeto socket? ## --answers-- diff --git a/curriculum/challenges/espanol/11-machine-learning-with-python/tensorflow/natural-language-processing-with-rnns-sentimental-analysis.md b/curriculum/challenges/espanol/11-machine-learning-with-python/tensorflow/natural-language-processing-with-rnns-sentimental-analysis.md index 60118b25c81ee7..081aa3803348f5 100644 --- a/curriculum/challenges/espanol/11-machine-learning-with-python/tensorflow/natural-language-processing-with-rnns-sentimental-analysis.md +++ b/curriculum/challenges/espanol/11-machine-learning-with-python/tensorflow/natural-language-processing-with-rnns-sentimental-analysis.md @@ -1,8 +1,12 @@ --- id: 5e8f2f13c4cdbe86b5c72d9e -title: 'Natural Language Processing With RNNs: Sentiment Analysis' +title: 'Procesamiento del lenguaje natural con RNN: análisis de sentimiento' challengeType: 11 videoId: lYeLtu8Nq7c +bilibiliIds: + aid: 933111408 + bvid: BV1TM4y137VB + cid: 409135996 dashedName: natural-language-processing-with-rnns-sentiment-analysis --- @@ -10,13 +14,13 @@ dashedName: natural-language-processing-with-rnns-sentiment-analysis ## --text-- -Fill in the blanks below to create the model for the RNN: +Complete los espacios en blanco a continuación para crear el modelo para la RNN: ```py model = __A__.keras.Sequential([ __A__.keras.layers.__B__(88584, 32), __A__.keras.layers.__C__(32), - __A__.keras.layers.DENSE(1, activation='sigmoid') + __A__.keras.layers.Dense(1, activation='sigmoid') ]) ``` diff --git a/curriculum/challenges/espanol/14-responsive-web-design-22/build-a-survey-form-project/build-a-survey-form.md b/curriculum/challenges/espanol/14-responsive-web-design-22/build-a-survey-form-project/build-a-survey-form.md new file mode 100644 index 00000000000000..51501673bd902a --- /dev/null +++ b/curriculum/challenges/espanol/14-responsive-web-design-22/build-a-survey-form-project/build-a-survey-form.md @@ -0,0 +1,518 @@ +--- +id: 587d78af367417b2b2512b03 +title: Crea un formulario de encuesta +challengeType: 14 +forumTopicId: 301145 +dashedName: build-a-survey-form +--- + +# --description-- + +**Objetivo:** Crea una aplicación que sea funcionalmente similar a https://survey-form.freecodecamp.rocks + +**Historias de usuario:** + +1. Debes tener un título de página en un elemento `h1` con un `id` de `title` +1. Debes tener una corta explicación en el elemento `p` con un `id` de `description` +1. Debes tener un elemento `form` con un `id` de `survey-form` +1. Dentro del elemento form, debe ser **required** (requerido) ingresar tu nombre en un campo de `input` que tenga un `id` de `name` y un `type` de `text` +1. Dentro del elemento form **required** (requerido) ingresar tu nombre en un campo de `input` que tenga un `id` de `email` +1. Si ingresas un email que no tenga el formato correcto, verás un error de validación HTML5 +1. Dentro del formulario, puedes ingresar un número en un campo de `input` que tenga un `id` de `number` +1. Si ingresas valores no numéricos en el campo de entrada de números, verás un error de validación HTML5 +1. Si ingrisas un número que esté fuera del rango de números permitido, que es definido por los atributos `min` y `max`, verás un error de validación de HTML5 +1. Para los campos de entrada de nombre, email y número, puedes ver los correspondientes elementos `label` en el formulario, que describen el propósito de cada campo con los siguientes id: `id="name-label"`, `id="email-label"` y `id="number-label"` +1. Para los campos de entrada de nombre, email y número, podrás ver un texto provisional que da una descripción o instrucciones para cada campo +1. Dentro del elemento form, debes tener un elemento desplegable `select` con un `id` de `dropdown` con al menos dos opciones para elegir +1. Dentro del elemento form, puedes seleccionar una opción de un grupo de al menos dos botones de radio que son agrupado utilizando el atributo `name` +1. Dentro del elemento form, puedes seleccionar varios campos en una serie de casillas de verificación, cada una debe tener un atributo `value` +1. Dentro del elemento form, se te presenta un `textarea` para comentarios adicionales +1. Dentro del elemento form, se te presenta un botón con un `id` de `submit` para enviar todas las entradas + +Completa las historias de usuario y pasa todas las pruebas a continuación para completar este proyecto. Dale tu propio estilo personal. ¡Feliz día programando! + +**Nota:** Asegurate de agregar `` en tu HTML para enlazar tu hoja de estilos y aplicar tu CSS + +# --hints-- + +Debes tener un elemento `h1` con un `id` de `title`. + +```js +const el = document.getElementById('title') +assert(!!el && el.tagName === 'H1') +``` + +Tu `#title` no debe estar vacío. + +```js +const el = document.getElementById('title') +assert(!!el && el.innerText.length > 0) +``` + +Debes tener un elemento `p` con un `id` de `description`. + +```js +const el = document.getElementById('description') +assert(!!el && el.tagName === 'P') +``` + +Tu `#description` no debe estar vacío. + +```js +const el = document.getElementById('description') +assert(!!el && el.innerText.length > 0) +``` + +Debes tener un elemento `form` con un `id` de `survey-form`. + +```js +const el = document.getElementById('survey-form') +assert(!!el && el.tagName === 'FORM') +``` + +Debes tener un elemento `input` con un `id` de `name`. + +```js +const el = document.getElementById('name') +assert(!!el && el.tagName === 'INPUT') +``` + +Tu `#name` debe tener un `type` de `text`. + +```js +const el = document.getElementById('name') +assert(!!el && el.type === 'text') +``` + +Tu `#name` debe requerir una entrada. + +```js +const el = document.getElementById('name') +assert(!!el && el.required) +``` + +Tu `#name` debe ser un descendiente de `#survey-form`. + +```js +const el = document.querySelector('#survey-form #name') +assert(!!el) +``` + +Debes tener un elemento `input` con un `id` de `email`. + +```js +const el = document.getElementById('email') +assert(!!el && el.tagName === 'INPUT') +``` + +Tu `#email` debe tener un `type` de `email`. + +```js +const el = document.getElementById('email') +assert(!!el && el.type === 'email') +``` + +Tu `#email` debe requerir una entrada. + +```js +const el = document.getElementById('email') +assert(!!el && el.required) +``` + +Tu `#email` debe ser descendiente de `#survey-form` + +```js +const el = document.querySelector('#survey-form #email') +assert(!!el) +``` + +Debes tener un elemento `input` con un `id` de `number`. + +```js +const el = document.getElementById('number') +assert(!!el && el.tagName === 'INPUT') +``` + +Tu `#number` debe ser descendiente de `#survey-form`. + +```js +const el = document.querySelector('#survey-form #number') +assert(!!el) +``` + +Tu `#number` debe tner un `type`de `number`. + +```js +const el = document.getElementById('number') +assert(!!el && el.type === 'number') +``` + +Tu `#number` debe tener un atributo `min` con un valor numérico. + +```js +const el = document.getElementById('number') +assert(!!el && el.min && isFinite(el.min)) +``` + +Tu `#number` debe tener un atributo `max` con un valor numérico. + +```js +const el = document.getElementById('number') +assert(!!el && el.max && isFinite(el.max)) +``` + +Debes tener un elemento `label` con un `id` de `name-label`. + +```js +const el = document.getElementById('name-label') +assert(!!el && el.tagName === 'LABEL') +``` + +Debes tener un elemento `label` con un `id` de `email-label`. + +```js +const el = document.getElementById('email-label') +assert(!!el && el.tagName === 'LABEL') +``` + +Debes tener un elemento `label` con un `id` de `number-label`. + +```js +const el = document.getElementById('number-label') +assert(!!el && el.tagName === 'LABEL') +``` + +Tu `#name-label` debe contener un texto que describa la entrada. + +```js +const el = document.getElementById('name-label') +assert(!!el && el.innerText.length > 0) +``` + +Tu `#email-label` debe contener un texto que describa la entrada. + +```js +const el = document.getElementById('email-label') +assert(!!el && el.innerText.length > 0) +``` + +Tu `#number-label` debe contener un texto que describa la entrada. + +```js +const el = document.getElementById('number-label') +assert(!!el && el.innerText.length > 0) +``` + +Tu `#name-label` debe ser descendiente de `#survey-form`. + +```js +const el = document.querySelector('#survey-form #name-label') +assert(!!el) +``` + +Tu `#email-label` debe ser descendiente de `#survey-form`. + +```js +const el = document.querySelector('#survey-form #email-label') +assert(!!el) +``` + +Tu `#number-label` debe ser descendiente de `#survey-form`. + +```js +const el = document.querySelector('#survey-form #number-label') +assert(!!el) +``` + +Tu `#name` debe tener el atributo `placeholder` y un valor. + +```js +const el = document.getElementById('name') +assert(!!el && !!el.placeholder && el.placeholder.length > 0) +``` + +Tu `#email` debe tener un atributo `placeholder` y un valor. + +```js +const el = document.getElementById('email') +assert(!!el && !!el.placeholder && el.placeholder.length > 0) +``` + +Tu `#number` debe tener un atributo `placeholder` y un valor. + +```js +const el = document.getElementById('number') +assert(!!el && !!el.placeholder && el.placeholder.length > 0) +``` + +Debes tener un campo `select` con un `id` de `dropdown`. + +```js +const el = document.getElementById('dropdown') +assert(!!el && el.tagName === 'SELECT') +``` + +Tu `#dropdown` debe tener al menos dos elementos `option` seleccionables (no deshabilitados). + +```js +const els = document.querySelectorAll('#dropdown option:not([disabled])') +assert(els.length >= 2) +``` + +Tu `#dropdown` debe ser descendiente de `#survey-form`. + +```js +const el = document.querySelector('#survey-form #dropdown') +assert(!!el) +``` + +Debes tener al menos dos elementos `input` con un `type` de `radio` (botones de radio). + +```js +const els = document.querySelectorAll('input[type="radio"]') +assert(els.length >= 2) +``` + +Debes tener al menos dos botones de radio que sean descendientes de `#survey-form`. + +```js +const els = document.querySelectorAll('#survey-form input[type="radio"]') +assert(els.length >= 2) +``` + +Todos tus botones de radio deben tener un atributo `value` y un valor. + +```js +const els1 = document.querySelectorAll('input[type="radio"]') +const els2 = document.querySelectorAll('input[type="radio"][value=""], input[type="radio"]:not([value])') +assert(els1.length > 0 && els2.length === 0) +``` + +Todos tus botones de radio deben tener un atributo `name` y un valor. + +```js +const els1 = document.querySelectorAll('input[type="radio"]') +const els2 = document.querySelectorAll('input[type="radio"][name=""], input[type="radio"]:not([name])') +assert(els1.length > 0 && els2.length === 0) +``` + +Cada grupo de botón de radio debe tener al menos 2 botones de radio. + +```js +const radioButtons = document.querySelectorAll('input[type="radio"]'); +const groups = {} + +if (radioButtons) { + radioButtons.forEach(el => { + if (!groups[el.name]) groups[el.name] = [] + groups[el.name].push(el) + }) +} + +const groupKeys = Object.keys(groups) + +groupKeys.forEach(key => { + if (groups[key].length < 2) assert(false) +}) + +assert(groupKeys.length > 0) +``` + +Debes tener al menos dos elementos `input` con un `type` de `checkbox` (casillas de verificación) que sean descendientes de `#survey-form`. + +```js +const els = document.querySelectorAll('#survey-form input[type="checkbox"]'); +assert(els.length >= 2) +``` + +Todos tus casillas de verificación dentro de `#survey-form` deben tener un atributo `value` y un valor. + +```js +const els1 = document.querySelectorAll('#survey-form input[type="checkbox"]') +const els2 = document.querySelectorAll('#survey-form input[type="checkbox"][value=""], #survey-form input[type="checkbox"]:not([value])') +assert(els1.length > 0 && els2.length === 0) +``` + +Debes tener al menos un elemento de `textarea` que sea descendiente de `#survey-form`. + +```js +const el = document.querySelector('#survey-form textarea') +assert(!!el) +``` + +Debes tener un elemento `input` o `button` con un `id` de `submit`. + +```js +const el = document.getElementById('submit') +assert(!!el && (el.tagName === 'INPUT' || el.tagName === 'BUTTON')) +``` + +Tu `#submit` debe tener un `type` de `submit`. + +```js +const el = document.getElementById('submit') +assert(!!el && el.type === 'submit') +``` + +Tu `#submit` debe ser descendiente de `#survey-form`. + +```js +const el = document.querySelector('#survey-form #submit') +assert(!!el) +``` + +# --seed-- + +## --seed-contents-- + +```html + +``` + +```css + +``` + +## --solutions-- + +```html + + + + + + Survey Form + + +

    Survey Form

    +

    The card below was built as a sample survey form for freeCodeCamp.

    +
    +

    Join the Togepi Fan Club!

    +

    + Enter your information here to receive updates about club activities, + our monthly newsletter, and other email communications. +

    +
    + + + + +

    Who is your favourite Pokemon?

    + + + +

    Which communications do you want to receive?

    + + + +

    Any other information you would like to share?

    + +

    + Please note: This form is a proof of concept. Submitting the form + will not actually transmit your data. +

    + +
    +
    + + + +``` + +```css +main { + text-align: center; + background-color: #92869c; + background-blend-mode: lighten; + max-width: 500px; + margin: 20px auto; + border-radius: 50px; + box-shadow: 10px 10px rgba(0, 0, 0, 0.5); + color: black; +} +body { + text-align: center; + background: #3a3240; + color: white; +} +input, textarea, select, button { + background: #3a3240; + color: white; +} +a { + color: white; +} +``` diff --git a/curriculum/challenges/espanol/14-responsive-web-design-22/build-a-tribute-page-project/build-a-tribute-page.md b/curriculum/challenges/espanol/14-responsive-web-design-22/build-a-tribute-page-project/build-a-tribute-page.md new file mode 100644 index 00000000000000..0d070cdc4cf1c7 --- /dev/null +++ b/curriculum/challenges/espanol/14-responsive-web-design-22/build-a-tribute-page-project/build-a-tribute-page.md @@ -0,0 +1,325 @@ +--- +id: bd7158d8c442eddfaeb5bd18 +title: Construye una página de homenaje +challengeType: 14 +forumTopicId: 301147 +dashedName: build-a-tribute-page +--- + +# --description-- + +**Objetivo:** Crea una aplicación que sea funcionalmente similar a https://tribute-page.freecodecamp.rocks + +**Instrucciones:** + +1. Tu página de homenaje debe tener un elemento `main` con un `id` correspondiente de `main`, que contiene los demás elementos +1. La página debe tener un elemento `id` de `title`, el cual contendrá una cadena de caracteres (p. ej. texto), que describe el tema de la página de homenaje (p. ej. "Dr. Norman Borlaug") +1. La página debe tener tanto un elemento `figure` o un elemento `div` con un `id` de `img-div` +1. Dentro del elemento `#img-div` debe tener un elemento `img` con su correspondiente `id="image"` +1. Dentro del elemento `#img-div`, debes ver un elemento con un `id="img-caption"` correspondiente que contiene contenido textual describiendo la imagen mostrada en `#img-div` +1. Debe tener su correspondiente elemento `id="tribute-info"`, que contendrá una descripción textual del sujeto de la página tributo +1. Debes ver un elemento `a` con su `id="tribute-link"` correspondiente, que contiene información adicional sobre el tema de la página de homenaje. CONSEJO: Debes dar al elemento un atributo `target` y establecerlo como `_blank` para que tu enlace se abra en una nueva pestaña +1. Tu `#image` debe usar las propiedades `max-width` y `height` para redimensionar automaticamente, el ancho relativo de la imagen, sin exceder el tamaño original +1. Tu elemento `img` debe estar centrado con respecto al elemento que lo contiene + +Completa las historias de usuario y pasa todas las pruebas a continuación para completar este proyecto. Dale tu propio estilo. ¡Feliz día programando! + +**Nota:** Asegúrate de agregar `` en tu HTML para enlazar tu hoja de estilos y aplicar tu CSS + +# --hints-- + +Debes tener un elemento `main` con un `id` de `main`. + +```js +const el = document.getElementById('main') +assert(!!el && el.tagName === 'MAIN') +``` + +Tu `#img-div`, `#image`, `#img-caption`, `#tribute-info`, y `#tribute-link` deben ser descendientes de `#main`. + +```js +const el1 = document.querySelector('#main #img-div') +const el2 = document.querySelector('#main #image') +const el3 = document.querySelector('#main #img-caption') +const el4 = document.querySelector('#main #tribute-info') +const el5 = document.querySelector('#main #tribute-link') +assert(!!el1 & !!el2 && !!el3 && !!el4 && !!el5) +``` + +Debes tener un elemento con un `id` de `title`. + +```js +const el = document.getElementById('title') +assert(!!el) +``` + +Tu `#title` no debe estar vacío. + +```js +const el = document.getElementById('title') +assert(!!el && el.innerText.length > 0) + +``` + +Debes tener un elemento `figure` o `div` con un `id` de `img-div`. + +```js +const el = document.getElementById('img-div') +assert(!!el && (el.tagName === 'DIV' || el.tagName === 'FIGURE')) +``` + +Debes tener un elemento `img` con un `id` de `image`. + +```js +const el = document.getElementById('image') +assert(!!el && el.tagName === 'IMG') +``` + +Tu `#image` debe ser descendiente de `#img-div`. + +```js +const el = document.querySelector('#img-div #image') +assert(!!el) +``` + +Deberías tener un elemento `figcaption` o `div` con un `id` de `img-caption`. + +```js +const el = document.getElementById('img-caption') +assert(!!el && (el.tagName === 'DIV' || el.tagName === 'FIGCAPTION')) +``` + +Tu `#img-caption` debe ser descendiente de `#img-div`. + +```js +const el = document.querySelector('#img-div #img-caption') +assert(!!el) +``` + +Tu `#img-caption` no debe estar vacío. + +```js +const el = document.getElementById('img-caption') +assert(!!el && el.innerText.length > 0) +``` + +Debes tener un elemento con un `id` de `tribute-info`. + +```js +const el = document.getElementById('tribute-info') +assert(!!el) +``` + +Tu `#tribute-info` no debe estar vacío. + +```js +const el = document.getElementById('tribute-info') +assert(!!el && el.innerText.length > 0) +``` + +Debes tener un elemento `a` con un `id` de `tribute-link`. + +```js +const el = document.getElementById('tribute-link') +assert(!!el && el.tagName === 'A') +``` + +Tu `#tribute-link` debe tener un atributo `href` con un enlace. + +```js +const el = document.getElementById('tribute-link') +assert(!!el && !!el.href && el.href.length > 0) +``` + +Tu `#tribute-link` debe tener un atributo `target` establecido en `_blank`. + +```js +const el = document.getElementById('tribute-link') +assert(!!el && el.target === '_blank') +``` + +Tu elemento `img` debe tener un `display` de `block`. + +```js +const img = document.getElementById('image'); +const imgStyle = window.getComputedStyle(img); +const style = imgStyle?.getPropertyValue('display') +assert(style === 'block') +``` + +Tu `#image` debe tener un `max-width` de `100%`. + +```js +const img = document.getElementById('image'); +const imgStyle = window.getComputedStyle(img); +const style = imgStyle?.getPropertyValue('max-width') +assert(style === '100%') +``` + +Tu `#image` debe tener un `height` de `auto`. + +```js +// taken from the testable-projects repo +const img = document.getElementById('image'); +const imgStyle = window.getComputedStyle(img); +const oldDisplayValue = imgStyle.getPropertyValue('display'); +const oldDisplayPriority = imgStyle.getPropertyPriority('display'); +img?.style.setProperty('display', 'none', 'important'); +const heightValue = imgStyle?.getPropertyValue('height') +img?.style.setProperty('display', oldDisplayValue, oldDisplayPriority); +assert(heightValue === 'auto') +``` + +Tu `#image` debe estar centrado con respecto al elemento que lo contiene. + +```js +// taken from the testable-projects repo +const img = document.getElementById('image'), + imgParent = img?.parentElement, + imgLeft = img?.getBoundingClientRect().left, + imgRight = img?.getBoundingClientRect().right, + parentLeft = imgParent?.getBoundingClientRect().left, + parentRight = imgParent?.getBoundingClientRect().right, + leftMargin = imgLeft - parentLeft, + rightMargin = parentRight - imgRight; +assert(leftMargin - rightMargin < 6 && rightMargin - leftMargin < 6) +``` + +# --seed-- + +## --seed-contents-- + +```html + +``` + +```css + +``` + +## --solutions-- + +```html + + + + + + + + Tribute Page + + +

    Tribute Page

    +

    The below card was designed as a tribute page for freeCodeCamp.

    +
    +
    + An image of Togepi +
    Togepi, happy as always.
    +
    +

    Togepi

    +
    +
    +

    + Togepi was first discovered in the Johto region, when Ash Ketchum + discovered a mysterious egg. However, when the egg hatched, Togepi saw + Ash's friend Misty first and imprinted on her. Like many other + creatures, this imprinting process created a bond and Togepi views + Misty as his mother. +

    +

    + Togepi is a very childlike Pokemon, and is very emotionally + expressive. He demonstrates extreme levels of joy and sadness. +

    +
    +

    Battle Information

    +
      +
    • Type: Fairy
    • +
    • Evolutions: Togepi -> Togetic -> Togekiss
    • +
    • Moves: Growl, Pound, Sweet Kiss, Charm
    • +
    • Weaknesses: Poison, Steel
    • +
    • Resistances: Dragon
    • +
    +

    + Check out this + Bulbapedia article on Togepi + for more information on this great Pokemon. +

    +
    +
    + + + +``` + +```css +body { + background-color: #3a3240; + color: white; +} +main { + background-color: #92869c; + font-family: Lobster; + max-width: 500px; + margin: 20px auto; + color: black; + border-radius: 50px; + box-shadow: 10px 10px rgba(0, 0, 0, 0.5); +} +h2 { + text-align: center; + font-size: 20pt; + font-family: Pacifico; +} +body { + text-align: center; + font-size: 12pt; +} +footer { + text-align: center; + font-size: 10pt; +} +.border { + border-color: black; + border-width: 5px; + border-style: solid; +} +#image { + height: auto; + display: block; + margin: auto; + max-width: 100%; + border-radius: 50%; +} +#img-caption { + font-size: 10pt; +} +a:not(#tribute-link) { + color: white; +} +hr { + border-color: black; +} +``` diff --git a/curriculum/challenges/espanol/14-responsive-web-design-22/learn-accessibility-by-building-a-quiz/6140827cff96e906bd38fc2b.md b/curriculum/challenges/espanol/14-responsive-web-design-22/learn-accessibility-by-building-a-quiz/6140827cff96e906bd38fc2b.md index 33f159859b665a..b7253e97cafee5 100644 --- a/curriculum/challenges/espanol/14-responsive-web-design-22/learn-accessibility-by-building-a-quiz/6140827cff96e906bd38fc2b.md +++ b/curriculum/challenges/espanol/14-responsive-web-design-22/learn-accessibility-by-building-a-quiz/6140827cff96e906bd38fc2b.md @@ -7,7 +7,7 @@ dashedName: step-9 # --description-- -Como se describe en la [Guia de Estilo de freeCodeCamp](https://design-style-guide.freecodecamp.org/), el logo debe mantener una relación de aspecto de `35 / 4`, y tener un relleno alrededor del texto. +Como se describe en la Guia de Estilo de freeCodeCamp, el logo debe mantener una relación de aspecto de `35 / 4` y tener un relleno alrededor del texto. En primer lugar, cambia el `background-color` a `#0a0a23` para que pueda ver el logo. Luego, usa la propiedad `aspect-ratio` para establecer la relación de aspecto a `35 / 4`. Finalmente, agrega alrededor un `padding` de `0.4rem`. diff --git a/curriculum/challenges/espanol/14-responsive-web-design-22/learn-accessibility-by-building-a-quiz/6145f8f8bcd4370f6509078e.md b/curriculum/challenges/espanol/14-responsive-web-design-22/learn-accessibility-by-building-a-quiz/6145f8f8bcd4370f6509078e.md index d8ceac3517743b..f3318b766b0364 100644 --- a/curriculum/challenges/espanol/14-responsive-web-design-22/learn-accessibility-by-building-a-quiz/6145f8f8bcd4370f6509078e.md +++ b/curriculum/challenges/espanol/14-responsive-web-design-22/learn-accessibility-by-building-a-quiz/6145f8f8bcd4370f6509078e.md @@ -16,8 +16,6 @@ California
    USA ``` -Puedes visitarlo, pero puede que no encuentres nada... - # --hints-- Debes agregar el texto de arriba incluyendo las etiquetas `
    ` en el elemento `address`. diff --git a/curriculum/challenges/espanol/14-responsive-web-design-22/learn-accessibility-by-building-a-quiz/6148e41c728f65138addf9cc.md b/curriculum/challenges/espanol/14-responsive-web-design-22/learn-accessibility-by-building-a-quiz/6148e41c728f65138addf9cc.md new file mode 100644 index 00000000000000..bbaf79b5b221c7 --- /dev/null +++ b/curriculum/challenges/espanol/14-responsive-web-design-22/learn-accessibility-by-building-a-quiz/6148e41c728f65138addf9cc.md @@ -0,0 +1,360 @@ +--- +id: 6148e41c728f65138addf9cc +title: Paso 66 +challengeType: 0 +dashedName: step-66 +--- + +# --description-- + +Ciertos tipos de animaciones basadas en el movimiento pueden causar molestias a algunos usuarios. En particular, personas con trastornos vestibulares tienen sensibilidad a ciertos desencadenantes del movimiento. + +La regla-at `@media` tiene una característica de medios llamada `prefers-reduced-motion` para establecer CSS basado en las preferencias del usuario. Puede tomar uno de los siguientes valores: + +- `reduce` +- `no-preference` + +```CSS +@media (feature: value) { + selector { + styles + } +} +``` + +--- + +Envuelve la regla de estilo que establece `scroll-behavior: smooth` dentro de una regla-at `@media` con la característica de medios `prefers-reduced-motion` que tiene `no-preference` establecido como valor. + +# --hints-- + +Debes tener una regla `@media (prefers-reduced-motion: no-preference)`. + +```js +assert.equal(new __helpers.CSSHelp(document).getRuleListsWithinMedia('(prefers-reduced-motion: no-preference)').length, 1); +``` + +Debes envolver la regla `*` existente dentro de la regla `@media`. + +```js +assert.equal(new __helpers.CSSHelp(document).getRuleListsWithinMedia('(prefers-reduced-motion: no-preference)')?.find(x => x.selectorText === '*')?.style?.scrollBehavior, 'smooth'); +assert.notExists(new __helpers.CSSHelp(document).getStyle('*')); +``` + +# --seed-- + +## --seed-contents-- + +```html + + + + + + + Accessibility Quiz + + + +
    + +

    HTML/CSS Quiz

    + +
    +
    +
    +
    +

    Student Info

    +
    + + +
    +
    + + +
    +
    + + +
    +
    +
    +

    HTML

    +
    +

    1

    +
    + + The legend element represents a caption for the content of its + parent fieldset element + +
      +
    • + +
    • +
    • + +
    • +
    +
    +
    +
    +

    2

    +
    + + A label element nesting an input element is required to have a + for attribute with the same value as the input's id + +
      +
    • + +
    • +
    • + +
    • +
    +
    +
    +
    +
    +

    CSS

    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    + + + + +``` + +```css +--fcc-editable-region-- +* { + scroll-behavior: smooth; +} +--fcc-editable-region-- + +body { + background: #f5f6f7; + color: #1b1b32; + font-family: Helvetica; + margin: 0; +} + +header { + width: 100%; + height: 50px; + background-color: #1b1b32; + display: flex; + justify-content: space-between; + align-items: center; + position: fixed; + top: 0; +} + +#logo { + width: max(100px, 18vw); + background-color: #0a0a23; + aspect-ratio: 35 / 4; + padding: 0.4rem; +} + +h1 { + color: #f1be32; + font-size: min(5vw, 1.2em); + text-align: center; +} + +nav { + width: 50%; + max-width: 300px; + height: 50px; +} + +nav > ul { + display: flex; + justify-content: space-evenly; + flex-wrap: wrap; + align-items: center; + padding-inline-start: 0; + margin-block: 0; + height: 100%; +} + +nav > ul > li { + color: #dfdfe2; + margin: 0 0.2rem; + padding: 0.2rem; + display: block; +} + +nav > ul > li:hover { + background-color: #dfdfe2; + color: #1b1b32; + cursor: pointer; +} + +li > a { + color: inherit; + text-decoration: none; +} + +main { + padding-top: 50px; +} + +section { + width: 80%; + margin: 0 auto 10px auto; + max-width: 600px; +} + +h1, +h2 { + font-family: Verdana, Tahoma; +} + +h2 { + border-bottom: 4px solid #dfdfe2; + margin-top: 0px; + padding-top: 60px; +} + +.info { + padding: 10px 0 0 5px; +} + +.formrow { + margin-top: 30px; + padding: 0px 15px; +} + +input { + font-size: 16px; +} + +.info label, .info input { + display: inline-block; + text-align: right; +} + +.info input { + width: 50%; + text-align: left; +} + +.info label { + width: 10%; + min-width: 55px; +} + +.question-block { + text-align: left; + display: block; + width: 100%; + margin-top: 20px; + padding-top: 5px; +} + +p { + margin-top: 5px; + padding-left: 15px; + font-size: 20px; +} + +p::before { + content: "Question #"; +} + +.question { + border: none; + padding-bottom: 0; +} + +.answers-list { + list-style: none; + padding: 0; +} + +button { + display: block; + margin: 40px auto; + width: 40%; + padding: 15px; + font-size: 23px; + background: #d0d0d5; + border: 3px solid #3b3b4f; +} + +footer { + background-color: #2a2a40; + display: flex; + justify-content: center; +} + +footer, +footer a { + color: #dfdfe2; +} + +address { + text-align: center; + padding: 0.3em; +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + +``` diff --git a/curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f33071498eb2472b87ddee4.md b/curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f33071498eb2472b87ddee4.md index 6de9cb5881dbb7..62f245a88a3258 100644 --- a/curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f33071498eb2472b87ddee4.md +++ b/curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f33071498eb2472b87ddee4.md @@ -9,7 +9,7 @@ dashedName: step-1 Como has aprendido en los pasos anteriores del proyecto Cat Photo App, hay una estructura básica necesaria para comenzar a construir tu página web. -Añade la etiqueta `` y un elemento `html`. +Añade la etiqueta `` y un elemento `html` con un atributo `lang` con el valor `en`. # --hints-- @@ -19,10 +19,10 @@ Debes tener la declaración `DOCTYPE`. assert(code.match(//i)); ``` -Debes tener una etiqueta `` de apertura. +Debes tener una etiqueta `` de apertura con un atributo `lang` con el valor `en`. ```js -assert(code.match(//i)); +assert(code.match(//gi)); ``` Debes tener una etiqueta `` de cierre. Recuerda que las etiquetas de cierre tienen una `/` después del corchete `<` de apertura. diff --git a/curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3477ae34c1239cafe128be.md b/curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3477ae34c1239cafe128be.md index 32dd008fd2fbd9..35cb66951c3610 100644 --- a/curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3477ae34c1239cafe128be.md +++ b/curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3477ae34c1239cafe128be.md @@ -15,7 +15,7 @@ selector1, selector2 { } ``` -Usa una lista de selectores para centrar los elementos `h1`, `h2` y `p` al mismo tiempo. +Elimina los tres selectores de tipo existentes y reemplázalos con una sola lista de selectores, que centre el texto de los elementos `h1`, `h2` y `p`. # --hints-- diff --git a/curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3477aefa51bfc29327200b.md b/curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3477aefa51bfc29327200b.md index e339bd686a7d4a..d8ae8b51bd0971 100644 --- a/curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3477aefa51bfc29327200b.md +++ b/curriculum/challenges/espanol/14-responsive-web-design-22/learn-basic-css-by-building-a-cafe-menu/5f3477aefa51bfc29327200b.md @@ -31,12 +31,10 @@ Tu selector debe establecer la propiedad `text-align` al valor `center`. } ``` -Debes tener un solo selector. +Tu código no debe contener las etiquetas `