ADR-0008: Componente Visual Modular - Hero | Wiki
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.
-
**Definição de Tipo Proprietário (
HeroProps):** O componente definirá publicamente um tipo estáticoHeroProps, encapsulando os dados essenciais de negócio:headline,description,cta_textecta_link. -
**Decodificação Segura (
parse):** A funçãoparse(section: Dict(String, String)) -> Result(HeroProps, String)será responsável por mapear o dicionário fracamente tipado para a estruturaHeroProps. - Se chaves obrigatórias comoheadlineestiverem ausentes, a função poderá retornarErrorou aplicar um fallback resiliente. - Chaves opcionais (como os detalhes de call-to-action) usarão o tipoOption(String)em Gleam para representar nativamente a ausência de valor, livrando o motor visual de adivinhações. -
**Renderização Pura (
render):** O componente terá uma funçãorender(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).