{"id":2604,"date":"2026-06-16T13:13:59","date_gmt":"2026-06-16T13:13:59","guid":{"rendered":"https:\/\/app.digitalfreelancer.org\/?page_id=2604"},"modified":"2026-06-22T18:17:57","modified_gmt":"2026-06-22T18:17:57","slug":"dashboard-convites","status":"publish","type":"page","link":"https:\/\/app.digitalfreelancer.org\/index.php\/dashboard-convites\/","title":{"rendered":"Dashboard Convites+"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"2604\" class=\"elementor elementor-2604\">\n\t\t\t\t<div class=\"elementor-element elementor-element-3e3a856 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-parent\" data-id=\"3e3a856\" 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-5d58e94 elementor-widget elementor-widget-shortcode\" data-id=\"5d58e94\" 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=\"cvp-1-wDJdfd\" class=\"cvp-root\">\n                <style>\n        #cvp-1-wDJdfd {\n            --cvp-bg: #0a0a0b;\n            --cvp-panel: #121316;\n            --cvp-panel-2: #1a1c20;\n            --cvp-border: #2b2d33;\n            --cvp-text: #e8e8e8;\n            --cvp-muted: #9a9aa3;\n            --cvp-accent: #c0c0c0;\n            --cvp-accent-soft: rgba(192,192,192,0.12);\n            --cvp-danger: #d3604a;\n            --cvp-success: #60b478;\n            --cvp-info: #6094d3;\n            --cvp-radius: 12px;\n            all: initial;\n            * { box-sizing: border-box; }\n            font-family: 'Georgia', 'Iowan Old Style', serif;\n            color: var(--cvp-text);\n            background: var(--cvp-bg);\n            display: block;\n            border-radius: var(--cvp-radius);\n            overflow: hidden;\n            border: 1px solid var(--cvp-border);\n            box-shadow: 0 10px 30px rgba(0,0,0,0.5);\n        }\n        #cvp-1-wDJdfd button, #cvp-1-wDJdfd input,\n        #cvp-1-wDJdfd select, #cvp-1-wDJdfd textarea {\n            font-family: 'Helvetica Neue', Arial, sans-serif;\n            font-size: 14px;\n            color: var(--cvp-text);\n            outline: none;\n        }\n        #cvp-1-wDJdfd .cvp-app { display: flex; min-height: 750px; max-height: 88vh; }\n\n        \/* Sidebar *\/\n        #cvp-1-wDJdfd .cvp-side {\n            width: 240px; flex-shrink: 0; background: var(--cvp-panel);\n            border-right: 1px solid var(--cvp-border); padding: 24px 16px; overflow-y: auto;\n            display: flex; flex-direction: column; justify-content: space-between;\n        }\n        #cvp-1-wDJdfd .cvp-brand {\n            font-family: 'Helvetica Neue', Arial, sans-serif; letter-spacing: .15em;\n            font-size: 14px; text-transform: uppercase; color: var(--cvp-accent);\n            margin-bottom: 26px; font-weight: 700; display: flex; align-items: center; gap: 8px;\n        }\n        #cvp-1-wDJdfd .cvp-nav { list-style: none; margin: 0; padding: 0; font-family: 'Helvetica Neue', Arial, sans-serif; }\n        #cvp-1-wDJdfd .cvp-nav li {\n            padding: 12px 14px; border-radius: 8px; margin-bottom: 6px; cursor: pointer;\n            font-size: 13.5px; color: var(--cvp-muted); transition: .2s; display: flex; align-items: center; gap: 10px;\n        }\n        #cvp-1-wDJdfd .cvp-nav li:hover { color: var(--cvp-text); background: var(--cvp-panel-2); }\n        #cvp-1-wDJdfd .cvp-nav li.active { background: var(--cvp-accent-soft); color: var(--cvp-accent); font-weight: 600; }\n\n        \/* Main *\/\n        #cvp-1-wDJdfd .cvp-main { flex: 1; overflow-y: auto; padding: 32px; background: var(--cvp-bg); }\n        #cvp-1-wDJdfd .cvp-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 24px; flex-wrap: wrap; gap: 15px; }\n        #cvp-1-wDJdfd .cvp-title { font-size: 28px; font-weight: 400; letter-spacing: -0.02em; }\n        #cvp-1-wDJdfd .cvp-sub { font-family: 'Helvetica Neue', Arial, sans-serif; color: var(--cvp-muted); font-size: 13.5px; margin-top: 4px; }\n\n        #cvp-1-wDJdfd .cvp-actions-toolbar { display: flex; gap: 10px; align-items: center; }\n        #cvp-1-wDJdfd .cvp-btn {\n            font-family: 'Helvetica Neue', Arial, sans-serif; background: var(--cvp-accent); color: #111;\n            border: none; padding: 10px 18px; border-radius: 9px; cursor: pointer; font-weight: 600;\n            font-size: 13.5px; transition: .2s; display: inline-flex; align-items: center; gap: 8px; text-decoration: none;\n        }\n        #cvp-1-wDJdfd .cvp-btn:hover { filter: brightness(1.1); transform: translateY(-1px); }\n        #cvp-1-wDJdfd .cvp-btn.outline { background: transparent; border: 1px solid var(--cvp-border); color: var(--cvp-text); }\n        #cvp-1-wDJdfd .cvp-btn.outline:hover { background: var(--cvp-panel-2); }\n        #cvp-1-wDJdfd .cvp-btn.danger { background: var(--cvp-danger); color: #fff; }\n        #cvp-1-wDJdfd .cvp-btn.small { padding: 6px 12px; font-size: 12px; border-radius: 7px; }\n\n        \/* Search & Filter Bar *\/\n        #cvp-1-wDJdfd .cvp-toolbar {\n            display: flex; justify-content: space-between; align-items: center; gap: 12px; margin-bottom: 18px; flex-wrap: wrap;\n        }\n        #cvp-1-wDJdfd .cvp-search-box {\n            position: relative; flex: 1; min-width: 220px;\n        }\n        #cvp-1-wDJdfd .cvp-search-box input {\n            width: 100%; background: var(--cvp-panel); border: 1px solid var(--cvp-border); border-radius: 9px; padding: 9px 12px 9px 36px;\n        }\n        #cvp-1-wDJdfd .cvp-search-box span {\n            position: absolute; left: 12px; top: 50%; transform: translateY(-50%); color: var(--cvp-muted); font-size: 14px;\n        }\n\n        \/* Stat cards *\/\n        #cvp-1-wDJdfd .cvp-stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px,1fr)); gap: 16px; margin-bottom: 28px; }\n        #cvp-1-wDJdfd .cvp-stat {\n            background: var(--cvp-panel); border: 1px solid var(--cvp-border); border-radius: var(--cvp-radius);\n            padding: 20px; font-family: 'Helvetica Neue', Arial, sans-serif; position: relative; overflow: hidden;\n        }\n        #cvp-1-wDJdfd .cvp-stat::after {\n            content: ''; position: absolute; bottom: 0; left: 0; right: 0; height: 3px; background: var(--cvp-accent-soft);\n        }\n        #cvp-1-wDJdfd .cvp-stat .num { font-family: Georgia, serif; font-size: 32px; color: var(--cvp-accent); }\n        #cvp-1-wDJdfd .cvp-stat .lbl { color: var(--cvp-muted); font-size: 12.5px; margin-top: 4px; }\n\n        \/* Cards \/ list *\/\n        #cvp-1-wDJdfd .cvp-card {\n            background: var(--cvp-panel); border: 1px solid var(--cvp-border); border-radius: var(--cvp-radius);\n            padding: 22px; margin-bottom: 18px;\n        }\n        #cvp-1-wDJdfd .cvp-card h3 { font-size: 17px; font-weight: 400; margin: 0 0 16px; display: flex; align-items: center; justify-content: space-between; }\n\n        #cvp-1-wDJdfd .cvp-filters { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 18px; }\n        #cvp-1-wDJdfd .cvp-chip {\n            font-family: 'Helvetica Neue', Arial, sans-serif; border: 1px solid var(--cvp-border); background: var(--cvp-panel-2);\n            color: var(--cvp-muted); padding: 7px 14px; border-radius: 999px; cursor: pointer; font-size: 12.5px; transition: .2s;\n        }\n        #cvp-1-wDJdfd .cvp-chip:hover { border-color: var(--cvp-accent); color: var(--cvp-text); }\n        #cvp-1-wDJdfd .cvp-chip.active { background: var(--cvp-accent-soft); border-color: var(--cvp-accent); color: var(--cvp-accent); font-weight: 500; }\n\n        #cvp-1-wDJdfd .cvp-invite-row {\n            display: flex; align-items: center; gap: 16px; border: 1px solid var(--cvp-border);\n            border-radius: 10px; padding: 14px 18px; margin-bottom: 12px; background: var(--cvp-panel-2); transition: .2s;\n        }\n        #cvp-1-wDJdfd .cvp-invite-row:hover { border-color: rgba(192,192,192,0.4); transform: translateX(2px); }\n        #cvp-1-wDJdfd .cvp-invite-thumb {\n            width: 46px; height: 46px; border-radius: 10px; background: var(--cvp-accent-soft); color: var(--cvp-accent);\n            display: flex; align-items: center; justify-content: center; font-size: 20px; flex-shrink: 0;\n        }\n        #cvp-1-wDJdfd .cvp-invite-info { flex: 1; min-width: 0; font-family: 'Helvetica Neue', Arial, sans-serif; }\n        #cvp-1-wDJdfd .cvp-invite-info .nm { font-size: 15px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n        #cvp-1-wDJdfd .cvp-invite-info .mt { color: var(--cvp-muted); font-size: 12.5px; margin-top: 3px; display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }\n        \n        #cvp-1-wDJdfd .cvp-status {\n            font-family: 'Helvetica Neue', Arial, sans-serif; font-size: 11px; padding: 5px 12px; border-radius: 999px;\n            text-transform: uppercase; letter-spacing: .05em; font-weight: 600;\n        }\n        #cvp-1-wDJdfd .cvp-status.rascunho { background: rgba(154,154,163,0.15); color: var(--cvp-muted); }\n        #cvp-1-wDJdfd .cvp-status.enviado { background: rgba(96,148,211,0.15); color: var(--cvp-info); }\n        #cvp-1-wDJdfd .cvp-status.concluido { background: rgba(96,180,120,0.15); color: var(--cvp-success); }\n\n        #cvp-1-wDJdfd .cvp-empty {\n            text-align: center; padding: 60px 20px; color: var(--cvp-muted); font-family: 'Helvetica Neue', Arial, sans-serif; font-size: 14px;\n        }\n        #cvp-1-wDJdfd .cvp-empty .ic { font-size: 36px; margin-bottom: 10px; opacity: 0.5; }\n\n        \/* Modal *\/\n        #cvp-1-wDJdfd .cvp-overlay {\n            position: fixed; inset: 0; background: rgba(0,0,0,0.7); backdrop-filter: blur(4px); display: none; align-items: center; justify-content: center; z-index: 999999; padding: 20px; animation: cvpFadeIn 0.2s ease;\n        }\n        #cvp-1-wDJdfd .cvp-overlay.open { display: flex; }\n        #cvp-1-wDJdfd .cvp-modal {\n            background: var(--cvp-panel); border: 1px solid var(--cvp-border); border-radius: var(--cvp-radius);\n            width: 100%; max-width: 520px; padding: 30px; max-height: 90vh; overflow-y: auto; box-shadow: 0 20px 40px rgba(0,0,0,0.6);\n        }\n        #cvp-1-wDJdfd .cvp-modal h2 { font-size: 20px; font-weight: 400; margin: 0 0 20px; display: flex; justify-content: space-between; align-items: center; }\n        #cvp-1-wDJdfd .cvp-field { margin-bottom: 16px; font-family: 'Helvetica Neue', Arial, sans-serif; }\n        #cvp-1-wDJdfd .cvp-field label { display: block; font-size: 12.5px; color: var(--cvp-muted); margin-bottom: 6px; font-weight: 500; }\n        #cvp-1-wDJdfd .cvp-field input, #cvp-1-wDJdfd .cvp-field select, #cvp-1-wDJdfd .cvp-field textarea {\n            width: 100%; background: var(--cvp-panel-2); border: 1px solid var(--cvp-border); border-radius: 8px; padding: 10px 12px; transition: border-color .2s;\n        }\n        #cvp-1-wDJdfd .cvp-field input:focus, #cvp-1-wDJdfd .cvp-field select:focus, #cvp-1-wDJdfd .cvp-field textarea:focus {\n            border-color: var(--cvp-accent);\n        }\n        #cvp-1-wDJdfd .cvp-field textarea { min-height: 80px; resize: vertical; }\n        #cvp-1-wDJdfd .cvp-form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }\n        #cvp-1-wDJdfd .cvp-modal-actions { display: flex; justify-content: flex-end; gap: 10px; margin-top: 24px; border-top: 1px solid var(--cvp-border); padding-top: 16px; }\n\n        \/* Calendar *\/\n        #cvp-1-wDJdfd .cvp-cal-grid { display: grid; grid-template-columns: repeat(7,1fr); gap: 8px; font-family: 'Helvetica Neue', Arial, sans-serif; }\n        #cvp-1-wDJdfd .cvp-cal-day-name { text-align: center; font-size: 12px; font-weight: 600; color: var(--cvp-muted); padding-bottom: 8px; text-transform: uppercase; }\n        #cvp-1-wDJdfd .cvp-cal-cell {\n            min-height: 90px; border: 1px solid var(--cvp-border); border-radius: 8px; padding: 8px; font-size: 12px; background: var(--cvp-panel-2); display: flex; flex-direction: column; gap: 4px;\n        }\n        #cvp-1-wDJdfd .cvp-cal-cell.empty { background: transparent; border-color: transparent; }\n        #cvp-1-wDJdfd .cvp-cal-cell .d { color: var(--cvp-muted); font-weight: 600; }\n        #cvp-1-wDJdfd .cvp-cal-tag { background: var(--cvp-accent-soft); color: var(--cvp-accent); border-radius: 4px; padding: 2px 6px; font-size: 11px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; cursor: pointer; }\n        #cvp-1-wDJdfd .cvp-cal-tag:hover { filter: brightness(1.2); }\n        #cvp-1-wDJdfd .cvp-cal-nav { display: flex; align-items: center; justify-content: space-between; margin-bottom: 18px; font-family: 'Helvetica Neue', Arial, sans-serif; background: var(--cvp-panel); padding: 12px 18px; border-radius: var(--cvp-radius); border: 1px solid var(--cvp-border); }\n\n        \/* Portfolio *\/\n        #cvp-1-wDJdfd .cvp-grid-cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px,1fr)); gap: 18px; }\n        #cvp-1-wDJdfd .cvp-portfolio-card {\n            background: var(--cvp-panel); border: 1px solid var(--cvp-border); border-radius: var(--cvp-radius); overflow: hidden; transition: .2s;\n            font-family: 'Helvetica Neue', Arial, sans-serif; display: flex; flex-direction: column;\n        }\n        #cvp-1-wDJdfd .cvp-portfolio-card:hover { border-color: var(--cvp-accent); transform: translateY(-3px); }\n        #cvp-1-wDJdfd .cvp-portfolio-img { height: 130px; background: var(--cvp-panel-2); display: flex; align-items: center; justify-content: center; font-size: 32px; color: var(--cvp-accent); border-bottom: 1px solid var(--cvp-border); }\n        #cvp-1-wDJdfd .cvp-portfolio-body { padding: 16px; flex: 1; display: flex; flex-direction: column; justify-content: space-between; }\n        #cvp-1-wDJdfd .cvp-portfolio-body h4 { font-size: 15px; margin: 0 0 6px; font-weight: 600; }\n        #cvp-1-wDJdfd .cvp-portfolio-body p { font-size: 12.5px; color: var(--cvp-muted); margin: 0 0 14px; }\n\n        \/* Responsive *\/\n        @media (max-width: 760px) {\n            #cvp-1-wDJdfd .cvp-app { flex-direction: column; max-height: none; }\n            #cvp-1-wDJdfd .cvp-side { width: 100%; flex-direction: row; align-items: center; padding: 12px 16px; overflow-x: auto; }\n            #cvp-1-wDJdfd .cvp-brand { margin-bottom: 0; }\n            #cvp-1-wDJdfd .cvp-nav { display: flex; gap: 8px; }\n            #cvp-1-wDJdfd .cvp-nav li { margin-bottom: 0; padding: 8px 12px; white-space: nowrap; }\n            #cvp-1-wDJdfd .cvp-side-footer { display: none; }\n        }\n\n        @keyframes cvpFadeIn {\n            from { opacity: 0; transform: scale(0.98); }\n            to { opacity: 1; transform: scale(1); }\n        }\n        <\/style>\n                        <div class=\"cvp-app\">\n            <!-- Sidebar -->\n            <aside class=\"cvp-side\">\n                <div>\n                    <div class=\"cvp-brand\">\u2726 Convite+<\/div>\n                    <ul class=\"cvp-nav\" data-cvp-nav>\n                        <li data-view=\"painel\" class=\"active\"><span>\ud83d\udcca<\/span> Painel<\/li>\n                        <li data-view=\"convites\"><span>\u2709\ufe0f<\/span> Convites<\/li>\n                        <li data-view=\"calendario\"><span>\ud83d\udcc5<\/span> Calend\u00e1rio<\/li>\n                        <li data-view=\"portfolio\"><span>\ud83c\udfa8<\/span> Portf\u00f3lio<\/li>\n                    <\/ul>\n                <\/div>\n                <div class=\"cvp-side-footer\" style=\"font-family: 'Helvetica Neue', Arial, sans-serif; font-size: 11px; color: var(--cvp-muted); border-top: 1px solid var(--cvp-border); padding-top: 14px; width: 100%;\">\n                    <div>v2.0 Professional<\/div>\n                    <div style=\"margin-top: 4px; cursor: pointer; color: var(--cvp-accent);\" data-cvp-export>\ud83d\udce5 Exportar Dados<\/div>\n                <\/div>\n            <\/aside>\n\n            <!-- Main -->\n            <main class=\"cvp-main\">\n\n                <!-- PAINEL -->\n                <section data-cvp-view=\"painel\">\n                    <div class=\"cvp-header\">\n                        <div>\n                            <div class=\"cvp-title\">Painel de Controlo<\/div>\n                            <div class=\"cvp-sub\">M\u00e9tricas e vis\u00e3o geral dos teus convites digitais<\/div>\n                        <\/div>\n                        <div class=\"cvp-actions-toolbar\">\n                            <button class=\"cvp-btn outline\" data-cvp-export>Exportar JSON<\/button>\n                            <button class=\"cvp-btn\" data-cvp-new>+ Novo Convite<\/button>\n                        <\/div>\n                    <\/div>\n                    <div class=\"cvp-stats\">\n                        <div class=\"cvp-stat\"><div class=\"num\" data-stat=\"total\">0<\/div><div class=\"lbl\">Total de Convites<\/div><\/div>\n                        <div class=\"cvp-stat\"><div class=\"num\" data-stat=\"concluidos\">0<\/div><div class=\"lbl\">Eventos Conclu\u00eddos<\/div><\/div>\n                        <div class=\"cvp-stat\"><div class=\"num\" data-stat=\"enviados\">0<\/div><div class=\"lbl\">Convites Enviados<\/div><\/div>\n                        <div class=\"cvp-stat\"><div class=\"num\" data-stat=\"proximo\">\u2014<\/div><div class=\"lbl\">Pr\u00f3ximo Evento<\/div><\/div>\n                    <\/div>\n                    <div class=\"cvp-card\">\n                        <h3><span>Atividade Recente<\/span> <button class=\"cvp-btn outline small\" data-nav-link=\"convites\">Ver Todos<\/button><\/h3>\n                        <div data-cvp-recent><\/div>\n                    <\/div>\n                <\/section>\n\n                <!-- CONVITES -->\n                <section data-cvp-view=\"convites\" style=\"display:none;\">\n                    <div class=\"cvp-header\">\n                        <div>\n                            <div class=\"cvp-title\">Gest\u00e3o de Convites<\/div>\n                            <div class=\"cvp-sub\">Organiza, filtra e monitoriza todos os teus convites<\/div>\n                        <\/div>\n                        <button class=\"cvp-btn\" data-cvp-new>+ Novo Convite<\/button>\n                    <\/div>\n                    <div class=\"cvp-toolbar\">\n                        <div class=\"cvp-search-box\">\n                            <span>\ud83d\udd0d<\/span>\n                            <input type=\"text\" placeholder=\"Pesquisar por nome ou local...\" data-cvp-search>\n                        <\/div>\n                        <div style=\"display: flex; gap: 8px;\">\n                            <select data-cvp-sort style=\"background: var(--cvp-panel); border: 1px solid var(--cvp-border); border-radius: 9px; padding: 9px 12px;\">\n                                <option value=\"data-asc\">Data (Mais Pr\u00f3xima)<\/option>\n                                <option value=\"data-desc\">Data (Mais Distante)<\/option>\n                                <option value=\"nome-asc\">Nome (A-Z)<\/option>\n                            <\/select>\n                        <\/div>\n                    <\/div>\n                    <div class=\"cvp-filters\" data-cvp-filters>\n                        <span class=\"cvp-chip active\" data-filter=\"todos\">Todos<\/span>\n                        <span class=\"cvp-chip\" data-filter=\"Casamento\">Casamento<\/span>\n                        <span class=\"cvp-chip\" data-filter=\"Anivers\u00e1rio\">Anivers\u00e1rio<\/span>\n                        <span class=\"cvp-chip\" data-filter=\"Batizado\">Batizado<\/span>\n                        <span class=\"cvp-chip\" data-filter=\"Corporativo\">Corporativo<\/span>\n                        <span class=\"cvp-chip\" data-filter=\"Outro\">Outro<\/span>\n                    <\/div>\n                    <div data-cvp-list><\/div>\n                <\/section>\n\n                <!-- CALENDARIO -->\n                <section data-cvp-view=\"calendario\" style=\"display:none;\">\n                    <div class=\"cvp-header\">\n                        <div>\n                            <div class=\"cvp-title\">Calend\u00e1rio de Eventos<\/div>\n                            <div class=\"cvp-sub\">Planeamento mensal de produ\u00e7\u00e3o e entregas<\/div>\n                        <\/div>\n                    <\/div>\n                    <div class=\"cvp-cal-nav\">\n                        <button class=\"cvp-btn outline small\" data-cal-prev>\u2039 M\u00eas Anterior<\/button>\n                        <strong data-cal-label style=\"font-size: 16px;\"><\/strong>\n                        <button class=\"cvp-btn outline small\" data-cal-next>M\u00eas Seguinte \u203a<\/button>\n                    <\/div>\n                    <div class=\"cvp-card\" style=\"padding: 16px;\">\n                        <div class=\"cvp-cal-grid\" data-cal-grid><\/div>\n                    <\/div>\n                <\/section>\n\n                <!-- PORTFOLIO -->\n                <section data-cvp-view=\"portfolio\" style=\"display:none;\">\n                    <div class=\"cvp-header\">\n                        <div>\n                            <div class=\"cvp-title\">Cat\u00e1logo &amp; Portf\u00f3lio de Estilos<\/div>\n                            <div class=\"cvp-sub\">Modelos de design dispon\u00edveis para novos projetos<\/div>\n                        <\/div>\n                    <\/div>\n                    <div class=\"cvp-grid-cards\">\n                        <div class=\"cvp-portfolio-card\">\n                            <div class=\"cvp-portfolio-img\">\u2728<\/div>\n                            <div class=\"cvp-portfolio-body\">\n                                <div><h4>Moderno &amp; Clean<\/h4><p>Ideal para eventos corporativos e lan\u00e7amentos tecnol\u00f3gicos.<\/p><\/div>\n                                <button class=\"cvp-btn outline small\" data-cvp-new style=\"width:100%; justify-content:center;\">Usar Modelo<\/button>\n                            <\/div>\n                        <\/div>\n                        <div class=\"cvp-portfolio-card\">\n                            <div class=\"cvp-portfolio-img\">\ud83c\udfdb\ufe0f<\/div>\n                            <div class=\"cvp-portfolio-body\">\n                                <div><h4>Cl\u00e1ssico Tradicional<\/h4><p>Perfeito para casamentos formais e bodas de ouro.<\/p><\/div>\n                                <button class=\"cvp-btn outline small\" data-cvp-new style=\"width:100%; justify-content:center;\">Usar Modelo<\/button>\n                            <\/div>\n                        <\/div>\n                        <div class=\"cvp-portfolio-card\">\n                            <div class=\"cvp-portfolio-img\">\ud83c\udf3f<\/div>\n                            <div class=\"cvp-portfolio-body\">\n                                <div><h4>Minimalista Boho<\/h4><p>Design focado em tipografia fina e elementos naturais.<\/p><\/div>\n                                <button class=\"cvp-btn outline small\" data-cvp-new style=\"width:100%; justify-content:center;\">Usar Modelo<\/button>\n                            <\/div>\n                        <\/div>\n                        <div class=\"cvp-portfolio-card\">\n                            <div class=\"cvp-portfolio-img\">\ud83d\udcdc<\/div>\n                            <div class=\"cvp-portfolio-body\">\n                                <div><h4>Vintage &amp; Retr\u00f4<\/h4><p>Est\u00e9tica envelhecida com texturas r\u00fasticas elegantes.<\/p><\/div>\n                                <button class=\"cvp-btn outline small\" data-cvp-new style=\"width:100%; justify-content:center;\">Usar Modelo<\/button>\n                            <\/div>\n                        <\/div>\n                    <\/div>\n                <\/section>\n\n            <\/main>\n        <\/div>\n\n        <!-- Modal de cria\u00e7\u00e3o\/edi\u00e7\u00e3o -->\n        <div class=\"cvp-overlay\" data-cvp-overlay>\n            <div class=\"cvp-modal\">\n                <h2>\n                    <span data-cvp-modal-title>Novo Convite<\/span>\n                    <button class=\"cvp-btn outline small\" data-cvp-cancel style=\"border:none; padding:4px 8px;\">\u2715<\/button>\n                <\/h2>\n                <input type=\"hidden\" data-f=\"id\">\n                <div class=\"cvp-field\">\n                    <label>Nome do Evento *<\/label>\n                    <input type=\"text\" data-f=\"nome\" placeholder=\"Ex: Casamento de Maria &amp; Jo\u00e3o\">\n                <\/div>\n                <div class=\"cvp-form-row\">\n                    <div class=\"cvp-field\">\n                        <label>Categoria<\/label>\n                        <select data-f=\"categoria\">\n                            <option>Casamento<\/option>\n                            <option>Anivers\u00e1rio<\/option>\n                            <option>Batizado<\/option>\n                            <option>Corporativo<\/option>\n                            <option>Outro<\/option>\n                        <\/select>\n                    <\/div>\n                    <div class=\"cvp-field\">\n                        <label>Estado<\/label>\n                        <select data-f=\"estado\">\n                            <option value=\"rascunho\">Rascunho<\/option>\n                            <option value=\"enviado\">Enviado<\/option>\n                            <option value=\"concluido\">Conclu\u00eddo<\/option>\n                        <\/select>\n                    <\/div>\n                <\/div>\n                <div class=\"cvp-form-row\">\n                    <div class=\"cvp-field\">\n                        <label>Data do Evento<\/label>\n                        <input type=\"date\" data-f=\"data\">\n                    <\/div>\n                    <div class=\"cvp-field\">\n                        <label>Local \/ Espa\u00e7o<\/label>\n                        <input type=\"text\" data-f=\"local\" placeholder=\"Ex: Quinta da Lapa\">\n                    <\/div>\n                <\/div>\n                <div class=\"cvp-field\">\n                    <label>Notas &amp; Observa\u00e7\u00f5es<\/label>\n                    <textarea data-f=\"notas\" placeholder=\"Detalhes, convidados, fornecedores, links \u00fateis...\"><\/textarea>\n                <\/div>\n                <div class=\"cvp-modal-actions\">\n                    <button class=\"cvp-btn danger\" data-cvp-delete style=\"display:none; margin-right:auto;\">Eliminar<\/button>\n                    <button class=\"cvp-btn outline\" data-cvp-cancel>Cancelar<\/button>\n                    <button class=\"cvp-btn\" data-cvp-save>Guardar Convite<\/button>\n                <\/div>\n            <\/div>\n        <\/div>\n                        <script>\n        (function(){\n            var root = document.getElementById(\"cvp-1-wDJdfd\");\n            if (!root) return;\n            var STORAGE_KEY = 'convite_plus_data_v2_cvp-1-wDJdfd';\n\n            function loadData(){\n                try {\n                    var raw = localStorage.getItem(STORAGE_KEY);\n                    if (raw) return JSON.parse(raw);\n                } catch(e) {}\n                return seedData();\n            }\n            function saveData(){ localStorage.setItem(STORAGE_KEY, JSON.stringify(state.convites)); }\n\n            function seedData(){\n                var today = new Date();\n                function plus(d){ var dt = new Date(today); dt.setDate(dt.getDate()+d); return dt.toISOString().slice(0,10); }\n                return [\n                    { id: uid(), nome: 'Casamento de Maria & Jo\u00e3o', categoria: 'Casamento', data: plus(20), local: 'Quinta da Lapa', estado: 'enviado', notas: 'Confirmar restri\u00e7\u00f5es alimentares com o catering.' },\n                    { id: uid(), nome: 'Anivers\u00e1rio de 30 Anos', categoria: 'Anivers\u00e1rio', data: plus(8), local: 'Loft Avenida', estado: 'rascunho', notas: 'Enviar convites digitais via WhatsApp.' },\n                    { id: uid(), nome: 'Batizado da Sofia', categoria: 'Batizado', data: plus(-5), local: 'Igreja de Santo Ant\u00f3nio', estado: 'concluido', notas: 'Evento conclu\u00eddo com sucesso.' }\n                ];\n            }\n            function uid(){ return 'c' + Math.random().toString(36).slice(2,9); }\n\n            var state = { \n                convites: loadData(), \n                filter: 'todos', \n                search: '',\n                sort: 'data-asc',\n                view: 'painel', \n                calDate: new Date() \n            };\n\n            var els = {\n                navItems: root.querySelectorAll('[data-cvp-nav] li'),\n                navLinks: root.querySelectorAll('[data-nav-link]'),\n                views: root.querySelectorAll('[data-cvp-view]'),\n                list: root.querySelector('[data-cvp-list]'),\n                recent: root.querySelector('[data-cvp-recent]'),\n                filters: root.querySelectorAll('[data-cvp-filters] .cvp-chip'),\n                search: root.querySelector('[data-cvp-search]'),\n                sort: root.querySelector('[data-cvp-sort]'),\n                overlay: root.querySelector('[data-cvp-overlay]'),\n                modalTitle: root.querySelector('[data-cvp-modal-title]'),\n                save: root.querySelector('[data-cvp-save]'),\n                cancel: root.querySelectorAll('[data-cvp-cancel]'),\n                del: root.querySelector('[data-cvp-delete]'),\n                newBtns: root.querySelectorAll('[data-cvp-new]'),\n                exportBtns: root.querySelectorAll('[data-cvp-export]'),\n                statTotal: root.querySelector('[data-stat=\"total\"]'),\n                statConcluidos: root.querySelector('[data-stat=\"concluidos\"]'),\n                statEnviados: root.querySelector('[data-stat=\"enviados\"]'),\n                statProximo: root.querySelector('[data-stat=\"proximo\"]'),\n                calGrid: root.querySelector('[data-cal-grid]'),\n                calLabel: root.querySelector('[data-cal-label]'),\n                calPrev: root.querySelector('[data-cal-prev]'),\n                calNext: root.querySelector('[data-cal-next]')\n            };\n\n            function fmtDate(s){\n                if (!s) return 'Sem data';\n                var d = new Date(s + 'T00:00:00');\n                return d.toLocaleDateString('pt-PT', { day:'2-digit', month:'short', year:'numeric' });\n            }\n\n            function switchView(view){\n                state.view = view;\n                els.navItems.forEach(function(li){ li.classList.toggle('active', li.getAttribute('data-view') === view); });\n                els.views.forEach(function(sec){ sec.style.display = (sec.getAttribute('data-cvp-view') === view) ? '' : 'none'; });\n                if (view === 'calendario') renderCalendar();\n                if (view === 'painel') renderPainel();\n                if (view === 'convites') renderList();\n            }\n\n            els.navItems.forEach(function(li){\n                li.addEventListener('click', function(){ switchView(li.getAttribute('data-view')); });\n            });\n\n            els.navLinks.forEach(function(btn){\n                btn.addEventListener('click', function(){ switchView(btn.getAttribute('data-nav-link')); });\n            });\n\n            function statusLabel(e){\n                return e === 'rascunho' ? 'Rascunho' : (e === 'enviado' ? 'Enviado' : 'Conclu\u00eddo');\n            }\n\n            function renderList(){\n                var query = (state.search || '').toLowerCase();\n                var items = state.convites.filter(function(c){\n                    var matchFilter = (state.filter === 'todos' || c.categoria === state.filter);\n                    var matchSearch = !query || (c.nome && c.nome.toLowerCase().indexOf(query) > -1) || (c.local && c.local.toLowerCase().indexOf(query) > -1);\n                    return matchFilter && matchSearch;\n                }).sort(function(a,b){\n                    if (state.sort === 'data-asc') return (a.data || '9999').localeCompare(b.data || '9999');\n                    if (state.sort === 'data-desc') return (b.data || '').localeCompare(a.data || '');\n                    if (state.sort === 'nome-asc') return (a.nome || '').localeCompare(b.nome || '');\n                    return 0;\n                });\n\n                if (!items.length){\n                    els.list.innerHTML = '<div class=\"cvp-empty\"><div class=\"ic\">\ud83d\udced<\/div>Nenhum convite encontrado com estes crit\u00e9rios.<\/div>';\n                    return;\n                }\n                els.list.innerHTML = items.map(function(c){\n                    return '' +\n                    '<div class=\"cvp-invite-row\" data-id=\"'+c.id+'\">' +\n                        '<div class=\"cvp-invite-thumb\">\u2709<\/div>' +\n                        '<div class=\"cvp-invite-info\">' +\n                            '<div class=\"nm\">'+escapeHtml(c.nome || 'Sem nome')+'<\/div>' +\n                            '<div class=\"mt\">' +\n                                '<span>\ud83c\udff7\ufe0f '+escapeHtml(c.categoria)+'<\/span>' +\n                                '<span>\ud83d\udcc5 '+fmtDate(c.data)+'<\/span>' +\n                                (c.local ? '<span>\ud83d\udccd '+escapeHtml(c.local)+'<\/span>' : '') +\n                            '<\/div>' +\n                        '<\/div>' +\n                        '<span class=\"cvp-status '+c.estado+'\">'+statusLabel(c.estado)+'<\/span>' +\n                        '<button class=\"cvp-btn outline small\" data-edit=\"'+c.id+'\">Gerir \/ Editar<\/button>' +\n                    '<\/div>';\n                }).join('');\n\n                els.list.querySelectorAll('[data-edit]').forEach(function(btn){\n                    btn.addEventListener('click', function(){ openModal(btn.getAttribute('data-edit')); });\n                });\n            }\n\n            function renderPainel(){\n                var total = state.convites.length;\n                var concluidos = state.convites.filter(function(c){ return c.estado === 'concluido'; }).length;\n                var enviados = state.convites.filter(function(c){ return c.estado === 'enviado'; }).length;\n                var todayStr = new Date().toISOString().slice(0,10);\n                var futuros = state.convites.filter(function(c){ return c.data && c.data >= todayStr; }).sort(function(a,b){ return a.data.localeCompare(b.data); });\n\n                els.statTotal.textContent = total;\n                els.statConcluidos.textContent = concluidos;\n                els.statEnviados.textContent = enviados;\n                els.statProximo.textContent = futuros.length ? fmtDate(futuros[0].data) : '\u2014';\n\n                var recentes = state.convites.slice().sort(function(a,b){ return (b.data || '').localeCompare(a.data || ''); }).slice(0,4);\n                if (!recentes.length){\n                    els.recent.innerHTML = '<div class=\"cvp-empty\"><div class=\"ic\">\u2728<\/div>Ainda n\u00e3o h\u00e1 convites criados. Comece agora!<\/div>';\n                    return;\n                }\n                els.recent.innerHTML = recentes.map(function(c){\n                    return '' +\n                    '<div class=\"cvp-invite-row\" data-id=\"'+c.id+'\" style=\"margin-bottom:8px; padding:10px 14px;\">' +\n                        '<div class=\"cvp-invite-thumb\" style=\"width:36px; height:36px; font-size:16px;\">\u2709<\/div>' +\n                        '<div class=\"cvp-invite-info\">' +\n                            '<div class=\"nm\" style=\"font-size:14px;\">'+escapeHtml(c.nome || 'Sem nome')+'<\/div>' +\n                            '<div class=\"mt\"><span>'+escapeHtml(c.categoria)+'<\/span> \u00b7 <span>'+fmtDate(c.data)+'<\/span><\/div>' +\n                        '<\/div>' +\n                        '<span class=\"cvp-status '+c.estado+'\">'+statusLabel(c.estado)+'<\/span>' +\n                        '<button class=\"cvp-btn outline small\" data-edit=\"'+c.id+'\">Ver<\/button>' +\n                    '<\/div>';\n                }).join('');\n\n                els.recent.querySelectorAll('[data-edit]').forEach(function(btn){\n                    btn.addEventListener('click', function(){ openModal(btn.getAttribute('data-edit')); });\n                });\n            }\n\n            function renderCalendar(){\n                var d = state.calDate;\n                var year = d.getFullYear(), month = d.getMonth();\n                var first = new Date(year, month, 1);\n                var startWeekday = (first.getDay() + 6) % 7; \/\/ segunda = 0\n                var daysInMonth = new Date(year, month+1, 0).getDate();\n                var monthNames = ['Janeiro','Fevereiro','Mar\u00e7o','Abril','Maio','Junho','Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'];\n                els.calLabel.textContent = monthNames[month] + ' ' + year;\n\n                var byDay = {};\n                state.convites.forEach(function(c){\n                    if (!c.data) return;\n                    var dd = new Date(c.data + 'T00:00:00');\n                    if (dd.getFullYear() === year && dd.getMonth() === month){\n                        var key = dd.getDate();\n                        byDay[key] = byDay[key] || [];\n                        byDay[key].push(c);\n                    }\n                });\n\n                var html = ['Seg','Ter','Qua','Qui','Sex','S\u00e1b','Dom'].map(function(n){\n                    return '<div class=\"cvp-cal-day-name\">'+n+'<\/div>';\n                }).join('');\n\n                for (var i=0;i<startWeekday;i++){ html += '<div class=\"cvp-cal-cell empty\"><\/div>'; }\n                for (var day=1; day<=daysInMonth; day++){\n                    var tags = (byDay[day]||[]).map(function(c){\n                        return '<div class=\"cvp-cal-tag\" data-edit-cal=\"'+c.id+'\" title=\"'+escapeHtml(c.nome)+'\">'+escapeHtml(c.nome)+'<\/div>';\n                    }).join('');\n                    html += '<div class=\"cvp-cal-cell\"><div class=\"d\">'+day+'<\/div>'+tags+'<\/div>';\n                }\n                els.calGrid.innerHTML = html;\n\n                els.calGrid.querySelectorAll('[data-edit-cal]').forEach(function(el){\n                    el.addEventListener('click', function(e){\n                        e.stopPropagation();\n                        openModal(el.getAttribute('data-edit-cal'));\n                    });\n                });\n            }\n\n            els.calPrev && els.calPrev.addEventListener('click', function(){\n                state.calDate = new Date(state.calDate.getFullYear(), state.calDate.getMonth()-1, 1);\n                renderCalendar();\n            });\n            els.calNext && els.calNext.addEventListener('click', function(){\n                state.calDate = new Date(state.calDate.getFullYear(), state.calDate.getMonth()+1, 1);\n                renderCalendar();\n            });\n\n            els.filters.forEach(function(chip){\n                chip.addEventListener('click', function(){\n                    els.filters.forEach(function(c){ c.classList.remove('active'); });\n                    chip.classList.add('active');\n                    state.filter = chip.getAttribute('data-filter');\n                    renderList();\n                });\n            });\n\n            els.search && els.search.addEventListener('input', function(e){\n                state.search = e.target.value;\n                renderList();\n            });\n\n            els.sort && els.sort.addEventListener('change', function(e){\n                state.sort = e.target.value;\n                renderList();\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            var fields = root.querySelectorAll('[data-f]');\n            function getField(name){ return root.querySelector('[data-f=\"'+name+'\"]'); }\n            function fillForm(c){\n                fields.forEach(function(f){\n                    var key = f.getAttribute('data-f');\n                    f.value = c && c[key] !== undefined ? c[key] : (key === 'categoria' ? 'Casamento' : (key === 'estado' ? 'rascunho' : ''));\n                });\n            }\n\n            function openModal(id){\n                var c = id ? state.convites.find(function(x){ return x.id === id; }) : null;\n                fillForm(c);\n                els.modalTitle.textContent = c ? 'Editar Convite' : 'Criar Novo Convite';\n                els.del.style.display = c ? '' : 'none';\n                els.overlay.classList.add('open');\n            }\n            function closeModal(){ els.overlay.classList.remove('open'); }\n\n            els.newBtns.forEach(function(btn){ btn.addEventListener('click', function(){ openModal(null); }); });\n            els.cancel.forEach(function(btn){ btn.addEventListener('click', closeModal); });\n            els.overlay.addEventListener('click', function(e){ if (e.target === els.overlay) closeModal(); });\n\n            els.exportBtns.forEach(function(btn){\n                btn.addEventListener('click', function(){\n                    var dataStr = \"data:text\/json;charset=utf-8,\" + encodeURIComponent(JSON.stringify(state.convites, null, 2));\n                    var downloadAnchor = document.createElement('a');\n                    downloadAnchor.setAttribute(\"href\", dataStr);\n                    downloadAnchor.setAttribute(\"download\", \"convite_plus_backup.json\");\n                    document.body.appendChild(downloadAnchor);\n                    downloadAnchor.click();\n                    downloadAnchor.remove();\n                });\n            });\n\n            els.save.addEventListener('click', function(){\n                var id = getField('id').value;\n                var nome = getField('nome').value.trim();\n                if (!nome){ \n                    getField('nome').focus(); \n                    getField('nome').style.borderColor = 'var(--cvp-danger)';\n                    return; \n                }\n                getField('nome').style.borderColor = '';\n\n                var payload = {\n                    id: id || uid(),\n                    nome: nome,\n                    categoria: getField('categoria').value,\n                    data: getField('data').value,\n                    local: getField('local').value.trim(),\n                    estado: getField('estado').value,\n                    notas: getField('notas').value.trim()\n                };\n                if (id){\n                    var idx = state.convites.findIndex(function(c){ return c.id === id; });\n                    if (idx > -1) state.convites[idx] = payload;\n                } else {\n                    state.convites.push(payload);\n                }\n                saveData();\n                closeModal();\n                renderAll();\n            });\n\n            els.del.addEventListener('click', function(){\n                var id = getField('id').value;\n                if (!id) return;\n                if (!confirm('Tem a certeza que pretende eliminar este convite?')) return;\n                state.convites = state.convites.filter(function(c){ return c.id !== id; });\n                saveData();\n                closeModal();\n                renderAll();\n            });\n\n            function renderAll(){\n                renderPainel();\n                renderList();\n                if (state.view === 'calendario') renderCalendar();\n            }\n\n            saveData();\n            renderAll();\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-2604","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/app.digitalfreelancer.org\/index.php\/wp-json\/wp\/v2\/pages\/2604","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=2604"}],"version-history":[{"count":4,"href":"https:\/\/app.digitalfreelancer.org\/index.php\/wp-json\/wp\/v2\/pages\/2604\/revisions"}],"predecessor-version":[{"id":2650,"href":"https:\/\/app.digitalfreelancer.org\/index.php\/wp-json\/wp\/v2\/pages\/2604\/revisions\/2650"}],"wp:attachment":[{"href":"https:\/\/app.digitalfreelancer.org\/index.php\/wp-json\/wp\/v2\/media?parent=2604"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}