{data?.helloworld}
109 |
89 |
90 |
91 | ### Está com dúvidas?
92 |
93 | Confira [aqui o gabarito para esta etapa](https://vtex-enterprise-group.readme.io/learning/docs/course-store-block-step05css-handles-answersheet) ou peça ajuda a um de nossos monitores
--------------------------------------------------------------------------------
/5 - Melhorando performance/4 - Imagens/README.md:
--------------------------------------------------------------------------------
1 | # Imagens
2 |
3 | As imagens são parte essencial de uma loja. É imprescindível ter fotos de muito boa qualidade e que estejam com excelente resolução, para garantir que a experiência do produto esteja sendo passada da melhor maneira possível.
4 |
5 | Buscar qualidade ótima, no entanto, não deve ser sinônimo de desperdiçar banda. Não é necessário, por exemplo, carregar uma imagem de `8000px` de largura, sendo que na loja ela vai ser renderizada em uma tela de `600px` de largura. O que acontece, nesses casos, é que a imagem, depois de baixada, é redimensionada pelo navegador e a resolução extra é, então, perdida.
6 |
7 | ## Pontos de otimização
8 |
9 | No Store Framework, existem basicamente dois pontos em que as imagens podem ser otimizadas:
10 |
11 | - `product-image`: é a imagem de produto que é mostrada em sua página (pdp);
12 | - `product-summary-image` é a imagem de produto que é exibida em prateleiras e resultados de busca;
13 | - `image`: são imagens comuns, usadas para banners, carrosséis e _infocards_
14 |
15 | Se estiver responsável por cuidar do cadastramento de imagens de uma loja, tenha certeza de comprimi-las antes. Isto pode garantir uma redução de até 85% do seu peso, sem que seja necessário também perder qualidade. Uma boa alternativa de ferramenta para facilitar este trabalho é usar o [Squoosh](https://squoosh.app/).
16 |
17 | ## Atividade
18 |
19 | 1. Na página principal, inspecione algum dos produtos da prateleira de _New arrivals_ clicando com o botão direito em cima e em seguida em `Inspecionar`. É possível observar no código que aparece, que existe um desperdício de resolução, está sendo solicitado `500px` como valor padrão, sendo que apenas `281px` estão sendo utilizados:
20 |
21 | 
22 |
23 | 2. No arquivo `/store/blocks.jsonc`, defina então o `product-image`, especificando o seu `width`:
24 |
25 | ```diff
26 | // /store/blocks.jsonc
27 | {
28 | ...
29 | "stack-layout#prodsum": {
30 | "children": [
31 | "product-summary-image",
32 | "product-summary-specification-badges"
33 | ]
34 | },
35 | + "product-summary-image": {
36 | + "props": {
37 | + "width": 281
38 | + }
39 | + },
40 | ...
41 | }
42 | ```
43 |
44 | Inspecionando novamente, vemos que todas as imagens de prateleira e resultado de busca estão com o tamanho correto:
45 |
46 |
47 |
48 | 3) Para melhorar o _caching_ de CDN e garantir que nenhuma imagem externa está sendo carregada, no arquivo `store/blocks/search.jsonc`, edite o `info-card` existente para atualizar sua implementação e fazê-lo usando um `image`:
49 |
50 | ```diff
51 | // /store/blocks/search.jsonc
52 | {
53 | "flex-layout.row#depBanner": {
54 | "children": [
55 | - "info-card#depbanner"
56 | + "image#depbanner"
57 | ]
58 | },
59 | }
60 | ```
61 |
62 | > Para saber um pouco mais sobre a definicação de _Content Delivery Network_ (CDN), veja [esse artigo](https://www.cloudflare.com/learning/cdn/what-is-a-cdn/) da Cloudflare.
63 |
64 | 4) Defina, por último, o `image#depbanner`:
65 |
66 | ```diff
67 | {
68 | ...
69 | + "image#depbanner": {
70 | + "props": {
71 | + "src": "assets/electronics.png"
72 | + }
73 | + },
74 | }
75 | ```
76 |
77 | 
78 |
79 | 5. Usamos o exemplo `electronics.png` que já estava disponível no repositório, mas qualquer imagem pode ser adicionada se inserida dentro da pasta `/assets`. Experimente acessar algum portal de stock photo gratuito (como o [Pexels](https://www.pexels.com/)), baixar uma imagem e comprimí-la no [Squoosh](https://squoosh.app/). Baixe a imagem, adicione-a a pasta de `/assets` e depois referencie com o nome que voce adicionou:
80 |
81 | ```diff
82 | {
83 | ...
84 | "image#depbanner": {
85 | "props": {
86 | - "src": "assets/electronics.png"
87 | + "src": "assets/{{sua_imagem}}"
88 | }
89 | },
90 | }
91 | ```
92 |
93 | 
94 | >Exemplo de redução de 60% na compressão com Squoosh
95 |
96 |
97 | ### Está com dúvidas?
98 |
99 | Confira [aqui o gabarito para esta etapa](https://vtex-enterprise-group.readme.io/learning/docs/course-store-performance-step04images-answersheet) ou peça ajuda a um de nossos monitores
--------------------------------------------------------------------------------
/1 - Blocos Básicos/2 - Começando com Rich Text/README.md:
--------------------------------------------------------------------------------
1 | # Introduzindo o Rich Text
2 |
3 | ## Rich Text
4 |
5 | Começaremos personalizando a *página inicial*. Na pasta `/store/blocks` do seu tema, você encontrará um arquivo chamado` home.jsonc`. Este arquivo determina como os blocos que você pretende usar são organizados. A linguagem usada na composição do layout é simples e baseada em [JSON](http://www.json.org/json-en.html).
6 |
7 | Em `home.jsonc`, você notará um bloco que é padrão em todos os temas, ou seja,` store.home`. Este bloco determina quais blocos filhos serão exibidos na página inicial.
8 |
9 | ```json
10 | {
11 | "store.home": {
12 | "blocks": []
13 | }
14 | ...
15 | }
16 | ```
17 |
18 | Vamos usar Rich Text em seu corpo:
19 |
20 | ```json
21 | {
22 | "store.home": {
23 | "blocks": [
24 | "rich-text"
25 | ]
26 | }
27 | ...
28 | }
29 | ```
30 |
31 | Portanto, `store.home` agora sabe que precisa renderizar um Rich Text. No entanto, ainda não especificamos qual visual esse Rich Text deve adotar. Para isso, precisaremos **definir o bloco**.
32 |
33 | ## Definindo blocos
34 |
35 | A definição de um bloco deve sempre ser executada separadamente de qualquer outro bloco, no nível de origem do arquivo JSON.
36 |
37 | ```json
38 | {
39 | "store.home": {
40 | "blocks": [
41 | "rich-text" <----- Aqui o bloco é usado dentro de outro
42 | ]
43 | },
44 | "rich-text": { <----- Aqui está no nível da fonte
45 | }
46 | }
47 | ```
48 |
49 | Na definição do bloco, você pode definir seu comportamento e visual. **Pontos de personalização** devem ser usados para conseguir isso, então vamos começar usando os `props` de Rich Text:
50 |
51 | ```json
52 | {
53 | "store.home": {
54 | "blocks": [
55 | "rich-text"
56 | ]
57 | },
58 | "rich-text": {
59 | "props": {
60 |
61 | }
62 | }
63 | }
64 | ```
65 |
66 | Leia o Rich Text [documentação](https://developers.vtex.com/docs/vtex-rich-text#rich-text) mais uma vez e vamos definir os adereços que usaremos para personalizar o bloco.
67 |
68 | Queremos obter um simples "Olá, Mundo!", E olhando para as props, notamos um chamado: `text` [(Texto escrito em linguagem de marcação a ser exibido)](https://developers.vtex.com/docs/vtex-rich-text#rich-text). Esta é a prop que determina qual texto será exibido.
69 |
70 | Incluindo esta prop, agora temos o seguinte:
71 |
72 | ```json
73 | {
74 | "store.home": {
75 | "blocks": [
76 | "rich-text"
77 | ]
78 | },
79 | "rich-text": {
80 | "props": {
81 | "text": "Hello, World!"
82 | }
83 | }
84 | }
85 | ```
86 |
87 | Lendo a [documentação do Markdown](https://www.markdownguide.org/cheat-sheet/), aprendemos que, para que um texto apareça em *itálico*, precisamos apenas colocar esse texto entre `*`
88 |
89 | ```json
90 | {
91 | "store.home": {
92 | "blocks": [
93 | "rich-text"
94 | ]
95 | },
96 | "rich-text": {
97 | "props": {
98 | "text": "*Hello, World!*"
99 | }
100 | }
101 | }
102 | ```
103 |
104 | Para centralizar o alinhamento do texto, podemos adicionar a prop `textPosition` e atribuir a ela o valor `CENTER`:
105 |
106 | ```json
107 | {
108 | "store.home": {
109 | "blocks": [
110 | "rich-text"
111 | ]
112 | },
113 | "rich-text": {
114 | "props": {
115 | "text": "*Hello, World!*",
116 | "textPosition": "CENTER"
117 | }
118 | }
119 | }
120 | ```
121 |
122 | ## Atividade
123 |
124 | Defina um [Rich Text](https://developers.vtex.com/docs/vtex-rich-text#rich-text) em sua página inicial e crie um **negrito** "Hello, World!" que está **alinhado à direita**. Faça isso trocando o código já presente no arquivo `store/blocks/home.jsonc` por este:
125 |
126 | ```diff
127 | {
128 | "store.home": {
129 | "blocks": [
130 | + "rich-text"
131 | ]
132 | },
133 | + "rich-text": {
134 | + "props": {
135 | + "text": "**Hello, World!**",
136 | + "textPosition": "RIGHT"
137 | + }
138 | + }
139 | }
140 | ```
141 |
142 | Depois de executar o `vtex link`, seu` rich-text` deve ficar assim:
143 |
144 |
145 |
146 | Note: Lembre-se de acessar a [documentação](https://vtex.io/docs/components/all/vtex.rich-text/) do Rich Text se você tiver alguma dúvida durante a atividade.
147 |
148 |
149 | ### Está com dúvidas?
150 |
151 | Confira [aqui o gabarito para esta etapa](https://vtex-enterprise-group.readme.io/learning/docs/course-basic-blocks-step02richtext-answersheet) ou peça ajuda a um de nossos monitores
--------------------------------------------------------------------------------
/7 - Serviços/2 - Visão geral - Entendendo o Boilerplate/README.md:
--------------------------------------------------------------------------------
1 | # Visão geral: Entendendo o _Boilerplate_
2 |
3 | ## Introdução
4 |
5 | Fazendo uma breve apresentação do _boilerplate_, há duas pastas (`/node` e `/graphql`) e o arquivo `manifest.json`, que é um arquivo importante para a sua aplicação no VTEX IO, dado que será o primeiro ponto de comunicação da sua _app_ com o VTEX IO.
6 |
7 | ## Visão geral do `manifest.json`
8 |
9 | No arquivo `manifest.json`, você encontrará o nome da _app_, _vendor_, versão e outras informações que você deve prestar atenção: _builders_, _policies_ e _dependencies_. Neste passo inicial, temos as seguintes configurações:
10 |
11 | - builders: quais _builders_ sua _app_ precisará. Neste caso, temos até o momento os builders `docs` e `node`, com suas respectivas versões;
12 | - policies: se a _app_ que está sendo implementada necessita acessar serviços externos ou pegar dados de um local específico, é necessário declará-las. Até o momento, não há nenhuma _policy_ declarada.
13 | - dependencies: outras _apps_ do VTEX IO que a sua _app_ depende. Como mostrado abaixo, será necessário também linkar a _app_ `events-example`, e esta é uma depenência que está declarada na aplicação deste curso.
14 |
15 | ## Visão geral do diretório `/node`
16 |
17 | Todas as pastas utilizadas durante este curso já estão no projeto inicial. A maioria dos diretórios está vazio e serão preenchidos com outros arquivos ao longo do curso.
18 |
19 | - `/node/clients`: ambos os arquivos estão praticamente em branco e são apenas _placeholders_ para os próximos passos;
20 |
21 | - `/node/handlers`: contém um _handler_ que será utilizado nos próximos passos;
22 |
23 | - `/node/utils`: você encontrará um aquivo que contém declarações de constantes globais (`/node/constants.ts`);
24 |
25 | - `/node/index.ts`: contém as declarações iniciais para as funcionalidades da _app_, como as declarações de serviços e de cache, que serão incrementadas durante o curso. Neste arquivo, também é possível exportar implementações de funções que são _resolvers_;
26 |
27 | - `/node/service.json`: Descreve a sua API REST e algumas características que impactam diretamente nos atributos de infrastrutura da sua _app_. Seu
28 |
29 | Seu arquivo `service.json` pode ser encontrado dentro da pasta `/node` e será similar a:
30 |
31 | ```
32 | {
33 | "memory": 256,
34 | "timeout": 2,
35 | "minReplicas": 2,
36 | "maxReplicas": 4,
37 | "routes": {
38 | "status": {
39 | "path": "/_v/status/:code",
40 | "public": true
41 | }
42 | }
43 | ```
44 |
45 | | Field | Type | Description |
46 | | ----------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------- |
47 | | memory | MegaBytes. | O quanto de memória sua _app_ terá alocada. Este valor será sobrescrito se o IO detectar que sua _app_ está abusando no uso de memória
48 | | timeout | Seconds | A infrastrutura do VTEX IO irá abortar a conexão se o _request_ demora mais do que o valor do _timeout
49 | | minReplicas | Integer | Quando sua _app_ estiver rodando, este valor é a quantidade réplicas mínimas estarão disponíveis |
50 | | maxReplicas | Integer | A máxima quantidade de réplicas a estarem disponíveis |
51 | | routes | - | Descreve as rotas REST da sua _app_, dentro deste objeto, você informará o nome, o caminho e se é pública ou privada |
52 |
53 | ## Visão geral do diretório `/graphql`
54 |
55 | Neste diretório, você encontrará apenas pastas vazias e o arquivo vazio `/graphql/schema.graphql`. Este também será preenchido ao longo do curso.
56 |
57 | ## Dependências
58 |
59 | A _app_ tem uma dependência, que é a _app_ `events-example`. Esta aplicação, quando linkada em uma conta e _workspace_ específicos, é responsável por prover exemplos de eventos. Durante o curso, conforme nos aproximarmos do assunto de eventos, haverá uma visão mais completa a respeito da _app_ `events-example`.
60 |
61 | ## Dando início ao curso
62 |
63 | Por enquanto, clone (`git clone`) a _app_ `events-example` [deste repositório](https://github.com/vtex-apps/events-example) e rode `vtex link` na pasta onde o repositório foi clonado.
64 |
65 | > Sem a aplicação `events-example`, este curso não será linkado com sucesso, dado que a _app_ `events-example` está listada como uma dependência.
66 |
67 | Após rodar `vtex link` na _app_ `events-example`, o terminal deve exibir uma rota de _healthcheck_, que será utilizada mais tarde. Ela é similar a imagem abaixo:
68 |
69 | 
--------------------------------------------------------------------------------
/6 - Blocos customizados/3 - Linkando uma app e utilizando-a no tema da loja/README.md:
--------------------------------------------------------------------------------
1 | # Linkando uma _app_ e a utilizando em um tema de loja
2 |
3 | ## Introdução
4 |
5 | Dado que você já está familiarizado com o Store Framework, você deve saber que utilizamos blocos, como a `shelf` e o `sku-selector`, para criar uma loja no VTEX IO. Neste passo, você irá criar um bloco a ser utilizado na _home_ do tema da sua loja.
6 |
7 | ## Adicionando um texto fixo ao nosso componente
8 |
9 | 1. No _template_ local que foi clonado, abra o arquivo `Countdown.tsx`. Você verá que contém uma implementação base de um componente React, que é uma `div` vazia, como mostrado abaixo:
10 |
11 | ```tsx
12 | //react/Countdown.tsx
13 | import React from 'react'
14 |
15 | interface CountdownProps {}
16 |
17 | const Countdown: StorefrontFunctionComponent
119 |
120 |
121 | ### Está com dúvidas?
122 |
123 | Confira [aqui o gabarito para esta etapa](https://vtex-enterprise-group.readme.io/learning/docs/course-store-block-step04countdown-implementation-answersheet) ou peça ajuda a um de nossos monitores
--------------------------------------------------------------------------------
/9 - Chamando as APIs de Commerce/2 - Encontrando as APIs do VTEX Commerce/README.md:
--------------------------------------------------------------------------------
1 | # Encontrando as APIs do VTEX Commerce
2 |
3 | ## Introdução
4 |
5 | Neste passo, você aprenderá como encontrar a documentação das APIs da VTEX, além de entender as diferenças para chamá-las através do VTEX IO.
6 |
7 | ## Portal do Desenvolvedor
8 |
9 | Antes de começar a desenvolver sua integração com as APIs de Commerce da VTEX, é fundamental que você possa **descobrí-las** e entender seu funcionamento. O [Portal de Desenvolvedor](https://developers.vtex.com/reference/get-to-know-vtex-apis) da VTEX lista todas as APIs disponíveis, além de conter explicações sobre como usar cada um dos _endpoints_ oferecidos.
10 |
11 | 
12 |
13 | A maioria das APIs seguem a especificação [REST](https://en.wikipedia.org/wiki/Representational_state_transfer). Também é importante ressaltar que todas as chamadas **operam sobre uma conta** na VTEX.
14 |
15 | ## Diferenças no VTEX IO
16 |
17 | O VTEX IO é um *first-class citizen* para as APIs da VTEX e, por isso, existem algumas diferenças usando-as na sua aplicação. O Portal do Desenvolvedor recebe alguns parâmetros de identificação e autorização que não são necessários quando chamando os *endpoints* pelo VTEX IO.
18 |
19 | ## Autenticação
20 |
21 | Tradicionalmente, a VTEX autentica chamadas para rotas privadas (`/pvt`) utilizando um par **AppKey** e **AppToken**, obtidos no painel de administração de uma conta. No VTEX IO **não é recomendado que se use esse par de chave e token para se autenticar**, já que a plataforma oferece outra maneira mais escalável e elegante.
22 |
23 | Todas as apps que são desenvolvidas no VTEX IO representam um **recurso** na plataforma, o que possibilita uma aplicação interagir com outros sistemas **em nome de si mesma**, devidamente autorizada pelo administrador da conta. Fica a cargo do desenvolvedor da app **declarar as permissões necessárias**.
24 |
25 | Na prática, isso significa duas coisas:
26 | 1. Tanto o endpoint como o *role* necessários para acessar alguma API devem ser **declarados no `manifest.json` da app**.
27 | 2. As chamadas devem ser realizadas com **um token do VTEX ID** ao invés do par **AppKey** e **AppToken**.
28 |
29 | Você aprenderá como realizar essas configurações logo mais!
30 |
31 | > O *role*, falando sobre autorização dentro da VTEX, representa um "papel" no *License Manager*, gerenciador de usuários e autorizações na plataforma. Alguns módulos da VTEX não requerem nenhum *role* específico, mas outros podem requerer e são necessários ao "caller" para conseguir acessar aquele recuros.
32 |
33 | ## Token da app e Token do usuário
34 | - Cada app no VTEX IO, automaticamente, recebe um `authToken` que pode ser utilizado para chamar APIs externas. Esse token, que pode ser obtido no objeto de contexto em qualquer requisição, tem todas as permissões que foram declaradas no campo `policies` do manifesto da aplicação.
35 | - É necessário verificar se faz sentido usar este token nas requisições, especialmente ao acessar **sistemas críticos** das contas. Caso você identifique uma situação assim, também é possível utilizar o **token do usuário que está usando a app**.
36 |
37 |
38 | ## `accountName`
39 |
40 | Como dito, todas as chamadas para módulos do Commerce da VTEX são relativas à alguma `account` na VTEX, e tradicionalmente essa informação é passada através da *query string* `?an`. Porém, ao longo do curso, iremos apresentar abstrações criadas no VTEX IO que **dispensam essa configuração manual**.
41 |
42 | Vale ressaltar que as apps que são desenvolvidas no VTEX IO **devem funcionar independente da conta onde estão instaladas**, por isso é importante que nenhuma destas informações críticas seja *"hard-coded"*.
43 |
44 | ## Atividade
45 |
46 | 1. Para verificar o token que cada aplicação recebe da plataforma, no _middleware_ de validação da app `service-example`, adicione o seguinte _log_:
47 |
48 | `node/middlewares/validate.ts`
49 | ```diff
50 | + console.log(ctx.vtex.authToken)
51 | console.log('Received params:', params)
52 |
53 | const { code } = params
54 | ...
55 | ```
56 | 2. Agora, **linke sua app** e acesse a URL pública fornecida no processo. A URL será algo como `https://{workspace}--{account}.myvtex.com/_v/status/:code`. Substitua `code` por `200` e, após acessar a URL, verifique o conteúdo que foi loggado no `console.log` através do processo do `vtex link`.
57 | 
58 |
59 | > Você pode verificar o conteúdo desse token no site https://jwt.io/. Ele é um token parecido com o seu token pessoal (rode o comando `vtex local token`), porém representa a aplicação que você está desenvolvendo e conterá as permissões que foram solicitadas por esta app no `manifest.json`.
60 |
61 |
62 | ### Está com dúvidas?
63 |
64 | Confira [aqui o gabarito para esta etapa](https://vtex-enterprise-group.readme.io/learning/docs/course-calling-commerce-apis-step02references-answersheet) ou peça ajuda a um de nossos monitores
--------------------------------------------------------------------------------
/3 - Tornando sua loja única/4 - Criando templates customizados/README.md:
--------------------------------------------------------------------------------
1 | # Criando templates customizados
2 |
3 | ## Introdução
4 |
5 | Até agora, você aprendeu como utilizar CSS, _Tachyons_ e _Markdown_ para customizar seus blocos no Store Framework. Porém, também é importante aprende como criar _templates_ customizados, de forma que a sua loja possa ter _landing pages_ customizadas, com uma URL bem definida e conteúdos específicos.
6 |
7 | Lojas são compostas por várias páginas diferentes, cada uma com _layout_ e conteúdo específicos. Ao criar uma loja do zero no VTEX IO, algumas páginas padrão com URLs predefinidas já são disponibilizadas para você. Abaixo, vemos uma lista com algumas dessas páginas padrão:
8 |
9 | - `store.home` (Home page)
10 | - `store.product` (Product page)
11 | - `store.search` (Search Results page)
12 | - `store.account` (Client Account page)
13 | - `store.login` (Login page)
14 | - `store.orderplaced` (Order Placed page)
15 |
16 | Neste passo, você aprenderá como criar _templates_ customizados do zero.
17 |
18 | ## Criando uma Landing Page
19 |
20 | São necessários poucos passos para se criar uma _landing page_ customizada:
21 |
22 | 1. Criar um novo _template_ no tema sua loja
23 | 2. Criar o novo caminho (_path_) para acessar este _template_
24 |
25 | ### Template
26 |
27 | Um _template_ define o _layout_ da página. Portanto, se você deseja criar uma página personalizada, também precisará criar um novo _template_ no seu tema.
28 |
29 | Vamos supor que você queira criar uma página simples com informações sobre a sua loja. Dentro da pasta `blocks`, você pode criar um arquivo que contenha o seguinte código, declarando um novo _template_ para uma página customizada,
30 |
31 | ```json
32 | {
33 | "store.custom#{templatename}": {
34 | "blocks": [
35 | ]
36 | }
37 | }
38 | ```
39 |
40 | onde `{templateName}` deve ser substituído pelo nome identificador do _template_.
41 |
42 | A seguir, você deve preencher o código com os componentes necessários para montar o _layout_, que será mostrado em mais detalhes na atividade.
43 |
44 | ### Path
45 |
46 | Agora que um novo _template_ com o _layout_ da página foi definido no código do tema da loja, a próxima etapa é definir o caminho (path) da página que acessará este _layout_.
47 |
48 | Devemos criar um arquivo `routes.json` dentro da pasta `store` do seu tema. Após isto, insira o código abaixo,
49 |
50 | ```json
51 | {
52 | "store.custom#about-us": {
53 | "path": "/{URL}"
54 | }
55 | }
56 | ```
57 |
58 | onde `{URL}` é o nome do caminho desejado
59 |
60 | ## Criando um _template_ customizado
61 |
62 | Vamos criar uma página com informações sobre a sua loja conforme o exemplo abaixo:
63 |
64 | 
65 |
66 | 1. Na pasta `blocks`, crie um arquivo `about-us.jsonc`;
67 | 2. Declare um template `store.custom#about-us` neste arquivo;
68 | 3. Inclua um block "flex-layout.row#about-us" neste _template_:
69 |
70 | ```json
71 | {
72 | "store.custom#about-us": {
73 | "blocks": [
74 | "flex-layout.row#about-us"
75 | ]
76 | }
77 | }
78 | ```
79 | 4. No mesmo arquivo, adicione o código abaixo, logo depois da declaração de `store.custom#about-us`. Ele é responsável por definir `flex-layout.row#about-us`.
80 |
81 | ```json
82 | "flex-layout.row#about-us": {
83 | "children": [
84 | "image#about-us",
85 | "flex-layout.col#text-about-us"
86 | ]
87 | },
88 | ```
89 |
90 |
91 |
92 | 5. Agora, vamos definir seus blocos filhos para montar o _layout_:
93 |
94 | ```json
95 | "flex-layout.col#text-about-us": {
96 | "children": [
97 | "rich-text#about-title",
98 | "rich-text#about-content"
99 | ],
100 | "props": {
101 | "preventVerticalStretch": true
102 | }
103 | },
104 | "rich-text#about-title": {
105 | "props": {
106 | "text": "# About Minimum Theme"
107 | }
108 | },
109 | "rich-text#about-content": {
110 | "props": {
111 | "text":
112 | " This is the VTEX Minimum Theme, you can use it to test blocks usage and build your first store from scratch."
113 | }
114 | },
115 | "image#about-us": {
116 | "props": {
117 | "src": "https://appliancetheme.vteximg.com.br/arquivos/cozinha-about-us.png",
118 | "maxHeight": "600px"
119 | }
120 | }
121 | ```
122 |
123 | 6. Na pasta `store`, crie um arquivo chamado `routes.json`;
124 |
125 | 6. Neste arquivo, declare um _path_ `/about-us`:
126 |
127 | ```json
128 | {
129 | "store.custom#about-us": {
130 | "path": "/about-us"
131 | }
132 | }
133 | ```
134 |
135 | 7. Com o código linkado, acesse `{workspace}--appliancetheme.myvtex.com/about-us` para ver sua nova _landing page_.
136 |
137 |
138 | ### Está com dúvidas?
139 |
140 | Confira [aqui o gabarito para esta etapa](https://vtex-enterprise-group.readme.io/learning/docs/course-styles-course-step03custom-template-answersheet) ou peça ajuda a um de nossos monitores
--------------------------------------------------------------------------------
/2 - Layouts Complexos/4 - Tornando seu conteúdo responsivo/README.md:
--------------------------------------------------------------------------------
1 | # Tornando seu conteúdo responsivo
2 |
3 | ## Introdução
4 |
5 | A página inicial de um e-commerce é sempre o primeiro contato do cliente com a marca. Por isso, é comum que o lojista queira estabelecer uma **comunicação direta** com os seus usuários nesse momento estratégico da navegação.
6 |
7 | No Store Framework, existem alguns componentes que atendem a esse cenário, como o [Info Card](https://developers.vtex.com/docs/vtex-store-components-infocard) e o [Rich Text](https://developers.vtex.com/docs/vtex-rich-text#rich-text).
8 |
9 | ## Configurando o Rich Text
10 |
11 | Assim como a sua funcionalidade, a configuração do Rich Text também é simples, podemos montar um exemplo de implementação do bloco usando texto escrito em markdown. Por exemplo:
12 |
13 | ```json
14 | "rich-text": {
15 | "props": {
16 | "text": "# Your Coffee, Your Way \n ### New Coffee Makers Collection",
17 | "textPosition": "CENTER",
18 | "textAlignment": "CENTER"
19 | }
20 | },
21 | ```
22 |
23 | Como falado anteriormente, o uso de Markdown permite flexibilidade ao componente. Mas, por outro lado, também pode fazer com que a sua renderização sofra alterações de acordo com o dispositivo usado pelo usuário.
24 |
25 | Por exemplo: a frase acima ( `# Your Coffee, Your Way \n ### New Coffee Makers Collection` ) pode usar um _markdown_ adequado para _desktop_, mas não necessariamente para _mobile_ (cujo tamanho de tela é menor).
26 |
27 | Para resolver esse cenário e tornar o componente mais adaptável a outros dispositivos, devemos usar o [**Responsive Layout**](https://developers.vtex.com/docs/vtex-responsive-layout).
28 |
29 |
30 | Primeiramente devemos declarar os blocos dentro do template `store.home`:
31 |
32 | `"responsive-layout.desktop#desktop",
33 | "responsive-layout.mobile#mobile"`
34 |
35 |
36 | Em seguida devemos declarar esses blocos da seguinte forma:
37 |
38 | ```json
39 |
40 | ...
41 |
42 | "responsive-layout.desktop#desktop": {
43 | "children": ["rich-text#desktop"]
44 | },
45 |
46 | "responsive-layout.mobile#mobile": {
47 | "children": ["rich-text#mobile"]
48 | },
49 |
50 | "rich-text#desktop": {
51 | "props": {
52 | "text": "# Your Coffee, Your Way \n ### New Coffee Makers Collection (I'm on desktop)",
53 | "textPosition": "CENTER",
54 | "textAlignment": "CENTER"
55 | }
56 | },
57 |
58 | "rich-text#mobile": {
59 | "props": {
60 | "text": "# Your Coffee, Your Way \n ### New Coffee Makers Collection (I'm on mobile)",
61 | "textPosition": "CENTER",
62 | "textAlignment": "CENTER"
63 | }
64 | }
65 | ```
66 |
67 | Ao interpretar o código acima, perceba como duas configurações de Rich Text são construídas a partir do uso de `responsive-layout.desktop#desktop` e `responsive-layout.mobile#mobile`.
68 |
69 | ## Atividade
70 |
71 | Nessa atividade, vamos brincar um pouco com o markdown do [Rich Text](https://developers.vtex.com/docs/vtex-rich-text#rich-text) e aprender a usá-lo com o componente [Image](https://developers.vtex.com/docs/vtex-store-components-image). Tudo isso usando o Responsive Layout, é claro!
72 |
73 | ### Desktop:
74 |
75 | 
76 |
77 | ### Mobile:
78 |
79 | 
80 |
81 | 1. Adicione o código proposto acima no arquivo `home.jsonc` e declare os blocos de `responsive-layout` no template `store.home`;
82 | 2. No `rich-text#mobile`, altere o markdown da primeira frase para `h3` e da segunda para `h4`;
83 | > Se você não se lembra da sintaxe de Markdown, é possível consultá-la em [**Markdown Documentation**](https://www.markdownguide.org/).
84 | 3. Adicione `image#desktop` como children de `responsive-layout.desktop#desktop`. Faça o mesmo com `image#mobile` em `responsive-layout.mobile#mobile`;
85 | 4. Declare os seguintes blocos de Image:
86 |
87 | ```json
88 | "image#desktop": {
89 | "props": {
90 | "src": "https://appliancetheme.vteximg.com.br/arquivos/Responsive-Image-Desktop.jpg?q=1",
91 | "link": {
92 | "url": "/small-appliances/coffee-makers"
93 | } ,
94 | "alt": "Coffee Makers Collection"
95 | }
96 | },
97 |
98 | "image#mobile": {
99 | "props": {
100 | "src": "https://appliancetheme.vteximg.com.br/arquivos/Responsive-Image-Mobile.jpg?q=1",
101 | "link": {
102 | "url": "/small-appliances/coffee-makers"
103 | } ,
104 | "alt": "Coffee Makers Collection"
105 | }
106 | },
107 | ```
108 |
109 | 5. Analisando as props do [componente Image](https://developers.vtex.com/docs/vtex-store-components-image#configuration), defina a largura máxima das duas imagens como `100%`.
110 |
111 | Note: Lembre-se de acessar a [documentação](https://developers.vtex.com/docs/vtex-responsive-layout) do Responsive Layout caso tenha alguma dúvida durante a atividade.
112 |
113 |
114 | ### Está com dúvidas?
115 |
116 | Confira [aqui o gabarito para esta etapa](https://vtex-enterprise-group.readme.io/learning/docs/course-layout-blocks-step04responsive-answersheet) ou peça ajuda a um de nossos monitores
--------------------------------------------------------------------------------
/9 - Chamando as APIs de Commerce/4 - Usando o Client Catalog para fazer requisições/README.md:
--------------------------------------------------------------------------------
1 | # Usando o Client Catalog para fazer requisições
2 |
3 | ## Introdução
4 |
5 | Neste passo você aprenderá como usar o _Client_ que você acabou de configurar em um _middleware_ da app `service-example`. Iremos usar o método `getSkuById` para retornar informações de um SKU (Stock Keeping Unit) no Catálogo da VTEX.
6 |
7 | > O termo Stock Keeping Unit (SKU), em português Unidade de Manutenção de Estoque, está ligado à logística de armazém e designa os diferentes itens do estoque, estando normalmente associado a um código identificador. _(Wikipedia)_
8 |
9 | ## Rota de Testes
10 |
11 | Já que o app `service-example` já exporta uma rota pública para testes (`https://{workspace}--{account}.myvtex.com/_v/status/:code`), iremos utilizá-la para testar a realização de uma chamada utilizando o _Client_ de _Catalog_. Iremos usar o parâmetro `code` como o nosso "ID do Sku" para rapidamente testarmos o nosso _Client_.
12 |
13 | Se você já rodou o comando `vtex link`, basta mantê-lo rodando já que a CLI da VTEX **atualiza automaticamente sua aplicação com mudanças no código.** Caso não, rode o comando agora.
14 |
15 | ## Atividade
16 |
17 | Como vimos no passo anterior, agora já temos disponível os métodos do nosso _Client_ em `ctx.clients.catalog`. Para utilizá-lo, precisaremos chamar os métodos em algum _middleware_ de nossa app.
18 |
19 | 1. No arquivo `node/middlewares/status.ts` para usar o `ctx.clients.catalog`. Cole lá o seguinte código:
20 |
21 | ```typescript
22 | export async function status(ctx: Context, next: () => Promise
110 |
111 | Ao clicar na segunda, a `Red Retro Coffee Machine`, você i'ra para a sua página de produto, ou `pdp`, e verá os blocos que a compõe.
112 |
113 | 
114 |
115 | > Nota: Alguns dos produtos não terão _savings_, dado que não há descontos baseados no preço de catálogo, ou _list price_.
116 |
117 | Note: Lembre de acessar as documentações de [`product-images`](https://developers.vtex.com/docs/vtex-store-components-productimages), [`product-price`](https://developers.vtex.com/docs/vtex-product-price#product-price), [`product-name`](https://developers.vtex.com/docs/vtex-store-components-productname) e [`buy-button`](https://developers.vtex.com/docs/vtex-store-components-buybutton) em caso de dúvidas durante a atividade.
118 |
119 |
120 | ### Está com dúvidas?
121 |
122 | Confira [aqui o gabarito para esta etapa](https://vtex-enterprise-group.readme.io/learning/docs/course-basic-blocks-step04pdp-answersheet) ou peça ajuda a um de nossos monitores
--------------------------------------------------------------------------------
/1 - Blocos Básicos/3 - Info Card o call to action do store Framework/README.md:
--------------------------------------------------------------------------------
1 | # Info Card: *call to action* do Store Framework
2 |
3 | ## Introdução
4 |
5 | Uma loja precisa de uma boa *página inicial* para envolver os usuários, aumentando o tempo da sessão e, portanto, as chances de conversão. Para tal, é necessário utilizar vários elementos, como banners promocionais, estantes com destaques, material sobre nós, etc.
6 |
7 | Criamos o próximo bloco na *página inicial* usando uma *call to action*. No Store Framework, temos um bloco desenhado para esse fim, denominado [**Info Card**](https://developers.vtex.com/docs/vtex-store-components-infocard).
8 |
9 | ## Começando com o Info Card
10 |
11 | 
12 |
13 | Usando o Info Card, você pode criar imagens que possuem links e botões (parte superior ou lateral do bloco) que direcionam o fluxo do usuário (*Call to action*).
14 |
15 | Olhando a [documentação](https://developers.vtex.com/docs/vtex-store-components-infocard#configuration), podemos ver que:
16 |
17 | - `isFullModeStyle` define se o *Call to Action (CTA)* é definido acima do banner;
18 | - `textPosition` define a posição do texto;
19 | - `textAlignment` define o alinhamento do texto;
20 | - `imageUrl` define qual imagem será usada como banner;
21 | - `headline` determina qual texto será usado como título;
22 | - `callToActionMode` permite escolher o modo *CTA* como um link ou um botão;
23 | - `callToActionText` define o texto *CTA*;
24 | - `callToActionUrl` determina a URL para a qual ele redireciona;
25 |
26 | Portanto, temos as seguintes _props_:
27 |
28 | ```json
29 | {
30 | "store.home": {
31 | "blocks": [
32 | "rich-text",
33 | "info-card"
34 | ]
35 | },
36 | "rich-text": {
37 | "props": {
38 | "text": "*Hello, World!*",
39 | "textPosition": "RIGHT"
40 | }
41 | },
42 | "info-card": {
43 | "props": {
44 | "isFullModeStyle": false,
45 | "textPosition": "right",
46 | "imageUrl": "https://appliancetheme.vteximg.com.br/arquivos/cozinha-rosa-min.png",
47 | "headline": "Vintage Pink",
48 | "subhead": "Give your kitchen a boho style adding vintage apparels.