Gera o esqueleto de um Widget WCM do Fluig usando SuperWidget.extend (view FreeMarker + JS com init() e bindings), aplicando as convenções oficiais de customização. Use quando o desenvolvedor pedir para criar/iniciar um novo widget client-side do Fluig a partir de um nome ou descrição de propósito.
Esta skill gera o esqueleto de um Widget 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 Widget WCM do Fluig na estrutura oficial de pastas/arquivos: o descritor application.info, a view FreeMarker (view.ftl) com o elemento raiz correto, os arquivos .properties de i18n e o arquivo JavaScript com SuperWidget.extend, init() e bindings, já em conformidade com as convenções públicas e o Style Guide.
Quando Usar
Ao criar um novo widget client-side do Fluig a partir do zero.
Quando o desenvolvedor fornece um nome/propósito e quer um ponto de partida correto (view + JS) seguindo as convenções oficiais.
Quando é preciso garantir, desde o início, fluig-style-guide na raiz, uso correto de instanceId e bindings declarativos.
Entradas Esperadas
Entrada
Descrição
Obrigatória
Nome do widget
Identificador em Inglês (PascalCase) usado na classe e no id (ex.: Notifications)
sim
Propósito
O que o widget faz (orienta init, bindings e textos i18n)
não
Chaves i18n
Chaves de tradução para os textos visíveis
não
Contexto de Referência (Fonte de Verdade)
Leia antes de executar — não reproduza o conteúdo aqui:
conventions.md — convenções de Widget (fluig-style-guide, instanceId, .instance(), bindings local/global), i18n, segurança, CSS escopado e ES6+. Inclui também as convenções de Custom Elements (arquivos [name].[category].js, membros privados #, topo do módulo só com import, CSS escopado/agrupado por tag e variáveis CSS para números mágicos), aplicáveis quando o widget incorpora Web Components.
style-guide.md — componentes/helpers (FLUIGC), grid e variáveis CSS de tema (var(--fs-color-*)) para o markup e o estilo do widget.
architecture.md — modelo conceitual do Widget, seu ciclo de vida (init(), .instance(), bindings) e a estrutura oficial de pastas/arquivos do widget (descritor application.info, view.ftl, .properties de i18n, JS/CSS).
Estrutura de Saída
O widget gerado segue a estrutura oficial (fonte de verdade em architecture.md).
O descritor application.info é obrigatório — sem ele a plataforma não
reconhece o widget. Use <code> como o código do widget (minúsculo).
<widget>/
├── pom.xml # quando o projeto usa Maven ou sob pedido
└── src/main/
├── resources/
│ ├── application.info # descritor (application.type=widget)
│ ├── <code>.properties # i18n base (chaves de getTranslation)
│ ├── <code>_pt_BR.properties # i18n pt-BR
│ ├── <code>_en_US.properties # i18n en-US
│ ├── <code>_es.properties # i18n es
│ ├── view.ftl # view principal (elemento raiz)
│ └── edit.ftl # view de edição (pode ser vazia, mas é obrigatória)
└── webapp/
├── WEB-INF/{web.xml, jboss-web.xml}
└── resources/
├── css/<code>.css # CSS escopado (opcional)
├── images/icon.png # ícone
└── js/<code>.js # SuperWidget.extend
A view.ftl e a edit.ftl ficam em src/main/resources/; o <code>.js e o
<code>.css em src/main/webapp/resources/. O pom.xml só é gerado quando o
projeto usa Maven ou sob pedido. Ponto de partida público: archetype Maven
widget-wcm.
Em um projeto Fluig Studio, o widget fica em wcm/widget/<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.
Elemento raiz deve conter as 3 classes obrigatórias fixas: fluig-style-guide, super-widget e wcm-widget-class, além da classe específica do widget → ver conventions.md.
instanceIdsó em atributos id, com exatamente um_ como separador; na div raiz, a parte antes do _ em camelCase com inicial minúscula (ex.: id="myWidget_${instanceId}"); nunca mais de um _ na div raiz (a SuperWidget faz split por ele); proibido em data-* e class → ver conventions.md.
.instance() chamado seminstanceId (injetado pelo framework; no JS use this.instanceId) → ver conventions.md.
Bindings declarativos: chave sem o prefixo data-; local para elementos dentro da raiz, global para elementos fora (modais) → ver conventions.md.
Texto visível via i18n; nunca strings fixas nem acesso a i18n como objeto JS → ver conventions.md.
Variável raiz da SuperWidget declarada com var (ex.: var MyWidget = SuperWidget.extend({...})); o restante do JS em ES6+ (const/let, arrow functions, template literals) → ver conventions.md.
Minimizar CSS próprio; priorizar os componentes do Style Guide; CSS próprio só sob pedido explícito → ver style-guide.md/conventions.md.
CSS escopado à raiz, reutilizando o Style Guide; cores de tema via var(--fs-color-*), sem hexadecimais fixos → ver style-guide.md.
Consulta a datasets no cliente: quando o widget consulta datasets no lado cliente (via DatasetFactory), a view FreeMarker onde a consulta ocorre (view.ftl e/ou edit.ftl) deve obrigatoriamente importar a biblioteca vcXMLRPC.js, exatamente com <script src="/webdesk/vcXMLRPC.js" type="text/javascript"></script> (caminho e atributos inalterados). É uma exceção à regra de não importar scripts diretos no .ftl; inclua-o apenas quando houver consulta a datasets no cliente → ver conventions.md.
Política de fallback
Faltando nome ou propósito essencial para gerar (nome do widget): solicitar antes de gerar.
Coordenadas Maven (parent groupId/artifactId do pom.xml): quando dentro de um projeto existente, inspecionar o pom.xml do módulo onde o widget será criado; nunca inventar coordenadas.
icon.png: gerar um placeholder e registrar como pendência manual.
Traduções en_US/es ausentes: usar o texto PT como base e marcar # TODO i18n por chave, sem deixar de criar os 4 arquivos.
Dados do desenvolvedor (developer.*): usar placeholders genéricos; não assumir identificadores de terceiros.
CSS próprio sem pedido explícito: o padrão é reutilizar o Style Guide; se houver CSS próprio sem solicitação do desenvolvedor, registrar como pendência a revisar.
Procedimento
Definir o nome do widget (PascalCase) a partir da entrada e derivar a classe, o id raiz e o <code> (minúsculo) usado nos arquivos.
Criar a estrutura de pastas oficial (ver "Estrutura de Saída") e o descritor application.info com os campos completos: application.type=widget, application.renderer=freemarker, view.file=view.ftl, edit.file=edit.ftl, application.version=${build.version}-${build.revision}, os recursos CSS/JS e os dados do desenvolvedor (ver a tabela completa em architecture.md).
Criar a view de edição edit.ftl (em src/main/resources/, irmã da view.ftl); pode ser vazia, mas é obrigatória e referenciada por edit.file=edit.ftl.
Criar a view view.ftl (em src/main/resources/) com um elemento raiz contendo class="fluig-style-guide super-widget wcm-widget-class ...", id="<nomeWidget>_${instanceId}" (camelCase com inicial minúscula, exatamente um _) e data-params="<nomeWidget>.instance({})". As 3 classes obrigatórias fixas são: fluig-style-guide, super-widget e wcm-widget-class; a classe específica do widget é adicionada a seguir.5. Marcar os elementos interativos com atributos data-* (ex.: data-save) cujas chaves serão usadas nos bindings (sem o prefixo data-).
Criar os arquivos .properties de i18n (base + pt_BR/en_US/es) com as chaves usadas e aplicar i18n em todo texto visível via ${i18n.getTranslation('chave')}.
6a. Se o widget consultar datasets no cliente (via DatasetFactory), incluir na view onde a consulta ocorre (view.ftl e/ou edit.ftl) a importação obrigatória <script src="/webdesk/vcXMLRPC.js" type="text/javascript"></script>, exatamente nessa forma (ver conventions.md). Não incluir se o widget não consulta datasets.
Criar o arquivo JS (webapp/resources/js/<code>.js) com var <Nome> = SuperWidget.extend({ ... }) (a variável raiz usa var — exceção controlada; ver conventions.md), declarando init() (preparar estado, carregar dados, vincular comportamento) e bindings: { local: { ... }, global: { ... } }.
Implementar os métodos referenciados pelos bindings; dentro do JS, usar this.instanceId quando necessário.
Adicionar CSS escopado (webapp/resources/css/<code>.css) à classe raiz apenas se necessário (CSS próprio é exceção sob pedido explícito), reutilizando componentes/grid do Style Guide e variáveis var(--fs-color-*) para cores de tema.
Quando o projeto usa Maven ou sob pedido, gerar o pom.xml, inspecionando as coordenadas Maven no projeto existente (nunca inventar coordenadas do parent).
Validar o resultado com o checklist abaixo antes de entregar.
Saída Esperada
Esqueleto de widget pronto para evoluir, na estrutura oficial, contendo:
O descritor application.info (application.type=widget) declarando view, recursos e i18n.
A view view.ftl com elemento raiz fluig-style-guide, id com instanceId e data-params para instance().
Os arquivos .properties de i18n (base + locales) com as chaves de tradução.
O arquivo JavaScript do widget com SuperWidget.extend, init(), bindings e métodos correspondentes, em ES6+.
(Opcional) CSS escopado reutilizando o Style Guide e os arquivos de empacotamento (pom.xml, WEB-INF).
Tudo em conformidade com context/architecture.md, context/conventions.md e context/style-guide.md.
Exemplo de Uso
Use examples/widget/ como referência mínima (view .ftl + arquivo *.widget.js) que demonstra o elemento raiz fluig-style-guide, instance() sem instanceId, bindings e i18n. Trate-o como trecho de referência, não como projeto completo.
Checklist de Validação
Estrutura oficial criada, com o descritor application.info com os campos completos (application.type=widget, view.file=view.ftl, edit.file=edit.ftl, application.version=${build.version}-${build.revision}, recursos CSS/JS, developer.* — ver architecture.md).
application.codeigual a locale.file.base.name.
Presença da edit.ftl (irmã da view.ftl, pode ser vazia) e do campo edit.file=edit.ftl no descritor.
Arquivos .properties de i18n (base + pt_BR/en_US/es) com as mesmas chaves usadas na view/JS.
Presença da pasta WEB-INF (com web.xml + jboss-web.xml) e context-root = /<application.code> → ver architecture.md.
pom.xml presente quando o projeto usa Maven ou sob pedido (coordenadas inspecionadas, nunca inventadas).
Elemento raiz da view contém as 3 classes obrigatórias fixas: fluig-style-guide, super-widget e wcm-widget-class, além da classe específica do widget.
id da div raiz usa camelCase com inicial minúscula + exatamente um _ (ex.: myWidget_${instanceId}). Nunca mais de um _ na div raiz. Demais ids internos seguem o padrão do artefato.
.instance() é chamado sem instanceId.
Se o widget consulta datasets no cliente (via DatasetFactory), a view onde a consulta ocorre (view.ftl/edit.ftl) importa exatamente<script src="/webdesk/vcXMLRPC.js" type="text/javascript"></script>; se não consulta datasets, o script não está presente.
Bindings usam a chave sem o prefixo data- (escopo local/global correto).
Todo texto visível usa i18n — sem strings fixas.
JavaScript em ES6+ (const/let, arrow functions, template literals), exceto a variável raiz da SuperWidget (declarada com var).
CSS próprio mínimo (componentes do Style Guide como padrão; CSS próprio sem pedido explícito = pendência a revisar) e, quando houver, escopado à raiz, sem hexadecimais fixos (cores via var(--fs-color-*)).
Resumo da Geração
Ao concluir, apresente um resumo curto do que foi gerado, para o desenvolvedor
saber o estado e os próximos passos:
Widget / application.code: nome e código.
Diretório: onde o widget foi criado.
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 gerado sem pedido explícito (a revisar).
Próximo passo: implementar a lógica em <code>.js (ver as convenções em conventions.md).
1---2name: fluig-scaffolding-widget3description: Gera o esqueleto de um Widget WCM do Fluig usando SuperWidget.extend (view FreeMarker + JS com init() e bindings), aplicando as convenções oficiais de customização. Use quando o desenvolvedor pedir para criar/iniciar um novo widget client-side do Fluig a partir de um nome ou descrição de propósito.4---56# Scaffolding de Widget (SuperWidget)78Esta skill gera o esqueleto de um Widget 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 Widget WCM** do Fluig na **estrutura oficial de pastas/arquivos**: o descritor `application.info`, a view FreeMarker (`view.ftl`) com o elemento raiz correto, os arquivos `.properties` de i18n e o arquivo JavaScript com `SuperWidget.extend`, `init()` e `bindings`, já em conformidade com as convenções públicas e o Style Guide.1314## Quando Usar1516- Ao criar um **novo widget** client-side do Fluig a partir do zero.17- Quando o desenvolvedor fornece um nome/propósito e quer um ponto de partida correto (view + JS) seguindo as convenções oficiais.18- Quando é preciso garantir, desde o início, `fluig-style-guide` na raiz, uso correto de `instanceId` e bindings declarativos.1920## Entradas Esperadas2122| Entrada | Descrição | Obrigatória |23|---------|-----------|-------------|24| Nome do widget | Identificador em Inglês (PascalCase) usado na classe e no `id` (ex.: `Notifications`) | sim |25| Propósito | O que o widget faz (orienta init, bindings e textos i18n) | não |26| Chaves i18n | Chaves de tradução para os textos visíveis | não |2728## Contexto de Referência (Fonte de Verdade)2930Leia antes de executar — não reproduza o conteúdo aqui:3132- [conventions.md](../../context/conventions.md) — convenções de Widget (`fluig-style-guide`, `instanceId`, `.instance()`, bindings local/global), i18n, segurança, CSS escopado e ES6+. Inclui também as **convenções de Custom Elements** (arquivos `[name].[category].js`, membros privados `#`, topo do módulo só com `import`, CSS escopado/agrupado por tag e variáveis CSS para números mágicos), aplicáveis quando o widget incorpora Web Components.33- [style-guide.md](../../context/style-guide.md) — componentes/helpers (`FLUIGC`), grid e variáveis CSS de tema (`var(--fs-color-*)`) para o markup e o estilo do widget.34- [architecture.md](../../context/architecture.md) — modelo conceitual do Widget, seu ciclo de vida (`init()`, `.instance()`, bindings) e a **estrutura oficial de pastas/arquivos** do widget (descritor `application.info`, `view.ftl`, `.properties` de i18n, JS/CSS).3536## Estrutura de Saída3738O widget gerado segue a estrutura oficial (fonte de verdade em `architecture.md`).39O descritor `application.info` é **obrigatório** — sem ele a plataforma não40reconhece o widget. Use `<code>` como o código do widget (minúsculo).4142```text43<widget>/44├── pom.xml # quando o projeto usa Maven ou sob pedido45└── src/main/46 ├── resources/47 │ ├── application.info # descritor (application.type=widget)48 │ ├── <code>.properties # i18n base (chaves de getTranslation)49 │ ├── <code>_pt_BR.properties # i18n pt-BR50 │ ├── <code>_en_US.properties # i18n en-US51 │ ├── <code>_es.properties # i18n es52 │ ├── view.ftl # view principal (elemento raiz)53 │ └── edit.ftl # view de edição (pode ser vazia, mas é obrigatória)54 └── webapp/55 ├── WEB-INF/{web.xml, jboss-web.xml}56 └── resources/57 ├── css/<code>.css # CSS escopado (opcional)58 ├── images/icon.png # ícone59 └── js/<code>.js # SuperWidget.extend60```6162> A `view.ftl` e a `edit.ftl` ficam em `src/main/resources/`; o `<code>.js` e o63> `<code>.css` em `src/main/webapp/resources/`. O `pom.xml` só é gerado quando o64> projeto usa Maven ou sob pedido. Ponto de partida público: archetype Maven65> `widget-wcm`.66>67> **Em um projeto Fluig Studio**, o widget fica em `wcm/widget/<nome>` (ver a68> seção "Estrutura de um Projeto Fluig Studio" em `architecture.md`).6970### `pom.xml` (quando o projeto usa Maven ou sob pedido)7172Quando for necessário gerar o `pom.xml`, use a estrutura abaixo como ponto de73partida — ajustando `groupId`/`artifactId`/`version`/`name`/`description` ao74artefato. O empacotamento é `war` e o `finalName` usa `${project.artifactId}`. A75referência canônica completa está em `architecture.md`.7677```xml78<?xml version="1.0" encoding="UTF-8" standalone="no"?>79<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">80 <modelVersion>4.0.0</modelVersion>81 <groupId>com.fluig</groupId>82 <version>1.0.0</version>83 <artifactId>widget-<code></artifactId>84 <packaging>war</packaging>85 <name>Widget <Nome></name>86 <description>Widget <Nome></description>87 <build>88 <finalName>${project.artifactId}</finalName>89 </build>90</project>91```9293> Dentro de um projeto existente, inspecione o `pom.xml` do módulo pai para obter94> as coordenadas reais (parent `groupId`/`artifactId`); **nunca invente**95> coordenadas.9697## Regras Aplicáveis (Resumo Executivo)9899Somente o mínimo para orientar a geração; o detalhe está no contexto:100101- `application.code` **deve ser igual** a `locale.file.base.name` — divergência quebra a i18n (regra crítica) → ver `architecture.md`.102- Elemento raiz **deve** conter as 3 classes obrigatórias fixas: `fluig-style-guide`, `super-widget` e `wcm-widget-class`, além da classe específica do widget → ver `conventions.md`.103- `instanceId` **só** em atributos `id`, com **exatamente um** `_` como separador; **na `div` raiz**, a parte antes do `_` em **camelCase com inicial minúscula** (ex.: `id="myWidget_${instanceId}"`); nunca mais de um `_` na div raiz (a SuperWidget faz split por ele); proibido em `data-*` e `class` → ver `conventions.md`.104- `.instance()` chamado **sem** `instanceId` (injetado pelo framework; no JS use `this.instanceId`) → ver `conventions.md`.105- Bindings declarativos: chave sem o prefixo `data-`; `local` para elementos dentro da raiz, `global` para elementos fora (modais) → ver `conventions.md`.106- Texto visível via i18n; nunca strings fixas nem acesso a `i18n` como objeto JS → ver `conventions.md`.107- Variável raiz da SuperWidget declarada com `var` (ex.: `var MyWidget = SuperWidget.extend({...})`); o restante do JS em ES6+ (`const`/`let`, arrow functions, template literals) → ver `conventions.md`.108- Minimizar CSS próprio; priorizar os componentes do Style Guide; CSS próprio só sob pedido explícito → ver `style-guide.md`/`conventions.md`.109- CSS **escopado** à raiz, reutilizando o Style Guide; cores de tema via `var(--fs-color-*)`, sem hexadecimais fixos → ver `style-guide.md`.110- **Consulta a datasets no cliente:** quando o widget consulta datasets no lado cliente (via `DatasetFactory`), a view FreeMarker onde a consulta ocorre (`view.ftl` e/ou `edit.ftl`) **deve obrigatoriamente** importar a biblioteca `vcXMLRPC.js`, **exatamente** com `<script src="/webdesk/vcXMLRPC.js" type="text/javascript"></script>` (caminho e atributos inalterados). É uma **exceção** à regra de não importar scripts diretos no `.ftl`; inclua-o **apenas** quando houver consulta a datasets no cliente → ver `conventions.md`.111112### Política de fallback113114- Faltando **nome** ou **propósito** essencial para gerar (nome do widget): solicitar antes de gerar.115- **Coordenadas Maven** (parent `groupId`/`artifactId` do `pom.xml`): quando dentro de um projeto existente, inspecionar o `pom.xml` do módulo onde o widget será criado; **nunca inventar** coordenadas.116- **`icon.png`**: gerar um placeholder e registrar como pendência manual.117- **Traduções `en_US`/`es` ausentes**: usar o texto PT como base e marcar `# TODO i18n` por chave, sem deixar de criar os 4 arquivos.118- Dados do desenvolvedor (`developer.*`): usar placeholders genéricos; não assumir identificadores de terceiros.119- **CSS próprio sem pedido explícito:** o padrão é reutilizar o Style Guide; se houver CSS próprio sem solicitação do desenvolvedor, registrar como **pendência a revisar**.120121## Procedimento1221231. Definir o nome do widget (PascalCase) a partir da entrada e derivar a classe, o `id` raiz e o `<code>` (minúsculo) usado nos arquivos.1242. Criar a estrutura de pastas oficial (ver "Estrutura de Saída") e o descritor **`application.info`** com os campos completos: `application.type=widget`, `application.renderer=freemarker`, `view.file=view.ftl`, `edit.file=edit.ftl`, `application.version=${build.version}-${build.revision}`, os recursos CSS/JS e os dados do desenvolvedor (ver a tabela completa em `architecture.md`).1253. Criar a **view de edição `edit.ftl`** (em `src/main/resources/`, irmã da `view.ftl`); pode ser vazia, mas é obrigatória e referenciada por `edit.file=edit.ftl`.1264. Criar a **view `view.ftl`** (em `src/main/resources/`) com um elemento raiz contendo `class="fluig-style-guide super-widget wcm-widget-class ..."`, `id="<nomeWidget>_${instanceId}"` (camelCase com inicial minúscula, exatamente um `_`) e `data-params="<nomeWidget>.instance({})"`. As 3 classes obrigatórias fixas são: `fluig-style-guide`, `super-widget` e `wcm-widget-class`; a classe específica do widget é adicionada a seguir.5. Marcar os elementos interativos com atributos `data-*` (ex.: `data-save`) cujas chaves serão usadas nos bindings (sem o prefixo `data-`).1276. Criar os arquivos **`.properties` de i18n** (base + `pt_BR`/`en_US`/`es`) com as chaves usadas e aplicar i18n em todo texto visível via `${i18n.getTranslation('chave')}`.1286a. **Se o widget consultar datasets no cliente** (via `DatasetFactory`), incluir na view onde a consulta ocorre (`view.ftl` e/ou `edit.ftl`) a importação obrigatória `<script src="/webdesk/vcXMLRPC.js" type="text/javascript"></script>`, exatamente nessa forma (ver `conventions.md`). Não incluir se o widget não consulta datasets.1297. Criar o **arquivo JS** (`webapp/resources/js/<code>.js`) com `var <Nome> = SuperWidget.extend({ ... })` (a variável raiz usa `var` — exceção controlada; ver `conventions.md`), declarando `init()` (preparar estado, carregar dados, vincular comportamento) e `bindings: { local: { ... }, global: { ... } }`.1308. Implementar os métodos referenciados pelos bindings; dentro do JS, usar `this.instanceId` quando necessário.1319. Adicionar CSS **escopado** (`webapp/resources/css/<code>.css`) à classe raiz **apenas se necessário** (CSS próprio é exceção sob pedido explícito), reutilizando componentes/grid do Style Guide e variáveis `var(--fs-color-*)` para cores de tema.13210. Quando o projeto usa Maven ou sob pedido, gerar o `pom.xml`, inspecionando as coordenadas Maven no projeto existente (**nunca inventar** coordenadas do parent).13311. Validar o resultado com o checklist abaixo antes de entregar.134135## Saída Esperada136137Esqueleto de widget pronto para evoluir, na estrutura oficial, contendo:138139- O **descritor `application.info`** (`application.type=widget`) declarando view, recursos e i18n.140- A **view `view.ftl`** com elemento raiz `fluig-style-guide`, `id` com `instanceId` e `data-params` para `instance()`.141- Os arquivos **`.properties` de i18n** (base + locales) com as chaves de tradução.142- O **arquivo JavaScript** do widget com `SuperWidget.extend`, `init()`, `bindings` e métodos correspondentes, em ES6+.143- (Opcional) CSS escopado reutilizando o Style Guide e os arquivos de empacotamento (`pom.xml`, `WEB-INF`).144145Tudo em conformidade com `context/architecture.md`, `context/conventions.md` e `context/style-guide.md`.146147## Exemplo de Uso148149Use `examples/widget/` como referência mínima (view `.ftl` + arquivo `*.widget.js`) que demonstra o elemento raiz `fluig-style-guide`, `instance()` sem `instanceId`, bindings e i18n. Trate-o como trecho de referência, não como projeto completo.150151## Checklist de Validação152153- [ ] Estrutura oficial criada, com o descritor **`application.info`** com os campos completos (`application.type=widget`, `view.file=view.ftl`, `edit.file=edit.ftl`, `application.version=${build.version}-${build.revision}`, recursos CSS/JS, `developer.*` — ver `architecture.md`).154- [ ] `application.code` **igual** a `locale.file.base.name`.155- [ ] Presença da `edit.ftl` (irmã da `view.ftl`, pode ser vazia) e do campo `edit.file=edit.ftl` no descritor.156- [ ] Arquivos **`.properties` de i18n** (base + `pt_BR`/`en_US`/`es`) com as mesmas chaves usadas na view/JS.157- [ ] Presença da pasta `WEB-INF` (com `web.xml` + `jboss-web.xml`) e `context-root` = `/<application.code>` → ver `architecture.md`.158- [ ] `pom.xml` presente quando o projeto usa Maven ou sob pedido (coordenadas inspecionadas, nunca inventadas).159- [ ] Elemento raiz da view contém as **3 classes obrigatórias fixas**: `fluig-style-guide`, `super-widget` e `wcm-widget-class`, além da classe específica do widget.160- [ ] `id` da **div raiz** usa camelCase com inicial minúscula + exatamente um `_` (ex.: `myWidget_${instanceId}`). Nunca mais de um `_` na div raiz. Demais `id`s internos seguem o padrão do artefato.161- [ ] `.instance()` é chamado sem `instanceId`.162- [ ] Se o widget consulta datasets no cliente (via `DatasetFactory`), a view onde a consulta ocorre (`view.ftl`/`edit.ftl`) importa **exatamente** `<script src="/webdesk/vcXMLRPC.js" type="text/javascript"></script>`; se não consulta datasets, o script **não** está presente.163- [ ] Bindings usam a chave sem o prefixo `data-` (escopo local/global correto).164- [ ] Todo texto visível usa i18n — sem strings fixas.165- [ ] JavaScript em ES6+ (`const`/`let`, arrow functions, template literals), **exceto a variável raiz da SuperWidget** (declarada com `var`).166- [ ] CSS próprio mínimo (componentes do Style Guide como padrão; CSS próprio sem pedido explícito = pendência a revisar) e, quando houver, escopado à raiz, sem hexadecimais fixos (cores via `var(--fs-color-*)`).167168## Resumo da Geração169170Ao concluir, apresente um resumo curto do que foi gerado, para o desenvolvedor171saber o estado e os próximos passos:172173- **Widget / `application.code`:** nome e código.174- **Diretório:** onde o widget foi criado.175- **Arquivos gerados:** lista.176- **Pendências manuais:** ex.: `icon.png` real, coordenadas do `pom.xml` pai, traduções `en_US`/`es` marcadas com TODO, CSS próprio gerado sem pedido explícito (a revisar).177- **Próximo passo:** implementar a lógica em `<code>.js` (ver as convenções em `conventions.md`).
Run npx skillmds@latest add totvs/fluig-scaffolding-widget 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 Widget WCM do Fluig usando SuperWidget.extend (view FreeMarker + JS com init() e bindings), aplicando as convenções oficiais de customização. Use quando o desenvolvedor pedir para criar/iniciar um novo widget client-side do Fluig a partir de um nome ou descrição de 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.