From 1cbe22c6abfe8d1b520fec9c3cc2a9905522e6e5 Mon Sep 17 00:00:00 2001 From: Edwin Date: Wed, 6 Aug 2025 13:40:08 +0300 Subject: [PATCH 1/3] feat: add recommendation wizard with theme-aware UI --- src/components/RecommendationWizard.vue | 261 ++++++++++++++++++++++++ src/views/HomeView.vue | 40 +++- 2 files changed, 296 insertions(+), 5 deletions(-) create mode 100644 src/components/RecommendationWizard.vue diff --git a/src/components/RecommendationWizard.vue b/src/components/RecommendationWizard.vue new file mode 100644 index 0000000..1dfb15e --- /dev/null +++ b/src/components/RecommendationWizard.vue @@ -0,0 +1,261 @@ + + + + + + diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue index 2e14707..4845326 100644 --- a/src/views/HomeView.vue +++ b/src/views/HomeView.vue @@ -5,6 +5,7 @@ import AppSearch from '@/components/form/AppSearch.vue'; import CategorySelector from '@/components/form/CategorySelector.vue'; import ReshuffleButton from '@/components/form/ReshuffleButton.vue'; import SurpriseMeButton from '@/components/form/SurpriseMeButton.vue'; +import RecommendationWizard from '@/components/RecommendationWizard.vue'; import { useSEO } from '@/composables/useSEO'; import { apps } from '@/data/apps'; import { categories } from '@/data/categories'; @@ -35,15 +36,24 @@ const suggestions = apps.flatMap((app) => app.alternatives || []); const orderedApps = computed(() => { // Access shuffleTrigger to ensure re-computation on each shuffle globalStore.shuffleTrigger; - return globalStore.isReshuffled - ? shuffleAppsPurely(apps) + return globalStore.isReshuffled + ? shuffleAppsPurely(apps) : sortAppsByLinksThenRandom(apps); }); +const selectedHostingLevel = ref<1 | 2 | 3 | null>(null); + const filteredApps = computed(() => { - return filterApps(orderedApps.value, selectedCategory.value, searchQuery.value); + let result = filterApps(orderedApps.value, selectedCategory.value, searchQuery.value); + + if (selectedHostingLevel.value !== null) { + result = result.filter(app => app.selfHostingLevel === selectedHostingLevel.value); + } + + return result; }); + const title = computed(() => t('app.title')); const subtitleBase = computed(() => { const isMobile = window.innerWidth <= 600; @@ -101,6 +111,22 @@ function handleAbrirModal(app: App) { }); } +function handleWizardResults(answers: { + category: CategoryId | null; + beginnerFriendly: boolean | null; + selfHostingLevel: 1 | 2 | 3 | null; +}) { + if (answers.category) selectedCategory.value = answers.category; + if (answers.beginnerFriendly !== null) { + searchQuery.value = answers.beginnerFriendly ? 'beginner' : ''; + } + if (answers.selfHostingLevel !== null) { + selectedHostingLevel.value = answers.selfHostingLevel; + } + + showFilters.value = true; +} + function handleSurpriseMe(app: App) { // Reuse existing modal logic handleAbrirModal(app); @@ -199,6 +225,10 @@ watch([searchQuery, selectedCategory], ([query, category]) => {
+
+ +
+
{ />
- From 839f560315de07a410c04a0bc9d4ab707d9e7843 Mon Sep 17 00:00:00 2001 From: Edwin Date: Wed, 6 Aug 2025 14:25:03 +0300 Subject: [PATCH 2/3] feat: add recommendation wizard with theme-aware UI --- src/components/RecommendationWizard.vue | 209 ++++++------------------ src/views/HomeView.vue | 35 +++- 2 files changed, 77 insertions(+), 167 deletions(-) diff --git a/src/components/RecommendationWizard.vue b/src/components/RecommendationWizard.vue index 1dfb15e..194c861 100644 --- a/src/components/RecommendationWizard.vue +++ b/src/components/RecommendationWizard.vue @@ -1,146 +1,30 @@ - - - + diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue index 4845326..af2d970 100644 --- a/src/views/HomeView.vue +++ b/src/views/HomeView.vue @@ -250,10 +250,35 @@ watch([searchQuery, selectedCategory], ([query, category]) => {
- + class="grid grid-cols-1 w-full max-w-full md:grid-cols-2 lg:grid-cols-3 gap-3 sm:gap-12 mt-2" +> + + + + + +
- - From d01b766364203ed3055347d0315add32bdb4489f Mon Sep 17 00:00:00 2001 From: Edwin Date: Wed, 6 Aug 2025 14:26:22 +0300 Subject: [PATCH 3/3] feat: add detailed comments --- src/components/RecommendationWizard.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/RecommendationWizard.vue b/src/components/RecommendationWizard.vue index 194c861..895c30f 100644 --- a/src/components/RecommendationWizard.vue +++ b/src/components/RecommendationWizard.vue @@ -143,4 +143,3 @@ const reset = () => { -