-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
diff --git a/ui/src/components/asistencias/cardAsistencia.vue b/ui/src/components/asistencias/cardAsistencia.vue
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ui/src/components/asistencias/cardAsistencia.vue
@@ -0,0 +1 @@
+
diff --git a/ui/src/components/asistencias/tablaAsistencias.vue b/ui/src/components/asistencias/tablaAsistencias.vue
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ui/src/components/asistencias/tablaAsistencias.vue
@@ -0,0 +1 @@
+
diff --git a/ui/src/components/chat/CanvasChat.vue b/ui/src/components/chat/CanvasChat.vue
new file mode 100644
index 0000000..f591e82
--- /dev/null
+++ b/ui/src/components/chat/CanvasChat.vue
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+
diff --git a/ui/src/components/empleados/cardEmpleado.vue b/ui/src/components/empleados/cardEmpleado.vue
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ui/src/components/empleados/cardEmpleado.vue
@@ -0,0 +1 @@
+
diff --git a/ui/src/components/empleados/tablaEmpleados.vue b/ui/src/components/empleados/tablaEmpleados.vue
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ui/src/components/empleados/tablaEmpleados.vue
@@ -0,0 +1 @@
+
diff --git a/ui/src/components/planillas/cardPlanilla.vue b/ui/src/components/planillas/cardPlanilla.vue
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ui/src/components/planillas/cardPlanilla.vue
@@ -0,0 +1 @@
+
diff --git a/ui/src/components/planillas/tablaPlanillas.vue b/ui/src/components/planillas/tablaPlanillas.vue
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ui/src/components/planillas/tablaPlanillas.vue
@@ -0,0 +1 @@
+
diff --git a/ui/src/components/tareas/cardTarea.vue b/ui/src/components/tareas/cardTarea.vue
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ui/src/components/tareas/cardTarea.vue
@@ -0,0 +1 @@
+
diff --git a/ui/src/components/tareas/tablaTareas.vue b/ui/src/components/tareas/tablaTareas.vue
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ui/src/components/tareas/tablaTareas.vue
@@ -0,0 +1 @@
+
diff --git a/ui/src/components/ui/NavBar.vue b/ui/src/components/ui/NavBar.vue
new file mode 100644
index 0000000..34d94b1
--- /dev/null
+++ b/ui/src/components/ui/NavBar.vue
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ui/src/components/ui/SideDrawer.vue b/ui/src/components/ui/SideDrawer.vue
new file mode 100644
index 0000000..e69de29
diff --git a/ui/src/components/ui/TopBar.vue b/ui/src/components/ui/TopBar.vue
new file mode 100644
index 0000000..8f13576
--- /dev/null
+++ b/ui/src/components/ui/TopBar.vue
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
diff --git a/ui/src/main.js b/ui/src/main.js
index 2425c0f..512107d 100644
--- a/ui/src/main.js
+++ b/ui/src/main.js
@@ -1,5 +1,14 @@
import { createApp } from 'vue'
-import './style.css'
-import App from './App.vue'
+import { createPinia } from 'pinia'
+import router from './router'
-createApp(App).mount('#app')
+import App from './App.vue'
+import './style.css' // Tailwind o tus estilos globales
+
+const app =
+createApp(App)
+
+app.use(createPinia())
+app.use(router)
+
+app.mount('#app')
diff --git a/ui/src/router/index.js b/ui/src/router/index.js
new file mode 100644
index 0000000..f13d3ec
--- /dev/null
+++ b/ui/src/router/index.js
@@ -0,0 +1,35 @@
+import { createRouter, createMemoryHistory } from 'vue-router'
+
+const routes = [
+ // Chat principal y config
+ { path: '/', name: 'chat', component: () => import('@/views/ChatView.vue') },
+ { path: '/config', name: 'settings', component: () => import('@/views/SettingsView.vue') },
+
+ // ────── Empleados ──────
+ { path: '/empleados', name: 'empleados-index', component: () => import('@/views/empleados/EmpleadosIndex.vue') },
+ { path: '/empleados/nuevo', name: 'empleados-new', component: () => import('@/views/empleados/EmpleadoForm.vue') },
+ { path: '/empleados/:id', name: 'empleados-edit', component: () => import('@/views/empleados/EmpleadoForm.vue'), props: true },
+
+ // ────── Tareas ──────
+ { path: '/tareas', name: 'tareas-index', component: () => import('@/views/tareas/TareasIndex.vue') },
+ { path: '/tareas/nuevo', name: 'tareas-new', component: () => import('@/views/tareas/TareaForm.vue') },
+ { path: '/tareas/:id', name: 'tareas-edit', component: () => import('@/views/tareas/TareaForm.vue'), props: true },
+
+ // ────── Planillas ──────
+ { path: '/planillas', name: 'planillas-index', component: () => import('@/views/planillas/PlanillasIndex.vue') },
+ { path: '/planillas/nuevo', name: 'planillas-new', component: () => import('@/views/planillas/PlanillaForm.vue') },
+ { path: '/planillas/:id', name: 'planillas-edit', component: () => import('@/views/planillas/PlanillaForm.vue'), props: true },
+
+ // ────── Asistencias ──────
+ { path: '/asistencias', name: 'asistencias-index', component: () => import('@/views/asistencias/AsistenciasIndex.vue') },
+ { path: '/asistencias/nuevo', name: 'asistencias-new', component: () => import('@/views/asistencias/AsistenciaForm.vue') },
+ { path: '/asistencias/:id', name: 'asistencias-edit', component: () => import('@/views/asistencias/AsistenciaForm.vue'), props: true },
+
+ // 404
+ { path: '/:pathMatch(.*)*', name: 'not-found', component: () => import('@/views/NotFound.vue') }
+]
+
+export default createRouter({
+ history: createMemoryHistory(),
+ routes,
+})
\ No newline at end of file
diff --git a/ui/src/stores/useAsistencias.js b/ui/src/stores/useAsistencias.js
new file mode 100644
index 0000000..45a6c1b
--- /dev/null
+++ b/ui/src/stores/useAsistencias.js
@@ -0,0 +1,5 @@
+import { defineStore } from 'pinia'
+
+export const useAsistencias = defineStore('asistencias', {
+ state: () => ({ asistencias: [] }),
+})
diff --git a/ui/src/stores/useChat.js b/ui/src/stores/useChat.js
new file mode 100644
index 0000000..d37af3c
--- /dev/null
+++ b/ui/src/stores/useChat.js
@@ -0,0 +1,42 @@
+
+
+
+import { defineStore } from 'pinia'
+
+/**
+ * Chat store
+ * - items: hist de mensajes [{ type, owner, text, … }]
+ * - add(): agrega un mensaje
+ * - run(): ejecuta /comandos y mete componentes dinámicos
+ */
+export const useChat = defineStore('chat', {
+ state: () => ({
+ items: [],
+ }),
+
+ actions: {
+ add (item) {
+ this.items.push(item)
+ },
+
+ async run (cmd) {
+ switch (cmd) {
+ case 'empleados':
+ // para demo solo mostramos un texto, después inyectaremos un componente
+ this.add({ type: 'text', owner: 'bot', text: '🎉 Módulo Empleados aún en construcción.' })
+ break
+ case 'tareas':
+ this.add({ type: 'text', owner: 'bot', text: '🛠️ Módulo Tareas aún en construcción.' })
+ break
+ case 'planillas':
+ this.add({ type: 'text', owner: 'bot', text: '📂 Módulo Planillas en construcción.' })
+ break
+ case 'asistencias':
+ this.add({ type: 'text', owner: 'bot', text: '⏰ Módulo Asistencias en construcción.' })
+ break
+ default:
+ this.add({ type: 'text', owner: 'bot', text: `❓ No reconozco /${cmd}` })
+ }
+ },
+ },
+})
\ No newline at end of file
diff --git a/ui/src/stores/useEmpleados.js b/ui/src/stores/useEmpleados.js
new file mode 100644
index 0000000..60d0d3d
--- /dev/null
+++ b/ui/src/stores/useEmpleados.js
@@ -0,0 +1,12 @@
+import { defineStore } from 'pinia'
+
+export const useEmpleados = defineStore('empleados', {
+ state: () => ({ empleados: [] }),
+ actions: {
+ // placeholder para cargar/crear empleados
+ async fetchAll () {
+ // simulamos fetch
+ this.empleados = []
+ },
+ },
+})
diff --git a/ui/src/stores/usePlanillas.js b/ui/src/stores/usePlanillas.js
new file mode 100644
index 0000000..5a264f7
--- /dev/null
+++ b/ui/src/stores/usePlanillas.js
@@ -0,0 +1,5 @@
+import { defineStore } from 'pinia'
+
+export const usePlanillas = defineStore('planillas', {
+ state: () => ({ planillas: [] }),
+})
diff --git a/ui/src/stores/useTareas.js b/ui/src/stores/useTareas.js
new file mode 100644
index 0000000..b8caafb
--- /dev/null
+++ b/ui/src/stores/useTareas.js
@@ -0,0 +1,5 @@
+import { defineStore } from 'pinia'
+
+export const useTareas = defineStore('tareas', {
+ state: () => ({ tareas: [] }),
+})
diff --git a/ui/src/stores/useUI.js b/ui/src/stores/useUI.js
new file mode 100644
index 0000000..dd009eb
--- /dev/null
+++ b/ui/src/stores/useUI.js
@@ -0,0 +1,20 @@
+// src/stores/useUi.js
+import { defineStore } from 'pinia'
+
+export const useUi = defineStore('ui', {
+ state: () => ({
+ sidebarOpen: true, // visible por defecto en desktop
+ }),
+
+ actions: {
+ toggleSidebar () {
+ this.sidebarOpen = !this.sidebarOpen
+ },
+ closeSidebar () {
+ this.sidebarOpen = false
+ },
+ openSidebar () {
+ this.sidebarOpen = true
+ },
+ },
+})
diff --git a/ui/src/style.css b/ui/src/style.css
index f691315..9fd180c 100644
--- a/ui/src/style.css
+++ b/ui/src/style.css
@@ -1,79 +1,4 @@
-:root {
- font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
- line-height: 1.5;
- font-weight: 400;
-
- color-scheme: light dark;
- color: rgba(255, 255, 255, 0.87);
- background-color: #242424;
-
- font-synthesis: none;
- text-rendering: optimizeLegibility;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-}
-
-a {
- font-weight: 500;
- color: #646cff;
- text-decoration: inherit;
-}
-a:hover {
- color: #535bf2;
-}
-
-body {
- margin: 0;
- display: flex;
- place-items: center;
- min-width: 320px;
- min-height: 100vh;
-}
-
-h1 {
- font-size: 3.2em;
- line-height: 1.1;
-}
-
-button {
- border-radius: 8px;
- border: 1px solid transparent;
- padding: 0.6em 1.2em;
- font-size: 1em;
- font-weight: 500;
- font-family: inherit;
- background-color: #1a1a1a;
- cursor: pointer;
- transition: border-color 0.25s;
-}
-button:hover {
- border-color: #646cff;
-}
-button:focus,
-button:focus-visible {
- outline: 4px auto -webkit-focus-ring-color;
-}
-
-.card {
- padding: 2em;
-}
-
-#app {
- max-width: 1280px;
- margin: 0 auto;
- padding: 2rem;
- text-align: center;
-}
-
-@media (prefers-color-scheme: light) {
- :root {
- color: #213547;
- background-color: #ffffff;
- }
- a:hover {
- color: #747bff;
- }
- button {
- background-color: #f9f9f9;
- }
-}
+@import "tailwindcss";
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
diff --git a/ui/src/views/ChatView.vue b/ui/src/views/ChatView.vue
new file mode 100644
index 0000000..62807f2
--- /dev/null
+++ b/ui/src/views/ChatView.vue
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
diff --git a/ui/src/views/NotFound.vue b/ui/src/views/NotFound.vue
new file mode 100644
index 0000000..5625c3f
--- /dev/null
+++ b/ui/src/views/NotFound.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
404
+
Uy, no encontramos esa página.
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ui/src/views/SettingsView.vue b/ui/src/views/SettingsView.vue
new file mode 100644
index 0000000..e69de29
diff --git a/ui/src/views/asistencias/AsistenciaForm.vue b/ui/src/views/asistencias/AsistenciaForm.vue
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ui/src/views/asistencias/AsistenciaForm.vue
@@ -0,0 +1 @@
+
diff --git a/ui/src/views/asistencias/AsistenciasIndex.vue b/ui/src/views/asistencias/AsistenciasIndex.vue
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ui/src/views/asistencias/AsistenciasIndex.vue
@@ -0,0 +1 @@
+
diff --git a/ui/src/views/empleados/EmpleadoForm.vue b/ui/src/views/empleados/EmpleadoForm.vue
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ui/src/views/empleados/EmpleadoForm.vue
@@ -0,0 +1 @@
+
diff --git a/ui/src/views/empleados/EmpleadosIndex.vue b/ui/src/views/empleados/EmpleadosIndex.vue
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ui/src/views/empleados/EmpleadosIndex.vue
@@ -0,0 +1 @@
+
diff --git a/ui/src/views/planillas/PlanillaForm.vue b/ui/src/views/planillas/PlanillaForm.vue
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ui/src/views/planillas/PlanillaForm.vue
@@ -0,0 +1 @@
+
diff --git a/ui/src/views/planillas/PlanillasIndex.vue b/ui/src/views/planillas/PlanillasIndex.vue
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ui/src/views/planillas/PlanillasIndex.vue
@@ -0,0 +1 @@
+
diff --git a/ui/src/views/tareas/TareaForm.vue b/ui/src/views/tareas/TareaForm.vue
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ui/src/views/tareas/TareaForm.vue
@@ -0,0 +1 @@
+
diff --git a/ui/src/views/tareas/TareasIndex.vue b/ui/src/views/tareas/TareasIndex.vue
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ui/src/views/tareas/TareasIndex.vue
@@ -0,0 +1 @@
+
diff --git a/ui/vite.config.js b/ui/vite.config.js
index bbcf80c..282f8df 100644
--- a/ui/vite.config.js
+++ b/ui/vite.config.js
@@ -1,7 +1,17 @@
+// vite.config.js
import { defineConfig } from 'vite'
+import tailwindcss from '@tailwindcss/vite'
import vue from '@vitejs/plugin-vue'
+import path from 'node:path'
-// https://vite.dev/config/
export default defineConfig({
- plugins: [vue()],
+ plugins: [
+ vue(),
+ tailwindcss(),
+ ],
+ resolve: {
+ alias: {
+ '@': path.resolve(__dirname, 'src'), // ← apunta a /ui/src
+ },
+ },
})