First Commit

This commit is contained in:
marco
2026-09-01 10:46:29 -03:00
commit bf96b77e9c
10000 changed files with 3508600 additions and 0 deletions
+9
View File
@@ -0,0 +1,9 @@
SysCMS Commercial License
Copyright (c) 2026 Marco Costa. All rights reserved.
This software is licensed, not sold. Permission is granted to use this software subject to the terms of the SysCMS Commercial License.
Redistribution, sublicensing, resale, or disclosure of this software, in whole or in part, is strictly prohibited without prior written permission from the author.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+27
View File
@@ -0,0 +1,27 @@
# Index Module for SysCMS
Home page and landing page management module.
## Features
- Customizable home page
- Landing page templates
- Content blocks and sections
- Multi-language support
## Installation
1. Upload the `index.zip` file through the module manager or extract it to the `modules/` directory.
2. Run the migrations to register the module.
3. Configure index page settings in the admin panel.
## Routes
- Web routes: `routes/web.php`
## Views
- `views/index.twig`: Main index page
- `views/layout.twig`: Layout template
- `views/about.twig`: About page
- `views/services.twig`: Services page
## License
Copyright (c) 2026 Marco Costa. All rights reserved.
Licensed under the SysCMS Commercial License.
+259
View File
@@ -0,0 +1,259 @@
<?php
/**
* SysCMS - Content Management System
*
* Copyright (c) 2025 Marco Costa
* All rights reserved.
*
* Author: Marco Costa
* Email: contato@syspanel.com.br
* Project: SysCMS
*
* This software is licensed, not sold.
* Permission is granted to use this software
* subject to the terms of the SysCMS Commercial License.
*
* Redistribution, sublicensing, resale, or
* disclosure of this software, in whole or in part,
* is strictly prohibited without prior written permission.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND.
*/
namespace Modules\Index\Controllers;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use App\Controllers\BaseController;
use Modules\Auth\Models\User;
use App\Models\Module;
use Symfony\Component\HttpFoundation\RedirectResponse;
class IndexController extends BaseController
{
/**
* Helper to render a view from the module's views folder
*/
protected function renderThemeView(string $viewName, array $data = []): Response
{
return $this->renderView('@index/' . $viewName . '.twig', $data);
}
/**
* Change the application language.
*
* @param Request $request
* @param string $lang
* @return Response
*/
public function changeLanguage(Request $request, string $lang): Response
{
// Checks if multi-language is enabled
if (!is_multi_lang_enabled()) {
// Redirects to previous page without changing language
$redirect = $request->query->get('redirect');
if ($redirect && strpos($redirect, '/language/') === false) {
return new RedirectResponse($redirect);
}
$referer = $request->headers->get('referer');
if (!$referer || strpos($referer, '/language/') !== false) {
$referer = '/';
}
return new RedirectResponse($referer);
}
$allowedLanguages = ['pt_BR', 'en_US', 'es_ES', 'de_DE', 'fr_FR'];
if (in_array($lang, $allowedLanguages)) {
$_SESSION['lang'] = $lang;
}
// Check for explicit redirect param
$redirect = $request->query->get('redirect');
if ($redirect && strpos($redirect, '/language/') === false) {
return new RedirectResponse($redirect);
}
// Redirect back to previous page or home
$referer = $request->headers->get('referer');
// Prevent redirect loop if referer contains the language switch URL itself
if (!$referer || strpos($referer, '/language/') !== false) {
$referer = '/';
}
return new RedirectResponse($referer);
}
/**
* Display the about page.
*
* @param Request $request
* @return Response
*/
public function about(Request $request): Response
{
$pageContent = null;
$metaTitle = null;
$metaDescription = null;
$title = __('index.about_title');
if (class_exists('Modules\\Configindex\\Models\\ConfigPage')) {
try {
$busId = $_SESSION['current_company_id'] ?? 1;
$page = \Modules\Configindex\Models\ConfigPage::getByKey('about', $busId);
if ($page) {
$pageContent = $page->config_index_content;
if ($page->config_index_title) {
$title = $page->config_index_title;
}
$metaTitle = $page->config_index_meta_title;
$metaDescription = $page->config_index_meta_description;
}
} catch (\Exception $e) {
// Ignore if table not found or other error
}
}
return $this->renderThemeView('about', [
'title' => $title,
'page_content' => $pageContent,
'meta_title' => $metaTitle,
'meta_description' => $metaDescription
]);
}
/**
* Display a dynamic page from config_index.
*
* @param Request $request
* @param string $key
* @return Response
*/
public function page(Request $request, string $key): Response
{
$pageContent = null;
$metaTitle = null;
$metaDescription = null;
$title = ucfirst($key);
if (class_exists('Modules\\Configindex\\Models\\ConfigPage')) {
try {
$busId = $_SESSION['current_company_id'] ?? 1;
$page = \Modules\Configindex\Models\ConfigPage::getByKey($key, $busId);
if ($page) {
$pageContent = $page->config_index_content;
if ($page->config_index_title) {
$title = $page->config_index_title;
}
$metaTitle = $page->config_index_meta_title;
$metaDescription = $page->config_index_meta_description;
} else {
// Se não estiver no banco, verifica se o arquivo físico existe
$viewsDir = dirname(__DIR__, 2) . '/views';
if (!is_file($viewsDir . '/' . $key . '.twig') && !is_file($viewsDir . '/' . $key . '.php')) {
return new Response('Page not found', 404);
}
}
} catch (\Exception $e) {
// Ignore error
}
}
return $this->renderThemeView($key, [
'title' => $title,
'page_content' => $pageContent,
'meta_title' => $metaTitle,
'meta_description' => $metaDescription
]);
}
/**
* Display the services page.
*
* @param Request $request
* @return Response
*/
public function services(Request $request): Response
{
$pageContent = null;
$metaTitle = null;
$metaDescription = null;
$title = __('index.services_title');
if (class_exists('Modules\\Configindex\\Models\\ConfigPage')) {
try {
$busId = $_SESSION['current_company_id'] ?? 1;
$page = \Modules\Configindex\Models\ConfigPage::getByKey('services', $busId);
if ($page) {
$pageContent = $page->config_index_content;
if ($page->config_index_title) {
$title = $page->config_index_title;
}
$metaTitle = $page->config_index_meta_title;
$metaDescription = $page->config_index_meta_description;
}
} catch (\Exception $e) {
// Ignore if table not found or other error
}
}
return $this->renderThemeView('services', [
'title' => $title,
'page_content' => $pageContent,
'meta_title' => $metaTitle,
'meta_description' => $metaDescription
]);
}
/**
* Display the homepage.
*
* @param Request $request
* @return Response
*/
public function index(Request $request): Response
{
// Get active public modules
$publicModules = Module::active()->public()->ordered()->get();
// Get featured content (could be from blog, news, etc.)
$featuredContent = $this->getFeaturedContent();
return $this->renderThemeView('index', [
'title' => __('index.welcome_title'),
'public_modules' => $publicModules,
'featured_content' => $featuredContent
]);
}
/**
* Get featured content for homepage.
*
* @return array
*/
protected function getFeaturedContent(): array
{
// This is a placeholder implementation
// In a real app, this would fetch from blog posts, news, etc.
return [
[
'type' => 'blog',
'title' => 'Últimas Publicações',
'content' => 'Confira nossos artigos mais recentes...',
'icon' => 'bi bi-journal-richtext',
'link' => '/blog'
],
[
'type' => 'news',
'title' => 'Notícias e Atualizações',
'content' => 'Fique por dentro das novidades do sistema...',
'icon' => 'bi bi-newspaper',
'link' => '/news'
]
];
}
}
+21
View File
@@ -0,0 +1,21 @@
<?php
namespace Modules\Index\Providers;
use Kernel\Application;
class IndexServiceProvider
{
public function register()
{
}
public function boot()
{
$app = Application::getInstance();
$app->addPublicPath('/');
$app->addPublicPath('/home');
$app->addPublicPath('/about');
$app->addPublicPath('/services');
}
}
@@ -0,0 +1,78 @@
<?php
use Illuminate\Database\Capsule\Manager as Capsule;
use App\Models\Module;
use Modules\Company\Models\Company;
class InsertIndexModule
{
public function up()
{
$moduleData = [
'modules_name' => 'index',
'modules_display_name' => 'Index',
'modules_description' => 'Main index module for homepage',
'modules_version' => '1.0.0',
'modules_author' => 'SysCMS Team',
'modules_ative' => true,
'modules_public' => true,
'modules_blocked' => true,
'modules_dependencies' => [],
'modules_permissions' => [
"index.view"
],
'modules_settings' => [
"show_featured_content" => true,
"featured_content_limit" => 6
],
'modules_path' => 'modules/index',
'modules_namespace' => 'Modules\\Index',
'modules_icon' => 'bi bi-house',
'menu_side_bar' => false,
'menu_nav_bar' => true,
'modules_order' => 1,
'modules_install_date' => date('Y-m-d H:i:s'),
'modules_update_date' => date('Y-m-d H:i:s')
];
$existingModule = Module::where('modules_name', 'index')->first();
if (!$existingModule) {
$module = Module::create($moduleData);
if (Capsule::schema()->hasTable('bus')) {
$companies = Company::all();
foreach ($companies as $company) {
$exists = Capsule::table('bus_modules')
->where('bus_modules_bus_id', $company->bus_id)
->where('bus_modules_module_id', $module->modules_id)
->exists();
if (!$exists) {
Capsule::table('bus_modules')->insert([
'bus_modules_bus_id' => $company->bus_id,
'bus_modules_module_id' => $module->modules_id,
'bus_modules_is_enabled' => true,
'bus_modules_settings' => json_encode([]),
'bus_modules_enabled_by' => 1,
'bus_modules_enabled_at' => date('Y-m-d H:i:s'),
'bus_modules_show_public_nav' => true,
'bus_modules_show_dashboard_nav' => false,
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s')
]);
}
}
}
}
}
public function down()
{
$module = Module::where('modules_name', 'index')->first();
if ($module) {
Capsule::table('bus_modules')->where('bus_modules_module_id', $module->modules_id)->delete();
$module->delete();
}
}
}
+3
View File
@@ -0,0 +1,3 @@
{
"dashboard": "Dashboard"
}
+63
View File
@@ -0,0 +1,63 @@
{
"menu": {
"home": "Startseite"
},
"contact": {
"title": "Kontaktieren Sie uns",
"subtitle": "Wir sind hier, um Ihnen und Ihrem Unternehmen zu helfen",
"address_title": "Adresse",
"phone_title": "Telefon",
"email_title": "E-Mail",
"form_title": "Nachricht senden",
"form_subtitle": "Wir antworten so schnell wie möglich",
"form_name": "Vollständiger Name",
"form_email": "Ihre E-Mail",
"form_subject": "Betreff",
"form_message": "Nachricht",
"form_submit": "Nachricht senden"
},
"welcome_title": "Willkommen bei :platformName",
"welcome_message": "Erstellen, bearbeiten und veröffentlichen Sie Inhalte, Websites und Webanwendungen mit der Freiheit und Leistung, die ein modernes CMS benötigt.",
"get_started": "Jetzt loslegen",
"learn_more": "Mehr erfahren",
"features_title": "Hauptfunktionen",
"features_subtitle": "Entdecken Sie alle Funktionen, die :platformName bietet, um Ihr Management zu transformieren.",
"feature1_title": "Modulare Architektur",
"feature1_desc": "Erweitern Sie die Funktionalität mit unabhängigen, einfach zu verwaltenden Modulen.",
"feature2_title": "Mehrsprachige Unterstützung",
"feature2_desc": "Native Unterstützung für 5 Sprachen und bereit für globale Expansion.",
"feature3_title": "SEO-Optimierung",
"feature3_desc": "Integrierte Tools für ein besseres Suchmaschinen-Ranking.",
"feature4_title": "Zugangskontrolle",
"feature4_desc": "Granulare Verwaltung von Benutzern, Rollen und Zugriffsberechtigungen.",
"feature5_title": "Content Management",
"feature5_desc": "Intuitiver Editor zum Erstellen und Verwalten von Beiträgen, Seiten und Medien.",
"feature6_title": "Hohe Leistung",
"feature6_desc": "Moderne und optimierte Technologie für Geschwindigkeit und Stabilität.",
"stat1": "Aktive Kunden",
"stat2": "Abgeschlossene Projekte",
"stat3": "% Zufriedenheit",
"stat4": "24\/7 Support",
"testimonials_title": "Referenzen",
"testimonials_subtitle": "Sehen Sie, was unsere Kunden über :platformName sagen.",
"testimonial1": ":platformName hat die Art und Weise, wie wir unsere Projekte verwalten, komplett verändert. Die Oberfläche ist intuitiv und die Funktionen sind genau das, was wir brauchten.",
"testimonial1_author": "Johann Schmidt",
"testimonial1_role": "CEO, Tech Solutions",
"testimonial2": "Seit wir :platformName nutzen, ist unsere Produktivität um 40% gestiegen. Ich empfehle es jedem Unternehmen, das nach Optimierung sucht.",
"testimonial2_author": "Maria Weber",
"testimonial2_role": "Direktorin, Digitale Innovation",
"testimonial3": "Der Support des Teams ist außergewöhnlich und das System entwickelt sich ständig mit neuen Funktionen weiter, die wirklich einen Unterschied machen.",
"testimonial3_author": "Peter Müller",
"testimonial3_role": "Manager, Global Services",
"cta_title": "Bereit anzufangen?",
"cta_subtitle": "Schließen Sie sich Hunderten von Unternehmen an, die ihr Management bereits mit :platformName transformieren.",
"cta_button": "Kontaktieren Sie uns für weitere Informationen",
"about_title": "Über Uns",
"contact_title": "Kontakt",
"services_title": "Dienstleistungen",
"title": "Titel",
"contato": {
"title": "Contato",
"description": "Conteúdo da página contato"
}
}
+3
View File
@@ -0,0 +1,3 @@
{
"dashboard": "Dashboard"
}
+63
View File
@@ -0,0 +1,63 @@
{
"menu": {
"home": "Home"
},
"contact": {
"title": "Get in Touch",
"subtitle": "We are here to help you and your business",
"address_title": "Address",
"phone_title": "Phone",
"email_title": "Email",
"form_title": "Send a Message",
"form_subtitle": "We will reply as soon as possible",
"form_name": "Full Name",
"form_email": "Your Email",
"form_subject": "Subject",
"form_message": "Message",
"form_submit": "Send Message"
},
"welcome_title": "Welcome to :platformName",
"welcome_message": "Create, edit, and publish content, websites, and web applications with the freedom and performance a modern CMS needs.",
"get_started": "Get Started Now",
"learn_more": "Learn More",
"features_title": "Main Features",
"features_subtitle": "Discover all the features :platformName offers to transform your management.",
"feature1_title": "Modular Architecture",
"feature1_desc": "Expand functionality with independent, easy-to-manage modules.",
"feature2_title": "Multi-language Support",
"feature2_desc": "Native support for 5 languages and ready for global expansion.",
"feature3_title": "SEO Optimization",
"feature3_desc": "Integrated tools to ensure better search engine ranking.",
"feature4_title": "Access Control",
"feature4_desc": "Granular management of users, roles, and access permissions.",
"feature5_title": "Content Management",
"feature5_desc": "Intuitive editor to create and manage posts, pages, and media.",
"feature6_title": "High Performance",
"feature6_desc": "Modern and optimized technology to ensure speed and stability.",
"stat1": "Active Clients",
"stat2": "Completed Projects",
"stat3": "% Satisfaction",
"stat4": "24\/7 Support",
"testimonials_title": "Testimonials",
"testimonials_subtitle": "See what our clients say about :platformName.",
"testimonial1": ":platformName completely transformed how we manage our projects. The interface is intuitive and the features are exactly what we needed.",
"testimonial1_author": "John Doe",
"testimonial1_role": "CEO, Tech Solutions",
"testimonial2": "Since we started using :platformName, our productivity increased by 40%. I recommend it to any company looking for optimization.",
"testimonial2_author": "Jane Smith",
"testimonial2_role": "Director, Digital Innovation",
"testimonial3": "The team support is exceptional and the system keeps evolving with new features that really make a difference.",
"testimonial3_author": "Peter Jones",
"testimonial3_role": "Manager, Global Services",
"cta_title": "Ready to start?",
"cta_subtitle": "Join hundreds of companies already transforming their management with :platformName.",
"cta_button": "Contact us for more information",
"about_title": "About Us",
"contact_title": "Contact",
"services_title": "Services",
"title": "Title",
"contato": {
"title": "Contato",
"description": "Conteúdo da página contato"
}
}
+3
View File
@@ -0,0 +1,3 @@
{
"dashboard": "Panel de Control"
}
+63
View File
@@ -0,0 +1,63 @@
{
"menu": {
"home": "Inicio"
},
"contact": {
"title": "Ponte en Contacto",
"subtitle": "Estamos aquí para ayudarte a ti y a tu negocio",
"address_title": "Dirección",
"phone_title": "Teléfono",
"email_title": "Correo Electrónico",
"form_title": "Envía un Mensaje",
"form_subtitle": "Responderemos lo antes posible",
"form_name": "Nombre Completo",
"form_email": "Tu Correo",
"form_subject": "Asunto",
"form_message": "Mensaje",
"form_submit": "Enviar Mensaje"
},
"welcome_title": "Bienvenido a :platformName",
"welcome_message": "Crea, edita y publica contenidos, sitios web y aplicaciones web con la libertad y el rendimiento que necesita un CMS moderno.",
"get_started": "Empezar Ahora",
"learn_more": "Saber Más",
"features_title": "Características Principales",
"features_subtitle": "Descubre todas las funcionalidades que :platformName ofrece para transformar tu gestión.",
"feature1_title": "Arquitectura Modular",
"feature1_desc": "Expanda la funcionalidad con módulos independientes y fáciles de gestionar.",
"feature2_title": "Soporte Multi-idioma",
"feature2_desc": "Soporte nativo para 5 idiomas y preparado para expansión global.",
"feature3_title": "Optimización SEO",
"feature3_desc": "Herramientas integradas para garantizar un mejor posicionamiento en buscadores.",
"feature4_title": "Control de Acceso",
"feature4_desc": "Gestión granular de usuarios, roles y permisos de acceso.",
"feature5_title": "Gestión de Contenido",
"feature5_desc": "Editor intuitivo para crear y gestionar publicaciones, páginas y medios.",
"feature6_title": "Alto Rendimiento",
"feature6_desc": "Tecnología moderna y optimizada para garantizar velocidad y estabilidad.",
"stat1": "Clientes Activos",
"stat2": "Proyectos Completados",
"stat3": "% Satisfacción",
"stat4": "Soporte 24\/7",
"testimonials_title": "Testimonios",
"testimonials_subtitle": "Mira lo que nuestros clientes dicen sobre :platformName.",
"testimonial1": ":platformName transformó completamente la forma en que gestionamos nuestros proyectos. La interfaz es intuitiva y las funcionalidades son exactamente lo que necesitábamos.",
"testimonial1_author": "Juan Pérez",
"testimonial1_role": "CEO, Tech Solutions",
"testimonial2": "Desde que empezamos a usar :platformName, nuestra productividad aumentó un 40%. Lo recomiendo a cualquier empresa que busque optimización.",
"testimonial2_author": "María González",
"testimonial2_role": "Directora, Innovación Digital",
"testimonial3": "El soporte del equipo es excepcional y el sistema sigue evolucionando con nuevas funcionalidades que realmente marcan la diferencia.",
"testimonial3_author": "Pedro Rodríguez",
"testimonial3_role": "Gerente, Global Services",
"cta_title": "¿Listo para empezar?",
"cta_subtitle": "Únete a cientos de empresas que ya están transformando su gestión con :platformName.",
"cta_button": "Contáctenos para más información",
"about_title": "Sobre Nosotros",
"contact_title": "Contacto",
"services_title": "Servicios",
"title": "Título",
"contato": {
"title": "Contato",
"description": "Conteúdo da página contato"
}
}
+3
View File
@@ -0,0 +1,3 @@
{
"dashboard": "Tableau de bord"
}
+63
View File
@@ -0,0 +1,63 @@
{
"menu": {
"home": "Accueil"
},
"contact": {
"title": "Contactez-nous",
"subtitle": "Nous sommes là pour vous aider, vous et votre entreprise",
"address_title": "Adresse",
"phone_title": "Téléphone",
"email_title": "E-mail",
"form_title": "Envoyer un message",
"form_subtitle": "Nous répondrons dès que possible",
"form_name": "Nom complet",
"form_email": "Votre e-mail",
"form_subject": "Sujet",
"form_message": "Message",
"form_submit": "Envoyer le message"
},
"welcome_title": "Bienvenue sur :platformName",
"welcome_message": "Créez, modifiez et publiez des contenus, des sites web et des applications web avec la liberté et les performances qu’un CMS moderne exige.",
"get_started": "Commencer maintenant",
"learn_more": "En savoir plus",
"features_title": "Fonctionnalités principales",
"features_subtitle": "Découvrez toutes les fonctionnalités offertes par :platformName pour transformer votre gestion.",
"feature1_title": "Architecture Modulaire",
"feature1_desc": "Étendez les fonctionnalités avec des modules indépendants et faciles à gérer.",
"feature2_title": "Support Multi-langue",
"feature2_desc": "Support natif pour plusieurs langues, y compris la détection automatique.",
"feature3_title": "Gestion de Contenu",
"feature3_desc": "Outils avancés pour créer, éditer et organiser du contenu efficacement.",
"feature4_title": "Contrôle d'Accès",
"feature4_desc": "Système d'autorisations granulaire pour gérer les utilisateurs et les groupes.",
"feature5_title": "Optimisation SEO",
"feature5_desc": "Fonctionnalités intégrées pour améliorer le classement dans les moteurs de recherche.",
"feature6_title": "API RESTful",
"feature6_desc": "Intégration facile avec d'autres systèmes via une API complète et documentée.",
"stat1": "Clients Actifs",
"stat2": "Projets Terminés",
"stat3": "% Satisfaction",
"stat4": "Support 24\/7",
"testimonials_title": "Témoignages",
"testimonials_subtitle": "Voyez ce que nos clients disent de :platformName.",
"testimonial1": ":platformName a complètement transformé la façon dont nous gérons nos projets. L'interface est intuitive et les fonctionnalités sont exactement ce dont nous avions besoin.",
"testimonial1_author": "Jean Dupont",
"testimonial1_role": "PDG, Tech Solutions",
"testimonial2": "Depuis que nous utilisons :platformName, notre productivité a augmenté de 40%. Je le recommande à toute entreprise cherchant à optimiser ses processus.",
"testimonial2_author": "Marie Martin",
"testimonial2_role": "Directrice, Innovation Digitale",
"testimonial3": "Le support de l'équipe est exceptionnel et le système continue d'évoluer avec de nouvelles fonctionnalités qui font vraiment la différence.",
"testimonial3_author": "Pierre Durand",
"testimonial3_role": "Manager, Global Services",
"cta_title": "Prêt à commencer ?",
"cta_subtitle": "Rejoignez des centaines d'entreprises qui transforment déjà leur gestion avec :platformName.",
"cta_button": "Contactez-nous pour plus d'informations",
"about_title": "À propos de nous",
"contact_title": "Contact",
"services_title": "Services",
"title": "Titre",
"contato": {
"title": "Contato",
"description": "Conteúdo da página contato"
}
}
+4
View File
@@ -0,0 +1,4 @@
{
"dashboard": "Painel de Controle",
"user_info": "Você está logado como usuário. Aqui você pode gerenciar seu perfil e acessar os serviços autorizados."
}
+63
View File
@@ -0,0 +1,63 @@
{
"menu": {
"home": "Início"
},
"title": "Início",
"contact": {
"title": "Entre em Contato",
"subtitle": "Estamos aqui para ajudar você e seu negócio",
"address_title": "Endereço",
"phone_title": "Telefone",
"email_title": "Email",
"form_title": "Envie uma Mensagem",
"form_subtitle": "Responderemos o mais breve possível",
"form_name": "Nome Completo",
"form_email": "Seu Email",
"form_subject": "Assunto",
"form_message": "Mensagem",
"form_submit": "Enviar Mensagem"
},
"welcome_title": "Bem-vindo ao :platformName",
"welcome_message": "Crie, edite e publique conteúdos, sites e aplicativos web com a liberdade e a performance que um CMS moderno precisa.",
"get_started": "Começar Agora",
"learn_more": "Saiba Mais",
"features_title": "Recursos Principais",
"features_subtitle": "Descubra todas as funcionalidades que o :platformName oferece para transformar sua gestão.",
"feature1_title": "Arquitetura Modular",
"feature1_desc": "Expanda as funcionalidades com módulos independentes e fáceis de gerenciar.",
"feature2_title": "Suporte Multi-idioma",
"feature2_desc": "Tradução nativa para 5 idiomas e preparado para expansão global.",
"feature3_title": "Otimização SEO",
"feature3_desc": "Ferramentas integradas para garantir melhor posicionamento nos buscadores.",
"feature4_title": "Controle de Acesso",
"feature4_desc": "Gestão granular de usuários, funções e permissões de acesso.",
"feature5_title": "Gestão de Conteúdo",
"feature5_desc": "Editor intuitivo para criar e gerenciar posts, páginas e mídias.",
"feature6_title": "Alto Desempenho",
"feature6_desc": "Tecnologia moderna e otimizada para garantir velocidade e estabilidade.",
"stat1": "Clientes Ativos",
"stat2": "Projetos Concluídos",
"stat3": "% Satisfação",
"stat4": "Suporte 24\/7",
"testimonials_title": "Depoimentos",
"testimonials_subtitle": "Veja o que nossos clientes dizem sobre o :platformName.",
"testimonial1": "O :platformName transformou completamente a forma como gerenciamos nossos projetos. A interface é intuitiva e as funcionalidades são exatamente o que precisávamos.",
"testimonial1_author": "João Silva",
"testimonial1_role": "CEO, Tech Solutions",
"testimonial2": "Desde que começamos a usar o :platformName, nossa produtividade aumentou 40%. Recomendo para qualquer empresa que busca otimização.",
"testimonial2_author": "Maria Santos",
"testimonial2_role": "Diretora, Inovação Digital",
"testimonial3": "O suporte da equipe é excepcional e o sistema continua evoluindo com novas funcionalidades que realmente fazem a diferença.",
"testimonial3_author": "Pedro Costa",
"testimonial3_role": "Gerente, Global Services",
"cta_title": "Pronto para começar?",
"cta_subtitle": "Junte-se a centenas de empresas que já estão transformando sua gestão com o :platformName.",
"cta_button": "Entre em contato conosco para mais informações",
"about_title": "Sobre Nós",
"contact_title": "Contato",
"services_title": "Nossos Serviços",
"contato": {
"title": "Contato",
"description": "Conteúdo da página contato"
}
}
+41
View File
@@ -0,0 +1,41 @@
{
"name": "index",
"display_name": "Index",
"description": "Main index module for homepage",
"version": "1.0.0",
"author": "SysCMS Team",
"dependencies": [],
"permissions": [
"index.view"
],
"settings": {
"show_featured_content": true,
"featured_content_limit": 6
},
"assets": {
"css": [],
"js": []
},
"providers": [
"Modules\\Index\\Providers\\IndexServiceProvider"
],
"routes": {
"web": "routes/web.php",
"api": "routes/api.php"
},
"menu": {
"public": {
"icon": "bi bi-house",
"label": "index.menu.home",
"route": "/",
"order": 1
}
},
"views": "views",
"locales": "locales",
"module_ative": true,
"module_public": true,
"module_blocked": true,
"ready": true,
"tables": []
}
View File
+64
View File
@@ -0,0 +1,64 @@
<?php
/**
* SysCMS - Content Management System
*
* Copyright (c) 2025 Marco Costa
* All rights reserved.
*
* Author: Marco Costa
* Email: contato@syspanel.com.br
* Project: SysCMS
*
* This software is licensed, not sold.
* Permission is granted to use this software
* subject to the terms of the SysCMS Commercial License.
*
* Redistribution, sublicensing, resale, or
* disclosure of this software, in whole or in part,
* is strictly prohibited without prior written permission.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND.
*/
use Kernel\Application;
/**
* Register index module routes
*
* @param Application $app
* @return void
*/
return function (Application $app) {
// Homepage route
$app->addRoute('GET', '/', [\Modules\Index\Controllers\IndexController::class, 'index']);
// Static pages
$app->addRoute('GET', '/about', [\Modules\Index\Controllers\IndexController::class, 'about']);
$app->addRoute('GET', '/services', [\Modules\Index\Controllers\IndexController::class, 'services']);
// Language switcher route
$app->addRoute('GET', '/language/{lang}', [\Modules\Index\Controllers\IndexController::class, 'changeLanguage']);
// Dynamic pages from ConfigPage
if (class_exists('Modules\Configindex\Models\ConfigPage')) {
try {
$busId = $_SESSION['current_company_id'] ?? 1;
$pages = \Modules\Configindex\Models\ConfigPage::where('config_index_bus_id', $busId)->get();
foreach ($pages as $page) {
$key = $page->config_index_key;
if (!in_array($key, ['index', 'about', 'services', 'contact'])) {
$app->addRoute('GET', '/' . $key, function ($request) use ($key) {
$controller = \Kernel\Application::getInstance()->getContainer()->get(\Modules\Index\Controllers\IndexController::class);
return $controller->page($request, $key);
});
}
}
} catch (\Throwable $e) {
// Table might not exist yet
}
}
// Category route
$app->addRoute('GET', '/category/{category}', [\Modules\Index\Controllers\IndexController::class, 'category']);
};
+460
View File
@@ -0,0 +1,460 @@
{% extends "@index/layout.twig" %}
{% block title %}{{ platformName }} - Fluxo de Caixa Pro com Inteligência Artificial{% endblock %}
{% block head %}
<style>
:root {
--primary-gradient: linear-gradient(135deg, #1e3a8a 0%, #3b82f6 100%);
--ai-gradient: linear-gradient(135deg, #8b5cf6 0%, #d946ef 100%);
--dark-bg: #0f172a;
--success-color: #22c55e;
--danger-color: #ef4444;
--info-color: #06b6d4;
}
body {
font-family: 'Inter', system-ui, -apple-system, sans-serif;
overflow-x: hidden;
background: #f8fafc !important;
}
.hero-section {
background: var(--dark-bg);
background-image:
radial-gradient(circle at 20% 30%, rgba(59, 130, 246, 0.15) 0%, transparent 40%),
radial-gradient(circle at 80% 70%, rgba(139, 92, 246, 0.15) 0%, transparent 40%);
color: white;
padding: 120px 0 80px;
position: relative;
overflow: hidden;
}
.hero-badge {
background: rgba(139, 92, 246, 0.1);
border: 1px solid rgba(139, 92, 246, 0.3);
color: #a78bfa;
padding: 8px 20px;
border-radius: 50px;
font-size: 0.9rem;
font-weight: 600;
display: inline-block;
margin-bottom: 25px;
backdrop-filter: blur(10px);
}
.hero-title {
font-size: clamp(2.5rem, 5vw, 4rem);
font-weight: 800;
line-height: 1.1;
margin-bottom: 25px;
letter-spacing: -0.02em;
}
.text-gradient {
background: var(--primary-gradient);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.text-ai-gradient {
background: var(--ai-gradient);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.hero-subtitle {
font-size: 1.25rem;
color: #94a3b8;
margin-bottom: 40px;
max-width: 600px;
line-height: 1.6;
}
.btn-glow {
position: relative;
padding: 16px 35px;
font-size: 1.1rem;
font-weight: 600;
border-radius: 12px;
transition: all 0.3s ease;
border: none;
}
.btn-success-glow {
background: linear-gradient(135deg, #25d366 0%, #128c7e 100%);
color: white;
box-shadow: 0 0 20px rgba(37, 211, 102, 0.4);
}
.btn-success-glow:hover {
transform: translateY(-2px);
box-shadow: 0 0 30px rgba(37, 211, 102, 0.6);
color: white;
}
.btn-whatsapp-cta {
background: white;
color: #128c7e !important;
padding: 18px 45px;
font-size: 1.2rem;
font-weight: 800;
border-radius: 15px;
transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);
border: none;
display: inline-flex;
align-items: center;
gap: 12px;
box-shadow: 0 15px 30px rgba(0, 0, 0, 0.2);
}
.btn-whatsapp-cta:hover {
transform: scale(1.05) translateY(-5px);
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3);
background: #f8fafc;
}
.btn-whatsapp-cta i {
font-size: 1.5rem;
}
/* Dashboard Mockup from Imagem3 */
.mockup-wrapper {
position: relative;
z-index: 1;
margin-top: 50px;
}
.mockup-container {
background: white;
border-radius: 20px;
padding: 25px;
box-shadow: 0 40px 100px -20px rgba(0,0,0,0.5);
border: 1px solid rgba(255,255,255,0.1);
}
.mockup-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 30px;
flex-wrap: wrap;
gap: 15px;
}
.mockup-title {
color: #1e293b;
font-size: 1.5rem;
font-weight: 700;
margin: 0;
}
.mockup-actions {
display: flex;
gap: 10px;
}
.mockup-btn {
padding: 8px 16px;
border-radius: 8px;
font-size: 0.85rem;
font-weight: 600;
border: 1px solid #e2e8f0;
display: flex;
align-items: center;
gap: 8px;
background: white;
color: #64748b;
}
.btn-ai-action {
background: #06b6d4;
color: white;
border: none;
}
.mockup-cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 20px;
margin-bottom: 30px;
}
.mockup-card {
padding: 20px;
border-radius: 12px;
border-left: 4px solid #cbd5e1;
background: #f8fafc;
}
.card-receitas { border-left-color: var(--success-color); }
.card-despesas { border-left-color: var(--danger-color); }
.card-saldo { border-left-color: var(--info-color); }
.card-pendentes { border-left-color: #eab308; }
.card-label {
font-size: 0.75rem;
text-transform: uppercase;
font-weight: 700;
color: #64748b;
margin-bottom: 5px;
}
.card-value {
font-size: 1.25rem;
font-weight: 800;
color: #1e293b;
}
.ai-floating-badge {
position: absolute;
top: -20px;
right: -20px;
background: var(--ai-gradient);
color: white;
padding: 15px 25px;
border-radius: 15px;
box-shadow: 0 15px 30px rgba(139, 92, 246, 0.4);
display: flex;
align-items: center;
gap: 12px;
z-index: 2;
animation: float 6s ease-in-out infinite;
}
@keyframes float {
0%, 100% { transform: translateY(0) rotate(0deg); }
50% { transform: translateY(-15px) rotate(2deg); }
}
.ai-pulse {
width: 10px;
height: 10px;
background: white;
border-radius: 50%;
position: relative;
}
.ai-pulse::after {
content: '';
position: absolute;
width: 100%;
height: 100%;
background: white;
border-radius: 50%;
animation: pulse 2s infinite;
}
@keyframes pulse {
0% { transform: scale(1); opacity: 0.8; }
100% { transform: scale(3); opacity: 0; }
}
/* Features Section */
.features-section {
padding: 100px 0;
}
.feature-card {
background: white;
padding: 40px;
border-radius: 24px;
border: 1px solid #e2e8f0;
transition: all 0.3s ease;
height: 100%;
}
.feature-card:hover {
transform: translateY(-10px);
box-shadow: 0 20px 40px rgba(0,0,0,0.05);
border-color: #3b82f6;
}
.icon-box {
width: 50px;
height: 50px;
border-radius: 12px;
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 20px;
font-size: 1.25rem;
}
.chart-placeholder {
height: 200px;
background: linear-gradient(to top, #f1f5f9 0%, transparent 100%);
border-radius: 8px;
display: flex;
align-items: flex-end;
gap: 8px;
padding: 15px;
}
.chart-bar {
flex: 1;
background: #e2e8f0;
border-radius: 4px 4px 0 0;
transition: height 1s ease;
}
.chart-bar.active { background: #3b82f6; }
</style>
{% endblock %}
{% block layout_body %}
{# Hero Section #}
<section class="hero-section">
<div class="container">
<div class="row align-items-center">
<div class="col-lg-6">
<div class="hero-badge">
<i class="bi bi-stars"></i> Nova Era da Gestão Financeira
</div>
<h1 class="hero-title">
Seu Fluxo de Caixa <br>
<span class="text-ai-gradient">Potencializado por IA</span>
</h1>
<p class="hero-subtitle">
O Fluxo de Caixa Pro utiliza IA para analisar a saúde financeira do seu negócio, alertando sobre misturas de contas pessoais, sugerindo reservas de emergência e prevendo o saldo futuro.
</p>
<div class="d-flex gap-3 flex-wrap">
<a href="https://wa.me/5535992261684?text=Olá! Gostaria de saber mais sobre o Fluxo de Caixa Pro." target="_blank" class="btn btn-glow btn-success-glow">
<i class="bi bi-whatsapp"></i> Falar com Especialista
</a>
</div>
</div>
<div class="col-lg-6">
<div class="mockup-wrapper">
<div class="ai-floating-badge">
<div class="ai-pulse"></div>
<div>
<div class="fw-bold" style="font-size: 0.85rem;">IA Ativa</div>
<div style="font-size: 0.75rem; opacity: 0.9;">Otimizando projeções...</div>
</div>
</div>
<div class="mockup-container">
<div class="mockup-header">
<h3 class="mockup-title">Dashboard Pro</h3>
<div class="mockup-actions">
<div class="mockup-btn"><i class="bi bi-bank"></i> Conciliação</div>
<div class="mockup-btn btn-ai-action"><i class="bi bi-cpu"></i> Análise IA</div>
</div>
</div>
<div class="mockup-cards">
<div class="mockup-card card-receitas">
<div class="card-label">Receitas</div>
<div class="card-value">R$ 45.200,00</div>
</div>
<div class="mockup-card card-despesas">
<div class="card-label">Despesas</div>
<div class="card-value">R$ 28.150,00</div>
</div>
<div class="mockup-card card-saldo">
<div class="card-label">Saldo</div>
<div class="card-value text-info">R$ 17.050,00</div>
</div>
</div>
<div class="mt-4">
<div class="d-flex justify-content-between align-items-center mb-3">
<h6 class="fw-bold m-0" style="color: #1e293b;">Projeção de Saldo (12 meses)</h6>
<span class="badge bg-success-subtle text-success">Cenário Otimista +24%</span>
</div>
<div class="chart-placeholder">
<div class="chart-bar" style="height: 30%;"></div>
<div class="chart-bar" style="height: 45%;"></div>
<div class="chart-bar" style="height: 40%;"></div>
<div class="chart-bar active" style="height: 65%;"></div>
<div class="chart-bar" style="height: 55%;"></div>
<div class="chart-bar" style="height: 80%;"></div>
<div class="chart-bar active" style="height: 95%;"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
{# Features Section #}
<section class="features-section">
<div class="container">
<div class="text-center mb-5">
<span class="text-primary fw-bold text-uppercase tracking-wider">Recursos Premium</span>
<h2 class="display-5 fw-bold mt-2" style="color: #0f172a;">Por que escolher o Pro?</h2>
</div>
<div class="row g-4">
<div class="col-md-3">
<div class="feature-card">
<div class="icon-box bg-blue-subtle text-primary">
<i class="bi bi-lightning-charge-fill"></i>
</div>
<h4 class="fw-bold mb-3">Análise Preditiva</h4>
<p class="text-muted small">Previsões baseadas em dados históricos reais para os próximos 12 meses, identificando tendências de crescimento.</p>
</div>
</div>
<div class="col-md-3">
<div class="feature-card">
<div class="icon-box bg-purple-subtle text-purple" style="color: #8b5cf6;">
<i class="bi bi-robot"></i>
</div>
<h4 class="fw-bold mb-3">IA Consultiva</h4>
<p class="text-muted small">Receba recomendações automáticas sobre reserva de emergência e separação entre contas pessoais e empresariais.</p>
</div>
</div>
<div class="col-md-3">
<div class="feature-card">
<div class="icon-box bg-info-subtle text-info">
<i class="bi bi-graph-up-arrow"></i>
</div>
<h4 class="fw-bold mb-3">Gestão de Riscos</h4>
<p class="text-muted small">Identificação imediata de déficit operacional e gaps de caixa (contas a pagar vs receber).</p>
</div>
</div>
<div class="col-md-3">
<div class="feature-card">
<div class="icon-box bg-green-subtle text-success">
<i class="bi bi-file-earmark-excel"></i>
</div>
<h4 class="fw-bold mb-3">Exportação Pro</h4>
<p class="text-muted small">Gere relatórios detalhados em Excel com um clique para contabilidade ou reuniões de diretoria.</p>
</div>
</div>
</div>
</div>
</section>
{# CTA Section #}
<section class="py-5">
<div class="container">
<div class="bg-primary rounded-5 p-5 text-center text-white" style="background: var(--primary-gradient) !important;">
<h2 class="display-6 fw-bold mb-4">Pronto para transformar sua gestão?</h2>
<p class="lead mb-4 opacity-75">Fale agora mesmo conosco e descubra como a IA pode dominar suas finanças.</p>
<a href="https://wa.me/5535992261684?text=Olá! Gostaria de uma demonstração do Fluxo de Caixa Pro." target="_blank" class="btn-whatsapp-cta">
<i class="bi bi-whatsapp"></i> Solicitar Demonstração Grátis
</a>
</div>
</div>
</section>
{% endblock %}
{% block scripts %}
<script>
// Simulação de animação das barras do gráfico
document.addEventListener('DOMContentLoaded', () => {
const bars = document.querySelectorAll('.chart-bar');
bars.forEach((bar, index) => {
const finalHeight = bar.style.height;
bar.style.height = '0';
setTimeout(() => {
bar.style.height = finalHeight;
}, index * 100);
});
});
</script>
{% endblock %}
+180
View File
@@ -0,0 +1,180 @@
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
{# SEO Meta Tags #}
<title>{{ title|default(seo.meta_title|default(platformName)) }}</title>
<meta name="description" content="{{ seo.meta_description }}">
{% if seo.meta_keywords %}
<meta name="keywords" content="{{ seo.meta_keywords }}">
{% endif %}
<link rel="canonical" href="{{ canonical_url|default(url(request_path|default(''))) }}">
{# Open Graph / Facebook #}
<meta property="og:type" content="website">
<meta property="og:url" content="{{ url(request_path|default('')) }}">
<meta property="og:title" content="{{ seo.og_title|default(title|default(platformName)) }}">
<meta property="og:description" content="{{ seo.og_description|default(seo.meta_description) }}">
{% if seo.og_image %}
<meta property="og:image" content="{{ url('storage/uploads/seo/' ~ seo.og_image) }}">
{% endif %}
{# Twitter #}
<meta name="twitter:card" content="{{ seo.twitter_card|default('summary_large_image') }}">
<meta name="twitter:url" content="{{ url(request_path|default('')) }}">
<meta name="twitter:title" content="{{ seo.og_title|default(title|default(platformName)) }}">
<meta name="twitter:description" content="{{ seo.og_description|default(seo.meta_description) }}">
{% if seo.og_image %}
<meta name="twitter:image" content="{{ url('storage/uploads/seo/' ~ seo.og_image) }}">
{% endif %}
{# Google Verification #}
{% if seo.google_site_verification %}
<meta name="google-site-verification" content="{{ seo.google_site_verification }}">
{% endif %}
{# JSON-LD Structured Data #}
{% if seo.json_ld_type and seo.json_ld_type != 'none' %}
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "{{ seo.json_ld_type }}",
"name": "{{ seo.json_ld_name }}",
"url": "{{ seo.json_ld_url }}",
"description": "{{ seo.json_ld_description }}",
{% if seo.json_ld_phone %}"telephone": "{{ seo.json_ld_phone }}",{% endif %}
{% if seo.json_ld_email %}"email": "{{ seo.json_ld_email }}",{% endif %}
{% if seo.json_ld_address %}
"address": {
"@type": "PostalAddress",
"streetAddress": "{{ seo.json_ld_address }}",
"addressLocality": "{{ seo.json_ld_city }}",
"addressRegion": "{{ seo.json_ld_state }}",
"postalCode": "{{ seo.json_ld_zip }}",
"addressCountry": "{{ seo.json_ld_country }}"
},
{% endif %}
"sameAs": [
{% set social_links = seo.json_ld_social_links|split('\n') %}
{% for link in social_links %}
"{{ link|trim }}"{{ not loop.last ? ',' : '' }}
{% endfor %}
]
}
</script>
{% endif %}
{# Google Analytics #}
{% if seo.google_analytics_id %}
<script async src="https://www.googletagmanager.com/gtag/js?id={{ seo.google_analytics_id }}"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', '{{ seo.google_analytics_id }}');
</script>
{% endif %}
{# Bootstrap CSS #}
<link rel="stylesheet" href="{{ asset_url('css/bootstrap.min.css') }}">
{# Theme Specific Assets #}
<link rel="stylesheet" href="{{ asset_url('css/landing-page.css') }}">
{# Bootstrap Icons #}
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">
{# Quill Editor CSS (se habilitado) #}
{# Alpine.js #}
<script src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js" defer></script>
{% block head %}{% endblock %}
{# Customizer CSS #}
<style id="theme-customizer-css">
:root {
--primary-color: {{ theme_settings.primary_color|default('#0d6efd') }};
--bg-color: {{ theme_settings.background_color|default('#f8f9fa') }};
--text-color: {{ theme_settings.text_color|default('#212529') }};
}
body {
background-color: var(--bg-color) !important;
color: var(--text-color) !important;
}
.text-primary, .btn-primary {
color: var(--primary-color) !important;
}
.bg-primary, .btn-primary {
background-color: var(--primary-color) !important;
border-color: var(--primary-color) !important;
}
{% if theme_settings.container_width == 'container-fluid' %}
.container {
max-width: 100% !important;
}
{% endif %}
</style>
</head>
<body style="background:#f8f9fa;">
{% block layout_navbar %}
{# Navbar Global #}
{% if not is_maintenance_mode or (auth.user is defined and auth.user.role == 'super_admin') %}
{% include 'partials/nav-bar.twig' %}
{% endif %}
{% endblock %}
{% block layout_body %}
{# Conteúdo da página #}
<main class="container py-4">
{% block content %}{% endblock %}
</main>
{% endblock %}
{# Footer Global #}
{% if not is_maintenance_mode or (auth.user is defined and auth.user.role == 'super_admin') %}
{% include 'partials/footer.twig' %}
{% endif %}
{# Bootstrap JS #}
<script src="{{ asset_url('js/bootstrap.bundle.js') }}"></script>
{# Quill Editor JS (se habilitado) #}
{% block scripts %}{% endblock %}
<link rel="stylesheet" type="text/css" href="/consent/cookieconsent.min.css" />
<script src="/consent/cookieconsent.min.js"></script>
<script>
window.addEventListener("load", function(){
window.cookieconsent.initialise({
"palette": {
"popup": {
"background": "#216942",
"text": "#b2d192"
},
"button": {
"background": "#afed71"
}
},
"content": {
"message": "{{ __('layout.cookie_consent.message') }}",
"dismiss": "{{ __('layout.cookie_consent.dismiss') }}",
"link": "{{ __('layout.footer.terms') }}",
"href": "/user_terms.html"
}
})});
</script>
</body>
</html>