From 00bdc055ba6a0b59d0e7e6e98c0fd74eae6cbb76 Mon Sep 17 00:00:00 2001 From: Dorian Date: Tue, 3 Mar 2026 13:08:32 +0000 Subject: [PATCH] feat(app): add design system viewer, nostr feed, stop generation, and content refactor - Design system browser with grid/detail views for tokens and components - Nostr feed tab with note/article/zap filtering and relay status - Stop generation button to abort AI streaming mid-response - Paste & extract content without sending to AI - Refactor useContentPanel into contentExtraction.ts and contentFiltering.ts - Banner fallback composable for 3-stage image loading - Wikipedia and Google Books as fallback image sources - Loading skeletons with variant-specific shapes - Mobile UX: auto-switch to content, back button, detail flow - Project grid with breadcrumb nav and inline creation - Filesystem Vite plugin for local project browsing - Magazine text cleanup and song grid polish Co-Authored-By: Claude Opus 4.6 --- packages/app/dev-dist/sw.js | 2 +- .../app/src/components/chat/ChatHeader.vue | 23 + .../app/src/components/chat/ChatInput.vue | 66 +- .../app/src/components/chat/ChatWindow.vue | 31 +- .../app/src/components/content/BookDetail.vue | 38 +- .../components/content/ContentGridView.vue | 103 +- .../src/components/content/ContentPanel.vue | 9 +- .../src/components/content/ContextLoader.vue | 17 +- .../components/content/DesignSystemDetail.vue | 439 ++++++ .../components/content/DesignSystemGrid.vue | 174 +++ .../app/src/components/content/DetailView.vue | 8 + .../app/src/components/content/FilmDetail.vue | 44 +- .../app/src/components/content/FilmGrid.vue | 43 +- .../components/content/LoadingContentGrid.vue | 105 ++ .../src/components/content/MagazineGrid.vue | 12 +- .../content/MagazineSectionDetail.vue | 21 +- .../app/src/components/content/NostrGrid.vue | 278 ++++ .../src/components/content/ProjectGrid.vue | 169 +- .../app/src/components/content/SongGrid.vue | 8 +- .../src/components/content/TVSeriesDetail.vue | 35 +- .../src/components/content/TVSeriesGrid.vue | 4 +- .../app/src/composables/contentExtraction.ts | 967 ++++++++++++ .../app/src/composables/contentFiltering.ts | 144 ++ packages/app/src/composables/useAI.ts | 70 +- .../app/src/composables/useBannerFallback.ts | 103 ++ .../app/src/composables/useCodeContext.ts | 39 + .../app/src/composables/useContentPanel.ts | 1391 ++--------------- .../app/src/composables/useImageFallback.ts | 138 ++ packages/app/src/pages/ChatPage.vue | 41 +- packages/app/vite-fs.ts | 206 +++ packages/app/vite.config.ts | 2 + 31 files changed, 3175 insertions(+), 1555 deletions(-) create mode 100644 packages/app/src/components/content/DesignSystemDetail.vue create mode 100644 packages/app/src/components/content/DesignSystemGrid.vue create mode 100644 packages/app/src/components/content/LoadingContentGrid.vue create mode 100644 packages/app/src/components/content/NostrGrid.vue create mode 100644 packages/app/src/composables/contentExtraction.ts create mode 100644 packages/app/src/composables/contentFiltering.ts create mode 100644 packages/app/src/composables/useBannerFallback.ts create mode 100644 packages/app/vite-fs.ts diff --git a/packages/app/dev-dist/sw.js b/packages/app/dev-dist/sw.js index 8f8ae12b..25a1fb77 100644 --- a/packages/app/dev-dist/sw.js +++ b/packages/app/dev-dist/sw.js @@ -82,7 +82,7 @@ define(['./workbox-cf23aef7'], (function (workbox) { 'use strict'; "revision": "3ca0b8505b4bec776b69afdba2768812" }, { "url": "index.html", - "revision": "0.ndi22oikhk8" + "revision": "0.3epgdnb2r7k" }], {}); workbox.cleanupOutdatedCaches(); workbox.registerRoute(new workbox.NavigationRoute(workbox.createHandlerBoundToURL("index.html"), { diff --git a/packages/app/src/components/chat/ChatHeader.vue b/packages/app/src/components/chat/ChatHeader.vue index b4f2f3be..eecdfdc8 100644 --- a/packages/app/src/components/chat/ChatHeader.vue +++ b/packages/app/src/components/chat/ChatHeader.vue @@ -156,6 +156,21 @@ + +
+ +
@@ -167,6 +182,7 @@ import { ref, computed, watch, nextTick } from 'vue' import { useChatStore } from '@/stores/chat' import { useAI } from '@/composables/useAI' import { useTheme } from '@/composables/useTheme' +import { useContentPanel } from '@/composables/useContentPanel' defineProps<{ title: string @@ -250,6 +266,13 @@ function selectModel(providerId: string, modelId: string) { setModel(modelId) showModelPicker.value = false } + +const { enterDesignSystemMode } = useContentPanel() + +function openDesignSystem() { + enterDesignSystemMode() + showModelPicker.value = false +}