diff --git a/client/components/brand/Brand.tsx b/client/components/brand/Brand.tsx new file mode 100644 index 0000000..89680bf --- /dev/null +++ b/client/components/brand/Brand.tsx @@ -0,0 +1,53 @@ +import type { ComponentProps } from 'react'; +import { cn } from '@/lib/utils'; +import { BRAND, BRAND_GLYPHS, type BrandGlyphName } from '@/lib/brand'; + +type ImgProps = Omit, 'src' | 'alt'>; + +export function BrandMark({ className, ...props }: ImgProps) { + return ( + {BRAND.name} + ); +} + +export function BrandWordmark({ compact = false, className }: { compact?: boolean; className?: string }) { + return ( + + {compact ? BRAND.compactName : BRAND.name} + + ); +} + +export function BrandGlyph({ + name, + className, + iconClassName, +}: { + name: BrandGlyphName; + className?: string; + iconClassName?: string; +}) { + const glyph = BRAND_GLYPHS[name]; + const Icon = glyph.icon; + + return ( + + + + ); +} diff --git a/client/lib/brand.ts b/client/lib/brand.ts new file mode 100644 index 0000000..f95069c --- /dev/null +++ b/client/lib/brand.ts @@ -0,0 +1,49 @@ +import { + BarChart3, + CalendarDays, + Database, + Landmark, + LockKeyhole, + Receipt, + ShieldCheck, + TrendingDown, + type LucideIcon, +} from 'lucide-react'; + +export const BRAND = { + name: 'Bill Tracker', + compactName: 'Bill Tracker', + tagline: 'Calm command for household money.', + repositoryUrl: 'https://dream.scheller.ltd/null/BillTracker', + assets: { + logo: '/brand/logo.png', + favicon: '/brand/logo.png', + appleTouchIcon: '/brand/apple-touch-icon.png', + pwa192: '/brand/pwa-192.png', + pwa512: '/brand/pwa-512.png', + legacyLogo: '/img/logo.png', + }, +} as const; + +export type BrandGlyphName = + | 'tracker' + | 'bills' + | 'calendar' + | 'analytics' + | 'data' + | 'banking' + | 'snowball' + | 'security'; + +export const BRAND_GLYPHS: Record = { + tracker: { label: 'Tracker', icon: BarChart3 }, + bills: { label: 'Bills', icon: Receipt }, + calendar: { label: 'Calendar', icon: CalendarDays }, + analytics: { label: 'Analytics', icon: BarChart3 }, + data: { label: 'Data', icon: Database }, + banking: { label: 'Banking', icon: Landmark }, + snowball: { label: 'Snowball', icon: TrendingDown }, + security: { label: 'Security', icon: ShieldCheck }, +}; + +export const ADMIN_GLYPH = { label: 'Admin', icon: LockKeyhole } as const; diff --git a/client/public/brand/apple-touch-icon.png b/client/public/brand/apple-touch-icon.png new file mode 100644 index 0000000..06c79f7 Binary files /dev/null and b/client/public/brand/apple-touch-icon.png differ diff --git a/client/public/brand/logo.png b/client/public/brand/logo.png new file mode 100644 index 0000000..6885b04 Binary files /dev/null and b/client/public/brand/logo.png differ diff --git a/client/public/brand/pwa-192.png b/client/public/brand/pwa-192.png new file mode 100644 index 0000000..22a25bc Binary files /dev/null and b/client/public/brand/pwa-192.png differ diff --git a/client/public/brand/pwa-512.png b/client/public/brand/pwa-512.png new file mode 100644 index 0000000..68ad5ec Binary files /dev/null and b/client/public/brand/pwa-512.png differ