- WHISKYVAULT
+
+
+
+ DRAMLOG
-
- {t('home.searchPlaceholder').replace('...', '')}
+
+ Premium Digitaler Tasting Begleiter für Genießer.
@@ -169,20 +169,20 @@ export default function Home() {
}
return (
-
-
+
+
-
- WHISKYVAULT
+
+ DRAMLOG
{activeSession && (
-
-
+
+
-
+
Live: {activeSession.name}
@@ -195,7 +195,7 @@ export default function Home() {
@@ -206,7 +206,7 @@ export default function Home() {
-
+
@@ -215,25 +215,27 @@ export default function Home() {
-
-
- {t('home.collection')}
-
- {bottles.length}
+
+
+
+ Collection
+
+
+ {bottles.length} Bottles
-
+
{isLoading ? (
-
-
+
+
) : fetchError ? (
-
- {t('common.error')}
- {fetchError}
+
+ {t('common.error')}
+ {fetchError}
@@ -244,7 +246,14 @@ export default function Home() {
-
+ window.scrollTo({ top: 0, behavior: 'smooth' })}
+ onShelf={() => document.getElementById('collection')?.scrollIntoView({ behavior: 'smooth' })}
+ onSearch={() => document.getElementById('search-filter')?.scrollIntoView({ behavior: 'smooth' })}
+ onProfile={() => window.scrollTo({ top: 0, behavior: 'smooth' })}
+ />
+
setIsFlowOpen(false)}
diff --git a/src/components/BottleGrid.tsx b/src/components/BottleGrid.tsx
index 29ceb44..248f105 100644
--- a/src/components/BottleGrid.tsx
+++ b/src/components/BottleGrid.tsx
@@ -36,68 +36,73 @@ function BottleCard({ bottle, sessionId }: BottleCardProps) {
return (
-
-
-
-
+ {/* Image Layer - Edge to Edge */}
+
+
- {sessionId && (
-
-
- {t('grid.addSession')}
-
- )}
+ {/* Gradient Overlay as requested: bottom third, black to transparent */}
+
+
- {bottle.last_tasted && (
-
-
- {new Date(bottle.last_tasted).toLocaleDateString(locale === 'de' ? 'de-DE' : 'en-US')}
-
- )}
-
-
-
-
-
-
- {bottle.distillery}
- {(bottle.is_whisky === false || (bottle.confidence && bottle.confidence < 70)) && (
-
-
- {t('grid.reviewRequired')}
-
- )}
-
-
- {bottle.name || t('grid.unknownBottle')}
-
-
-
-
-
+ {/* Content Layer */}
+
+
+ {/* Tags Layer - Minimalist Glassmorphism */}
+
+
{shortenCategory(bottle.category)}
-
+
{bottle.abv}% VOL
-
-
- {t('grid.addedOn')}
-
+
+
+ {bottle.distillery}
+
+
+ {bottle.name || t('grid.unknownBottle')}
+
+
+
+ {/* Metadata items */}
+
+
+
{new Date(bottle.created_at).toLocaleDateString(locale === 'de' ? 'de-DE' : 'en-US')}
-
+
+ {bottle.last_tasted && (
+
+
+ {new Date(bottle.last_tasted).toLocaleDateString(locale === 'de' ? 'de-DE' : 'en-US')}
+
+ )}
+
+ {/* Top Overlays */}
+ {(bottle.is_whisky === false || (bottle.confidence && bottle.confidence < 70)) && (
+
+
+
+
+
+ )}
+
+ {sessionId && (
+
+
+ ADD TO SESSION
+
+ )}
);
}
@@ -190,51 +195,51 @@ export default function BottleGrid({ bottles }: BottleGridProps) {
const activeFiltersCount = (selectedCategory ? 1 : 0) + (selectedDistillery ? 1 : 0);
return (
-
- {/* Search and Filters */}
-
-
+
+ {/* Search and Filters - Minimalist Look */}
+
+
-
+
setSearchQuery(e.target.value)}
- className="w-full pl-12 pr-12 py-3.5 bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-[1.25rem] focus:ring-2 focus:ring-amber-500/20 focus:border-amber-500/50 outline-none transition-all shadow-sm"
+ className="w-full pl-8 pr-8 py-4 bg-transparent border-b border-white/10 focus:border-[#C89D46] outline-none transition-all text-white placeholder:text-[#8F9096] font-sans"
/>
{searchQuery && (
)}
-
+
- {/* Category Quick Filter (Always visible row) */}
-
+ {/* Category Quick Filter - Glass Chips */}
+
{categories.map((cat) => (
))}
- {/* Collapsible Advanced Filters */}
+ {/* Collapsible Advanced Filters - Minimalist Overlay */}
{isFiltersOpen && (
-
-
-
-
-
+
+
+
+
+
+ {distilleries.map((dist) => (
- {distilleries.map((dist) => (
-
- ))}
-
+ ))}
-
-
+
diff --git a/src/components/BottomNavigation.tsx b/src/components/BottomNavigation.tsx
new file mode 100644
index 0000000..8fe190e
--- /dev/null
+++ b/src/components/BottomNavigation.tsx
@@ -0,0 +1,108 @@
+'use client';
+
+import React from 'react';
+import { Home, Grid, Scan, User, Search } from 'lucide-react';
+import { usePathname } from 'next/navigation';
+
+interface BottomNavigationProps {
+ onHome?: () => void;
+ onShelf?: () => void;
+ onSearch?: () => void;
+ onProfile?: () => void;
+ onScan: (base64: string) => void;
+}
+
+export const BottomNavigation = ({ onHome, onShelf, onSearch, onProfile, onScan }: BottomNavigationProps) => {
+ const fileInputRef = React.useRef(null);
+
+ const handleScanClick = () => {
+ fileInputRef.current?.click();
+ };
+
+ const handleFileChange = (e: React.ChangeEvent) => {
+ const file = e.target.files?.[0];
+ if (file) {
+ const reader = new FileReader();
+ reader.onloadend = () => {
+ onScan(reader.result as string);
+ };
+ reader.readAsDataURL(file);
+ }
+ };
+
+ return (
+
+ {/* Hidden Input for Scanning */}
+
+
+ {/* Background Container mit Glassmorphism */}
+
+
+
+ {/* Left Actions */}
+
+
+
+
+ {/* Spacer für den Center Button */}
+
+
+ {/* Right Actions */}
+
+
+
+
+
+ {/* THE FLOATING MAGIC BUTTON */}
+
+
+ {/* Visual Gold Glow */}
+
+
+
+
+
+ );
+};
diff --git a/src/components/BuddyList.tsx b/src/components/BuddyList.tsx
index 0e17f14..4ba9208 100644
--- a/src/components/BuddyList.tsx
+++ b/src/components/BuddyList.tsx
@@ -80,18 +80,18 @@ export default function BuddyList() {
};
return (
-
+
-
-
+
+
{t('buddy.title')}
{!isCollapsed && buddies.length > 0 && (
- ({buddies.length})
+ ({buddies.length})
)}
+ DRAMLOG
-- {t('home.searchPlaceholder').replace('...', '')} +
+ Premium Digitaler Tasting Begleiter für Genießer.
- WHISKYVAULT
+
+ DRAMLOG
{activeSession && (
-
-
+
+
-
+
Live: {activeSession.name}
@@ -195,7 +195,7 @@ export default function Home() {
@@ -206,7 +206,7 @@ export default function Home() {
-
+
@@ -215,25 +215,27 @@ export default function Home() {
-
-
- {t('home.collection')}
-
- {bottles.length}
+
+
+
+ Collection
+
+
+ {bottles.length} Bottles
-
+
{isLoading ? (
-
-
+
+
) : fetchError ? (
-
- {t('common.error')}
- {fetchError}
+
+ {t('common.error')}
+ {fetchError}
@@ -244,7 +246,14 @@ export default function Home() {
-
+ window.scrollTo({ top: 0, behavior: 'smooth' })}
+ onShelf={() => document.getElementById('collection')?.scrollIntoView({ behavior: 'smooth' })}
+ onSearch={() => document.getElementById('search-filter')?.scrollIntoView({ behavior: 'smooth' })}
+ onProfile={() => window.scrollTo({ top: 0, behavior: 'smooth' })}
+ />
+
setIsFlowOpen(false)}
diff --git a/src/components/BottleGrid.tsx b/src/components/BottleGrid.tsx
index 29ceb44..248f105 100644
--- a/src/components/BottleGrid.tsx
+++ b/src/components/BottleGrid.tsx
@@ -36,68 +36,73 @@ function BottleCard({ bottle, sessionId }: BottleCardProps) {
return (
-
-
-
-
+ {/* Image Layer - Edge to Edge */}
+
+
- {sessionId && (
-
-
- {t('grid.addSession')}
-
- )}
+ {/* Gradient Overlay as requested: bottom third, black to transparent */}
+
+
- {bottle.last_tasted && (
-
-
- {new Date(bottle.last_tasted).toLocaleDateString(locale === 'de' ? 'de-DE' : 'en-US')}
-
- )}
-
-
-
-
-
-
- {bottle.distillery}
- {(bottle.is_whisky === false || (bottle.confidence && bottle.confidence < 70)) && (
-
-
- {t('grid.reviewRequired')}
-
- )}
-
-
- {bottle.name || t('grid.unknownBottle')}
-
-
-
-
-
+ {/* Content Layer */}
+
+
+ {/* Tags Layer - Minimalist Glassmorphism */}
+
+
{shortenCategory(bottle.category)}
-
+
{bottle.abv}% VOL
-
-
- {t('grid.addedOn')}
-
+
+
+ {bottle.distillery}
+
+
+ {bottle.name || t('grid.unknownBottle')}
+
+
+
+ {/* Metadata items */}
+
+
+
{new Date(bottle.created_at).toLocaleDateString(locale === 'de' ? 'de-DE' : 'en-US')}
-
+
+ {bottle.last_tasted && (
+
+
+ {new Date(bottle.last_tasted).toLocaleDateString(locale === 'de' ? 'de-DE' : 'en-US')}
+
+ )}
+
+ {/* Top Overlays */}
+ {(bottle.is_whisky === false || (bottle.confidence && bottle.confidence < 70)) && (
+
+
+
+
+
+ )}
+
+ {sessionId && (
+
+
+ ADD TO SESSION
+
+ )}
);
}
@@ -190,51 +195,51 @@ export default function BottleGrid({ bottles }: BottleGridProps) {
const activeFiltersCount = (selectedCategory ? 1 : 0) + (selectedDistillery ? 1 : 0);
return (
-
- {/* Search and Filters */}
-
-
+
+ {/* Search and Filters - Minimalist Look */}
+
+
-
+
setSearchQuery(e.target.value)}
- className="w-full pl-12 pr-12 py-3.5 bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-[1.25rem] focus:ring-2 focus:ring-amber-500/20 focus:border-amber-500/50 outline-none transition-all shadow-sm"
+ className="w-full pl-8 pr-8 py-4 bg-transparent border-b border-white/10 focus:border-[#C89D46] outline-none transition-all text-white placeholder:text-[#8F9096] font-sans"
/>
{searchQuery && (
)}
-
+
- {/* Category Quick Filter (Always visible row) */}
-
+ {/* Category Quick Filter - Glass Chips */}
+
{categories.map((cat) => (
))}
- {/* Collapsible Advanced Filters */}
+ {/* Collapsible Advanced Filters - Minimalist Overlay */}
{isFiltersOpen && (
-
-
-
-
-
+
+
+
+
+
+ {distilleries.map((dist) => (
- {distilleries.map((dist) => (
-
- ))}
-
+ ))}
-
-
+
diff --git a/src/components/BottomNavigation.tsx b/src/components/BottomNavigation.tsx
new file mode 100644
index 0000000..8fe190e
--- /dev/null
+++ b/src/components/BottomNavigation.tsx
@@ -0,0 +1,108 @@
+'use client';
+
+import React from 'react';
+import { Home, Grid, Scan, User, Search } from 'lucide-react';
+import { usePathname } from 'next/navigation';
+
+interface BottomNavigationProps {
+ onHome?: () => void;
+ onShelf?: () => void;
+ onSearch?: () => void;
+ onProfile?: () => void;
+ onScan: (base64: string) => void;
+}
+
+export const BottomNavigation = ({ onHome, onShelf, onSearch, onProfile, onScan }: BottomNavigationProps) => {
+ const fileInputRef = React.useRef(null);
+
+ const handleScanClick = () => {
+ fileInputRef.current?.click();
+ };
+
+ const handleFileChange = (e: React.ChangeEvent) => {
+ const file = e.target.files?.[0];
+ if (file) {
+ const reader = new FileReader();
+ reader.onloadend = () => {
+ onScan(reader.result as string);
+ };
+ reader.readAsDataURL(file);
+ }
+ };
+
+ return (
+
+ {/* Hidden Input for Scanning */}
+
+
+ {/* Background Container mit Glassmorphism */}
+
+
+
+ {/* Left Actions */}
+
+
+
+
+ {/* Spacer für den Center Button */}
+
+
+ {/* Right Actions */}
+
+
+
+
+
+ {/* THE FLOATING MAGIC BUTTON */}
+
+
+ {/* Visual Gold Glow */}
+
+
+
+
+
+ );
+};
diff --git a/src/components/BuddyList.tsx b/src/components/BuddyList.tsx
index 0e17f14..4ba9208 100644
--- a/src/components/BuddyList.tsx
+++ b/src/components/BuddyList.tsx
@@ -80,18 +80,18 @@ export default function BuddyList() {
};
return (
-
+
-
-
+
+
{t('buddy.title')}
{!isCollapsed && buddies.length > 0 && (
- ({buddies.length})
+ ({buddies.length})
)}
- {t('home.collection')}
-
- {bottles.length}
+
+
+
+ Collection
+
+
+ {bottles.length} Bottles
-
+
{isLoading ? (
-
-
+
+
) : fetchError ? (
-
- {t('common.error')}
- {fetchError}
+
+ {t('common.error')}
+ {fetchError}
@@ -244,7 +246,14 @@ export default function Home() {
-
+ window.scrollTo({ top: 0, behavior: 'smooth' })}
+ onShelf={() => document.getElementById('collection')?.scrollIntoView({ behavior: 'smooth' })}
+ onSearch={() => document.getElementById('search-filter')?.scrollIntoView({ behavior: 'smooth' })}
+ onProfile={() => window.scrollTo({ top: 0, behavior: 'smooth' })}
+ />
+
setIsFlowOpen(false)}
diff --git a/src/components/BottleGrid.tsx b/src/components/BottleGrid.tsx
index 29ceb44..248f105 100644
--- a/src/components/BottleGrid.tsx
+++ b/src/components/BottleGrid.tsx
@@ -36,68 +36,73 @@ function BottleCard({ bottle, sessionId }: BottleCardProps) {
return (
-
-
-
-
+ {/* Image Layer - Edge to Edge */}
+
+
- {sessionId && (
-
-
- {t('grid.addSession')}
-
- )}
+ {/* Gradient Overlay as requested: bottom third, black to transparent */}
+
+
- {bottle.last_tasted && (
-
-
- {new Date(bottle.last_tasted).toLocaleDateString(locale === 'de' ? 'de-DE' : 'en-US')}
-
- )}
-
-
-
-
-
-
- {bottle.distillery}
- {(bottle.is_whisky === false || (bottle.confidence && bottle.confidence < 70)) && (
-
-
- {t('grid.reviewRequired')}
-
- )}
-
-
- {bottle.name || t('grid.unknownBottle')}
-
-
-
-
-
+ {/* Content Layer */}
+
+
+ {/* Tags Layer - Minimalist Glassmorphism */}
+
+
{shortenCategory(bottle.category)}
-
+
{bottle.abv}% VOL
-
-
- {t('grid.addedOn')}
-
+
+
+ {bottle.distillery}
+
+
+ {bottle.name || t('grid.unknownBottle')}
+
+
+
+ {/* Metadata items */}
+
+
+
{new Date(bottle.created_at).toLocaleDateString(locale === 'de' ? 'de-DE' : 'en-US')}
-
+
+ {bottle.last_tasted && (
+
+
+ {new Date(bottle.last_tasted).toLocaleDateString(locale === 'de' ? 'de-DE' : 'en-US')}
+
+ )}
+
+ {/* Top Overlays */}
+ {(bottle.is_whisky === false || (bottle.confidence && bottle.confidence < 70)) && (
+
+
+
+
+
+ )}
+
+ {sessionId && (
+
+
+ ADD TO SESSION
+
+ )}
);
}
@@ -190,51 +195,51 @@ export default function BottleGrid({ bottles }: BottleGridProps) {
const activeFiltersCount = (selectedCategory ? 1 : 0) + (selectedDistillery ? 1 : 0);
return (
-
- {/* Search and Filters */}
-
-
+
+ {/* Search and Filters - Minimalist Look */}
+
+
-
+
setSearchQuery(e.target.value)}
- className="w-full pl-12 pr-12 py-3.5 bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-[1.25rem] focus:ring-2 focus:ring-amber-500/20 focus:border-amber-500/50 outline-none transition-all shadow-sm"
+ className="w-full pl-8 pr-8 py-4 bg-transparent border-b border-white/10 focus:border-[#C89D46] outline-none transition-all text-white placeholder:text-[#8F9096] font-sans"
/>
{searchQuery && (
)}
-
+
- {/* Category Quick Filter (Always visible row) */}
-
+ {/* Category Quick Filter - Glass Chips */}
+
{categories.map((cat) => (
))}
- {/* Collapsible Advanced Filters */}
+ {/* Collapsible Advanced Filters - Minimalist Overlay */}
{isFiltersOpen && (
-
-
-
-
-
+
+
+
+
+
+ {distilleries.map((dist) => (
- {distilleries.map((dist) => (
-
- ))}
-
+ ))}
-
-
+
diff --git a/src/components/BottomNavigation.tsx b/src/components/BottomNavigation.tsx
new file mode 100644
index 0000000..8fe190e
--- /dev/null
+++ b/src/components/BottomNavigation.tsx
@@ -0,0 +1,108 @@
+'use client';
+
+import React from 'react';
+import { Home, Grid, Scan, User, Search } from 'lucide-react';
+import { usePathname } from 'next/navigation';
+
+interface BottomNavigationProps {
+ onHome?: () => void;
+ onShelf?: () => void;
+ onSearch?: () => void;
+ onProfile?: () => void;
+ onScan: (base64: string) => void;
+}
+
+export const BottomNavigation = ({ onHome, onShelf, onSearch, onProfile, onScan }: BottomNavigationProps) => {
+ const fileInputRef = React.useRef(null);
+
+ const handleScanClick = () => {
+ fileInputRef.current?.click();
+ };
+
+ const handleFileChange = (e: React.ChangeEvent) => {
+ const file = e.target.files?.[0];
+ if (file) {
+ const reader = new FileReader();
+ reader.onloadend = () => {
+ onScan(reader.result as string);
+ };
+ reader.readAsDataURL(file);
+ }
+ };
+
+ return (
+
+ {/* Hidden Input for Scanning */}
+
+
+ {/* Background Container mit Glassmorphism */}
+
+
+
+ {/* Left Actions */}
+
+
+
+
+ {/* Spacer für den Center Button */}
+
+
+ {/* Right Actions */}
+
+
+
+
+
+ {/* THE FLOATING MAGIC BUTTON */}
+
+
+ {/* Visual Gold Glow */}
+
+
+
+
+
+ );
+};
diff --git a/src/components/BuddyList.tsx b/src/components/BuddyList.tsx
index 0e17f14..4ba9208 100644
--- a/src/components/BuddyList.tsx
+++ b/src/components/BuddyList.tsx
@@ -80,18 +80,18 @@ export default function BuddyList() {
};
return (
-
+
-
-
+
+
{t('buddy.title')}
{!isCollapsed && buddies.length > 0 && (
- ({buddies.length})
+ ({buddies.length})
)}
+ Collection +
+ + {bottles.length} Bottles - +{t('common.error')}
-{fetchError}
+{t('common.error')}
+{fetchError}
@@ -244,7 +246,14 @@ export default function Home() {{bottle.distillery}
- {(bottle.is_whisky === false || (bottle.confidence && bottle.confidence < 70)) && ( -- {bottle.name || t('grid.unknownBottle')} -
-+ {bottle.distillery} +
+