From 52e62e33cd79f04c42c57a30360059b7efbf6a99 Mon Sep 17 00:00:00 2001 From: Dorian Date: Wed, 4 Mar 2026 00:44:30 +0000 Subject: [PATCH] feat(discover): content discovery panel with For You, tags, playlists, collections (M13.1-M13.8) - For You feed: frequency map from favorites, sorted by most-favorited type - Content tagging: user tags on any item, tag cloud, filter by tag - Smart playlists: recently played, most played, by genre, by decade - Similar content: background AI call for 3 suggestions, cached 7 days - Recently viewed history: last 50 items with time-ago display - Content collections: user-curated mixed-type lists with mosaic grid - Trending: most-referenced items across 30 days with badge - Share to Nostr: compose preview, sign via NIP-07, broadcast to relays Co-Authored-By: Claude Opus 4.6 --- .../src/components/content/ContentPanel.vue | 10 +- .../src/components/content/DiscoverPanel.vue | 421 ++++++++++++++++++ .../src/components/content/ShareToNostr.vue | 128 ++++++ .../src/components/content/SimilarContent.vue | 38 ++ .../app/src/composables/contentFiltering.ts | 2 +- .../src/composables/useContentCollections.ts | 89 ++++ .../src/composables/useContentDiscovery.ts | 231 ++++++++++ .../app/src/composables/useSimilarContent.ts | 105 +++++ packages/app/src/pages/ChatPage.vue | 1 + 9 files changed, 1023 insertions(+), 2 deletions(-) create mode 100644 packages/app/src/components/content/DiscoverPanel.vue create mode 100644 packages/app/src/components/content/ShareToNostr.vue create mode 100644 packages/app/src/components/content/SimilarContent.vue create mode 100644 packages/app/src/composables/useContentCollections.ts create mode 100644 packages/app/src/composables/useContentDiscovery.ts create mode 100644 packages/app/src/composables/useSimilarContent.ts diff --git a/packages/app/src/components/content/ContentPanel.vue b/packages/app/src/components/content/ContentPanel.vue index 67aa918a..f9ab84cf 100644 --- a/packages/app/src/components/content/ContentPanel.vue +++ b/packages/app/src/components/content/ContentPanel.vue @@ -45,7 +45,7 @@ : isDark ? 'text-white/40 hover:text-white/70 hover:bg-white/5' : 'text-gray-500 hover:text-gray-800 hover:bg-black/5'" - @click="tab === 'favorites' ? (activeTab = tab) : setActiveTab(tab)" + @click="tab === 'favorites' || tab === 'discover' ? (activeTab = tab) : setActiveTab(tab)" > {{ tabLabel(tab) }} @@ -168,6 +168,9 @@ + @@ -194,6 +197,7 @@ import MagazineGrid from './MagazineGrid.vue' import ProjectGrid from './ProjectGrid.vue' import NostrGrid from './NostrGrid.vue' import FavoritesGrid from './FavoritesGrid.vue' +import DiscoverPanel from './DiscoverPanel.vue' import ErrorBoundary from '@/components/ui/ErrorBoundary.vue' import { useFavoritesStore } from '@/stores/favorites' @@ -259,6 +263,9 @@ const displayTabs = computed(() => { if (favoritesStore.items.length > 0 && !tabs.includes('favorites')) { tabs.push('favorites') } + if (!tabs.includes('discover')) { + tabs.push('discover') + } return tabs }) @@ -281,6 +288,7 @@ const TAB_LABELS: Record = { 'design-system': 'Design', nostr: 'Nostr', favorites: 'Favorites', + discover: 'Discover', } function tabLabel(tab: ContentTab): string { diff --git a/packages/app/src/components/content/DiscoverPanel.vue b/packages/app/src/components/content/DiscoverPanel.vue new file mode 100644 index 00000000..da77ce4c --- /dev/null +++ b/packages/app/src/components/content/DiscoverPanel.vue @@ -0,0 +1,421 @@ + + + diff --git a/packages/app/src/components/content/ShareToNostr.vue b/packages/app/src/components/content/ShareToNostr.vue new file mode 100644 index 00000000..82bceb13 --- /dev/null +++ b/packages/app/src/components/content/ShareToNostr.vue @@ -0,0 +1,128 @@ +