feat: add City10 platform with Laravel 13, AI agents, 3D viewer, and LGPD compliance

Initial commit of the complete City10 virtual city simulation platform.

Backend (Laravel 13):
- REST API with Sanctum tokens and session-based web authentication
- Role-based access control (admin/user) with middleware protection
- AI agent CRUD with OpenRouter.ai integration restricted to free models
- Store management with 3D coordinates and AI shopkeeper assignment
- Versioned legal documents (Terms, Privacy, Cookies) with LGPD audit trail
- Math CAPTCHA on public forms and multi-language support (pt_BR, en, es)

Frontend:
- Responsive Blade templates with Tailwind CSS v4
- Three.js 3D city viewer with SSE chat streaming to AI agents
- Admin panel for store and user administration

Infrastructure:
- MariaDB/MySQL database with comprehensive migrations
- Database seeders for demo content and test accounts
- PHPUnit test suite and Laravel Pint code styling
- Vite build configuration with hot reload
This commit is contained in:
2026-10-17 20:46:15 -03:00
commit 79d12fa2f4
128 changed files with 17053 additions and 0 deletions
+41
View File
@@ -0,0 +1,41 @@
@extends('layouts.app')
@section('title', 'Histórico de Consentimentos')
@section('content')
<div style="max-width: 820px; margin: 0 auto;">
<div class="card">
<h1 style="margin-top:0; color:#fff;">🗂️ Histórico de Consentimentos</h1>
<p style="color:var(--muted);">Registro auditável de todas as versões dos documentos legais que você aceitou.</p>
@if ($history->isEmpty())
<p style="color:var(--muted);">Nenhum consentimento registrado ainda.</p>
@else
<div style="overflow-x:auto;">
<table style="width:100%; border-collapse:collapse; font-size:.9rem;">
<thead>
<tr style="text-align:left; color:var(--muted); border-bottom:1px solid var(--border);">
<th style="padding:.6rem .4rem;">Documento</th>
<th style="padding:.6rem .4rem;">Versão</th>
<th style="padding:.6rem .4rem;">Aceito em</th>
<th style="padding:.6rem .4rem;">IP</th>
<th style="padding:.6rem .4rem;">Canal</th>
</tr>
</thead>
<tbody>
@foreach ($history as $entry)
<tr style="border-bottom:1px solid var(--border);">
<td style="padding:.6rem .4rem;">{{ $entry->document?->type }}</td>
<td style="padding:.6rem .4rem;">{{ $entry->document?->version }}</td>
<td style="padding:.6rem .4rem;">{{ $entry->accepted_at?->format('d/m/Y H:i:s') }}</td>
<td style="padding:.6rem .4rem;">{{ $entry->ip_address }}</td>
<td style="padding:.6rem .4rem;">{{ $entry->source }}</td>
</tr>
@endforeach
</tbody>
</table>
</div>
@endif
</div>
</div>
@endsection