Gleam.br Wiki

ADR-0008: Componente Visual Modular - Hero | Wiki

Documentação de engenharia e especificações técnicas da Gleam-BR.

ADR-0008: Componente Visual Modular - Hero

Este documento especifica a decisão de design sobre a implementação do componente visual "Hero" para o layout "Site" do gerador estático gbr_ssg, focado em garantir tipagem estática e resiliência na renderização.

1. Contexto e Motivação

O componente Hero é a primeira seção modular do novo motor de layout de sites. Os dados que alimentam este componente são extraídos do Frontmatter TOML (onde são definidos como [[sections]]) e chegam ao motor como um dicionário genérico de strings (Dict(String, String)). Para alinhar o componente com a filosofia de *Sistemas Lúcidos* e aproveitar o poder da *Luz da Tipagem* do Gleam, não podemos depender da passagem de dicionários dinâmicos genéricos pela árvore de componentes. Precisamos garantir a extração segura (unboxing) dessas chaves fracas para um record (struct) fortemente tipado antes que a renderização ocorra.


2. Decisão Arquitetural

Optamos por introduzir um passo explícito de Parsing/Decoding dentro da arquitetura do componente.

  1. **Definição de Tipo Proprietário (HeroProps):** O componente definirá publicamente um tipo estático HeroProps, encapsulando os dados essenciais de negócio: headline, description, cta_text e cta_link.

  2. **Decodificação Segura (parse):** A função parse(section: Dict(String, String)) -> Result(HeroProps, String) será responsável por mapear o dicionário fracamente tipado para a estrutura HeroProps. - Se chaves obrigatórias como headline estiverem ausentes, a função poderá retornar Error ou aplicar um fallback resiliente. - Chaves opcionais (como os detalhes de call-to-action) usarão o tipo Option(String) em Gleam para representar nativamente a ausência de valor, livrando o motor visual de adivinhações.

  3. **Renderização Pura (render):** O componente terá uma função render(props: HeroProps) -> Element(Nil). A função será pura e determinística, sem regras de "negócio", focada estritamente em transpor os valores tipados para HTML com classes Tailwind CSS (Dark Mode).


3. Requisitos EARS

*Requisitos Ubíquos (Ubiquitous Requirements)* - *UBQ-01 (Mapeamento Forte):* O componente Hero DEVE obrigar a conversão da estrutura genérica Dict(String, String) para o tipo formal HeroProps através de sua função parse, antes de qualquer delegação ao pipeline de renderização visual. - *UBQ-02 (Resiliência do CTA):* O componente DEVE ser resiliente a dados incompletos. Se as propriedades cta_text ou cta_link estiverem ausentes (resolvidas para None), a interface de renderização DEVE omitir a construção do elemento do botão silenciosamente, sem causar interrupções ou quebras de formatação no restante da página (fail-soft).