Initial commit DBMaker - Oficiais e Funcionando
This commit is contained in:
BIN
estrutura_visual/databook-template.zip
Normal file
BIN
estrutura_visual/databook-template.zip
Normal file
Binary file not shown.
512
estrutura_visual/databook-template/app.js
Normal file
512
estrutura_visual/databook-template/app.js
Normal file
@@ -0,0 +1,512 @@
|
||||
// Application State
|
||||
const state = {
|
||||
currentTemplate: 'cover',
|
||||
settings: {
|
||||
primaryColor: '#1a365d',
|
||||
secondaryColor: '#2b6cb0',
|
||||
projectTitle: 'BUZIOS 7 PRODUCTION SYSTEM DEVELOPMENT',
|
||||
projectSubtitle: 'AR HEAD FABRICATION LONG',
|
||||
clientName: 'SAIPEM',
|
||||
documentNumber: 'DB-B97-01_S1_VENDOR_DATABOOK',
|
||||
contractNumber: 'OC 1472739',
|
||||
supplierName: 'ENGEMETAL',
|
||||
language: 'both',
|
||||
date: '2024'
|
||||
},
|
||||
indexData: [
|
||||
{ number: '1', title_pt: 'Identificação', title_en: 'Identification', level: 1, page: '1' },
|
||||
{ number: '2', title_pt: 'Materiais', title_en: 'Materials', level: 1, page: '5' },
|
||||
{ number: '2.1', title_pt: 'Certificados das matérias-primas', title_en: 'Raw materials certificates', level: 2, page: '6' },
|
||||
{ number: '2.2', title_pt: 'Consumíveis de soldagem', title_en: 'Welding consumables', level: 2, page: '15' },
|
||||
{ number: '3', title_pt: 'Procedimentos de Soldagem', title_en: 'Welding Procedures', level: 1, page: '20' },
|
||||
{ number: '3.1', title_pt: 'Especificação do Procedimento de Soldagem (EPS)', title_en: 'Welding Procedure Specification (WPS)', level: 2, page: '21' },
|
||||
{ number: '3.2', title_pt: 'Registros de Qualificação (RQPS)', title_en: 'Procedure Qualification Records (WPQR)', level: 2, page: '35' },
|
||||
{ number: '3.3', title_pt: 'Registros de Soldadores (RQS)', title_en: 'Welder Qualification Records (WQR)', level: 2, page: '50' },
|
||||
{ number: '4', title_pt: 'Inspeção e Testes', title_en: 'Inspection and Testing', level: 1, page: '65' },
|
||||
{ number: '4.1', title_pt: 'Plano de Inspeção e Testes (PIT)', title_en: 'Inspection and Testing Plan (ITP)', level: 2, page: '66' },
|
||||
{ number: '4.2', title_pt: 'Ensaios Não Destrutivos (NDT)', title_en: 'Non-Destructive Testing (NDT)', level: 2, page: '75' },
|
||||
{ number: '4.3', title_pt: 'Relatórios de Inspeção Dimensional', title_en: 'Dimensional Inspection Reports', level: 2, page: '90' },
|
||||
{ number: '4.4', title_pt: 'Relatórios de Inspeção de Pintura', title_en: 'Painting Inspection Reports', level: 2, page: '105' },
|
||||
{ number: '8', title_pt: 'Certificados de Conformidade do Produto', title_en: 'Product Conformity Certificates', level: 1, page: '120' },
|
||||
{ number: '8.1', title_pt: 'Inspection Release Notice (IRN)', title_en: 'Inspection Release Notice (IRN)', level: 2, page: '121' }
|
||||
],
|
||||
sectionIcons: {
|
||||
'1': '📋',
|
||||
'2': '🔩',
|
||||
'3': '⚡',
|
||||
'4': '🔍',
|
||||
'8': '✅'
|
||||
}
|
||||
};
|
||||
|
||||
// Template Generators
|
||||
const templates = {
|
||||
cover: () => `
|
||||
<div class="template-page cover-template">
|
||||
<div class="cover-logo-top">Logo Cliente</div>
|
||||
<div class="cover-content">
|
||||
<h1 class="cover-title">${state.settings.projectTitle}</h1>
|
||||
<h2 class="cover-subtitle">${state.settings.projectSubtitle}</h2>
|
||||
<div class="cover-divider"></div>
|
||||
<div class="cover-document-info">
|
||||
<div class="cover-document-number">${state.settings.documentNumber}</div>
|
||||
<div class="cover-contract">Contrato: ${state.settings.contractNumber}</div>
|
||||
<div class="cover-date">Cliente: ${state.settings.clientName}</div>
|
||||
<div class="cover-date">${state.settings.date}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="cover-logo-bottom">Logo ${state.settings.supplierName}</div>
|
||||
</div>
|
||||
`,
|
||||
|
||||
index: () => {
|
||||
const renderIndexItems = () => {
|
||||
return state.indexData.map(item => {
|
||||
const titleText = state.settings.language === 'en' ? item.title_en :
|
||||
state.settings.language === 'pt' ? item.title_pt :
|
||||
`${item.title_pt} / ${item.title_en}`;
|
||||
|
||||
return `
|
||||
<li class="index-item level-${item.level}">
|
||||
<span class="index-number">${item.number}</span>
|
||||
<span class="index-title-text">${titleText}</span>
|
||||
<span class="index-page">${item.page}</span>
|
||||
</li>
|
||||
`;
|
||||
}).join('');
|
||||
};
|
||||
|
||||
return `
|
||||
<div class="template-page index-template">
|
||||
<h1 class="index-title">ÍNDICE / TABLE OF CONTENTS</h1>
|
||||
<div class="index-divider"></div>
|
||||
<ul class="index-list">
|
||||
${renderIndexItems()}
|
||||
</ul>
|
||||
</div>
|
||||
`;
|
||||
},
|
||||
|
||||
'divider-minimal': () => {
|
||||
const sectionNumber = '2';
|
||||
const titlePt = 'Materiais';
|
||||
const titleEn = 'Materials';
|
||||
const icon = state.sectionIcons[sectionNumber] || '📑';
|
||||
|
||||
const title = state.settings.language === 'en' ? titleEn :
|
||||
state.settings.language === 'pt' ? titlePt :
|
||||
titlePt;
|
||||
const subtitle = state.settings.language === 'both' ? titleEn : '';
|
||||
|
||||
return `
|
||||
<div class="template-page divider-minimal">
|
||||
<div class="divider-watermark">${sectionNumber}</div>
|
||||
<div class="divider-content">
|
||||
<div class="divider-number">${icon} Seção ${sectionNumber}</div>
|
||||
<h1 class="divider-title">${title}</h1>
|
||||
${subtitle ? `<p class="divider-subtitle">${subtitle}</p>` : ''}
|
||||
<div class="divider-line"></div>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
},
|
||||
|
||||
'divider-lateral': () => {
|
||||
const sectionNumber = '3';
|
||||
const titlePt = 'Procedimentos de Soldagem';
|
||||
const titleEn = 'Welding Procedures';
|
||||
|
||||
const title = state.settings.language === 'en' ? titleEn :
|
||||
state.settings.language === 'pt' ? titlePt :
|
||||
titlePt;
|
||||
const subtitle = state.settings.language === 'both' ? titleEn : '';
|
||||
|
||||
return `
|
||||
<div class="template-page divider-lateral">
|
||||
<div class="divider-sidebar">${sectionNumber}</div>
|
||||
<div class="divider-main-content">
|
||||
<h1 class="divider-main-title">${title}</h1>
|
||||
${subtitle ? `<p class="divider-main-subtitle">${subtitle}</p>` : ''}
|
||||
<div class="divider-footer">
|
||||
<div><strong>Projeto:</strong> ${state.settings.projectTitle}</div>
|
||||
<div><strong>Documento:</strong> ${state.settings.documentNumber}</div>
|
||||
<div><strong>Cliente:</strong> ${state.settings.clientName}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
},
|
||||
|
||||
'divider-corporate': () => {
|
||||
const sectionNumber = '4';
|
||||
const titlePt = 'Inspeção e Testes';
|
||||
const titleEn = 'Inspection and Testing';
|
||||
const icon = state.sectionIcons[sectionNumber] || '📑';
|
||||
|
||||
const title = state.settings.language === 'en' ? titleEn :
|
||||
state.settings.language === 'pt' ? titlePt :
|
||||
titlePt;
|
||||
|
||||
return `
|
||||
<div class="template-page divider-corporate">
|
||||
<div class="divider-corporate-header">
|
||||
<div class="divider-corporate-logo">Logo Cliente</div>
|
||||
</div>
|
||||
<div class="divider-corporate-content">
|
||||
<div class="divider-corporate-number">${icon} ${sectionNumber}</div>
|
||||
<h1 class="divider-corporate-title">${title}</h1>
|
||||
<div class="divider-info-box">
|
||||
<div class="divider-info-item">
|
||||
<span class="divider-info-label">Projeto:</span>
|
||||
<span class="divider-info-value">${state.settings.projectTitle.substring(0, 30)}...</span>
|
||||
</div>
|
||||
<div class="divider-info-item">
|
||||
<span class="divider-info-label">Cliente:</span>
|
||||
<span class="divider-info-value">${state.settings.clientName}</span>
|
||||
</div>
|
||||
<div class="divider-info-item">
|
||||
<span class="divider-info-label">Contrato:</span>
|
||||
<span class="divider-info-value">${state.settings.contractNumber}</span>
|
||||
</div>
|
||||
<div class="divider-info-item">
|
||||
<span class="divider-info-label">Documento:</span>
|
||||
<span class="divider-info-value">${state.settings.documentNumber}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
},
|
||||
|
||||
'headers-footers': () => `
|
||||
<div class="template-page header-footer-showcase">
|
||||
<h1 style="font-family: Roboto, sans-serif; font-size: 36px; color: var(--primary-color); margin-bottom: 2rem;">Cabeçalhos e Rodapés</h1>
|
||||
|
||||
<div class="hf-example">
|
||||
<div class="hf-label">Cabeçalho - Opção 1</div>
|
||||
<div class="page-header">
|
||||
<div class="page-header-logo">Logo</div>
|
||||
<div class="page-header-project">${state.settings.projectTitle.substring(0, 40)}...</div>
|
||||
<div class="page-header-doc">${state.settings.documentNumber}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="hf-example">
|
||||
<div class="hf-label">Cabeçalho - Opção 2</div>
|
||||
<div class="page-header" style="border-bottom: 1px solid var(--gray-light);">
|
||||
<div class="page-header-project" style="flex: 1;">${state.settings.clientName} - ${state.settings.projectTitle.substring(0, 35)}...</div>
|
||||
<div class="page-header-doc" style="background-color: var(--gray-light); padding: 0.5rem 1rem; border-radius: 4px;">${state.settings.documentNumber}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="hf-example">
|
||||
<div class="hf-label">Rodapé - Opção 1</div>
|
||||
<div class="page-footer">
|
||||
<div class="page-footer-left">Rev. 01 | ${state.settings.date}</div>
|
||||
<div class="page-footer-center">45</div>
|
||||
<div class="page-footer-right">${state.settings.supplierName}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="hf-example">
|
||||
<div class="hf-label">Rodapé - Opção 2</div>
|
||||
<div class="page-footer" style="background-color: rgba(26, 54, 93, 0.05);">
|
||||
<div class="page-footer-left">${state.settings.documentNumber}</div>
|
||||
<div class="page-footer-center" style="background-color: var(--primary-color); color: white; padding: 0.25rem 1rem; border-radius: 4px;">12</div>
|
||||
<div class="page-footer-right">Data: ${state.settings.date}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="hf-example">
|
||||
<div class="hf-label">Rodapé - Opção 3</div>
|
||||
<div class="page-footer" style="border-top: 3px solid var(--primary-color);">
|
||||
<div class="page-footer-left" style="display: flex; flex-direction: column;">
|
||||
<span style="font-weight: 600;">${state.settings.clientName}</span>
|
||||
<span>${state.settings.contractNumber}</span>
|
||||
</div>
|
||||
<div class="page-footer-center">8</div>
|
||||
<div class="page-footer-right" style="text-align: right;">
|
||||
<div style="font-weight: 600;">${state.settings.supplierName}</div>
|
||||
<div>${state.settings.date}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`,
|
||||
|
||||
'style-guide': () => `
|
||||
<div class="template-page style-guide">
|
||||
<h1 style="font-family: Roboto, sans-serif; font-size: 36px; color: var(--primary-color); margin-bottom: 2rem; text-align: center;">Guia de Estilo - Databook</h1>
|
||||
|
||||
<div class="sg-section">
|
||||
<h2 class="sg-section-title">Paleta de Cores</h2>
|
||||
<div class="color-palette">
|
||||
<div class="color-swatch">
|
||||
<div class="color-sample" style="background-color: ${state.settings.primaryColor};"></div>
|
||||
<div class="color-name">Primária</div>
|
||||
<div class="color-hex">${state.settings.primaryColor}</div>
|
||||
</div>
|
||||
<div class="color-swatch">
|
||||
<div class="color-sample" style="background-color: ${state.settings.secondaryColor};"></div>
|
||||
<div class="color-name">Secundária</div>
|
||||
<div class="color-hex">${state.settings.secondaryColor}</div>
|
||||
</div>
|
||||
<div class="color-swatch">
|
||||
<div class="color-sample" style="background-color: #4299e1;"></div>
|
||||
<div class="color-name">Accent</div>
|
||||
<div class="color-hex">#4299e1</div>
|
||||
</div>
|
||||
<div class="color-swatch">
|
||||
<div class="color-sample" style="background-color: #2d3748;"></div>
|
||||
<div class="color-name">Cinza Escuro</div>
|
||||
<div class="color-hex">#2d3748</div>
|
||||
</div>
|
||||
<div class="color-swatch">
|
||||
<div class="color-sample" style="background-color: #718096;"></div>
|
||||
<div class="color-name">Cinza Médio</div>
|
||||
<div class="color-hex">#718096</div>
|
||||
</div>
|
||||
<div class="color-swatch">
|
||||
<div class="color-sample" style="background-color: #e2e8f0;"></div>
|
||||
<div class="color-name">Cinza Claro</div>
|
||||
<div class="color-hex">#e2e8f0</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="sg-section">
|
||||
<h2 class="sg-section-title">Tipografia</h2>
|
||||
<div class="typography-examples">
|
||||
<div class="typo-example">
|
||||
<div class="typo-label">Título Principal (H1) - 60px Bold</div>
|
||||
<h1 style="font-family: Roboto, sans-serif; font-size: 60px; font-weight: 700; color: var(--primary-color);">Título Principal</h1>
|
||||
</div>
|
||||
<div class="typo-example">
|
||||
<div class="typo-label">Subtítulo (H2) - 36px Regular</div>
|
||||
<h2 style="font-family: Roboto, sans-serif; font-size: 36px; font-weight: 400; color: var(--gray-dark);">Subtítulo do Documento</h2>
|
||||
</div>
|
||||
<div class="typo-example">
|
||||
<div class="typo-label">Seção (H3) - 24px Bold</div>
|
||||
<h3 style="font-family: Roboto, sans-serif; font-size: 24px; font-weight: 700; color: var(--primary-color);">Título de Seção</h3>
|
||||
</div>
|
||||
<div class="typo-example">
|
||||
<div class="typo-label">Corpo de Texto - 14px Regular</div>
|
||||
<p style="font-family: Open Sans, sans-serif; font-size: 14px; font-weight: 400; color: var(--gray-dark);">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
|
||||
</div>
|
||||
<div class="typo-example">
|
||||
<div class="typo-label">Texto Secundário - 12px Regular</div>
|
||||
<p style="font-family: Open Sans, sans-serif; font-size: 12px; font-weight: 400; color: var(--gray-medium);">Texto secundário ou informações auxiliares</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="sg-section">
|
||||
<h2 class="sg-section-title">Espaçamentos</h2>
|
||||
<div class="spacing-grid">
|
||||
<div class="spacing-item">
|
||||
<div class="spacing-visual" style="width: 8px; height: 8px;"></div>
|
||||
<div class="spacing-label">8px - XS</div>
|
||||
</div>
|
||||
<div class="spacing-item">
|
||||
<div class="spacing-visual" style="width: 16px; height: 16px;"></div>
|
||||
<div class="spacing-label">16px - SM</div>
|
||||
</div>
|
||||
<div class="spacing-item">
|
||||
<div class="spacing-visual" style="width: 24px; height: 24px;"></div>
|
||||
<div class="spacing-label">24px - MD</div>
|
||||
</div>
|
||||
<div class="spacing-item">
|
||||
<div class="spacing-visual" style="width: 32px; height: 32px;"></div>
|
||||
<div class="spacing-label">32px - LG</div>
|
||||
</div>
|
||||
<div class="spacing-item">
|
||||
<div class="spacing-visual" style="width: 48px; height: 48px;"></div>
|
||||
<div class="spacing-label">48px - XL</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="sg-section">
|
||||
<h2 class="sg-section-title">Elementos</h2>
|
||||
<div style="display: flex; gap: 1rem; flex-wrap: wrap;">
|
||||
<button class="btn btn-primary">Botão Primário</button>
|
||||
<button class="btn btn-secondary">Botão Secundário</button>
|
||||
</div>
|
||||
<div style="margin-top: 1rem; padding: 1rem; background-color: rgba(26, 54, 93, 0.05); border-left: 4px solid var(--primary-color); border-radius: 8px;">
|
||||
<strong>Caixa de Informação</strong><br>
|
||||
Utilizada para destacar informações importantes no documento.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
};
|
||||
|
||||
// DOM Elements
|
||||
const navItems = document.querySelectorAll('.nav-item');
|
||||
const previewContainer = document.getElementById('previewContainer');
|
||||
const exportBtn = document.getElementById('exportBtn');
|
||||
const exportModal = document.getElementById('exportModal');
|
||||
const closeModal = document.getElementById('closeModal');
|
||||
const closeModalBtn = document.getElementById('closeModalBtn');
|
||||
const copyHtmlBtn = document.getElementById('copyHtmlBtn');
|
||||
const applyBtn = document.getElementById('applyBtn');
|
||||
const resetBtn = document.getElementById('resetBtn');
|
||||
|
||||
// Form inputs
|
||||
const primaryColorInput = document.getElementById('primaryColor');
|
||||
const secondaryColorInput = document.getElementById('secondaryColor');
|
||||
const projectTitleInput = document.getElementById('projectTitle');
|
||||
const projectSubtitleInput = document.getElementById('projectSubtitle');
|
||||
const clientNameInput = document.getElementById('clientName');
|
||||
const documentNumberInput = document.getElementById('documentNumber');
|
||||
const contractNumberInput = document.getElementById('contractNumber');
|
||||
const supplierNameInput = document.getElementById('supplierName');
|
||||
const languageSelect = document.getElementById('language');
|
||||
|
||||
// Functions
|
||||
function renderTemplate(templateName) {
|
||||
if (templates[templateName]) {
|
||||
previewContainer.innerHTML = templates[templateName]();
|
||||
updateCSSVariables();
|
||||
}
|
||||
}
|
||||
|
||||
function updateCSSVariables() {
|
||||
document.documentElement.style.setProperty('--primary-color', state.settings.primaryColor);
|
||||
document.documentElement.style.setProperty('--secondary-color', state.settings.secondaryColor);
|
||||
}
|
||||
|
||||
function updateColorPreviews() {
|
||||
document.getElementById('primaryColorBox').style.backgroundColor = state.settings.primaryColor;
|
||||
document.getElementById('primaryColorCode').textContent = state.settings.primaryColor;
|
||||
document.getElementById('secondaryColorBox').style.backgroundColor = state.settings.secondaryColor;
|
||||
document.getElementById('secondaryColorCode').textContent = state.settings.secondaryColor;
|
||||
}
|
||||
|
||||
function applySettings() {
|
||||
state.settings.primaryColor = primaryColorInput.value;
|
||||
state.settings.secondaryColor = secondaryColorInput.value;
|
||||
state.settings.projectTitle = projectTitleInput.value;
|
||||
state.settings.projectSubtitle = projectSubtitleInput.value;
|
||||
state.settings.clientName = clientNameInput.value;
|
||||
state.settings.documentNumber = documentNumberInput.value;
|
||||
state.settings.contractNumber = contractNumberInput.value;
|
||||
state.settings.supplierName = supplierNameInput.value;
|
||||
state.settings.language = languageSelect.value;
|
||||
|
||||
updateColorPreviews();
|
||||
renderTemplate(state.currentTemplate);
|
||||
}
|
||||
|
||||
function resetSettings() {
|
||||
state.settings = {
|
||||
primaryColor: '#1a365d',
|
||||
secondaryColor: '#2b6cb0',
|
||||
projectTitle: 'BUZIOS 7 PRODUCTION SYSTEM DEVELOPMENT',
|
||||
projectSubtitle: 'AR HEAD FABRICATION LONG',
|
||||
clientName: 'SAIPEM',
|
||||
documentNumber: 'DB-B97-01_S1_VENDOR_DATABOOK',
|
||||
contractNumber: 'OC 1472739',
|
||||
supplierName: 'ENGEMETAL',
|
||||
language: 'both',
|
||||
date: '2024'
|
||||
};
|
||||
|
||||
primaryColorInput.value = state.settings.primaryColor;
|
||||
secondaryColorInput.value = state.settings.secondaryColor;
|
||||
projectTitleInput.value = state.settings.projectTitle;
|
||||
projectSubtitleInput.value = state.settings.projectSubtitle;
|
||||
clientNameInput.value = state.settings.clientName;
|
||||
documentNumberInput.value = state.settings.documentNumber;
|
||||
contractNumberInput.value = state.settings.contractNumber;
|
||||
supplierNameInput.value = state.settings.supplierName;
|
||||
languageSelect.value = state.settings.language;
|
||||
|
||||
updateColorPreviews();
|
||||
renderTemplate(state.currentTemplate);
|
||||
}
|
||||
|
||||
function copyHTMLToClipboard() {
|
||||
const templateContent = previewContainer.innerHTML;
|
||||
const fullHTML = `<!DOCTYPE html>
|
||||
<html lang="pt-BR">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Template Databook</title>
|
||||
<style>
|
||||
/* Adicione o CSS necessário aqui */
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
${templateContent}
|
||||
</body>
|
||||
</html>`;
|
||||
|
||||
navigator.clipboard.writeText(fullHTML).then(() => {
|
||||
const originalText = copyHtmlBtn.textContent;
|
||||
copyHtmlBtn.textContent = '✓ Copiado!';
|
||||
copyHtmlBtn.style.backgroundColor = '#48bb78';
|
||||
|
||||
setTimeout(() => {
|
||||
copyHtmlBtn.textContent = originalText;
|
||||
copyHtmlBtn.style.backgroundColor = '';
|
||||
}, 2000);
|
||||
}).catch(err => {
|
||||
alert('Erro ao copiar: ' + err);
|
||||
});
|
||||
}
|
||||
|
||||
// Event Listeners
|
||||
navItems.forEach(item => {
|
||||
item.addEventListener('click', (e) => {
|
||||
const templateName = item.getAttribute('data-template');
|
||||
|
||||
if (templateName) {
|
||||
// Update active state
|
||||
navItems.forEach(nav => nav.classList.remove('active'));
|
||||
item.classList.add('active');
|
||||
|
||||
// Render template
|
||||
state.currentTemplate = templateName;
|
||||
renderTemplate(templateName);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
exportBtn.addEventListener('click', () => {
|
||||
exportModal.classList.add('active');
|
||||
});
|
||||
|
||||
closeModal.addEventListener('click', () => {
|
||||
exportModal.classList.remove('active');
|
||||
});
|
||||
|
||||
closeModalBtn.addEventListener('click', () => {
|
||||
exportModal.classList.remove('active');
|
||||
});
|
||||
|
||||
exportModal.addEventListener('click', (e) => {
|
||||
if (e.target === exportModal) {
|
||||
exportModal.classList.remove('active');
|
||||
}
|
||||
});
|
||||
|
||||
applyBtn.addEventListener('click', applySettings);
|
||||
resetBtn.addEventListener('click', resetSettings);
|
||||
copyHtmlBtn.addEventListener('click', copyHTMLToClipboard);
|
||||
|
||||
// Real-time color preview updates
|
||||
primaryColorInput.addEventListener('input', (e) => {
|
||||
document.getElementById('primaryColorBox').style.backgroundColor = e.target.value;
|
||||
document.getElementById('primaryColorCode').textContent = e.target.value;
|
||||
});
|
||||
|
||||
secondaryColorInput.addEventListener('input', (e) => {
|
||||
document.getElementById('secondaryColorBox').style.backgroundColor = e.target.value;
|
||||
document.getElementById('secondaryColorCode').textContent = e.target.value;
|
||||
});
|
||||
|
||||
// Initialize
|
||||
renderTemplate('cover');
|
||||
updateColorPreviews();
|
||||
1080
estrutura_visual/databook-template/index.html
Normal file
1080
estrutura_visual/databook-template/index.html
Normal file
File diff suppressed because it is too large
Load Diff
BIN
estrutura_visual/exported-assets.zip
Normal file
BIN
estrutura_visual/exported-assets.zip
Normal file
Binary file not shown.
BIN
estrutura_visual/exported-assets/databook-template.zip
Normal file
BIN
estrutura_visual/exported-assets/databook-template.zip
Normal file
Binary file not shown.
982
estrutura_visual/exported-assets/exemplos-codigo-template.md
Normal file
982
estrutura_visual/exported-assets/exemplos-codigo-template.md
Normal file
@@ -0,0 +1,982 @@
|
||||
# Exemplos de Código - Template Databook SteelBook
|
||||
|
||||
## 1. Estrutura HTML - Capa Frontal
|
||||
|
||||
```html
|
||||
<!DOCTYPE html>
|
||||
<html lang="pt-BR">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Databook - Capa Frontal</title>
|
||||
<style>
|
||||
.cover-page {
|
||||
width: 210mm;
|
||||
height: 297mm;
|
||||
padding: 40mm 30mm;
|
||||
background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
font-family: 'Roboto', Arial, sans-serif;
|
||||
}
|
||||
|
||||
.cover-header {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.client-logo {
|
||||
width: 200px;
|
||||
height: 100px;
|
||||
object-fit: contain;
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
.cover-title {
|
||||
font-size: 60px;
|
||||
font-weight: bold;
|
||||
color: #1a365d;
|
||||
line-height: 1.2;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.cover-subtitle {
|
||||
font-size: 36px;
|
||||
color: #2d3748;
|
||||
margin-bottom: 40px;
|
||||
}
|
||||
|
||||
.cover-separator {
|
||||
width: 60%;
|
||||
height: 3px;
|
||||
background: #2b6cb0;
|
||||
margin: 30px 0;
|
||||
}
|
||||
|
||||
.cover-info {
|
||||
text-align: center;
|
||||
font-size: 24px;
|
||||
color: #4a5568;
|
||||
}
|
||||
|
||||
.cover-info strong {
|
||||
color: #1a365d;
|
||||
display: block;
|
||||
margin-top: 15px;
|
||||
}
|
||||
|
||||
.supplier-logo {
|
||||
width: 150px;
|
||||
height: 75px;
|
||||
object-fit: contain;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="cover-page">
|
||||
<div class="cover-header">
|
||||
<img src="{{client_logo}}" alt="Logo Cliente" class="client-logo">
|
||||
<h1 class="cover-title">{{project_title}}</h1>
|
||||
<h2 class="cover-subtitle">{{project_subtitle}}</h2>
|
||||
<div class="cover-separator"></div>
|
||||
</div>
|
||||
|
||||
<div class="cover-info">
|
||||
<strong>Documento: {{document_number}}</strong>
|
||||
<strong>Contrato: {{contract_number}}</strong>
|
||||
<strong>Data: {{issue_date}}</strong>
|
||||
</div>
|
||||
|
||||
<img src="{{supplier_logo}}" alt="Logo Fornecedor" class="supplier-logo">
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. Estrutura HTML - Índice Geral
|
||||
|
||||
```html
|
||||
<div class="index-page">
|
||||
<h1 class="index-title">ÍNDICE / TABLE OF CONTENTS</h1>
|
||||
<div class="index-separator"></div>
|
||||
|
||||
<div class="index-content">
|
||||
<div class="index-item level-1">
|
||||
<span class="index-number">1</span>
|
||||
<span class="index-title-pt">Identificação</span>
|
||||
<span class="index-dots"></span>
|
||||
<span class="index-page">3</span>
|
||||
</div>
|
||||
<div class="index-item-en">Identification</div>
|
||||
|
||||
<div class="index-item level-1">
|
||||
<span class="index-number">2</span>
|
||||
<span class="index-title-pt">Materiais</span>
|
||||
<span class="index-dots"></span>
|
||||
<span class="index-page">5</span>
|
||||
</div>
|
||||
<div class="index-item-en">Materials</div>
|
||||
|
||||
<div class="index-item level-2">
|
||||
<span class="index-number">2.1</span>
|
||||
<span class="index-title-pt">Certificados das matérias-primas</span>
|
||||
<span class="index-dots"></span>
|
||||
<span class="index-page">6</span>
|
||||
</div>
|
||||
<div class="index-item-en">Raw materials certificates</div>
|
||||
|
||||
<div class="index-item level-2">
|
||||
<span class="index-number">2.2</span>
|
||||
<span class="index-title-pt">Consumíveis de soldagem</span>
|
||||
<span class="index-dots"></span>
|
||||
<span class="index-page">12</span>
|
||||
</div>
|
||||
<div class="index-item-en">Welding consumables</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.index-page {
|
||||
width: 210mm;
|
||||
min-height: 297mm;
|
||||
padding: 30mm 25mm;
|
||||
font-family: 'Open Sans', Arial, sans-serif;
|
||||
}
|
||||
|
||||
.index-title {
|
||||
font-size: 36px;
|
||||
font-weight: bold;
|
||||
color: #1a365d;
|
||||
text-align: center;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.index-separator {
|
||||
width: 100%;
|
||||
height: 2px;
|
||||
background: #2b6cb0;
|
||||
margin-bottom: 40px;
|
||||
}
|
||||
|
||||
.index-item {
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
margin-bottom: 8px;
|
||||
font-size: 18px;
|
||||
color: #2d3748;
|
||||
}
|
||||
|
||||
.index-item.level-1 {
|
||||
font-weight: bold;
|
||||
color: #1a365d;
|
||||
font-size: 20px;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.index-item.level-2 {
|
||||
padding-left: 20px;
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
.index-item.level-3 {
|
||||
padding-left: 40px;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.index-number {
|
||||
min-width: 40px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.index-title-pt {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.index-dots {
|
||||
flex: 1;
|
||||
border-bottom: 1px dotted #cbd5e0;
|
||||
margin: 0 10px;
|
||||
}
|
||||
|
||||
.index-page {
|
||||
min-width: 40px;
|
||||
text-align: right;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.index-item-en {
|
||||
font-size: 16px;
|
||||
color: #718096;
|
||||
font-style: italic;
|
||||
margin-left: 40px;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
</style>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. Estrutura HTML - Divisora Estilo Minimalista
|
||||
|
||||
```html
|
||||
<div class="divider-minimal">
|
||||
<div class="divider-number-watermark">2</div>
|
||||
<div class="divider-content">
|
||||
<h1 class="divider-title">Materiais</h1>
|
||||
<h2 class="divider-subtitle">Materials</h2>
|
||||
<div class="divider-line"></div>
|
||||
<p class="divider-description">
|
||||
Certificados, especificações e documentação de matérias-primas
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.divider-minimal {
|
||||
width: 210mm;
|
||||
height: 297mm;
|
||||
position: relative;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
overflow: hidden;
|
||||
background: #ffffff;
|
||||
}
|
||||
|
||||
.divider-number-watermark {
|
||||
position: absolute;
|
||||
font-size: 400px;
|
||||
font-weight: bold;
|
||||
color: #1a365d;
|
||||
opacity: 0.05;
|
||||
z-index: 1;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.divider-content {
|
||||
position: relative;
|
||||
z-index: 2;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.divider-title {
|
||||
font-size: 72px;
|
||||
font-weight: bold;
|
||||
color: #1a365d;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.divider-subtitle {
|
||||
font-size: 36px;
|
||||
color: #718096;
|
||||
font-style: italic;
|
||||
margin-bottom: 40px;
|
||||
}
|
||||
|
||||
.divider-line {
|
||||
width: 200px;
|
||||
height: 4px;
|
||||
background: linear-gradient(90deg, transparent, #2b6cb0, transparent);
|
||||
margin: 0 auto 30px;
|
||||
}
|
||||
|
||||
.divider-description {
|
||||
font-size: 20px;
|
||||
color: #4a5568;
|
||||
}
|
||||
</style>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. Estrutura HTML - Divisora Estilo Lateral
|
||||
|
||||
```html
|
||||
<div class="divider-lateral">
|
||||
<div class="divider-sidebar">
|
||||
<span class="divider-sidebar-number">3</span>
|
||||
<span class="divider-sidebar-icon">⚡</span>
|
||||
</div>
|
||||
<div class="divider-main">
|
||||
<h1 class="divider-main-title">Procedimentos de Soldagem</h1>
|
||||
<h2 class="divider-main-subtitle">Welding Procedures</h2>
|
||||
<div class="divider-info-box">
|
||||
<p><strong>Projeto:</strong> BUZIOS 7</p>
|
||||
<p><strong>Cliente:</strong> SAIPEM</p>
|
||||
<p><strong>Contrato:</strong> OC 1472739</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.divider-lateral {
|
||||
width: 210mm;
|
||||
height: 297mm;
|
||||
display: flex;
|
||||
background: #f7fafc;
|
||||
}
|
||||
|
||||
.divider-sidebar {
|
||||
width: 80px;
|
||||
background: linear-gradient(180deg, #1a365d 0%, #2b6cb0 100%);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.divider-sidebar-number {
|
||||
font-size: 96px;
|
||||
font-weight: bold;
|
||||
line-height: 1;
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
.divider-sidebar-icon {
|
||||
font-size: 48px;
|
||||
}
|
||||
|
||||
.divider-main {
|
||||
flex: 1;
|
||||
padding: 80px 60px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.divider-main-title {
|
||||
font-size: 56px;
|
||||
font-weight: bold;
|
||||
color: #1a365d;
|
||||
margin-bottom: 15px;
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
.divider-main-subtitle {
|
||||
font-size: 32px;
|
||||
color: #718096;
|
||||
font-style: italic;
|
||||
margin-bottom: 60px;
|
||||
}
|
||||
|
||||
.divider-info-box {
|
||||
background: white;
|
||||
border: 2px solid #2b6cb0;
|
||||
border-radius: 8px;
|
||||
padding: 30px;
|
||||
box-shadow: 0 4px 6px rgba(0,0,0,0.1);
|
||||
}
|
||||
|
||||
.divider-info-box p {
|
||||
font-size: 18px;
|
||||
color: #2d3748;
|
||||
margin: 10px 0;
|
||||
}
|
||||
|
||||
.divider-info-box strong {
|
||||
color: #1a365d;
|
||||
}
|
||||
</style>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. Estrutura HTML - Cabeçalho e Rodapé
|
||||
|
||||
```html
|
||||
<!-- CABEÇALHO -->
|
||||
<div class="page-header">
|
||||
<div class="header-left">
|
||||
<img src="{{logo_url}}" alt="Logo" class="header-logo">
|
||||
</div>
|
||||
<div class="header-center">
|
||||
<span class="header-project">{{project_name}}</span>
|
||||
</div>
|
||||
<div class="header-right">
|
||||
<span class="header-doc">{{document_number}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- RODAPÉ -->
|
||||
<div class="page-footer">
|
||||
<div class="footer-left">
|
||||
<span>Rev. {{revision}}</span>
|
||||
</div>
|
||||
<div class="footer-center">
|
||||
<span class="page-number">{{page_number}}</span>
|
||||
</div>
|
||||
<div class="footer-right">
|
||||
<span>{{date}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.page-header {
|
||||
width: 100%;
|
||||
height: 60px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding: 0 30px;
|
||||
border-bottom: 2px solid #2b6cb0;
|
||||
background: white;
|
||||
font-family: 'Roboto', Arial, sans-serif;
|
||||
}
|
||||
|
||||
.header-logo {
|
||||
height: 40px;
|
||||
object-fit: contain;
|
||||
}
|
||||
|
||||
.header-center {
|
||||
flex: 1;
|
||||
text-align: center;
|
||||
font-size: 14px;
|
||||
font-weight: 500;
|
||||
color: #1a365d;
|
||||
}
|
||||
|
||||
.header-right {
|
||||
font-size: 12px;
|
||||
color: #718096;
|
||||
}
|
||||
|
||||
.page-footer {
|
||||
width: 100%;
|
||||
height: 40px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding: 0 30px;
|
||||
border-top: 1px solid #cbd5e0;
|
||||
background: white;
|
||||
font-size: 12px;
|
||||
color: #4a5568;
|
||||
}
|
||||
|
||||
.footer-center .page-number {
|
||||
font-size: 18px;
|
||||
font-weight: bold;
|
||||
color: #1a365d;
|
||||
}
|
||||
</style>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. JavaScript - Sistema de Variáveis Dinâmicas
|
||||
|
||||
```javascript
|
||||
// Classe para gerenciar templates
|
||||
class DatabookTemplate {
|
||||
constructor(config) {
|
||||
this.config = config;
|
||||
this.variables = {};
|
||||
}
|
||||
|
||||
// Define variáveis do projeto
|
||||
setVariables(vars) {
|
||||
this.variables = { ...this.variables, ...vars };
|
||||
}
|
||||
|
||||
// Renderiza template substituindo variáveis
|
||||
render(templateHtml) {
|
||||
let rendered = templateHtml;
|
||||
|
||||
// Substitui variáveis no formato {{variable_name}}
|
||||
for (const [key, value] of Object.entries(this.variables)) {
|
||||
const regex = new RegExp(`{{${key}}}`, 'g');
|
||||
rendered = rendered.replace(regex, value);
|
||||
}
|
||||
|
||||
return rendered;
|
||||
}
|
||||
|
||||
// Gera capa frontal
|
||||
generateCover() {
|
||||
const coverTemplate = `
|
||||
<div class="cover-page">
|
||||
<img src="{{client_logo}}" class="client-logo">
|
||||
<h1>{{project_title}}</h1>
|
||||
<h2>{{project_subtitle}}</h2>
|
||||
<div class="cover-info">
|
||||
<p>Documento: {{document_number}}</p>
|
||||
<p>Contrato: {{contract_number}}</p>
|
||||
<p>Data: {{issue_date}}</p>
|
||||
</div>
|
||||
<img src="{{supplier_logo}}" class="supplier-logo">
|
||||
</div>
|
||||
`;
|
||||
|
||||
return this.render(coverTemplate);
|
||||
}
|
||||
|
||||
// Gera índice
|
||||
generateIndex(sections) {
|
||||
let indexHtml = '<div class="index-page"><h1>ÍNDICE / TABLE OF CONTENTS</h1>';
|
||||
|
||||
sections.forEach(section => {
|
||||
const indent = section.level > 1 ? `level-${section.level}` : '';
|
||||
indexHtml += `
|
||||
<div class="index-item ${indent}">
|
||||
<span class="index-number">${section.number}</span>
|
||||
<span class="index-title">${section.title_pt}</span>
|
||||
<span class="index-dots"></span>
|
||||
<span class="index-page">${section.page}</span>
|
||||
</div>
|
||||
<div class="index-item-en">${section.title_en}</div>
|
||||
`;
|
||||
});
|
||||
|
||||
indexHtml += '</div>';
|
||||
return indexHtml;
|
||||
}
|
||||
|
||||
// Gera divisora de seção
|
||||
generateDivider(sectionNumber, titlePt, titleEn, style = 'minimal') {
|
||||
const templates = {
|
||||
minimal: `
|
||||
<div class="divider-minimal">
|
||||
<div class="divider-number-watermark">${sectionNumber}</div>
|
||||
<div class="divider-content">
|
||||
<h1>${titlePt}</h1>
|
||||
<h2>${titleEn}</h2>
|
||||
</div>
|
||||
</div>
|
||||
`,
|
||||
lateral: `
|
||||
<div class="divider-lateral">
|
||||
<div class="divider-sidebar">
|
||||
<span>${sectionNumber}</span>
|
||||
</div>
|
||||
<div class="divider-main">
|
||||
<h1>${titlePt}</h1>
|
||||
<h2>${titleEn}</h2>
|
||||
</div>
|
||||
</div>
|
||||
`,
|
||||
corporate: `
|
||||
<div class="divider-corporate">
|
||||
<div class="divider-header">
|
||||
<img src="{{client_logo}}">
|
||||
</div>
|
||||
<div class="divider-body">
|
||||
<span class="section-number">${sectionNumber}</span>
|
||||
<h1>${titlePt}</h1>
|
||||
<h2>${titleEn}</h2>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
};
|
||||
|
||||
return this.render(templates[style] || templates.minimal);
|
||||
}
|
||||
}
|
||||
|
||||
// Exemplo de uso
|
||||
const template = new DatabookTemplate({
|
||||
name: 'SAIPEM Vendor Databook',
|
||||
version: '1.0'
|
||||
});
|
||||
|
||||
template.setVariables({
|
||||
project_title: 'BUZIOS 7 PRODUCTION SYSTEM DEVELOPMENT',
|
||||
project_subtitle: 'AR HEAD FABRICATION LONG',
|
||||
client_logo: '/logos/saipem.png',
|
||||
supplier_logo: '/logos/engemetal.png',
|
||||
document_number: 'DB-B97-01_S1_VENDOR_DATABOOK',
|
||||
contract_number: 'OC 1472739',
|
||||
issue_date: '2024-11-17'
|
||||
});
|
||||
|
||||
// Gerar componentes
|
||||
const cover = template.generateCover();
|
||||
const index = template.generateIndex([
|
||||
{ number: '1', title_pt: 'Identificação', title_en: 'Identification', level: 1, page: 3 },
|
||||
{ number: '2', title_pt: 'Materiais', title_en: 'Materials', level: 1, page: 5 }
|
||||
]);
|
||||
const divider = template.generateDivider('2', 'Materiais', 'Materials', 'minimal');
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 7. CSS - Variáveis Customizáveis
|
||||
|
||||
```css
|
||||
:root {
|
||||
/* Cores Primárias */
|
||||
--color-primary: #1a365d;
|
||||
--color-secondary: #2b6cb0;
|
||||
--color-accent: #4299e1;
|
||||
|
||||
/* Cores Neutras */
|
||||
--color-gray-dark: #2d3748;
|
||||
--color-gray-medium: #718096;
|
||||
--color-gray-light: #e2e8f0;
|
||||
|
||||
/* Tipografia */
|
||||
--font-heading: 'Roboto', Arial, sans-serif;
|
||||
--font-body: 'Open Sans', Arial, sans-serif;
|
||||
--font-mono: 'Roboto Mono', monospace;
|
||||
|
||||
/* Tamanhos de Fonte */
|
||||
--font-size-h1: 60px;
|
||||
--font-size-h2: 48px;
|
||||
--font-size-h3: 36px;
|
||||
--font-size-h4: 24px;
|
||||
--font-size-body: 16px;
|
||||
--font-size-small: 12px;
|
||||
|
||||
/* Espaçamentos */
|
||||
--spacing-xs: 8px;
|
||||
--spacing-sm: 16px;
|
||||
--spacing-md: 24px;
|
||||
--spacing-lg: 40px;
|
||||
--spacing-xl: 60px;
|
||||
|
||||
/* Bordas */
|
||||
--border-radius: 8px;
|
||||
--border-width: 2px;
|
||||
}
|
||||
|
||||
/* Aplicação das variáveis */
|
||||
.cover-title {
|
||||
color: var(--color-primary);
|
||||
font-family: var(--font-heading);
|
||||
font-size: var(--font-size-h1);
|
||||
}
|
||||
|
||||
.index-item {
|
||||
color: var(--color-gray-dark);
|
||||
font-family: var(--font-body);
|
||||
padding: var(--spacing-sm) 0;
|
||||
}
|
||||
|
||||
.divider-content {
|
||||
padding: var(--spacing-xl);
|
||||
}
|
||||
|
||||
/* Tema alternativo - Azul Claro */
|
||||
.theme-light {
|
||||
--color-primary: #2563eb;
|
||||
--color-secondary: #60a5fa;
|
||||
--color-accent: #93c5fd;
|
||||
}
|
||||
|
||||
/* Tema alternativo - Cinza Profissional */
|
||||
.theme-professional {
|
||||
--color-primary: #334155;
|
||||
--color-secondary: #64748b;
|
||||
--color-accent: #94a3b8;
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 8. Integração com Banco de Dados (Supabase)
|
||||
|
||||
```sql
|
||||
-- Tabela de Templates
|
||||
CREATE TABLE templates (
|
||||
id UUID DEFAULT uuid_generate_v4() PRIMARY KEY,
|
||||
nome VARCHAR(255) NOT NULL,
|
||||
descricao TEXT,
|
||||
versao VARCHAR(20) DEFAULT '1.0',
|
||||
config JSONB NOT NULL,
|
||||
criado_por UUID REFERENCES auth.users(id),
|
||||
criado_em TIMESTAMP DEFAULT NOW(),
|
||||
atualizado_em TIMESTAMP DEFAULT NOW(),
|
||||
ativo BOOLEAN DEFAULT true,
|
||||
publico BOOLEAN DEFAULT false,
|
||||
organizacao_id UUID REFERENCES organizacoes(id)
|
||||
);
|
||||
|
||||
-- Exemplo de config JSONB
|
||||
{
|
||||
"capa": {
|
||||
"titulo": "{{project_title}}",
|
||||
"subtitulo": "{{project_subtitle}}",
|
||||
"cores": {
|
||||
"primaria": "#1a365d",
|
||||
"secundaria": "#2b6cb0"
|
||||
}
|
||||
},
|
||||
"indice": {
|
||||
"bilingue": true,
|
||||
"estrutura": [
|
||||
{
|
||||
"numero": "1",
|
||||
"titulo_pt": "Identificação",
|
||||
"titulo_en": "Identification",
|
||||
"nivel": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
"divisoras": {
|
||||
"estilo": "minimal"
|
||||
}
|
||||
}
|
||||
|
||||
-- Tabela de Databooks usando Templates
|
||||
CREATE TABLE databooks (
|
||||
id UUID DEFAULT uuid_generate_v4() PRIMARY KEY,
|
||||
nome VARCHAR(255) NOT NULL,
|
||||
template_id UUID REFERENCES templates(id),
|
||||
dados JSONB NOT NULL,
|
||||
criado_em TIMESTAMP DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Query para buscar templates
|
||||
SELECT t.*, u.nome as criador
|
||||
FROM templates t
|
||||
LEFT JOIN auth.users u ON t.criado_por = u.id
|
||||
WHERE t.ativo = true
|
||||
AND (t.publico = true OR t.organizacao_id = $1)
|
||||
ORDER BY t.criado_em DESC;
|
||||
|
||||
-- Query para aplicar template a databook
|
||||
UPDATE databooks
|
||||
SET template_id = $1,
|
||||
dados = jsonb_set(dados, '{template_aplicado}', 'true'::jsonb)
|
||||
WHERE id = $2;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 9. API Endpoints (Node.js/Express)
|
||||
|
||||
```javascript
|
||||
const express = require('express');
|
||||
const router = express.Router();
|
||||
|
||||
// GET /api/templates - Lista templates
|
||||
router.get('/templates', async (req, res) => {
|
||||
try {
|
||||
const { data, error } = await supabase
|
||||
.from('templates')
|
||||
.select('*')
|
||||
.eq('ativo', true)
|
||||
.order('criado_em', { ascending: false });
|
||||
|
||||
if (error) throw error;
|
||||
res.json({ success: true, data });
|
||||
} catch (error) {
|
||||
res.status(500).json({ success: false, error: error.message });
|
||||
}
|
||||
});
|
||||
|
||||
// POST /api/templates - Cria novo template
|
||||
router.post('/templates', async (req, res) => {
|
||||
try {
|
||||
const { nome, descricao, config } = req.body;
|
||||
|
||||
const { data, error } = await supabase
|
||||
.from('templates')
|
||||
.insert([{
|
||||
nome,
|
||||
descricao,
|
||||
config,
|
||||
criado_por: req.user.id
|
||||
}])
|
||||
.select()
|
||||
.single();
|
||||
|
||||
if (error) throw error;
|
||||
res.json({ success: true, data });
|
||||
} catch (error) {
|
||||
res.status(500).json({ success: false, error: error.message });
|
||||
}
|
||||
});
|
||||
|
||||
// PUT /api/templates/:id - Atualiza template
|
||||
router.put('/templates/:id', async (req, res) => {
|
||||
try {
|
||||
const { id } = req.params;
|
||||
const { nome, descricao, config } = req.body;
|
||||
|
||||
const { data, error } = await supabase
|
||||
.from('templates')
|
||||
.update({
|
||||
nome,
|
||||
descricao,
|
||||
config,
|
||||
atualizado_em: new Date().toISOString()
|
||||
})
|
||||
.eq('id', id)
|
||||
.select()
|
||||
.single();
|
||||
|
||||
if (error) throw error;
|
||||
res.json({ success: true, data });
|
||||
} catch (error) {
|
||||
res.status(500).json({ success: false, error: error.message });
|
||||
}
|
||||
});
|
||||
|
||||
// POST /api/databooks/:id/apply-template - Aplica template
|
||||
router.post('/databooks/:id/apply-template', async (req, res) => {
|
||||
try {
|
||||
const { id } = req.params;
|
||||
const { template_id } = req.body;
|
||||
|
||||
// Buscar template
|
||||
const { data: template } = await supabase
|
||||
.from('templates')
|
||||
.select('*')
|
||||
.eq('id', template_id)
|
||||
.single();
|
||||
|
||||
// Buscar databook
|
||||
const { data: databook } = await supabase
|
||||
.from('databooks')
|
||||
.select('*')
|
||||
.eq('id', id)
|
||||
.single();
|
||||
|
||||
// Aplicar configurações do template
|
||||
const dadosAtualizados = {
|
||||
...databook.dados,
|
||||
template_config: template.config
|
||||
};
|
||||
|
||||
// Atualizar databook
|
||||
const { data, error } = await supabase
|
||||
.from('databooks')
|
||||
.update({
|
||||
template_id,
|
||||
dados: dadosAtualizados
|
||||
})
|
||||
.eq('id', id)
|
||||
.select()
|
||||
.single();
|
||||
|
||||
if (error) throw error;
|
||||
res.json({ success: true, data });
|
||||
} catch (error) {
|
||||
res.status(500).json({ success: false, error: error.message });
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = router;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 10. Geração de PDF com Puppeteer
|
||||
|
||||
```javascript
|
||||
const puppeteer = require('puppeteer');
|
||||
const fs = require('fs');
|
||||
|
||||
class DatabookPDFGenerator {
|
||||
constructor(template, databook) {
|
||||
this.template = template;
|
||||
this.databook = databook;
|
||||
}
|
||||
|
||||
async generatePDF(outputPath) {
|
||||
const browser = await puppeteer.launch({
|
||||
headless: true,
|
||||
args: ['--no-sandbox']
|
||||
});
|
||||
|
||||
const page = await browser.newPage();
|
||||
|
||||
// Configurar página
|
||||
await page.setViewport({
|
||||
width: 794, // A4 width in pixels at 96 DPI
|
||||
height: 1123 // A4 height in pixels at 96 DPI
|
||||
});
|
||||
|
||||
// Gerar HTML completo
|
||||
const htmlContent = this.generateFullHTML();
|
||||
|
||||
// Carregar conteúdo
|
||||
await page.setContent(htmlContent, {
|
||||
waitUntil: 'networkidle0'
|
||||
});
|
||||
|
||||
// Gerar PDF
|
||||
await page.pdf({
|
||||
path: outputPath,
|
||||
format: 'A4',
|
||||
printBackground: true,
|
||||
margin: {
|
||||
top: '20mm',
|
||||
right: '15mm',
|
||||
bottom: '20mm',
|
||||
left: '15mm'
|
||||
},
|
||||
displayHeaderFooter: true,
|
||||
headerTemplate: this.generateHeader(),
|
||||
footerTemplate: this.generateFooter()
|
||||
});
|
||||
|
||||
await browser.close();
|
||||
|
||||
return outputPath;
|
||||
}
|
||||
|
||||
generateFullHTML() {
|
||||
const sections = [];
|
||||
|
||||
// Capa
|
||||
sections.push(this.generateCover());
|
||||
|
||||
// Índice
|
||||
sections.push(this.generateIndex());
|
||||
|
||||
// Seções com divisoras
|
||||
this.databook.sections.forEach(section => {
|
||||
sections.push(this.generateDivider(section));
|
||||
sections.push(this.generateSectionContent(section));
|
||||
});
|
||||
|
||||
return `
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<style>${this.getStyles()}</style>
|
||||
</head>
|
||||
<body>
|
||||
${sections.join('\n<div class="page-break"></div>\n')}
|
||||
</body>
|
||||
</html>
|
||||
`;
|
||||
}
|
||||
|
||||
generateHeader() {
|
||||
return `
|
||||
<div style="font-size: 10px; padding: 0 20px; width: 100%;">
|
||||
<span>${this.databook.project_name}</span>
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
|
||||
generateFooter() {
|
||||
return `
|
||||
<div style="font-size: 10px; padding: 0 20px; width: 100%; text-align: center;">
|
||||
<span class="pageNumber"></span> / <span class="totalPages"></span>
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
|
||||
getStyles() {
|
||||
return fs.readFileSync('./styles/databook.css', 'utf8');
|
||||
}
|
||||
}
|
||||
|
||||
// Uso
|
||||
const generator = new DatabookPDFGenerator(template, databook);
|
||||
await generator.generatePDF('./output/databook.pdf');
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Conclusão
|
||||
|
||||
Estes exemplos fornecem uma base sólida para implementar o sistema de templates no SteelBook. Adapte conforme necessário para sua arquitetura específica.
|
||||
BIN
estrutura_visual/exported-assets/guia-template-databook.pdf
Normal file
BIN
estrutura_visual/exported-assets/guia-template-databook.pdf
Normal file
Binary file not shown.
113
estrutura_visual/exported-assets/indice-arquivos.md
Normal file
113
estrutura_visual/exported-assets/indice-arquivos.md
Normal file
@@ -0,0 +1,113 @@
|
||||
|
||||
# 📁 ÍNDICE DE ARQUIVOS ENTREGUES
|
||||
|
||||
## 1. Aplicação Web Interativa
|
||||
- **Arquivo:** databook-template.zip
|
||||
- **Tipo:** HTML/CSS/JavaScript
|
||||
- **Descrição:** Aplicação web completa com interface visual para explorar e personalizar templates
|
||||
- **Recursos:**
|
||||
- Preview em tempo real de todos os componentes
|
||||
- Painel de personalização (cores, textos, logos)
|
||||
- Navegação entre diferentes tipos de páginas
|
||||
- 3 estilos de divisoras de seção
|
||||
- Sistema de exportação de código
|
||||
|
||||
## 2. Guia Completo em PDF
|
||||
- **Arquivo:** guia-template-databook.pdf
|
||||
- **Páginas:** 10
|
||||
- **Conteúdo:**
|
||||
1. Visão Geral
|
||||
2. Componentes do Template (detalhado)
|
||||
3. Paleta de Cores e Tipografia
|
||||
4. Workflow de Implementação
|
||||
5. Estrutura de Dados JSON
|
||||
6. Integração Técnica
|
||||
7. Boas Práticas
|
||||
8. Checklist de Implementação
|
||||
9. Recursos Adicionais
|
||||
10. Suporte e Próximos Passos
|
||||
|
||||
## 3. Exemplos de Código
|
||||
- **Arquivo:** exemplos-codigo-template.md
|
||||
- **Formato:** Markdown com blocos de código
|
||||
- **Conteúdo:**
|
||||
1. HTML - Capa Frontal
|
||||
2. HTML - Índice Geral
|
||||
3. HTML - Divisoras (3 estilos)
|
||||
4. HTML - Cabeçalhos e Rodapés
|
||||
5. JavaScript - Sistema de Templates
|
||||
6. CSS - Variáveis Customizáveis
|
||||
7. SQL - Estrutura Supabase
|
||||
8. Node.js - API Endpoints
|
||||
9. JavaScript - Geração de PDF com Puppeteer
|
||||
|
||||
## 4. Guia de Integração
|
||||
- **Arquivo:** template_integration_guide.json
|
||||
- **Formato:** JSON estruturado
|
||||
- **Conteúdo:**
|
||||
- Metadata do template
|
||||
- Componentes com campos editáveis
|
||||
- Workflow de uso
|
||||
- Endpoints API
|
||||
- Estrutura de dados
|
||||
|
||||
## 🔗 Links de Acesso
|
||||
|
||||
### Aplicação Web
|
||||
A aplicação web está hospedada e pode ser acessada através do link fornecido acima.
|
||||
Permite visualização interativa de todos os componentes do template.
|
||||
|
||||
### Arquivos para Download
|
||||
Todos os arquivos estão disponíveis para download e podem ser utilizados
|
||||
diretamente na implementação do SteelBook.
|
||||
|
||||
## 📋 Como Utilizar
|
||||
|
||||
### Para Desenvolvedores:
|
||||
1. Baixe todos os arquivos fornecidos
|
||||
2. Estude a aplicação web interativa para entender a estrutura visual
|
||||
3. Use os exemplos de código como base para implementação
|
||||
4. Adapte a estrutura JSON para seu banco de dados
|
||||
5. Implemente os endpoints API conforme sugerido
|
||||
6. Teste a geração de PDF com os templates
|
||||
|
||||
### Para Gestores:
|
||||
1. Acesse a aplicação web para visualizar os templates
|
||||
2. Leia o guia em PDF para entender o workflow
|
||||
3. Compartilhe com equipe de desenvolvimento
|
||||
4. Planeje a integração no roadmap do SteelBook
|
||||
|
||||
### Para Designers:
|
||||
1. Visualize a paleta de cores e tipografia no guia PDF
|
||||
2. Explore os 3 estilos de divisoras na aplicação web
|
||||
3. Customize cores e estilos conforme identidade visual
|
||||
4. Crie variações para diferentes clientes
|
||||
|
||||
## ✅ Checklist de Implementação
|
||||
|
||||
- [ ] Revisar todos os arquivos fornecidos
|
||||
- [ ] Testar aplicação web interativa
|
||||
- [ ] Adaptar estrutura de banco de dados
|
||||
- [ ] Implementar CRUD de templates
|
||||
- [ ] Criar interface de edição visual
|
||||
- [ ] Integrar sistema de geração de PDF
|
||||
- [ ] Testar com dados reais
|
||||
- [ ] Documentar para usuários finais
|
||||
- [ ] Realizar treinamento de equipe
|
||||
- [ ] Deploy em produção
|
||||
|
||||
## 🎯 Resultado Esperado
|
||||
|
||||
Com estes materiais, a equipe do SteelBook terá tudo o necessário para:
|
||||
|
||||
1. **Entender** a estrutura de um databook técnico profissional
|
||||
2. **Visualizar** os componentes através da aplicação interativa
|
||||
3. **Implementar** usando os exemplos de código fornecidos
|
||||
4. **Integrar** seguindo o workflow documentado
|
||||
5. **Personalizar** para diferentes clientes e projetos
|
||||
|
||||
---
|
||||
|
||||
**Data de criação:** Novembro 2024
|
||||
**Versão:** 1.0
|
||||
**Base:** DB-B97-01_S1_VENDOR_DATABOOK (SAIPEM - BUZIOS 7)
|
||||
146
estrutura_visual/exported-assets/script.py
Normal file
146
estrutura_visual/exported-assets/script.py
Normal file
@@ -0,0 +1,146 @@
|
||||
|
||||
# Vou criar uma análise estrutural do databook para identificar os elementos de template
|
||||
|
||||
analise_databook = {
|
||||
"Estrutura_Identificada": {
|
||||
"1_Capa_Frontal": {
|
||||
"elementos": [
|
||||
"Logo Saipem (cliente)",
|
||||
"Título do projeto: BUZIOS 7 PRODUCTION SYSTEM DEVELOPMENT",
|
||||
"Subtítulo: AR HEAD FABRICATION LONG",
|
||||
"Número do documento: DB-B97-01_S1_VENDOR_DATABOOK",
|
||||
"Identificação do projeto/contrato: OC 1472739",
|
||||
"Data de emissão"
|
||||
],
|
||||
"layout": "Centralizado, hierarquia de tamanhos de fonte, logos no topo"
|
||||
},
|
||||
|
||||
"2_Indice_Geral": {
|
||||
"estrutura": "Lista numerada hierárquica",
|
||||
"formato": "Número - Título - Página",
|
||||
"exemplo": [
|
||||
"1 - Identificação",
|
||||
"2 - Materiais",
|
||||
" 2.1 - Certificados das matérias-primas",
|
||||
" 2.2 - Raw materials certificates",
|
||||
"3 - Procedimentos de Soldagem",
|
||||
" 3.1 - EPS",
|
||||
" 3.2 - RQPS",
|
||||
" 3.3 - RQS",
|
||||
"4 - Inspeção e Testes",
|
||||
" 4.1 - PIT",
|
||||
" 4.2 - Relatórios NDT",
|
||||
"8 - Certificados de Conformidade"
|
||||
]
|
||||
},
|
||||
|
||||
"3_Capas_Divisoras_Internas": {
|
||||
"padrão": {
|
||||
"numero_secao": "Grande, destaque",
|
||||
"titulo_principal": "Ex: '2 - Materiais' / '2 - Materials'",
|
||||
"subtitulo": "Ex: '2.1 - Certificados das matérias-primas'",
|
||||
"bilíngue": "Português e Inglês",
|
||||
"identificacao_projeto": "Rodapé ou cabeçalho",
|
||||
"cor_destaque": "Possível uso de cores para diferenciar seções"
|
||||
}
|
||||
},
|
||||
|
||||
"4_Cabeçalhos_Rodapes": {
|
||||
"cabeçalho": [
|
||||
"Nome do projeto",
|
||||
"Número do documento",
|
||||
"Cliente"
|
||||
],
|
||||
"rodapé": [
|
||||
"Número da página",
|
||||
"Revisão",
|
||||
"Data"
|
||||
]
|
||||
},
|
||||
|
||||
"5_Hierarquia_Numeracao": {
|
||||
"nivel_1": "1, 2, 3, 4, 5, 6, 7, 8",
|
||||
"nivel_2": "2.1, 2.2, 3.1, 3.2, 3.3, 4.1, 4.2, 4.3, 4.4",
|
||||
"nivel_3": "Possível uso de 2.1.1, 2.1.2, etc.",
|
||||
"padrão": "Numeração decimal sequencial"
|
||||
},
|
||||
|
||||
"6_Estrutura_Conteudo": {
|
||||
"secoes_identificadas": [
|
||||
{
|
||||
"num": "1",
|
||||
"titulo": "Identificação",
|
||||
"tipo": "Informações do projeto"
|
||||
},
|
||||
{
|
||||
"num": "2",
|
||||
"titulo": "Materiais",
|
||||
"subsecoes": ["2.1 - Certificados matérias-primas", "2.2 - Raw materials certificates"]
|
||||
},
|
||||
{
|
||||
"num": "3",
|
||||
"titulo": "Procedimentos de Soldagem",
|
||||
"subsecoes": ["3.1 - EPS", "3.2 - RQPS", "3.3 - RQS"]
|
||||
},
|
||||
{
|
||||
"num": "4",
|
||||
"titulo": "Inspeção e Testes",
|
||||
"subsecoes": ["4.1 - PIT", "4.2 - NDT", "4.3 - Dimensional", "4.4 - Pintura"]
|
||||
},
|
||||
{
|
||||
"num": "8",
|
||||
"titulo": "Certificados de Conformidade",
|
||||
"subsecoes": ["8.1 - IRN"]
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
"7_Elementos_Visuais": {
|
||||
"separadores": "Páginas inteiras para divisão de seções",
|
||||
"tipografia": "Hierarquia clara de fontes e tamanhos",
|
||||
"cores": "Possivelmente azul/corporativo para títulos",
|
||||
"logos": "Logos da empresa fabricante e cliente",
|
||||
"marca_dagua": "Possível uso em páginas de conteúdo"
|
||||
},
|
||||
|
||||
"8_Padroes_Documento": {
|
||||
"bilíngue": "Português e Inglês em paralelo",
|
||||
"numeracao_documentos": "Formato estruturado (ex: DB-B97-01, PR-B97-01)",
|
||||
"revisoes": "Sistema de revisão (S1, S2, Rev.0, etc.)",
|
||||
"aprovacoes": "Campos para elaborado, verificado, aprovado",
|
||||
"referencias": "Lista de documentos relacionados"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
print("=" * 80)
|
||||
print("ANÁLISE ESTRUTURAL DO DATABOOK - ELEMENTOS DE TEMPLATE")
|
||||
print("=" * 80)
|
||||
print("\n1. CAPA FRONTAL")
|
||||
print("-" * 80)
|
||||
for elem in analise_databook["Estrutura_Identificada"]["1_Capa_Frontal"]["elementos"]:
|
||||
print(f" • {elem}")
|
||||
print(f"\nLayout: {analise_databook['Estrutura_Identificada']['1_Capa_Frontal']['layout']}")
|
||||
|
||||
print("\n\n2. ÍNDICE GERAL")
|
||||
print("-" * 80)
|
||||
print(f"Estrutura: {analise_databook['Estrutura_Identificada']['2_Indice_Geral']['estrutura']}")
|
||||
print(f"Formato: {analise_databook['Estrutura_Identificada']['2_Indice_Geral']['formato']}")
|
||||
print("\nExemplo de estrutura:")
|
||||
for item in analise_databook["Estrutura_Identificada"]["2_Indice_Geral"]["exemplo"]:
|
||||
print(f" {item}")
|
||||
|
||||
print("\n\n3. CAPAS DIVISORAS INTERNAS")
|
||||
print("-" * 80)
|
||||
for chave, valor in analise_databook["Estrutura_Identificada"]["3_Capas_Divisoras_Internas"]["padrão"].items():
|
||||
print(f" {chave.replace('_', ' ').title()}: {valor}")
|
||||
|
||||
print("\n\n4. SEÇÕES IDENTIFICADAS")
|
||||
print("-" * 80)
|
||||
for secao in analise_databook["Estrutura_Identificada"]["6_Estrutura_Conteudo"]["secoes_identificadas"]:
|
||||
print(f"\n {secao['num']} - {secao['titulo']}")
|
||||
if "subsecoes" in secao:
|
||||
for sub in secao["subsecoes"]:
|
||||
print(f" └─ {sub}")
|
||||
|
||||
print("\n\n" + "=" * 80)
|
||||
279
estrutura_visual/exported-assets/script_1.py
Normal file
279
estrutura_visual/exported-assets/script_1.py
Normal file
@@ -0,0 +1,279 @@
|
||||
|
||||
# Criar um guia JSON estruturado do template para integração na plataforma
|
||||
|
||||
template_guide = {
|
||||
"metadata": {
|
||||
"nome": "Template SteelBook Databook",
|
||||
"versao": "1.0",
|
||||
"base": "DB-B97-01 (SAIPEM)",
|
||||
"tipo": "Vendor Databook Técnico"
|
||||
},
|
||||
|
||||
"componentes": {
|
||||
"1_capa_frontal": {
|
||||
"nome": "Capa Frontal",
|
||||
"campos_editaveis": [
|
||||
{
|
||||
"campo": "logo_cliente",
|
||||
"tipo": "imagem",
|
||||
"dimensoes": "200x100px",
|
||||
"formato": "PNG, SVG preferencial"
|
||||
},
|
||||
{
|
||||
"campo": "titulo_projeto",
|
||||
"tipo": "texto",
|
||||
"max_caracteres": 100,
|
||||
"exemplo": "BUZIOS 7 PRODUCTION SYSTEM DEVELOPMENT"
|
||||
},
|
||||
{
|
||||
"campo": "subtitulo",
|
||||
"tipo": "texto",
|
||||
"max_caracteres": 80,
|
||||
"exemplo": "AR HEAD FABRICATION LONG"
|
||||
},
|
||||
{
|
||||
"campo": "numero_documento",
|
||||
"tipo": "texto",
|
||||
"padrao": "DB-XXX-YY_SZ_VENDOR_DATABOOK",
|
||||
"exemplo": "DB-B97-01_S1_VENDOR_DATABOOK"
|
||||
},
|
||||
{
|
||||
"campo": "numero_contrato",
|
||||
"tipo": "texto",
|
||||
"exemplo": "OC 1472739"
|
||||
},
|
||||
{
|
||||
"campo": "data_emissao",
|
||||
"tipo": "data",
|
||||
"formato": "DD/MM/YYYY"
|
||||
},
|
||||
{
|
||||
"campo": "logo_fornecedor",
|
||||
"tipo": "imagem",
|
||||
"dimensoes": "150x75px",
|
||||
"posicao": "rodape"
|
||||
}
|
||||
],
|
||||
"cores": {
|
||||
"cor_primaria": "#1a365d",
|
||||
"cor_secundaria": "#2b6cb0",
|
||||
"cor_texto": "#2d3748"
|
||||
}
|
||||
},
|
||||
|
||||
"2_indice_geral": {
|
||||
"nome": "Índice Geral / Table of Contents",
|
||||
"estrutura": "hierarquica",
|
||||
"niveis_suportados": 3,
|
||||
"campos_editaveis": [
|
||||
{
|
||||
"campo": "titulo_secao",
|
||||
"tipo": "texto_bilingue",
|
||||
"linguas": ["pt", "en"]
|
||||
}
|
||||
],
|
||||
"formato_numeracao": {
|
||||
"nivel_1": "X",
|
||||
"nivel_2": "X.Y",
|
||||
"nivel_3": "X.Y.Z"
|
||||
},
|
||||
"exemplo_estrutura": [
|
||||
"1 - Identificação | Identification",
|
||||
"2 - Materiais | Materials",
|
||||
" 2.1 - Certificados | Certificates",
|
||||
" 2.2 - Consumíveis | Consumables"
|
||||
]
|
||||
},
|
||||
|
||||
"3_divisoras_secao": {
|
||||
"nome": "Capas Divisoras de Seção",
|
||||
"estilos_disponiveis": [
|
||||
{
|
||||
"estilo": "minimalista",
|
||||
"descricao": "Número grande em marca d'água, título centralizado",
|
||||
"uso_recomendado": "Seções principais (1, 2, 3, 4)"
|
||||
},
|
||||
{
|
||||
"estilo": "lateral",
|
||||
"descricao": "Barra colorida lateral com número, título à direita",
|
||||
"uso_recomendado": "Subseções importantes (2.1, 3.1)"
|
||||
},
|
||||
{
|
||||
"estilo": "corporativo",
|
||||
"descricao": "Header com degradê, logo e caixa de informações",
|
||||
"uso_recomendado": "Seções de certificação e conformidade"
|
||||
}
|
||||
],
|
||||
"campos_editaveis": [
|
||||
{
|
||||
"campo": "numero_secao",
|
||||
"tipo": "texto",
|
||||
"exemplo": "2"
|
||||
},
|
||||
{
|
||||
"campo": "titulo_pt",
|
||||
"tipo": "texto",
|
||||
"exemplo": "Materiais"
|
||||
},
|
||||
{
|
||||
"campo": "titulo_en",
|
||||
"tipo": "texto",
|
||||
"exemplo": "Materials"
|
||||
},
|
||||
{
|
||||
"campo": "subtitulo_pt",
|
||||
"tipo": "texto",
|
||||
"opcional": True
|
||||
},
|
||||
{
|
||||
"campo": "icone_secao",
|
||||
"tipo": "emoji_svg",
|
||||
"exemplo": "🔩"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
"4_cabecalho_rodape": {
|
||||
"nome": "Cabeçalhos e Rodapés",
|
||||
"opcoes": [
|
||||
{
|
||||
"tipo": "header_padrao",
|
||||
"elementos": ["logo_mini", "nome_projeto", "numero_documento"]
|
||||
},
|
||||
{
|
||||
"tipo": "footer_padrao",
|
||||
"elementos": ["numero_pagina", "revisao", "data"]
|
||||
}
|
||||
],
|
||||
"altura_header": "60px",
|
||||
"altura_footer": "40px"
|
||||
}
|
||||
},
|
||||
|
||||
"integração_steelbook": {
|
||||
"endpoints_sugeridos": [
|
||||
{
|
||||
"nome": "GET /api/templates",
|
||||
"descricao": "Lista todos os templates disponíveis"
|
||||
},
|
||||
{
|
||||
"nome": "GET /api/templates/:id",
|
||||
"descricao": "Retorna configuração específica de um template"
|
||||
},
|
||||
{
|
||||
"nome": "POST /api/templates",
|
||||
"descricao": "Cria novo template customizado"
|
||||
},
|
||||
{
|
||||
"nome": "PUT /api/templates/:id",
|
||||
"descricao": "Atualiza template existente"
|
||||
},
|
||||
{
|
||||
"nome": "POST /api/databooks/:id/apply-template",
|
||||
"descricao": "Aplica template a um databook"
|
||||
}
|
||||
],
|
||||
|
||||
"estrutura_dados": {
|
||||
"template_config": {
|
||||
"id": "string",
|
||||
"nome": "string",
|
||||
"capa": {
|
||||
"titulo": "string",
|
||||
"subtitulo": "string",
|
||||
"logo_cliente_url": "string",
|
||||
"logo_fornecedor_url": "string",
|
||||
"cores": {
|
||||
"primaria": "hex",
|
||||
"secundaria": "hex"
|
||||
}
|
||||
},
|
||||
"indice": {
|
||||
"bilingue": "boolean",
|
||||
"estrutura": "array"
|
||||
},
|
||||
"divisoras": {
|
||||
"estilo_padrao": "string",
|
||||
"cor_destaque": "hex"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"workflow_uso": [
|
||||
{
|
||||
"passo": 1,
|
||||
"acao": "Usuário acessa 'Gestão de Templates' no SteelBook",
|
||||
"interface": "Lista templates existentes + botão 'Novo Template'"
|
||||
},
|
||||
{
|
||||
"passo": 2,
|
||||
"acao": "Clica 'Novo Template' ou 'Editar' em template existente",
|
||||
"interface": "Abre editor visual (similar ao app criado)"
|
||||
},
|
||||
{
|
||||
"passo": 3,
|
||||
"acao": "Customiza elementos: cores, textos, logos, estrutura",
|
||||
"interface": "Painéis de configuração + preview em tempo real"
|
||||
},
|
||||
{
|
||||
"passo": 4,
|
||||
"acao": "Salva template com nome descritivo",
|
||||
"interface": "Modal de salvamento com campos: nome, descrição, tags"
|
||||
},
|
||||
{
|
||||
"passo": 5,
|
||||
"acao": "Ao criar novo Databook, seleciona template",
|
||||
"interface": "Dropdown de templates na tela de criação"
|
||||
},
|
||||
{
|
||||
"passo": 6,
|
||||
"acao": "Sistema gera estrutura com capas e índices automáticos",
|
||||
"interface": "Databook criado com template aplicado"
|
||||
}
|
||||
],
|
||||
|
||||
"recomendacoes_implementacao": {
|
||||
"armazenamento": "Supabase tabela 'templates' com campos JSON para configurações",
|
||||
"renderizacao": "Server-side com Puppeteer/wkhtmltopdf para gerar PDFs",
|
||||
"preview": "Client-side com React/Vue renderizando HTML dinâmico",
|
||||
"versionamento": "Histórico de revisões de templates",
|
||||
"compartilhamento": "Templates públicos/privados por organização"
|
||||
}
|
||||
}
|
||||
|
||||
# Salvar como JSON
|
||||
import json
|
||||
|
||||
json_output = json.dumps(template_guide, indent=2, ensure_ascii=False)
|
||||
|
||||
print("GUIA DE INTEGRAÇÃO - TEMPLATE DATABOOK")
|
||||
print("=" * 80)
|
||||
print("\n📋 COMPONENTES DO TEMPLATE IDENTIFICADOS:")
|
||||
print("-" * 80)
|
||||
|
||||
for key, comp in template_guide["componentes"].items():
|
||||
print(f"\n{comp['nome'].upper()}")
|
||||
print(f" Campos editáveis: {len(comp['campos_editaveis'])}")
|
||||
|
||||
print("\n\n🔌 INTEGRAÇÃO COM STEELBOOK:")
|
||||
print("-" * 80)
|
||||
print(f"Endpoints sugeridos: {len(template_guide['integração_steelbook']['endpoints_sugeridos'])}")
|
||||
for endpoint in template_guide['integração_steelbook']['endpoints_sugeridos']:
|
||||
print(f" • {endpoint['nome']}: {endpoint['descricao']}")
|
||||
|
||||
print("\n\n📝 WORKFLOW DE USO:")
|
||||
print("-" * 80)
|
||||
for step in template_guide['workflow_uso']:
|
||||
print(f"{step['passo']}. {step['acao']}")
|
||||
|
||||
print("\n\n💡 RECOMENDAÇÕES:")
|
||||
print("-" * 80)
|
||||
for chave, valor in template_guide['recomendacoes_implementacao'].items():
|
||||
print(f" • {chave.title()}: {valor}")
|
||||
|
||||
# Salvar arquivo
|
||||
with open('template_integration_guide.json', 'w', encoding='utf-8') as f:
|
||||
f.write(json_output)
|
||||
|
||||
print("\n\n✅ Arquivo 'template_integration_guide.json' criado com sucesso!")
|
||||
71
estrutura_visual/exported-assets/script_2.py
Normal file
71
estrutura_visual/exported-assets/script_2.py
Normal file
@@ -0,0 +1,71 @@
|
||||
|
||||
# Corrigir o erro e criar o guia
|
||||
|
||||
template_guide = {
|
||||
"metadata": {
|
||||
"nome": "Template SteelBook Databook",
|
||||
"versao": "1.0",
|
||||
"base": "DB-B97-01 (SAIPEM)",
|
||||
"tipo": "Vendor Databook Técnico"
|
||||
},
|
||||
|
||||
"componentes": {
|
||||
"1_capa_frontal": {
|
||||
"nome": "Capa Frontal",
|
||||
"campos_editaveis": [
|
||||
"logo_cliente", "titulo_projeto", "subtitulo", "numero_documento",
|
||||
"numero_contrato", "data_emissao", "logo_fornecedor"
|
||||
]
|
||||
},
|
||||
|
||||
"2_indice_geral": {
|
||||
"nome": "Índice Geral",
|
||||
"campos_editaveis": ["estrutura_secoes", "bilingue"]
|
||||
},
|
||||
|
||||
"3_divisoras_secao": {
|
||||
"nome": "Capas Divisoras",
|
||||
"campos_editaveis": ["numero_secao", "titulo", "estilo"]
|
||||
},
|
||||
|
||||
"4_cabecalho_rodape": {
|
||||
"nome": "Headers e Footers",
|
||||
"campos_editaveis": ["projeto", "documento", "pagina", "revisao"]
|
||||
}
|
||||
},
|
||||
|
||||
"workflow_uso": [
|
||||
"1. Acessar 'Gestão de Templates' no SteelBook",
|
||||
"2. Criar novo template ou editar existente",
|
||||
"3. Customizar cores, logos e estrutura",
|
||||
"4. Salvar template com nome descritivo",
|
||||
"5. Ao criar Databook, selecionar template",
|
||||
"6. Sistema gera estrutura automaticamente"
|
||||
]
|
||||
}
|
||||
|
||||
import json
|
||||
|
||||
json_output = json.dumps(template_guide, indent=2, ensure_ascii=False)
|
||||
|
||||
print("=" * 80)
|
||||
print("GUIA DE INTEGRAÇÃO - TEMPLATE DATABOOK STEELBOOK")
|
||||
print("=" * 80)
|
||||
|
||||
print("\n📋 COMPONENTES DO TEMPLATE:")
|
||||
print("-" * 80)
|
||||
for key, comp in template_guide["componentes"].items():
|
||||
print(f"\n{comp['nome']}")
|
||||
print(f" Campos editáveis: {', '.join(comp['campos_editaveis'])}")
|
||||
|
||||
print("\n\n📝 WORKFLOW DE USO:")
|
||||
print("-" * 80)
|
||||
for step in template_guide['workflow_uso']:
|
||||
print(f" {step}")
|
||||
|
||||
# Salvar arquivo
|
||||
with open('template_integration_guide.json', 'w', encoding='utf-8') as f:
|
||||
f.write(json_output)
|
||||
|
||||
print("\n\n✅ Arquivo JSON criado com sucesso!")
|
||||
print("\n" + "=" * 80)
|
||||
330
estrutura_visual/exported-assets/script_3.py
Normal file
330
estrutura_visual/exported-assets/script_3.py
Normal file
@@ -0,0 +1,330 @@
|
||||
|
||||
# Criar resumo executivo estruturado
|
||||
|
||||
resumo = """
|
||||
╔══════════════════════════════════════════════════════════════════════════════╗
|
||||
║ RESUMO EXECUTIVO - TEMPLATE DATABOOK ║
|
||||
╚══════════════════════════════════════════════════════════════════════════════╝
|
||||
|
||||
📋 OBJETIVO
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
Extrair e preparar template visual do databook DB-B97-01 (SAIPEM) para
|
||||
integração na plataforma SteelBook de gestão de databooks técnicos.
|
||||
|
||||
✅ ENTREGÁVEIS CRIADOS
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
1. 🌐 APLICAÇÃO WEB INTERATIVA
|
||||
• URL de acesso fornecida
|
||||
• Interface visual para explorar templates
|
||||
• Preview em tempo real
|
||||
• Painel de personalização com controles de:
|
||||
- Cores (primária, secundária)
|
||||
- Textos (projeto, cliente, documento)
|
||||
- Idioma (PT/EN/Ambos)
|
||||
• 3 estilos de divisoras de seção
|
||||
• Sistema de navegação entre componentes
|
||||
|
||||
2. 📄 GUIA COMPLETO EM PDF (10 páginas)
|
||||
• Componentes detalhados do template
|
||||
• Paleta de cores e tipografia
|
||||
• Workflow de implementação
|
||||
• Checklist de desenvolvimento
|
||||
• Boas práticas e recomendações
|
||||
• Estrutura de dados JSON
|
||||
• API endpoints sugeridos
|
||||
|
||||
3. 💻 EXEMPLOS DE CÓDIGO (Markdown)
|
||||
• HTML estruturado para cada componente
|
||||
• CSS com variáveis customizáveis
|
||||
• JavaScript para sistema de templates
|
||||
• Integração com Supabase (SQL)
|
||||
• API REST (Node.js/Express)
|
||||
• Geração de PDF com Puppeteer
|
||||
|
||||
4. 📊 GUIA DE INTEGRAÇÃO (JSON)
|
||||
• Estrutura de dados completa
|
||||
• Campos editáveis de cada componente
|
||||
• Workflow de uso
|
||||
• Recomendações de implementação
|
||||
|
||||
🎨 COMPONENTES IDENTIFICADOS
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
┌────────────────────────────────────────────────────────────────────────────┐
|
||||
│ 1. CAPA FRONTAL │
|
||||
├────────────────────────────────────────────────────────────────────────────┤
|
||||
│ • Logo do cliente (topo, 200×100px) │
|
||||
│ • Título do projeto (60px, bold) │
|
||||
│ • Subtítulo (36px) │
|
||||
│ • Número do documento │
|
||||
│ • Número do contrato │
|
||||
│ • Data de emissão │
|
||||
│ • Logo do fornecedor (rodapé, 150×75px) │
|
||||
│ • Background com degradê sutil │
|
||||
└────────────────────────────────────────────────────────────────────────────┘
|
||||
|
||||
┌────────────────────────────────────────────────────────────────────────────┐
|
||||
│ 2. ÍNDICE GERAL / TABLE OF CONTENTS │
|
||||
├────────────────────────────────────────────────────────────────────────────┤
|
||||
│ • Título bilíngue (PT/EN) │
|
||||
│ • Numeração hierárquica (1, 1.1, 1.1.1) │
|
||||
│ • Até 3 níveis de profundidade │
|
||||
│ • Pontos líderes até número de página │
|
||||
│ • Indentação de 20px por nível │
|
||||
│ • Estrutura padrão para databooks técnicos: │
|
||||
│ - 1. Identificação │
|
||||
│ - 2. Materiais (certificados, consumíveis) │
|
||||
│ - 3. Procedimentos de Soldagem (EPS, RQPS, RQS) │
|
||||
│ - 4. Inspeção e Testes (PIT, NDT, Dimensional, Pintura) │
|
||||
│ - 8. Certificados de Conformidade (IRN) │
|
||||
└────────────────────────────────────────────────────────────────────────────┘
|
||||
|
||||
┌────────────────────────────────────────────────────────────────────────────┐
|
||||
│ 3. CAPAS DIVISORAS DE SEÇÃO (3 estilos) │
|
||||
├────────────────────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ A) ESTILO MINIMALISTA │
|
||||
│ • Número gigante como marca d'água (120px, opacidade 20%) │
|
||||
│ • Título centralizado (48px) │
|
||||
│ • Subtítulo bilíngue (24px) │
|
||||
│ • Linha separadora horizontal │
|
||||
│ • Uso: seções principais (1, 2, 3, 4, 8) │
|
||||
│ │
|
||||
│ B) ESTILO LATERAL │
|
||||
│ • Barra colorida lateral (80px largura) │
|
||||
│ • Número na barra (72px, branco) │
|
||||
│ • Título à direita (40px) │
|
||||
│ • Caixa de informações do projeto │
|
||||
│ • Uso: subseções importantes (2.1, 3.1, 4.1) │
|
||||
│ │
|
||||
│ C) ESTILO CORPORATIVO │
|
||||
│ • Header com degradê │
|
||||
│ • Logo do cliente no canto superior │
|
||||
│ • Número + título centralizados │
|
||||
│ • Caixa de informações com borda │
|
||||
│ • Uso: certificação e conformidade │
|
||||
│ │
|
||||
└────────────────────────────────────────────────────────────────────────────┘
|
||||
|
||||
┌────────────────────────────────────────────────────────────────────────────┐
|
||||
│ 4. CABEÇALHOS E RODAPÉS │
|
||||
├────────────────────────────────────────────────────────────────────────────┤
|
||||
│ CABEÇALHO (60px altura): │
|
||||
│ • Esquerda: Logo miniatura (80×40px) │
|
||||
│ • Centro: Nome do projeto (14px) │
|
||||
│ • Direita: Número do documento (12px) │
|
||||
│ • Linha separadora na base │
|
||||
│ │
|
||||
│ RODAPÉ (40px altura): │
|
||||
│ • Esquerda: Revisão (ex: Rev. S2) │
|
||||
│ • Centro: Número da página (grande, bold) │
|
||||
│ • Direita: Data de emissão │
|
||||
│ • Linha separadora no topo │
|
||||
└────────────────────────────────────────────────────────────────────────────┘
|
||||
|
||||
🎨 PALETA DE CORES
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
Primárias:
|
||||
• Azul Escuro: #1a365d ████ (títulos, destaques)
|
||||
• Azul Médio: #2b6cb0 ████ (subtítulos, elementos)
|
||||
• Azul Claro: #4299e1 ████ (acentos, links)
|
||||
|
||||
Neutras:
|
||||
• Cinza Escuro: #2d3748 ████ (texto principal)
|
||||
• Cinza Médio: #718096 ████ (texto secundário)
|
||||
• Cinza Claro: #e2e8f0 ████ (backgrounds)
|
||||
|
||||
🔧 COMO USAR NO STEELBOOK
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
PASSO 1: Acessar Gestão de Templates
|
||||
→ Menu: Configurações → Templates de Databook
|
||||
|
||||
PASSO 2: Criar Novo Template
|
||||
→ Botão "+ Novo Template"
|
||||
→ Nome: ex: "SAIPEM Vendor Databook"
|
||||
→ Descrição e tags
|
||||
|
||||
PASSO 3: Personalizar Elementos
|
||||
→ Upload de logos (cliente e fornecedor)
|
||||
→ Definir cores (primária, secundária)
|
||||
→ Configurar estrutura de seções
|
||||
→ Escolher estilo de divisoras
|
||||
|
||||
PASSO 4: Preview e Teste
|
||||
→ Visualizar cada componente
|
||||
→ Testar com dados de exemplo
|
||||
→ Ajustar conforme necessário
|
||||
|
||||
PASSO 5: Salvar e Usar
|
||||
→ Salvar template
|
||||
→ Ao criar databook, selecionar template
|
||||
→ Sistema gera estrutura automaticamente
|
||||
|
||||
💾 INTEGRAÇÃO TÉCNICA
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
BANCO DE DADOS (Supabase):
|
||||
• Tabela: templates
|
||||
• Campo config: JSONB com toda configuração
|
||||
• Versionamento e histórico de alterações
|
||||
• Permissões por organização/usuário
|
||||
|
||||
API ENDPOINTS:
|
||||
• GET /api/templates → Listar templates
|
||||
• GET /api/templates/:id → Obter template específico
|
||||
• POST /api/templates → Criar novo
|
||||
• PUT /api/templates/:id → Atualizar
|
||||
• POST /api/databooks/:id/apply → Aplicar template
|
||||
|
||||
GERAÇÃO DE PDF:
|
||||
• Puppeteer (Node.js) - recomendado
|
||||
• wkhtmltopdf
|
||||
• WeasyPrint (Python)
|
||||
|
||||
📦 ARQUIVOS FORNECIDOS
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
✓ databook-template.zip → Aplicação web interativa
|
||||
✓ guia-template-databook.pdf → Guia completo (10 páginas)
|
||||
✓ exemplos-codigo-template.md → Código HTML/CSS/JS
|
||||
✓ template_integration_guide.json → Estrutura de dados
|
||||
|
||||
🎯 PRÓXIMOS PASSOS RECOMENDADOS
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
1. ✅ Analisar aplicação web fornecida
|
||||
2. ✅ Revisar guia em PDF
|
||||
3. ✅ Estudar exemplos de código
|
||||
4. 🔄 Adaptar para arquitetura do SteelBook
|
||||
5. 🔄 Implementar CRUD de templates
|
||||
6. 🔄 Criar interface de personalização
|
||||
7. 🔄 Integrar geração de PDF
|
||||
8. 🔄 Testar com databooks reais
|
||||
9. 🔄 Deploy e treinamento de usuários
|
||||
|
||||
╔══════════════════════════════════════════════════════════════════════════════╗
|
||||
║ 🎉 TEMPLATE PRONTO PARA INTEGRAÇÃO NA PLATAFORMA STEELBOOK! 🎉 ║
|
||||
╚══════════════════════════════════════════════════════════════════════════════╝
|
||||
"""
|
||||
|
||||
print(resumo)
|
||||
|
||||
# Criar um arquivo de índice com links
|
||||
indice_arquivos = """
|
||||
# 📁 ÍNDICE DE ARQUIVOS ENTREGUES
|
||||
|
||||
## 1. Aplicação Web Interativa
|
||||
- **Arquivo:** databook-template.zip
|
||||
- **Tipo:** HTML/CSS/JavaScript
|
||||
- **Descrição:** Aplicação web completa com interface visual para explorar e personalizar templates
|
||||
- **Recursos:**
|
||||
- Preview em tempo real de todos os componentes
|
||||
- Painel de personalização (cores, textos, logos)
|
||||
- Navegação entre diferentes tipos de páginas
|
||||
- 3 estilos de divisoras de seção
|
||||
- Sistema de exportação de código
|
||||
|
||||
## 2. Guia Completo em PDF
|
||||
- **Arquivo:** guia-template-databook.pdf
|
||||
- **Páginas:** 10
|
||||
- **Conteúdo:**
|
||||
1. Visão Geral
|
||||
2. Componentes do Template (detalhado)
|
||||
3. Paleta de Cores e Tipografia
|
||||
4. Workflow de Implementação
|
||||
5. Estrutura de Dados JSON
|
||||
6. Integração Técnica
|
||||
7. Boas Práticas
|
||||
8. Checklist de Implementação
|
||||
9. Recursos Adicionais
|
||||
10. Suporte e Próximos Passos
|
||||
|
||||
## 3. Exemplos de Código
|
||||
- **Arquivo:** exemplos-codigo-template.md
|
||||
- **Formato:** Markdown com blocos de código
|
||||
- **Conteúdo:**
|
||||
1. HTML - Capa Frontal
|
||||
2. HTML - Índice Geral
|
||||
3. HTML - Divisoras (3 estilos)
|
||||
4. HTML - Cabeçalhos e Rodapés
|
||||
5. JavaScript - Sistema de Templates
|
||||
6. CSS - Variáveis Customizáveis
|
||||
7. SQL - Estrutura Supabase
|
||||
8. Node.js - API Endpoints
|
||||
9. JavaScript - Geração de PDF com Puppeteer
|
||||
|
||||
## 4. Guia de Integração
|
||||
- **Arquivo:** template_integration_guide.json
|
||||
- **Formato:** JSON estruturado
|
||||
- **Conteúdo:**
|
||||
- Metadata do template
|
||||
- Componentes com campos editáveis
|
||||
- Workflow de uso
|
||||
- Endpoints API
|
||||
- Estrutura de dados
|
||||
|
||||
## 🔗 Links de Acesso
|
||||
|
||||
### Aplicação Web
|
||||
A aplicação web está hospedada e pode ser acessada através do link fornecido acima.
|
||||
Permite visualização interativa de todos os componentes do template.
|
||||
|
||||
### Arquivos para Download
|
||||
Todos os arquivos estão disponíveis para download e podem ser utilizados
|
||||
diretamente na implementação do SteelBook.
|
||||
|
||||
## 📋 Como Utilizar
|
||||
|
||||
### Para Desenvolvedores:
|
||||
1. Baixe todos os arquivos fornecidos
|
||||
2. Estude a aplicação web interativa para entender a estrutura visual
|
||||
3. Use os exemplos de código como base para implementação
|
||||
4. Adapte a estrutura JSON para seu banco de dados
|
||||
5. Implemente os endpoints API conforme sugerido
|
||||
6. Teste a geração de PDF com os templates
|
||||
|
||||
### Para Gestores:
|
||||
1. Acesse a aplicação web para visualizar os templates
|
||||
2. Leia o guia em PDF para entender o workflow
|
||||
3. Compartilhe com equipe de desenvolvimento
|
||||
4. Planeje a integração no roadmap do SteelBook
|
||||
|
||||
### Para Designers:
|
||||
1. Visualize a paleta de cores e tipografia no guia PDF
|
||||
2. Explore os 3 estilos de divisoras na aplicação web
|
||||
3. Customize cores e estilos conforme identidade visual
|
||||
4. Crie variações para diferentes clientes
|
||||
|
||||
## ✅ Checklist de Implementação
|
||||
|
||||
- [ ] Revisar todos os arquivos fornecidos
|
||||
- [ ] Testar aplicação web interativa
|
||||
- [ ] Adaptar estrutura de banco de dados
|
||||
- [ ] Implementar CRUD de templates
|
||||
- [ ] Criar interface de edição visual
|
||||
- [ ] Integrar sistema de geração de PDF
|
||||
- [ ] Testar com dados reais
|
||||
- [ ] Documentar para usuários finais
|
||||
- [ ] Realizar treinamento de equipe
|
||||
- [ ] Deploy em produção
|
||||
|
||||
## 🎯 Resultado Esperado
|
||||
|
||||
Com estes materiais, a equipe do SteelBook terá tudo o necessário para:
|
||||
|
||||
1. **Entender** a estrutura de um databook técnico profissional
|
||||
2. **Visualizar** os componentes através da aplicação interativa
|
||||
3. **Implementar** usando os exemplos de código fornecidos
|
||||
4. **Integrar** seguindo o workflow documentado
|
||||
5. **Personalizar** para diferentes clientes e projetos
|
||||
|
||||
---
|
||||
|
||||
**Data de criação:** Novembro 2024
|
||||
**Versão:** 1.0
|
||||
**Base:** DB-B97-01_S1_VENDOR_DATABOOK (SAIPEM - BUZIOS 7)
|
||||
"""
|
||||
|
||||
with open('indice-arquivos.md', 'w', encoding='utf-8') as f:
|
||||
f.write(indice_arquivos)
|
||||
|
||||
print("\n\n✅ Arquivo 'indice-arquivos.md' criado com sucesso!")
|
||||
@@ -0,0 +1,54 @@
|
||||
{
|
||||
"metadata": {
|
||||
"nome": "Template SteelBook Databook",
|
||||
"versao": "1.0",
|
||||
"base": "DB-B97-01 (SAIPEM)",
|
||||
"tipo": "Vendor Databook Técnico"
|
||||
},
|
||||
"componentes": {
|
||||
"1_capa_frontal": {
|
||||
"nome": "Capa Frontal",
|
||||
"campos_editaveis": [
|
||||
"logo_cliente",
|
||||
"titulo_projeto",
|
||||
"subtitulo",
|
||||
"numero_documento",
|
||||
"numero_contrato",
|
||||
"data_emissao",
|
||||
"logo_fornecedor"
|
||||
]
|
||||
},
|
||||
"2_indice_geral": {
|
||||
"nome": "Índice Geral",
|
||||
"campos_editaveis": [
|
||||
"estrutura_secoes",
|
||||
"bilingue"
|
||||
]
|
||||
},
|
||||
"3_divisoras_secao": {
|
||||
"nome": "Capas Divisoras",
|
||||
"campos_editaveis": [
|
||||
"numero_secao",
|
||||
"titulo",
|
||||
"estilo"
|
||||
]
|
||||
},
|
||||
"4_cabecalho_rodape": {
|
||||
"nome": "Headers e Footers",
|
||||
"campos_editaveis": [
|
||||
"projeto",
|
||||
"documento",
|
||||
"pagina",
|
||||
"revisao"
|
||||
]
|
||||
}
|
||||
},
|
||||
"workflow_uso": [
|
||||
"1. Acessar 'Gestão de Templates' no SteelBook",
|
||||
"2. Criar novo template ou editar existente",
|
||||
"3. Customizar cores, logos e estrutura",
|
||||
"4. Salvar template com nome descritivo",
|
||||
"5. Ao criar Databook, selecionar template",
|
||||
"6. Sistema gera estrutura automaticamente"
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user