[{"data":1,"prerenderedAt":144},["ShallowReactive",2],{"project-es-listo":3},{"id":4,"title":5,"author":6,"body":7,"company":121,"date":122,"description":123,"extension":124,"highlight":125,"meta":126,"navigation":127,"path":128,"priority":129,"role":130,"section":131,"seo":132,"sitemap":133,"stem":134,"tags":135,"thumbnail":25,"year":142,"__hash__":143},"work\u002Fwork\u002Fes\u002Flisto.md","Listo","Salguento",{"type":8,"value":9,"toc":111},"minimark",[10,15,19,30,34,37,40,44,60,63,67,70,79,83,86,89,93,96,105],[11,12,14],"h2",{"id":13},"contexto","Contexto",[16,17,18],"p",{},"Listo es un gestor de tareas local-first creado como ejercicio de Angular. El proyecto explora cómo estructurar una aplicación frontend con datos persistentes, múltiples filtros y una interfaz accesible sin depender de autenticación ni de un backend.",[16,20,21,26],{},[22,23],"img",{"alt":24,"src":25},"Símbolo y nombre de Listo sobre un fondo oscuro.","\u002Fimg\u002Fwork\u002Flisto\u002Fog-image.png",[27,28,29],"em",{},"Identidad visual de Listo.",[11,31,33],{"id":32},"problema-técnico","Problema técnico",[16,35,36],{},"La interfaz necesita mantener las tareas pendientes y completadas sincronizadas con la búsqueda y la fecha seleccionada. La implementación inicial aplicaba cada nuevo filtro sobre un resultado ya filtrado, haciendo que algunos elementos desaparecieran después de varios cambios de búsqueda o fecha.",[16,38,39],{},"La solución combina la colección persistida, el término de búsqueda y la fecha seleccionada con RxJS. Cada evento recalcula el resultado desde la fuente original y conserva una única fuente de verdad. Las listas de tareas pendientes y completadas se derivan del mismo flujo compartido.",[11,41,43],{"id":42},"arquitectura-y-datos","Arquitectura y datos",[16,45,46,47,51,52,55,56,59],{},"La aplicación utiliza componentes standalone de Angular y separa modelos, persistencia, servicios y funcionalidades. Dexie proporciona una capa tipada sobre IndexedDB, mientras ",[48,49,50],"code",{},"liveQuery"," publica los cambios locales de forma reactiva. Los servicios encapsulan las operaciones de tareas y etiquetas, y ",[48,53,54],{},"combineLatest"," junto con ",[48,57,58],{},"shareReplay"," coordinan el estado presentado por la interfaz.",[16,61,62],{},"Los datos permanecen en el dispositivo del usuario. Esta decisión reduce la infraestructura necesaria y favorece la privacidad y el uso local, con la limitación consciente de no ofrecer sincronización entre dispositivos.",[11,64,66],{"id":65},"interfaz-y-accesibilidad","Interfaz y accesibilidad",[16,68,69],{},"El diseño se adapta desde una ventana centrada en el escritorio hasta una experiencia de pantalla completa en dispositivos pequeños. Los controles tienen nombres accesibles, foco visible y áreas de interacción adecuadas. Las acciones no dependen exclusivamente del hover y las transiciones respetan la preferencia de movimiento reducido.",[16,71,72,76],{},[22,73],{"alt":74,"src":75},"Interfaz de Listo en modo oscuro, con tareas pendientes organizadas por fecha, etiquetas y horario.","\u002Fimg\u002Fwork\u002Flisto\u002Finterface-listo.png",[27,77,78],{},"Interfaz principal con navegación por fecha, búsqueda y separación entre tareas pendientes y completadas.",[11,80,82],{"id":81},"calidad-y-evolución","Calidad y evolución",[16,84,85],{},"El proyecto fue migrado progresivamente de Angular 19 a Angular 22, incluyendo Angular Material, el sistema de build moderno, SSR y prerenderizado. La suite de pruebas también migró de Karma y Jasmine a Vitest, eliminando la necesidad de tener un navegador instalado en el entorno de integración continua.",[16,87,88],{},"Las pruebas cubren los servicios, la publicación del estado de búsqueda y fecha y las regresiones en la combinación de filtros. El build de producción genera los bundles del navegador, el servidor SSR y la ruta inicial prerenderizada.",[11,90,92],{"id":91},"límites-del-proyecto","Límites del proyecto",[16,94,95],{},"Listo se presenta como un estudio de ingeniería y no como un producto comercial. La autenticación, la colaboración, las notificaciones y la sincronización remota están fuera de su alcance. Las próximas evoluciones posibles incluyen pruebas end-to-end y una estrategia opcional de sincronización que preserve su enfoque local-first.",[16,97,98],{},[99,100,104],"a",{":rel":101,":target":102,"href":103},"noreferrer","_blank","https:\u002F\u002Flisto.salguento.xyz","Aplicación",[16,106,107],{},[99,108,110],{":rel":101,":target":102,"href":109},"https:\u002F\u002Fgithub.com\u002Fsalguento\u002Ftodo-angular","GitHub",{"title":112,"searchDepth":113,"depth":113,"links":114},"",2,[115,116,117,118,119,120],{"id":13,"depth":113,"text":14},{"id":32,"depth":113,"text":33},{"id":42,"depth":113,"text":43},{"id":65,"depth":113,"text":66},{"id":81,"depth":113,"text":82},{"id":91,"depth":113,"text":92},"Autoral","2026-07","Gestor de tareas local-first con estado reactivo y persistencia en el navegador","md",false,{},true,"\u002Fwork\u002Fes\u002Flisto","4","Desarrollador Frontend","engineering",{"title":5,"description":123},{"loc":128},"work\u002Fes\u002Flisto",[136,137,138,139,140,141],"TypeScript","Angular","RxJS","IndexedDB","Vitest","SSR",2025,"a97REWHiz7vSfwsYFgtXiN0kwwJSDaVZD68hF3uukC8",1785351609790]