{"id":2602,"date":"2026-06-16T13:12:50","date_gmt":"2026-06-16T13:12:50","guid":{"rendered":"https:\/\/app.digitalfreelancer.org\/?page_id=2602"},"modified":"2026-06-22T18:08:06","modified_gmt":"2026-06-22T18:08:06","slug":"dashboard-produtividade","status":"publish","type":"page","link":"https:\/\/app.digitalfreelancer.org\/index.php\/dashboard-produtividade\/","title":{"rendered":"Dashboard Produtividade+"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"2602\" class=\"elementor elementor-2602\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d4e6e79 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-parent\" data-id=\"d4e6e79\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c0d3ae9 elementor-widget elementor-widget-shortcode\" data-id=\"c0d3ae9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">        <div id=\"prd-1-AxYLz7\" class=\"prod-wrap\">\n                    <style>\n        #prd-1-AxYLz7 {\n            --pr-bg: #ffffff;\n            --pr-card-bg: #ffffff;\n            --pr-text: #222222;\n            --pr-muted: #555555;\n            --pr-border: #eee;\n            --pr-primary: #ff6a00;\n            --pr-primary-hover: #ff8124;\n            --pr-light-hover: #fff3e8;\n            all: initial;\n            * { box-sizing: border-box; }\n            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n            color: var(--pr-text);\n            background: var(--pr-bg);\n            display: block;\n            padding: 24px;\n            border-radius: 20px;\n            box-shadow: 0 10px 30px rgba(0,0,0,0.06);\n            animation: prFadeIn 0.5s ease-in-out;\n            max-width: 1280px;\n            margin: 0 auto;\n        }\n\n        #prd-1-AxYLz7 button, \n        #prd-1-AxYLz7 input,\n        #prd-1-AxYLz7 select, \n        #prd-1-AxYLz7 textarea {\n            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n            font-size: 14px;\n            color: var(--pr-text);\n            outline: none;\n        }\n\n        @keyframes prFadeIn {\n            from { opacity: 0; transform: translateY(10px); }\n            to { opacity: 1; transform: translateY(0); }\n        }\n\n        \/* HEADER *\/\n        #prd-1-AxYLz7 .prod-header {\n            display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; flex-wrap: wrap; gap: 12px;\n        }\n        #prd-1-AxYLz7 .prod-header h2 { margin: 0; color: var(--pr-primary); font-size: 26px; }\n        #prd-1-AxYLz7 .prod-header p { color: var(--pr-muted); margin: 4px 0 0 0; font-size: 14px; }\n\n        \/* STATS GRID *\/\n        #prd-1-AxYLz7 .prod-stats {\n            display: grid; grid-template-columns: repeat(4, 1fr); gap: 15px; margin: 20px 0;\n        }\n\n        \/* MAIN & BOTTOM GRIDS *\/\n        #prd-1-AxYLz7 .prod-grid {\n            display: grid; grid-template-columns: 2fr 1fr 1fr; gap: 15px;\n        }\n        #prd-1-AxYLz7 .prod-bottom {\n            display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 15px; margin-top: 15px;\n        }\n\n        \/* CARDS *\/\n        #prd-1-AxYLz7 .prod-card {\n            background: var(--pr-card-bg); border: 1px solid var(--pr-border); border-radius: 14px;\n            padding: 18px; box-shadow: 0 4px 12px rgba(0,0,0,0.04); transition: 0.25s ease;\n            display: flex; flex-direction: column; justify-content: space-between; position: relative; overflow: hidden;\n        }\n        #prd-1-AxYLz7 .prod-card:hover {\n            transform: translateY(-4px); box-shadow: 0 10px 25px rgba(255,106,0,0.12);\n        }\n        #prd-1-AxYLz7 .prod-card h3 {\n            margin-top: 0; color: var(--pr-text); font-size: 16px; display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px;\n        }\n\n        \/* STAT CARDS *\/\n        #prd-1-AxYLz7 .prod-card.stat {\n            text-align: center; border-left: 4px solid var(--pr-primary); display: block;\n        }\n        #prd-1-AxYLz7 .prod-card.stat h3 { font-size: 13px; color: var(--pr-muted); justify-content: center; margin-bottom: 6px; }\n        #prd-1-AxYLz7 .prod-card.stat strong { font-size: 24px; color: var(--pr-primary); }\n\n        \/* BUTTONS *\/\n        #prd-1-AxYLz7 button {\n            width: 100%; margin-top: 10px; padding: 11px; border: none; border-radius: 10px;\n            background: var(--pr-primary); color: white; cursor: pointer; transition: 0.2s; font-weight: bold; text-align: center;\n        }\n        #prd-1-AxYLz7 button:hover {\n            background: var(--pr-primary-hover); transform: scale(1.02); filter: brightness(1.05);\n        }\n        #prd-1-AxYLz7 button.secondary { background: #eee; color: #333; }\n        #prd-1-AxYLz7 button.secondary:hover { background: #ddd; }\n        #prd-1-AxYLz7 .pr-btn-small { padding: 4px 8px; font-size: 11px; width: auto; margin: 0; }\n\n        \/* TASKS *\/\n        #prd-1-AxYLz7 .pr-task-container { max-height: 220px; overflow-y: auto; padding-right: 4px; margin-bottom: 8px; }\n        #prd-1-AxYLz7 .task {\n            display: flex; align-items: center; justify-content: space-between; padding: 8px 10px; border-radius: 8px; transition: 0.2s; cursor: pointer; margin-bottom: 4px; background: #fafafa; border: 1px solid #f1f1f1;\n        }\n        #prd-1-AxYLz7 .task:hover { background: var(--pr-light-hover); transform: translateX(3px); }\n        #prd-1-AxYLz7 .task-left { display: flex; align-items: center; gap: 8px; }\n        #prd-1-AxYLz7 .task input[type=\"checkbox\"] { width: auto; cursor: pointer; margin: 0; }\n        #prd-1-AxYLz7 .task.completed span { text-decoration: line-through; color: #888; }\n        #prd-1-AxYLz7 .pr-task-delete { background: transparent; border: none; color: #cc0000; cursor: pointer; font-size: 12px; padding: 2px 6px; width: auto; margin: 0; }\n        #prd-1-AxYLz7 .pr-task-delete:hover { background: #fee2e2; transform: none; }\n\n        \/* TIMER *\/\n        #prd-1-AxYLz7 .timer {\n            font-size: 42px; text-align: center; margin: 15px 0; color: var(--pr-primary); font-weight: bold; letter-spacing: 1px;\n        }\n        #prd-1-AxYLz7 .timer-controls { display: flex; gap: 8px; }\n        #prd-1-AxYLz7 .timer-controls button { margin-top: 0; }\n\n        \/* GOALS *\/\n        #prd-1-AxYLz7 .goal { margin-bottom: 12px; }\n        #prd-1-AxYLz7 .goal-info { display: flex; justify-content: space-between; font-size: 13px; margin-bottom: 4px; font-weight: 600; }\n        #prd-1-AxYLz7 .bar { height: 8px; background: #eee; border-radius: 10px; overflow: hidden; }\n        #prd-1-AxYLz7 .fill { height: 100%; background: var(--pr-primary); transition: width 0.4s ease; border-radius: 10px; }\n\n        \/* HABITS & LISTS *\/\n        #prd-1-AxYLz7 ul { padding-left: 18px; margin: 0; }\n        #prd-1-AxYLz7 ul li { padding: 5px 0; transition: 0.2s; font-size: 13.5px; }\n        #prd-1-AxYLz7 ul li:hover { color: var(--pr-primary); transform: translateX(3px); }\n\n        \/* INPUT PROMPT MODAL \/ INLINE *\/\n        #prd-1-AxYLz7 .pr-input-inline { display: flex; gap: 6px; margin-top: 8px; }\n        #prd-1-AxYLz7 .pr-input-inline input { flex: 1; padding: 8px 10px; border-radius: 8px; border: 1px solid #ddd; }\n\n        \/* RESPONSIVE *\/\n        @media(max-width: 900px){\n            #prd-1-AxYLz7 .prod-stats { grid-template-columns: 1fr 1fr; }\n            #prd-1-AxYLz7 .prod-grid, \n            #prd-1-AxYLz7 .prod-bottom { grid-template-columns: 1fr; }\n        }\n        <\/style>\n                            <div class=\"prod-wrap-inner\">\n            <!-- HEADER -->\n            <div class=\"prod-header\">\n                <div>\n                    <h2>\u26a1 Productivity Dashboard Pro<\/h2>\n                    <p>Organiza o teu dia, aumenta o foco e atinge mais objetivos<\/p>\n                <\/div>\n                <button class=\"secondary pr-btn-small\" data-pr-reset>Restaurar Dados<\/button>\n            <\/div>\n\n            <!-- TOP STATS -->\n            <div class=\"prod-stats\">\n                <div class=\"prod-card stat\">\n                    <h3>Tasks hoje<\/h3>\n                    <strong data-stat=\"total-tasks\">0<\/strong>\n                <\/div>\n                <div class=\"prod-card stat\">\n                    <h3>Conclu\u00eddas<\/h3>\n                    <strong data-stat=\"completed-tasks\">0<\/strong>\n                <\/div>\n                <div class=\"prod-card stat\">\n                    <h3>Foco (min)<\/h3>\n                    <strong data-stat=\"focus-min\">120<\/strong>\n                <\/div>\n                <div class=\"prod-card stat\">\n                    <h3>Streak<\/h3>\n                    <strong data-stat=\"streak\">7 dias<\/strong>\n                <\/div>\n            <\/div>\n\n            <!-- MAIN GRID -->\n            <div class=\"prod-grid\">\n\n                <!-- TASKS -->\n                <div class=\"prod-card large\">\n                    <h3><span>\u2705 Tasks de Hoje<\/span> <button class=\"secondary pr-btn-small\" data-task-clear-done>Limpar Conclu\u00eddas<\/button><\/h3>\n                    <div class=\"pr-task-container\" data-pr-task-list>\n                        <!-- Preenchido via JS -->\n                    <\/div>\n                    <div class=\"pr-input-inline\">\n                        <input type=\"text\" data-task-input placeholder=\"Adicionar nova task...\">\n                        <button style=\"margin-top:0; width:auto; padding: 8px 14px;\" data-task-add>Adicionar<\/button>\n                    <\/div>\n                <\/div>\n\n                <!-- FOCUS TIMER -->\n                <div class=\"prod-card center\">\n                    <h3>\u23f1 Focus Mode (Pomodoro)<\/h3>\n                    <div class=\"timer\" data-timer-display>25:00<\/div>\n                    <div class=\"timer-controls\">\n                        <button data-timer-start>Iniciar Foco<\/button>\n                        <button class=\"secondary\" data-timer-pause>Pausa<\/button>\n                    <\/div>\n                <\/div>\n\n                <!-- GOALS -->\n                <div class=\"prod-card\">\n                    <h3><span>\ud83c\udfaf Metas<\/span><\/h3>\n                    <div class=\"goal\">\n                        <div class=\"goal-info\"><span>Projeto Website<\/span><span>40%<\/span><\/div>\n                        <div class=\"bar\"><div class=\"fill\" style=\"width: 40%;\"><\/div><\/div>\n                    <\/div>\n                    <div class=\"goal\">\n                        <div class=\"goal-info\"><span>Aprender PHP<\/span><span>60%<\/span><\/div>\n                        <div class=\"bar\"><div class=\"fill\" style=\"width: 60%;\"><\/div><\/div>\n                    <\/div>\n                    <div class=\"goal\">\n                        <div class=\"goal-info\"><span>Organiza\u00e7\u00e3o pessoal<\/span><span>80%<\/span><\/div>\n                        <div class=\"bar\"><div class=\"fill\" style=\"width: 80%;\"><\/div><\/div>\n                    <\/div>\n                <\/div>\n\n            <\/div>\n\n            <!-- BOTTOM -->\n            <div class=\"prod-bottom\">\n                <div class=\"prod-card\">\n                    <h3>\ud83e\udde0 H\u00e1bitos Di\u00e1rios<\/h3>\n                    <ul>\n                        <li>\ud83d\udca7 Beber \u00e1gua (2L)<\/li>\n                        <li>\ud83d\udcd6 Ler 20 min<\/li>\n                        <li>\ud83c\udfc3 Exerc\u00edcio f\u00edsico<\/li>\n                        <li>\ud83e\uddd8 Medita\u00e7\u00e3o r\u00e1pida<\/li>\n                    <\/ul>\n                <\/div>\n\n                <div class=\"prod-card\">\n                    <h3>\ud83d\udcc5 Planeamento Di\u00e1rio<\/h3>\n                    <p style=\"font-size: 13.5px; color: var(--pr-muted); margin: 0;\">Organiza o teu dia com blocos de foco cont\u00ednuo e pausas estrat\u00e9gicas para evitar exaust\u00e3o mental.<\/p>\n                <\/div>\n\n                <div class=\"prod-card\">\n                    <h3>\ud83d\udcc8 Insights de Produtividade<\/h3>\n                    <p style=\"font-size: 13.5px; color: var(--pr-muted); margin: 0;\">Hoje est\u00e1s com excelente rendimento comparado \u00e0 m\u00e9dia semanal. Continua focado \ud83d\ude80<\/p>\n                <\/div>\n            <\/div>\n        <\/div>\n                            <script>\n        (function(){\n            var root = document.getElementById(\"prd-1-AxYLz7\");\n            if (!root) return;\n            var STORAGE_KEY = 'prod_plus_data_v2_prd-1-AxYLz7';\n\n            var defaultTasks = [\n                { id: uid(), text: 'Responder emails', completed: false },\n                { id: uid(), text: 'Estudar projeto WordPress', completed: true },\n                { id: uid(), text: 'Criar conte\u00fado site', completed: false },\n                { id: uid(), text: 'Rever c\u00f3digo PHP', completed: false }\n            ];\n\n            function loadTasks(){\n                try {\n                    var raw = localStorage.getItem(STORAGE_KEY);\n                    if (raw) return JSON.parse(raw);\n                } catch(e) {}\n                return defaultTasks;\n            }\n\n            function saveTasks(){\n                localStorage.setItem(STORAGE_KEY, JSON.stringify(state.tasks));\n            }\n\n            function uid(){ return 't' + Math.random().toString(36).slice(2,9); }\n\n            var state = {\n                tasks: loadTasks(),\n                focusTime: 25 * 60,\n                timerInterval: null,\n                isRunning: false\n            };\n\n            var els = {\n                taskList: root.querySelector('[data-pr-task-list]'),\n                taskInput: root.querySelector('[data-task-input]'),\n                taskAddBtn: root.querySelector('[data-task-add]'),\n                taskClearDone: root.querySelector('[data-task-clear-done]'),\n                statTotal: root.querySelector('[data-stat=\"total-tasks\"]'),\n                statCompleted: root.querySelector('[data-stat=\"completed-tasks\"]'),\n                statFocus: root.querySelector('[data-stat=\"focus-min\"]'),\n                timerDisplay: root.querySelector('[data-timer-display]'),\n                timerStartBtn: root.querySelector('[data-timer-start]'),\n                timerPauseBtn: root.querySelector('[data-timer-pause]'),\n                btnReset: root.querySelector('[data-pr-reset]')\n            };\n\n            function renderTasks(){\n                var items = state.tasks;\n                els.statTotal.textContent = items.length;\n                var completedCount = items.filter(function(t){ return t.completed; }).length;\n                els.statCompleted.textContent = completedCount;\n\n                if (!items.length){\n                    els.taskList.innerHTML = '<div style=\"text-align:center; padding:20px; color:#777; font-size:13px;\">Sem tarefas pendentes. Adiciona uma abaixo!<\/div>';\n                    return;\n                }\n\n                els.taskList.innerHTML = items.map(function(t){\n                    return '' +\n                    '<div class=\"task ' + (t.completed ? 'completed' : '') + '\" data-id=\"' + t.id + '\">' +\n                        '<div class=\"task-left\">' +\n                            '<input type=\"checkbox\" ' + (t.completed ? 'checked' : '') + ' data-toggle=\"' + t.id + '\">' +\n                            '<span>' + escapeHtml(t.text) + '<\/span>' +\n                        '<\/div>' +\n                        '<button class=\"pr-task-delete\" data-del=\"' + t.id + '\">Eliminar<\/button>' +\n                    '<\/div>';\n                }).join('');\n\n                \/\/ Eventos de checkbox\n                els.taskList.querySelectorAll('[data-toggle]').forEach(function(chk){\n                    chk.addEventListener('change', function(){\n                        var id = chk.getAttribute('data-toggle');\n                        var task = state.tasks.find(function(x){ return x.id === id; });\n                        if (task){\n                            task.completed = chk.checked;\n                            saveTasks();\n                            renderTasks();\n                        }\n                    });\n                });\n\n                \/\/ Eventos de apagar\n                els.taskList.querySelectorAll('[data-del]').forEach(function(btn){\n                    btn.addEventListener('click', function(){\n                        var id = btn.getAttribute('data-del');\n                        state.tasks = state.tasks.filter(function(x){ return x.id !== id; });\n                        saveTasks();\n                        renderTasks();\n                    });\n                });\n            }\n\n            function escapeHtml(str){\n                return (str || '').toString().replace(\/[&<>\"']\/g, function(m){\n                    return ({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;'})[m];\n                });\n            }\n\n            \/\/ Adicionar nova task\n            function addNewTask(){\n                var val = els.taskInput.value.trim();\n                if (!val) return;\n                state.tasks.push({ id: uid(), text: val, completed: false });\n                els.taskInput.value = '';\n                saveTasks();\n                renderTasks();\n            }\n\n            els.taskAddBtn.addEventListener('click', addNewTask);\n            els.taskInput.addEventListener('keypress', function(e){\n                if (e.key === 'Enter') addNewTask();\n            });\n\n            els.taskClearDone.addEventListener('click', function(){\n                state.tasks = state.tasks.filter(function(t){ return !t.completed; });\n                saveTasks();\n                renderTasks();\n            });\n\n            els.btnReset.addEventListener('click', function(){\n                if (confirm('Pretende restaurar as tarefas padr\u00e3o?')) {\n                    state.tasks = JSON.parse(JSON.stringify(defaultTasks));\n                    saveTasks();\n                    renderTasks();\n                }\n            });\n\n            \/\/ Timer Pomodoro Funcional\n            function updateTimerDisplay(){\n                var mins = Math.floor(state.focusTime \/ 60);\n                var secs = state.focusTime % 60;\n                els.timerDisplay.textContent = (mins < 10 ? '0' : '') + mins + ':' + (secs < 10 ? '0' : '') + secs;\n            }\n\n            els.timerStartBtn.addEventListener('click', function(){\n                if (state.isRunning) return;\n                state.isRunning = true;\n                els.timerStartBtn.textContent = 'A Decorrer...';\n                \n                state.timerInterval = setInterval(function(){\n                    if (state.focusTime > 0){\n                        state.focusTime--;\n                        updateTimerDisplay();\n                        \/\/ Incrementar minutos de foco a cada minuto acumulado (simulado no stat)\n                        if (state.focusTime % 60 === 0) {\n                            var currentMin = parseInt(els.statFocus.textContent) || 120;\n                            els.statFocus.textContent = currentMin + 1;\n                        }\n                    } else {\n                        clearInterval(state.timerInterval);\n                        state.isRunning = false;\n                        els.timerStartBtn.textContent = 'Iniciar Foco';\n                        alert('\ud83c\udf89 Sess\u00e3o de foco conclu\u00edda com sucesso! Desfrute de uma pausa.');\n                        state.focusTime = 25 * 60;\n                        updateTimerDisplay();\n                    }\n                }, 1000);\n            });\n\n            els.timerPauseBtn.addEventListener('click', function(){\n                if (!state.isRunning) return;\n                clearInterval(state.timerInterval);\n                state.isRunning = false;\n                els.timerStartBtn.textContent = 'Continuar Foco';\n            });\n\n            renderTasks();\n            updateTimerDisplay();\n        })();\n        <\/script>\n                <\/div>\n        <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"footnotes":""},"class_list":["post-2602","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/app.digitalfreelancer.org\/index.php\/wp-json\/wp\/v2\/pages\/2602","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/app.digitalfreelancer.org\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/app.digitalfreelancer.org\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/app.digitalfreelancer.org\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/app.digitalfreelancer.org\/index.php\/wp-json\/wp\/v2\/comments?post=2602"}],"version-history":[{"count":4,"href":"https:\/\/app.digitalfreelancer.org\/index.php\/wp-json\/wp\/v2\/pages\/2602\/revisions"}],"predecessor-version":[{"id":2644,"href":"https:\/\/app.digitalfreelancer.org\/index.php\/wp-json\/wp\/v2\/pages\/2602\/revisions\/2644"}],"wp:attachment":[{"href":"https:\/\/app.digitalfreelancer.org\/index.php\/wp-json\/wp\/v2\/media?parent=2602"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}