diff --git a/frontend/src/components/RecipesView.vue b/frontend/src/components/RecipesView.vue
index 1304fd6..119dfc6 100644
--- a/frontend/src/components/RecipesView.vue
+++ b/frontend/src/components/RecipesView.vue
@@ -3,7 +3,7 @@
-
+
+ >
+ {{ tab.label }}
+ {{ tab.mobileLabel }}
+ {{ tab.label }}
+
- Scan
+
Scan
@@ -805,9 +810,9 @@ const settingsStore = useSettingsStore()
// Tab state
type TabId = 'find' | 'browse' | 'saved' | 'community' | 'build'
-const tabs: Array<{ id: TabId; label: string }> = [
+const tabs: Array<{ id: TabId; label: string; mobileLabel?: string }> = [
{ id: 'saved', label: 'Saved' },
- { id: 'build', label: 'Build Your Own' },
+ { id: 'build', label: 'Build Your Own', mobileLabel: 'Build' },
{ id: 'community', label: 'Community' },
{ id: 'find', label: 'Find' },
{ id: 'browse', label: 'Browse' },
@@ -1289,6 +1294,14 @@ watch(
padding-bottom: var(--spacing-sm);
}
+/* Prevent theme's mobile .btn white-space:normal from wrapping tab labels */
+@media (max-width: 480px) {
+ .tab-btn {
+ white-space: nowrap;
+ flex-shrink: 0;
+ }
+}
+
.tab-btn {
border-radius: var(--radius-md) var(--radius-md) 0 0;
border-bottom: none;
diff --git a/frontend/src/theme.css b/frontend/src/theme.css
index 7ac2e7a..14b5810 100644
--- a/frontend/src/theme.css
+++ b/frontend/src/theme.css
@@ -436,6 +436,24 @@
display: none;
}
+/* Horizontally scrollable tab bar — for tab rows with many items */
+.tab-bar-scroll {
+ display: flex;
+ gap: var(--spacing-xs);
+ overflow-x: auto;
+ overflow-y: visible;
+ scrollbar-width: none;
+ -webkit-overflow-scrolling: touch;
+ min-width: 0;
+ width: 100%;
+ flex-wrap: nowrap;
+ padding-bottom: 2px; /* prevent focus ring clipping */
+}
+
+.tab-bar-scroll::-webkit-scrollbar {
+ display: none;
+}
+
/* ============================================
TEXT UTILITIES
============================================ */