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 com
transparê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: +

+ +
+
+ + 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 @@