Browse Source

fix functions

gdias 1 tháng trước cách đây
mục cha
commit
dfe18bc330

+ 11 - 0
.claude/settings.json

@@ -0,0 +1,11 @@
+{
+  "permissions": {
+    "allow": [
+      "Bash(curl -s http://localhost:5173)",
+      "Bash(cd /mnt/c/Users/gabri/.claude/projects/--wsl-localhost-Ubuntu-home-gabrielrd-workspace2-nettown-front && pwd)",
+      "Read(//mnt/c/Users/gabri/.claude/projects/**)",
+      "Bash(find /home -name \"nettown_front\" -type d 2>/dev/null | head -5)",
+      "Read(///wsl.localhost/Ubuntu//**)"
+    ]
+  }
+}

+ 7 - 0
.claude/settings.local.json

@@ -0,0 +1,7 @@
+{
+  "permissions": {
+    "allow": [
+      "Bash(npm run *)"
+    ]
+  }
+}

+ 313 - 251
src/routes/(app)/+layout.svelte

@@ -1,255 +1,317 @@
 <script>
-    import { page } from '$app/stores';
-    import { LayoutDashboard, MessageSquare, BarChart2, Settings, LogOut, Bell, Search, Menu, X, TrendingUp, ChevronLeft, ChevronRight, Moon, Sun, UserRound, User, Key, CreditCard, HelpCircle } from 'lucide-svelte';
-    import { goto } from '$app/navigation';
-    import logoWhite from '$lib/assets/images/nettown_white_logo.svg';
-    import logoBlack from '$lib/assets/images/nettown_black_logo.svg.svg';
-    import { theme, toggleTheme } from '$lib/core/stores/theme';
-    import { onMount } from 'svelte';
-
-    let { children } = $props();
-    let isMobileMenuOpen = $state(false);
-    let isSidebarCollapsed = $state(false);
-    let currentTheme = $state('light');
-    let isUserMenuOpen = $state(false);
-
-    onMount(() => {
-        theme.subscribe(val => {
-            currentTheme = val;
-        });
-    });
-
-    const navItems = [
-        { name: 'Visão Geral', href: '/dashboard', icon: LayoutDashboard },
-        { name: 'Interações', href: '/dashboard/interactions', icon: MessageSquare },
-        { name: 'Análise de Sentimento', href: '/dashboard/analytics', icon: BarChart2 },
-        { name: 'Personas', href: '/dashboard/personas', icon: UserRound },
-        { name: 'Evolução', href: '/dashboard/evolucao', icon: TrendingUp },
-        { name: 'Configurações', href: '/dashboard/settings', icon: Settings },
-    ];
-
-    function handleLogout() {
-        goto('/');
-    }
-
-    function toggleMobileMenu() {
-        isMobileMenuOpen = !isMobileMenuOpen;
-    }
-
-    function toggleSidebar() {
-        isSidebarCollapsed = !isSidebarCollapsed;
-    }
-
-    function isNavItemActive(href) {
-        const currentPath = $page.url.pathname;
-        if (href === '/dashboard') {
-            return currentPath === '/dashboard';
-        }
-        return currentPath === href || currentPath.startsWith(`${href}/`);
-    }
-
-    function toggleUserMenu() {
-        isUserMenuOpen = !isUserMenuOpen;
-    }
-
-    function handleUserAction(action) {
-        isUserMenuOpen = false;
-        switch(action) {
-            case 'profile':
-                // TODO: Navigate to profile page
-                console.log('Navigate to profile');
-                break;
-            case 'password':
-                // TODO: Open password change modal
-                console.log('Open password change modal');
-                break;
-            case 'billing':
-                // TODO: Navigate to billing page
-                console.log('Navigate to billing');
-                break;
-            case 'help':
-                // TODO: Open help modal
-                console.log('Open help modal');
-                break;
-            case 'logout':
-                handleLogout();
-                break;
-        }
-    }
+	import { page } from '$app/state';
+	import {
+		LayoutDashboard,
+		MessageSquare,
+		BarChart2,
+		Settings,
+		LogOut,
+		Bell,
+		Search,
+		Menu,
+		X,
+		TrendingUp,
+		ChevronLeft,
+		ChevronRight,
+		Moon,
+		Sun,
+		UserRound,
+		User,
+		CreditCard,
+		HelpCircle
+	} from 'lucide-svelte';
+	import { goto } from '$app/navigation';
+	import logoWhite from '$lib/assets/images/nettown_white_logo.svg';
+	import logoBlack from '$lib/assets/images/nettown_black_logo.svg.svg';
+	import { theme, toggleTheme } from '$lib/core/stores/theme';
+	import { onMount } from 'svelte';
+
+	let { children } = $props();
+	let isMobileMenuOpen = $state(false);
+	let isSidebarCollapsed = $state(false);
+	let currentTheme = $state('light');
+	let isUserMenuOpen = $state(false);
+
+	onMount(() => {
+		theme.subscribe((val) => {
+			currentTheme = val;
+		});
+	});
+
+	const navItems = [
+		{ name: 'Visão Geral', href: '/dashboard', icon: LayoutDashboard },
+		{ name: 'Interações', href: '/dashboard/interactions', icon: MessageSquare },
+		{ name: 'Análise de Sentimento', href: '/dashboard/analytics', icon: BarChart2 },
+		{ name: 'Personas', href: '/dashboard/personas', icon: UserRound },
+		{ name: 'Evolução', href: '/dashboard/evolucao', icon: TrendingUp },
+		{ name: 'Configurações', href: '/dashboard/settings', icon: Settings }
+	];
+
+	function handleLogout() {
+		goto('/');
+	}
+
+	function toggleMobileMenu() {
+		isMobileMenuOpen = !isMobileMenuOpen;
+	}
+
+	function toggleSidebar() {
+		isSidebarCollapsed = !isSidebarCollapsed;
+	}
+
+	function isNavItemActive(href) {
+		const currentPath = page.url.pathname;
+		if (href === '/dashboard') {
+			return currentPath === '/dashboard';
+		}
+		return currentPath === href || currentPath.startsWith(`${href}/`);
+	}
+
+	function toggleUserMenu() {
+		isUserMenuOpen = !isUserMenuOpen;
+	}
+
+	function closeUserMenu() {
+		isUserMenuOpen = false;
+	}
 </script>
 
-<div class="h-screen w-screen bg-slate-50 dark:bg-[#0f172a] text-slate-900 dark:text-slate-300 font-sans flex overflow-hidden transition-colors duration-200">
-    <!-- Mobile Sidebar Overlay -->
-    {#if isMobileMenuOpen}
-        <div class="fixed inset-0 bg-slate-950/80 z-40 lg:hidden" onclick={toggleMobileMenu} onkeydown={(e) => e.key === 'Escape' && toggleMobileMenu()} tabindex="0" role="button" aria-label="Fechar menu"></div>
-    {/if}
-
-    <!-- User Menu Overlay -->
-    {#if isUserMenuOpen}
-        <div class="fixed inset-0 z-40" onclick={() => isUserMenuOpen = false} onkeydown={(e) => e.key === 'Escape' && (isUserMenuOpen = false)} tabindex="0" role="button" aria-label="Fechar menu"></div>
-    {/if}
-
-    <!-- Sidebar -->
-    <aside class="fixed lg:static inset-y-0 left-0 z-50 h-full bg-white dark:bg-[#1e293b] border-r border-slate-200 dark:border-slate-800 flex flex-col transition-all duration-300 ease-in-out {isSidebarCollapsed ? 'w-20' : 'w-64'} {isMobileMenuOpen ? 'translate-x-0' : '-translate-x-full lg:translate-x-0'} shrink-0 shadow-sm dark:shadow-none">
-        <div class="h-16 flex items-center justify-between px-4 border-b border-slate-200 dark:border-slate-800 shrink-0">
-            <div class="flex items-center gap-2 text-indigo-600 dark:text-indigo-400 overflow-hidden">
-                <div class="h-6 flex items-center shrink-0 {isSidebarCollapsed ? 'w-8 justify-center' : 'w-auto'}">
-                    {#if isSidebarCollapsed}
-                        <TrendingUp size={24} strokeWidth={2.5} class="text-indigo-600 dark:text-indigo-500" />
-                    {:else}
-                        <img src={currentTheme === 'dark' ? logoWhite : logoBlack} alt="NetTown Analytics" class="h-full w-auto" />
-                    {/if}
-                </div>
-            </div>
-            
-            <button class="hidden lg:flex items-center justify-center p-1.5 text-slate-400 hover:text-slate-700 dark:hover:text-white rounded-lg hover:bg-slate-100 dark:hover:bg-slate-800 transition-colors shrink-0" onclick={toggleSidebar}>
-                {#if isSidebarCollapsed}
-                    <ChevronRight size={18} />
-                {:else}
-                    <ChevronLeft size={18} />
-                {/if}
-            </button>
-
-            <button class="lg:hidden text-slate-400 hover:text-slate-700 dark:hover:text-white p-1 shrink-0" onclick={toggleMobileMenu}>
-                <X size={20} />
-            </button>
-        </div>
-
-        <div class="flex-1 py-6 flex flex-col gap-2 overflow-y-auto overflow-x-hidden {isSidebarCollapsed ? 'px-2' : 'px-4'}">
-            <div class="text-xs font-semibold text-slate-500 uppercase tracking-wider mb-2 px-2 whitespace-nowrap {isSidebarCollapsed ? 'text-center text-[10px]' : ''}">
-                {isSidebarCollapsed ? 'Menu' : 'Menu Principal'}
-            </div>
-            {#each navItems as item}
-                {@const Icon = item.icon}
-                {@const isActive = isNavItemActive(item.href)}
-                <a 
-                    href={item.href} 
-                    title={isSidebarCollapsed ? item.name : ''}
-                    class="flex items-center gap-3 py-2.5 rounded-lg transition-colors {isActive ? 'bg-indigo-50 dark:bg-indigo-500/10 text-indigo-700 dark:text-indigo-400 font-medium' : 'text-slate-600 dark:text-slate-400 hover:bg-slate-100 dark:hover:bg-slate-800 hover:text-slate-900 dark:hover:text-slate-200'} {isSidebarCollapsed ? 'justify-center px-0' : 'px-3'}"
-                    onclick={() => isMobileMenuOpen = false}
-                >
-                    <Icon size={isSidebarCollapsed ? 22 : 18} strokeWidth={isActive ? 2.5 : 2} class="shrink-0" />
-                    {#if !isSidebarCollapsed}
-                        <span class="truncate">{item.name}</span>
-                    {/if}
-                </a>
-            {/each}
-        </div>
-
-        <div class="p-4 border-t border-slate-200 dark:border-slate-800 shrink-0">
-            <button 
-                onclick={handleLogout} 
-                title={isSidebarCollapsed ? 'Sair' : ''}
-                class="w-full flex items-center gap-3 py-2.5 rounded-lg text-slate-600 dark:text-slate-400 hover:bg-red-50 dark:hover:bg-slate-800 hover:text-red-600 dark:hover:text-red-400 transition-colors {isSidebarCollapsed ? 'justify-center px-0' : 'px-3'}"
-            >
-                <LogOut size={18} class="shrink-0" />
-                {#if !isSidebarCollapsed}
-                    <span>Sair</span>
-                {/if}
-            </button>
-        </div>
-    </aside>
-
-    <!-- Main Wrapper -->
-    <div class="flex-1 flex flex-col min-w-0 h-full overflow-hidden relative">
-        <!-- Top Header -->
-        <header class="h-16 flex items-center justify-between px-4 lg:px-8 bg-white/95 dark:bg-[#1e293b]/95 backdrop-blur-sm border-b border-slate-200 dark:border-slate-800 shrink-0 w-full z-30 transition-colors duration-200">
-            <div class="flex items-center gap-4">
-                <button class="lg:hidden text-slate-400 hover:text-slate-700 dark:hover:text-white" onclick={toggleMobileMenu}>
-                    <Menu size={24} />
-                </button>
-                <div class="hidden sm:flex items-center relative">
-                    <Search size={18} class="absolute left-3 text-slate-400 dark:text-slate-500" />
-                    <input 
-                        type="text" 
-                        placeholder="Buscar cliente, número..." 
-                        class="w-64 pl-10 pr-4 py-1.5 bg-slate-100 dark:bg-slate-900 border border-transparent dark:border-slate-700 rounded-lg text-sm text-slate-900 dark:text-slate-200 placeholder-slate-500 focus:outline-none focus:border-indigo-500 focus:ring-1 focus:ring-indigo-500 focus:bg-white transition-all"
-                    />
-                </div>
-            </div>
-
-            <div class="flex items-center gap-4">
-                <!-- Theme Toggle -->
-                <button 
-                    onclick={toggleTheme} 
-                    class="relative p-2 text-slate-400 hover:text-indigo-600 dark:hover:text-indigo-400 rounded-lg hover:bg-indigo-50 dark:hover:bg-slate-800 transition-colors"
-                    title={currentTheme === 'dark' ? 'Mudar para modo claro' : 'Mudar para modo escuro'}
-                >
-                    {#if currentTheme === 'dark'}
-                        <Sun size={20} />
-                    {:else}
-                        <Moon size={20} />
-                    {/if}
-                </button>
-            
-                <button class="relative p-2 text-slate-400 hover:text-slate-700 dark:hover:text-white rounded-full hover:bg-slate-100 dark:hover:bg-slate-800 transition-colors">
-                    <Bell size={20} />
-                    <span class="absolute top-1.5 right-1.5 w-2 h-2 rounded-full bg-red-500 border-2 border-white dark:border-[#1e293b]"></span>
-                </button>
-                <div class="h-8 w-px bg-slate-200 dark:bg-slate-700 mx-1"></div>
-                <div class="flex items-center gap-3 relative">
-                    <div class="text-right hidden sm:block">
-                        <div class="text-sm font-medium text-slate-900 dark:text-white">Admin</div>
-                        <div class="text-xs text-slate-500">Gestor de Vendas</div>
-                    </div>
-                    <div class="relative">
-                        <button 
-                            onclick={toggleUserMenu}
-                            class="w-9 h-9 rounded-full bg-indigo-600 flex items-center justify-center text-white font-bold text-sm shadow-sm shadow-indigo-900/20 hover:bg-indigo-700 transition-colors"
-                            title="Menu do usuário"
-                        >
-                            AD
-                        </button>
-                        
-                        <!-- User Dropdown Menu -->
-                        {#if isUserMenuOpen}
-                            <div class="absolute right-0 mt-2 w-56 bg-white dark:bg-[#1e293b] rounded-lg border border-slate-200 dark:border-slate-800 shadow-lg py-1 z-50">
-                                <div class="px-4 py-3 border-b border-slate-200 dark:border-slate-800">
-                                    <p class="text-sm font-medium text-slate-900 dark:text-white">Admin</p>
-                                    <p class="text-xs text-slate-500 dark:text-slate-400">admin@nettown.com</p>
-                                </div>
-                                
-                                <button 
-                                    onclick={() => handleUserAction('profile')}
-                                    class="w-full flex items-center gap-3 px-4 py-2 text-sm text-slate-700 dark:text-slate-300 hover:bg-slate-100 dark:hover:bg-slate-800 transition-colors"
-                                >
-                                    <User size={16} />
-                                    Meu Perfil
-                                </button>
-                                
-                                <button 
-                                    onclick={() => handleUserAction('password')}
-                                    class="w-full flex items-center gap-3 px-4 py-2 text-sm text-slate-700 dark:text-slate-300 hover:bg-slate-100 dark:hover:bg-slate-800 transition-colors"
-                                >
-                                    <Key size={16} />
-                                    Alterar Senha
-                                </button>
-                                
-                                <button 
-                                    onclick={() => handleUserAction('billing')}
-                                    class="w-full flex items-center gap-3 px-4 py-2 text-sm text-slate-700 dark:text-slate-300 hover:bg-slate-100 dark:hover:bg-slate-800 transition-colors"
-                                >
-                                    <CreditCard size={16} />
-                                    Assinatura
-                                </button>
-                                
-                                <button 
-                                    onclick={() => handleUserAction('help')}
-                                    class="w-full flex items-center gap-3 px-4 py-2 text-sm text-slate-700 dark:text-slate-300 hover:bg-slate-100 dark:hover:bg-slate-800 transition-colors"
-                                >
-                                    <HelpCircle size={16} />
-                                    Ajuda
-                                </button>
-                            </div>
-                        {/if}
-                    </div>
-                </div>
-            </div>
-        </header>
-
-        <!-- Page Content Scrollable Area -->
-        <main class="flex-1 overflow-y-auto overflow-x-hidden p-4 lg:p-8 relative">
-            {@render children()}
-        </main>
-    </div>
+<div
+	class="flex h-screen w-screen overflow-hidden bg-slate-50 font-sans text-slate-900 transition-colors duration-200 dark:bg-[#0f172a] dark:text-slate-300"
+>
+	<!-- Mobile Sidebar Overlay -->
+	{#if isMobileMenuOpen}
+		<div
+			class="fixed inset-0 z-40 bg-slate-950/80 lg:hidden"
+			onclick={toggleMobileMenu}
+			onkeydown={(e) => e.key === 'Escape' && toggleMobileMenu()}
+			tabindex="0"
+			role="button"
+			aria-label="Fechar menu"
+		></div>
+	{/if}
+
+	<!-- User Menu Overlay -->
+	{#if isUserMenuOpen}
+		<div
+			class="fixed inset-0 z-40"
+			onclick={() => (isUserMenuOpen = false)}
+			onkeydown={(e) => e.key === 'Escape' && (isUserMenuOpen = false)}
+			tabindex="0"
+			role="button"
+			aria-label="Fechar menu"
+		></div>
+	{/if}
+
+	<!-- Sidebar -->
+	<aside
+		class="fixed inset-y-0 left-0 z-50 flex h-full flex-col border-r border-slate-200 bg-white transition-all duration-300 ease-in-out lg:static dark:border-slate-800 dark:bg-[#1e293b] {isSidebarCollapsed
+			? 'w-20'
+			: 'w-64'} {isMobileMenuOpen
+			? 'translate-x-0'
+			: '-translate-x-full lg:translate-x-0'} shrink-0 shadow-sm dark:shadow-none"
+	>
+		<div
+			class="flex h-16 shrink-0 items-center justify-between border-b border-slate-200 px-4 dark:border-slate-800"
+		>
+			<div class="flex items-center gap-2 overflow-hidden text-indigo-600 dark:text-indigo-400">
+				<div
+					class="flex h-6 shrink-0 items-center {isSidebarCollapsed
+						? 'w-8 justify-center'
+						: 'w-auto'}"
+				>
+					{#if isSidebarCollapsed}
+						<TrendingUp size={24} strokeWidth={2.5} class="text-indigo-600 dark:text-indigo-500" />
+					{:else}
+						<img
+							src={currentTheme === 'dark' ? logoWhite : logoBlack}
+							alt="NetTown Analytics"
+							class="h-full w-auto"
+						/>
+					{/if}
+				</div>
+			</div>
+
+			<button
+				class="hidden shrink-0 items-center justify-center rounded-lg p-1.5 text-slate-400 transition-colors hover:bg-slate-100 hover:text-slate-700 lg:flex dark:hover:bg-slate-800 dark:hover:text-white"
+				onclick={toggleSidebar}
+			>
+				{#if isSidebarCollapsed}
+					<ChevronRight size={18} />
+				{:else}
+					<ChevronLeft size={18} />
+				{/if}
+			</button>
+
+			<button
+				class="shrink-0 p-1 text-slate-400 hover:text-slate-700 lg:hidden dark:hover:text-white"
+				onclick={toggleMobileMenu}
+			>
+				<X size={20} />
+			</button>
+		</div>
+
+		<div
+			class="flex flex-1 flex-col gap-2 overflow-x-hidden overflow-y-auto py-6 {isSidebarCollapsed
+				? 'px-2'
+				: 'px-4'}"
+		>
+			<div
+				class="mb-2 px-2 text-xs font-semibold tracking-wider whitespace-nowrap text-slate-500 uppercase {isSidebarCollapsed
+					? 'text-center text-[10px]'
+					: ''}"
+			>
+				{isSidebarCollapsed ? 'Menu' : 'Menu Principal'}
+			</div>
+			{#each navItems as item}
+				{@const Icon = item.icon}
+				{@const isActive = isNavItemActive(item.href)}
+				<a
+					href={item.href}
+					title={isSidebarCollapsed ? item.name : ''}
+					class="flex items-center gap-3 rounded-lg py-2.5 transition-colors {isActive
+						? 'bg-indigo-50 font-medium text-indigo-700 dark:bg-indigo-500/10 dark:text-indigo-400'
+						: 'text-slate-600 hover:bg-slate-100 hover:text-slate-900 dark:text-slate-400 dark:hover:bg-slate-800 dark:hover:text-slate-200'} {isSidebarCollapsed
+						? 'justify-center px-0'
+						: 'px-3'}"
+					onclick={() => (isMobileMenuOpen = false)}
+				>
+					<Icon
+						size={isSidebarCollapsed ? 22 : 18}
+						strokeWidth={isActive ? 2.5 : 2}
+						class="shrink-0"
+					/>
+					{#if !isSidebarCollapsed}
+						<span class="truncate">{item.name}</span>
+					{/if}
+				</a>
+			{/each}
+		</div>
+
+		<div class="shrink-0 border-t border-slate-200 p-4 dark:border-slate-800">
+			<button
+				onclick={handleLogout}
+				title={isSidebarCollapsed ? 'Sair' : ''}
+				class="flex w-full items-center gap-3 rounded-lg py-2.5 text-slate-600 transition-colors hover:bg-red-50 hover:text-red-600 dark:text-slate-400 dark:hover:bg-slate-800 dark:hover:text-red-400 {isSidebarCollapsed
+					? 'justify-center px-0'
+					: 'px-3'}"
+			>
+				<LogOut size={18} class="shrink-0" />
+				{#if !isSidebarCollapsed}
+					<span>Sair</span>
+				{/if}
+			</button>
+		</div>
+	</aside>
+
+	<!-- Main Wrapper -->
+	<div class="relative flex h-full min-w-0 flex-1 flex-col overflow-hidden">
+		<!-- Top Header -->
+		<header
+			class="flex h-16 w-full shrink-0 items-center justify-between border-b border-slate-200 bg-white/95 px-4 backdrop-blur-sm transition-colors duration-200 lg:px-8 dark:border-slate-800 dark:bg-[#1e293b]/95 {isUserMenuOpen
+				? 'relative z-50'
+				: 'z-30'}"
+		>
+			<div class="flex items-center gap-4">
+				<button
+					class="text-slate-400 hover:text-slate-700 lg:hidden dark:hover:text-white"
+					onclick={toggleMobileMenu}
+				>
+					<Menu size={24} />
+				</button>
+				<div class="relative hidden items-center sm:flex">
+					<Search size={18} class="absolute left-3 text-slate-400 dark:text-slate-500" />
+					<input
+						type="text"
+						placeholder="Buscar cliente, número..."
+						class="w-64 rounded-lg border border-transparent bg-slate-100 py-1.5 pr-4 pl-10 text-sm text-slate-900 placeholder-slate-500 transition-all focus:border-indigo-500 focus:bg-white focus:ring-1 focus:ring-indigo-500 focus:outline-none dark:border-slate-700 dark:bg-slate-900 dark:text-slate-200"
+					/>
+				</div>
+			</div>
+
+			<div class="flex items-center gap-4">
+				<!-- Theme Toggle -->
+				<button
+					onclick={toggleTheme}
+					class="relative rounded-lg p-2 text-slate-400 transition-colors hover:bg-indigo-50 hover:text-indigo-600 dark:hover:bg-slate-800 dark:hover:text-indigo-400"
+					title={currentTheme === 'dark' ? 'Mudar para modo claro' : 'Mudar para modo escuro'}
+				>
+					{#if currentTheme === 'dark'}
+						<Sun size={20} />
+					{:else}
+						<Moon size={20} />
+					{/if}
+				</button>
+
+				<button
+					class="relative rounded-full p-2 text-slate-400 transition-colors hover:bg-slate-100 hover:text-slate-700 dark:hover:bg-slate-800 dark:hover:text-white"
+				>
+					<Bell size={20} />
+					<span
+						class="absolute top-1.5 right-1.5 h-2 w-2 rounded-full border-2 border-white bg-red-500 dark:border-[#1e293b]"
+					></span>
+				</button>
+				<div class="mx-1 h-8 w-px bg-slate-200 dark:bg-slate-700"></div>
+				<div class="relative flex items-center gap-3">
+					<div class="hidden text-right sm:block">
+						<div class="text-sm font-medium text-slate-900 dark:text-white">Admin</div>
+						<div class="text-xs text-slate-500">Gestor de Vendas</div>
+					</div>
+					<div class="relative">
+						<button
+							onclick={toggleUserMenu}
+							class="flex h-9 w-9 items-center justify-center rounded-full bg-indigo-600 text-sm font-bold text-white shadow-sm shadow-indigo-900/20 transition-colors hover:bg-indigo-700"
+							title="Menu do usuário"
+						>
+							AD
+						</button>
+
+						<!-- User Dropdown Menu -->
+						{#if isUserMenuOpen}
+							<div
+								class="absolute right-0 z-50 mt-2 w-56 rounded-lg border border-slate-200 bg-white py-1 shadow-lg dark:border-slate-800 dark:bg-[#1e293b]"
+							>
+								<div class="border-b border-slate-200 px-4 py-3 dark:border-slate-800">
+									<p class="text-sm font-medium text-slate-900 dark:text-white">Admin</p>
+									<p class="text-xs text-slate-500 dark:text-slate-400">admin@nettown.com</p>
+								</div>
+
+								<a
+									href="/dashboard/profile"
+									onclick={closeUserMenu}
+									class="flex w-full items-center gap-3 px-4 py-2 text-sm text-slate-700 transition-colors hover:bg-slate-100 dark:text-slate-300 dark:hover:bg-slate-800"
+								>
+									<User size={16} />
+									Meu Perfil
+								</a>
+
+								<a
+									href="/dashboard/subscription"
+									onclick={closeUserMenu}
+									class="flex w-full items-center gap-3 px-4 py-2 text-sm text-slate-700 transition-colors hover:bg-slate-100 dark:text-slate-300 dark:hover:bg-slate-800"
+								>
+									<CreditCard size={16} />
+									Assinatura
+								</a>
+
+								<a
+									href="/dashboard/help"
+									onclick={closeUserMenu}
+									class="flex w-full items-center gap-3 px-4 py-2 text-sm text-slate-700 transition-colors hover:bg-slate-100 dark:text-slate-300 dark:hover:bg-slate-800"
+								>
+									<HelpCircle size={16} />
+									Ajuda
+								</a>
+							</div>
+						{/if}
+					</div>
+				</div>
+			</div>
+		</header>
+
+		<!-- Page Content Scrollable Area -->
+		<main class="relative flex-1 overflow-x-hidden overflow-y-auto p-4 lg:p-8">
+			{@render children()}
+		</main>
+	</div>
 </div>

+ 2 - 1
src/routes/(app)/dashboard/+page.svelte

@@ -390,7 +390,8 @@
 					>
 						<Icon size={20} strokeWidth={2.5} />
 					</div>
-					<div>
+					<div class="space-y-1">
+						<div class="text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400">{kpi.title}</div>
 						<div class="text-2xl font-bold text-slate-900 dark:text-white">{kpi.value}</div>
 					</div>
 				</div>

+ 146 - 0
src/routes/(app)/dashboard/ajuda/+page.svelte

@@ -0,0 +1,146 @@
+<script>
+	import { HelpCircle, MessageCircle, Mail, Book, Globe, FileText, MoreHorizontal, ChevronDown } from 'lucide-svelte';
+	let expandedFaq = null;
+
+	const supportChannels = [
+		{
+			title: 'Central de Ajuda',
+			description: 'Acesse nossa base de conhecimento com artigos e tutoriais',
+			icon: Book,
+			action: 'Acessar',
+			link: '#'
+		},
+		{
+			title: 'E-mail de Suporte',
+			description: 'Envie suas dúvidas para nossa equipe de suporte',
+			icon: Mail,
+			action: 'Enviar',
+			link: 'mailto:support@nettown.com'
+		},
+		{
+			title: 'Chat ao Vivo',
+			description: 'Converse com nossa equipe em tempo real',
+			icon: MessageCircle,
+			action: 'Iniciar Chat',
+			link: '#'
+		},
+		{
+			title: 'Documentação',
+			description: 'Leia a documentação técnica e guias de integração',
+			icon: FileText,
+			action: 'Ler Docs',
+			link: '#'
+		}
+	];
+
+	const faqs = [
+		{
+			question: 'Como funciona a análise de sentimento?',
+			answer: 'Nossa análise de sentimento utiliza inteligência artificial para avaliar o tom e a emoção em conversas. O sistema analisa mensagens de texto e categoriza o sentimento em positivo, negativo ou neutro.'
+		},
+		{
+			question: 'Quais plataformas são suportadas?',
+			answer: 'Atualmente suportamos integração com WhatsApp Business. Estamos trabalhando em suporte para outras plataformas como Messenger, Telegram e SMS.'
+		},
+		{
+			question: 'Como faço para integrar minha conta do WhatsApp?',
+			answer: 'Você pode integrar sua conta do WhatsApp Business através das configurações de integrações. Será necessário ter um número de telefone comercial e acesso à sua conta do Meta Business.'
+		},
+		{
+			question: 'Posso exportar meus dados?',
+			answer: 'Sim! Você pode exportar seus dados em formato CSV ou Excel a qualquer momento. Esta opção está disponível nas configurações de conta.'
+		},
+		{
+			question: 'Qual é o tempo de resposta do suporte?',
+			answer: 'Nosso tempo médio de resposta é de 24 horas para suporte por email. Se você tem um plano Profissional ou Empresa, oferecemos suporte prioritário com tempo de resposta de até 4 horas.'
+		},
+		{
+			question: 'Como posso cancelar minha assinatura?',
+			answer: 'Você pode cancelar sua assinatura a qualquer momento através da seção de Assinatura em seu perfil. Seu acesso será mantido até o final do ciclo de faturamento atual.'
+		}
+	];
+
+	function toggleFaq(index) {
+		expandedFaq = expandedFaq === index ? null : index;
+	}
+</script>
+
+<div class="mx-auto max-w-4xl space-y-6">
+	<!-- Header -->
+	<div class="rounded-xl border border-slate-200 bg-white p-5 md:p-6 shadow-sm transition-colors duration-200 dark:border-slate-800 dark:bg-[#161f30]">
+		<div class="flex items-center gap-3">
+			<div class="h-8 w-8 shrink-0 rounded-lg bg-indigo-500/20 text-indigo-500 flex items-center justify-center">
+				<HelpCircle size={20} strokeWidth={2.5} />
+			</div>
+			<h1 class="text-xl font-bold text-slate-900 dark:text-white">Ajuda e Suporte</h1>
+		</div>
+		<p class="mt-2 text-sm text-slate-600 dark:text-slate-400">
+			Encontre respostas para suas dúvidas e entre em contato com nosso suporte
+		</p>
+	</div>
+
+	<!-- Support Channels -->
+	<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
+		{#each supportChannels as channel}
+			{@const Icon = channel.icon}
+			<a
+				href={channel.link}
+				class="rounded-xl border border-slate-200 bg-white p-5 shadow-sm transition-all duration-200 dark:border-slate-800 dark:bg-[#161f30] hover:border-indigo-400 dark:hover:border-indigo-500 hover:shadow-md"
+			>
+				<div class="flex items-start justify-between mb-3">
+					<div class="h-10 w-10 rounded-lg bg-indigo-500/10 text-indigo-600 flex items-center justify-center dark:bg-indigo-900/30 dark:text-indigo-400">
+						<Icon size={20} strokeWidth={2} />
+					</div>
+					<button class="p-1 text-slate-400 hover:text-slate-600 dark:hover:text-slate-300">
+						<MoreHorizontal size={16} />
+					</button>
+				</div>
+				<h3 class="font-semibold text-slate-900 dark:text-white mb-1">{channel.title}</h3>
+				<p class="text-sm text-slate-600 dark:text-slate-400 mb-4">{channel.description}</p>
+				<button class="text-sm font-medium text-indigo-600 dark:text-indigo-400 hover:text-indigo-700 dark:hover:text-indigo-300">
+					{channel.action} →
+				</button>
+			</a>
+		{/each}
+	</div>
+
+	<!-- FAQ Section -->
+	<div class="space-y-4">
+		<h2 class="text-lg font-semibold text-slate-900 dark:text-white">Perguntas Frequentes</h2>
+
+		<div class="rounded-xl border border-slate-200 bg-white shadow-sm transition-colors duration-200 dark:border-slate-800 dark:bg-[#161f30] divide-y divide-slate-200 dark:divide-slate-800">
+			{#each faqs as faq, index}
+				<div class="p-5 hover:bg-slate-50 transition-colors duration-150 dark:hover:bg-slate-800/50">
+					<button
+						onclick={() => toggleFaq(index)}
+						class="w-full flex items-center justify-between"
+					>
+						<h3 class="text-sm font-medium text-slate-900 dark:text-white text-left">{faq.question}</h3>
+						<ChevronDown
+							size={18}
+							class="text-slate-400 shrink-0 transition-transform duration-200 {expandedFaq === index ? 'rotate-180' : ''}"
+						/>
+					</button>
+
+					{#if expandedFaq === index}
+						<p class="mt-3 text-sm text-slate-600 dark:text-slate-400 text-left">
+							{faq.answer}
+						</p>
+					{/if}
+				</div>
+			{/each}
+		</div>
+	</div>
+
+	<!-- Contact Info -->
+	<div class="rounded-xl border border-slate-200 bg-white p-5 md:p-6 shadow-sm transition-colors duration-200 dark:border-slate-800 dark:bg-[#161f30]">
+		<h2 class="text-lg font-semibold text-slate-900 dark:text-white mb-4">Não encontrou o que procura?</h2>
+		<p class="text-slate-600 dark:text-slate-400 mb-4">
+			Entre em contato com nossa equipe de suporte através de qualquer um dos canais acima. Estamos aqui para ajudá-lo!
+		</p>
+		<div class="space-y-2 text-sm text-slate-600 dark:text-slate-400">
+			<p><strong class="text-slate-900 dark:text-white">E-mail:</strong> support@nettown.com</p>
+			<p><strong class="text-slate-900 dark:text-white">Horário de atendimento:</strong> Segunda à Sexta, 9:00 às 18:00</p>
+		</div>
+	</div>
+</div>

+ 164 - 0
src/routes/(app)/dashboard/assinatura/+page.svelte

@@ -0,0 +1,164 @@
+<script>
+	import { CreditCard, Calendar, AlertCircle, Check } from 'lucide-svelte';
+
+	let currentPlan = {
+		name: 'Profissional',
+		price: 299,
+		billingCycle: 'mensal',
+		status: 'ativo',
+		nextBillingDate: '15/06/2026'
+	};
+
+	const plans = [
+		{
+			name: 'Starter',
+			price: 99,
+			description: 'Perfeito para começar',
+			features: [
+				'Até 5 clientes',
+				'Análise básica de sentimento',
+				'Relatórios mensais',
+				'Suporte por email'
+			],
+			popular: false
+		},
+		{
+			name: 'Profissional',
+			price: 299,
+			description: 'Mais recursos e análises',
+			features: [
+				'Até 50 clientes',
+				'Análise avançada de sentimento',
+				'Relatórios em tempo real',
+				'API access',
+				'Suporte prioritário',
+				'Integrações WhatsApp'
+			],
+			popular: true
+		},
+		{
+			name: 'Empresa',
+			price: 999,
+			description: 'Recursos completos',
+			features: [
+				'Clientes ilimitados',
+				'Análise completa de IA',
+				'Dashboards personalizados',
+				'API completa',
+				'Suporte 24/7',
+				'Todas as integrações',
+				'Usuários ilimitados'
+			],
+			popular: false
+		}
+	];
+
+	function handleUpgrade(plan) {
+		console.log(`Upgrading to ${plan.name} plan`);
+	}
+
+	function handleCancelSubscription() {
+		if (confirm('Tem certeza que deseja cancelar sua assinatura?')) {
+			console.log('Cancelando assinatura...');
+		}
+	}
+</script>
+
+<div class="mx-auto max-w-4xl space-y-6">
+	<!-- Header -->
+	<div class="rounded-xl border border-slate-200 bg-white p-5 md:p-6 shadow-sm transition-colors duration-200 dark:border-slate-800 dark:bg-[#161f30]">
+		<div class="flex items-center gap-3">
+			<div class="h-8 w-8 shrink-0 rounded-lg bg-indigo-500/20 text-indigo-500 flex items-center justify-center">
+				<CreditCard size={20} strokeWidth={2.5} />
+			</div>
+			<h1 class="text-xl font-bold text-slate-900 dark:text-white">Assinatura</h1>
+		</div>
+		<p class="mt-2 text-sm text-slate-600 dark:text-slate-400">
+			Gerencie seu plano, faturamento e métodos de pagamento
+		</p>
+	</div>
+
+	<!-- Current Plan -->
+	<div class="rounded-xl border border-slate-200 bg-white shadow-sm transition-colors duration-200 dark:border-slate-800 dark:bg-[#161f30]">
+		<div class="border-b border-slate-200 p-5 dark:border-slate-800">
+			<h2 class="text-lg font-semibold text-slate-900 dark:text-white">Seu Plano Atual</h2>
+		</div>
+
+		<div class="p-5 md:p-6">
+			<div class="grid grid-cols-1 md:grid-cols-3 gap-6 mb-6">
+				<div>
+					<p class="text-sm text-slate-600 dark:text-slate-400 mb-1">Plano</p>
+					<p class="text-2xl font-bold text-slate-900 dark:text-white">{currentPlan.name}</p>
+				</div>
+				<div>
+					<p class="text-sm text-slate-600 dark:text-slate-400 mb-1">Preço</p>
+					<p class="text-2xl font-bold text-slate-900 dark:text-white">R$ {currentPlan.price}</p>
+					<p class="text-xs text-slate-500 dark:text-slate-400">por mês</p>
+				</div>
+				<div>
+					<p class="text-sm text-slate-600 dark:text-slate-400 mb-1">Próxima cobrança</p>
+					<div class="flex items-center gap-2">
+						<Calendar size={18} class="text-indigo-600 dark:text-indigo-400" />
+						<span class="text-lg font-semibold text-slate-900 dark:text-white">{currentPlan.nextBillingDate}</span>
+					</div>
+				</div>
+			</div>
+
+			<div class="flex flex-col md:flex-row gap-3 pt-4 border-t border-slate-200 dark:border-slate-800">
+				<button class="inline-flex items-center px-4 py-2 text-sm font-medium rounded-lg bg-indigo-600 text-white hover:bg-indigo-700 transition-colors duration-150">
+					Atualizar Método de Pagamento
+				</button>
+				<button
+					onclick={handleCancelSubscription}
+					class="inline-flex items-center px-4 py-2 text-sm font-medium rounded-lg border border-red-300 text-red-600 hover:bg-red-50 transition-colors duration-150 dark:border-red-800 dark:text-red-400 dark:hover:bg-slate-800"
+				>
+					Cancelar Assinatura
+				</button>
+			</div>
+		</div>
+	</div>
+
+	<!-- Available Plans -->
+	<div class="space-y-4">
+		<h2 class="text-lg font-semibold text-slate-900 dark:text-white">Outros Planos Disponíveis</h2>
+
+		<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
+			{#each plans as plan}
+				<div class="rounded-xl border {plan.popular ? 'border-indigo-500 ring-2 ring-indigo-100 dark:ring-indigo-900/30' : 'border-slate-200 dark:border-slate-800'} bg-white shadow-sm transition-colors duration-200 dark:bg-[#161f30] overflow-hidden">
+					{#if plan.popular}
+						<div class="bg-indigo-600 px-4 py-2 text-center">
+							<span class="text-xs font-semibold text-white uppercase tracking-wider">Mais Popular</span>
+						</div>
+					{/if}
+
+					<div class="p-5 md:p-6">
+						<h3 class="text-xl font-bold text-slate-900 dark:text-white mb-2">{plan.name}</h3>
+						<p class="text-sm text-slate-600 dark:text-slate-400 mb-4">{plan.description}</p>
+
+						<div class="mb-6">
+							<span class="text-3xl font-bold text-slate-900 dark:text-white">R$ {plan.price}</span>
+							<span class="text-sm text-slate-600 dark:text-slate-400">/mês</span>
+						</div>
+
+						<button
+							onclick={() => handleUpgrade(plan)}
+							disabled={plan.name === currentPlan.name}
+							class="w-full px-4 py-2 text-sm font-medium rounded-lg transition-colors duration-150 {plan.popular ? 'bg-indigo-600 text-white hover:bg-indigo-700' : 'bg-slate-100 text-slate-900 hover:bg-slate-200 dark:bg-slate-800 dark:text-slate-200 dark:hover:bg-slate-700'} {plan.name === currentPlan.name ? 'opacity-50 cursor-not-allowed' : ''}"
+						>
+							{plan.name === currentPlan.name ? 'Plano Atual' : 'Escolher Plano'}
+						</button>
+
+						<div class="mt-6 space-y-3 pt-6 border-t border-slate-200 dark:border-slate-800">
+							{#each plan.features as feature}
+								<div class="flex items-center gap-3">
+									<Check size={16} class="text-green-600 dark:text-green-400 shrink-0" />
+									<span class="text-sm text-slate-700 dark:text-slate-300">{feature}</span>
+								</div>
+							{/each}
+						</div>
+					</div>
+				</div>
+			{/each}
+		</div>
+	</div>
+</div>

+ 146 - 0
src/routes/(app)/dashboard/help/+page.svelte

@@ -0,0 +1,146 @@
+<script>
+	import { HelpCircle, MessageCircle, Mail, Book, Globe, FileText, MoreHorizontal, ChevronDown } from 'lucide-svelte';
+	let expandedFaq = null;
+
+	const supportChannels = [
+		{
+			title: 'Central de Ajuda',
+			description: 'Acesse nossa base de conhecimento com artigos e tutoriais',
+			icon: Book,
+			action: 'Acessar',
+			link: '#'
+		},
+		{
+			title: 'E-mail de Suporte',
+			description: 'Envie suas dúvidas para nossa equipe de suporte',
+			icon: Mail,
+			action: 'Enviar',
+			link: 'mailto:support@nettown.com'
+		},
+		{
+			title: 'Chat ao Vivo',
+			description: 'Converse com nossa equipe em tempo real',
+			icon: MessageCircle,
+			action: 'Iniciar Chat',
+			link: '#'
+		},
+		{
+			title: 'Documentação',
+			description: 'Leia a documentação técnica e guias de integração',
+			icon: FileText,
+			action: 'Ler Docs',
+			link: '#'
+		}
+	];
+
+	const faqs = [
+		{
+			question: 'Como funciona a análise de sentimento?',
+			answer: 'Nossa análise de sentimento utiliza inteligência artificial para avaliar o tom e a emoção em conversas. O sistema analisa mensagens de texto e categoriza o sentimento em positivo, negativo ou neutro.'
+		},
+		{
+			question: 'Quais plataformas são suportadas?',
+			answer: 'Atualmente suportamos integração com WhatsApp Business. Estamos trabalhando em suporte para outras plataformas como Messenger, Telegram e SMS.'
+		},
+		{
+			question: 'Como faço para integrar minha conta do WhatsApp?',
+			answer: 'Você pode integrar sua conta do WhatsApp Business através das configurações de integrações. Será necessário ter um número de telefone comercial e acesso à sua conta do Meta Business.'
+		},
+		{
+			question: 'Posso exportar meus dados?',
+			answer: 'Sim! Você pode exportar seus dados em formato CSV ou Excel a qualquer momento. Esta opção está disponível nas configurações de conta.'
+		},
+		{
+			question: 'Qual é o tempo de resposta do suporte?',
+			answer: 'Nosso tempo médio de resposta é de 24 horas para suporte por email. Se você tem um plano Profissional ou Empresa, oferecemos suporte prioritário com tempo de resposta de até 4 horas.'
+		},
+		{
+			question: 'Como posso cancelar minha assinatura?',
+			answer: 'Você pode cancelar sua assinatura a qualquer momento através da seção de Assinatura em seu perfil. Seu acesso será mantido até o final do ciclo de faturamento atual.'
+		}
+	];
+
+	function toggleFaq(index) {
+		expandedFaq = expandedFaq === index ? null : index;
+	}
+</script>
+
+<div class="mx-auto max-w-4xl space-y-6">
+	<!-- Header -->
+	<div class="rounded-xl border border-slate-200 bg-white p-5 md:p-6 shadow-sm transition-colors duration-200 dark:border-slate-800 dark:bg-[#161f30]">
+		<div class="flex items-center gap-3">
+			<div class="h-8 w-8 shrink-0 rounded-lg bg-indigo-500/20 text-indigo-500 flex items-center justify-center">
+				<HelpCircle size={20} strokeWidth={2.5} />
+			</div>
+			<h1 class="text-xl font-bold text-slate-900 dark:text-white">Ajuda e Suporte</h1>
+		</div>
+		<p class="mt-2 text-sm text-slate-600 dark:text-slate-400">
+			Encontre respostas para suas dúvidas e entre em contato com nosso suporte
+		</p>
+	</div>
+
+	<!-- Support Channels -->
+	<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
+		{#each supportChannels as channel}
+			{@const Icon = channel.icon}
+			<a
+				href={channel.link}
+				class="rounded-xl border border-slate-200 bg-white p-5 shadow-sm transition-all duration-200 dark:border-slate-800 dark:bg-[#161f30] hover:border-indigo-400 dark:hover:border-indigo-500 hover:shadow-md"
+			>
+				<div class="flex items-start justify-between mb-3">
+					<div class="h-10 w-10 rounded-lg bg-indigo-500/10 text-indigo-600 flex items-center justify-center dark:bg-indigo-900/30 dark:text-indigo-400">
+						<Icon size={20} strokeWidth={2} />
+					</div>
+					<button class="p-1 text-slate-400 hover:text-slate-600 dark:hover:text-slate-300">
+						<MoreHorizontal size={16} />
+					</button>
+				</div>
+				<h3 class="font-semibold text-slate-900 dark:text-white mb-1">{channel.title}</h3>
+				<p class="text-sm text-slate-600 dark:text-slate-400 mb-4">{channel.description}</p>
+				<button class="text-sm font-medium text-indigo-600 dark:text-indigo-400 hover:text-indigo-700 dark:hover:text-indigo-300">
+					{channel.action} →
+				</button>
+			</a>
+		{/each}
+	</div>
+
+	<!-- FAQ Section -->
+	<div class="space-y-4">
+		<h2 class="text-lg font-semibold text-slate-900 dark:text-white">Perguntas Frequentes</h2>
+
+		<div class="rounded-xl border border-slate-200 bg-white shadow-sm transition-colors duration-200 dark:border-slate-800 dark:bg-[#161f30] divide-y divide-slate-200 dark:divide-slate-800">
+			{#each faqs as faq, index}
+				<div class="p-5 hover:bg-slate-50 transition-colors duration-150 dark:hover:bg-slate-800/50">
+					<button
+						onclick={() => toggleFaq(index)}
+						class="w-full flex items-center justify-between"
+					>
+						<h3 class="text-sm font-medium text-slate-900 dark:text-white text-left">{faq.question}</h3>
+						<ChevronDown
+							size={18}
+							class="text-slate-400 shrink-0 transition-transform duration-200 {expandedFaq === index ? 'rotate-180' : ''}"
+						/>
+					</button>
+
+					{#if expandedFaq === index}
+						<p class="mt-3 text-sm text-slate-600 dark:text-slate-400 text-left">
+							{faq.answer}
+						</p>
+					{/if}
+				</div>
+			{/each}
+		</div>
+	</div>
+
+	<!-- Contact Info -->
+	<div class="rounded-xl border border-slate-200 bg-white p-5 md:p-6 shadow-sm transition-colors duration-200 dark:border-slate-800 dark:bg-[#161f30]">
+		<h2 class="text-lg font-semibold text-slate-900 dark:text-white mb-4">Não encontrou o que procura?</h2>
+		<p class="text-slate-600 dark:text-slate-400 mb-4">
+			Entre em contato com nossa equipe de suporte através de qualquer um dos canais acima. Estamos aqui para ajudá-lo!
+		</p>
+		<div class="space-y-2 text-sm text-slate-600 dark:text-slate-400">
+			<p><strong class="text-slate-900 dark:text-white">E-mail:</strong> support@nettown.com</p>
+			<p><strong class="text-slate-900 dark:text-white">Horário de atendimento:</strong> Segunda à Sexta, 9:00 às 18:00</p>
+		</div>
+	</div>
+</div>

+ 508 - 381
src/routes/(app)/dashboard/interactions/+page.svelte

@@ -1,391 +1,518 @@
 <script>
-    import { Search, Download, Eye, X, MessageCircle } from 'lucide-svelte';
-    import { mockInteractions } from '$lib/core/models/mock-data.js';
-
-    let searchQuery = $state('');
-    let selectedInteraction = $state(null);
-    let isChatModalOpen = $state(false);
-
-    // Filters state
-    let activeFilter = $state('all'); // all, my_clients, new, unfinished
-
-    const conversationTemplates = [
-        [
-            {
-                isAgent: false,
-                text: 'Oi, queria saber se esse look chega na loja física ou é só on-line?'
-            },
-            {
-                isAgent: true,
-                text: 'Oi {client}! Aqui é {agent}. Posso te mandar combinações com o que chegou hoje?'
-            },
-            {
-                isAgent: false,
-                text: 'Quero sim! Tive dúvida porque o tecido parece quente, o que você acha?'
-            },
-            {
-                isAgent: true,
-                text: 'Ele é leve, perfeito para eventos. Posso reservar dois tamanhos pra você testar?'
-            }
-        ],
-        [
-            {
-                isAgent: false,
-                text: 'Boa tarde! O prazo de entrega está mantido? Preciso para um evento.'
-            },
-            {
-                isAgent: true,
-                text: 'Está sim! Consigo acompanhar junto com a logística e te aviso qualquer mudança.'
-            },
-            {
-                isAgent: false,
-                text: 'Perfeito, fiquei tranquila. Pode confirmar se a cor é igual da foto?'
-            },
-            {
-                isAgent: true,
-                text: 'É idêntica! Vou te mandar mais fotos com detalhes da costura.'
-            }
-        ],
-        [
-            {
-                isAgent: false,
-                text: 'Oi, recebi o link mas não consegui finalizar o pagamento.'
-            },
-            {
-                isAgent: true,
-                text: 'Sem problemas, {client}. Gereiem um novo link com cashback extra, vale tentar novamente?'
-            },
-            {
-                isAgent: false,
-                text: 'Agora foi! Consegue separar junto com uma calça flare 38?'
-            },
-            {
-                isAgent: true,
-                text: 'Já separei e mando atualizações de retirada. Obrigada por confiar!'
-            }
-        ]
-    ];
-
-    function applyFilter(interaction) {
-        const normalizedQuery = searchQuery.trim();
-        if (normalizedQuery && !interaction.client.includes(normalizedQuery)) return false;
-
-        if (activeFilter === 'my_clients') {
-            return interaction.agent !== '-';
-        }
-
-        if (activeFilter === 'new') {
-            return interaction.sentiment === 'CONTENTAMENTO' || interaction.score > 0.4;
-        }
-
-        if (activeFilter === 'unfinished') {
-            return interaction.sentiment === 'FRUSTRAÇÃO' || interaction.score < 0;
-        }
-
-        return true;
-    }
-
-    const filteredInteractions = $derived(mockInteractions.filter(applyFilter));
-
-    function buildConversation(interaction, idx) {
-        const template = conversationTemplates[idx % conversationTemplates.length];
-        const agentName = interaction.agent === '-' ? 'Time Nettown' : interaction.agent;
-        return template.map((message, msgIdx) => ({
-            ...message,
-            id: `${interaction.client}-${msgIdx}`,
-            text: message.text
-                .replace('{client}', interaction.client.slice(-4))
-                .replace('{agent}', agentName),
-            time: interaction.datetime.split(',')[1]?.trim() ?? '00:00'
-        }));
-    }
-
-    const conversationThreads = $derived(
-        filteredInteractions.map((interaction, idx) => ({
-            ...interaction,
-            thread: buildConversation(interaction, idx)
-        }))
-    );
-
-    function getSentimentColor(sentiment) {
-        switch (sentiment) {
-            case 'CONTENTAMENTO': return 'text-emerald-600 bg-emerald-50 border-emerald-200 dark:text-emerald-400 dark:bg-emerald-400/10 dark:border-emerald-400/20';
-            case 'FRUSTRAÇÃO': return 'text-red-600 bg-red-50 border-red-200 dark:text-red-400 dark:bg-red-400/10 dark:border-red-400/20';
-            case 'NEUTRO': return 'text-slate-600 bg-slate-100 border-slate-200 dark:text-slate-400 dark:bg-slate-400/10 dark:border-slate-400/20';
-            default: return 'text-slate-600 bg-slate-100 border-slate-200 dark:text-slate-400 dark:bg-slate-800 dark:border-slate-700';
-        }
-    }
-
-    function openChat(interaction) {
-        selectedInteraction = interaction;
-        isChatModalOpen = true;
-    }
-
-    function closeChat() {
-        isChatModalOpen = false;
-        setTimeout(() => {
-            selectedInteraction = null;
-        }, 300);
-    }
+	import { Search, Download, Eye, X, MessageCircle } from 'lucide-svelte';
+	import { mockInteractions } from '$lib/core/models/mock-data.js';
+
+	let searchQuery = $state('');
+	let selectedInteraction = $state(null);
+	let isChatModalOpen = $state(false);
+
+	// Filters state
+	let activeFilter = $state('all'); // all, my_clients, new, unfinished
+
+	const conversationTemplates = [
+		[
+			{
+				isAgent: false,
+				text: 'Oi, queria saber se esse look chega na loja física ou é só on-line?'
+			},
+			{
+				isAgent: true,
+				text: 'Oi {client}! Aqui é {agent}. Posso te mandar combinações com o que chegou hoje?'
+			},
+			{
+				isAgent: false,
+				text: 'Quero sim! Tive dúvida porque o tecido parece quente, o que você acha?'
+			},
+			{
+				isAgent: true,
+				text: 'Ele é leve, perfeito para eventos. Posso reservar dois tamanhos pra você testar?'
+			}
+		],
+		[
+			{
+				isAgent: false,
+				text: 'Boa tarde! O prazo de entrega está mantido? Preciso para um evento.'
+			},
+			{
+				isAgent: true,
+				text: 'Está sim! Consigo acompanhar junto com a logística e te aviso qualquer mudança.'
+			},
+			{
+				isAgent: false,
+				text: 'Perfeito, fiquei tranquila. Pode confirmar se a cor é igual da foto?'
+			},
+			{
+				isAgent: true,
+				text: 'É idêntica! Vou te mandar mais fotos com detalhes da costura.'
+			}
+		],
+		[
+			{
+				isAgent: false,
+				text: 'Oi, recebi o link mas não consegui finalizar o pagamento.'
+			},
+			{
+				isAgent: true,
+				text: 'Sem problemas, {client}. Gereiem um novo link com cashback extra, vale tentar novamente?'
+			},
+			{
+				isAgent: false,
+				text: 'Agora foi! Consegue separar junto com uma calça flare 38?'
+			},
+			{
+				isAgent: true,
+				text: 'Já separei e mando atualizações de retirada. Obrigada por confiar!'
+			}
+		]
+	];
+
+	function applyFilter(interaction) {
+		const normalizedQuery = searchQuery.trim();
+		if (normalizedQuery && !interaction.client.includes(normalizedQuery)) return false;
+
+		if (activeFilter === 'my_clients') {
+			return interaction.agent !== '-';
+		}
+
+		if (activeFilter === 'new') {
+			return interaction.sentiment === 'CONTENTAMENTO' || interaction.score > 0.4;
+		}
+
+		if (activeFilter === 'unfinished') {
+			return interaction.sentiment === 'FRUSTRAÇÃO' || interaction.score < 0;
+		}
+
+		return true;
+	}
+
+	const filteredInteractions = $derived(mockInteractions.filter(applyFilter));
+
+	function buildConversation(interaction, idx) {
+		const template = conversationTemplates[idx % conversationTemplates.length];
+		const agentName = interaction.agent === '-' ? 'Time Nettown' : interaction.agent;
+		return template.map((message, msgIdx) => ({
+			...message,
+			id: `${interaction.client}-${msgIdx}`,
+			text: message.text
+				.replace('{client}', interaction.client.slice(-4))
+				.replace('{agent}', agentName),
+			time: interaction.datetime.split(',')[1]?.trim() ?? '00:00'
+		}));
+	}
+
+	const conversationThreads = $derived(
+		filteredInteractions.map((interaction, idx) => ({
+			...interaction,
+			thread: buildConversation(interaction, idx)
+		}))
+	);
+
+	function getSentimentColor(sentiment) {
+		switch (sentiment) {
+			case 'CONTENTAMENTO':
+				return 'text-emerald-600 bg-emerald-50 border-emerald-200 dark:text-emerald-400 dark:bg-emerald-400/10 dark:border-emerald-400/20';
+			case 'FRUSTRAÇÃO':
+				return 'text-red-600 bg-red-50 border-red-200 dark:text-red-400 dark:bg-red-400/10 dark:border-red-400/20';
+			case 'NEUTRO':
+				return 'text-slate-600 bg-slate-100 border-slate-200 dark:text-slate-400 dark:bg-slate-400/10 dark:border-slate-400/20';
+			default:
+				return 'text-slate-600 bg-slate-100 border-slate-200 dark:text-slate-400 dark:bg-slate-800 dark:border-slate-700';
+		}
+	}
+
+	function openChat(interaction) {
+		selectedInteraction = interaction;
+		isChatModalOpen = true;
+	}
+
+	function closeChat() {
+		isChatModalOpen = false;
+		setTimeout(() => {
+			selectedInteraction = null;
+		}, 300);
+	}
 </script>
 
 <svelte:head>
-    <title>Interações Analisadas - Nettown Analytics</title>
+	<title>Interações Analisadas - Nettown Analytics</title>
 </svelte:head>
 
-<div class="space-y-6 max-w-[1600px] mx-auto transition-colors duration-200">
-    <!-- Header/Filters -->
-    <div class="flex flex-col sm:flex-row justify-between items-start sm:items-center gap-4 mb-8">
-        <h1 class="text-2xl font-bold text-slate-900 dark:text-white transition-colors">Últimas Interações Analisadas</h1>
-        
-        <div class="flex flex-wrap items-center gap-3">
-            <button 
-                class="px-4 py-2 rounded-lg text-sm font-medium transition-colors border {activeFilter === 'my_clients' ? 'bg-indigo-50 dark:bg-indigo-500/20 text-indigo-700 dark:text-indigo-400 border-indigo-200 dark:border-indigo-500/30 shadow-inner' : 'bg-white dark:bg-[#1e293b] text-slate-700 dark:text-slate-300 border-slate-200 dark:border-slate-700 hover:border-slate-300 dark:hover:border-slate-500 shadow-sm dark:shadow-none'}"
-                onclick={() => activeFilter = activeFilter === 'my_clients' ? 'all' : 'my_clients'}
-            >
-                Meus Clientes
-            </button>
-            <button 
-                class="px-4 py-2 rounded-lg text-sm font-medium transition-colors border {activeFilter === 'new' ? 'bg-emerald-50 dark:bg-emerald-500/20 text-emerald-700 dark:text-emerald-400 border-emerald-200 dark:border-emerald-500/30 shadow-inner' : 'bg-white dark:bg-[#1e293b] text-slate-700 dark:text-slate-300 border-slate-200 dark:border-slate-700 hover:border-slate-300 dark:hover:border-slate-500 shadow-sm dark:shadow-none'}"
-                onclick={() => activeFilter = activeFilter === 'new' ? 'all' : 'new'}
-            >
-                Relatório Pessoas Novas
-            </button>
-            <button 
-                class="px-4 py-2 rounded-lg text-sm font-medium transition-colors border {activeFilter === 'unfinished' ? 'bg-amber-50 dark:bg-amber-500/20 text-amber-700 dark:text-amber-400 border-amber-200 dark:border-amber-500/30 shadow-inner' : 'bg-white dark:bg-[#1e293b] text-slate-700 dark:text-slate-300 border-slate-200 dark:border-slate-700 hover:border-slate-300 dark:hover:border-slate-500 shadow-sm dark:shadow-none'}"
-                onclick={() => activeFilter = activeFilter === 'unfinished' ? 'all' : 'unfinished'}
-            >
-                Conversas Inacabadas
-            </button>
-            
-            <button class="flex items-center gap-2 px-4 py-2 rounded-lg text-sm font-medium bg-indigo-600 hover:bg-indigo-700 dark:bg-indigo-600 dark:hover:bg-indigo-500 text-white transition-colors shadow-sm dark:shadow-none ml-auto sm:ml-0">
+<div class="mx-auto max-w-[1600px] space-y-6 transition-colors duration-200">
+	<!-- Header/Filters -->
+	<div class="mb-8 flex flex-col items-start justify-between gap-4 sm:flex-row sm:items-center">
+		<h1 class="text-2xl font-bold text-slate-900 transition-colors dark:text-white">
+			Últimas Interações Analisadas
+		</h1>
+
+		<div class="flex flex-wrap items-center gap-3">
+			<button
+				class="rounded-lg border px-4 py-2 text-sm font-medium transition-colors {activeFilter ===
+				'my_clients'
+					? 'border-indigo-200 bg-indigo-50 text-indigo-700 shadow-inner dark:border-indigo-500/30 dark:bg-indigo-500/20 dark:text-indigo-400'
+					: 'border-slate-200 bg-white text-slate-700 shadow-sm hover:border-slate-300 dark:border-slate-700 dark:bg-[#1e293b] dark:text-slate-300 dark:shadow-none dark:hover:border-slate-500'}"
+				onclick={() => (activeFilter = activeFilter === 'my_clients' ? 'all' : 'my_clients')}
+			>
+				Meus Clientes
+			</button>
+			<button
+				class="rounded-lg border px-4 py-2 text-sm font-medium transition-colors {activeFilter ===
+				'new'
+					? 'border-emerald-200 bg-emerald-50 text-emerald-700 shadow-inner dark:border-emerald-500/30 dark:bg-emerald-500/20 dark:text-emerald-400'
+					: 'border-slate-200 bg-white text-slate-700 shadow-sm hover:border-slate-300 dark:border-slate-700 dark:bg-[#1e293b] dark:text-slate-300 dark:shadow-none dark:hover:border-slate-500'}"
+				onclick={() => (activeFilter = activeFilter === 'new' ? 'all' : 'new')}
+			>
+				Relatório Pessoas Novas
+			</button>
+			<button
+				class="rounded-lg border px-4 py-2 text-sm font-medium transition-colors {activeFilter ===
+				'unfinished'
+					? 'border-amber-200 bg-amber-50 text-amber-700 shadow-inner dark:border-amber-500/30 dark:bg-amber-500/20 dark:text-amber-400'
+					: 'border-slate-200 bg-white text-slate-700 shadow-sm hover:border-slate-300 dark:border-slate-700 dark:bg-[#1e293b] dark:text-slate-300 dark:shadow-none dark:hover:border-slate-500'}"
+				onclick={() => (activeFilter = activeFilter === 'unfinished' ? 'all' : 'unfinished')}
+			>
+				Conversas Inacabadas
+			</button>
+
+			<!-- <button class="flex items-center gap-2 px-4 py-2 rounded-lg text-sm font-medium bg-indigo-600 hover:bg-indigo-700 dark:bg-indigo-600 dark:hover:bg-indigo-500 text-white transition-colors shadow-sm dark:shadow-none ml-auto sm:ml-0">
                 <Download size={16} />
                 Download
-            </button>
-        </div>
-    </div>
-
-    <!-- Table Container -->
-    <div class="bg-white dark:bg-[#1e293b] rounded-xl border border-slate-200 dark:border-slate-800 shadow-sm overflow-hidden flex flex-col transition-colors duration-200">
-        <div class="p-4 border-b border-slate-200 dark:border-slate-800 flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between bg-slate-50 dark:bg-[#1e293b]">
-            <div class="relative">
-                <Search size={16} class="absolute left-3 top-1/2 -translate-y-1/2 text-slate-400 dark:text-slate-500" />
-                <input 
-                    type="text" 
-                    bind:value={searchQuery}
-                    placeholder="Buscar cliente..." 
-                    class="w-64 pl-9 pr-4 py-2 bg-white dark:bg-slate-900 border border-slate-300 dark:border-slate-700 rounded-lg text-sm text-slate-900 dark:text-slate-200 placeholder-slate-400 dark:placeholder-slate-500 focus:outline-none focus:border-indigo-500 focus:ring-1 focus:ring-indigo-500 transition-all shadow-sm dark:shadow-none"
-                />
-            </div>
-            <div class="text-sm text-slate-500 dark:text-slate-400 font-medium">
-                Exibindo {conversationThreads.length} conversas
-            </div>
-        </div>
-
-        <div class="overflow-x-auto custom-scrollbar">
-            <table class="w-full text-left border-collapse">
-                <thead>
-                    <tr class="bg-slate-100/50 dark:bg-slate-900/50 text-xs font-semibold text-slate-500 dark:text-slate-400 uppercase tracking-wider border-b border-slate-200 dark:border-slate-800 transition-colors duration-200">
-                        <th class="p-4">Cliente</th>
-                        <th class="p-4">Agente</th>
-                        <th class="p-4">Sentimento Geral</th>
-                        <th class="p-4">Score</th>
-                        <th class="p-4">Aspectos Detectados</th>
-                        <th class="p-4">Subaspectos Detectados</th>
-                        <th class="p-4">Data e Hora</th>
-                        <th class="p-4 text-right">Análise Avançada</th>
-                    </tr>
-                </thead>
-                <tbody class="divide-y divide-slate-100 dark:divide-slate-800/50 transition-colors duration-200">
-                    {#each conversationThreads as item}
-                        <tr class="hover:bg-slate-50 dark:hover:bg-slate-800/30 transition-colors group">
-                            <td class="p-4">
-                                <span class="font-bold text-slate-900 dark:text-white">{item.client}</span>
-                            </td>
-                            <td class="p-4 text-slate-600 dark:text-slate-300 font-medium">{item.agent === '-' ? 'Time Nettown' : item.agent}</td>
-                            <td class="p-4">
-                                <span class="px-2.5 py-1 rounded-md text-xs font-bold border {getSentimentColor(item.sentiment)} transition-colors duration-200">
-                                    {item.sentiment}
-                                </span>
-                            </td>
-                            <td class="p-4 text-slate-700 dark:text-slate-300 font-bold">{item.score}</td>
-                            <td class="p-4 text-slate-600 dark:text-slate-300 font-medium">{item.aspect}</td>
-                            <td class="p-4 text-slate-500 dark:text-slate-400">{item.subaspect}</td>
-                            <td class="p-4 text-slate-500 dark:text-slate-400 text-sm font-medium">{item.datetime}</td>
-                            <td class="p-4 text-right">
-                                <button 
-                                    onclick={() => openChat(item)}
-                                    class="inline-flex items-center gap-1.5 px-3 py-1.5 bg-indigo-50 hover:bg-indigo-100 dark:bg-indigo-500/10 dark:hover:bg-indigo-500/20 text-indigo-600 dark:text-indigo-400 border border-indigo-200 dark:border-indigo-500/20 rounded-md text-sm font-semibold transition-colors shadow-sm dark:shadow-none"
-                                >
-                                    <Eye size={14} />
-                                    Ver Chat
-                                </button>
-                            </td>
-                        </tr>
-                    {/each}
-
-                    {#if conversationThreads.length === 0}
-                        <tr>
-                            <td colspan="8" class="p-8 text-center text-slate-500 font-medium">
-                                Nenhuma interação encontrada.
-                            </td>
-                        </tr>
-                    {/if}
-                </tbody>
-            </table>
-        </div>
-
-        <div class="p-4 border-t border-slate-200 dark:border-slate-800 bg-slate-50 dark:bg-[#1e293b] flex items-center justify-center gap-4 transition-colors duration-200">
-            <button class="text-sm font-medium text-slate-400 dark:text-slate-500 hover:text-slate-600 dark:hover:text-slate-300 disabled:opacity-50" disabled>Anterior</button>
-            <span class="text-sm font-bold text-slate-900 dark:text-white">Página 1</span>
-            <button class="text-sm font-medium text-indigo-600 dark:text-indigo-400 hover:text-indigo-700 dark:hover:text-indigo-300">Próxima</button>
-        </div>
-    </div>
-
-    <!-- Chat Modal -->
-    {#if isChatModalOpen}
-        <div class="fixed inset-0 z-[100] flex items-center justify-center p-4 sm:p-6 transition-colors duration-200" role="dialog" aria-modal="true">
-            <!-- Backdrop -->
-            <div 
-                class="absolute inset-0 bg-slate-900/60 dark:bg-slate-950/80 backdrop-blur-sm transition-opacity" 
-                onclick={closeChat}
-                onkeydown={(e) => e.key === 'Escape' && closeChat()}
-                tabindex="0"
-                role="button"
-                aria-label="Close modal"
-            ></div>
-            
-            <!-- Modal Content -->
-            <div class="relative bg-white dark:bg-[#0f172a] rounded-2xl border border-slate-200 dark:border-slate-800 shadow-2xl w-full max-w-6xl max-h-[90vh] flex flex-col md:flex-row overflow-hidden animate-in fade-in zoom-in-95 duration-200">
-                <!-- Chat Area -->
-                <div class="flex-1 flex flex-col border-r border-slate-200 dark:border-slate-800 bg-slate-50 dark:bg-[#0b1120] min-h-[50vh] md:min-h-[600px] transition-colors duration-200">
-                    <!-- Chat Header -->
-                    <div class="h-16 px-6 border-b border-slate-200 dark:border-slate-800 flex items-center justify-between bg-white dark:bg-[#1e293b] transition-colors duration-200">
-                        <div class="flex items-center gap-3">
-                            <div class="w-10 h-10 rounded-full bg-slate-100 dark:bg-slate-800 flex items-center justify-center text-slate-500 dark:text-slate-400">
-                                <MessageCircle size={20} />
-                            </div>
-                            <div>
-                                <div class="font-bold text-slate-900 dark:text-white">{selectedInteraction?.client}</div>
-                                <div class="text-xs font-medium text-slate-500 dark:text-slate-400">WhatsApp</div>
-                            </div>
-                        </div>
-                        <button 
-                            onclick={closeChat}
-                            class="md:hidden p-2 text-slate-400 hover:text-slate-700 dark:hover:text-white rounded-lg hover:bg-slate-100 dark:hover:bg-slate-800 transition-colors"
-                        >
-                            <X size={20} />
-                        </button>
-                    </div>
-
-                    <!-- Chat Messages -->
-                    <div class="flex-1 overflow-y-auto p-6 space-y-6 custom-scrollbar">
-                        <div class="flex justify-center">
-                            <span class="px-3 py-1 rounded-full bg-white dark:bg-slate-800 text-xs font-bold text-slate-500 dark:text-slate-400 border border-slate-200 dark:border-slate-700 shadow-sm dark:shadow-none">
-                                ONTEM
-                            </span>
-                        </div>
-                        
-                        {#each selectedInteraction?.thread ?? [] as msg}
-                            <div class="flex flex-col {msg.isAgent ? 'items-end' : 'items-start'}">
-                                <div class="max-w-[80%] {msg.isAgent ? 'bg-indigo-600 text-white rounded-2xl rounded-tr-sm shadow-md shadow-indigo-600/20' : 'bg-white dark:bg-slate-800 text-slate-700 dark:text-slate-200 border border-slate-200 dark:border-transparent rounded-2xl rounded-tl-sm shadow-sm'} p-3.5">
-                                    {#if msg.isAgent}
-                                        <div class="text-[10px] font-bold text-indigo-200 mb-1">Ativadora</div>
-                                    {/if}
-                                    <p class="text-sm leading-relaxed whitespace-pre-wrap">{msg.text}</p>
-                                    <div class="text-[10px] text-right mt-1.5 {msg.isAgent ? 'opacity-70' : 'text-slate-400 font-medium'}">{msg.time}</div>
-                                </div>
-                            </div>
-                        {/each}
-                    </div>
-                </div>
-
-                <!-- Analysis Area -->
-                <div class="w-full md:w-[400px] flex flex-col bg-white dark:bg-[#1e293b] shrink-0 transition-colors duration-200">
-                    <div class="h-16 px-6 border-b border-slate-200 dark:border-slate-800 flex items-center justify-between">
-                        <h2 class="font-bold text-slate-900 dark:text-white text-lg">Relatório</h2>
-                        <button 
-                            onclick={closeChat}
-                            class="hidden md:flex px-3 py-1.5 bg-slate-100 hover:bg-slate-200 dark:bg-slate-800 dark:hover:bg-slate-700 text-slate-700 dark:text-slate-300 rounded-md text-sm font-bold transition-colors"
-                        >
-                            Fechar
-                        </button>
-                    </div>
-                    
-                    <div class="flex-1 overflow-y-auto p-6 space-y-8 custom-scrollbar">
-                    <!-- Mini chart placeholder -->
-                    <div class="h-32 bg-slate-50 dark:bg-slate-900 rounded-lg border border-slate-200 dark:border-slate-800 relative p-4 flex items-end overflow-hidden shadow-inner">
-                        <!-- Decorative chart lines matching the UI -->
-                        <svg class="absolute inset-0 w-full h-full" preserveAspectRatio="none">
-                            <path d="M0,20 L40,100 L200,100 L300,100 L350,60" fill="none" stroke="#38bdf8" stroke-width="2" vector-effect="non-scaling-stroke" />
-                            <path d="M0,60 L40,100 L200,100 L300,100 L350,40" fill="none" stroke="#10b981" stroke-width="2" vector-effect="non-scaling-stroke" />
-                            <!-- Dots -->
-                            <circle cx="0" cy="20" r="3" fill="#38bdf8" />
-                            <circle cx="40" cy="100" r="3" fill="#38bdf8" />
-                            <circle cx="120" cy="100" r="3" fill="#38bdf8" />
-                            <circle cx="200" cy="100" r="3" fill="#38bdf8" />
-                            <circle cx="300" cy="100" r="3" fill="#38bdf8" />
-                            <circle cx="350" cy="60" r="3" fill="#38bdf8" />
-                        </svg>
-                        <div class="w-full flex justify-between text-[10px] font-medium text-slate-400 dark:text-slate-500 absolute bottom-2 left-0 px-4">
-                            <span>22:58</span>
-                            <span>23:00</span>
-                            <span>23:02</span>
-                            <span>23:04</span>
-                            <span>23:06</span>
-                        </div>
-                    </div>
-                    
-                    <div class="grid grid-cols-2 gap-y-6 gap-x-4">
-                        <div>
-                            <div class="text-xs font-bold text-slate-500 dark:text-slate-400 uppercase tracking-wider mb-1">MÉDIA RESPOSTA</div>
-                            <div class="text-lg font-extrabold text-slate-900 dark:text-white">04:03</div>
-                        </div>
-                        <div>
-                            <div class="text-xs font-bold text-slate-500 dark:text-slate-400 uppercase tracking-wider mb-1">DURAÇÃO TOTAL</div>
-                            <div class="text-lg font-extrabold text-slate-900 dark:text-white">08:28</div>
-                        </div>
-                        <div>
-                            <div class="text-xs font-bold text-slate-500 dark:text-slate-400 uppercase tracking-wider mb-1">MÉDIA AGENTE</div>
-                            <div class="text-lg font-extrabold text-slate-900 dark:text-white">00:00</div>
-                        </div>
-                        <div>
-                            <div class="text-xs font-bold text-slate-500 dark:text-slate-400 uppercase tracking-wider mb-1">MÉDIA CLIENTE</div>
-                            <div class="text-lg font-extrabold text-slate-900 dark:text-white">08:05</div>
-                        </div>
-                    </div>
-                    
-                    <div class="space-y-4">
-                        <div>
-                            <div class="text-xs font-bold text-slate-500 dark:text-slate-400 uppercase tracking-wider mb-1">ASPECTO PRINCIPAL</div>
-                            <div class="text-base font-semibold text-indigo-600 dark:text-indigo-400">{selectedInteraction?.aspect || 'Atendimento'}</div>
-                        </div>
-                        <div>
-                            <div class="text-xs font-bold text-slate-500 dark:text-slate-400 uppercase tracking-wider mb-1">SUBASPECTO</div>
-                            <div class="text-base font-semibold text-slate-700 dark:text-slate-200">{selectedInteraction?.subaspect || 'Informativo'}</div>
-                        </div>
-                    </div>
-                    
-                    <div class="grid grid-cols-2 gap-4 pt-4 border-t border-slate-200 dark:border-slate-800">
-                        <div>
-                            <div class="text-xs font-bold text-slate-500 dark:text-slate-400 uppercase tracking-wider mb-1">ÚLTIMA MENSAGEM</div>
-                            <div class="text-sm font-semibold text-slate-900 dark:text-white">Cliente</div>
-                        </div>
-                        <div>
-                            <div class="text-xs font-bold text-slate-500 dark:text-slate-400 uppercase tracking-wider mb-1">CONSECUTIVAS</div>
-                            <div class="text-sm font-semibold text-slate-900 dark:text-white">Não</div>
-                        </div>
-                    </div>
-                    
-                    <div class="text-center pt-4">
-                        <button class="text-sm font-bold text-indigo-600 dark:text-indigo-400 hover:text-indigo-700 dark:hover:text-indigo-300 transition-colors">
-                            Detalhes Extraídos
-                        </button>
-                    </div>
-                </div>
-            </div>
-        </div>
-    </div>
-{/if}
+            </button> -->
+		</div>
+	</div>
+
+	<!-- Table Container -->
+	<div
+		class="flex flex-col overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm transition-colors duration-200 dark:border-slate-800 dark:bg-[#1e293b]"
+	>
+		<div
+			class="flex flex-col gap-3 border-b border-slate-200 bg-slate-50 p-4 sm:flex-row sm:items-center sm:justify-between dark:border-slate-800 dark:bg-[#1e293b]"
+		>
+			<div class="relative">
+				<Search
+					size={16}
+					class="absolute top-1/2 left-3 -translate-y-1/2 text-slate-400 dark:text-slate-500"
+				/>
+				<input
+					type="text"
+					bind:value={searchQuery}
+					placeholder="Buscar cliente..."
+					class="w-64 rounded-lg border border-slate-300 bg-white py-2 pr-4 pl-9 text-sm text-slate-900 placeholder-slate-400 shadow-sm transition-all focus:border-indigo-500 focus:ring-1 focus:ring-indigo-500 focus:outline-none dark:border-slate-700 dark:bg-slate-900 dark:text-slate-200 dark:placeholder-slate-500 dark:shadow-none"
+				/>
+			</div>
+			<div class="text-sm font-medium text-slate-500 dark:text-slate-400">
+				Exibindo {conversationThreads.length} conversas
+			</div>
+		</div>
+
+		<div class="custom-scrollbar overflow-x-auto">
+			<table class="w-full border-collapse text-left">
+				<thead>
+					<tr
+						class="border-b border-slate-200 bg-slate-100/50 text-xs font-semibold tracking-wider text-slate-500 uppercase transition-colors duration-200 dark:border-slate-800 dark:bg-slate-900/50 dark:text-slate-400"
+					>
+						<th class="p-4">Cliente</th>
+						<th class="p-4">Agente</th>
+						<th class="p-4">Sentimento Geral</th>
+						<th class="p-4">Score</th>
+						<th class="p-4">Aspectos Detectados</th>
+						<th class="p-4">Subaspectos Detectados</th>
+						<th class="p-4">Data e Hora</th>
+						<th class="p-4 text-right">Análise Avançada</th>
+					</tr>
+				</thead>
+				<tbody
+					class="divide-y divide-slate-100 transition-colors duration-200 dark:divide-slate-800/50"
+				>
+					{#each conversationThreads as item}
+						<tr class="group transition-colors hover:bg-slate-50 dark:hover:bg-slate-800/30">
+							<td class="p-4">
+								<span class="font-bold text-slate-900 dark:text-white">{item.client}</span>
+							</td>
+							<td class="p-4 font-medium text-slate-600 dark:text-slate-300"
+								>{item.agent === '-' ? 'Time Nettown' : item.agent}</td
+							>
+							<td class="p-4">
+								<span
+									class="rounded-md border px-2.5 py-1 text-xs font-bold {getSentimentColor(
+										item.sentiment
+									)} transition-colors duration-200"
+								>
+									{item.sentiment}
+								</span>
+							</td>
+							<td class="p-4 font-bold text-slate-700 dark:text-slate-300">{item.score}</td>
+							<td class="p-4 font-medium text-slate-600 dark:text-slate-300">{item.aspect}</td>
+							<td class="p-4 text-slate-500 dark:text-slate-400">{item.subaspect}</td>
+							<td class="p-4 text-sm font-medium text-slate-500 dark:text-slate-400"
+								>{item.datetime}</td
+							>
+							<td class="p-4 text-right">
+								<button
+									onclick={() => openChat(item)}
+									class="inline-flex items-center gap-1.5 rounded-md border border-indigo-200 bg-indigo-50 px-3 py-1.5 text-sm font-semibold text-indigo-600 shadow-sm transition-colors hover:bg-indigo-100 dark:border-indigo-500/20 dark:bg-indigo-500/10 dark:text-indigo-400 dark:shadow-none dark:hover:bg-indigo-500/20"
+								>
+									<Eye size={14} />
+									Ver Chat
+								</button>
+							</td>
+						</tr>
+					{/each}
+
+					{#if conversationThreads.length === 0}
+						<tr>
+							<td colspan="8" class="p-8 text-center font-medium text-slate-500">
+								Nenhuma interação encontrada.
+							</td>
+						</tr>
+					{/if}
+				</tbody>
+			</table>
+		</div>
+
+		<div
+			class="flex items-center justify-center gap-4 border-t border-slate-200 bg-slate-50 p-4 transition-colors duration-200 dark:border-slate-800 dark:bg-[#1e293b]"
+		>
+			<button
+				class="text-sm font-medium text-slate-400 hover:text-slate-600 disabled:opacity-50 dark:text-slate-500 dark:hover:text-slate-300"
+				disabled>Anterior</button
+			>
+			<span class="text-sm font-bold text-slate-900 dark:text-white">Página 1</span>
+			<button
+				class="text-sm font-medium text-indigo-600 hover:text-indigo-700 dark:text-indigo-400 dark:hover:text-indigo-300"
+				>Próxima</button
+			>
+		</div>
+	</div>
+
+	<!-- Chat Modal -->
+	{#if isChatModalOpen}
+		<div
+			class="fixed inset-0 z-[100] flex items-center justify-center p-4 transition-colors duration-200 sm:p-6"
+			role="dialog"
+			aria-modal="true"
+		>
+			<!-- Backdrop -->
+			<div
+				class="absolute inset-0 bg-slate-900/60 backdrop-blur-sm transition-opacity dark:bg-slate-950/80"
+				onclick={closeChat}
+				onkeydown={(e) => e.key === 'Escape' && closeChat()}
+				tabindex="0"
+				role="button"
+				aria-label="Close modal"
+			></div>
+
+			<!-- Modal Content -->
+			<div
+				class="animate-in fade-in zoom-in-95 relative flex max-h-[90vh] w-full max-w-6xl flex-col overflow-hidden rounded-2xl border border-slate-200 bg-white shadow-2xl duration-200 md:flex-row dark:border-slate-800 dark:bg-[#0f172a]"
+			>
+				<!-- Chat Area -->
+				<div
+					class="flex min-h-[50vh] flex-1 flex-col border-r border-slate-200 bg-slate-50 transition-colors duration-200 md:min-h-[600px] dark:border-slate-800 dark:bg-[#0b1120]"
+				>
+					<!-- Chat Header -->
+					<div
+						class="flex h-16 items-center justify-between border-b border-slate-200 bg-white px-6 transition-colors duration-200 dark:border-slate-800 dark:bg-[#1e293b]"
+					>
+						<div class="flex items-center gap-3">
+							<div
+								class="flex h-10 w-10 items-center justify-center rounded-full bg-slate-100 text-slate-500 dark:bg-slate-800 dark:text-slate-400"
+							>
+								<MessageCircle size={20} />
+							</div>
+							<div>
+								<div class="font-bold text-slate-900 dark:text-white">
+									{selectedInteraction?.client}
+								</div>
+								<div class="text-xs font-medium text-slate-500 dark:text-slate-400">WhatsApp</div>
+							</div>
+						</div>
+						<button
+							onclick={closeChat}
+							class="rounded-lg p-2 text-slate-400 transition-colors hover:bg-slate-100 hover:text-slate-700 md:hidden dark:hover:bg-slate-800 dark:hover:text-white"
+						>
+							<X size={20} />
+						</button>
+					</div>
+
+					<!-- Chat Messages -->
+					<div class="custom-scrollbar flex-1 space-y-6 overflow-y-auto p-6">
+						<div class="flex justify-center">
+							<span
+								class="rounded-full border border-slate-200 bg-white px-3 py-1 text-xs font-bold text-slate-500 shadow-sm dark:border-slate-700 dark:bg-slate-800 dark:text-slate-400 dark:shadow-none"
+							>
+								ONTEM
+							</span>
+						</div>
+
+						{#each selectedInteraction?.thread ?? [] as msg}
+							<div class="flex flex-col {msg.isAgent ? 'items-end' : 'items-start'}">
+								<div
+									class="max-w-[80%] {msg.isAgent
+										? 'rounded-2xl rounded-tr-sm bg-indigo-600 text-white shadow-md shadow-indigo-600/20'
+										: 'rounded-2xl rounded-tl-sm border border-slate-200 bg-white text-slate-700 shadow-sm dark:border-transparent dark:bg-slate-800 dark:text-slate-200'} p-3.5"
+								>
+									{#if msg.isAgent}
+										<div class="mb-1 text-[10px] font-bold text-indigo-200">Ativadora</div>
+									{/if}
+									<p class="text-sm leading-relaxed whitespace-pre-wrap">{msg.text}</p>
+									<div
+										class="mt-1.5 text-right text-[10px] {msg.isAgent
+											? 'opacity-70'
+											: 'font-medium text-slate-400'}"
+									>
+										{msg.time}
+									</div>
+								</div>
+							</div>
+						{/each}
+					</div>
+				</div>
+
+				<!-- Analysis Area -->
+				<div
+					class="flex w-full shrink-0 flex-col bg-white transition-colors duration-200 md:w-[400px] dark:bg-[#1e293b]"
+				>
+					<div
+						class="flex h-16 items-center justify-between border-b border-slate-200 px-6 dark:border-slate-800"
+					>
+						<h2 class="text-lg font-bold text-slate-900 dark:text-white">Relatório</h2>
+						<button
+							onclick={closeChat}
+							class="hidden rounded-md bg-slate-100 px-3 py-1.5 text-sm font-bold text-slate-700 transition-colors hover:bg-slate-200 md:flex dark:bg-slate-800 dark:text-slate-300 dark:hover:bg-slate-700"
+						>
+							Fechar
+						</button>
+					</div>
+
+					<div class="custom-scrollbar flex-1 space-y-8 overflow-y-auto p-6">
+						<!-- Mini chart placeholder -->
+						<div
+							class="relative flex h-32 items-end overflow-hidden rounded-lg border border-slate-200 bg-slate-50 p-4 shadow-inner dark:border-slate-800 dark:bg-slate-900"
+						>
+							<!-- Decorative chart lines matching the UI -->
+							<svg class="absolute inset-0 h-full w-full" preserveAspectRatio="none">
+								<path
+									d="M0,20 L40,100 L200,100 L300,100 L350,60"
+									fill="none"
+									stroke="#38bdf8"
+									stroke-width="2"
+									vector-effect="non-scaling-stroke"
+								/>
+								<path
+									d="M0,60 L40,100 L200,100 L300,100 L350,40"
+									fill="none"
+									stroke="#10b981"
+									stroke-width="2"
+									vector-effect="non-scaling-stroke"
+								/>
+								<!-- Dots -->
+								<circle cx="0" cy="20" r="3" fill="#38bdf8" />
+								<circle cx="40" cy="100" r="3" fill="#38bdf8" />
+								<circle cx="120" cy="100" r="3" fill="#38bdf8" />
+								<circle cx="200" cy="100" r="3" fill="#38bdf8" />
+								<circle cx="300" cy="100" r="3" fill="#38bdf8" />
+								<circle cx="350" cy="60" r="3" fill="#38bdf8" />
+							</svg>
+							<div
+								class="absolute bottom-2 left-0 flex w-full justify-between px-4 text-[10px] font-medium text-slate-400 dark:text-slate-500"
+							>
+								<span>22:58</span>
+								<span>23:00</span>
+								<span>23:02</span>
+								<span>23:04</span>
+								<span>23:06</span>
+							</div>
+						</div>
+
+						<div class="grid grid-cols-2 gap-x-4 gap-y-6">
+							<div>
+								<div
+									class="mb-1 text-xs font-bold tracking-wider text-slate-500 uppercase dark:text-slate-400"
+								>
+									MÉDIA RESPOSTA
+								</div>
+								<div class="text-lg font-extrabold text-slate-900 dark:text-white">04:03</div>
+							</div>
+							<div>
+								<div
+									class="mb-1 text-xs font-bold tracking-wider text-slate-500 uppercase dark:text-slate-400"
+								>
+									DURAÇÃO TOTAL
+								</div>
+								<div class="text-lg font-extrabold text-slate-900 dark:text-white">08:28</div>
+							</div>
+							<div>
+								<div
+									class="mb-1 text-xs font-bold tracking-wider text-slate-500 uppercase dark:text-slate-400"
+								>
+									MÉDIA AGENTE
+								</div>
+								<div class="text-lg font-extrabold text-slate-900 dark:text-white">00:00</div>
+							</div>
+							<div>
+								<div
+									class="mb-1 text-xs font-bold tracking-wider text-slate-500 uppercase dark:text-slate-400"
+								>
+									MÉDIA CLIENTE
+								</div>
+								<div class="text-lg font-extrabold text-slate-900 dark:text-white">08:05</div>
+							</div>
+						</div>
+
+						<div class="space-y-4">
+							<div>
+								<div
+									class="mb-1 text-xs font-bold tracking-wider text-slate-500 uppercase dark:text-slate-400"
+								>
+									ASPECTO PRINCIPAL
+								</div>
+								<div class="text-base font-semibold text-indigo-600 dark:text-indigo-400">
+									{selectedInteraction?.aspect || 'Atendimento'}
+								</div>
+							</div>
+							<div>
+								<div
+									class="mb-1 text-xs font-bold tracking-wider text-slate-500 uppercase dark:text-slate-400"
+								>
+									SUBASPECTO
+								</div>
+								<div class="text-base font-semibold text-slate-700 dark:text-slate-200">
+									{selectedInteraction?.subaspect || 'Informativo'}
+								</div>
+							</div>
+						</div>
+
+						<div
+							class="grid grid-cols-2 gap-4 border-t border-slate-200 pt-4 dark:border-slate-800"
+						>
+							<div>
+								<div
+									class="mb-1 text-xs font-bold tracking-wider text-slate-500 uppercase dark:text-slate-400"
+								>
+									ÚLTIMA MENSAGEM
+								</div>
+								<div class="text-sm font-semibold text-slate-900 dark:text-white">Cliente</div>
+							</div>
+							<div>
+								<div
+									class="mb-1 text-xs font-bold tracking-wider text-slate-500 uppercase dark:text-slate-400"
+								>
+									CONSECUTIVAS
+								</div>
+								<div class="text-sm font-semibold text-slate-900 dark:text-white">Não</div>
+							</div>
+						</div>
 
+						<div class="pt-4 text-center">
+							<button
+								class="text-sm font-bold text-indigo-600 transition-colors hover:text-indigo-700 dark:text-indigo-400 dark:hover:text-indigo-300"
+							>
+								Detalhes Extraídos
+							</button>
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
+	{/if}
 </div>

+ 190 - 0
src/routes/(app)/dashboard/perfil/+page.svelte

@@ -0,0 +1,190 @@
+<script>
+	import { User, Mail, Phone, MapPin, Building, Key, ChevronRight } from 'lucide-svelte';
+	import { goto } from '$app/navigation';
+	let isEditingPassword = false;
+	let passwordForm = {
+		currentPassword: '',
+		newPassword: '',
+		confirmPassword: ''
+	};
+
+	function handleChangePassword() {
+		isEditingPassword = true;
+	}
+
+	function handleSavePassword() {
+		if (passwordForm.newPassword !== passwordForm.confirmPassword) {
+			alert('As senhas não conferem');
+			return;
+		}
+		console.log('Alterando senha...');
+		isEditingPassword = false;
+		passwordForm = { currentPassword: '', newPassword: '', confirmPassword: '' };
+	}
+
+	function handleCancel() {
+		isEditingPassword = false;
+		passwordForm = { currentPassword: '', newPassword: '', confirmPassword: '' };
+	}
+</script>
+
+<div class="mx-auto max-w-3xl space-y-6">
+	<!-- Header -->
+	<div class="rounded-xl border border-slate-200 bg-white p-5 md:p-6 shadow-sm transition-colors duration-200 dark:border-slate-800 dark:bg-[#161f30]">
+		<div class="flex items-center gap-3">
+			<div class="h-8 w-8 shrink-0 rounded-lg bg-indigo-500/20 text-indigo-500 flex items-center justify-center">
+				<User size={20} strokeWidth={2.5} />
+			</div>
+			<h1 class="text-xl font-bold text-slate-900 dark:text-white">Meu Perfil</h1>
+		</div>
+		<p class="mt-2 text-sm text-slate-600 dark:text-slate-400">
+			Gerencie suas informações de perfil e preferências de segurança
+		</p>
+	</div>
+
+	<!-- Profile Information -->
+	<div class="rounded-xl border border-slate-200 bg-white shadow-sm transition-colors duration-200 dark:border-slate-800 dark:bg-[#161f30]">
+		<div class="border-b border-slate-200 p-5 dark:border-slate-800">
+			<h2 class="text-lg font-semibold text-slate-900 dark:text-white">Informações Pessoais</h2>
+		</div>
+
+		<div class="p-5 space-y-4">
+			<!-- Name -->
+			<div>
+				<label class="block text-sm font-medium text-slate-700 dark:text-slate-300 mb-1">
+					Nome
+				</label>
+				<div class="flex items-center gap-3 p-3 bg-slate-50 dark:bg-slate-800/50 rounded-lg border border-slate-200 dark:border-slate-700">
+					<User size={18} class="text-slate-400 shrink-0" />
+					<span class="text-slate-900 dark:text-slate-200">Admin</span>
+				</div>
+			</div>
+
+			<!-- Email -->
+			<div>
+				<label class="block text-sm font-medium text-slate-700 dark:text-slate-300 mb-1">
+					E-mail
+				</label>
+				<div class="flex items-center gap-3 p-3 bg-slate-50 dark:bg-slate-800/50 rounded-lg border border-slate-200 dark:border-slate-700">
+					<Mail size={18} class="text-slate-400 shrink-0" />
+					<span class="text-slate-900 dark:text-slate-200">admin@nettown.com</span>
+				</div>
+			</div>
+
+			<!-- Phone -->
+			<div>
+				<label class="block text-sm font-medium text-slate-700 dark:text-slate-300 mb-1">
+					Telefone
+				</label>
+				<input
+					type="tel"
+					placeholder="(11) 99999-9999"
+					class="w-full px-4 py-2.5 bg-white dark:bg-slate-800 border border-slate-200 dark:border-slate-700 rounded-lg text-sm text-slate-900 dark:text-slate-200 placeholder-slate-400 focus:outline-none focus:border-indigo-500 focus:ring-1 focus:ring-indigo-500 transition-colors"
+				/>
+			</div>
+
+			<!-- Company -->
+			<div>
+				<label class="block text-sm font-medium text-slate-700 dark:text-slate-300 mb-1">
+					Empresa
+				</label>
+				<div class="flex items-center gap-3 p-3 bg-slate-50 dark:bg-slate-800/50 rounded-lg border border-slate-200 dark:border-slate-700">
+					<Building size={18} class="text-slate-400 shrink-0" />
+					<span class="text-slate-900 dark:text-slate-200">NetTown Analytics</span>
+				</div>
+			</div>
+
+			<!-- Save Button -->
+			<div class="flex gap-3 pt-4">
+				<button class="inline-flex items-center px-4 py-2 text-sm font-medium rounded-lg bg-indigo-600 text-white hover:bg-indigo-700 transition-colors duration-150">
+					Salvar Alterações
+				</button>
+			</div>
+		</div>
+	</div>
+
+	<!-- Security Section -->
+	<div class="rounded-xl border border-slate-200 bg-white shadow-sm transition-colors duration-200 dark:border-slate-800 dark:bg-[#161f30]">
+		<div class="border-b border-slate-200 p-5 dark:border-slate-800">
+			<h2 class="text-lg font-semibold text-slate-900 dark:text-white">Segurança</h2>
+		</div>
+
+		{#if !isEditingPassword}
+			<div class="divide-y divide-slate-200 dark:divide-slate-800">
+				<div class="p-5 hover:bg-slate-50 transition-colors duration-150 dark:hover:bg-slate-800/50">
+					<div class="flex items-center justify-between">
+						<div class="flex items-center gap-3">
+							<div class="h-10 w-10 rounded-lg bg-slate-100 text-slate-600 flex items-center justify-center dark:bg-slate-800 dark:text-slate-400">
+								<Key size={18} />
+							</div>
+							<div>
+								<h3 class="text-sm font-medium text-slate-900 dark:text-white">Alterar Senha</h3>
+								<p class="mt-0.5 text-xs text-slate-600 dark:text-slate-400">Atualize sua senha com regularidade</p>
+							</div>
+						</div>
+						<button
+							onclick={handleChangePassword}
+							class="inline-flex items-center gap-1 px-3 py-1.5 text-sm font-medium rounded-md bg-indigo-600 text-white hover:bg-indigo-700 transition-colors duration-150"
+						>
+							Alterar
+							<ChevronRight size={14} />
+						</button>
+					</div>
+				</div>
+			</div>
+		{:else}
+			<div class="p-5 space-y-4">
+				<div>
+					<label class="block text-sm font-medium text-slate-700 dark:text-slate-300 mb-1">
+						Senha Atual
+					</label>
+					<input
+						type="password"
+						placeholder="Insira sua senha atual"
+						bind:value={passwordForm.currentPassword}
+						class="w-full px-4 py-2.5 bg-white dark:bg-slate-800 border border-slate-200 dark:border-slate-700 rounded-lg text-sm text-slate-900 dark:text-slate-200 placeholder-slate-400 focus:outline-none focus:border-indigo-500 focus:ring-1 focus:ring-indigo-500 transition-colors"
+					/>
+				</div>
+
+				<div>
+					<label class="block text-sm font-medium text-slate-700 dark:text-slate-300 mb-1">
+						Nova Senha
+					</label>
+					<input
+						type="password"
+						placeholder="Insira sua nova senha"
+						bind:value={passwordForm.newPassword}
+						class="w-full px-4 py-2.5 bg-white dark:bg-slate-800 border border-slate-200 dark:border-slate-700 rounded-lg text-sm text-slate-900 dark:text-slate-200 placeholder-slate-400 focus:outline-none focus:border-indigo-500 focus:ring-1 focus:ring-indigo-500 transition-colors"
+					/>
+				</div>
+
+				<div>
+					<label class="block text-sm font-medium text-slate-700 dark:text-slate-300 mb-1">
+						Confirmar Nova Senha
+					</label>
+					<input
+						type="password"
+						placeholder="Confirme sua nova senha"
+						bind:value={passwordForm.confirmPassword}
+						class="w-full px-4 py-2.5 bg-white dark:bg-slate-800 border border-slate-200 dark:border-slate-700 rounded-lg text-sm text-slate-900 dark:text-slate-200 placeholder-slate-400 focus:outline-none focus:border-indigo-500 focus:ring-1 focus:ring-indigo-500 transition-colors"
+					/>
+				</div>
+
+				<div class="flex gap-3 pt-4">
+					<button
+						onclick={handleSavePassword}
+						class="inline-flex items-center px-4 py-2 text-sm font-medium rounded-lg bg-indigo-600 text-white hover:bg-indigo-700 transition-colors duration-150"
+					>
+						Salvar Senha
+					</button>
+					<button
+						onclick={handleCancel}
+						class="inline-flex items-center px-4 py-2 text-sm font-medium rounded-lg bg-slate-200 text-slate-900 hover:bg-slate-300 transition-colors duration-150 dark:bg-slate-700 dark:text-slate-200 dark:hover:bg-slate-600"
+					>
+						Cancelar
+					</button>
+				</div>
+			</div>
+		{/if}
+	</div>
+</div>

+ 169 - 62
src/routes/(app)/dashboard/personas/+page.svelte

@@ -1,5 +1,13 @@
 <script>
-	import { Users, AlertTriangle, DollarSign, Compass, UserRound, TrendingUp, HeartHandshake } from 'lucide-svelte';
+	import {
+		Users,
+		AlertTriangle,
+		DollarSign,
+		Compass,
+		UserRound,
+		TrendingUp,
+		HeartHandshake
+	} from 'lucide-svelte';
 	import { mockPersonasKpis, mockPersonas } from '$lib/core/models/mock-data.js';
 
 	let selectedPersona = $state(mockPersonas[0] ?? null);
@@ -39,7 +47,12 @@
 	const baseKpis = {
 		active: Number(mockPersonasKpis.ativas) || 5,
 		churn: parseFloat(String(mockPersonasKpis.riscoChurn).replace(',', '.')) || 60.1,
-		loss: Number(String(mockPersonasKpis.perdaMensalEst).replace(/[^0-9,.-]/g, '').replace(',', '.')) || 7521.27,
+		loss:
+			Number(
+				String(mockPersonasKpis.perdaMensalEst)
+					.replace(/[^0-9,.-]/g, '')
+					.replace(',', '.')
+			) || 7521.27,
 		potentialScore: mockPersonasKpis.potencialExpansao === 'Neutro' ? 0 : 0.2
 	};
 
@@ -50,9 +63,15 @@
 		subaspects: 56
 	};
 
-	const periodSelection = $derived.by(() => periodOptions.find((opt) => opt.id === selectedPeriod) ?? periodOptions[0]);
-	const unitSelection = $derived.by(() => unitOptions.find((opt) => opt.id === selectedUnit) ?? unitOptions[0]);
-	const areaSelection = $derived.by(() => areaOptions.find((opt) => opt.id === selectedArea) ?? areaOptions[0]);
+	const periodSelection = $derived.by(
+		() => periodOptions.find((opt) => opt.id === selectedPeriod) ?? periodOptions[0]
+	);
+	const unitSelection = $derived.by(
+		() => unitOptions.find((opt) => opt.id === selectedUnit) ?? unitOptions[0]
+	);
+	const areaSelection = $derived.by(
+		() => areaOptions.find((opt) => opt.id === selectedArea) ?? areaOptions[0]
+	);
 	const sentimentSelection = $derived.by(
 		() => sentimentOptions.find((opt) => opt.id === selectedSentiment) ?? sentimentOptions[0]
 	);
@@ -68,10 +87,23 @@
 		const sentimentBias = sentimentSelection?.bias ?? sentimentOptions[0].bias;
 		const multiplier = Number.isFinite(combinedMultiplier) ? combinedMultiplier : 1;
 		const active = Math.max(1, Math.round(baseKpis.active * multiplier * sentimentBias.volume));
-		const churn = Math.min(100, Math.max(5, Number((baseKpis.churn * sentimentBias.churn).toFixed(1))));
+		const churn = Math.min(
+			100,
+			Math.max(5, Number((baseKpis.churn * sentimentBias.churn).toFixed(1)))
+		);
 		const loss = Math.max(500, baseKpis.loss * multiplier * sentimentBias.churn * 0.9);
-		const potentialScore = Math.max(-1, Math.min(1.5, baseKpis.potentialScore + sentimentBias.potential));
-		const potentialLabel = potentialScore >= 0.8 ? 'Muito alto' : potentialScore >= 0.3 ? 'Alto' : potentialScore >= -0.2 ? 'Neutro' : 'Baixo';
+		const potentialScore = Math.max(
+			-1,
+			Math.min(1.5, baseKpis.potentialScore + sentimentBias.potential)
+		);
+		const potentialLabel =
+			potentialScore >= 0.8
+				? 'Muito alto'
+				: potentialScore >= 0.3
+					? 'Alto'
+					: potentialScore >= -0.2
+						? 'Neutro'
+						: 'Baixo';
 		return {
 			active,
 			churn,
@@ -115,17 +147,23 @@
 
 <div class="mx-auto max-w-[1600px] space-y-6">
 	<!-- Top Section: Header, Filters, KPIs -->
-	<div class="rounded-xl border border-slate-200 bg-white p-5 md:p-8 shadow-sm transition-colors duration-200 dark:border-slate-800 dark:bg-[#161f30]">
-		<div class="flex items-center gap-3 mb-8">
-			<div class="h-8 w-8 shrink-0 rounded-lg bg-amber-500/20 text-amber-500 flex items-center justify-center">
+	<div
+		class="rounded-xl border border-slate-200 bg-white p-5 shadow-sm transition-colors duration-200 md:p-8 dark:border-slate-800 dark:bg-[#161f30]"
+	>
+		<div class="mb-8 flex items-center gap-3">
+			<div
+				class="flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-amber-500/20 text-amber-500"
+			>
 				<Compass size={20} strokeWidth={2.5} />
 			</div>
-			<h1 class="text-xl font-bold text-slate-900 dark:text-white">Expansão: Laboratório de Personas</h1>
+			<h1 class="text-xl font-bold text-slate-900 dark:text-white">
+				Expansão: Laboratório de Personas
+			</h1>
 		</div>
 
-		<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 w-full text-sm mb-12">
+		<div class="mb-12 grid w-full grid-cols-1 gap-6 text-sm md:grid-cols-2 lg:grid-cols-4">
 			<div class="flex items-center justify-center gap-2">
-				<span class="text-slate-500 dark:text-slate-400 whitespace-nowrap">Período:</span>
+				<span class="whitespace-nowrap text-slate-500 dark:text-slate-400">Período:</span>
 				<select
 					class="rounded-md border border-slate-200 bg-white px-3 py-1.5 text-slate-900 focus:border-indigo-500 focus:outline-none dark:border-slate-700 dark:bg-[#0f172a] dark:text-slate-200"
 					bind:value={selectedPeriod}
@@ -136,7 +174,7 @@
 				</select>
 			</div>
 			<div class="flex items-center justify-center gap-2">
-				<span class="text-slate-500 dark:text-slate-400 whitespace-nowrap">Unidade:</span>
+				<span class="whitespace-nowrap text-slate-500 dark:text-slate-400">Unidade:</span>
 				<select
 					class="rounded-md border border-slate-200 bg-white px-3 py-1.5 text-slate-900 focus:border-indigo-500 focus:outline-none dark:border-slate-700 dark:bg-[#0f172a] dark:text-slate-200"
 					bind:value={selectedUnit}
@@ -147,7 +185,7 @@
 				</select>
 			</div>
 			<div class="flex items-center justify-center gap-2">
-				<span class="text-slate-500 dark:text-slate-400 whitespace-nowrap">Área:</span>
+				<span class="whitespace-nowrap text-slate-500 dark:text-slate-400">Área:</span>
 				<select
 					class="rounded-md border border-slate-200 bg-white px-3 py-1.5 text-slate-900 focus:border-indigo-500 focus:outline-none dark:border-slate-700 dark:bg-[#0f172a] dark:text-slate-200"
 					bind:value={selectedArea}
@@ -158,7 +196,7 @@
 				</select>
 			</div>
 			<div class="flex items-center justify-center gap-2">
-				<span class="text-slate-500 dark:text-slate-400 whitespace-nowrap">Sentimento:</span>
+				<span class="whitespace-nowrap text-slate-500 dark:text-slate-400">Sentimento:</span>
 				<select
 					class="rounded-md border border-slate-200 bg-white px-3 py-1.5 text-slate-900 focus:border-indigo-500 focus:outline-none dark:border-slate-700 dark:bg-[#0f172a] dark:text-slate-200"
 					bind:value={selectedSentiment}
@@ -171,76 +209,117 @@
 		</div>
 
 		<!-- KPIs -->
-		<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 w-full pb-4">
+		<div class="grid w-full grid-cols-1 gap-6 pb-4 md:grid-cols-2 lg:grid-cols-4">
 			<div class="flex flex-col items-center justify-center text-center">
-				<UserRound size={24} class="text-amber-500 mb-3 mx-auto" />
-				<div class="text-3xl font-bold text-slate-900 dark:text-white mb-1">{kpis.active}</div>
-				<div class="text-[11px] font-semibold tracking-wider text-slate-500 uppercase dark:text-slate-400">Personas Ativas</div>
+				<UserRound size={24} class="mx-auto mb-3 text-amber-500" />
+				<div class="mb-1 text-3xl font-bold text-slate-900 dark:text-white">{kpis.active}</div>
+				<div
+					class="text-[11px] font-semibold tracking-wider text-slate-500 uppercase dark:text-slate-400"
+				>
+					Personas Ativas
+				</div>
 			</div>
 			<div class="flex flex-col items-center justify-center text-center">
-				<AlertTriangle size={24} class="text-red-500 mb-3 mx-auto" />
-				<div class="text-3xl font-bold text-slate-900 dark:text-white mb-1">{kpis.churn}</div>
-				<div class="text-[11px] font-semibold tracking-wider text-slate-500 uppercase dark:text-slate-400">Risco de Churn</div>
+				<AlertTriangle size={24} class="mx-auto mb-3 text-red-500" />
+				<div class="mb-1 text-3xl font-bold text-slate-900 dark:text-white">{kpis.churn}</div>
+				<div
+					class="text-[11px] font-semibold tracking-wider text-slate-500 uppercase dark:text-slate-400"
+				>
+					Risco de Churn
+				</div>
 			</div>
 			<div class="flex flex-col items-center justify-center text-center">
-				<DollarSign size={24} class="text-red-500 mb-3 mx-auto" />
-				<div class="text-3xl font-bold text-slate-900 dark:text-white mb-1">{formatCurrency(kpis.loss)}</div>
-				<div class="text-[11px] font-semibold tracking-wider text-slate-500 uppercase dark:text-slate-400">Perda Mensal Est.</div>
+				<DollarSign size={24} class="mx-auto mb-3 text-red-500" />
+				<div class="mb-1 text-3xl font-bold text-slate-900 dark:text-white">
+					{formatCurrency(kpis.loss)}
+				</div>
+				<div
+					class="text-[11px] font-semibold tracking-wider text-slate-500 uppercase dark:text-slate-400"
+				>
+					Perda Mensal Est.
+				</div>
 			</div>
 			<div class="flex flex-col items-center justify-center text-center">
-				<DollarSign size={24} class="text-amber-500 mb-3 mx-auto" />
-				<div class="text-3xl font-bold text-slate-900 dark:text-white mb-1">{kpis.potentialLabel}</div>
-				<div class="text-[11px] font-semibold tracking-wider text-slate-500 uppercase dark:text-slate-400">Potencial de Expansão</div>
+				<DollarSign size={24} class="mx-auto mb-3 text-amber-500" />
+				<div class="mb-1 text-3xl font-bold text-slate-900 dark:text-white">
+					{kpis.potentialLabel}
+				</div>
+				<div
+					class="text-[11px] font-semibold tracking-wider text-slate-500 uppercase dark:text-slate-400"
+				>
+					Potencial de Expansão
+				</div>
 			</div>
 		</div>
 	</div>
 
 	<!-- Personas Grid & Details -->
-	<div class="grid grid-cols-1 xl:grid-cols-3 gap-6">
-		<div class="xl:col-span-2 rounded-xl border border-slate-200 bg-white p-5 md:p-6 shadow-sm transition-colors duration-200 dark:border-slate-800 dark:bg-[#161f30]">
-			
-			<div class="flex flex-wrap items-center justify-between gap-4 mb-8">
+	<div class="grid grid-cols-1 gap-6 xl:grid-cols-3">
+		<div
+			class="rounded-xl border border-slate-200 bg-white p-5 shadow-sm transition-colors duration-200 md:p-6 xl:col-span-2 dark:border-slate-800 dark:bg-[#161f30]"
+		>
+			<div class="mb-8 flex flex-wrap items-center justify-between gap-4">
 				<div class="flex items-center gap-3">
 					<div class="flex items-center justify-center text-slate-700 dark:text-slate-300">
 						<UserRound size={20} />
 					</div>
 					<h2 class="text-lg font-bold text-slate-900 dark:text-white">Minhas Personas</h2>
-					<span class="text-sm text-slate-500 dark:text-slate-400">Conheça sua base de forma humana</span>
+					<span class="text-sm text-slate-500 dark:text-slate-400"
+						>Conheça sua base de forma humana</span
+					>
 				</div>
-				<button class="rounded-lg bg-indigo-600 px-5 py-2 text-sm font-semibold text-white transition-colors hover:bg-indigo-700 shadow-sm whitespace-nowrap">
+				<!-- <button class="rounded-lg bg-indigo-600 px-5 py-2 text-sm font-semibold text-white transition-colors hover:bg-indigo-700 shadow-sm whitespace-nowrap">
 					Meus Clientes
-				</button>
+				</button> -->
 			</div>
 
 			<!-- Header Stats -->
-			<div class="grid grid-cols-2 md:grid-cols-4 gap-4 mb-8 pb-8 border-b border-slate-100 dark:border-slate-800/60">
+			<div
+				class="mb-8 grid grid-cols-2 gap-4 border-b border-slate-100 pb-8 md:grid-cols-4 dark:border-slate-800/60"
+			>
 				<div class="flex flex-col items-start text-left">
-					<div class="text-[11px] font-semibold tracking-wider text-slate-500 uppercase dark:text-slate-400 mb-2">
+					<div
+						class="mb-2 text-[11px] font-semibold tracking-wider text-slate-500 uppercase dark:text-slate-400"
+					>
 						Personas Identificadas
 					</div>
-					<div class="text-3xl font-bold text-slate-900 dark:text-white">{personaStats.identified}</div>
+					<div class="text-3xl font-bold text-slate-900 dark:text-white">
+						{personaStats.identified}
+					</div>
 				</div>
 				<div class="flex flex-col items-start text-left">
-					<div class="text-[11px] font-semibold tracking-wider text-slate-500 uppercase dark:text-slate-400 mb-2">
+					<div
+						class="mb-2 text-[11px] font-semibold tracking-wider text-slate-500 uppercase dark:text-slate-400"
+					>
 						Volume Total de Mensagens Analisadas
 					</div>
-					<div class="text-3xl font-bold text-slate-900 dark:text-white">{formatNumber(personaStats.messages)}</div>
+					<div class="text-3xl font-bold text-slate-900 dark:text-white">
+						{formatNumber(personaStats.messages)}
+					</div>
 				</div>
 				<div class="flex flex-col items-start text-left">
-					<div class="text-[11px] font-semibold tracking-wider text-slate-500 uppercase dark:text-slate-400 mb-2">
+					<div
+						class="mb-2 text-[11px] font-semibold tracking-wider text-slate-500 uppercase dark:text-slate-400"
+					>
 						Aspectos Únicos
 					</div>
-					<div class="text-3xl font-bold text-slate-900 dark:text-white">{formatNumber(personaStats.aspects)}</div>
+					<div class="text-3xl font-bold text-slate-900 dark:text-white">
+						{formatNumber(personaStats.aspects)}
+					</div>
 				</div>
 				<div class="flex flex-col items-start text-left">
-					<div class="text-[11px] font-semibold tracking-wider text-slate-500 uppercase dark:text-slate-400 mb-2">
+					<div
+						class="mb-2 text-[11px] font-semibold tracking-wider text-slate-500 uppercase dark:text-slate-400"
+					>
 						Subaspectos Únicos
 					</div>
-					<div class="text-3xl font-bold text-slate-900 dark:text-white">{formatNumber(personaStats.subaspects)}</div>
+					<div class="text-3xl font-bold text-slate-900 dark:text-white">
+						{formatNumber(personaStats.subaspects)}
+					</div>
 				</div>
 			</div>
 
-			<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
+			<div class="grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-4">
 				{#each mockPersonas as persona}
 					<button
 						type="button"
@@ -251,40 +330,64 @@
 								: 'border-slate-200 bg-white hover:border-slate-300 dark:border-slate-700/60 dark:bg-[#1e293b]/40 dark:hover:border-slate-600 dark:hover:bg-[#1e293b]/60'
 						}`}
 					>
-						<span class="inline-block rounded-full bg-indigo-100 px-4 py-1 text-[10px] font-bold text-indigo-700 dark:bg-indigo-500/20 dark:text-indigo-400 mb-6 tracking-wider">
+						<span
+							class="mb-6 inline-block rounded-full bg-indigo-100 px-4 py-1 text-[10px] font-bold tracking-wider text-indigo-700 dark:bg-indigo-500/20 dark:text-indigo-400"
+						>
 							{persona.tipo}
 						</span>
-						<UserRound size={36} strokeWidth={1.5} class="text-slate-400 dark:text-slate-500 mb-4 mx-auto" />
-						<h3 class="text-sm font-bold text-slate-900 dark:text-white mb-2 leading-snug text-center">{persona.nome}</h3>
-						<p class="text-xs text-slate-500 dark:text-slate-400 leading-relaxed font-medium text-center">{persona.descricao}</p>
+						<UserRound
+							size={36}
+							strokeWidth={1.5}
+							class="mx-auto mb-4 text-slate-400 dark:text-slate-500"
+						/>
+						<h3
+							class="mb-2 text-center text-sm leading-snug font-bold text-slate-900 dark:text-white"
+						>
+							{persona.nome}
+						</h3>
+						<p
+							class="text-center text-xs leading-relaxed font-medium text-slate-500 dark:text-slate-400"
+						>
+							{persona.descricao}
+						</p>
 					</button>
 				{/each}
 			</div>
 		</div>
 
 		<!-- Next Best Action Panel -->
-		<div class="rounded-xl border border-slate-200 bg-white p-5 shadow-sm transition-colors duration-200 dark:border-slate-800 dark:bg-[#1e293b] flex flex-col h-[600px]">
+		<div
+			class="flex h-[600px] flex-col rounded-xl border border-slate-200 bg-white p-5 shadow-sm transition-colors duration-200 dark:border-slate-800 dark:bg-[#1e293b]"
+		>
 			<div class="mb-4">
 				<h2 class="text-lg font-bold text-slate-900 dark:text-white">Next Best Action</h2>
-				<p class="text-sm text-slate-500 dark:text-slate-400">Recomendações estratégicas por persona</p>
+				<p class="text-sm text-slate-500 dark:text-slate-400">
+					Recomendações estratégicas por persona
+				</p>
 			</div>
-			
-			<div class="flex-1 overflow-y-auto custom-scrollbar pr-2">
+
+			<div class="custom-scrollbar flex-1 overflow-y-auto pr-2">
 				{#if selectedPersona}
 					<div class="space-y-6">
 						<div>
-							<div class="flex items-center gap-2 mb-2">
+							<div class="mb-2 flex items-center gap-2">
 								<UserRound size={18} class="text-indigo-500" />
 								<h3 class="font-bold text-slate-900 dark:text-white">{selectedPersona.nome}</h3>
 							</div>
-							<p class="text-sm text-slate-600 dark:text-slate-300 bg-slate-50 dark:bg-slate-800 p-3 rounded-lg border border-slate-100 dark:border-slate-700">
+							<p
+								class="rounded-lg border border-slate-100 bg-slate-50 p-3 text-sm text-slate-600 dark:border-slate-700 dark:bg-slate-800 dark:text-slate-300"
+							>
 								{selectedPersona.detalhes}
 							</p>
 						</div>
 
 						<div class="space-y-4">
-							<div class="rounded-lg border border-emerald-200 bg-emerald-50 p-4 dark:border-emerald-500/20 dark:bg-emerald-500/5">
-								<h4 class="font-bold text-emerald-800 dark:text-emerald-400 mb-2 flex items-center gap-2">
+							<div
+								class="rounded-lg border border-emerald-200 bg-emerald-50 p-4 dark:border-emerald-500/20 dark:bg-emerald-500/5"
+							>
+								<h4
+									class="mb-2 flex items-center gap-2 font-bold text-emerald-800 dark:text-emerald-400"
+								>
 									<TrendingUp size={16} />
 									Expansão
 								</h4>
@@ -293,8 +396,10 @@
 								</p>
 							</div>
 
-							<div class="rounded-lg border border-red-200 bg-red-50 p-4 dark:border-red-500/20 dark:bg-red-500/5">
-								<h4 class="font-bold text-red-800 dark:text-red-400 mb-2 flex items-center gap-2">
+							<div
+								class="rounded-lg border border-red-200 bg-red-50 p-4 dark:border-red-500/20 dark:bg-red-500/5"
+							>
+								<h4 class="mb-2 flex items-center gap-2 font-bold text-red-800 dark:text-red-400">
 									<HeartHandshake size={16} />
 									Engajamento (Salvar Churn)
 								</h4>
@@ -305,7 +410,9 @@
 						</div>
 					</div>
 				{:else}
-					<div class="flex h-full flex-col items-center justify-center text-center text-slate-500 dark:text-slate-400">
+					<div
+						class="flex h-full flex-col items-center justify-center text-center text-slate-500 dark:text-slate-400"
+					>
 						<UserRound size={48} class="mb-4 opacity-20" />
 						<p>Selecione uma persona ao lado para ver o Next Best Action.</p>
 					</div>

+ 190 - 0
src/routes/(app)/dashboard/profile/+page.svelte

@@ -0,0 +1,190 @@
+<script>
+	import { User, Mail, Phone, MapPin, Building, Key, ChevronRight } from 'lucide-svelte';
+	import { goto } from '$app/navigation';
+	let isEditingPassword = false;
+	let passwordForm = {
+		currentPassword: '',
+		newPassword: '',
+		confirmPassword: ''
+	};
+
+	function handleChangePassword() {
+		isEditingPassword = true;
+	}
+
+	function handleSavePassword() {
+		if (passwordForm.newPassword !== passwordForm.confirmPassword) {
+			alert('As senhas não conferem');
+			return;
+		}
+		console.log('Alterando senha...');
+		isEditingPassword = false;
+		passwordForm = { currentPassword: '', newPassword: '', confirmPassword: '' };
+	}
+
+	function handleCancel() {
+		isEditingPassword = false;
+		passwordForm = { currentPassword: '', newPassword: '', confirmPassword: '' };
+	}
+</script>
+
+<div class="mx-auto max-w-3xl space-y-6">
+	<!-- Header -->
+	<div class="rounded-xl border border-slate-200 bg-white p-5 md:p-6 shadow-sm transition-colors duration-200 dark:border-slate-800 dark:bg-[#161f30]">
+		<div class="flex items-center gap-3">
+			<div class="h-8 w-8 shrink-0 rounded-lg bg-indigo-500/20 text-indigo-500 flex items-center justify-center">
+				<User size={20} strokeWidth={2.5} />
+			</div>
+			<h1 class="text-xl font-bold text-slate-900 dark:text-white">Meu Perfil</h1>
+		</div>
+		<p class="mt-2 text-sm text-slate-600 dark:text-slate-400">
+			Gerencie suas informações de perfil e preferências de segurança
+		</p>
+	</div>
+
+	<!-- Profile Information -->
+	<div class="rounded-xl border border-slate-200 bg-white shadow-sm transition-colors duration-200 dark:border-slate-800 dark:bg-[#161f30]">
+		<div class="border-b border-slate-200 p-5 dark:border-slate-800">
+			<h2 class="text-lg font-semibold text-slate-900 dark:text-white">Informações Pessoais</h2>
+		</div>
+
+		<div class="p-5 space-y-4">
+			<!-- Name -->
+			<div>
+				<label class="block text-sm font-medium text-slate-700 dark:text-slate-300 mb-1">
+					Nome
+				</label>
+				<div class="flex items-center gap-3 p-3 bg-slate-50 dark:bg-slate-800/50 rounded-lg border border-slate-200 dark:border-slate-700">
+					<User size={18} class="text-slate-400 shrink-0" />
+					<span class="text-slate-900 dark:text-slate-200">Admin</span>
+				</div>
+			</div>
+
+			<!-- Email -->
+			<div>
+				<label class="block text-sm font-medium text-slate-700 dark:text-slate-300 mb-1">
+					E-mail
+				</label>
+				<div class="flex items-center gap-3 p-3 bg-slate-50 dark:bg-slate-800/50 rounded-lg border border-slate-200 dark:border-slate-700">
+					<Mail size={18} class="text-slate-400 shrink-0" />
+					<span class="text-slate-900 dark:text-slate-200">admin@nettown.com</span>
+				</div>
+			</div>
+
+			<!-- Phone -->
+			<div>
+				<label class="block text-sm font-medium text-slate-700 dark:text-slate-300 mb-1">
+					Telefone
+				</label>
+				<input
+					type="tel"
+					placeholder="(11) 99999-9999"
+					class="w-full px-4 py-2.5 bg-white dark:bg-slate-800 border border-slate-200 dark:border-slate-700 rounded-lg text-sm text-slate-900 dark:text-slate-200 placeholder-slate-400 focus:outline-none focus:border-indigo-500 focus:ring-1 focus:ring-indigo-500 transition-colors"
+				/>
+			</div>
+
+			<!-- Company -->
+			<div>
+				<label class="block text-sm font-medium text-slate-700 dark:text-slate-300 mb-1">
+					Empresa
+				</label>
+				<div class="flex items-center gap-3 p-3 bg-slate-50 dark:bg-slate-800/50 rounded-lg border border-slate-200 dark:border-slate-700">
+					<Building size={18} class="text-slate-400 shrink-0" />
+					<span class="text-slate-900 dark:text-slate-200">NetTown Analytics</span>
+				</div>
+			</div>
+
+			<!-- Save Button -->
+			<div class="flex gap-3 pt-4">
+				<button class="inline-flex items-center px-4 py-2 text-sm font-medium rounded-lg bg-indigo-600 text-white hover:bg-indigo-700 transition-colors duration-150">
+					Salvar Alterações
+				</button>
+			</div>
+		</div>
+	</div>
+
+	<!-- Security Section -->
+	<div class="rounded-xl border border-slate-200 bg-white shadow-sm transition-colors duration-200 dark:border-slate-800 dark:bg-[#161f30]">
+		<div class="border-b border-slate-200 p-5 dark:border-slate-800">
+			<h2 class="text-lg font-semibold text-slate-900 dark:text-white">Segurança</h2>
+		</div>
+
+		{#if !isEditingPassword}
+			<div class="divide-y divide-slate-200 dark:divide-slate-800">
+				<div class="p-5 hover:bg-slate-50 transition-colors duration-150 dark:hover:bg-slate-800/50">
+					<div class="flex items-center justify-between">
+						<div class="flex items-center gap-3">
+							<div class="h-10 w-10 rounded-lg bg-slate-100 text-slate-600 flex items-center justify-center dark:bg-slate-800 dark:text-slate-400">
+								<Key size={18} />
+							</div>
+							<div>
+								<h3 class="text-sm font-medium text-slate-900 dark:text-white">Alterar Senha</h3>
+								<p class="mt-0.5 text-xs text-slate-600 dark:text-slate-400">Atualize sua senha com regularidade</p>
+							</div>
+						</div>
+						<button
+							onclick={handleChangePassword}
+							class="inline-flex items-center gap-1 px-3 py-1.5 text-sm font-medium rounded-md bg-indigo-600 text-white hover:bg-indigo-700 transition-colors duration-150"
+						>
+							Alterar
+							<ChevronRight size={14} />
+						</button>
+					</div>
+				</div>
+			</div>
+		{:else}
+			<div class="p-5 space-y-4">
+				<div>
+					<label class="block text-sm font-medium text-slate-700 dark:text-slate-300 mb-1">
+						Senha Atual
+					</label>
+					<input
+						type="password"
+						placeholder="Insira sua senha atual"
+						bind:value={passwordForm.currentPassword}
+						class="w-full px-4 py-2.5 bg-white dark:bg-slate-800 border border-slate-200 dark:border-slate-700 rounded-lg text-sm text-slate-900 dark:text-slate-200 placeholder-slate-400 focus:outline-none focus:border-indigo-500 focus:ring-1 focus:ring-indigo-500 transition-colors"
+					/>
+				</div>
+
+				<div>
+					<label class="block text-sm font-medium text-slate-700 dark:text-slate-300 mb-1">
+						Nova Senha
+					</label>
+					<input
+						type="password"
+						placeholder="Insira sua nova senha"
+						bind:value={passwordForm.newPassword}
+						class="w-full px-4 py-2.5 bg-white dark:bg-slate-800 border border-slate-200 dark:border-slate-700 rounded-lg text-sm text-slate-900 dark:text-slate-200 placeholder-slate-400 focus:outline-none focus:border-indigo-500 focus:ring-1 focus:ring-indigo-500 transition-colors"
+					/>
+				</div>
+
+				<div>
+					<label class="block text-sm font-medium text-slate-700 dark:text-slate-300 mb-1">
+						Confirmar Nova Senha
+					</label>
+					<input
+						type="password"
+						placeholder="Confirme sua nova senha"
+						bind:value={passwordForm.confirmPassword}
+						class="w-full px-4 py-2.5 bg-white dark:bg-slate-800 border border-slate-200 dark:border-slate-700 rounded-lg text-sm text-slate-900 dark:text-slate-200 placeholder-slate-400 focus:outline-none focus:border-indigo-500 focus:ring-1 focus:ring-indigo-500 transition-colors"
+					/>
+				</div>
+
+				<div class="flex gap-3 pt-4">
+					<button
+						onclick={handleSavePassword}
+						class="inline-flex items-center px-4 py-2 text-sm font-medium rounded-lg bg-indigo-600 text-white hover:bg-indigo-700 transition-colors duration-150"
+					>
+						Salvar Senha
+					</button>
+					<button
+						onclick={handleCancel}
+						class="inline-flex items-center px-4 py-2 text-sm font-medium rounded-lg bg-slate-200 text-slate-900 hover:bg-slate-300 transition-colors duration-150 dark:bg-slate-700 dark:text-slate-200 dark:hover:bg-slate-600"
+					>
+						Cancelar
+					</button>
+				</div>
+			</div>
+		{/if}
+	</div>
+</div>

+ 1 - 55
src/routes/(app)/dashboard/settings/+page.svelte

@@ -1,5 +1,5 @@
 <script>
-	import { Settings, Phone, Users, Bell, Shield, Database, Globe, Palette, HelpCircle } from 'lucide-svelte';
+	import { Settings, Phone, Bell, HelpCircle } from 'lucide-svelte';
 	import { goto } from '$app/navigation';
 
 	// Settings sections
@@ -41,60 +41,6 @@
 				}
 			]
 		},
-		{
-			title: 'Segurança',
-			icon: Shield,
-			items: [
-				{
-					title: 'Autenticação de Dois Fatores',
-					description: 'Proteja sua conta com autenticação adicional',
-					status: 'disabled',
-					action: 'ativar'
-				},
-				{
-					title: 'Permissões de Acesso',
-					description: 'Gerencie quem pode acessar o painel',
-					status: 'configured',
-					action: 'gerenciar'
-				}
-			]
-		},
-		{
-			title: 'Dados',
-			icon: Database,
-			items: [
-				{
-					title: 'Exportar Dados',
-					description: 'Exporte seus dados em formato CSV ou Excel',
-					status: 'available',
-					action: 'exportar'
-				},
-				{
-					title: 'Backup Automático',
-					description: 'Configure backups automáticos dos seus dados',
-					status: 'enabled',
-					action: 'gerenciar'
-				}
-			]
-		},
-		{
-			title: 'Personalização',
-			icon: Palette,
-			items: [
-				{
-					title: 'Tema',
-					description: 'Escolha entre modo claro ou escuro',
-					status: 'dark',
-					action: 'mudar'
-				},
-				{
-					title: 'Idioma',
-					description: 'Selecione o idioma da interface',
-					status: 'pt-BR',
-					action: 'mudar'
-				}
-			]
-		},
 		{
 			title: 'Suporte',
 			icon: HelpCircle,

+ 164 - 0
src/routes/(app)/dashboard/subscription/+page.svelte

@@ -0,0 +1,164 @@
+<script>
+	import { CreditCard, Calendar, AlertCircle, Check } from 'lucide-svelte';
+
+	let currentPlan = {
+		name: 'Profissional',
+		price: 299,
+		billingCycle: 'mensal',
+		status: 'ativo',
+		nextBillingDate: '15/06/2026'
+	};
+
+	const plans = [
+		{
+			name: 'Starter',
+			price: 99,
+			description: 'Perfeito para começar',
+			features: [
+				'Até 5 clientes',
+				'Análise básica de sentimento',
+				'Relatórios mensais',
+				'Suporte por email'
+			],
+			popular: false
+		},
+		{
+			name: 'Profissional',
+			price: 299,
+			description: 'Mais recursos e análises',
+			features: [
+				'Até 50 clientes',
+				'Análise avançada de sentimento',
+				'Relatórios em tempo real',
+				'API access',
+				'Suporte prioritário',
+				'Integrações WhatsApp'
+			],
+			popular: true
+		},
+		{
+			name: 'Empresa',
+			price: 999,
+			description: 'Recursos completos',
+			features: [
+				'Clientes ilimitados',
+				'Análise completa de IA',
+				'Dashboards personalizados',
+				'API completa',
+				'Suporte 24/7',
+				'Todas as integrações',
+				'Usuários ilimitados'
+			],
+			popular: false
+		}
+	];
+
+	function handleUpgrade(plan) {
+		console.log(`Upgrading to ${plan.name} plan`);
+	}
+
+	function handleCancelSubscription() {
+		if (confirm('Tem certeza que deseja cancelar sua assinatura?')) {
+			console.log('Cancelando assinatura...');
+		}
+	}
+</script>
+
+<div class="mx-auto max-w-4xl space-y-6">
+	<!-- Header -->
+	<div class="rounded-xl border border-slate-200 bg-white p-5 md:p-6 shadow-sm transition-colors duration-200 dark:border-slate-800 dark:bg-[#161f30]">
+		<div class="flex items-center gap-3">
+			<div class="h-8 w-8 shrink-0 rounded-lg bg-indigo-500/20 text-indigo-500 flex items-center justify-center">
+				<CreditCard size={20} strokeWidth={2.5} />
+			</div>
+			<h1 class="text-xl font-bold text-slate-900 dark:text-white">Assinatura</h1>
+		</div>
+		<p class="mt-2 text-sm text-slate-600 dark:text-slate-400">
+			Gerencie seu plano, faturamento e métodos de pagamento
+		</p>
+	</div>
+
+	<!-- Current Plan -->
+	<div class="rounded-xl border border-slate-200 bg-white shadow-sm transition-colors duration-200 dark:border-slate-800 dark:bg-[#161f30]">
+		<div class="border-b border-slate-200 p-5 dark:border-slate-800">
+			<h2 class="text-lg font-semibold text-slate-900 dark:text-white">Seu Plano Atual</h2>
+		</div>
+
+		<div class="p-5 md:p-6">
+			<div class="grid grid-cols-1 md:grid-cols-3 gap-6 mb-6">
+				<div>
+					<p class="text-sm text-slate-600 dark:text-slate-400 mb-1">Plano</p>
+					<p class="text-2xl font-bold text-slate-900 dark:text-white">{currentPlan.name}</p>
+				</div>
+				<div>
+					<p class="text-sm text-slate-600 dark:text-slate-400 mb-1">Preço</p>
+					<p class="text-2xl font-bold text-slate-900 dark:text-white">R$ {currentPlan.price}</p>
+					<p class="text-xs text-slate-500 dark:text-slate-400">por mês</p>
+				</div>
+				<div>
+					<p class="text-sm text-slate-600 dark:text-slate-400 mb-1">Próxima cobrança</p>
+					<div class="flex items-center gap-2">
+						<Calendar size={18} class="text-indigo-600 dark:text-indigo-400" />
+						<span class="text-lg font-semibold text-slate-900 dark:text-white">{currentPlan.nextBillingDate}</span>
+					</div>
+				</div>
+			</div>
+
+			<div class="flex flex-col md:flex-row gap-3 pt-4 border-t border-slate-200 dark:border-slate-800">
+				<button class="inline-flex items-center px-4 py-2 text-sm font-medium rounded-lg bg-indigo-600 text-white hover:bg-indigo-700 transition-colors duration-150">
+					Atualizar Método de Pagamento
+				</button>
+				<button
+					onclick={handleCancelSubscription}
+					class="inline-flex items-center px-4 py-2 text-sm font-medium rounded-lg border border-red-300 text-red-600 hover:bg-red-50 transition-colors duration-150 dark:border-red-800 dark:text-red-400 dark:hover:bg-slate-800"
+				>
+					Cancelar Assinatura
+				</button>
+			</div>
+		</div>
+	</div>
+
+	<!-- Available Plans -->
+	<div class="space-y-4">
+		<h2 class="text-lg font-semibold text-slate-900 dark:text-white">Outros Planos Disponíveis</h2>
+
+		<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
+			{#each plans as plan}
+				<div class="rounded-xl border {plan.popular ? 'border-indigo-500 ring-2 ring-indigo-100 dark:ring-indigo-900/30' : 'border-slate-200 dark:border-slate-800'} bg-white shadow-sm transition-colors duration-200 dark:bg-[#161f30] overflow-hidden">
+					{#if plan.popular}
+						<div class="bg-indigo-600 px-4 py-2 text-center">
+							<span class="text-xs font-semibold text-white uppercase tracking-wider">Mais Popular</span>
+						</div>
+					{/if}
+
+					<div class="p-5 md:p-6">
+						<h3 class="text-xl font-bold text-slate-900 dark:text-white mb-2">{plan.name}</h3>
+						<p class="text-sm text-slate-600 dark:text-slate-400 mb-4">{plan.description}</p>
+
+						<div class="mb-6">
+							<span class="text-3xl font-bold text-slate-900 dark:text-white">R$ {plan.price}</span>
+							<span class="text-sm text-slate-600 dark:text-slate-400">/mês</span>
+						</div>
+
+						<button
+							onclick={() => handleUpgrade(plan)}
+							disabled={plan.name === currentPlan.name}
+							class="w-full px-4 py-2 text-sm font-medium rounded-lg transition-colors duration-150 {plan.popular ? 'bg-indigo-600 text-white hover:bg-indigo-700' : 'bg-slate-100 text-slate-900 hover:bg-slate-200 dark:bg-slate-800 dark:text-slate-200 dark:hover:bg-slate-700'} {plan.name === currentPlan.name ? 'opacity-50 cursor-not-allowed' : ''}"
+						>
+							{plan.name === currentPlan.name ? 'Plano Atual' : 'Escolher Plano'}
+						</button>
+
+						<div class="mt-6 space-y-3 pt-6 border-t border-slate-200 dark:border-slate-800">
+							{#each plan.features as feature}
+								<div class="flex items-center gap-3">
+									<Check size={16} class="text-green-600 dark:text-green-400 shrink-0" />
+									<span class="text-sm text-slate-700 dark:text-slate-300">{feature}</span>
+								</div>
+							{/each}
+						</div>
+					</div>
+				</div>
+			{/each}
+		</div>
+	</div>
+</div>