Skip to main content

Plano mensal da adesão DPM

Junte-se à maior e mais determinada comunidade de profissionais de projetos digitais do mundo e comece a superar as expectativas na era da AI por apenas $24.99 USD / mês.

Ou, poupe mais de 25% com o nosso plano anual.

Os membros DPM mantêm-se à frente da concorrência com:

  • A nossa comunidade Slack dinâmica e solidária
  • A nossa programação regular de sessões de aprendizagem ao vivo
  • Mais de 90 minicursos e webinars gravados
  • Mais de 100 modelos e recursos
  • Grupos de mentoria entre pares
  • 25% de desconto no nosso programa de certificação aprovado pelo PMI

Vai inscrever uma equipa?

Alinhe as suas equipas e poupe até 40% através do nosso programa de desenvolvimento de equipas
.page-id-110718 { background-color: var(--color-background-light) !important; } .page-id-110718 .mp_wrapper { margin: 0 !important; padding: 0 !important; } .page-id-110718 .mepr-form { margin: 0 !important; } .page-id-110718 .special-title { font-size: var(--font-size-heading-small) !important; font-weight: var(--font-weight-semibold) !important; } .page-id-110718 .price-highlight { margin-top: 20px !important; font-size: 16px !important; display: flex; justify-content: space-between; gap: var(--spacer-20); padding: var(--spacer-20) !important; background: var(--color-white); border-radius: var(--border-radius-media); } .page-id-110718 .mepr-transaction-invoice-wrapper { padding-top: 0 !important; } .page-id-110718 .special-form .wp-block-list { padding-left: 24px !important; } @media (min-width: 768px) { .page-id-110718 .special-form .wp-block-list { padding-left: 4px !important; } } .page-id-110718 .site-header__search-wrap, .page-id-110718 .site-header__button, .page-id-110718 .site-header__navigation-wrap, .page-id-110718 .site-header__utility-nav, .page-id-110718 .membership-navigation, .page-id-110718 .site-header__scroll-nav-cta-wrapper, .page-id-110718 footer { display: none !important; } .page-id-110718 .site-header__logo-wrap { padding-top: 0; } .page-id-110718 [data-js=site-wrap] { margin-top: 0 !important; } @media (min-width: 768px) { .page-id-110718 .special-title { font-size: 24px !important; font-weight: var(--font-weight-semibold) !important; margin-bottom: var(--spacer-30) !important; } .page-id-110718 .special-form p, .page-id-110718 .special-form li { font-size: 16px; margin-bottom: var(--spacer-20); } .page-id-110718 .special-form ul { margin-top: var(--spacer-20); margin-bottom: var(--spacer-20); } .page-id-110718 .special-form li { margin-left: var(--spacer-20); } .page-id-110718 .site-header__logo-wrap { padding-top: 15px !important; } .page-id-110718 .l-sink>.wp-block-group { padding-top: 90px !important; padding-bottom: 90px !important; } } @media (min-width: 1200px) { .page-id-110718.scroll-down .site-header { padding-top: 0 !important; padding-bottom: 0 !important; } } .mp_wrapper { padding: 0 !important; margin: 0 !important; } @media (min-width: 960px) { .b-columns__grid--2-cols { grid-template-columns: 0.43fr 0.57fr !important; grid-column-gap: var(--spacer-70) !important; } } .form-steps-nav { margin-bottom: 48px; } .form-steps-nav ul { display: flex; justify-content: space-evenly; align-items: start; list-style: none; padding: 0; margin: 0; gap: 0; position: relative; padding-left: 0 !important; } /* Linha entre passos */ .form-steps-nav ul::before { content: ''; position: absolute; top: 15px; /* Alinhar com o centro dos círculos */ left: 50%; transform: translateX(-50%); width: 100%; height: 1px; background: #E5E7EB; z-index: 0; } .form-steps-nav li { display: flex; flex-direction: column; align-items: center; gap: 8px; color: var(--color-neutral-90); font-size: 14px; font-weight: 500; z-index: 1; width: 120px; /* Largura fixa para um espaçamento uniforme */ text-align: center; } /* Círculos numerados */ .form-steps-nav li::before { content: attr(data-step); width: 30px; height: 30px; border-radius: 8px; background: #fff; border: 2px solid var(--color-neutral-90); display: flex; align-items: center; justify-content: center; font-weight: 600; font-size: 16px; margin-bottom: 4px; } /* Estado ativo */ .form-steps-nav li.active::before { background: var(--color-primary); border-color: var(--color-primary); color: white; } .form-steps-nav li.active { color: var(--color-neutral-90); font-weight: 700; } /* Ajustes responsivos */ @media (max-width: 768px) { .step-1, .step-2 .mp-form-row:has([type="password"]) { grid-template-columns: 1fr; } .form-steps-nav ul { } .form-steps-nav ul::before { top: 22px; } .form-steps-nav li { font-size: 12px; padding: 6px 12px; } } /* Classes de funcionalidade essenciais dos passos */ .form-steps-wrapper { position: relative; min-height: 300px; } .form-step { display: none; opacity: 0; transition: opacity 0.3s ease; width:100%; margin: 0 auto; } .form-step.active { display: block; opacity: 1; } .form-steps-navigation { margin-top: 40px; } .nav-buttons { display: flex; justify-content: space-between; gap: 16px; } .prev-btn, .next-btn, input[type="submit"] { padding: 12px 32px; border: none; border-radius: 24px; cursor: pointer; font-weight: 500; font-size: 16px; transition: all 0.2s ease; } .prev-btn { background: transparent; border: 1px solid var(--color-primary); color: var(--color-primary); } .next-btn, input[type="submit"] { background: var(--color-primary); color: white; margin-left: auto; } .prev-btn:hover, .next-btn:hover, input[type="submit"]:hover { opacity: 0.9; transform: translateY(-1px); } /* Estilo dos campos do formulário */ .mp-form-row { margin-bottom: 24px; } .mp-form-label { display: block; margin-bottom: 8px; font-weight: 500; } .mepr-form-input { width: 100%; padding: 12px; border: 1px solid #e1e1e1; border-radius: 8px; font-size: 16px; } input.invalid { border-color: #ff3d5b !important; } .validation-error { color: #ff3d5b; font-size: 14px; margin-top: 4px; } /* Estilo da ligação do cupão */ .have-coupon-link { color: var(--color-primary); text-decoration: none; font-weight: 500; display: inline-block; margin-top: 16px; } /* Disposição em duas colunas para o primeiro passo */ .step-1.active { display: grid; grid-template-columns: 1fr; gap: 24px; row-gap: 0; @media (min-width: 960px) { grid-template-columns: 1fr 1fr; } } .mp_invoice .mp-table thead { display: none !important; } .mp_invoice { background: var(--color-neutral-0); padding: 16px !important; border-radius: 8px; overflow: hidden; } .mp_invoice .mp-table, .mp_invoice .mp-table * { background: var(--color-neutral-0); border: 0 !important; font-size: 16px !important; } .mp_invoice .mp-table { padding: 0 !important; margin: 0 !important; } .price-highlight .mepr-invoice-loader { display: none !important; } document.addEventListener('DOMContentLoaded', function() { // Aguardar que o DOM e o Stripe estejam prontos const waitForStripe = new Promise((resolve) => { if (window.MeprStripeGateway) { resolve(); } else { // Aguardar que o Stripe seja inicializado const stripeCheck = setInterval(() => { if (window.MeprStripeGateway) { clearInterval(stripeCheck); resolve(); } }, 100); } }); waitForStripe.then(() => { initializeMultiStepForm(); }); function initializeMultiStepForm() { const form = document.querySelector('.mepr-signup-form'); if (!form) return; // Ocultar inicialmente o formulário enquanto o configuramos form.style.display = 'none'; // Guardar o botão de envio original antes de qualquer manipulação const originalSubmitBtn = form.querySelector('input[type="submit"]'); const submitBtnValue = originalSubmitBtn ? originalSubmitBtn.value : 'Enviar'; const submitBtnClasses = originalSubmitBtn ? originalSubmitBtn.className : ''; // Remover qualquer navegação existente const existingNav = document.querySelector('.form-steps-nav'); if (existingNav) existingNav.remove(); // Criar a navegação das etapas const stepsNav = document.createElement('div'); stepsNav.className = 'form-steps-nav'; stepsNav.innerHTML = `
  • Informações pessoais
  • Dados de início de sessão
  • Pagamento
`; form.parentNode.insertBefore(stepsNav, form); // Criar contentores para cada etapa const formSteps = document.createElement('div'); formSteps.className = 'form-steps-wrapper'; const step1 = document.createElement('div'); step1.className = 'form-step step-1 active'; const step2 = document.createElement('div'); step2.className = 'form-step step-2'; const step3 = document.createElement('div'); step3.className = 'form-step step-3'; // Criar um novo botão de envio com as propriedades originais const submitBtn = document.createElement('input'); submitBtn.type = 'submit'; submitBtn.value = submitBtnValue; submitBtn.className = submitBtnClasses + ' next-btn'; submitBtn.style.display = 'none'; // Guardar referências aos campos de e-mail e nome de utilizador antes de os mover const emailInput = form.querySelector('[name="user_email"]'); const usernameInput = form.querySelector('[name="user_login"]'); // Mover a lógica de sincronização do e-mail para cima, antes de mover os campos if (emailInput && usernameInput) { // Ocultar todo o contentor do nome de utilizador const usernameContainer = usernameInput.closest('.mp-form-row'); if (usernameContainer) { usernameContainer.style.display = 'none'; } // Atualizar o nome de utilizador quando o e-mail for alterado (ao introduzir dados e ao perder o foco) emailInput.addEventListener('input', (e) => { usernameInput.value = e.target.value; }); emailInput.addEventListener('blur', (e) => { usernameInput.value = e.target.value; }); } // Mover os campos para os respetivos contentores const personalFields = form.querySelectorAll([ '[id*="user_first_name"]', '[id*="user_last_name"]', '[id*="mepr-address-one"]', '[id*="mepr-address-two"]', '[id*="mepr-address-city"]', '[id*="mepr-address-country"]', '[id*="mepr-address-state"]', '[id*="mepr-address-zip"]' ].join(',')); const paymentFields = form.querySelectorAll([ '.mepr-transaction-invoice-wrapper', '.mepr-payment-methods-wrapper', '.have-coupon-link', '.mp-form-row.mepr_coupon', '.mp-form-row.mepr_tos' ].join(',')); const accountFields = form.querySelectorAll([ '[name="user_email"]', '[name="mepr_user_password"]', '[name="mepr_user_password_confirm"]', '[name="user_login"]' ].join(',')); // Mover os campos para os respetivos contentores personalFields.forEach(field => { const row = field.closest('.mp-form-row'); if (row) step1.appendChild(row); }); accountFields.forEach(field => { const row = field.closest('.mp-form-row'); if (row) step2.appendChild(row); }); paymentFields.forEach(field => { step3.appendChild(field); }); // Ocultar a tabela de preços const pricingNewPosition = document.querySelector('.price-highlight'); const pricingTable = step3.querySelector('.mepr-transaction-invoice-wrapper'); console.log(pricingTable); if (pricingTable) { const clonedPricingTable = pricingTable.cloneNode(true); pricingNewPosition.appendChild(clonedPricingTable); pricingTable.style.display = 'none'; const observer = new MutationObserver(() => { clonedPricingTable.innerHTML = pricingTable.innerHTML; }); observer.observe(pricingTable, { childList: true, // Observar alterações nos elementos secundários subtree: true, // Observar alterações mais profundas na árvore DOM attributes: true, // Observar alterações nos atributos }); } // Adicionar as etapas ao formulário pela ordem correta formSteps.appendChild(step1); // Informações pessoais formSteps.appendChild(step2); // Dados de início de sessão formSteps.appendChild(step3); // Pagamento // Limpar o conteúdo original do formulário, exceto os campos ocultos const hiddenFields = Array.from(form.querySelectorAll('input[type="hidden"]')); form.innerHTML = ''; hiddenFields.forEach(field => form.appendChild(field)); form.appendChild(formSteps); // Criar os botões de navegação const navigation = document.createElement('div'); navigation.className = 'form-steps-navigation'; const navButtons = document.createElement('div'); navButtons.className = 'nav-buttons'; navButtons.innerHTML = ` `; navButtons.appendChild(submitBtn); navigation.appendChild(navButtons); form.appendChild(navigation); // Funcionalidade de navegação let currentStep = 1; const prevBtn = navigation.querySelector('.prev-btn'); const nextBtn = navigation.querySelector('.next-btn'); function validateStep(step) { const currentStepElement = form.querySelector(`.step-${step}`); const requiredFields = currentStepElement.querySelectorAll('.mepr-form-input:required, .mp-form-row.required input:not([type="hidden"]), .mp-form-row.required select'); let isValid = true; requiredFields.forEach(field => { if (!field.value.trim()) { isValid = false; field.classList.add('invalid'); const row = field.closest('.mp-form-row'); if (row && !row.querySelector('.validation-error')) { const error = document.createElement('div'); error.className = 'validation-error'; error.textContent = 'Este campo é obrigatório'; row.appendChild(error); } } else { field.classList.remove('invalid'); const row = field.closest('.mp-form-row'); const error = row?.querySelector('.validation-error'); if (error) error.remove(); } }); return isValid; } function updateNavigation() { prevBtn.style.display = currentStep === 1 ? 'none' : 'block'; const submitBtn = navigation.querySelector('input[type="submit"]'); // Na última etapa, ocultar o botão seguinte e mostrar o botão de envio if (currentStep === 3) { nextBtn.style.display = 'none'; if (submitBtn) { submitBtn.style.display = 'inline-block'; } } else { nextBtn.style.display = 'block'; if (submitBtn) { submitBtn.style.display = 'none'; } } document.querySelector('#register').scrollIntoView(); // Atualizar a navegação das etapas document.querySelectorAll('.form-steps-nav li').forEach(li => { li.classList.remove('active'); if (parseInt(li.dataset.step) === currentStep) { li.classList.add('active'); } }); } function showStep(step) { document.querySelectorAll('.form-step').forEach(s => { s.classList.remove('active'); }); document.querySelector(`.step-${step}`).classList.add('active'); currentStep = step; updateNavigation(); } prevBtn.addEventListener('click', () => { if (currentStep > 1) { showStep(currentStep - 1); } }); nextBtn.addEventListener('click', () => { if (validateStep(currentStep)) { if (currentStep < 3) { showStep(currentStep + 1); } } }); // Mostrar o formulário depois da configuração form.style.display = 'block'; // Adicionar isto depois da inicialização do formulário form.addEventListener('keypress', function(e) { if (e.key === 'Enter') { e.preventDefault(); return false; } }); } });