Gera o esqueleto de um Layout WCM do Fluig — a view FreeMarker (.ftl) que define as regiões/áreas onde os widgets são posicionados, usando o grid responsivo do Style Guide. Use quando o desenvolvedor pedir para criar/iniciar um novo layout (template de página) do Fluig a partir de um nome ou propósito.
Esta skill gera o esqueleto de um Layout WCM do Fluig; ela não duplica convenções — os arquivos de context/ são a fonte de verdade, referenciada abaixo.
Objetivo
Produzir, com responsabilidade única, o esqueleto de um Layout WCM do Fluig na estrutura oficial de pastas/arquivos: o descritor application.info (application.type=layout), a view FreeMarker (layout.ftl) que reproduz a estrutura HTML rígida de portal e declara os slots/regiões onde os widgets são encaixados, e os arquivos .properties de i18n.
Quando Usar
Ao criar um novo layout (template de página) do Fluig a partir do zero.
Quando o desenvolvedor fornece um nome/propósito e quer um ponto de partida correto (view com regiões) seguindo as convenções oficiais.
Quando é preciso garantir, desde o início, uso do grid do Style Guide, i18n nos textos visíveis e ausência de cores fixas.
Diferenças Críticas em Relação a um Widget
Layout e widget compartilham a estrutura WAR, mas o descritor e a view diferem.
Atenção a estes pontos para não confundir os dois:
Item
Widget
Layout
application.type
widget
layout
Template principal
view.file=view.ftl
layout.file=layout.ftl
Slot padrão
—
layout.defaultSlot=<Slot> (obrigatório)
Slots pré-configurados
—
slot.<Nome>=<código-widget> (opcional)
Flag no construtor
application.uiwidget
application.uilayout
Responsivo
—
application.responsiveLayout=true
Renderização da área
conteúdo próprio
<@wcm.renderSlot id="..." /> por slot
Entradas Esperadas
Entrada
Descrição
Obrigatória
Nome do layout
Identificador em Inglês do layout (ex.: PortalTwoColumns)
sim
Propósito/estrutura
Quantas regiões/colunas e como o conteúdo se distribui
não
Chaves i18n
Chaves de tradução para títulos/textos visíveis do layout
não
Contexto de Referência (Fonte de Verdade)
Leia antes de executar — não reproduza o conteúdo aqui:
architecture.md — modelo conceitual do Layout (template de página que define slots/regiões para widgets; view FreeMarker renderizada no servidor) e a estrutura oficial de pastas/arquivos do layout (descritor application.info, layout.ftl, .properties de i18n).
style-guide.md — grid responsivo (.container/.row/.col-*), componentes e variáveis CSS de tema (var(--fs-color-*)) para estruturar a página.
conventions.md — i18n (${i18n.getTranslation('chave')}) para textos visíveis e demais convenções públicas de código.
Estrutura de Saída
O layout gerado segue a estrutura oficial (fonte de verdade em architecture.md).
O descritor application.info é obrigatório (com application.type=layout);
a layout.ftl declara os slots/regiões. Use <code> como o código do layout
(minúsculo).
<layout>/
├── pom.xml # quando o projeto usa Maven ou sob pedido
└── src/main/
├── resources/
│ ├── application.info # descritor (application.type=layout)
│ ├── <code>.properties # i18n base
│ ├── <code>_pt_BR.properties # i18n pt-BR
│ ├── <code>_en_US.properties # i18n en-US
│ ├── <code>_es.properties # i18n es
│ └── layout.ftl # view do layout (declara os slots)
└── webapp/
├── WEB-INF/{web.xml, jboss-web.xml}
└── resources/
├── css/responsive_layout.css # CSS padrão de responsividade (obrigatório)
├── css/<code>.css # CSS próprio do layout (opcional)
└── images/icon.png # ícone
No application.info, declare layout.file=layout.ftl e layout.defaultSlot
(slot padrão). Ponto de partida público: archetype Maven layout-wcm.
responsive_layout.css é padrão: todo layout inclui um
responsive_layout.css em webapp/resources/css/, que cuida da responsividade
das regiões/slots (container queries + media queries; empilha colunas em telas
estreitas, com fallback .not-supports-container-queries). O descritor declara
dois recursos CSS, nesta ordem: application.resource.css.1 aponta para a
folha global do Fluig (/portal/resources/css/wcm_responsive_layout.css,
caminho do portal) e application.resource.css.2 para o responsive_layout.css
padrão do layout. Um <code>.css próprio (opcional) entra como recurso
adicional. Conteúdo de referência em architecture.md.
A pasta WEB-INF traz web.xml e jboss-web.xml (com context-root =
/<application.code>); o pom.xml aparece quando o projeto usa Maven ou sob
pedido. Os blocos de referência desses arquivos vivem em architecture.md.
Em um projeto Fluig Studio, o layout fica em wcm/layout/<nome> (ver a
seção "Estrutura de um Projeto Fluig Studio" em architecture.md).
pom.xml (quando o projeto usa Maven ou sob pedido)
Quando for necessário gerar o pom.xml, use a estrutura abaixo como ponto de
partida — ajustando groupId/artifactId/version/name/description ao
artefato. O empacotamento é war e o finalName usa ${project.artifactId}. A
referência canônica completa está em architecture.md.
Dentro de um projeto existente, inspecione o pom.xml do módulo pai para obter
as coordenadas reais (parent groupId/artifactId); nunca invente
coordenadas.
Regras Aplicáveis (Resumo Executivo)
Somente o mínimo para orientar a geração; o detalhe está no contexto:
application.codedeve ser igual a locale.file.base.name — divergência quebra a i18n (regra crítica) → ver architecture.md.
O layout define a estrutura visual e as regiões/áreas onde os widgets são posicionados; ele não contém a lógica dos widgets → ver architecture.md.
A layout.ftl segue uma estrutura HTML rígida e obrigatória: começa com <#import "/wcm.ftl" as wcm/> e <#import "/layout-globals.ftl" as globals />, e usa a hierarquia fixa wcm-wrapper-content → wcm-all-content → wcm-content → ${divMasterId!""}. Não altere o wrapper, as classes estruturais nem a ordem dos blocos → ver "Estrutura HTML da layout.ftl" em architecture.md.
Não coloque fluig-style-guide no wrapper raiz de um layout de portal — essa classe pertence ao escopo de widgets/telas standalone, não à moldura do portal → ver architecture.md.
Reproduza os blocos condicionais fixos: pré-visualização (pageRender.isPreviewMode() → @wcm.previewPageAlert/@wcm.deviceTogglePreview), cabeçalho/menu fora da edição (pageRender.isEditMode() != true → @wcm.header/@wcm.menu), controles do construtor na edição (@wcm.editHeader/@wcm.widgetsList) e footer fora do tema responsivo (fluigThemeCode != "responsive_theme" → @wcm.footer) → ver architecture.md.
A liberdade está nos slots, dentro de ${divMasterId!""}: cada região é um <div class="editable-slot slotfull <grid>" id="slotFullN"> com <@wcm.renderSlot id="SlotX" editableSlot="true" isResponsiveSlot="true" />. O identificador do slot padrão deve casar com layout.defaultSlot do application.info → ver architecture.md.
Para o grid das regiões, use as classes de layout do contêiner-mestre (layout-1-1, layout-1-2left/layout-1-2right, layout-1-3, agrupamentos all-slots-left/all-slots-right), não posicionamento fixo → ver architecture.md.
Todo texto visível via i18n: ${i18n.getTranslation('chave')}; nunca strings fixas → ver conventions.md.
Inclua o responsive_layout.css padrão em webapp/resources/css/ (responsividade das regiões/slots) e declare os dois CSS no descritor na ordem: application.resource.css.1 = folha global do Fluig (/portal/resources/css/wcm_responsive_layout.css) e application.resource.css.2 = /resources/css/responsive_layout.css. Distintos do <code>.css próprio → ver architecture.md.
Sem CSS com hexadecimais fixos para cores de tema; use var(--fs-color-*) → ver style-guide.md.
Minimizar CSS próprio; priorizar os componentes do Style Guide; CSS próprio só sob pedido explícito (o CSS do layout permanece opcional) → ver style-guide.md/conventions.md.
Layout standalone (exceção): quando o layout não se integra à moldura do portal (ex.: telas "boards" com navbar própria), usa-se um wrapper raiz <div class="fluig-style-guide ..."> sem @wcm.header/@wcm.menu/@wcm.footer e sem a hierarquia wcm-wrapper-content. Use esse formato apenas nesse caso; o padrão é a estrutura rígida de portal.
Procedimento
Definir o nome do layout (em Inglês) e o <code> (minúsculo) a partir da entrada, e identificar as regiões/slots necessários e o arranjo do grid (ex.: largura total, duas colunas, lateral + conteúdo).
Criar a estrutura de pastas oficial (ver "Estrutura de Saída") e o descritor application.info com application.type=layout, application.renderer=freemarker, layout.file=layout.ftl, layout.defaultSlot e os campos completos do layout (incl. application.fluig.version, application.category, application.newBuilder, application.responsiveLayout, application.icon, recursos css.N e developer.url) — ver a tabela completa em architecture.md.
Montar a view layout.ftl (em src/main/resources/) reproduzindo o esqueleto rígido da seção "Estrutura HTML da layout.ftl" em architecture.md: os dois imports (/wcm.ftl e /layout-globals.ftl), o bloco de preview, o wrapper wcm-wrapper-content → wcm-all-content → wcm-content → ${divMasterId!""} e os blocos condicionais de edição. Não adicione fluig-style-guide ao wrapper raiz de portal.
Posicionar os slots dentro de ${divMasterId!""}: para cada região, um <div class="editable-slot slotfull <grid>" id="slotFullN"> com <@wcm.renderSlot id="SlotX" editableSlot="true" isResponsiveSlot="true" />; garantir que o slot padrão case com layout.defaultSlot. Ajustar a classe de grid (layout-1-1, layout-1-2left/right, etc.) conforme o arranjo desejado.
Acrescentar o footer dentro do bloco fluigThemeCode != "responsive_theme" via @wcm.footer com o layoutuserlabel apropriado (chave de i18n).
Criar os arquivos .properties de i18n (base + pt_BR/en_US/es) e aplicar i18n em qualquer título ou texto visível do layout com ${i18n.getTranslation('chave')}.
Criar o responsive_layout.css padrão em webapp/resources/css/ (conteúdo de referência em architecture.md) e declarar os dois recursos CSS no descritor na ordem: application.resource.css.1=/portal/resources/css/wcm_responsive_layout.css (folha global do Fluig) e application.resource.css.2=/resources/css/responsive_layout.css. Se houver CSS próprio do layout (<code>.css), declará-lo como recurso adicional e usar var(--fs-color-*) para cores de tema (sem hexadecimais fixos).
Quando o projeto usa Maven (ou sob pedido), criar o pom.xml na raiz da estrutura (bloco de referência em architecture.md); inspecionar as coordenadas Maven (groupId, artifactId e o parent) no projeto existente e nunca inventá-las.
Validar o resultado com o checklist abaixo antes de entregar.
Saída Esperada
Esqueleto de layout pronto para evoluir, na estrutura oficial, contendo:
O descritor application.info (application.type=layout) declarando layout.file, slot padrão e i18n.
A view layout.ftl reproduzindo a estrutura HTML rígida (imports /wcm.ftl e /layout-globals.ftl, bloco de preview, hierarquia wcm-wrapper-content → wcm-all-content → wcm-content → ${divMasterId!""}, blocos condicionais de edição e footer), com os slots nomeados renderizados por @wcm.renderSlot dentro do contêiner-mestre.
Os arquivos .properties de i18n (base + locales) com as chaves de tradução.
O responsive_layout.css padrão em webapp/resources/css/, declarado no descritor.
(Opcional) CSS próprio do layout (<code>.css) com cores de tema por var(--fs-color-*) e os arquivos de empacotamento (pom.xml, WEB-INF).
Tudo em conformidade com context/architecture.md, context/style-guide.md e context/conventions.md.
Exemplo de Uso
Use examples/layout/ como referência mínima da view .ftl de um layout que demonstra a estrutura HTML rígida de portal (imports, wrapper wcm-wrapper-content, blocos condicionais e slots renderizados por @wcm.renderSlot). Trate-o como trecho de referência, não como projeto completo.
Checklist de Validação
Estrutura oficial criada, com o descritor application.info (application.type=layout, layout.file=layout.ftl, layout.defaultSlot).
application.codeigual a locale.file.base.name.
A layout.ftl começa com <#import "/wcm.ftl" as wcm/> e <#import "/layout-globals.ftl" as globals />.
Wrapper raiz é wcm-wrapper-content com a hierarquia fixa wcm-all-content → wcm-content → ${divMasterId!""} (sem fluig-style-guide no root, salvo layout standalone).
Blocos condicionais presentes: preview (isPreviewMode), header/menu fora da edição, @wcm.editHeader/@wcm.widgetsList na edição e footer fora do tema responsivo.
layout.defaultSlot está presente entre os slots declarados na layout.ftl.
Cada slot é um <div class="editable-slot slotfull <grid>" id="slotFullN"> com <@wcm.renderSlot id="..." /> correspondente.
Cada slot.<Nome>=<widget> (se houver) referencia um código de widget válido.
Arquivos .properties de i18n (base + pt_BR/en_US/es).
responsive_layout.css padrão presente em webapp/resources/css/; descritor declara application.resource.css.1 = folha global do Fluig (/portal/resources/css/wcm_responsive_layout.css) e application.resource.css.2 = /resources/css/responsive_layout.css.
Grid das regiões via classes de layout (layout-1-1, layout-1-2left/right, layout-1-3), sem posicionamento/medidas fixas.
Todo texto visível usa ${i18n.getTranslation('...')} — sem strings fixas.
Sem hexadecimais fixos para cores de tema (use var(--fs-color-*)).
WEB-INF presente (web.xml + jboss-web.xml) com context-root = /<application.code>.
CSS próprio mínimo (Style Guide como padrão); CSS próprio sem pedido explícito = pendência a revisar.
Descritor de layout com campos completos (incl. application.newBuilder, application.responsiveLayout) — ver architecture.md.
pom.xml presente quando o projeto usa Maven ou sob pedido.
Resumo da Geração
Ao concluir, apresente um resumo curto:
Layout / application.code: nome e código.
Diretório: onde o layout foi criado.
Slots: lista de slots (com destaque para o slot padrão) e slots pré-configurados, se houver.
Arquivos gerados: lista.
Pendências manuais: ex.: icon.png real, coordenadas do pom.xml pai, traduções en_US/es marcadas com TODO, CSS próprio criado sem pedido explícito (revisar).
Política de Fallback
Faltando nome, slots ou slot padrão: solicitar antes de gerar.
Coordenadas Maven do parent: inspecionar o pom.xml do módulo onde o layout será criado; nunca inventar.
icon.png: gerar placeholder e registrar como pendência manual.
Traduções en_US/es ausentes: usar PT como base e marcar # TODO i18n por chave.
CSS próprio sem pedido explícito: registrar como pendência a revisar (Style Guide é o padrão; CSS próprio é exceção sob pedido).
1---2name: fluig-scaffolding-layout3description: Gera o esqueleto de um Layout WCM do Fluig — a view FreeMarker (.ftl) que define as regiões/áreas onde os widgets são posicionados, usando o grid responsivo do Style Guide. Use quando o desenvolvedor pedir para criar/iniciar um novo layout (template de página) do Fluig a partir de um nome ou propósito.4---56# Scaffolding de Layout (WCM)78Esta skill gera o esqueleto de um Layout WCM do Fluig; ela **não duplica** convenções — os arquivos de `context/` são a fonte de verdade, referenciada abaixo.910## Objetivo1112Produzir, com responsabilidade única, o **esqueleto de um Layout WCM** do Fluig na **estrutura oficial de pastas/arquivos**: o descritor `application.info` (`application.type=layout`), a view FreeMarker (`layout.ftl`) que reproduz a **estrutura HTML rígida de portal** e declara os **slots/regiões** onde os widgets são encaixados, e os arquivos `.properties` de i18n.1314## Quando Usar1516- Ao criar um **novo layout** (template de página) do Fluig a partir do zero.17- Quando o desenvolvedor fornece um nome/propósito e quer um ponto de partida correto (view com regiões) seguindo as convenções oficiais.18- Quando é preciso garantir, desde o início, uso do grid do Style Guide, i18n nos textos visíveis e ausência de cores fixas.1920## Diferenças Críticas em Relação a um Widget2122Layout e widget compartilham a estrutura WAR, mas o descritor e a view diferem.23Atenção a estes pontos para não confundir os dois:2425| Item | Widget | Layout |26|------|--------|--------|27| `application.type` | `widget` | `layout` |28| Template principal | `view.file=view.ftl` | `layout.file=layout.ftl` |29| Slot padrão | — | `layout.defaultSlot=<Slot>` (obrigatório) |30| Slots pré-configurados | — | `slot.<Nome>=<código-widget>` (opcional) |31| Flag no construtor | `application.uiwidget` | `application.uilayout` |32| Responsivo | — | `application.responsiveLayout=true` |33| Renderização da área | conteúdo próprio | `<@wcm.renderSlot id="..." />` por slot |3435## Entradas Esperadas3637| Entrada | Descrição | Obrigatória |38|---------|-----------|-------------|39| Nome do layout | Identificador em Inglês do layout (ex.: `PortalTwoColumns`) | sim |40| Propósito/estrutura | Quantas regiões/colunas e como o conteúdo se distribui | não |41| Chaves i18n | Chaves de tradução para títulos/textos visíveis do layout | não |4243## Contexto de Referência (Fonte de Verdade)4445Leia antes de executar — não reproduza o conteúdo aqui:4647- [architecture.md](../../context/architecture.md) — modelo conceitual do **Layout** (template de página que define slots/regiões para widgets; view FreeMarker renderizada no servidor) e a **estrutura oficial de pastas/arquivos** do layout (descritor `application.info`, `layout.ftl`, `.properties` de i18n).48- [style-guide.md](../../context/style-guide.md) — **grid responsivo** (`.container`/`.row`/`.col-*`), componentes e variáveis CSS de tema (`var(--fs-color-*)`) para estruturar a página.49- [conventions.md](../../context/conventions.md) — i18n (`${i18n.getTranslation('chave')}`) para textos visíveis e demais convenções públicas de código.5051## Estrutura de Saída5253O layout gerado segue a estrutura oficial (fonte de verdade em `architecture.md`).54O descritor `application.info` é **obrigatório** (com `application.type=layout`);55a `layout.ftl` declara os **slots/regiões**. Use `<code>` como o código do layout56(minúsculo).5758```text59<layout>/60├── pom.xml # quando o projeto usa Maven ou sob pedido61└── src/main/62 ├── resources/63 │ ├── application.info # descritor (application.type=layout)64 │ ├── <code>.properties # i18n base65 │ ├── <code>_pt_BR.properties # i18n pt-BR66 │ ├── <code>_en_US.properties # i18n en-US67 │ ├── <code>_es.properties # i18n es68 │ └── layout.ftl # view do layout (declara os slots)69 └── webapp/70 ├── WEB-INF/{web.xml, jboss-web.xml}71 └── resources/72 ├── css/responsive_layout.css # CSS padrão de responsividade (obrigatório)73 ├── css/<code>.css # CSS próprio do layout (opcional)74 └── images/icon.png # ícone75```7677> No `application.info`, declare `layout.file=layout.ftl` e `layout.defaultSlot`78> (slot padrão). Ponto de partida público: archetype Maven `layout-wcm`.79>80> **`responsive_layout.css` é padrão:** todo layout inclui um81> `responsive_layout.css` em `webapp/resources/css/`, que cuida da responsividade82> das regiões/slots (container queries + media queries; empilha colunas em telas83> estreitas, com fallback `.not-supports-container-queries`). O descritor declara84> **dois** recursos CSS, nesta ordem: `application.resource.css.1` aponta para a85> folha **global do Fluig** (`/portal/resources/css/wcm_responsive_layout.css`,86> caminho do portal) e `application.resource.css.2` para o `responsive_layout.css`87> padrão do layout. Um `<code>.css` próprio (opcional) entra como recurso88> adicional. Conteúdo de referência em `architecture.md`.89>90> A pasta `WEB-INF` traz `web.xml` e `jboss-web.xml` (com `context-root` =91> `/<application.code>`); o `pom.xml` aparece **quando o projeto usa Maven ou sob92> pedido**. Os blocos de referência desses arquivos vivem em `architecture.md`.93>94> **Em um projeto Fluig Studio**, o layout fica em `wcm/layout/<nome>` (ver a95> seção "Estrutura de um Projeto Fluig Studio" em `architecture.md`).9697### `pom.xml` (quando o projeto usa Maven ou sob pedido)9899Quando for necessário gerar o `pom.xml`, use a estrutura abaixo como ponto de100partida — ajustando `groupId`/`artifactId`/`version`/`name`/`description` ao101artefato. O empacotamento é `war` e o `finalName` usa `${project.artifactId}`. A102referência canônica completa está em `architecture.md`.103104```xml105<?xml version="1.0" encoding="UTF-8" standalone="no"?>106<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">107 <modelVersion>4.0.0</modelVersion>108 <groupId>com.fluig</groupId>109 <version>1.0.0</version>110 <artifactId>layout-<code></artifactId>111 <packaging>war</packaging>112 <name>Layout <Nome></name>113 <description>Layout <Nome></description>114 <build>115 <finalName>${project.artifactId}</finalName>116 </build>117</project>118```119120> Dentro de um projeto existente, inspecione o `pom.xml` do módulo pai para obter121> as coordenadas reais (parent `groupId`/`artifactId`); **nunca invente**122> coordenadas.123124## Regras Aplicáveis (Resumo Executivo)125126Somente o mínimo para orientar a geração; o detalhe está no contexto:127128- `application.code` **deve ser igual** a `locale.file.base.name` — divergência quebra a i18n (regra crítica) → ver `architecture.md`.129- O layout define a **estrutura visual** e as **regiões/áreas** onde os widgets são posicionados; ele não contém a lógica dos widgets → ver `architecture.md`.130- A `layout.ftl` segue uma **estrutura HTML rígida e obrigatória**: começa com `<#import "/wcm.ftl" as wcm/>` e `<#import "/layout-globals.ftl" as globals />`, e usa a hierarquia fixa `wcm-wrapper-content` → `wcm-all-content` → `wcm-content` → `${divMasterId!""}`. **Não altere** o wrapper, as classes estruturais nem a ordem dos blocos → ver "Estrutura HTML da `layout.ftl`" em `architecture.md`.131- **Não** coloque `fluig-style-guide` no wrapper raiz de um layout de portal — essa classe pertence ao escopo de widgets/telas standalone, não à moldura do portal → ver `architecture.md`.132- Reproduza os **blocos condicionais fixos**: pré-visualização (`pageRender.isPreviewMode()` → `@wcm.previewPageAlert`/`@wcm.deviceTogglePreview`), cabeçalho/menu fora da edição (`pageRender.isEditMode() != true` → `@wcm.header`/`@wcm.menu`), controles do construtor na edição (`@wcm.editHeader`/`@wcm.widgetsList`) e footer fora do tema responsivo (`fluigThemeCode != "responsive_theme"` → `@wcm.footer`) → ver `architecture.md`.133- **A liberdade está nos slots**, dentro de `${divMasterId!""}`: cada região é um `<div class="editable-slot slotfull <grid>" id="slotFullN">` com `<@wcm.renderSlot id="SlotX" editableSlot="true" isResponsiveSlot="true" />`. O identificador do slot padrão deve casar com `layout.defaultSlot` do `application.info` → ver `architecture.md`.134- Para o **grid das regiões**, use as classes de layout do contêiner-mestre (`layout-1-1`, `layout-1-2left`/`layout-1-2right`, `layout-1-3`, agrupamentos `all-slots-left`/`all-slots-right`), não posicionamento fixo → ver `architecture.md`.135- Todo texto visível via i18n: `${i18n.getTranslation('chave')}`; nunca strings fixas → ver `conventions.md`.136- Inclua o **`responsive_layout.css` padrão** em `webapp/resources/css/` (responsividade das regiões/slots) e declare os dois CSS no descritor na ordem: `application.resource.css.1` = folha global do Fluig (`/portal/resources/css/wcm_responsive_layout.css`) e `application.resource.css.2` = `/resources/css/responsive_layout.css`. Distintos do `<code>.css` próprio → ver `architecture.md`.137- Sem CSS com **hexadecimais fixos** para cores de tema; use `var(--fs-color-*)` → ver `style-guide.md`.138- **Minimizar CSS próprio; priorizar os componentes do Style Guide**; CSS próprio só sob pedido explícito (o CSS do layout permanece opcional) → ver `style-guide.md`/`conventions.md`.139140> **Layout standalone (exceção):** quando o layout **não** se integra à moldura do portal (ex.: telas "boards" com `navbar` própria), usa-se um wrapper raiz `<div class="fluig-style-guide ...">` sem `@wcm.header`/`@wcm.menu`/`@wcm.footer` e sem a hierarquia `wcm-wrapper-content`. Use esse formato apenas nesse caso; o padrão é a estrutura rígida de portal.141142## Procedimento1431441. Definir o nome do layout (em Inglês) e o `<code>` (minúsculo) a partir da entrada, e identificar as regiões/slots necessários e o arranjo do grid (ex.: largura total, duas colunas, lateral + conteúdo).1452. Criar a estrutura de pastas oficial (ver "Estrutura de Saída") e o descritor **`application.info`** com `application.type=layout`, `application.renderer=freemarker`, `layout.file=layout.ftl`, `layout.defaultSlot` e os **campos completos** do layout (incl. `application.fluig.version`, `application.category`, `application.newBuilder`, `application.responsiveLayout`, `application.icon`, recursos `css.N` e `developer.url`) — ver a tabela completa em `architecture.md`.1463. Montar a **view `layout.ftl`** (em `src/main/resources/`) **reproduzindo o esqueleto rígido** da seção "Estrutura HTML da `layout.ftl`" em `architecture.md`: os dois imports (`/wcm.ftl` e `/layout-globals.ftl`), o bloco de preview, o wrapper `wcm-wrapper-content` → `wcm-all-content` → `wcm-content` → `${divMasterId!""}` e os blocos condicionais de edição. **Não** adicione `fluig-style-guide` ao wrapper raiz de portal.1474. **Posicionar os slots** dentro de `${divMasterId!""}`: para cada região, um `<div class="editable-slot slotfull <grid>" id="slotFullN">` com `<@wcm.renderSlot id="SlotX" editableSlot="true" isResponsiveSlot="true" />`; garantir que o slot padrão case com `layout.defaultSlot`. Ajustar a classe de grid (`layout-1-1`, `layout-1-2left`/`right`, etc.) conforme o arranjo desejado.1485. Acrescentar o **footer** dentro do bloco `fluigThemeCode != "responsive_theme"` via `@wcm.footer` com o `layoutuserlabel` apropriado (chave de i18n).1496. Criar os arquivos **`.properties` de i18n** (base + `pt_BR`/`en_US`/`es`) e aplicar i18n em qualquer título ou texto visível do layout com `${i18n.getTranslation('chave')}`.1507. Criar o **`responsive_layout.css` padrão** em `webapp/resources/css/` (conteúdo de referência em `architecture.md`) e declarar os dois recursos CSS no descritor na ordem: `application.resource.css.1=/portal/resources/css/wcm_responsive_layout.css` (folha global do Fluig) e `application.resource.css.2=/resources/css/responsive_layout.css`. Se houver CSS próprio do layout (`<code>.css`), declará-lo como recurso adicional e usar `var(--fs-color-*)` para cores de tema (sem hexadecimais fixos).1518. Quando o projeto usa **Maven** (ou sob pedido), criar o `pom.xml` na raiz da estrutura (bloco de referência em `architecture.md`); inspecionar as coordenadas Maven (`groupId`, `artifactId` e o `parent`) no projeto existente e **nunca inventá-las**.1529. Validar o resultado com o checklist abaixo antes de entregar.153154## Saída Esperada155156Esqueleto de layout pronto para evoluir, na estrutura oficial, contendo:157158- O **descritor `application.info`** (`application.type=layout`) declarando `layout.file`, slot padrão e i18n.159- A **view `layout.ftl`** reproduzindo a **estrutura HTML rígida** (imports `/wcm.ftl` e `/layout-globals.ftl`, bloco de preview, hierarquia `wcm-wrapper-content` → `wcm-all-content` → `wcm-content` → `${divMasterId!""}`, blocos condicionais de edição e footer), com os **slots nomeados** renderizados por `@wcm.renderSlot` dentro do contêiner-mestre.160- Os arquivos **`.properties` de i18n** (base + locales) com as chaves de tradução.161- O **`responsive_layout.css` padrão** em `webapp/resources/css/`, declarado no descritor.162- (Opcional) CSS próprio do layout (`<code>.css`) com cores de tema por `var(--fs-color-*)` e os arquivos de empacotamento (`pom.xml`, `WEB-INF`).163164Tudo em conformidade com `context/architecture.md`, `context/style-guide.md` e `context/conventions.md`.165166## Exemplo de Uso167168Use `examples/layout/` como referência mínima da view `.ftl` de um layout que demonstra a **estrutura HTML rígida** de portal (imports, wrapper `wcm-wrapper-content`, blocos condicionais e slots renderizados por `@wcm.renderSlot`). Trate-o como trecho de referência, não como projeto completo.169170## Checklist de Validação171172- [ ] Estrutura oficial criada, com o descritor **`application.info`** (`application.type=layout`, `layout.file=layout.ftl`, `layout.defaultSlot`).173- [ ] `application.code` **igual** a `locale.file.base.name`.174- [ ] A `layout.ftl` começa com `<#import "/wcm.ftl" as wcm/>` e `<#import "/layout-globals.ftl" as globals />`.175- [ ] Wrapper raiz é `wcm-wrapper-content` com a hierarquia fixa `wcm-all-content` → `wcm-content` → `${divMasterId!""}` (sem `fluig-style-guide` no root, salvo layout standalone).176- [ ] Blocos condicionais presentes: preview (`isPreviewMode`), header/menu fora da edição, `@wcm.editHeader`/`@wcm.widgetsList` na edição e footer fora do tema responsivo.177- [ ] `layout.defaultSlot` está presente entre os slots declarados na `layout.ftl`.178- [ ] Cada slot é um `<div class="editable-slot slotfull <grid>" id="slotFullN">` com `<@wcm.renderSlot id="..." />` correspondente.179- [ ] Cada `slot.<Nome>=<widget>` (se houver) referencia um código de widget válido.180- [ ] Arquivos **`.properties` de i18n** (base + `pt_BR`/`en_US`/`es`).181- [ ] **`responsive_layout.css` padrão** presente em `webapp/resources/css/`; descritor declara `application.resource.css.1` = folha global do Fluig (`/portal/resources/css/wcm_responsive_layout.css`) e `application.resource.css.2` = `/resources/css/responsive_layout.css`.182- [ ] Grid das regiões via classes de layout (`layout-1-1`, `layout-1-2left`/`right`, `layout-1-3`), sem posicionamento/medidas fixas.183- [ ] Todo texto visível usa `${i18n.getTranslation('...')}` — sem strings fixas.184- [ ] Sem hexadecimais fixos para cores de tema (use `var(--fs-color-*)`).185- [ ] `WEB-INF` presente (`web.xml` + `jboss-web.xml`) com `context-root` = `/<application.code>`.186- [ ] CSS próprio mínimo (Style Guide como padrão); CSS próprio sem pedido explícito = **pendência a revisar**.187- [ ] Descritor de layout com **campos completos** (incl. `application.newBuilder`, `application.responsiveLayout`) — ver `architecture.md`.188- [ ] `pom.xml` presente **quando o projeto usa Maven ou sob pedido**.189190## Resumo da Geração191192Ao concluir, apresente um resumo curto:193194- **Layout / `application.code`:** nome e código.195- **Diretório:** onde o layout foi criado.196- **Slots:** lista de slots (com destaque para o slot padrão) e slots pré-configurados, se houver.197- **Arquivos gerados:** lista.198- **Pendências manuais:** ex.: `icon.png` real, coordenadas do `pom.xml` pai, traduções `en_US`/`es` marcadas com TODO, **CSS próprio criado sem pedido explícito (revisar)**.199200## Política de Fallback201202- Faltando **nome**, **slots** ou **slot padrão**: solicitar antes de gerar.203- **Coordenadas Maven** do parent: inspecionar o `pom.xml` do módulo onde o layout será criado; **nunca inventar**.204- **`icon.png`**: gerar placeholder e registrar como pendência manual.205- **Traduções `en_US`/`es` ausentes**: usar PT como base e marcar `# TODO i18n` por chave.206- **CSS próprio sem pedido explícito**: registrar como **pendência a revisar** (Style Guide é o padrão; CSS próprio é exceção sob pedido).
Run npx skillmds@latest add totvs/fluig-scaffolding-layout in your terminal (requires Node.js), paste this page's agent-chat prompt into Claude, Cursor, or any MCP-connected agent, or download the SKILL.md file and copy it into your agent's skills directory.
Gera o esqueleto de um Layout WCM do Fluig — a view FreeMarker (.ftl) que define as regiões/áreas onde os widgets são posicionados, usando o grid responsivo do Style Guide. Use quando o desenvolvedor pedir para criar/iniciar um novo layout (template de página) do Fluig a partir de um nome ou propósito. It is listed under Coding & Dev Tools on SkillMD.
This skill has not completed SkillMD's automated safety review yet. SkillMD never runs a skill's scripts for you; review the SKILL.md before installing.
This skill is tagged as working with Claude Code, Claude.ai, OpenAI Codex. SKILL.md is an open format, so most agents that read a skills directory can load it too.
Yes. Installing skills from SkillMD is free, and the skill stays under its author's original license.
totvs (@totvs) published this skill. Their other Agent Skills are listed on their SkillMD profile.