atualiza definições de skills e plugins do Claude com melhorias locais
This commit is contained in:
@@ -116,6 +116,18 @@ Mostra: "750 EUR + IVA" + "Investimento único · prazo 1-2 semanas"
|
||||
| Import de componentes SVG (`<Svg>`, `<Circle>`) | Crasha web worker do PDFDownloadLink | Implementar gráficos inline com `<View>` |
|
||||
| `Font.register` com fontes locais/CDN em multi-página | Falha silenciosa | Usar Helvetica/Helvetica-Bold (built-in) |
|
||||
| `href` vazio no PDFDownloadLink | PDF não gerou — verificar consola | Cache do browser — Ctrl+Shift+R |
|
||||
| `width: "100%"` em bars/elementos dentro de flex container | Não resolve — fica invisível | Usar `alignSelf: "stretch"` no elemento e no container pai |
|
||||
| Imagens com path absoluto (`/home/...`) | react-pdf não acede ao filesystem local | Colocar em `public/assets/` e referenciar como `"assets/foto.png"` (sem `/` inicial) |
|
||||
| `borderBottomWidth` no header + `borderTopWidth` em componente filho | Duplica a linha dourada visualmente | Usar apenas `borderTopWidth: 2` no próprio header; remover `borderBottom` |
|
||||
|
||||
**Hifenização:** Para desactivar em todo o PDF, adicionar ao `<Document>`:
|
||||
```jsx
|
||||
hyphenationCallback={(word) => [word]}
|
||||
```
|
||||
|
||||
**Ícones no PDF:** Usar `PDFIcons.jsx` (`src/pdf/sections/`) com `Svg/Path/Circle/Line/Polyline` de `@react-pdf/renderer`. NÃO importar lucide-react nos componentes PDF — crasha o worker.
|
||||
|
||||
**Ícones na web:** Usar `lucide-react`. Padrão: `FALLBACK_ICONS[i % FALLBACK_ICONS.length]` para rotação automática por índice quando o JSON não tem campo `icon`.
|
||||
|
||||
### 6. Página 360° (service360) — contextualizar
|
||||
|
||||
@@ -132,6 +144,64 @@ Se `service360` for `null`, a secção não aparece.
|
||||
|
||||
As condições estão numa página PDF separada (não na mesma que o roadmap) para evitar corte entre páginas. O componente `PDFWorkDone` retorna um Fragment com 2 Pages.
|
||||
|
||||
### 8. Apresentação 16:9 — PDFPresentation.jsx
|
||||
|
||||
Existe um segundo output PDF em formato 1920×1080 (slides), activado por um botão "Apresentação 16:9" no canto inferior direito da proposta web.
|
||||
|
||||
**Ficheiros envolvidos:**
|
||||
- `src/pdf/PDFPresentation.jsx` — documento completo com todos os slides
|
||||
- `src/pdf/sections/PDFSlide.jsx` — wrapper de slide (Page 1440×810pt, header com logo, rodapé com numeração)
|
||||
|
||||
**Dimensões:** 1920×1080 @ 72dpi → `[1440, 810]` em pontos (unidade do react-pdf).
|
||||
|
||||
**Estrutura de slides:**
|
||||
|
||||
| Slide | Componente | Dados |
|
||||
|-------|-----------|-------|
|
||||
| Capa | `SlideCover` | `data.title`, `client`, `date`, `company` |
|
||||
| Diagnóstico | `SlideProblem` | `context.description`, `context.diagnosis` |
|
||||
| Descomplicar 360° | `Slide360` | `educationSections` com `label:"Descomplicar 360°"` |
|
||||
| Educação | `SlideEducation` | restantes `educationSections` |
|
||||
| Soluções | `SlideService360` | `service360.areas` |
|
||||
| Previsão de leads | `SlideLeadForecast` | `leadForecast` |
|
||||
| Preços | `SlidePricing` | `plans` |
|
||||
| Roadmap | `SlideRoadmap` | `roadmap` |
|
||||
| Contacto | `SlideContact` | `company`, `client.contact` |
|
||||
|
||||
**Helper components internos (PDFPresentation.jsx):**
|
||||
- `GoldLine` — linha dourada decorativa
|
||||
- `Tag` — label uppercase dourado (fontSize 13)
|
||||
- `SlideTitle` — título principal do slide (fontSize 52 default)
|
||||
- `SlideBody` — corpo do slide (fontSize 19)
|
||||
- `Card` — caixa de conteúdo com border esquerda dourada (title 16, body 14)
|
||||
- `CardGrid` — wrapper flexWrap para cards
|
||||
|
||||
**Tamanhos de referência para legibilidade em sala:**
|
||||
- Tag: 13pt | SlideTitle: 42-58pt | SlideBody: 19pt
|
||||
- Card title: 16pt | Card body: 14pt
|
||||
- Cover logo: height 120 (3× maior que header normal)
|
||||
|
||||
**Separação Slide360 vs SlideEducation:**
|
||||
```jsx
|
||||
const slide360 = educationSections?.find(s => s.label?.toLowerCase().includes("360"))
|
||||
const otherSections = educationSections?.filter(s => !s.label?.toLowerCase().includes("360"))
|
||||
```
|
||||
|
||||
**Botão no App.jsx:**
|
||||
```jsx
|
||||
<PDFDownloadLink
|
||||
document={<PDFPresentation data={currentProposal} />}
|
||||
fileName={`apresentacao-descomplicar-${...}.pdf`}
|
||||
>
|
||||
{({ loading }) => <button>Apresentação 16:9</button>}
|
||||
</PDFDownloadLink>
|
||||
```
|
||||
|
||||
**PROIBIÇÕES específicas do 16:9:**
|
||||
- NÃO usar `gap` em `flexWrap` (mesmo bug do A4)
|
||||
- NÃO usar `rgba()` em `borderColor`
|
||||
- Manter `hyphenationCallback` no `<Document>` do PDFPresentation também
|
||||
|
||||
---
|
||||
|
||||
## Protocolo
|
||||
@@ -342,6 +412,7 @@ rm -f /tmp/propostas-dist.tar.gz
|
||||
|------|---------|------|------|
|
||||
| `ljm-360-61a8aecc` | A Loja da Maria | 360° (mensal) | 2026-03-20 |
|
||||
| `ccv-bookeo-a3f7c1d2` | Carvoeiro Caves | Migração técnica (único) | 2026-03-23 |
|
||||
| `pbk-autoridade-local-2026` | Equipa Sérgio Oliveira e Paula Barros · KW Portugal | SEO + conteúdo hiperlocal (mensal) | 2026-04-27 |
|
||||
|
||||
---
|
||||
|
||||
@@ -366,12 +437,26 @@ rm -f /tmp/propostas-dist.tar.gz
|
||||
- Checklist pré-build e teste PDF obrigatório
|
||||
- Condições comerciais em página PDF separada
|
||||
|
||||
### v2.2.0 (2026-04-27)
|
||||
- Formato 16:9 documentado: `PDFPresentation.jsx` + `PDFSlide.jsx`
|
||||
- Regra 8 adicionada: estrutura de slides, dimensões, helper components, tamanhos de referência
|
||||
- Separação Slide360 vs SlideEducation por label
|
||||
- Botão "Apresentação 16:9" no App.jsx documentado
|
||||
- Proibições específicas 16:9 adicionadas
|
||||
|
||||
### v2.1.0 (2026-04-27)
|
||||
- Novos bugs react-pdf documentados: `width:"100%"` em flex, paths absolutos em imagens, `borderBottom` duplicado
|
||||
- Hifenização: `hyphenationCallback` no `<Document>`
|
||||
- Padrão de ícones: `PDFIcons.jsx` para PDF, lucide-react para web, fallback por índice
|
||||
- Proposta `pbk-autoridade-local-2026` adicionada ao registo
|
||||
- Healing Log com 5 erros reais corrigidos
|
||||
|
||||
### v1.0.0 (2026-03-23)
|
||||
- Versão inicial
|
||||
|
||||
---
|
||||
|
||||
**Versão:** 2.0.0 | **Data:** 2026-03-23
|
||||
**Versão:** 2.2.0 | **Data:** 2026-04-27
|
||||
|
||||
---
|
||||
|
||||
@@ -380,7 +465,11 @@ rm -f /tmp/propostas-dist.tar.gz
|
||||
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
|
||||
|
||||
```jsonl
|
||||
{"date":"","issue":"","fix":"","source":"user|auto"}
|
||||
{"date":"2026-04-27","issue":"Barras de gráfico invisíveis no PDF","fix":"width:'100%' não funciona em flex containers — substituir por alignSelf:'stretch' no container e na barra","source":"user"}
|
||||
{"date":"2026-04-27","issue":"Linha dourada duplicada no topo das páginas","fix":"PDFPage tinha borderBottomWidth no header E os componentes filhos tinham borderTopWidth — remover borderBottom do header, manter apenas borderTopWidth:2","source":"user"}
|
||||
{"date":"2026-04-27","issue":"Foto do gestor de conta não aparece no PDF","fix":"react-pdf não carrega paths absolutos do filesystem — copiar para public/assets/ e referenciar sem / inicial","source":"user"}
|
||||
{"date":"2026-04-27","issue":"Border verde em vez de dourado no PDF","fix":"rgba() em borderColor renderiza verde — usar hex sólido (#D4A020)","source":"user"}
|
||||
{"date":"2026-04-27","issue":"Hifenização indesejada no PDF","fix":"Adicionar hyphenationCallback={(word) => [word]} ao <Document>","source":"user"}
|
||||
```
|
||||
|
||||
*Adicionar nova linha após cada erro corrigido.*
|
||||
|
||||
Reference in New Issue
Block a user