diff --git a/.github/workflows/deploy-pr-preview.yml b/.github/workflows/deploy-pr-preview.yml
new file mode 100644
index 00000000..4116b361
--- /dev/null
+++ b/.github/workflows/deploy-pr-preview.yml
@@ -0,0 +1,46 @@
+name: Deploy PR previews
+
+on: pull_request
+
+concurrency: preview-${{ github.ref }}
+
+jobs:
+ deploy-preview:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - name: Setup Node
+ uses: actions/setup-node@v4
+ with:
+ node-version: 20
+ - name: Set up php 8.4
+ uses: shivammathur/setup-php@v2
+ with:
+ php-version: 8.4
+ - name: Set up PHP dependencie
+ run: composer i
+ - name: Change config.php
+ run: |
+ sed -i "s|librecode.coop|librecode.github.io|g" CNAME
+ sed -i "s|'baseUrl' => '/'|'baseUrl' => 'https://LibreCodeCoop.github.io/site-preview/pr-preview/pr-${{ github.event.pull_request.number }}/'|g" config.php
+ cat config.php|grep "'baseUrl' => "
+ sed -i "/'matomo_container'/d" config.production.php
+ - name: Run composer command
+ run: composer prod
+
+ - name: Fix asset paths for subdirectory deployment
+ run: |
+ BASE_PATH="/site-preview/pr-preview/pr-${{ github.event.pull_request.number }}"
+ find build_production -type f -name "*.html" -exec sed -i "s|href=\"/assets/|href=\"$BASE_PATH/assets/|g" {} +
+ find build_production -type f -name "*.html" -exec sed -i "s|src=\"/assets/|src=\"$BASE_PATH/assets/|g" {} +
+ find build_production -type f -name "*.css" -exec sed -i "s|url(/assets/|url($BASE_PATH/assets/|g" {} +
+ find build_production -type f -name "*.css" -exec sed -i "s|url(\"/assets/|url(\"$BASE_PATH/assets/|g" {} +
+
+ - name: Deploy preview
+ uses: rossjrw/pr-preview-action@v1
+ with:
+ source-dir: ./build_production/
+ pages-base-url: librecode.github.io/site-preview
+ deploy-repository: LibreCodeCoop/site-preview
+ preview-branch: main
+ token: ${{ secrets.PREVIEW_TOKEN }}
diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml
new file mode 100644
index 00000000..4cfb49bb
--- /dev/null
+++ b/.github/workflows/preview.yml
@@ -0,0 +1,97 @@
+name: Preview
+
+on:
+ pull_request:
+ branches: [ main, develop ]
+ types: [opened, synchronize, reopened]
+
+jobs:
+ build-preview:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: write
+ pull-requests: write
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Setup Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: 20
+ cache: 'npm'
+
+ - name: Setup PHP
+ uses: shivammathur/setup-php@v2
+ with:
+ php-version: 8.4
+ tools: composer
+
+ - name: Install PHP dependencies
+ run: composer install --prefer-dist --no-progress
+
+ - name: Install Node dependencies
+ run: npm ci
+
+ - name: Build site
+ run: npm run prod
+
+ - name: Upload preview artifact
+ uses: actions/upload-artifact@v4
+ with:
+ name: preview-pr-${{ github.event.pull_request.number }}
+ path: build_production/
+ retention-days: 7
+
+ - name: Comment preview URL
+ uses: actions/github-script@v7
+ with:
+ script: |
+ const prNumber = context.issue.number;
+ const runId = context.runId;
+ const artifactUrl = `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${runId}`;
+
+ const { data: comments } = await github.rest.issues.listComments({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ issue_number: prNumber,
+ });
+
+ const botComment = comments.find(comment =>
+ comment.user.type === 'Bot' &&
+ comment.body.includes('Preview do Site')
+ );
+
+ const commentBody = [
+ '## \ud83d\udd0d Preview do Site',
+ '',
+ '\u2705 O preview foi gerado com sucesso!',
+ '',
+ '### Como visualizar:',
+ `1. Acesse a [p\u00e1gina da Action](${artifactUrl})`,
+ '2. Role at\u00e9 a se\u00e7\u00e3o "Artifacts"',
+ `3. Baixe o arquivo \`preview-pr-${prNumber}\``,
+ '4. Descompacte e abra \`index.html\` no navegador',
+ '',
+ '\ud83d\udd04 O preview \u00e9 atualizado automaticamente a cada novo commit neste PR.',
+ '',
+ '---',
+ 'Preview gerado pela GitHub Action \u2022 Artefato dispon\u00edvel por 7 dias '
+ ].join('\n');
+
+ if (botComment) {
+ await github.rest.issues.updateComment({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ comment_id: botComment.id,
+ body: commentBody,
+ });
+ } else {
+ await github.rest.issues.createComment({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ issue_number: prNumber,
+ body: commentBody,
+ });
+ }
diff --git a/README.md b/README.md
index c304d110..75a792bf 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
# [LibreCode](https://librecode.coop) site
-Repositório do site institucional da LibreCode
+Repositório do site institucional da LibreCode.
## Instalação
diff --git a/demo-header.html b/demo-header.html
new file mode 100644
index 00000000..e4671755
--- /dev/null
+++ b/demo-header.html
@@ -0,0 +1,305 @@
+
+
+
+
+ LibreCode - Demo Header
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Tecnologia comtransparência e liberdade
+
Somos uma cooperativa digital de especialistas em desenvolvimento de software livre
+
+
+
+
+
+
+
+
Demonstração do Novo Header
+
+ Esta é uma demonstração do novo header com o botão de call-to-action do WhatsApp.
+ O botão está completamente responsivo e funcional, redimensione a janela para ver
+ as adaptações para diferentes tamanhos de tela.
+
+
+ Melhorias implementadas:
+
+
+ WhatsApp: Botão verde (#25D366) com link direto para iniciar conversa
+ Telegram: Botão azul (#0088cc) com link para o canal da cooperativa
+ Email: Botão vermelho (#e5332a) com link mailto para contato@librecode.coop
+ Efeito hover com elevação e mudança de cor em todos os botões
+ Totalmente responsivo: empilham verticalmente em telas pequenas
+ Ícones e textos bem alinhados com Font Awesome
+ Sombras suaves e animações de transição
+
+
+
+
+
diff --git a/package-lock.json b/package-lock.json
index 28b5422e..9f0df17e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,5 +1,5 @@
{
- "name": "html",
+ "name": "site",
"lockfileVersion": 3,
"requires": true,
"packages": {
@@ -3607,9 +3607,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001620",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001620.tgz",
- "integrity": "sha512-WJvYsOjd1/BYUY6SNGUosK9DUidBPDTnOARHp3fSmFO1ekdxaY6nKRttEVrfMmYi80ctS0kz1wiWmm14fVc3ew==",
+ "version": "1.0.30001760",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001760.tgz",
+ "integrity": "sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==",
"dev": true,
"funding": [
{
@@ -3624,7 +3624,8 @@
"type": "github",
"url": "https://github.com/sponsors/ai"
}
- ]
+ ],
+ "license": "CC-BY-4.0"
},
"node_modules/chalk": {
"version": "4.1.2",
diff --git a/source/_assets/sass/main.scss b/source/_assets/sass/main.scss
index cdbf6851..514ad8b5 100644
--- a/source/_assets/sass/main.scss
+++ b/source/_assets/sass/main.scss
@@ -125,7 +125,7 @@ h6 {
z-index: 997;
transition: all 0.5s;
padding: 20px 0;
- background: #fff;
+ background: #f3f0ff; /* Lilás claro para melhor contraste */
box-shadow: 0px 0px 30px rgba(127, 137, 161, 0.3);
}
@@ -249,20 +249,26 @@ h6 {
}
#intro .intro-info p {
- color: #e5332a;;
+ color: #333;
text-align: left;
- font-size: 25px;
+ font-size: 18px;
+ font-family: "Montserrat", sans-serif;
+ line-height: 1.6;
}
#intro .intro-info h2 {
- padding: 20px;
- font-size: 70px;
+ padding: 10px 0;
+ font-size: 42px;
text-align: left;
+ font-family: "Montserrat", sans-serif;
+ line-height: 1.3;
+ margin-bottom: 15px;
}
#intro .intro-info h3 {
text-align: left;
font-size: 60px;
+ font-family: "Montserrat", sans-serif;
}
#intro .intro-info h2 span {
@@ -309,6 +315,288 @@ h6 {
color: #fff;
}
+/* Contact CTA Buttons */
+#intro .intro-cta {
+ margin-top: 35px;
+ text-align: left;
+ display: flex;
+ flex-wrap: wrap;
+ gap: 15px;
+}
+
+#intro .intro-cta .btn-primary {
+ background: #e5332a;
+ border-color: #e5332a;
+ color: #fff;
+}
+
+#intro .intro-cta .btn-primary:hover {
+ background: #c72b23;
+ border-color: #c72b23;
+ color: #fff;
+}
+
+#intro .intro-cta .btn-outline-primary {
+ background: transparent;
+ border: 2px solid #e5332a;
+ color: #e5332a;
+}
+
+#intro .intro-cta .btn-outline-primary:hover {
+ background: #e5332a;
+ border-color: #e5332a;
+ color: #fff;
+}
+
+/* Intro Badge */
+#intro .intro-badge {
+ display: inline-flex;
+ align-items: center;
+ gap: 8px;
+ background: rgba(229, 51, 42, 0.1);
+ color: #e5332a;
+ padding: 8px 16px;
+ border-radius: 20px;
+ font-size: 14px;
+ font-weight: 600;
+}
+
+/* Intro Features List */
+#intro .intro-features {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+
+#intro .intro-features li {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ margin-bottom: 15px;
+ font-size: 16px;
+ color: #333;
+}
+
+#intro .intro-features li i {
+ color: #e5332a;
+ font-size: 20px;
+}
+
+/* Intro Boxes (Right Side) */
+#intro .intro-boxes {
+ padding-left: 20px;
+}
+
+#intro .intro-box {
+ display: flex;
+ align-items: flex-start;
+ gap: 20px;
+ background: #fff;
+ padding: 25px;
+ border-radius: 12px;
+ border: 1px solid rgba(0, 0, 0, 0.08);
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
+ transition: all 0.3s ease;
+}
+
+#intro .intro-box:hover {
+ transform: translateY(-3px);
+ box-shadow: 0 6px 16px rgba(229, 51, 42, 0.15);
+}
+
+#intro .intro-box-icon {
+ flex-shrink: 0;
+ width: 60px;
+ height: 60px;
+ background: #e5332a;
+ border-radius: 12px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: #fff;
+ font-size: 24px;
+}
+
+#intro .intro-box-content h4 {
+ margin: 0 0 8px 0;
+ font-size: 18px;
+ font-weight: 600;
+ color: #333;
+}
+
+#intro .intro-box-content p {
+ margin: 0;
+ font-size: 14px;
+ color: #666;
+ line-height: 1.5;
+}
+
+/* Intro Stats */
+#intro .intro-stats {
+ background: #fff;
+ padding: 20px;
+ border-radius: 12px;
+ border: 1px solid rgba(0, 0, 0, 0.08);
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
+}
+
+#intro .stat-box {
+ text-align: center;
+}
+
+#intro .stat-box h3 {
+ font-size: 32px;
+ font-weight: 700;
+ color: #e5332a;
+ margin: 0 0 5px 0;
+}
+
+#intro .stat-box p {
+ font-size: 14px;
+ color: #666;
+ margin: 0;
+}
+
+/* Lead Capture Form */
+#intro .intro-lead-form {
+ border-top: 1px solid rgba(0, 0, 0, 0.1);
+}
+
+#intro .lead-form-title {
+ font-size: 14px;
+ font-weight: 600;
+ color: #333;
+ margin-bottom: 12px;
+}
+
+#intro .lead-form .form-group-inline {
+ display: flex;
+ gap: 12px;
+ flex-wrap: wrap;
+}
+
+#intro .lead-form .form-control {
+ flex: 1;
+ min-width: 250px;
+ padding: 12px 16px;
+ border: 1px solid #ddd;
+ border-radius: 8px;
+ font-size: 14px;
+ transition: all 0.3s ease;
+}
+
+#intro .lead-form .form-control:focus {
+ outline: none;
+ border-color: #e5332a;
+ box-shadow: 0 0 0 3px rgba(229, 51, 42, 0.1);
+}
+
+#intro .lead-form .btn-primary {
+ padding: 12px 24px;
+ border-radius: 8px;
+ font-weight: 600;
+ background: #e5332a;
+ border-color: #e5332a;
+ color: #fff;
+ transition: all 0.3s ease;
+}
+
+#intro .lead-form .btn-primary:hover {
+ background: #c72b23;
+ border-color: #c72b23;
+ color: #fff;
+ transform: translateY(-1px);
+ box-shadow: 0 4px 12px rgba(229, 51, 42, 0.3);
+}
+
+#intro .lead-form-note {
+ font-size: 13px;
+ color: #666;
+ margin-top: 10px;
+ margin-bottom: 0;
+}
+
+#intro .btn-contact {
+ display: inline-flex;
+ align-items: center;
+ gap: 10px;
+ font-family: "Montserrat", sans-serif;
+ font-size: 16px;
+ font-weight: 600;
+ letter-spacing: 0.5px;
+ padding: 14px 32px;
+ color: #fff;
+ border: 2px solid;
+ border-radius: 50px;
+ text-decoration: none;
+ transition: all 0.3s ease;
+}
+
+#intro .btn-contact:hover {
+ color: #fff;
+ transform: translateY(-2px);
+ text-decoration: none;
+}
+
+#intro .btn-contact:active {
+ transform: translateY(0);
+}
+
+#intro .btn-contact i {
+ font-size: 20px;
+}
+
+/* WhatsApp Button */
+#intro .btn-whatsapp {
+ background: #e5332a;
+ border-color: #e5332a;
+ box-shadow: 0 4px 15px rgba(229, 51, 42, 0.3);
+}
+
+#intro .btn-whatsapp:hover {
+ background: #c72b23;
+ border-color: #c72b23;
+ box-shadow: 0 6px 20px rgba(229, 51, 42, 0.4);
+}
+
+#intro .btn-whatsapp:active {
+ box-shadow: 0 2px 10px rgba(229, 51, 42, 0.3);
+}
+
+/* Telegram Button */
+#intro .btn-telegram {
+ background: #e5332a;
+ border-color: #e5332a;
+ box-shadow: 0 4px 15px rgba(229, 51, 42, 0.3);
+}
+
+#intro .btn-telegram:hover {
+ background: #c72b23;
+ border-color: #c72b23;
+ box-shadow: 0 6px 20px rgba(229, 51, 42, 0.4);
+}
+
+#intro .btn-telegram:active {
+ box-shadow: 0 2px 10px rgba(229, 51, 42, 0.3);
+}
+
+/* Email Button */
+#intro .btn-email {
+ background: #e5332a;
+ border-color: #e5332a;
+ box-shadow: 0 4px 15px rgba(229, 51, 42, 0.3);
+}
+
+#intro .btn-email:hover {
+ background: #c72b23;
+ border-color: #c72b23;
+ box-shadow: 0 6px 20px rgba(229, 51, 42, 0.4);
+}
+
+#intro .btn-email:active {
+ box-shadow: 0 2px 10px rgba(229, 51, 42, 0.3);
+}
+
/*--------------------------------------------------------------
# Navigation Menu
--------------------------------------------------------------*/
@@ -811,34 +1099,98 @@ h6 {
margin-right: 115px;
}
+/* Diferenciais Section
+--------------------------------*/
+
+#diferenciais {
+ padding: 60px 0;
+}
+
+#diferenciais .section-header h3 {
+ color: #333;
+}
+
+#diferenciais .section-header p {
+ color: #666;
+}
+
+#diferenciais .diferencial-box {
+ text-align: center;
+ padding: 30px 20px;
+ background: #fff;
+ border-radius: 12px;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
+ transition: all 0.3s ease;
+ height: 100%;
+}
+
+#diferenciais .diferencial-box:hover {
+ transform: translateY(-5px);
+ box-shadow: 0 8px 20px rgba(229, 51, 42, 0.15);
+}
+
+#diferenciais .diferencial-icon {
+ margin-bottom: 20px;
+ transition: all 0.3s ease;
+}
+
+#diferenciais .diferencial-box:hover .diferencial-icon i {
+ transform: scale(1.1);
+}
+
+#diferenciais .diferencial-box h4 {
+ font-size: 18px;
+ font-weight: 600;
+ margin-bottom: 15px;
+ color: #333;
+}
+
+#diferenciais .diferencial-box p {
+ font-size: 14px;
+ line-height: 1.6;
+ color: #666;
+ margin-bottom: 0;
+}
+
#why-us {
padding: 60px 0;
- background: #e5332a;;;
+ background: #f8f9fa;
}
#why-us p {
color: #444;
}
-#why-us .section-header h3,
+#why-us .section-header h3 {
+ color: #333;
+}
+
#why-us .section-header p {
- color: #fff;
+ color: #666;
+}
+
+#why-us h4 {
+ color: #333;
+ font-weight: 600;
}
#why-us .card {
- border-color: rgb(197, 212, 245);
- border-radius: 10px;
+ background: #fff;
+ border: 1px solid #e0e0e0;
+ border-radius: 12px;
margin: 0 15px;
padding: 15px 0;
text-align: center;
- color: #fff;
- transition: 0.3s ease-in-out;
+ color: #333;
+ transition: all 0.3s ease-in-out;
height: 100%;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
}
#why-us .card:hover {
- background: white;
- border-color: white;
+ transform: translateY(-5px);
+ box-shadow: 0 8px 20px rgba(229, 51, 42, 0.15);
+ border-color: #e5332a;
}
#why-us .card i {
@@ -854,6 +1206,49 @@ h6 {
#why-us .card h5 {
font-size: 22px;
font-weight: 600;
+ color: #333;
+}
+
+#why-us .card p {
+ color: #555;
+ line-height: 1.6;
+}
+
+#why-us .btn-secondary {
+ background-color: #e5332a;
+ border-color: #e5332a;
+ color: #fff;
+ font-weight: 600;
+ transition: all 0.3s ease;
+}
+
+#why-us .btn-secondary:hover {
+ background-color: #c72a23;
+ border-color: #c72a23;
+ color: #fff;
+ transform: translateY(-2px);
+ box-shadow: 0 4px 12px rgba(229, 51, 42, 0.3);
+}
+
+#why-us .btn-primary {
+ background-color: #e5332a;
+ border-color: #e5332a;
+ color: #fff;
+ font-weight: 600;
+ padding: 12px 40px;
+ transition: all 0.3s ease;
+}
+
+#why-us .btn-primary:hover {
+ background-color: #c72a23;
+ border-color: #c72a23;
+ color: #fff;
+ transform: translateY(-2px);
+ box-shadow: 0 6px 16px rgba(229, 51, 42, 0.4);
+}
+
+#why-us .text-muted {
+ color: #666 !important;
}
#why-us .card .readmore {
@@ -1634,6 +2029,15 @@ h6 {
font-size: 20px;
}
+ #intro .btn-contact {
+ font-size: 14px;
+ padding: 12px 24px;
+ }
+
+ #intro .btn-contact i {
+ font-size: 18px;
+ }
+
.section-header p {
width: 100%;
}
@@ -1658,6 +2062,24 @@ h6 {
#intro {
padding: 100px 0 20px 0;
}
+
+ #intro .intro-cta {
+ flex-direction: column;
+ align-items: center;
+ }
+
+ #intro .btn-contact {
+ font-size: 14px;
+ padding: 12px 28px;
+ width: 100%;
+ max-width: 280px;
+ justify-content: center;
+ }
+
+ #intro .btn-contact i {
+ font-size: 18px;
+ }
+
.products img{
max-width: 350px;
}
diff --git a/source/_layouts/header.blade.php b/source/_layouts/header.blade.php
index 15db01b7..f2df7d64 100644
--- a/source/_layouts/header.blade.php
+++ b/source/_layouts/header.blade.php
@@ -1,7 +1,7 @@