# Product Updates Source: https://docs.deco.cx/changelog/overview New updates and improvements ## 🎉 Celebrating 1000 PRs on deco-cx/apps! 🎉 Form Selection ### Timeline of Significant Features #### 2025 * PR #996: Enhanced Product Data Handling in Schema.org Transformation * PR #992: Support for displaying videos on Shopify products * PR #988: Implementation of VTEX promotion loader * PR #986: Reviews ordering system improvements #### 2024 * PR #976: Blog features - Related posts functionality * PR #963: Added pickup holidays type * PR #958: Introduction of OneDollarStats collector * PR #947: Optimization of asset proxying * PR #920: Shopify signUp action implementation * PR #917: Wake integration - Partner token functionality #### 2023 * PR #830: SAP Commerce App integration * PR #751: Wake buyList query implementation * PR #703: Linx Commerce integration improvements * PR #671: Smarthint Integration * PR #634: Verified reviews product aggregation * PR #435: Mailchimp integration ### Key Features Added #### Commerce Integrations * VTEX Integration enhancements * Shopify features expansion * Wake Commerce implementation * SAP Commerce integration * Linx Commerce improvements * Nuvemshop Integration #### Analytics & Marketing * OneDollarStats collector * Mailchimp integration * Google Sheets functionality * Enhanced analytics tracking * Improved SEO capabilities #### Product Features * Enhanced product data handling * Video support for products * Reviews and ratings system * Product aggregation in verified reviews * Improved product listing capabilities #### User Experience * Blog functionality * Pickup scheduling system * Partner token system * Enhanced shipping calculations * Improved cart management ### Notable Contributors #### Top Contributors * @guitavano * @mcandeia * @tlgimenes * @matheusgr * @vitoUwu #### New Contributors in Recent Milestones * @gabriel-kerchner * @AlexWasHeree * @aline-pereira * @gsbenevides2 * @pedrobernardina ### Impact The repository has grown significantly, with contributions spanning various aspects of e-commerce and web development. The additions have enhanced the platform's capabilities in: * Commerce platform integrations * Analytics and tracking * Content management * User experience * Performance optimization * Marketing tools This milestone represents the collaborative effort of the community in building a robust and feature-rich platform for digital commerce. ## Form select now keeps the correct type Form Selection Some types, such as the product listing page properties type selection, are now **correctly selected**. This issue was caused by three main problems: * RJSF was unable to distinguish between properties that have multiple types (e.g., `[string, number]`). * There was an issue with schemas generated from apps before version 0.64.21, where a property type such as `[]` (empty array) was not allowed. * RJSF didn't correctly cache a root schema with `$id`, as it also needed to cache the same root schema with `ROOT_SCHEMA_PREFIX` as the id. If you are still experiencing issues with this bug, please **update to the latest version of the app**. ## AI Input form fill AI Inputs We added a tool for select input that uses contextual information to generate text. Under the hood, we use the Sonnet 3.5 model to generate information, expanding the prompt by extracting context from the page itself. An additional prompt can be used to improve the result of the task. A diff between the current input and the proposed AI input is shown before confirmation. For each string property, you can use the `@aiContext` annotation to provide additional context for the user. We aim to expand this utility across all our products and allow your own AI apps to edit and create data for your site! ## Webdrawm in admin Webdraw Introducing Webdraw! This new tool allows you to create AI-driven sections directly within our admin interface. To create a section, use Webdraw and press `⌘ (CTRL) + P` to push your section to the admin and start using it. You may need a tailored prompt to achieve the best results. For example, you can copy the code from an existing section as a reference. We have made our default [deco prompt available here](https://gist.github.com/matheusgr/bbdcab6747cccb83e18254304d0970fc). Please note that AI may sometimes generate invalid TSX code, so some manual adjustments might be necessary. Note: This feature is still experimental! # null Source: https://docs.deco.cx/pt/api-reference/invoke Invoke Client API Reference A API Invoke é um cliente RPC (Remote Procedure Call) tipado. Ela torna a interação com loaders e actions mais segura e tão fácil quanto chamar uma função, abstraindo os detalhes do transporte de rede acontecendo por baixo dos panos. Um único cliente Invoke pode ser usado para interagir com ações e carregadores do seu site e de qualquer App instalado. O Invoke pode ser usado tanto no Cliente quanto no Servidor e suporta padrões mais complexos, como chamar múltiplos loaders/actions em uma única requisição (Veja o Exemplo 4: Invoke em Batch) ou enviar arquivos via uma requisição multipart. A assinatura de tipo de Invoke será sempre dinâmica e será inferida com base no tipo do seu manifesto e no tipo da ação/carregador que você está chamando: Por exemplo: ```typescript import { invoke } from "site/runtime.ts"; const resultado = await invoke.site.loaders.exemplo( props: T, // Este será o tipo das props da action/loader sendo chamado init?: InvokerRequestInit // Este é um objeto de inicialização de requisição fetch estendido com algumas opções extras ); console.log(resultado); // Este será o tipo do valor de retorno da action/loader ``` ## Importando a API ### Uso no Browser (client-side) Para uso no Cliente, o Invoke é exportado da `runtime.ts` no raiz do projeto. Abaixo está um exemplo de um arquivo `runtime.ts` típico, que cria um cliente para interagir com actions e loaders do seu site, e de dois apps: VTEX e Linx Impulse. Todos os Apps podem ser usados da mesma forma, já que exportam um `Manifest`. ```typescript import { proxy } from "deco/clients/withManifest.ts"; import type { Manifest } from "./manifest.gen.ts"; import type { Manifest as ManifestVTEX } from "apps/vtex/manifest.gen.ts"; import type { Manifest as ManifestLinxImpulse } from "apps/linx-impulse/manifest.gen.ts"; export const invoke = proxy(); ``` ### Uso no Servidor Para uso no Servidor, o Invoke pode sempre ser acessado a partir do *Contexto* da Aplicação. Isso torna o Invoke mais fácil de usar dentro de actions e loaders. Abaixo está um exemplo de um loader que utiliza o Invoke para chamar outro loader da mesma Aplicação: ```typescript import type { AppContext } from "site/apps/site.ts"; export const async function getUserNotes( props: Props, req: Request, ctx: AppContext ): Promise { const user = await ctx.invoke.site.loaders.getUser({ token: req.headers.get("Authorization") }); if (!user) { throw new Error("Usuário não encontrado"); } return user.notes; } ``` ## Exemplos de Uso ### Exemplo 1: Chamando uma Action ou Loader a partir do Navegador Suponha que temos um loader chamado `getUser`, que retorna um objeto de usuário, baseado em um `id` de usuário enviado. ```typescript import type { AppContext } from "site/apps/site.ts"; export interface Props { id: string; } export const async function getUser( props: Props, req: Request, ctx: AppContext ): Promise { return fetchUser(props.id); } ``` Podemos agora chamar esse loader a partir do Navegador, usando o cliente invoke exportado do arquivo runtime.ts: ```typescript import { invoke } from "site/runtime.ts"; const user = await invoke.site.loaders.getUser({ id: "123" }); ``` Como o cliente Invoke é tipado, o tipo de retorno do `getUser` é automaticamente inferido, e o tipo da variável `user` é `User`. Todos os tipos de parâmetros são também inferidos, então temos mais confiança para interagir com nossas APIs. **Importante**: Isso deve ser usado apenas no Navegador. Tentar importar e usar o cliente Invoke do arquivo `runtime.ts` no servidor resultará em um erro. Para chamar actions/loaders a partir do servidor, veja o próximo exemplo. ### Exemplo 2: Chamando uma Action ou Loader a partir do Servidor Suponha que estamos criando uma ação chamada `addItem` que adiciona um item a um carrinho. Suponha também que já temos um loader chamado `cart`, que retorna o carrinho atual para um usuário, baseado em uma sessão contida nos cookies da requisição: ```typescript import type { AppContext } from "site/apps/site.ts"; import { getSessionFromRequest } from "site/lib/session.ts"; import { getCartFromDatabase } from "site/lib/cart.ts"; export interface CartItem { productId: string; quantity: number; } export interface Cart { items: CartItem[]; id: string; } export const async function cart( _props: unknown, req: Request, ctx: AppContext ): Promise { // Pegar a sessão a partir da requisição const session = await getSessionFromRequest(req); // Pegar o carrinho a partir da base de dados usando o ID vindo da sessão const cart = await getCartFromDatabase(session.cartId); return cart; } ``` Agora, quando criamos a ação `addItem`, podemos reutilizar o loader `cart` para buscar o carrinho atual e então adicionar o item ao carrinho: ```typescript import type { AppContext } from "site/apps/site.ts"; import { saveCartToDatabase } from "site/lib/cart.ts"; export interface Props { item: CartItem; } export const async function addItem( props: Props, req: Request, ctx: AppContext ): Promise { const currentCart = await ctx.invoke.site.loaders.cart(); // Adicionar o item ao carrinho cart.items.push(props.item); // Salvar o carrinho atualizado na base de dados await saveCartToDatabase(cart); return cart; } ``` O cliente Invoke que vem do Contexto da Aplicação é também tipado, baseado no tipo `AppContext` exportado por convenção do seu `site` app. ### Exemplo 3: Enviando um arquivo para o Servidor Suponha que temos uma ação chamada `uploadFile`, que envia um arquivo para um destino. A ação recebe uma propriedade `file`, que é um objeto de arquivo que contém os dados do arquivo, e uma propriedade `destination`, que é uma string que especifica o destino para onde o arquivo deve ser enviado. ```typescript import type { AppContext } from "site/apps/site.ts"; export interface Props { file: File; destination: string; } export const async function uploadFile( props: Props, req: Request, ctx: AppContext ): Promise { // Enviar o arquivo para o destino await uploadFileToDestination(props.file, props.destination); } ``` Estamos usando a web API `File` como tipo de propriedade aqui, mas isso cria um problema: O objeto `File` não é serializável via JSON, que é o que o Invoke usa internamente. Isso significa que tentar passar um objeto File como propriedade para uma ação resultará em um erro ao tentar acessar a propriedade file dentro da sua action. Para resolver isso, o cliente Invoke oferece uma maneira de fazer upload de arquivos via uma requisição multipart, que é uma maneira prática de enviar arquivos para o servidor, usando a API FormData e o tipo de conteúdo multipart/form-data. Para usar isso, você só precisa adicionar uma opção multipart: true ao `InvokerRequestInit` do Invoke (que é o segundo argumento para qualquer chamada de invoke), e o cliente usará automaticamente um protocolo personalizado para enviar o payload via multipart, tornando possível enviar arquivos para o servidor. Podemos agora chamar essa ação a partir do Navegador, usando o cliente invoke exportado do arquivo runtime.ts: ```tsx import { invoke } from "site/runtime.ts"; export function UploadFileInput() { const uploadFile = async (file: File) => { await invoke.site.actions.uploadFile({ file: file, destination: "/uploads/files", }, { multipart: true }); }; return ( { const file = e.target.files[0]; if (file) { await uploadFile(file); } }} /> ); } ``` Agora o arquivo `file` pode ser acessado seguramente na action! **Importante**: Quando usando a opção `multipart`, o cliente Invoke enviará um FormData objeto para o servidor, que só suporta arquivos e strings. Isso significa que qualquer propriedade que seja um número ou um booleano será convertida para uma string. ### Exemplo 4: Batch Invoke Batch Invoke é útil quando você precisa realizar múltiplas operações simultaneamente e quer minimizar a latência de rede, reduzindo o número de requisições. Aqui está um exemplo de cenário onde usar Batch Invoke faz sentido: recuperar múltiplos conjuntos de dados relacionados em uma única requisição. Suponha que temos um usuário logado e temos três diferentes loaders que retornam dados relacionados ao usuário: um para anotações (notes), um para o endereço (address) e um para os pedidos (orders). Podemos recuperar todos esses três conjuntos de dados em uma única requisição usando um Batch Invoke: ```typescript import { invoke } from "site/runtime.ts"; // Podemos sempre desstructurar o cliente Invoke // para escrever código mais fácil de ler const { loaders } = invoke.site; const user = ...; // Obtenha o usuário atual de alguma maneira const { userNotes, userAddress, userOrders, } = await invoke({ userNotes: loaders.getUserNotes({ userId: user.id, orderBy: "latest" }), userAddress: loaders.getUserAddress({ token: user.token }), userOrders: loaders.getUserOrders({ userId: user.id }), }); ``` Passando um objeto com os loaders/actions como propriedades, o cliente Invoke automaticamente faz o batch das requisições e retorna os resultados no mesmo formato que o objeto passado. Continuamos tendo todos os tipos inferidos automaticamente ao fazer Batch Invoke desta maneira! # null Source: https://docs.deco.cx/pt/api-reference/use-script useScript API reference ### Descrição A função `useScript` foi projetada para ajudar os desenvolvedores a inserir scripts diretamente em uma página da web com uma carga mínima. Ela recebe uma função e seus argumentos como parâmetros e retorna a versão convertida em string e minificada da função. Isso é particularmente útil para inserir manipuladores de eventos e outros scripts diretamente no HTML, otimizando o desempenho ao reduzir a quantidade de JavaScript enviado pela rede. Ela se integra perfeitamente com os manipuladores `hx-on:` do HTMX. ### Importação ```typescript import { useScript } from "deco/hooks/useScript.ts"; ``` ### Parâmetros * **fn**: `Function` * A função a ser convertida em string e minificada. * **args**: `...any[]` * Os argumentos a serem passados para a função quando ela for chamada. ### Valor de Retorno * **string** * Uma versão convertida em string e minificada da função, pronta para ser inserida no HTML. ### Exemplos de Uso #### Exemplo 1: Script Inline com `dangerouslySetInnerHTML` Neste exemplo, `useScript` é usado para inserir um script simples que registra uma mensagem quando a janela é carregada. ```tsx import { useScript } from "deco/hooks/useScript.ts"; const onLoad = () => { console.log("Window loaded"); }; function ExampleComponent() { return (

Hello, World!

``` Esse script, irá sortear os usuáriso para mantê-los no site ou redirecioná-los para o subdomínio. ### Como medir o resultado? * Configurar o G.A e o GTM em ambos os sites #### Vantagens * O cliente só paga a infraestrutura proporcional ao uso * Setup simples #### Desvantagens * O cliente final vê uma URL diferente * A divisão de tráfego é feita com Javascript no Front ## Método de Proxy da deco.cx O método de proxy consiste em manter todo o tráfego no mesmo domínio, mas realizar um proxy transparente para parte dos usuários. Repare que dessa forma, você precisa colocar o seu antigo site em outro domínio, para que a deco.cx utilize-o para o Proxy. ### Como fazer: Facilitamos a ativação desse proxy com esse fluxo: 1 - No painel deco.cx, acesse `Apps` 2 - Abra o app `site` 3 - Você deve ver essa configuração: O segmento da imagem, é o `Random`, com split de 50%, mas você pode utilizar outros segmentos. ### Como medir o resultado? * Configurar o G.A e o GTM em ambos os sites * Acompanhar os resultados na deco.cx Para acompanhar os resultados na deco.cx, o Matcher a ser utilizado precisa ser criado através da aba de Experiments, confira como em [Teste A/B](https://deco.cx/docs/pt/developing-capabilities/apps/ab-test). Além disso, repare que nas configurações, existe a opção `Scripts to include`; selecione e inclua o script `DecoAnalytics`. #### Vantagens * Mantem a experiência toda no mesmo domínio * Setup de divisão de tráfego pronto * Setup de Analytics pront #### Desvantagens * Paga o custo de todo tráfego, independente do escalonamento ## Método de Proxy externo Este método, é o inverso do proxy na deco.cx: a responsabilidade de dividir o tráfego e fazer o proxy é do antigo website. > Nota: Para lojas VTEX, deco.cx está construindo um APP no Vtex IO para > realizar esse proxy Caso esteja em dúvida sobre como desenvolver esse proxy na sua tecnologia, estamos no [Discord](https://deco.cx/discord) para ajudar. #### Vantagens * O cliente só paga a infraestrutura proporcional ao uso #### Desvantagens * Setup não vem pronto, a depender da tecnologia ## Informações extras ### Configuração GTM Para auxiliar a configuração dos eventos no GTM, recomendamos a consulta do cookie `deco_matcher...`, que indica em qual versão o usuário está. ### Orderform VTEX Como fonte extra de dados, recomendamos a inserção no OrderForm de uma marcação no marketingData, indicando em qual versão o usuário está, pois essa informação vai para o painel de pedidos da VTEX. * [Script exemplo](https://gist.github.com/guitavano/6de5f1068c85800b0702937b97c51ef2) # Criando uma Section Source: https://docs.deco.cx/pt/developing-guide/hello-world Criando uma Section Agora que você está mais familiarizado com Sections e como elas são usadas no admin, vamos criar uma Section do zero. Neste guia, você aprenderá a criar uma Section, a adicionar propriedades a ela e a estilizá-la com seus temas. Abra a pasta do seu site em uma IDE e execute as seguintes ações: ## 1. Crie um arquivo `.tsx` na pasta `sections/` Crie um arquivo `.tsx` na pasta `sections/` em seu Site com o nome desejado para Section (*e.g*: `Post.tsx`). A Section é um componente [Preact](https://preactjs.com/) que é configurável no Admin. Para que a Section seja visível no Admin, é preciso criar esse componente na pasta `sections/` ou em algum de seus sub-diretórios. ## 2. Exporte o componente Exporte um componente [Preact](https://preactjs.com/) **usando `export default`** como o exemplo abaixo: `sections/Post.tsx` ```tsx export interface Props { title: string; } export default function Post({ title }: Props) { return (

{title}

This is an example section

); } ``` **Pronto!** A Section foi criada localmente no seu projeto. ## 3. Visualize a Section no Admin Execute o projeto localmente como foi feito anteriormente no [setup](https://deco.cx/docs/pt/developing-guide/setup). Ao selecionar seu ambiente local no Admin, você poderá visualizar a nova Section na biblioteca de Sections (**Sections**) e adicioná-la a uma página. ![Nova section na section library](https://deco.cx/docs/hello-world/new-section.png) ## 4. Adicionando propriedades à Section Vamos adicionar três novas propriedades ao nosso componente `Post`, uma para imagem (`photo`), outro para o corpo da postagem (`post`) e um para a hora da postagem. ```tsx import type { ImageWidget } from "apps/admin/widgets.ts"; import Image from "apps/website/components/Image.tsx"; export interface Props { /** * @title Post image. */ photo?: ImageWidget; /** * @title Post body. * @format textarea */ post: string; /** * @title Publish date. * @format datetime */ datetime: string; /** * @title Post title. */ title: string; } export default function Post({ title, photo, datetime, post }: Props) { return (
{photo && ( {`${title} )}

{title}

Published at: {datetime}

This is an example section

{post}

); } ``` Uma Section pode ter como propriedade qualquer elemento que seja serializável, e interpretável no formulário de propriedades no admin da deco. Isto inclue: * `strings` e `numbers` * Tipos simples de objetos serializáveis * Tipos gerados de união, extensão, `Pick` ou `Omit` * `Sections` ( `import { Section } from "deco/blocks/section.ts"` ) * `ImageWidget` (`import type { ImageWidget } from "apps/admin/widgets.ts";`) e outros components do admin * Arrays dos tipos indicados acima Além dos tipos acima, é possível anotar algumas propriedades para que o formulário do admin altere o mecanismo de inserção ou para determinar alguns aspectos do comportamento da propriedade (através da anotação `@format`, por exemplo). Leia mais sobre [essas anotações aqui](https://deco.cx/docs/pt/developing-capabilities/section-properties/widgets) ## 5. Visualizando as novas propriedades no Admin Com o projeto executando localmente, abra novamente a Section no Admin. Você verá as novas propriedades adicionadas ao componente `Post`. É possível ver que o admin prepara componentes próprios de formulário para a inserção de imagens, data, bem como sinaliza o que é cada campo a partir do `title` indicado em código. ![Formulário da section no admin](https://deco.cx/docs/hello-world/section-properties.png) ## 6. Tematizando a Section ### 6.1 Tema do Site No projeto base deco, é possível acessar uma Section especial, a `Theme.tsx`. Esta section define tokens e nomes especiais de classes que podem ser utilizadas por outras Sections seguindo a estrutura da ferramenta DaisyUI. Dentro do `Theme.tsx` é possível observar alguns tokens como o de cores principais: ```tsx export interface MainColors { /** * @format color * @title Base * @default #FFFFFF */ "base-100": string; /** * @format color * @title Primary * @default #003232 */ "primary": string; /** * @format color * @title Scondary * @default #8C3D3D */ "secondary": string; /** * @format color * @title Tertiary * @default #00FF7F */ "tertiary": string; } ``` As cores de cada token podem ser alteradas no Admin, na aba de Themes. Nela, você pode alterar as cores do seu tema atual ou criar um novo tema. ![Alterando as cores do tema](https://deco.cx/docs/hello-world/themes.png) ### 6.2 Tema de uma página Além do tema do site, é possível alterar o tema de uma página específica. Para isso, basta acessar uma página específica no Admin adicionar a section do tema desejado. ![Escolhendo o tema de uma página](https://deco.cx/docs/hello-world/add-section.png) ![Alterando o tema de uma página](https://deco.cx/docs/hello-world/section-themes.png) Neste caso, adicionamos na página My New Page a Section do tema Groovy Vibes. Esta página em específico agora tem um tema diferente do restante do site. ![Adicionando o tema Groovy Vibes](https://deco.cx/docs/hello-world/page-theme.png) ### 6.3 Estilizando a Section Adapte a classe de postagens para fazer uso de alguns tokens. Por exemplo, o título principal da postagem agora segue a cor primária do tema. ```tsx import type { ImageWidget } from "apps/admin/widgets.ts"; import Image from "apps/website/components/Image.tsx"; export interface Props { /** * @title Post image. */ photo?: ImageWidget; /** * @title Post body. * @format textarea */ post: string; /** * @title Publish date. * @format datetime */ datetime: string; /** * @title Post title. */ title: string; } export default function Post({ title, photo, datetime, post }: Props) { return (
{photo && ( {`${title} )}

{title}

Published at: {datetime}

This is an example section

{post}

); } ``` Agora, a Section `Post` segue o tema do site (ou da página) e utiliza as cores definidas no tema. ![Section com tema do site](https://deco.cx/docs/hello-world/new-section-with-theme.png) # Interatividade com HTMX Source: https://docs.deco.cx/pt/developing-guide/htmx Interatividade com HTMX Este tutorial vai te guiar na integração do HTMX ao seu projeto deco, permitindo maior interatividade com o mínimo de JavaScript. Vamos criar um contador como exemplo para ver como deco.cx integra com HTMX. ## O que é o HTMX? HTMX permite acessar recursos modernos do navegador diretamente do HTML, facilitando a construção de aplicações web interativas com menos JavaScript. ## Passo 1: Adicionando HTMX ao Seu Projeto Primeiro, você precisa incluir a biblioteca HTMX no seu projeto. Você pode fazer isso adicionando a seguinte tag de script ao seu HTML: ```html ``` ## Passo 2: Criando a Versão Preact do Contador Vamos criar um componente Preact para o contador e ver a diferença para a versão com HTMX: ```tsx import { useState } from "preact/hooks"; export default function Section() { const [count, setCount] = useState(0); return (
{count}
); } ``` Aqui, estamos usando o hook `useState` do Preact para gerenciar o estado do contador e o evento `onClick` para atualizar o contador quando os botões são clicados. ## Passo 3: Criando a Versão HTMX do Contador Na versão HTMX, não usaremos mais o hook `useState` nem o evento `onClick`. Ao usar HTMX, precisamos de uma rota para cada estado da UI, então faremos uma solicitação ao servidor para atualizar o estado do contador. É aí que o [hook `useSection`](https://deco.cx/docs/pt/api-reference/use-section) é útil. Este hook cria automaticamente rotas para renderizar seus estados de UI sem exigir que os desenvolvedores lidem manualmente com o roteamento. Vamos ver o que muda na versão HTMX: ```tsx import { useSection } from "deco/hooks/useSection.ts"; export default function Section({ count = 0 }: { count: number }) { return (
{count}
); } ``` Para atualizar o estado, como mencionado antes, estamos usando `hx-get` com o hook `useSection`. O atributo `hx-get` faz uma solicitação GET para a URL retornada pelo hook `useSection`. A resposta é um novo HTML com o novo estado da UI do contador. O atributo `hx-target` define o elemento alvo onde a resposta será inserida, neste caso, a seção mais próxima do botão. O atributo `hx-swap` define como a resposta será inserida, neste caso, substituindo todo o elemento da seção pela resposta. Para ilustrar a diferença entre as versões Preact e HTMX, vamos usá-las e ver como se comportam na aba de Network das ferramentas de desenvolvedor do navegador. Enquanto a versão Preact atualiza o estado do contador localmente, a versão HTMX faz uma requisição ao servidor para atualizar o estado do contador. ![Requisições da versão HTMX](https://deco.cx/docs/developing-guide/htmx/htmx-network.gif) ![Requisições da versão Preact](https://deco.cx/docs/developing-guide/htmx/preact-network.gif) ## Conclusão HTMX é uma ferramenta poderosa que pode simplificar o processo de adicionar interatividade às suas aplicações web. Usando HTMX, você pode reduzir a quantidade de JavaScript que precisa escrever e manter, tornando seu código mais limpo e gerenciável. Para mais informações, confira a [documentação do HTMX](https://htmx.org/docs/) e a [documentação do deco.cx](https://deco.cx/docs/). # Configuração do ambiente. Source: https://docs.deco.cx/pt/developing-guide/setup Configuração do ambiente. * Leia o guia em **Comece agora** para entender os conceitos base e a ferramenta de admin da deco * **Importante**, é possível acessar [nosso Discord](https://deco.cx/discord) para reportar dúvidas ou problemas com a *deco.cx*. Participe também da nossa comunidade! ## Tópicos 1. Tecnologias utilizadas na deco 2. Comece a desenvolver com a deco 3. Desenvolvendo com a deco ## Tecnologias utilizadas na deco Ao criar um site ou loja online com a *deco.cx*, o usuário tem a flexibilidade de criar [Sections](https://deco.cx/docs/pt/concepts/section) e [Loaders](https://deco.cx/docs/pt/concepts/loader) que atendem às suas necessidades exclusivas. Para ajudá-la a criar esses componentes com facilidade e rapidez, contamos com um conjunto de tecnologias poderosas e eficientes. Nossa pilha de tecnologia é focada em **simplicidade e desempenho**, tornando-a acessível a desenvolvedores com experiência anterior em HTML, CSS, JavaScript e React. Estas são as principais ferramentas que usamos para alimentar os sites deco.cx: ### [Preact](https://preactjs.com/) **Preact** é uma alternativa rápida e leve ao [React.js](https://reactjs.org/), usado para renderizar componentes de UI no servidor e no cliente. Ele usa *JSX* para criar componentes da web e geralmente é bem simples de aprender. ### [Tailwind](https://tailwindcss.com) **Tailwind** é uma solução de estilos CSS baseada em classes utilitárias, o que o torna ideal para iniciantes. O Tailwind também é otimizado para performance. ### [Deno](https://deno.com/deploy) O **Deno** é um ambiente de execução JavaScript e TypeScript. É usado para fazer Sites na deco, escritos em Typescript, executados por um servidor. Deno é semelhante a Node.js (*curiosidade*: eles foram [criados pela mesma pessoa](https://www.youtube.com/watch?v=M3BM9TB-8yA)). ### [Fresh](https://fresh.deno.dev) O **Fresh** é um framework web fullstack (backend e frontend) para desenvolvedores JavaScript e TypeScript. Foi projetado para tornar fácil a criação de aplicações web de alta qualidade, alta performance e altamente personalizáveis. ## Comece a desenvolver com a deco ### Ferramentas necessárias A única configuração necessária para codificar sites *deco.cx* é **instalar o Deno** em sua máquina. Para instalar o Deno, siga as [instruções na página deno.land](https://deno.land/manual/getting_started/installation). > Certifique-se de manter o deno atualizado! Caso já tenha o deno instalado, > rode o `deno upgrade` para atualizá-lo. Recomendamos fortemente o uso do [Visual Studio Code](https://code.visualstudio.com/download) como IDE e do [Git](https://github.com/git-guides/install-git) para controle de versão. {/* ## Teste a deco localmente (opcional)! A deco oferece um mecanismo para testar e explorar nosso sistema sem a necessidade de subir código ou fazer um deployment na nossa infraestrutura. Para isso, acesse [o Deco Play](https://play.deco.cx/) ![deco play](https://github.com/deco-cx/apps/assets/882438/e52c7727-b1c2-44cc-b709-10adba203341) */} ### 1. Crie um site deco.cx Siga o tutorial de [Criar um Site Deco](https://deco.cx/docs/pt/getting-started/creating-a-site). ### 2. Clone o repositório do seu site Aceite o convite para se juntar ao repositório criado para o seu Site. Esse convite é enviado para o endereço de e-mail do seu perfil do Github. Caso não tenha utilizado uma conta do github para entrar no admin ou caso não tenha recebido um convite, é possível adicionar uma conta do github como colaborador do Site na aba Configurações do site no Admin. {/* ![Adicionando colaborador no repositório](https://github.com/deco-cx/apps/assets/882438/0cdcc7a7-90fd-4cbe-9eea-0ca68ee533d9) */} ![Adicionando colaborador no repositório](https://deco.cx/docs/setup/repository-access.png) Use o comando `git clone` para baixar o código do site para o seu máquina. Recomendamos o uso de SSH. Abra o terminal e execute o comando: ```bash git clone git@github.com:deco-sites/site-name.git ``` **Lembre-se de alterar `site-name` para o nome do seu site.** Se preferir, é possível clonar o repositório usando outros métodos, como *git https*, por meio da ferramenta *Github* ou através de uma IDE. Na página do repositório no *Github* há detalhes sobre algumas diferentes maneiras para fazer o clone. ### 3. Executar servidor local Para rodar seu site localmente, editar e ver as mudanças no Admin, você precisa ter um ambiente local (um ambiente com `localhost` como host). Para isso, você pode usar o ambiente `localhost` criado por padrão ou criar um novo. #### 3.1 Crie um novo ambiente Abra a aba de Releases e clique no botão Novo ambiente no Admin. ![Criar novo ambiente](https://deco.cx/docs/setup/create-environment.png) #### 3.2 Defina o nome e o host do seu ambiente Escolha um nome para o seu ambiente e defina seu host como localhost. ![Definindo nome e host do ambiente](https://deco.cx/docs/setup/choose-host.png) #### 3.3 Execute seu site localmente Copie o comando mostrado depois da criação do ambiente e cole-o no seu terminal na pasta do site. ![Comando de iniciar server](https://deco.cx/docs/setup/start-server-command.png) ![Iniciando server no terminal](https://deco.cx/docs/setup/start-server-terminal.png) Aguarde a inicialização do projeto. Na primeira execução, o deno irá baixar e realizar um cache das dependências do projeto, e a deco irá preparar detalhes do site. O site estará acessível em https\://\{nome-do-ambiente}--\{nome-do-site}.deco.site. {/* > Alguns browsers impedem acessar ou executar código no domínio `localhost`! > Desative proteções de acesso ou privacidade do browser para acessar esse > endereço. */} Caso o código de alguma seção em uso na página inicial do site seja alterado, isto será refletido no endereço acima. #### 3.4 Publicando alterações Considerando que você escolheu o Deco Hosting para o deploy de seu site, o processo de *deploy* em development é muito simples: apenas fazer um *git push* das alterações na *branch* ***main***. Você também pode publicar seu ambiente no próprio Admin clicando no botão de Publicar agora, na página do seu ambiente. ![Publicar mudanças](https://deco.cx/docs/setup/publish-button.png) ## Agora você pode começar a criar sites cada vez mais do seu jeito! :) Continue estando a deco para entender o potencial e como criar ou alterar sections, loaders e outros elementos da deco para criar sites e experiências cada vez ,mais personalizadas. Certifique-se de se juntar ao nosso [comunidade no Discord](https://deco.cx/discord). Acompanhe as novidades e continue evoluindo junto com a gente! # Adicionando um App Source: https://docs.deco.cx/pt/getting-started/adding-an-app Adicionando um App Nesta documentação, vamos te guiar na adição de um `App` ao seu site. Um `App` permite que você integre facilmente novas funcionalidades, seções e recursos ao seu site. ## 1. Acessar a Página de Apps Para adicionar um app ao seu site, clique na aba Apps. Você verá uma lista de todos os apps disponíveis. Neste caso, vamos adicionar o Weather App. ## 2. Instalar o App Clique no botão de switch para instalar o app no seu site. ![Instalar app](https://deco.cx/docs/getting-started/adding-an-app/install-app.png) O Weather App fornece uma seção que exibe uma mensagem com a temperatura atual. Além da seção, este app também inclui um loader, uma função TypeScript que retorna dados tipicamente utilizados em Sections. Este loader específico obtém a temperatura de um local determinado (ou da localização atual se nenhum local for especificado). Vamos usar ambos e ver como podem ser integrados. ## 3. Usar as Funcionalidades do App ### 3.1 Vá para a Seção WhatsTheTemperature Navegue até a Página de Seções e clique na Seção WhatsTheTemperature. Você pode filtrar a lista pelo app. ![Página de Seções](https://deco.cx/docs/getting-started/adding-an-app/sections-page.png) Abra as propriedades da seção. A única propriedade que esta seção possui é a temperatura, que é um número representando a temperatura em Celsius. ### 3.2 Configure a Seção para Usar o Loader do App Clique no campo Temperatura para escolher como você vai fornecer a informação de temperatura. ![Selecionar Fonte de Temperatura](https://deco.cx/docs/getting-started/adding-an-app/select-source.png) Você tem três opções: 1. **Entrada Manual**: Forneça um número arbitrário para a temperatura. ![Entrada Manual](https://deco.cx/docs/getting-started/adding-an-app/manual-entry.png) 2. **Valor Padrão**: Deixe o campo de temperatura em branco. A seção aceita um valor nulo, e uma temperatura fixa padrão será exibida. ![Valor Padrão](https://deco.cx/docs/getting-started/adding-an-app/default-value.png) 3. **Usar o Loader**: Utilize o loader disponibilizado pelo Weather App. ![Usar o Loader](https://deco.cx/docs/getting-started/adding-an-app/use-loader.png) Se você não fornecer latitude e longitude, o loader buscará a temperatura da sua localização atual. Alternativamente, fornecendo a latitude e a longitude de um local específico, será retornada a temperatura atual desse local: ![Temperatura do Loader](https://deco.cx/docs/getting-started/adding-an-app/loader-temperature.png) > Parece que está um pouco frio na Groenlândia. ## 4. Usar a Seção em Suas Páginas Agora você pode usar a seção configurada nas páginas do seu site, assim como fez em [um tutorial anterior](https://deco.cx/docs/pt/getting-started/creating-a-new-page). É isso! Aproveite para explorar este e outros apps no deco.cx! # Gerenciando Mudanças e Publicando Source: https://docs.deco.cx/pt/getting-started/changes-and-publishing Aprenda como restaurar versões anteriores do seu site É muito importante ter controle e autonomia para gerenciar suas páginas e blocos e ter a capacidade de fazer e desfazer alterações facilmente, se necessário. Com isso em mente, o *deco.cx* permite que você crie e gerencie **ambientes**. ## Ver Alterações e Publicar Vamos dar uma olhada nas mudanças que fizemos neste ambiente. Clique no dropdown e selecione a opção staging. Você verá esta página, mostrando o que foi alterado em comparação com o site em produção. No nosso caso, adicionamos uma nova página com algumas seções. Essa diferença é exibida via JSON, que representa o estado do site de forma estruturada. ![Mudanças no Ambiente](https://deco.cx/docs/getting-started/changing-and-publishing/env-changes.png) A partir daqui, você pode publicar nossas mudanças para a produção clicando no botão "Publicar agora" ou no botão "Publicar" ao lado do dropdown do ambiente. ### Rebaseando suas Alterações Ao publicar com múltiplos ambientes, pode ser necessário mesclar suas alterações com as feitas em outros ambientes. Por exemplo, se você estiver editando seu site no seu novo ambiente, `maria`, enquanto um colega estiver editando no ambiente `staging`, e seu colega publicar suas mudanças, você precisará rebasear seu ambiente para incorporar as novas mudanças que agora estão em produção. Nesse cenário, em vez de ver o botão "Publicar agora" na página de Lançamentos, você verá um botão "Rebase", como mostrado abaixo. ![Rebase no ambiente](https://deco.cx/docs/getting-started/changing-and-publishing/rebase.png) Clique neste botão para incorporar as mudanças de produção no seu ambiente. Depois de rebasear, você pode publicar suas alterações clicando no botão "Publicar agora". # Criando uma Página Source: https://docs.deco.cx/pt/getting-started/creating-a-new-page Aprenda como criar páginas na deco.cx sem precisar de código Agora vamos criar uma nova página para o seu site. O processo é muito simples: ## 1. Acesse a aba de Páginas Páginas têm um space dedicado no Admin do Deco.cx, acessível pela barra lateral. ![Space de páginas](https://deco.cx/docs/getting-started/creating-a-new-page/pages-space.png) Nesta página, você pode ver todas as páginas publicadas no site, junto com os caminhos pelos quais elas são acessíveis aos seus usuários. Aqui você pode clicar no botão "Criar nova página" para criar uma página. > Alternativamente, você pode clicar no botão "Criar página" na Página Inicial > do Site ou digitar `/new page` na barra de comando localizada no topo central > da página do Admin. ## 2. Dê um nome e um caminho à página Preencha o formulário de criação de página com as seguintes informações: * **Nome:** nome significativo para entender o que essa página representa. Não afeta a interface do usuário ou os metadados da página. * **Path:** representa a URL que aquela página estará acessível para seus usuários. Pode ser estático (por exemplo: `/posts`) ou dinâmico (por exemplo: `/posts/:slug`, `/search/*`), seguindo o esquema [URLPattern](http://mdn.io/urlpattern). * **Template** (opcional): selecione uma página já existente e comece a partir dela. Aqui, vamos criar uma página em branco. ![Criando uma nova página](https://deco.cx/docs/getting-started/creating-a-new-page/new-page.png) ## 3. Edite o conteúdo da página Agora é possível editar e adicionar novas Sections disponíveis em seu site e configurar a página do jeito que você quiser. Para adicionar um novo componente à página, clique no botão "Adicionar Seções" no editor e explore todas as opções disponíveis. Seções são componentes de UI (pequenas partes do site) que podem receber propriedades e serem editadas através de um formulário no Admin. ![Adicionando uma seção](https://deco.cx/docs/getting-started/creating-a-new-page/add-section.png) > Se você deseja desenvolver/codar uma nova seção, consulte nosso > [Guia de desenvolvimento](https://deco.cx/docs/pt/developing-guide/setup). Vamos selecionar a seção Hero. ![Seção Hero](https://deco.cx/docs/getting-started/creating-a-new-page/hero.png) Após a seleção, podemos ver o formulário onde podemos editar suas propriedades. Essas propriedades são obtidas a partir das props do TypeScript dessa seção. ![Formulário da Seção](https://deco.cx/docs/getting-started/creating-a-new-page/section-form.png) > Nota: O exemplo que você vê acima é de um bloco reutilizável, que é um recurso > global que pode ser usado por outras páginas. Por isso, você não pode editar > essa seção a menos que a desanexe para alterar apenas nessa página ou a edite > em um novo espaço (o que afetará todas as páginas que a utilizam). Vamos desanexar a seção para editar suas propriedades para essa página. Vamos mudar o Título na propriedade Title. À medida que você faz alterações, a pré-visualização será atualizada em tempo real para mostrar como a seção ficará com os novos valores de propriedade. ![Mudando a Seção](https://deco.cx/docs/getting-started/creating-a-new-page/changing-section.png) Cada componente pode ter diferentes propriedades que podem ser personalizadas. Essas propriedades são definidas no código da seção e podem ser acessadas através do objeto props. # Criando um Site Source: https://docs.deco.cx/pt/getting-started/creating-a-site Passo a passo de como criar um site na Deco.cx. Esta documentação vai te guiar pelo processo de criação e configuração do seu primeiro site usando o Deco.cx. Um site Deco é o principal ativo para os usuários do Deco, servindo como o centro para criar, editar e gerenciar seu próprio espaço na web. ## 1. Selecionar um Template Vá para o [Deco Admin](https://admin.deco.cx/spaces/new) e selecione um template para começar. Neste exemplo, vamos escolher o template de landing page, que tem a estrutura e componentes comuns a páginas de aterrissagem. ![Escolhendo um template](https://deco.cx/docs/getting-started/creating-site/choose-template.png) ## 2. Explorar o Template Depois de selecionar um template, você pode explorar seus componentes em modo compartilhado de visualização apenas. Isso permite que você explore as configurações e recursos do template sem fazer nenhuma alteração. ![Editar um site](https://deco.cx/docs/getting-started/creating-site/site-editor.png) ## 3. Salvar Seu Site Para criar oficialmente seu site a partir do template, clique no botão "Use this template" no canto superior direito da página de administração para reivindicar a propriedade do site. ![Salvar site para sua equipe](https://deco.cx/docs/getting-started/creating-site/save-site-btn.png) ### 3.1. Faça login na Plataforma ### 3.2. Dê um Nome ao Seu Site e Escolha uma Equipe Você será solicitado a escolher um nome para o seu site e uma equipe para salvá-lo: ![Escolhendo um nome e uma equipe para salvar o site](https://deco.cx/docs/getting-started/creating-site/save-site.png) Se você ainda não tiver uma equipe, uma será criada com um nome à sua escolha: ![Escolhendo um nome e uma equipe que você vai criar](https://deco.cx/docs/getting-started/creating-site/save-site-and-team.png) A Deco vai configurar seu site de acordo com o template que você escolheu. ## 4. Finalizar Configuração do Site Você será redirecionado para a página inicial do site: ![Página Inicial do Site](https://deco.cx/docs/getting-started/creating-site/site-home.png) A partir daqui, você tem duas opções: 1. Rodar seu site localmente usando seu ambiente de desenvolvimento local. * Isso te dá o poder de modificar seu site alterando seu código, bem como usando o Deco Admin. 2. Criar um novo ambiente para editar seu site apenas através do Deco Admin. * Aqui você pode fazer alterações no seu site sem precisar ter acesso ao código do site. ### Opção 1: Rodar Seu Site Localmente Para rodar seu site localmente, você precisa: 1. Instalar o Deno na sua máquina. Você pode seguir as instruções no [site do Deno](https://deno.land/). 2. Clonar o repositório do site: ```bash git clone git@github.com:deco-sites/maria-landing.git ``` 3. Entrar na pasta do repositório e iniciar o servidor: ```bash cd maria-landing DECO_ENV_NAME=localhost deno task start ``` Agora, você pode modificar o código e ver as mudanças no Admin e vice-versa. ### Opção 2: Criar um Novo Ambiente Ambientes são espaços de trabalho isolados onde você pode fazer alterações no seu site sem afetar o site ao vivo. Para criar um novo ambiente: 1. Clique no botão "New" no dropdown de ambientes no Admin. ![Botão Novo Ambiente](https://deco.cx/docs/getting-started/creating-site/new-env-btn.png) 2. Escolha um nome e um host para o seu ambiente. Como não vamos rodar o site localmente, selecione a opção Web para o host. ![Formulário Novo Ambiente](https://deco.cx/docs/getting-started/creating-site/new-env-form.png) Agora você tem seu próprio ambiente e espaço de trabalho isolado para fazer alterações no seu site sem precisar rodar seu código. ## (Opcional) 5. Deploy do Seu Site Se você quiser fazer o deploy do seu site usando o Hosting da Deco, você pode fazer isso clicando no botão "Add Deco Hosting" na página inicial do site ou no botão "Go live" no dropdown de ambientes. Botão de Deploy do site Seu site se tornará acessível através de uma URL pública como `https://deco-sites-maria-landing.deno.dev/`. Esse deploy incluirá 5.000 visualizações de página (compartilhadas entre todos os sites da equipe). Se você precisar de mais visualizações de página, você pode [atualizar seu plano](https://deco.cx/en/pricing) no Deco Admin. ## 6. Parabéns! Você Criou Seu Primeiro Site Deco É isso aí! Agora você pode editar seu site como quiser. Não se esqueça de seguir os próximos tutoriais para descobrir mais recursos e capacidades do Deco.cx. # Redirecionando sem WWW Source: https://docs.deco.cx/pt/getting-started/custom-domains/apex-domains Como redirecionar domínio sem www ## O que é domínio apex? Domínio apex é o termo utilizado para domínio raiz, sem subdomínio. Exemplo: * `www.example.com.br` -> Subdomínio * `loja.example.com.br` -> Subdomínio * `example.com.br` - Domínio Apex ## Posso apontar um site deco.cx para o domínio apex? Não, ainda não é possível apontar um site deco.cx para o seu domínio apex. Por isso, criamos uma solução fácil de redirecionamento, para que os acessos ao domínio Apex não sejam perdidos. ## Como redirecionar um domínio apex na deco.cx? 1 - No painel do seu site na deco.cx, acesse a página de Configurações. 2 - Clique em "Adicionar domínio existente" 3 - Insira o seu domínio apex (sem subdomínio): ![Domain step](https://deco.cx/docs/getting-started/custom-domains/apex-domain.png) 4 - Defina para qual subdomínio redirecionar: ![Sudomain step](https://deco.cx/docs/getting-started/custom-domains/subdomain.png) 5 - Agora, você verá os apontamentos que devem ser feitos na sua plataforma de hospedagem de domínio: ![DNS Setup](https://deco.cx/docs/getting-started/custom-domains/validate-apex.png) 6 - Após realizar as configurações, clique em Validar Domínio. A etapa de validação é essencial para o funcionamento e ela depende da propagação do DNS configurado no serviço de hospedagem. No geral, a propagação ocorre dentro algumas horas, mas pode levar até 48 horas em alguns casos. # Configurando GTM Source: https://docs.deco.cx/pt/getting-started/gtm Aprenda como configurar o GTM na Deco Adicionar o Google Tag Manager (GTM) é uma prática comum em muitos sites. A plataforma deco.cx oferece uma section que facilita a integração automática do GTM ao seu site. No entanto, é importante notar que o uso de um GTM com muitos scripts pode impactar negativamente a experiência de navegação e desempenho do site. ## Adicionando uma Section Global para Carregamento no Site Uma boa prática é adicionar a section que carrega o script GTM em todas as páginas do site. Isso pode ser feito utilizando sections globais, que são carregadas automaticamente em todas as páginas geradas no admin. No caso de páginas proxied, é necessário inserir o script diretamente na origem. Comece selecionando o app do site: ![Selecionando o app do site](https://deco.cx/docs/gtm/select-app.png) Em seguida, localize as propriedades das sections globais: ![Sections Globais](https://deco.cx/docs/gtm/global-sections.png) Por fim, adicione a section de Analytics: ![Adicionando section de Analytics](https://deco.cx/docs/gtm/add-analytics.png) ## Configurando sua Section A section padrão de Analytics oferece várias opções de configuração. Se você já tem o ID do container GTM, basta inseri-lo no campo "Tracking ID" para ativar o uso no site. Se estiver utilizando um Measurement ID, também pode configurar essa propriedade. Além disso, é possível configurar fontes (sources) personalizadas para o site. ![Configurando sua section](https://deco.cx/docs/gtm/configure-your-section.png) ## Configurando um GTM por Página Também existe a opção de adicionar a section de Analytics em páginas específicas. Dessa forma, cada página pode ter seu próprio GTM, permitindo o uso de diferentes configurações para diferentes seções do site. # O que é deco.cx Source: https://docs.deco.cx/pt/getting-started/overview deco.cx é um construtor de sites que permite criar, personalizar e implantar sites com facilidade. Com foco na personalização, você pode criar experimentos, segmentar conteúdo por público-alvo e muito mais. ## A Web está quebrada, complicada e fragmentada. Nos últimos 10 anos, nossa equipe construiu sites e aplicativos de alto volume e missão crítica. Testamos a maioria dos novos frameworks e arquiteturas frontend, desde KnockoutJS até React e GraphQL. Refletindo sobre nossos desafios e resultados, acreditamos que o estado atual do desenvolvimento web está quebrado:
🧩 A complexidade para construir e implantar um aplicativo web tem aumentado constantemente, desencorajando desenvolvedores juniores a construir para a web. 😓 Desenvolvedores e criadores de conteúdo frequentemente têm dificuldade em colaborar porque o CMS Headless se torna um silo, exigindo muito tempo para integrar e evoluir; 🐢 Aplicativos orientados para o cliente têm um desempenho terrível para sites de alto volume, impulsionados por conteúdo, como lojas de comércio eletrônico, que enviam quantidades cada vez maiores de código JavaScript.
Queríamos uma maneira mais simples para os desenvolvedores web construírem e colaborarem com seus colegas de marketing, usando tecnologias web modernas e sem precisar configurar tantas coisas. "No-code" não é suficiente e muitas vezes retira poder dos desenvolvedores. Queríamos ter um ambiente único, desde o código até o conteúdo e os dados. Queríamos construir o outro lado do código, um construtor de experiências colaborativo para desenvolvedores e criadores de conteúdo trabalharem juntos.