Ver código fonte

ajustes frontend pagina inicial

leonardo 3 meses atrás
pai
commit
d958bc9571

+ 8 - 0
.gitignore

@@ -0,0 +1,8 @@
+node_modules/
+package-lock.json
+yarn.lock
+
+dist/
+vue.js
+vue.js.map
+*.map

+ 2 - 2
dist/index.html

@@ -6,8 +6,8 @@
     <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1" />
     <link rel="icon" type="image/x-icon" href="/favicon.ico?v=2" />
     <title>ORACULO</title>
-    <script type="module" crossorigin src="/assets/index-COrFMHKV.js"></script>
-    <link rel="stylesheet" crossorigin href="/assets/index-DfgF3Bus.css">
+    <script type="module" crossorigin src="/assets/index-DJWTF99T.js"></script>
+    <link rel="stylesheet" crossorigin href="/assets/index-DBhEvp2j.css">
   </head>
   <body class="bg-background">
     <noscript>

+ 0 - 15
node_modules/.vite/deps/_metadata.json

@@ -1,15 +0,0 @@
-{
-  "hash": "e45cc84a",
-  "configHash": "5635861b",
-  "lockfileHash": "77fe16be",
-  "browserHash": "3b4962df",
-  "optimized": {
-    "vue": {
-      "src": "../../../../node_modules/vue/dist/vue.runtime.esm-bundler.js",
-      "file": "vue.js",
-      "fileHash": "0989a87e",
-      "needsInterop": false
-    }
-  },
-  "chunks": {}
-}

Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 197
node_modules/.vite/deps/vue.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 3
node_modules/.vite/deps/vue.js.map


+ 1 - 0
package.json

@@ -19,6 +19,7 @@
     "autoprefixer": "^10.5.0",
     "postcss": "^8.5.15",
     "tailwindcss": "^4.3.0",
+    "tailwindcss-primeui": "^0.6.1",
     "vite": "^6.0.0",
     "vite-plugin-vue-devtools": "^8.1.1"
   }

+ 1 - 1
src/components/BotaoAlterarTema.vue

@@ -56,7 +56,7 @@ onMounted(() => {
 <template>
   <button
     type="button"
-    class="themeToggleButton"
+    class="inline-flex items-center justify-center rounded-md !p-2 !bg-none !bg-transparent !border-0 !text-primary-foreground hover:!bg-white/10 motion-safe:transition-colors"
     aria-label="Alternar tema"
     @click="darkMode = !darkMode"
   >

+ 29 - 53
src/components/ChatWindow.vue

@@ -1,16 +1,38 @@
 <template>
-  <div class="panel">
-    <h2 class="title">Chat</h2>
-    <div ref="chatEl" class="chat">
-      <div v-for="(m, idx) in messages" :key="idx" class="msg" :class="m.role">
-        <div class="bubble">{{ m.content }}</div>
+  <div class="flex h-full min-h-[520px] w-full flex-col gap-4">
+    <div
+      ref="chatEl"
+      class="flex-1 overflow-auto rounded-2xl border border-border bg-black/10 p-4 dark:bg-black/20"
+    >
+      <div v-if="!messages.length" class="grid h-full place-items-center">
+        <div class="text-center">
+          <div class="text-xl font-semibold tracking-tight">Nova conversa</div>
+          <div class="mt-2 text-sm text-muted-foreground">Digite sua pergunta abaixo para começar.</div>
+        </div>
+      </div>
+
+      <div v-else class="grid gap-3">
+        <div v-for="(m, idx) in messages" :key="idx" class="flex" :class="m.role === 'user' ? 'justify-end' : 'justify-start'">
+          <div
+            class="max-w-[78%] whitespace-pre-wrap rounded-2xl border px-3 py-2 leading-snug"
+            :class="
+              m.role === 'user'
+                ? 'border-primary/25 bg-primary/10 text-foreground'
+                : 'border-border bg-white/30 text-foreground dark:bg-white/10'
+            "
+          >
+            {{ m.content }}
+          </div>
+        </div>
       </div>
     </div>
-    <div class="row">
+
+    <div class="grid gap-3 md:grid-cols-[1fr_140px] md:items-start">
       <textarea v-model="draft" rows="2" placeholder="Digite sua pergunta..." @keydown.enter.exact.prevent="onSend" />
       <button :disabled="loading || !draft.trim()" @click="onSend">Enviar</button>
     </div>
-    <div v-if="error" class="muted" style="margin-top: 8px">Erro: {{ error }}</div>
+
+    <div v-if="error" class="text-sm text-muted-foreground">Erro: {{ error }}</div>
   </div>
 </template>
 
@@ -46,49 +68,3 @@ async function onSend() {
   await nextTick();
 }
 </script>
-
-<style scoped>
-.chat {
-  height: min(560px, calc(100vh - 320px));
-  overflow: auto;
-  border: 1px solid var(--border);
-  border-radius: 12px;
-  padding: 12px;
-  background: var(--chat-bg);
-}
-
-.msg {
-  display: flex;
-  margin-bottom: 10px;
-}
-
-.msg.user {
-  justify-content: flex-end;
-}
-
-.bubble {
-  max-width: 78%;
-  padding: 10px 12px;
-  border-radius: 12px;
-  white-space: pre-wrap;
-  line-height: 1.35;
-}
-
-.msg.user .bubble {
-  background: var(--bubble-user-bg);
-  border: 1px solid var(--bubble-user-border);
-}
-
-.msg.assistant .bubble {
-  background: var(--bubble-assistant-bg);
-  border: 1px solid var(--bubble-assistant-border);
-}
-
-.row {
-  display: grid;
-  grid-template-columns: 1fr 120px;
-  gap: 10px;
-  margin-top: 12px;
-  align-items: start;
-}
-</style>

+ 28 - 5
src/layout/LayoutSistema.vue

@@ -23,6 +23,13 @@ const docs = reactive({
 
 const painelAberto = ref("");
 const rotaAtiva = computed(() => String(route.name ?? ""));
+const tituloPagina = computed(() => {
+  const nome = rotaAtiva.value;
+  if (nome === "home") return "Nova conversa";
+  if (nome === "conversas-pesquisar") return "Pesquisar conversas";
+  if (nome === "conversas-historico") return "Histórico";
+  return "Oráculo";
+});
 
 function irPara(nome) {
   router.push({ name: nome });
@@ -72,9 +79,6 @@ onMounted(async () => {
 
 <template>
   <div class="app">
-    <div class="themeToggle">
-      <BotaoAlterarTema />
-    </div>
     <div class="appShell">
       <aside class="sidebar">
         <div class="sidebarHeader">
@@ -141,8 +145,19 @@ onMounted(async () => {
         </div>
       </aside>
 
-      <main class="main">
-        <slot />
+      <main class="main !flex !flex-col !p-0 !overflow-hidden">
+        <header
+          class="sticky top-0 z-30 h-16 flex items-center justify-between gap-4 px-4 md:px-6 bg-primary text-primary-foreground border-b border-border backdrop-blur-sm"
+        >
+          <div class="min-w-0">
+            <div class="text-base font-medium truncate">{{ tituloPagina }}</div>
+          </div>
+          <BotaoAlterarTema />
+        </header>
+
+        <div class="flex-1 overflow-auto p-4 md:p-6">
+          <slot />
+        </div>
       </main>
     </div>
   </div>
@@ -160,6 +175,14 @@ onMounted(async () => {
   width: 100%;
   height: 95%;
   text-align: center;
+  background: var(--primary);
+  color: var(--primary-foreground);
+  border-color: var(--primary);
+}
+
+.sidebarNavButton:hover:not(:disabled) {
+  background: var(--primary-600);
+  border-color: var(--primary-600);
 }
 
 .sidebarNavButton.active {

+ 1 - 0
src/main.js

@@ -1,5 +1,6 @@
 import { createApp } from "vue";
 import App from "./App.vue";
+import "@/styles/tailwind.css";
 import "@/styles/style.css";
 import { router } from "./router/index.js";
 

+ 0 - 53
src/styles/style.css

@@ -1,5 +1,3 @@
-@import "tailwindcss";
-
 :root {
   font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Arial, "Apple Color Emoji",
     "Segoe UI Emoji";
@@ -54,12 +52,6 @@ body {
   box-sizing: border-box;
 }
 
-.container {
-  max-width: 1100px;
-  margin: 0 auto;
-  padding: 24px;
-}
-
 .app {
   height: 100vh;
   overflow: hidden;
@@ -145,17 +137,7 @@ select:focus {
   z-index: 1000;
 }
 
-.themeToggleButton {
-  padding: 10px;
-  border-radius: 999px;
-  line-height: 0;
-}
 
-.themeToggleButton svg {
-  width: 20px;
-  height: 20px;
-  display: block;
-}
 
 .appShell {
   height: 100%;
@@ -203,47 +185,12 @@ select:focus {
   overflow: auto;
 }
 
-.landing {
-  display: grid;
-  place-items: center;
-}
-
-.landingInner {
-  width: min(760px, 100%);
-}
-
-.landingTitle {
-  font-weight: 760;
-  font-size: 28px;
-  letter-spacing: -0.02em;
-}
-
-.landingSub {
-  margin-top: 8px;
-  color: var(--muted);
-}
-
-.landingComposer {
-  margin-top: 18px;
-  padding: 14px;
-}
-
-.landingComposer textarea {
-  min-height: 96px;
-}
-
 .landingActions {
   display: flex;
   justify-content: flex-end;
   margin-top: 10px;
 }
 
-.mainChat {
-  width: min(980px, 100%);
-  justify-self: center;
-  align-self: start;
-}
-
 .topbar {
   display: flex;
   justify-content: space-between;

+ 244 - 0
src/styles/tailwind.css

@@ -0,0 +1,244 @@
+@import "tailwindcss";
+@import "tailwindcss-primeui";
+
+@custom-variant dark (&:is(.dark *));
+
+@utility container {
+  max-width: 100%;
+  margin-left: auto;
+  margin-right: auto;
+  padding-left: 1rem;
+  padding-right: 1rem;
+
+  @media (min-width: 640px) {
+    max-width: 640px;
+    padding-left: 1.5rem;
+    padding-right: 1.5rem;
+  }
+  @media (min-width: 768px) {
+    max-width: 768px;
+  }
+  @media (min-width: 1024px) {
+    max-width: 1024px;
+  }
+  @media (min-width: 1440px) {
+    max-width: 1440px;
+  }
+}
+
+:root {
+  --background: oklch(0.9911 0 0);
+  --foreground: oklch(0.2046 0 0);
+  --card: oklch(0.9911 0 0);
+  --card-foreground: oklch(0.2046 0 0);
+  --popover: oklch(0.9911 0 0);
+  --popover-foreground: oklch(0.4386 0 0);
+  --primary: oklch(0.2998 0.0584 263.16);
+  --primary-foreground: oklch(0.98 0 0);
+  --secondary: oklch(0.3807 0.1708 261.58);
+  --secondary-foreground: oklch(0.95 0 0);
+  --muted: oklch(0.9461 0 0);
+  --muted-foreground: oklch(0.2435 0 0);
+  --accent: oklch(0.34 0.12 262);
+  --accent-foreground: oklch(0.98 0 0);
+  --destructive: oklch(0.5523 0.1927 32.7272);
+  --destructive-foreground: oklch(0.9934 0.0032 17.2118);
+  --border: oklch(0.9037 0 0);
+  --input: oklch(0.9731 0 0);
+  --ring: oklch(0.3807 0.1708 261.58);
+  --chart-1: oklch(0.8348 0.1302 160.908);
+  --chart-2: oklch(0.6231 0.188 259.8145);
+  --chart-3: oklch(0.6056 0.2189 292.7172);
+  --chart-4: oklch(0.7686 0.1647 70.0804);
+  --chart-5: oklch(0.6959 0.1491 162.4796);
+  --sidebar: oklch(0.9911 0 0);
+  --sidebar-foreground: oklch(0.5452 0 0);
+  --sidebar-primary: oklch(0.8348 0.1302 160.908);
+  --sidebar-primary-foreground: oklch(0.2626 0.0147 166.4589);
+  --sidebar-accent: oklch(0.9461 0 0);
+  --sidebar-accent-foreground: oklch(0.2435 0 0);
+  --sidebar-border: oklch(0.9037 0 0);
+  --sidebar-ring: oklch(0.8348 0.1302 160.908);
+  --font-sans: Inter, ui-sans-serif, sans-serif, system-ui;
+  --font-serif: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;
+  --font-mono: JetBrains Mono, ui-monospace, monospace;
+  --radius: 0.5rem;
+  --shadow-x: 0px;
+  --shadow-y: 1px;
+  --shadow-blur: 3px;
+  --shadow-spread: 0px;
+  --shadow-opacity: 0.17;
+  --shadow-color: #000000;
+  --shadow-2xs: 0px 1px 3px 0px hsl(0 0% 0% / 0.09);
+  --shadow-xs: 0px 1px 3px 0px hsl(0 0% 0% / 0.09);
+  --shadow-sm: 0px 1px 3px 0px hsl(0 0% 0% / 0.17), 0px 1px 2px -1px hsl(0 0% 0% / 0.17);
+  --shadow: 0px 1px 3px 0px hsl(0 0% 0% / 0.17), 0px 1px 2px -1px hsl(0 0% 0% / 0.17);
+  --shadow-md: 0px 1px 3px 0px hsl(0 0% 0% / 0.17), 0px 2px 4px -1px hsl(0 0% 0% / 0.17);
+  --shadow-lg: 0px 1px 3px 0px hsl(0 0% 0% / 0.17), 0px 4px 6px -1px hsl(0 0% 0% / 0.17);
+  --shadow-xl: 0px 1px 3px 0px hsl(0 0% 0% / 0.17), 0px 8px 10px -1px hsl(0 0% 0% / 0.17);
+  --shadow-2xl: 0px 1px 3px 0px hsl(0 0% 0% / 0.43);
+  --tracking-normal: 0.025em;
+  --spacing: 0.25rem;
+}
+
+.dark {
+  --background: oklch(0.1822 0 0);
+  --foreground: oklch(0.9288 0.0126 255.5078);
+  --card: oklch(0.2046 0 0);
+  --card-foreground: oklch(0.9288 0.0126 255.5078);
+  --popover: oklch(0.2603 0 0);
+  --popover-foreground: oklch(0.7348 0 0);
+  --primary: oklch(0.48 0.16 261.58);
+  --primary-foreground: oklch(0.98 0 0);
+  --secondary: oklch(0.26 0.05 263.16);
+  --secondary-foreground: oklch(0.95 0 0);
+  --muted: oklch(0.2393 0 0);
+  --muted-foreground: oklch(0.7122 0 0);
+  --accent: oklch(0.42 0.14 261.58);
+  --accent-foreground: oklch(0.12 0 0);
+  --destructive: oklch(0.3123 0.0852 29.7877);
+  --destructive-foreground: oklch(0.9368 0.0045 34.3092);
+  --border: oklch(0.2809 0 0);
+  --input: oklch(0.2603 0 0);
+  --ring: oklch(0.48 0.16 261.58);
+  --chart-1: oklch(0.8003 0.1821 151.711);
+  --chart-2: oklch(0.7137 0.1434 254.624);
+  --chart-3: oklch(0.709 0.1592 293.5412);
+  --chart-4: oklch(0.8369 0.1644 84.4286);
+  --chart-5: oklch(0.7845 0.1325 181.912);
+  --sidebar: oklch(0.1822 0 0);
+  --sidebar-foreground: oklch(0.6301 0 0);
+  --sidebar-primary: oklch(0.4365 0.1044 156.7556);
+  --sidebar-primary-foreground: oklch(0.9213 0.0135 167.1556);
+  --sidebar-accent: oklch(0.3132 0 0);
+  --sidebar-accent-foreground: oklch(0.9851 0 0);
+  --sidebar-border: oklch(0.2809 0 0);
+  --sidebar-ring: oklch(0.8003 0.1821 151.711);
+  --font-sans: Inter, ui-sans-serif, sans-serif, system-ui;
+  --font-serif: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;
+  --font-mono: JetBrains Mono, ui-monospace, monospace;
+  --radius: 0.5rem;
+  --shadow-x: 0px;
+  --shadow-y: 1px;
+  --shadow-blur: 3px;
+  --shadow-spread: 0px;
+  --shadow-opacity: 0.17;
+  --shadow-color: #000000;
+  --shadow-2xs: 0px 1px 3px 0px hsl(0 0% 0% / 0.09);
+  --shadow-xs: 0px 1px 3px 0px hsl(0 0% 0% / 0.09);
+  --shadow-sm: 0px 1px 3px 0px hsl(0 0% 0% / 0.17), 0px 1px 2px -1px hsl(0 0% 0% / 0.17);
+  --shadow: 0px 1px 3px 0px hsl(0 0% 0% / 0.17), 0px 1px 2px -1px hsl(0 0% 0% / 0.17);
+  --shadow-md: 0px 1px 3px 0px hsl(0 0% 0% / 0.17), 0px 2px 4px -1px hsl(0 0% 0% / 0.17);
+  --shadow-lg: 0px 1px 3px 0px hsl(0 0% 0% / 0.17), 0px 4px 6px -1px hsl(0 0% 0% / 0.17);
+  --shadow-xl: 0px 1px 3px 0px hsl(0 0% 0% / 0.17), 0px 8px 10px -1px hsl(0 0% 0% / 0.17);
+  --shadow-2xl: 0px 1px 3px 0px hsl(0 0% 0% / 0.43);
+}
+
+body {
+  --primary-50: color-mix(in oklab, var(--primary) 12%, white);
+  --primary-100: color-mix(in oklab, var(--primary) 20%, white);
+  --primary-200: color-mix(in oklab, var(--primary) 32%, white);
+  --primary-300: color-mix(in oklab, var(--primary) 44%, white);
+  --primary-400: color-mix(in oklab, var(--primary) 60%, white);
+  --primary-500: var(--primary);
+  --primary-600: color-mix(in oklab, var(--primary) 84%, black);
+  --primary-700: color-mix(in oklab, var(--primary) 70%, black);
+  --primary-800: color-mix(in oklab, var(--primary) 56%, black);
+  --primary-900: color-mix(in oklab, var(--primary) 44%, black);
+  --primary-950: color-mix(in oklab, var(--primary) 30%, black);
+
+  --p-primary-50: var(--primary-50);
+  --p-primary-100: var(--primary-100);
+  --p-primary-200: var(--primary-200);
+  --p-primary-300: var(--primary-300);
+  --p-primary-400: var(--primary-400);
+  --p-primary-500: var(--primary-500);
+  --p-primary-600: var(--primary-600);
+  --p-primary-700: var(--primary-700);
+  --p-primary-800: var(--primary-800);
+  --p-primary-900: var(--primary-900);
+  --p-primary-950: var(--primary-950);
+  --p-primary-color: var(--primary-500);
+  --p-primary-contrast-color: var(--primary-foreground);
+  --p-primary-hover-color: var(--primary-600);
+  --p-primary-active-color: var(--primary-700);
+  --p-button-primary-background: var(--p-primary-color);
+  --p-button-primary-hover-background: var(--p-primary-hover-color);
+  --p-button-primary-active-background: var(--p-primary-active-color);
+  --p-button-primary-border-color: var(--p-primary-color);
+  --p-button-primary-hover-border-color: var(--p-primary-hover-color);
+  --p-button-primary-active-border-color: var(--p-primary-active-color);
+  --p-button-primary-color: var(--p-primary-contrast-color);
+  --p-button-primary-hover-color: var(--p-primary-contrast-color);
+  --p-button-primary-active-color: var(--p-primary-contrast-color);
+}
+
+@theme inline {
+  --color-background: var(--background);
+  --color-foreground: var(--foreground);
+  --color-card: var(--card);
+  --color-card-foreground: var(--card-foreground);
+  --color-popover: var(--popover);
+  --color-popover-foreground: var(--popover-foreground);
+  --color-primary: var(--primary);
+  --color-primary-foreground: var(--primary-foreground);
+  --color-secondary: var(--secondary);
+  --color-secondary-foreground: var(--secondary-foreground);
+  --color-muted: var(--muted);
+  --color-muted-foreground: var(--muted-foreground);
+  --color-accent: var(--accent);
+  --color-accent-foreground: var(--accent-foreground);
+  --color-destructive: var(--destructive);
+  --color-destructive-foreground: var(--destructive-foreground);
+  --color-border: var(--border);
+  --color-input: var(--input);
+  --color-ring: var(--ring);
+  --color-chart-1: var(--chart-1);
+  --color-chart-2: var(--chart-2);
+  --color-chart-3: var(--chart-3);
+  --color-chart-4: var(--chart-4);
+  --color-chart-5: var(--chart-5);
+  --color-sidebar: var(--sidebar);
+  --color-sidebar-foreground: var(--sidebar-foreground);
+  --color-sidebar-primary: var(--sidebar-primary);
+  --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
+  --color-sidebar-accent: var(--sidebar-accent);
+  --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
+  --color-sidebar-border: var(--sidebar-border);
+  --color-sidebar-ring: var(--sidebar-ring);
+
+  --font-sans: var(--font-sans);
+  --font-mono: var(--font-mono);
+  --font-serif: var(--font-serif);
+
+  --radius-sm: calc(var(--radius) - 4px);
+  --radius-md: calc(var(--radius) - 2px);
+  --radius-lg: var(--radius);
+  --radius-xl: calc(var(--radius) + 4px);
+
+  --shadow-2xs: var(--shadow-2xs);
+  --shadow-xs: var(--shadow-xs);
+  --shadow-sm: var(--shadow-sm);
+  --shadow: var(--shadow);
+  --shadow-md: var(--shadow-md);
+  --shadow-lg: var(--shadow-lg);
+  --shadow-xl: var(--shadow-xl);
+  --shadow-2xl: var(--shadow-2xl);
+
+  --tracking-tighter: calc(var(--tracking-normal) - 0.05em);
+  --tracking-tight: calc(var(--tracking-normal) - 0.025em);
+  --tracking-normal: var(--tracking-normal);
+  --tracking-wide: calc(var(--tracking-normal) + 0.025em);
+  --tracking-wider: calc(var(--tracking-normal) + 0.05em);
+  --tracking-widest: calc(var(--tracking-normal) + 0.1em);
+}
+
+@layer base {
+  * {
+    @apply border-border outline-ring/50;
+  }
+  body {
+    @apply bg-background text-foreground;
+    letter-spacing: var(--tracking-normal);
+  }
+}

+ 15 - 8
src/views/pagina-inicial/PaginaInicialView.vue

@@ -16,6 +16,7 @@ const isLanding = computed(() => {
 
 async function onLandingSend() {
   const text = landingDraft.value;
+  if (!text.trim()) return;
   landingDraft.value = "";
   await sendMessage(text);
 }
@@ -23,26 +24,32 @@ async function onLandingSend() {
 
 <template>
   <LayoutSistema>
-    <div v-if="isLanding" class="landing">
-      <div class="landingInner">
-        <div class="landingTitle">Como posso ajudar?</div>
-        <div class="landingSub">Digite sua pergunta no campo abaixo. Você também pode alimentar a base pela barra lateral.</div>
+    <div v-if="isLanding" class="min-h-[calc(100vh-4rem)] flex items-end justify-center pb-12 md:pb-16">
+      <div class="w-full max-w-[760px]">
+        <div class="text-3xl font-extrabold tracking-tight">Como posso ajudar?</div>
+        <div class="mt-2 text-sm text-muted-foreground">
+          Digite sua pergunta no campo abaixo. Você também pode alimentar a base pela barra lateral.
+        </div>
 
-        <div class="landingComposer">
+        <div class="mt-5 p-4">
           <textarea
             v-model="landingDraft"
             rows="2"
             placeholder="Digite sua pergunta..."
+            class="min-h-24"
             @keydown.enter.exact.prevent="onLandingSend"
           />
         </div>
 
-        <div v-if="chatError" class="muted" style="margin-top: 10px">Erro: {{ chatError }}</div>
+        <div v-if="chatError" class="mt-2.5 text-sm text-muted-foreground">Erro: {{ chatError }}</div>
       </div>
     </div>
 
-    <div v-else class="mainChat">
-      <ChatWindow :messages="chatMessages" :loading="chatLoading" :error="chatError" @send="sendMessage" />
+    <div v-else class="relative min-h-full w-full">
+      <div class="absolute inset-0 rounded-2xl bg-black/20 dark:bg-black/35" />
+      <div class="relative h-full w-full p-4 md:p-6">
+        <ChatWindow :messages="chatMessages" :loading="chatLoading" :error="chatError" @send="sendMessage" />
+      </div>
     </div>
   </LayoutSistema>
 </template>

Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff