From f8e13de29bdd47401bb8df68b26925e4a47df84b Mon Sep 17 00:00:00 2001 From: Lucas Viana Date: Sat, 26 Oct 2024 08:28:43 -0300 Subject: [PATCH] =?UTF-8?q?feat(react-hook-form):=20adiciona=20conte=C3=BA?= =?UTF-8?q?do=20do=20worshop=20rhf?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/deploy.yml | 5 + apps/home/app/resources.tsx | 13 + apps/react-hook-form/.gitignore | 22 ++ apps/react-hook-form/README.md | 3 + apps/react-hook-form/astro.config.mjs | 67 ++++ apps/react-hook-form/package.json | 22 ++ apps/react-hook-form/public/about.txt | 6 + .../public/android-chrome-192x192.png | Bin 0 -> 3029 bytes .../public/android-chrome-512x512.png | Bin 0 -> 11632 bytes .../public/apple-touch-icon.png | Bin 0 -> 2920 bytes apps/react-hook-form/public/favicon-16x16.png | Bin 0 -> 539 bytes apps/react-hook-form/public/favicon-32x32.png | Bin 0 -> 690 bytes apps/react-hook-form/public/favicon.ico | Bin 0 -> 15406 bytes apps/react-hook-form/public/site.webmanifest | 1 + .../src/assets/images/app1.png | Bin 0 -> 162829 bytes apps/react-hook-form/src/assets/zod.svg | 9 + apps/react-hook-form/src/content/config.ts | 6 + .../00-intro/01-Introdu\303\247\303\243o.md" | 11 + .../docs/00-intro/02-o-que-vamos-aprender.md | 51 +++ .../docs/00-intro/03-pre-requisitos.md | 8 + .../content/docs/00-intro/04-repositorio.md | 11 + .../01-o-que-e-react-hook-form.md | 25 ++ .../02-por-que-react-hook-form-e-util.md | 50 +++ .../01-instalando-react-hook-form.md | 41 +++ .../02-configurando-o-projeto.md | 50 +++ .../docs/03-basic-usage/01-simple-string.md | 37 ++ .../03-basic-usage/02-validating-email.md | 43 +++ .../03-basic-usage/03-validating-numbers.md | 41 +++ .../03-basic-usage/04-validating-checkbox.md | 38 ++ .../05-validating-email-array.md | 57 +++ .../06-validating-simple-object.md | 45 +++ .../01-simple-form.md | 29 ++ .../02-custom-validation.md | 33 ++ .../03-controlled-components.md | 27 ++ .../04-state-management-form.md | 34 ++ .../05-field-array.md | 49 +++ .../06-external-ui.md | 50 +++ .../07-async-form.md | 32 ++ .../01-controller-non-native-fields.md | 120 +++++++ .../docs/05-react-forms/02-multi-step.md | 208 +++++++++++ .../src/content/docs/index.mdx | 17 + apps/react-hook-form/src/env.d.ts | 2 + apps/react-hook-form/src/tailwind.css | 3 + apps/react-hook-form/tailwind.config.mjs | 18 + apps/react-hook-form/tsconfig.json | 3 + apps/zod/.astro/settings.json | 5 + apps/zod/.astro/types.d.ts | 339 ++++++++++++++++++ pnpm-lock.yaml | 39 +- 48 files changed, 1664 insertions(+), 6 deletions(-) create mode 100644 apps/react-hook-form/.gitignore create mode 100644 apps/react-hook-form/README.md create mode 100644 apps/react-hook-form/astro.config.mjs create mode 100644 apps/react-hook-form/package.json create mode 100644 apps/react-hook-form/public/about.txt create mode 100644 apps/react-hook-form/public/android-chrome-192x192.png create mode 100644 apps/react-hook-form/public/android-chrome-512x512.png create mode 100644 apps/react-hook-form/public/apple-touch-icon.png create mode 100644 apps/react-hook-form/public/favicon-16x16.png create mode 100644 apps/react-hook-form/public/favicon-32x32.png create mode 100644 apps/react-hook-form/public/favicon.ico create mode 100644 apps/react-hook-form/public/site.webmanifest create mode 100644 apps/react-hook-form/src/assets/images/app1.png create mode 100644 apps/react-hook-form/src/assets/zod.svg create mode 100644 apps/react-hook-form/src/content/config.ts create mode 100644 "apps/react-hook-form/src/content/docs/00-intro/01-Introdu\303\247\303\243o.md" create mode 100644 apps/react-hook-form/src/content/docs/00-intro/02-o-que-vamos-aprender.md create mode 100644 apps/react-hook-form/src/content/docs/00-intro/03-pre-requisitos.md create mode 100644 apps/react-hook-form/src/content/docs/00-intro/04-repositorio.md create mode 100644 apps/react-hook-form/src/content/docs/01-intro-react-hook-form/01-o-que-e-react-hook-form.md create mode 100644 apps/react-hook-form/src/content/docs/01-intro-react-hook-form/02-por-que-react-hook-form-e-util.md create mode 100644 apps/react-hook-form/src/content/docs/02-setup-react-hook-form/01-instalando-react-hook-form.md create mode 100644 apps/react-hook-form/src/content/docs/02-setup-react-hook-form/02-configurando-o-projeto.md create mode 100644 apps/react-hook-form/src/content/docs/03-basic-usage/01-simple-string.md create mode 100644 apps/react-hook-form/src/content/docs/03-basic-usage/02-validating-email.md create mode 100644 apps/react-hook-form/src/content/docs/03-basic-usage/03-validating-numbers.md create mode 100644 apps/react-hook-form/src/content/docs/03-basic-usage/04-validating-checkbox.md create mode 100644 apps/react-hook-form/src/content/docs/03-basic-usage/05-validating-email-array.md create mode 100644 apps/react-hook-form/src/content/docs/03-basic-usage/06-validating-simple-object.md create mode 100644 apps/react-hook-form/src/content/docs/04-exemplos-de-formularios-com-react-hook-form/01-simple-form.md create mode 100644 apps/react-hook-form/src/content/docs/04-exemplos-de-formularios-com-react-hook-form/02-custom-validation.md create mode 100644 apps/react-hook-form/src/content/docs/04-exemplos-de-formularios-com-react-hook-form/03-controlled-components.md create mode 100644 apps/react-hook-form/src/content/docs/04-exemplos-de-formularios-com-react-hook-form/04-state-management-form.md create mode 100644 apps/react-hook-form/src/content/docs/04-exemplos-de-formularios-com-react-hook-form/05-field-array.md create mode 100644 apps/react-hook-form/src/content/docs/04-exemplos-de-formularios-com-react-hook-form/06-external-ui.md create mode 100644 apps/react-hook-form/src/content/docs/04-exemplos-de-formularios-com-react-hook-form/07-async-form.md create mode 100644 apps/react-hook-form/src/content/docs/05-react-forms/01-controller-non-native-fields.md create mode 100644 apps/react-hook-form/src/content/docs/05-react-forms/02-multi-step.md create mode 100644 apps/react-hook-form/src/content/docs/index.mdx create mode 100644 apps/react-hook-form/src/env.d.ts create mode 100644 apps/react-hook-form/src/tailwind.css create mode 100644 apps/react-hook-form/tailwind.config.mjs create mode 100644 apps/react-hook-form/tsconfig.json create mode 100644 apps/zod/.astro/settings.json create mode 100644 apps/zod/.astro/types.d.ts diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index b9c9e2d..a2a7fa0 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -37,6 +37,7 @@ jobs: apps/next-introdutorio/node_modules/.astro apps/ts-no-react/node_modules/.astro apps/zod/node_modules/.astro + apps/react-hook-form/node_modules/.astro key: ${{ runner.os }}-astro-${{ hashFiles('**/pnpm-lock.yaml') }} restore-keys: | ${{ runner.os }}-astro- @@ -56,6 +57,7 @@ jobs: apps/next-introdutorio/dist/ apps/ts-no-react/dist/ apps/zod/dist/ + apps/react-hook-form/dist/ # Add more apps as needed deploy: @@ -79,6 +81,9 @@ jobs: - name: 'zod' path: './zod/dist/' remote_path: '/var/www/guias/zod/' + - name: 'react-hook-form' + path: './react-hook-form/dist/' + remote_path: '/var/www/guias/react-hook-form/' # Add more apps as needed steps: diff --git a/apps/home/app/resources.tsx b/apps/home/app/resources.tsx index 60bb735..339e22c 100644 --- a/apps/home/app/resources.tsx +++ b/apps/home/app/resources.tsx @@ -13,6 +13,7 @@ import { ChatBubbleIcon } from '@/components/icons/ChatBubbleIcon'; import { NextJsIcon } from '@/components/icons/NextJsIcon'; import { UsersIcon } from '@/components/icons/UsersIcon'; import { SiZod } from '@icons-pack/react-simple-icons'; +import { SiReact } from '@icons-pack/react-simple-icons'; interface Resource { href: string; @@ -86,6 +87,18 @@ const resources: Array = [ ], }, }, + { + // full href + href: 'https://guias.codante.io/react-hook-form', + name: 'React Hook Form', + description: + 'Aprenda a biblioteca mais popular de validação e criação de formulários em React.', + icon: SiReact, + pattern: { + y: 32, + squares: [[0, 2]], + }, + }, // { // href: '/messages', // name: 'Mensagens', diff --git a/apps/react-hook-form/.gitignore b/apps/react-hook-form/.gitignore new file mode 100644 index 0000000..49ceb21 --- /dev/null +++ b/apps/react-hook-form/.gitignore @@ -0,0 +1,22 @@ +# build output +dist/ +# generated types +.astro/ + +# dependencies +node_modules/ + +# logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + + +# environment variables +.env +.env.production + +# macOS-specific files +.DS_Store +.vercel diff --git a/apps/react-hook-form/README.md b/apps/react-hook-form/README.md new file mode 100644 index 0000000..497fdd3 --- /dev/null +++ b/apps/react-hook-form/README.md @@ -0,0 +1,3 @@ +# Guia - React Hook Form + +Guia construído com [Starlight](https://starlight.astro.build) para workshop do codante de React Hook Form. diff --git a/apps/react-hook-form/astro.config.mjs b/apps/react-hook-form/astro.config.mjs new file mode 100644 index 0000000..2d97dda --- /dev/null +++ b/apps/react-hook-form/astro.config.mjs @@ -0,0 +1,67 @@ +import { defineConfig } from 'astro/config'; +import starlight from '@astrojs/starlight'; + +import tailwind from '@astrojs/tailwind'; + +// https://astro.build/config +export default defineConfig({ + base: '/react-hook-form/', + integrations: [ + starlight({ + favicon: '/favicon.ico', + title: 'React Hook Form', + editLink: { + baseUrl: + 'https://github.com/codante-io/guias/edit/main/apps/react-hook-form/', + }, + social: { + github: 'https://github.com/robertotcestari', + 'x.com': 'https://x.com/robertotcestari', + linkedin: 'https://www.linkedin.com/in/robertotcestari/', + email: 'mailto:robertotcestari@gmail.com', + }, + customCss: ['./src/tailwind.css'], + sidebar: [ + { + label: 'Intro ao Workshop', + autogenerate: { + directory: '00-intro', + }, + }, + + { + label: '1. Introdução ao React Hook Form', + autogenerate: { + directory: '01-intro-react-hook-form', + }, + }, + { + label: '2. Configurando o Ambiente de Desenvolvimento', + autogenerate: { + directory: '02-setup-react-hook-form', + }, + }, + + { + label: '3. Uso Básico', + autogenerate: { + directory: '03-basic-usage', + }, + }, + { + label: '4. Exemplos de Formulários com React Hook Form', + autogenerate: { + directory: '04-exemplos-de-formularios-com-react-hook-form', + }, + }, + { + label: '5. Recursos Avançados do React Hook Form', + autogenerate: { + directory: '05-react-forms', + }, + }, + ], + }), + tailwind({ applyBaseStyles: false }), + ], +}); diff --git a/apps/react-hook-form/package.json b/apps/react-hook-form/package.json new file mode 100644 index 0000000..3ab6556 --- /dev/null +++ b/apps/react-hook-form/package.json @@ -0,0 +1,22 @@ +{ + "name": "react-hook-form", + "type": "module", + "version": "0.0.1", + "scripts": { + "dev": "astro dev", + "start": "astro dev", + "build": "astro check --minimumSeverity warning && astro build", + "preview": "astro preview", + "astro": "astro" + }, + "dependencies": { + "@astrojs/check": "^0.4.1", + "@astrojs/starlight": "^0.17.2", + "@astrojs/starlight-tailwind": "^2.0.1", + "@astrojs/tailwind": "^5.1.0", + "astro": "^4.2.1", + "sharp": "^0.32.5", + "tailwindcss": "^3.4.1", + "typescript": "^5.3.3" + } +} diff --git a/apps/react-hook-form/public/about.txt b/apps/react-hook-form/public/about.txt new file mode 100644 index 0000000..cbf0103 --- /dev/null +++ b/apps/react-hook-form/public/about.txt @@ -0,0 +1,6 @@ +This favicon was generated using the following graphics from Twitter Twemoji: + +- Graphics Title: 1f47e.svg +- Graphics Author: Copyright 2020 Twitter, Inc and other contributors (https://github.com/twitter/twemoji) +- Graphics Source: https://github.com/twitter/twemoji/blob/master/assets/svg/1f47e.svg +- Graphics License: CC-BY 4.0 (https://creativecommons.org/licenses/by/4.0/) diff --git a/apps/react-hook-form/public/android-chrome-192x192.png b/apps/react-hook-form/public/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..ca3cacaa78e7f59be73c6896c74ff4dfd387e081 GIT binary patch literal 3029 zcmd^BXH=6}8vfEu2qJ-i1u01ef)WuC1cv$zC4fNaCF%%dXaWN$%>k5vGfG*cD0o0Z zh$s+XU^sDEIHFw&?w(6AUHFC7{fD2UXz5bh_SlDPy(N51PH20~(pGzLeef)s zuk!Tu{gzl2_Hie(JGqajE_W8>z*pyxKGHM<*Y01W9?C>N1x8|-)|7#Y@D^gO78 zZM3_i7KCm*C|~vCFr}cB>KcqsSFTEa|Iugc!1hVKGP(q&;%&^X$Cvrb5(BJWEP3%d z<x$W8XaMqKhvZTPbCBgn08r64FC*P(%mpsqr$)Q>$Z~4} zuYYIt!%o0JWs~_!ortjQ_zwokj1C`X*Qa;tvsoYRN%uV&#xMb!>5bjmi%1Ya{*`7m zoB*Zxk2L8p901!(Q^sJM2SDr;GK9SAE&vi_Qt=RMjVJ(|02YWqC}K+kFkF5Y5<+(e zmI+|~s-iCnWcr9!L(R~Ljobk{prvZupk zRa*M212qY;_D*9>yj=5wVlt!Zoas%(Z&BurV~C+FF?Gv7q9cQbnqQ5rQG&OgzfVo& zt+!5-CJi;Ls@hAVe>>o7NTHfJI2&layyCa3H}0-FDnXzhTKu$NFzo2t7-pU)%h13S zvsh5M>ESfBz^#pmq57=bIRkIV@qjbCBJPL+yaK-8x;kpV6bvUQDBo8|h7$w=&C+I2 z0)Xjn`g{13fPY5FzW}>9xLN&FG+N)iIt3Ahdzu965G@PGy-j+V#} zAQ?Dd$2v;_3H`I(M>B3)mlO)sB8)cKEq7vG5=9-HZ@>4p-%t$D^l6D1%;1vPTIzOl z$Vi2jcj?Qy31uDeO$)k`6#=T2&)B*5UpVyi5}b%z#@I(v>gJ63)yZ7pwGrn%7~?k4IhG0zr4T zJ4BEVx7fhr-i2Q@a&X&OQ*Rx2pDH&!4I|E|#RHzXHTE$?a&9Ju0uH-+xG*#7GY$<= zC?Muhv^o#?%yWaC-KA-*0V(eBCNbV945tx`qfNefy|@eiWxou}_!tq?Q9`cA1LX~g zA^5j8A&DK{DzPZ)o*{X!5Ye3{jCb|&*1TV&wa$xk8Vw-!EbImP#YaS7TtB=L)wf13MskHQeWJ9;QKt_o9$!YVf&oUnqw#2@)x z>njX9+>^o(m1-?~9c+?i4fP4zL@O5dG1fRE0kTk-^0Wr!tpKM*OeMCb#2AMO;4$85u7&gY-{nFq-$D$#!xo4;sD zGEsY6!4Z#&dw!wap=NpAAz(6GeZaLxttk?P%fy?oINCQeI2}nc)8Bs|Mb3OQ%vkiY zKeN>PSw4Rx8lX$1my&AIf`{bgACnW6s%X}~TL>IQ8rnGVG%jP+HDZ=lng6Y+kk3S$GgI>|LVM#)9s;7frj)LI`k=;GVVUR6p+qqlk{wD}B zCk17yf8AiEq1Dk&@smCh^z(jgqscO0|DDmr6uNoi!|2DQi=!)2*Gzg&uH4;7 zQ>^wf{IR8HG8ylh%)4LY!tL1CrqQWi84WokVe+>Ax38L}G9~Dh+cW&_zNj~;Z=x=L znb<_}qiKzKDWy_rk0T;{BChy?Bj7ItuqTWNO4VT%zX5v`3I9ib_f!OBZRUAVCoIKt z3Inj-oGbKqBUH|rd&hk)MTLfqEE&nxch(JGD;u4vuUN?J(xdbRI#-w1u#GJHl3EH$ z9R&||aYv%2d%nb_CjEH|@Go-rBYx5edeGADSY6I)L&W!+w@hv#eQlI+vfmuKCG7bMw)fa8jKz%x3X+|?GGxmu8I~h?7IRF3v literal 0 HcmV?d00001 diff --git a/apps/react-hook-form/public/android-chrome-512x512.png b/apps/react-hook-form/public/android-chrome-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..b39d25e8a6773335fa0d54c4229f2954633b907a GIT binary patch literal 11632 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 LK%3VgeUttP>^@Vu literal 0 HcmV?d00001 diff --git a/apps/react-hook-form/public/favicon-16x16.png b/apps/react-hook-form/public/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..a5e84cbcdd9a20bb73a6dc95e34ecb0fcabf62fd GIT binary patch literal 539 zcmV+$0_6RPP)Px$)k#D_R5(walRan@Q51#Gc^eTiR*PVxWl{zV2s4SKNEKbv?F=?s2(}usAnSmY z@UjLrMB8-R$jo*zKUIn)aTbIKDNPw0LAHyCn0;5?Y-X9wPEt7KyZ3(gyz|ZwIp4y< zhwHbyr{m2pLD!Zm4|MToar|_5_r;%!?aTu_b+ywIEJdBbw{_3aVS!lx7zdpZfbZy1 z*a^1MfztiQ?d%JuJ_zOrs|a0CRcD z0JKqHwRQ0NFj3~}lL5ePHa+wHis6*mRt5FaDj5QJGj&gl32hgNV*$DV@As$VD}ka2 zCX%{Re)PE(T@J`J*a3URp#@n$*;!dthl1|{loCb2mJoL#aIy-|YkixB0GGUBdYqa#1W2CImt9t34=;ZMODbwetYwhpThw doh@cP_y_HQ4K&$U9RvUX002ovPDHLkV1oXc?M?sy literal 0 HcmV?d00001 diff --git a/apps/react-hook-form/public/favicon-32x32.png b/apps/react-hook-form/public/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..68a17d355a0b9b41051f22960fd190f016066704 GIT binary patch literal 690 zcmV;j0!{siP)Px%Y)M2xR9HvtRy|A~U5$MtevUjw{c_ zpFpp%u@de`G%>L@QTB*|1}mVk0CE;uO2FIqnFa3HJ(tbikzh=2yL~h7&G)`}^UVnU z@h8p1&kjFLLG%2stJmIs$^G!}y?x0(+hM4FDET(G_-H%sxlI8WHSIA?%s^n3oZNyx zh-KO%AWBLwKJVma+W=xSkTIW>0KHyxa#LZOtn_S`$leRjM(REQ10u2n$Y#)=y(BLK zSQSz02mZ+irSjO%uyZq}{TNVvVx?^=5og|+91aIi=mAtiu(TccL+GM<4;E<0PkIp zdZe{mhwl0I~t$`#Q0ZEXkDjFCyCn=Z3B(*&Tzy*0O( zUk+`@%{-#G3^b;|S22GJM>qgkA~@qK!ve|v!!leWnD^Pn4;$05W!N-;ld9s08E6AI zRR)gQF`yF3bGlkxY0!lGWc5REEpeUHFa2vOkr>p~z3&HW!FC+^2>pjx>5z#iVk!ps|)*1B8FygCQKN7{pQous-NyVSDz15-QRZuZ$P91()HG;)JF01 zM17u!Ekq)+RdgnMTd9JKIlW1;=inZ}k*p0Mk^#RCpd;y)K0d6pk^<}6vu^C}8Bsd$ Y2i0jr+J0o!NB{r;07*qoM6N<$f;WCR!~g&Q literal 0 HcmV?d00001 diff --git a/apps/react-hook-form/public/favicon.ico b/apps/react-hook-form/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..efe18362a8e15f2eb2a10faa96a2447770d89f7c GIT binary patch literal 15406 zcmeHOON$&;6fPg2B0^LIQ5P*pn1#fkGFsI$+LA>KD59jQdq8Cv2#8C?T^0>aS9i~l zECe?LDlS~8e;{tc5HLf)EJB3DEFFyyNOlIvK;rk^s?&4kc2#v(b(dzCYPh+#&iT&c zo;vqg6UVv7xzE|R&p};tKDys=W*x_=)uQK_M;+&D&<-Aq`THH`>=TYN0}MnU5z$d) z{(5uG7edcJu`=(!o(3e37-DTquO0-U>)+{l%};EeJd-QauSv2AGJ3C*sh|G@o1Y}fNI8(okwZKD&s5&e&B z(|&qktcL8z@iTJlf8_Juct(N$h8F46^8NbKBaCae9(*e{g^w8i&O%%AeuyEKGL-GQ z{z_4K$|mU_Wq%YOI)7t-5%+&sOy5b1W11+>{B`|x!DQ6ylD|4Wj8S*ae`$n{bz+F+ z&&a#Yx1y)$-zblQG!OUOH&oE9-=+c>AIH2Rj_9|!^!*;h$*+@?hI&GP8o|!-L4hOa8 zAGKv+@92OZ&qtKCae1HjqWvA?f4=#m9aoHxV=}I#Ce6mJKvwug$G@$!=yTEWU(}v0 zSJ^K%|4JM&mv5Lc&T)={=gW%6J)xn;yba+=J!$-H`L5UeS#-0l=M`dwC$%lF@yqqr z%Ur9ZK<1{%No~vLwNIU*pEYgL2aZqd7vI#p|H3|P(l+~7Bz}4OKWY5-x;)<36^yOH zJ^=ahr{tz-E1o$g#A~o%CXJuyDO&F)`?CHb=6@CKugFmc$C3SUd#LFBZ{mD~PR@>BVvCq6fzIHTEw;4BL49@j0&_42gLugWy7W;NVXm-rC zUfLv1(?+$;UYg?yYn_cX>!0DJ-}Bfqd7t;X{eHdmRL^aB;q1FZ_gtirM@-(hR`~xf z0=y@|6|J*~lJ}kjBIeh2+V{2_iw|PFKcq{$(ZCJxbbr*TZLm$-^r5IFGsk*CA9K>0 zl+LTcmtnm%UsPwB9CaGq$`)+)v*zkFT|!^=n$KhI-L%$*o0wmZ31(U~b;6FlKi{Me zMQv36j~}@z{=>2AHd?i?&TkRHX(`y>{M7M+PdoMC4ZC2h&1T&@lh+5vmNU=LN!?<{ z)Udt!n*Z#uXT>R;*PwgN8q?AD8!x!nf91Vr(zKHY*^4Q%Yt)@4J1u(Ue--~pa%nf^ zPtyLUjdN4i4ZcbmgZOs%E6#?`v5!fGJYo`Mp_96`Tp9bH*!N3GK7e)|bY$H6ZK;s z{EhO#j1AK4bwA~Nr^iyFep?Tp!@1^uo`H11-D4YmB;-Q&`<thw4?D$;cTwvelVBR_<<7!ZQ!6_TpiRQd( z1I+L|U3UEST2My2@;^I&%80qvIZ^y~e!uX~AWye4a#h=%q`iglb0%J&63_4Bt}puj z1Tr6EzixkDn8eRSS=yj2?hn%LPsa6M_DHNb&mi{K<35z}9=2lLun{b2+jhH%|Dn4u zL%ocRdB4MRU1B`P&Nt)?bw_bp;OEEGUlIRB8Q-hP&8hnzjD3G@`Ooijo9OpR@iD7r zPQw2_WmMrFo$=>cmghmu({1vi^KP`S-{wIlb!XWY9(@%XJj1aduBm@hB66%bra3Q( zTzm#R2Yq*tzgKu3);!%Nj~HSRgL9fkoz$&urM2m+$fjZP(BaGJ*r)Nozd$CBjWV&7 y|7AvZwC>#=|DGEh#&?ND{J*SsRu6pea9WSaBZgS)oe!tsDtZ-xDgt{W0{;RDVldwT literal 0 HcmV?d00001 diff --git a/apps/react-hook-form/public/site.webmanifest b/apps/react-hook-form/public/site.webmanifest new file mode 100644 index 0000000..45dc8a2 --- /dev/null +++ b/apps/react-hook-form/public/site.webmanifest @@ -0,0 +1 @@ +{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file diff --git a/apps/react-hook-form/src/assets/images/app1.png b/apps/react-hook-form/src/assets/images/app1.png new file mode 100644 index 0000000000000000000000000000000000000000..3db589d56f07bf29264286308fc67c40039440c1 GIT binary patch literal 162829 zcmeFa2UJsAyEcj_77(#fq$?sIO`1pxxY>wGQ$SiMN((In2^|8WTU4rrUII#!F1;6} zNewmhL_vD5frN4wdw*r0EY5d4|@sFVn2Fq1udFS&!?=#;y*Yedpb!A#=W@-uw z3feojf7hg-I3Y_xL1lCNC~&69n5&F};t-FuqT)SUMP)^V9l}w|;gOleO>=~)g{Jav zB2rQ}C@6T}m_2-`d0T+@>!Y&|AAW7)=c9IX)qMFfQ1hYB=bC!X`kLm1=7&*{hKApm zPJgSVIC71d-mAQ!=J*HU*{7{vLK|sHG&KX>`L1zrwyO*AUVZfNVJk&mSc?j^!W=s% z^fDhyt1*Qs;~}===7>YN-52N1J(M`T!S*ToH7AUdbog~!#1Ts|-?>qh7oVsU>^@d< za!y6QjSo$ySgG`TpPc;s$}4Zq<99Xr?D9FxAeI6>M7T?Bu#qR)wk+J8hwUp)Nm z3FL5Xl~hx*lEpnUrl`OROvjfGc{bdAE^wBJ1S}VBp?AkpO^xCzaD1GC>d;w=!@$uY z;4j4?W(ul5k0~hb9%A{|vF0J(f80Y!LGi+x;>bVlF#vw=|9K7k08jtp_u;pG6vu#n zodtgWNTB@Z-6v!d4*&C*$_BVbaZ^k2&K=;lmYJi4g+0;=;l%FAEdZQ2;c#0YXek5t z{?DO1nwOU-C@4p)we_6z)KsO-5OASK`-3dx26xymheFm(8aRYoI6dNYgWK67rQPH% z{dtEpaJ+w7_!8%zw>a6#UD8v#$Ek>LwBWohbWP~mB?vVqC#S5Vxuvw`@3;Q(IPfpI zOIA)!4${KHuCA^^u3|z6N0=~xC@JAzyAEyP762df7fJ>{71Kd4hrvI5f%};CVbFiPS%$H z&13sl{(9`se*IOQ?0#X=50Dm)iU>H|!rlq;Z;Q+RS<`>H`0sZ9_24~gHw!zx->rcs zkwBjyqGH#@|M3|4r2`+;|M#OJVmGe;{n5W&`rD)XosibFKqBm%_l@|#-r5NwDl2@@ zY4WG^{{0w4L|j~0wL_38AIM-&ta6nB2VsqJ=XZp1axNY|Zr0Ufi@!8tyFSjH*7{-;9!DommNIImlJq_!0A&ozY_y?yj2TD;#1 zrbAR3^zW`7&$;V;B{MJ`5#UEX9)?WN6yPW zP)%nI{kfJg@>h4dq>Yszqk*l{9K5Nw{HQzk(9~Z89IeNk(6}~O>+L*;Qh_R$$5Fo35d9H>UM{JE)+=L1!!3Lj=_tc z3U2}Q0Bwh0%_W1#I9&WpWY#@2aWTayqb(RVJ#l^)}6!qaCZNQ zjOsSs-ppMe!?YQl&Z)>N+a)HQ3kk@;d%2%v?T|-%&6Jj`E|5%jh`Mz8u&IuVkEgjO z>tFG(vQ&Dm2OeYh5?ClDeD2S49=f=iXHQ(8Wkh5RnKi5>n)Q4Wb*eqZB6{M<<57>3w#l z_j0~%>h3M)i&&3t5_9A6+bv~JlV6Nx>}^I(4Xm#3g*uOqGd8B~&iK^pR&R}L_W6)* zu1$4vK~~e`16(WST|cCxq&yxG7cRs@BzSN;RUy|mB&$DW&7U#ZC1L8u5wg|ZSrcQ{ zIVQU^lFKlkt>VYu6kKw3RwswgfyUaY;)%wfb440G2rQ-ao8L$|0Y0P&d28;y#0d2vnyƙy6OsanX6aBIf^_c8lD>+0CImo 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

gSI(qVDG<)IWhj?6np#{>;DF5np0i&}S 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 XMe+2B1)QAkl)qz#9S)Tq@VfH + React Logo + + + + + + + diff --git a/apps/react-hook-form/src/content/config.ts b/apps/react-hook-form/src/content/config.ts new file mode 100644 index 0000000..45f60b0 --- /dev/null +++ b/apps/react-hook-form/src/content/config.ts @@ -0,0 +1,6 @@ +import { defineCollection } from 'astro:content'; +import { docsSchema } from '@astrojs/starlight/schema'; + +export const collections = { + docs: defineCollection({ schema: docsSchema() }), +}; diff --git "a/apps/react-hook-form/src/content/docs/00-intro/01-Introdu\303\247\303\243o.md" "b/apps/react-hook-form/src/content/docs/00-intro/01-Introdu\303\247\303\243o.md" new file mode 100644 index 0000000..061293a --- /dev/null +++ "b/apps/react-hook-form/src/content/docs/00-intro/01-Introdu\303\247\303\243o.md" @@ -0,0 +1,11 @@ +--- +title: Boas Vindas +description: Boas vindas ao workshop de React Hook Form! +--- + +Boas vindas ao nosso Workshop de React Hook Form! + +Este guia/website foi preparado para que você possa acompanhar o Workshop de forma mais eficaz! +Qualquer dúvida, sugestão ou correção, ficarei muito feliz se você enviar uma Issue ou um PR para o repositório. + +Vamos com tudo! diff --git a/apps/react-hook-form/src/content/docs/00-intro/02-o-que-vamos-aprender.md b/apps/react-hook-form/src/content/docs/00-intro/02-o-que-vamos-aprender.md new file mode 100644 index 0000000..6c9fcb1 --- /dev/null +++ b/apps/react-hook-form/src/content/docs/00-intro/02-o-que-vamos-aprender.md @@ -0,0 +1,51 @@ +--- +title: Conteúdo do Workshop +--- + +Vamos começar? Antes de mais nada, um overview do que iremos tratar no Workshop de hoje. Vamos em todo o workshop utilizar uma única aplicação que possuirá **várias formas de validação utilizando o React Hook Form**. + +### **Agenda do Workshop** + +--- + +### **1. Introdução ao React Hook Form** + +- O que é o React Hook Form? +- Por que o React Hook Form é útil? + +### **2. Configurando o Ambiente de Desenvolvimento** + +- Instalando o React Hook Form +- Configurando o projeto +- Exemplos básicos de uso. + +### **3. Uso Básico** + +- Validando uma string simples +- Validando um e-mail +- Validando um número com restrição de valor mínimo +- Validando um checkbox +- Validando um array de e-mails +- Validando um objeto simples + +### **4. Exemplos de Formulários com React Hook Form** + +- **Formulário Simples**: Validação de um campo de nome. +- **Validação Personalizada**: Campo de senha com requisitos de comprimento. +- **Componentes Controlados**: Checkbox para aceitar termos de uso. +- **Gestão do Estado do Formulário**: Uso do `watch` para visualizar mudanças em tempo real. +- **Field Array**: Manipulação de uma lista de e-mails usando `useFieldArray`. +- **Componentes de UI Externos**: Integração com bibliotecas de componentes, como `react-select`. +- **Submissão Assíncrona**: Simulando requisições assíncronas durante a submissão. + +### **5. Recursos Avançados do React Hook Form** + +- Uso do `Controller` para componentes não nativos. +- Estratégias para lidar com formulários complexos. + +### **Recursos Adicionais** + +- [Documentação do React Hook Form](https://react-hook-form.com/) +- [Documentação do Vite](https://vitejs.dev/) + +Este plano garante que você cubra todos os aspectos essenciais do React Hook Form enquanto mantém o público engajado com exemplos práticos e atividades hands-on. A estrutura inclui tanto explicações teóricas quanto codificação ao vivo, tornando o workshop interativo e informativo. diff --git a/apps/react-hook-form/src/content/docs/00-intro/03-pre-requisitos.md b/apps/react-hook-form/src/content/docs/00-intro/03-pre-requisitos.md new file mode 100644 index 0000000..fb56043 --- /dev/null +++ b/apps/react-hook-form/src/content/docs/00-intro/03-pre-requisitos.md @@ -0,0 +1,8 @@ +--- +title: Pré requisitos +--- + +Vamos aprender **React Hook Form** usando uma aplicação React na versão 19. Para que você consiga aproveitar o máximo esse workshop recomendamos que você possua: + +- Conhecimento básico sobre React +- Conhecimento básico sobre HTML, CSS e JS diff --git a/apps/react-hook-form/src/content/docs/00-intro/04-repositorio.md b/apps/react-hook-form/src/content/docs/00-intro/04-repositorio.md new file mode 100644 index 0000000..3016299 --- /dev/null +++ b/apps/react-hook-form/src/content/docs/00-intro/04-repositorio.md @@ -0,0 +1,11 @@ +--- +title: Repositório e Aplicação usados +--- + +A página inicial da aplicação é essa: + +![Página do App](../../../assets/images/app1.png) + +### Link do Repositório + +O repositório do exemplo da aula pode ser encontrado neste link: [https://github.com/mechamobau/codante-react-hook-form-workshop](https://github.com/mechamobau/codante-react-hook-form-workshop) diff --git a/apps/react-hook-form/src/content/docs/01-intro-react-hook-form/01-o-que-e-react-hook-form.md b/apps/react-hook-form/src/content/docs/01-intro-react-hook-form/01-o-que-e-react-hook-form.md new file mode 100644 index 0000000..14107a7 --- /dev/null +++ b/apps/react-hook-form/src/content/docs/01-intro-react-hook-form/01-o-que-e-react-hook-form.md @@ -0,0 +1,25 @@ +--- +title: O que é o React Hook Form? +--- + +O React Hook Form é uma biblioteca para gerenciamento de formulários em aplicações React. Ele permite que você crie, valide e gerencie formulários de maneira eficiente e com menos código. A biblioteca é leve e otimizada para desempenho, tornando-a uma escolha popular entre os desenvolvedores React. + +### Principais Características do React Hook Form + +- **Fácil Integração**: O React Hook Form se integra facilmente com componentes de formulário existentes e bibliotecas de UI, como Material-UI e Ant Design. +- **Validação Simplificada**: A biblioteca oferece suporte a validação de formulários usando validações nativas do HTML5, bem como bibliotecas de validação de terceiros, como Yup e Zod. +- **Desempenho**: O React Hook Form é otimizado para minimizar re-renderizações, resultando em melhor desempenho em comparação com outras bibliotecas de formulários. +- **Controle Total**: Você tem controle total sobre os dados do formulário e pode facilmente gerenciar estados complexos de formulários. + +### História do React Hook Form + +O React Hook Form foi criado por Bill Luo em 2019. A motivação por trás da criação do React Hook Form foi a necessidade de uma solução de gerenciamento de formulários que fosse simples de usar, mas poderosa o suficiente para lidar com casos de uso complexos. Bill queria uma ferramenta que pudesse ser facilmente integrada com React, fornecendo uma experiência de desenvolvimento mais suave e eficiente. + +### Inspirações + +Durante o desenvolvimento do React Hook Form, várias bibliotecas influenciaram seu design e funcionalidade. Algumas das principais inspirações incluem: + +- **Formik**: Uma biblioteca popular para gerenciamento de formulários em React. O React Hook Form se inspirou na simplicidade e na abordagem declarativa do Formik. +- **Redux Form**: Outra biblioteca de gerenciamento de formulários que é popular no ecossistema React. O React Hook Form buscou oferecer uma solução mais leve e com melhor desempenho em comparação com o Redux Form. + +Essas bibliotecas ajudaram a moldar o React Hook Form, resultando em uma ferramenta que combina o melhor de cada uma delas, oferecendo uma experiência de gerenciamento de formulários eficiente e amigável para desenvolvedores React. diff --git a/apps/react-hook-form/src/content/docs/01-intro-react-hook-form/02-por-que-react-hook-form-e-util.md b/apps/react-hook-form/src/content/docs/01-intro-react-hook-form/02-por-que-react-hook-form-e-util.md new file mode 100644 index 0000000..af6133b --- /dev/null +++ b/apps/react-hook-form/src/content/docs/01-intro-react-hook-form/02-por-que-react-hook-form-e-util.md @@ -0,0 +1,50 @@ +--- +title: Por que o React Hook Form é útil? +--- + +O **React Hook Form** é uma ferramenta extremamente útil para desenvolvedores que trabalham com **React**, especialmente quando se trata de **gerenciamento de formulários**. Hoje, vamos explorar por que o React Hook Form é tão valioso e como ele pode ser utilizado para garantir que os formulários em sua aplicação sejam gerenciados de maneira eficiente e com menos código. + +## Gerenciamento de formulários + +Em muitas aplicações, os formulários são uma parte essencial da interação do usuário. Gerenciar o estado dos formulários e validar os dados de entrada pode ser uma tarefa complexa e propensa a erros. O React Hook Form simplifica esse processo, fornecendo uma API intuitiva e eficiente para lidar com formulários em aplicações React. + +## Exemplo de uso básico + +Vamos criar um exemplo onde temos um formulário de login, e precisamos gerenciar o estado dos campos `username` e `password`. O React Hook Form nos permite fazer isso de maneira simples e eficiente. + +```jsx +import React from 'react'; +import { useForm } from 'react-hook-form'; + +function LoginForm() { + const { + register, + handleSubmit, + formState: { errors }, + } = useForm(); + + const onSubmit = (data) => { + console.log(data); + }; + + return ( +

+
+ + + {errors.username && Este campo é obrigatório} +
+ +
+ + + {errors.password && Este campo é obrigatório} +
+ + + + ); +} + +export default LoginForm; +``` diff --git a/apps/react-hook-form/src/content/docs/02-setup-react-hook-form/01-instalando-react-hook-form.md b/apps/react-hook-form/src/content/docs/02-setup-react-hook-form/01-instalando-react-hook-form.md new file mode 100644 index 0000000..7a98487 --- /dev/null +++ b/apps/react-hook-form/src/content/docs/02-setup-react-hook-form/01-instalando-react-hook-form.md @@ -0,0 +1,41 @@ +--- +title: Instalando o React Hook Form +--- + +Para começar a utilizar o **React Hook Form** em seus projetos, você precisa instalá-lo. O processo é simples e direto, seja você utilizando **npm** ou **yarn**. Vamos ver como fazer essa instalação. + +## Usando npm + +Se você utiliza o **npm** como seu gerenciador de pacotes, basta rodar o seguinte comando no terminal: + +```bash +npm install react-hook-form +``` + +Esse comando irá adicionar o React Hook Form ao seu projeto e o tornará disponível para uso imediato. + +## Usando yarn + +Se você prefere o **yarn**, o comando para instalar o React Hook Form é igualmente simples: + +```bash +yarn add react-hook-form +``` + +Assim como com npm, o React Hook Form será adicionado ao seu projeto, permitindo que você comece a utilizá-lo rapidamente. + +## Verificando a Instalação + +Após instalar o React Hook Form, você pode verificar se está funcionando corretamente importando-o em seu código: + +```jsx +import { useForm } from 'react-hook-form'; + +const { register, handleSubmit } = useForm(); +``` + +Se tudo estiver configurado corretamente, você poderá começar a utilizar os hooks para gerenciar seus formulários. + +## Conclusão + +Com o React Hook Form instalado, você está pronto para começar a criar e validar seus formulários de forma eficiente. Agora que a instalação foi concluída, vamos explorar como utilizá-lo em seus projetos! diff --git a/apps/react-hook-form/src/content/docs/02-setup-react-hook-form/02-configurando-o-projeto.md b/apps/react-hook-form/src/content/docs/02-setup-react-hook-form/02-configurando-o-projeto.md new file mode 100644 index 0000000..e48e9ef --- /dev/null +++ b/apps/react-hook-form/src/content/docs/02-setup-react-hook-form/02-configurando-o-projeto.md @@ -0,0 +1,50 @@ +--- +title: Configurando o projeto +--- + +Antes de começarmos a validar nossos dados com o React Hook Form, é importante configurar um ambiente básico para trabalharmos. Aqui está o passo a passo para configurar seu projeto. + +## Passo 1: Inicialize o Projeto + +Se você ainda não criou seu projeto, inicie um novo projeto com **npm** ou **yarn**: + +```bash +npm init -y +``` + +Ou, se estiver usando **yarn**: + +```bash +yarn init -y +``` + +Esse comando criará um `package.json` para gerenciar as dependências do seu projeto. + +## Passo 2: Instale o React Hook Form + +Conforme vimos anteriormente, instale o React Hook Form usando o comando: + +```bash +npm install react-hook-form +``` + +Ou com yarn: + +```bash +yarn add react-hook-form +``` + +Agora que o React Hook Form está instalado, podemos começar a utilizá-lo. + +## Passo 3: Estrutura do Projeto + +Sua estrutura de diretórios pode ser algo simples como: + +``` +/meu-projeto + ├── /src + │ └── index.ts + └── package.json +``` + +No arquivo `index.ts`, faremos nossos exemplos de validação com o React Hook Form. diff --git a/apps/react-hook-form/src/content/docs/03-basic-usage/01-simple-string.md b/apps/react-hook-form/src/content/docs/03-basic-usage/01-simple-string.md new file mode 100644 index 0000000..3279b4c --- /dev/null +++ b/apps/react-hook-form/src/content/docs/03-basic-usage/01-simple-string.md @@ -0,0 +1,37 @@ +--- +title: Validando uma string simples +--- + +### Validando uma string simples + +```jsx +import React from 'react'; +import { useForm } from 'react-hook-form'; + +const StringValidationForm = () => { + const { + register, + handleSubmit, + formState: { errors }, + } = useForm(); + + const onSubmit = (data) => { + console.log('Dados:', data); + }; + + return ( +
+ + {errors.name &&

{errors.name.message}

} + +
+ ); +}; + +export default StringValidationForm; +``` + +Neste exemplo, validamos se o campo `name` foi preenchido. Caso o campo esteja vazio, exibimos uma mensagem de erro. diff --git a/apps/react-hook-form/src/content/docs/03-basic-usage/02-validating-email.md b/apps/react-hook-form/src/content/docs/03-basic-usage/02-validating-email.md new file mode 100644 index 0000000..adf6830 --- /dev/null +++ b/apps/react-hook-form/src/content/docs/03-basic-usage/02-validating-email.md @@ -0,0 +1,43 @@ +--- +title: Validando um e-mail +--- + +### Validando um e-mail + +```jsx +import React from 'react'; +import { useForm } from 'react-hook-form'; + +const EmailValidationForm = () => { + const { + register, + handleSubmit, + formState: { errors }, + } = useForm(); + + const onSubmit = (data) => { + console.log('Dados:', data); + }; + + return ( +
+ + {errors.email &&

{errors.email.message}

} + +
+ ); +}; + +export default EmailValidationForm; +``` + +O React Hook Form permite validar se uma string é um e-mail válido usando expressões regulares. Caso o formato do e-mail esteja incorreto, a validação falhará. diff --git a/apps/react-hook-form/src/content/docs/03-basic-usage/03-validating-numbers.md b/apps/react-hook-form/src/content/docs/03-basic-usage/03-validating-numbers.md new file mode 100644 index 0000000..cbc3bed --- /dev/null +++ b/apps/react-hook-form/src/content/docs/03-basic-usage/03-validating-numbers.md @@ -0,0 +1,41 @@ +--- +title: Validando um número com restrição de valor mínimo +--- + +### Validando um número com restrição de valor mínimo + +```jsx +import React from 'react'; +import { useForm } from 'react-hook-form'; + +const NumberValidationForm = () => { + const { + register, + handleSubmit, + formState: { errors }, + } = useForm(); + + const onSubmit = (data) => { + console.log('Dados:', data); + }; + + return ( +
+ + {errors.age &&

{errors.age.message}

} + +
+ ); +}; + +export default NumberValidationForm; +``` + +Aqui estamos validando que o número inserido seja no mínimo 18. Caso seja menor, o React Hook Form exibirá uma mensagem de erro. diff --git a/apps/react-hook-form/src/content/docs/03-basic-usage/04-validating-checkbox.md b/apps/react-hook-form/src/content/docs/03-basic-usage/04-validating-checkbox.md new file mode 100644 index 0000000..f62a680 --- /dev/null +++ b/apps/react-hook-form/src/content/docs/03-basic-usage/04-validating-checkbox.md @@ -0,0 +1,38 @@ +--- +title: Validando um checkbox +--- + +### Validando um checkbox + +```jsx +import React from 'react'; +import { useForm } from 'react-hook-form'; + +const CheckboxValidationForm = () => { + const { + register, + handleSubmit, + formState: { errors }, + } = useForm(); + + const onSubmit = (data) => { + console.log('Dados:', data); + }; + + return ( +
+ {' '} + Aceito os termos + {errors.terms &&

{errors.terms.message}

} + +
+ ); +}; + +export default CheckboxValidationForm; +``` + +Esse exemplo mostra a validação de um checkbox para aceitar os termos de uso. Se o usuário não marcar a opção, uma mensagem de erro será exibida. diff --git a/apps/react-hook-form/src/content/docs/03-basic-usage/05-validating-email-array.md b/apps/react-hook-form/src/content/docs/03-basic-usage/05-validating-email-array.md new file mode 100644 index 0000000..207be91 --- /dev/null +++ b/apps/react-hook-form/src/content/docs/03-basic-usage/05-validating-email-array.md @@ -0,0 +1,57 @@ +--- +title: Validando um array de e-mails +--- + +### Validando um array de e-mails + +```jsx +import React from 'react'; +import { useForm, useFieldArray } from 'react-hook-form'; + +const EmailArrayValidationForm = () => { + const { + register, + control, + handleSubmit, + formState: { errors }, + } = useForm(); + const { fields, append, remove } = useFieldArray({ control, name: 'emails' }); + + const onSubmit = (data) => { + console.log('Dados:', data); + }; + + return ( +
+ {fields.map((field, index) => ( +
+ + {errors.emails?.[index]?.address && ( +

{errors.emails[index].address.message}

+ )} + +
+ ))} + + +
+ ); +}; + +export default EmailArrayValidationForm; +``` + +Aqui estamos validando que o array contenha apenas e-mails válidos. Se qualquer elemento do array for de um formato incorreto, uma mensagem de erro será exibida. diff --git a/apps/react-hook-form/src/content/docs/03-basic-usage/06-validating-simple-object.md b/apps/react-hook-form/src/content/docs/03-basic-usage/06-validating-simple-object.md new file mode 100644 index 0000000..02ac79a --- /dev/null +++ b/apps/react-hook-form/src/content/docs/03-basic-usage/06-validating-simple-object.md @@ -0,0 +1,45 @@ +--- +title: Validando um objeto simples +--- + +Esses exemplos mostram como o React Hook Form facilita a criação e validação de formulários básicos como strings, números, booleanos, arrays e objetos. A flexibilidade e simplicidade do React Hook Form tornam sua aplicação em formulários bastante eficiente, além de melhorar a qualidade e usabilidade das aplicações. + +### Validando um objeto simples + +```jsx +import React from 'react'; +import { useForm } from 'react-hook-form'; + +const ObjectValidationForm = () => { + const { + register, + handleSubmit, + formState: { errors }, + } = useForm(); + + const onSubmit = (data) => { + console.log('Dados:', data); + }; + + return ( +
+ + {errors.name &&

{errors.name.message}

} + + {errors.age &&

{errors.age.message}

} + +
+ ); +}; + +export default ObjectValidationForm; +``` + +Neste exemplo, validamos um objeto que contém duas propriedades: `name` como string e `age` como número. diff --git a/apps/react-hook-form/src/content/docs/04-exemplos-de-formularios-com-react-hook-form/01-simple-form.md b/apps/react-hook-form/src/content/docs/04-exemplos-de-formularios-com-react-hook-form/01-simple-form.md new file mode 100644 index 0000000..e7ceee2 --- /dev/null +++ b/apps/react-hook-form/src/content/docs/04-exemplos-de-formularios-com-react-hook-form/01-simple-form.md @@ -0,0 +1,29 @@ +--- +title: Formulário Simples Validação de um campo de nome. +--- + +```tsx +import { useForm } from 'react-hook-form'; + +type SimpleFormData = { + name: string; +}; + +export const SimpleForm = () => { + const { register, handleSubmit } = useForm(); + const onSubmit = (data: SimpleFormData) => alert(JSON.stringify(data)); + + return ( +
+ + +
+ ); +}; +``` diff --git a/apps/react-hook-form/src/content/docs/04-exemplos-de-formularios-com-react-hook-form/02-custom-validation.md b/apps/react-hook-form/src/content/docs/04-exemplos-de-formularios-com-react-hook-form/02-custom-validation.md new file mode 100644 index 0000000..ff3995b --- /dev/null +++ b/apps/react-hook-form/src/content/docs/04-exemplos-de-formularios-com-react-hook-form/02-custom-validation.md @@ -0,0 +1,33 @@ +--- +title: Validação de Campos Específicos +--- + +```tsx +import { useForm } from 'react-hook-form'; + +type CustomValidationFormData = { + password: string; +}; + +export const CustomValidationForm = () => { + const { register, handleSubmit } = useForm(); + const onSubmit = (data: CustomValidationFormData) => + alert(JSON.stringify(data)); + + return ( +
+ + value.length >= 6 || 'Password must be at least 6 characters long', + })} + placeholder="Password" + className="p-2 border rounded mb-2" + /> + +
+ ); +}; +``` diff --git a/apps/react-hook-form/src/content/docs/04-exemplos-de-formularios-com-react-hook-form/03-controlled-components.md b/apps/react-hook-form/src/content/docs/04-exemplos-de-formularios-com-react-hook-form/03-controlled-components.md new file mode 100644 index 0000000..62df1d7 --- /dev/null +++ b/apps/react-hook-form/src/content/docs/04-exemplos-de-formularios-com-react-hook-form/03-controlled-components.md @@ -0,0 +1,27 @@ +--- +title: Componentes Controlados +--- + +```tsx +import { useForm } from 'react-hook-form'; + +type ControlledComponentFormData = { + accept: boolean; +}; + +export const ControlledComponentForm = () => { + const { register, handleSubmit } = useForm(); + const onSubmit = (data: ControlledComponentFormData) => + alert(JSON.stringify(data)); + + return ( +
+ Accept + Terms + +
+ ); +}; +``` diff --git a/apps/react-hook-form/src/content/docs/04-exemplos-de-formularios-com-react-hook-form/04-state-management-form.md b/apps/react-hook-form/src/content/docs/04-exemplos-de-formularios-com-react-hook-form/04-state-management-form.md new file mode 100644 index 0000000..301d681 --- /dev/null +++ b/apps/react-hook-form/src/content/docs/04-exemplos-de-formularios-com-react-hook-form/04-state-management-form.md @@ -0,0 +1,34 @@ +--- +title: Gestão do Estado do Formulário +--- + +```tsx +import { useForm } from 'react-hook-form'; + +type FormStateManagementFormData = { + name: string; +}; + +export const FormStateManagement = () => { + const { register, handleSubmit, watch } = + useForm(); + const name = watch('name', ''); + + const onSubmit = (data: FormStateManagementFormData) => + alert(JSON.stringify(data)); + + return ( +
+ +

Live preview: {name}

+ +
+ ); +}; +``` diff --git a/apps/react-hook-form/src/content/docs/04-exemplos-de-formularios-com-react-hook-form/05-field-array.md b/apps/react-hook-form/src/content/docs/04-exemplos-de-formularios-com-react-hook-form/05-field-array.md new file mode 100644 index 0000000..d3d0305 --- /dev/null +++ b/apps/react-hook-form/src/content/docs/04-exemplos-de-formularios-com-react-hook-form/05-field-array.md @@ -0,0 +1,49 @@ +--- +title: Field Array +--- + +```tsx +import { useFieldArray, useForm } from 'react-hook-form'; + +type FieldArrayFormData = { + emails: { address: string }[]; +}; + +export const FieldArrayForm = () => { + const { register, control, handleSubmit } = useForm(); + const { fields, append, remove } = useFieldArray({ control, name: 'emails' }); + + const onSubmit = (data: FieldArrayFormData) => alert(JSON.stringify(data)); + + return ( +
+ {fields.map((field, index) => ( +
+ + +
+ ))} + + +
+ ); +}; +``` diff --git a/apps/react-hook-form/src/content/docs/04-exemplos-de-formularios-com-react-hook-form/06-external-ui.md b/apps/react-hook-form/src/content/docs/04-exemplos-de-formularios-com-react-hook-form/06-external-ui.md new file mode 100644 index 0000000..6240b8d --- /dev/null +++ b/apps/react-hook-form/src/content/docs/04-exemplos-de-formularios-com-react-hook-form/06-external-ui.md @@ -0,0 +1,50 @@ +--- +title: Componentes de UI Externos +--- + +```tsx +import { Controller, useForm } from 'react-hook-form'; +import Select from 'react-select'; + +type ExternalUIComponentFormData = { + reactSelect: string; +}; + +type Option = { + label: string; + value: string; +}; + +export const ExternalUIComponentForm = () => { + const { control, handleSubmit } = useForm(); + const onSubmit = (data: ExternalUIComponentFormData) => + alert(JSON.stringify(data)); + + const options = ['React', 'Angular', 'Vue', 'Svelte'].map((label) => ({ + label, + value: label.toLowerCase(), + })) as readonly Option[]; + + return ( +
+ + name="reactSelect" + control={control} + render={({ field }) => ( + + options={options} + onChange={(selectedOption) => field.onChange(selectedOption?.value)} + onBlur={field.onBlur} + value={options.find((option) => option.value === field.value)} + ref={field.ref} + placeholder="Select an option" + /> + )} + /> + + + ); +}; +``` diff --git a/apps/react-hook-form/src/content/docs/04-exemplos-de-formularios-com-react-hook-form/07-async-form.md b/apps/react-hook-form/src/content/docs/04-exemplos-de-formularios-com-react-hook-form/07-async-form.md new file mode 100644 index 0000000..4f37ada --- /dev/null +++ b/apps/react-hook-form/src/content/docs/04-exemplos-de-formularios-com-react-hook-form/07-async-form.md @@ -0,0 +1,32 @@ +--- +title: Submissão assíncrona +--- + +```tsx +import { useForm } from 'react-hook-form'; + +type AsyncSubmissionFormData = { + username: string; +}; + +export const AsyncSubmissionForm = () => { + const { register, handleSubmit } = useForm(); + const onSubmit = async (data: AsyncSubmissionFormData) => { + await new Promise((resolve) => setTimeout(resolve, 1000)); + alert(JSON.stringify(data)); + }; + + return ( +
+ + +
+ ); +}; +``` diff --git a/apps/react-hook-form/src/content/docs/05-react-forms/01-controller-non-native-fields.md b/apps/react-hook-form/src/content/docs/05-react-forms/01-controller-non-native-fields.md new file mode 100644 index 0000000..900d745 --- /dev/null +++ b/apps/react-hook-form/src/content/docs/05-react-forms/01-controller-non-native-fields.md @@ -0,0 +1,120 @@ +--- +title: Uso do `Controller` para componentes não nativos. +--- + +Quando trabalhamos com formulários em React, especialmente quando envolve componentes de UI não nativos, como selects personalizados ou bibliotecas de datas, integrar esses elementos com o gerenciamento de estado e validação pode ser um desafio. Neste post, vamos explorar como o `Controller`, do React Hook Form (RHF), pode tornar essa tarefa muito mais simples e eficiente. + +### Por Que Usar o `Controller`? + +O React Hook Form é conhecido por seu desempenho leve e sua abordagem baseada em hooks para gerenciamento de formulários. O `Controller` é uma ferramenta essencial dentro dessa biblioteca quando você precisa envolver componentes de UI que não têm suporte nativo de gerenciamento de estado pelo RHF. Ele atua como uma ponte, permitindo o controle sobre entradas customizadas sem a necessidade de lidar diretamente com estados ou re-renderizações desnecessárias. + +### Como Funciona o `Controller`? + +O `Controller` do RHF funciona ao redor de três componentes principais: + +1. **Renderização do Componente**: Ele utiliza a propriedade `render` ou o componente dentro de `Controller` para passar propriedades necessárias, como `value` e `onChange`, ao componente customizado. +2. **Integração com Validação**: Ele também permite integrar validações e mensagens de erro nativas do RHF. +3. **Gerenciamento de Estado**: Ele mantém o valor do componente em sincronia com o formulário, garantindo que o estado do formulário seja atualizado corretamente sem exigir `setState` manuais. + +### Exemplo Prático: Configurando o `Controller` com um Select Customizado + +Imagine que você deseja utilizar um componente `Select` de uma biblioteca como Material-UI. Com o `Controller`, o processo é simplificado. + +#### Passo 1: Instale o React Hook Form e a Biblioteca de UI + +```bash +npm install react-hook-form @mui/material +``` + +#### Passo 2: Implemente o `Controller` no Componente + +No exemplo abaixo, vamos criar um formulário simples que utiliza um `Select` customizado controlado pelo `Controller`. + +```jsx +import React from 'react'; +import { useForm, Controller } from 'react-hook-form'; +import Select from '@mui/material/Select'; +import MenuItem from '@mui/material/MenuItem'; +import FormControl from '@mui/material/FormControl'; +import InputLabel from '@mui/material/InputLabel'; + +function CustomForm() { + const { control, handleSubmit } = useForm(); + + const onSubmit = (data) => { + console.log(data); + }; + + return ( +
+ + Opção + ( + + )} + /> + + + +
+ ); +} + +export default CustomForm; +``` + +#### Explicando o Código + +- **``**: Utilizado para envolver o `Select`, ele conecta o componente ao RHF. +- **`control`**: É passado como uma propriedade ao `Controller` e representa o estado do formulário. +- **`render={({ field }) => ...}`**: Passa as propriedades necessárias (`value` e `onChange`) ao `Select`. + +### Validando Entradas com o `Controller` + +Para tornar o formulário mais robusto, podemos adicionar validações. No exemplo a seguir, vamos configurar uma validação que exige que o usuário selecione uma opção. + +```jsx + ( + <> + + {error &&

{error.message}

} + + )} +/> +``` + +Aqui, adicionamos `rules={{ required: "Este campo é obrigatório" }}`, e, se o campo não for preenchido, uma mensagem de erro é exibida. + +### Benefícios de Usar o `Controller` + +- **Integração Simplificada**: O `Controller` torna fácil conectar componentes de UI que não possuem suporte nativo de formulários. +- **Código Limpo**: Com o `Controller`, você evita a necessidade de manipular diretamente o estado de cada componente customizado. +- **Flexibilidade**: Com suporte a validações personalizadas, o `Controller` oferece grande flexibilidade no controle de inputs complexos. + +### Conclusão + +O `Controller` no React Hook Form é uma ferramenta poderosa que facilita o uso de componentes não nativos, permitindo que você crie formulários altamente personalizados e eficientes com menos código e complexidade. Ao integrá-lo ao seu fluxo de desenvolvimento, você pode focar mais na lógica de negócios do que nos detalhes de gerenciamento de estado. + +### Próximos Passos + +Para se aprofundar, experimente: + +- Criar componentes personalizados com validações mais complexas. +- Integrar outras bibliotecas de UI com RHF e `Controller`. diff --git a/apps/react-hook-form/src/content/docs/05-react-forms/02-multi-step.md b/apps/react-hook-form/src/content/docs/05-react-forms/02-multi-step.md new file mode 100644 index 0000000..a610e92 --- /dev/null +++ b/apps/react-hook-form/src/content/docs/05-react-forms/02-multi-step.md @@ -0,0 +1,208 @@ +--- +title: Estratégias para lidar com formulários complexos. +--- + +Quando o volume de informações em um formulário aumenta, é comum quebrá-lo em várias etapas para melhorar a experiência do usuário e garantir que cada etapa seja concluída sem sobrecarregar quem está preenchendo. Neste artigo, exploramos estratégias para criar formulários multi-step (ou "multietapas") e discutimos como React Hook Form (RHF) facilita a gestão de formulários complexos. + +### Por Que Usar Formulários Multi-Step? + +Dividir formulários extensos em várias etapas ajuda a manter o usuário focado e torna o processo menos intimidador. Além disso, esse formato permite salvar progresso, validar cada etapa individualmente e criar uma experiência de preenchimento mais fluida. + +### Estrutura de Um Formulário Multi-Step + +A estrutura básica de um formulário multi-step envolve: + +1. **Divisão do Formulário em Etapas**: Cada etapa é um "subformulário" com suas próprias entradas. +2. **Navegação entre Etapas**: Botões para avançar, retroceder e, em alguns casos, salvar. +3. **Validação e Submissão**: Validação em cada etapa e submissão final dos dados combinados. + +### Implementando Formulários Multi-Step com React Hook Form + +Aqui, vamos mostrar um exemplo de um formulário multi-step básico usando React Hook Form. Para simplificar, vamos dividir o formulário em três etapas: **Informações Pessoais**, **Endereço**, e **Informações de Pagamento**. + +#### Passo 1: Instale o React Hook Form e Configuração do Estado + +```bash +npm install react-hook-form +``` + +A estrutura do componente terá um estado para rastrear a etapa atual, os dados do formulário e uma função para mover o usuário entre as etapas. + +```jsx +import React, { useState } from 'react'; +import { useForm, Controller } from 'react-hook-form'; + +function MultiStepForm() { + const [step, setStep] = useState(1); // Etapa atual + const { control, handleSubmit, trigger } = useForm({ + defaultValues: { + personalInfo: {}, + address: {}, + payment: {}, + }, + }); + + const onSubmit = (data) => { + console.log('Dados Finais:', data); + // Aqui você poderia enviar os dados ao servidor, por exemplo + }; + + const nextStep = async () => { + const isValid = await trigger(); + if (isValid) setStep((prev) => prev + 1); + }; + + const prevStep = () => setStep((prev) => prev - 1); + + return ( +
+ {step === 1 && } + {step === 2 &&
} + {step === 3 && } + +
+ {step > 1 && ( + + )} + {step < 3 ? ( + + ) : ( + + )} +
+ + ); +} +``` + +#### Passo 2: Componentes de Cada Etapa + +Abaixo, criamos três componentes separados para cada etapa do formulário. Usamos `Controller` para manipular os inputs em cada etapa. + +##### Etapa 1: Informações Pessoais + +```jsx +function PersonalInfo({ control }) { + return ( +
+

Informações Pessoais

+ ( +
+ + + {error &&

{error.message}

} +
+ )} + /> + ( +
+ + + {error &&

{error.message}

} +
+ )} + /> +
+ ); +} +``` + +##### Etapa 2: Endereço + +```jsx +function Address({ control }) { + return ( +
+

Endereço

+ ( +
+ + + {error &&

{error.message}

} +
+ )} + /> + ( +
+ + + {error &&

{error.message}

} +
+ )} + /> +
+ ); +} +``` + +##### Etapa 3: Informações de Pagamento + +```jsx +function Payment({ control }) { + return ( +
+

Informações de Pagamento

+ ( +
+ + + {error &&

{error.message}

} +
+ )} + /> + ( +
+ + + {error &&

{error.message}

} +
+ )} + /> +
+ ); +} +``` + +### Explicação do Fluxo + +- **Validação de Etapas**: Usamos `trigger()` para validar a etapa atual antes de prosseguir. Se a etapa for válida, o usuário pode avançar. +- **Armazenamento dos Dados**: RHF facilita o armazenamento dos dados de cada etapa em um estado centralizado, simplificando o acesso e envio final. +- **Componentização**: Cada etapa é um componente separado, o que torna o código mais organizado e fácil de manter. + +### Melhores Práticas para Formulários Multi-Step + +1. **Validação em Tempo Real**: Validar cada etapa evita que o usuário seja impedido de avançar. +2. **Salvar Progresso**: Permitir que o usuário salve o progresso em um formulário longo é sempre uma boa ideia, especialmente se ele puder retornar mais tarde. +3. **Feedback de Progresso**: Indicar visualmente quantas etapas o usuário já completou melhora a experiência e reduz a ansiedade. + +### Conclusão + +Formulários multi-step tornam a coleta de informações complexas mais amigável. Com React Hook Form e `Controller`, você pode implementar esse tipo de formulário com menos código e um fluxo de validação eficiente. Agora, experimente implementar o seu próprio formulário multi-step e veja o quão flexível o RHF pode ser para formulários complexos! diff --git a/apps/react-hook-form/src/content/docs/index.mdx b/apps/react-hook-form/src/content/docs/index.mdx new file mode 100644 index 0000000..e632f25 --- /dev/null +++ b/apps/react-hook-form/src/content/docs/index.mdx @@ -0,0 +1,17 @@ +--- +title: React Hook Form +description: Um workshop do Codante.io +template: doc +hero: + tagline: Um guia escrito para o workshop "React Hook Form" do Codante.io + image: + file: ../../assets/zod.svg + actions: + - text: Comece por aqui + link: 01-intro-react-hook-form/01-o-que-e-react-hook-form/ + icon: right-arrow + variant: primary + - text: Repositório deste guia + link: https://github.com/mechamobau/codante-react-hook-form-workshop + icon: external +--- diff --git a/apps/react-hook-form/src/env.d.ts b/apps/react-hook-form/src/env.d.ts new file mode 100644 index 0000000..acef35f --- /dev/null +++ b/apps/react-hook-form/src/env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/apps/react-hook-form/src/tailwind.css b/apps/react-hook-form/src/tailwind.css new file mode 100644 index 0000000..b5c61c9 --- /dev/null +++ b/apps/react-hook-form/src/tailwind.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/apps/react-hook-form/tailwind.config.mjs b/apps/react-hook-form/tailwind.config.mjs new file mode 100644 index 0000000..93f091b --- /dev/null +++ b/apps/react-hook-form/tailwind.config.mjs @@ -0,0 +1,18 @@ + +import starlightPlugin from '@astrojs/starlight-tailwind'; +import colors from 'tailwindcss/colors'; + + +/** @type {import('tailwindcss').Config} */ +export default { + content: ['./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}'], + theme: { + extend: { + colors: { + accent: colors.cyan, + gray: colors.zinc, + } + }, + }, + plugins: [starlightPlugin()], +} diff --git a/apps/react-hook-form/tsconfig.json b/apps/react-hook-form/tsconfig.json new file mode 100644 index 0000000..77da9dd --- /dev/null +++ b/apps/react-hook-form/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "astro/tsconfigs/strict" +} \ No newline at end of file diff --git a/apps/zod/.astro/settings.json b/apps/zod/.astro/settings.json new file mode 100644 index 0000000..401c151 --- /dev/null +++ b/apps/zod/.astro/settings.json @@ -0,0 +1,5 @@ +{ + "_variables": { + "lastUpdateCheck": 1729695740144 + } +} \ No newline at end of file diff --git a/apps/zod/.astro/types.d.ts b/apps/zod/.astro/types.d.ts new file mode 100644 index 0000000..67c70c9 --- /dev/null +++ b/apps/zod/.astro/types.d.ts @@ -0,0 +1,339 @@ +declare module 'astro:content' { + interface Render { + '.mdx': Promise<{ + Content: import('astro').MarkdownInstance<{}>['Content']; + headings: import('astro').MarkdownHeading[]; + remarkPluginFrontmatter: Record; + }>; + } +} + +declare module 'astro:content' { + interface Render { + '.md': Promise<{ + Content: import('astro').MarkdownInstance<{}>['Content']; + headings: import('astro').MarkdownHeading[]; + remarkPluginFrontmatter: Record; + }>; + } +} + +declare module 'astro:content' { + type Flatten = T extends { [K: string]: infer U } ? U : never; + + export type CollectionKey = keyof AnyEntryMap; + export type CollectionEntry = Flatten; + + export type ContentCollectionKey = keyof ContentEntryMap; + export type DataCollectionKey = keyof DataEntryMap; + + type AllValuesOf = T extends any ? T[keyof T] : never; + type ValidContentEntrySlug = AllValuesOf< + ContentEntryMap[C] + >['slug']; + + export function getEntryBySlug< + C extends keyof ContentEntryMap, + E extends ValidContentEntrySlug | (string & {}), + >( + collection: C, + // Note that this has to accept a regular string too, for SSR + entrySlug: E + ): E extends ValidContentEntrySlug + ? Promise> + : Promise | undefined>; + + export function getDataEntryById( + collection: C, + entryId: E + ): Promise>; + + export function getCollection>( + collection: C, + filter?: (entry: CollectionEntry) => entry is E + ): Promise; + export function getCollection( + collection: C, + filter?: (entry: CollectionEntry) => unknown + ): Promise[]>; + + export function getEntry< + C extends keyof ContentEntryMap, + E extends ValidContentEntrySlug | (string & {}), + >(entry: { + collection: C; + slug: E; + }): E extends ValidContentEntrySlug + ? Promise> + : Promise | undefined>; + export function getEntry< + C extends keyof DataEntryMap, + E extends keyof DataEntryMap[C] | (string & {}), + >(entry: { + collection: C; + id: E; + }): E extends keyof DataEntryMap[C] + ? Promise + : Promise | undefined>; + export function getEntry< + C extends keyof ContentEntryMap, + E extends ValidContentEntrySlug | (string & {}), + >( + collection: C, + slug: E + ): E extends ValidContentEntrySlug + ? Promise> + : Promise | undefined>; + export function getEntry< + C extends keyof DataEntryMap, + E extends keyof DataEntryMap[C] | (string & {}), + >( + collection: C, + id: E + ): E extends keyof DataEntryMap[C] + ? Promise + : Promise | undefined>; + + /** Resolve an array of entry references from the same collection */ + export function getEntries( + entries: { + collection: C; + slug: ValidContentEntrySlug; + }[] + ): Promise[]>; + export function getEntries( + entries: { + collection: C; + id: keyof DataEntryMap[C]; + }[] + ): Promise[]>; + + export function reference( + collection: C + ): import('astro/zod').ZodEffects< + import('astro/zod').ZodString, + C extends keyof ContentEntryMap + ? { + collection: C; + slug: ValidContentEntrySlug; + } + : { + collection: C; + id: keyof DataEntryMap[C]; + } + >; + // Allow generic `string` to avoid excessive type errors in the config + // if `dev` is not running to update as you edit. + // Invalid collection names will be caught at build time. + export function reference( + collection: C + ): import('astro/zod').ZodEffects; + + type ReturnTypeOrOriginal = T extends (...args: any[]) => infer R ? R : T; + type InferEntrySchema = import('astro/zod').infer< + ReturnTypeOrOriginal['schema']> + >; + + type ContentEntryMap = { + "docs": { +"00-intro/01-Introdução.md": { + id: "00-intro/01-Introdução.md"; + slug: "00-intro/01-introdução"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".md"] }; +"00-intro/02-o-que-vamos-aprender.md": { + id: "00-intro/02-o-que-vamos-aprender.md"; + slug: "00-intro/02-o-que-vamos-aprender"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".md"] }; +"00-intro/03-pre-requisitos.md": { + id: "00-intro/03-pre-requisitos.md"; + slug: "00-intro/03-pre-requisitos"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".md"] }; +"00-intro/04-repositorio.md": { + id: "00-intro/04-repositorio.md"; + slug: "00-intro/04-repositorio"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".md"] }; +"01-intro-zod/01-o-que-e-zod.md": { + id: "01-intro-zod/01-o-que-e-zod.md"; + slug: "01-intro-zod/01-o-que-e-zod"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".md"] }; +"01-intro-zod/02-por-que-zod-e-util.md": { + id: "01-intro-zod/02-por-que-zod-e-util.md"; + slug: "01-intro-zod/02-por-que-zod-e-util"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".md"] }; +"01-intro-zod/03-schemas.md": { + id: "01-intro-zod/03-schemas.md"; + slug: "01-intro-zod/03-schemas"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".md"] }; +"01-intro-zod/04-tipos-suportados.md": { + id: "01-intro-zod/04-tipos-suportados.md"; + slug: "01-intro-zod/04-tipos-suportados"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".md"] }; +"01-intro-zod/05-exemplos-validacao.md": { + id: "01-intro-zod/05-exemplos-validacao.md"; + slug: "01-intro-zod/05-exemplos-validacao"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".md"] }; +"02-setup-zod/01-instalando-zod.md": { + id: "02-setup-zod/01-instalando-zod.md"; + slug: "02-setup-zod/01-instalando-zod"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".md"] }; +"02-setup-zod/02-configurando-o-projeto.md": { + id: "02-setup-zod/02-configurando-o-projeto.md"; + slug: "02-setup-zod/02-configurando-o-projeto"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".md"] }; +"02-setup-zod/03-entendendo-nossos-schemas.md": { + id: "02-setup-zod/03-entendendo-nossos-schemas.md"; + slug: "02-setup-zod/03-entendendo-nossos-schemas"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".md"] }; +"02-setup-zod/04-validacao-campos-obrigatorios.md": { + id: "02-setup-zod/04-validacao-campos-obrigatorios.md"; + slug: "02-setup-zod/04-validacao-campos-obrigatorios"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".md"] }; +"03-basic-usage/01-tipos-basicos-validacoes-zod.md": { + id: "03-basic-usage/01-tipos-basicos-validacoes-zod.md"; + slug: "03-basic-usage/01-tipos-basicos-validacoes-zod"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".md"] }; +"03-basic-usage/02-tipos-primitivos.md": { + id: "03-basic-usage/02-tipos-primitivos.md"; + slug: "03-basic-usage/02-tipos-primitivos"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".md"] }; +"03-basic-usage/03-campos-opcionais-e-nulaveis.md": { + id: "03-basic-usage/03-campos-opcionais-e-nulaveis.md"; + slug: "03-basic-usage/03-campos-opcionais-e-nulaveis"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".md"] }; +"03-basic-usage/04-metodos-validacao-embutidos.md": { + id: "03-basic-usage/04-metodos-validacao-embutidos.md"; + slug: "03-basic-usage/04-metodos-validacao-embutidos"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".md"] }; +"04-advanced-features/01-arrays-enums-unions.md": { + id: "04-advanced-features/01-arrays-enums-unions.md"; + slug: "04-advanced-features/01-arrays-enums-unions"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".md"] }; +"04-advanced-features/02-compondo-schemas.md": { + id: "04-advanced-features/02-compondo-schemas.md"; + slug: "04-advanced-features/02-compondo-schemas"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".md"] }; +"04-advanced-features/03-mensagens-de-erro.md": { + id: "04-advanced-features/03-mensagens-de-erro.md"; + slug: "04-advanced-features/03-mensagens-de-erro"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".md"] }; +"05-react-forms/01-intro.md": { + id: "05-react-forms/01-intro.md"; + slug: "05-react-forms/01-intro"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".md"] }; +"05-react-forms/02-zod-react-hook-forms-formik.md": { + id: "05-react-forms/02-zod-react-hook-forms-formik.md"; + slug: "05-react-forms/02-zod-react-hook-forms-formik"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".md"] }; +"06-api-validation/00-parsing-validacao-apis.md": { + id: "06-api-validation/00-parsing-validacao-apis.md"; + slug: "06-api-validation/00-parsing-validacao-apis"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".md"] }; +"06-api-validation/01-estruturas-dados-tipos-corretos.md": { + id: "06-api-validation/01-estruturas-dados-tipos-corretos.md"; + slug: "06-api-validation/01-estruturas-dados-tipos-corretos"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".md"] }; +"07-ts-projects/01-garantindo-segurança-tipos.md": { + id: "07-ts-projects/01-garantindo-segurança-tipos.md"; + slug: "07-ts-projects/01-garantindo-segurança-tipos"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".md"] }; +"07-ts-projects/02-usando-infer.md": { + id: "07-ts-projects/02-usando-infer.md"; + slug: "07-ts-projects/02-usando-infer"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".md"] }; +"index.mdx": { + id: "index.mdx"; + slug: "index"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".mdx"] }; +}; + + }; + + type DataEntryMap = { + + }; + + type AnyEntryMap = ContentEntryMap & DataEntryMap; + + export type ContentConfig = typeof import("../src/content/config.js"); +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 66d5631..30647bc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -111,6 +111,33 @@ importers: specifier: ^5.4.5 version: 5.4.5 + apps/react-hook-form: + dependencies: + '@astrojs/check': + specifier: ^0.4.1 + version: 0.4.1(typescript@5.5.4) + '@astrojs/starlight': + specifier: ^0.17.2 + version: 0.17.4(astro@4.10.2(@types/node@20.14.2)(typescript@5.5.4)) + '@astrojs/starlight-tailwind': + specifier: ^2.0.1 + version: 2.0.3(@astrojs/starlight@0.17.4(astro@4.10.2(@types/node@20.14.2)(typescript@5.5.4)))(@astrojs/tailwind@5.1.0(astro@4.10.2(@types/node@20.14.2)(typescript@5.5.4))(tailwindcss@3.4.4))(tailwindcss@3.4.4) + '@astrojs/tailwind': + specifier: ^5.1.0 + version: 5.1.0(astro@4.10.2(@types/node@20.14.2)(typescript@5.5.4))(tailwindcss@3.4.4) + astro: + specifier: ^4.2.1 + version: 4.10.2(@types/node@20.14.2)(typescript@5.5.4) + sharp: + specifier: ^0.32.5 + version: 0.32.6 + tailwindcss: + specifier: ^3.4.1 + version: 3.4.4 + typescript: + specifier: ^5.3.3 + version: 5.5.4 + apps/ts-no-react: dependencies: '@astrojs/check': @@ -5924,7 +5951,7 @@ snapshots: '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.4.5) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) eslint-plugin-react: 7.34.2(eslint@8.57.0) @@ -5943,12 +5970,12 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0): + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0): dependencies: debug: 4.3.5 enhanced-resolve: 5.17.0 eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.7.5 @@ -5960,14 +5987,14 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): + eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.4.5) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) transitivePeerDependencies: - supports-color @@ -5981,7 +6008,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.13.1 is-glob: 4.0.3