Add logo icon to components and update branding assets

- Integrated `logo-icon.svg` into headers, footer, and development layout for consistent branding.
- Updated `logo.svg` and `logo-icon.svg` with improved gradient and filter naming for clarity.
- Enhanced `README.md` and branding documentation with logo visuals and descriptions.
- Refined visual identity details in docs to emphasize the branding hierarchy and usage.
This commit is contained in:
Felipe Cardoso
2025-11-20 14:55:24 +01:00
parent e6813c87c3
commit b218be9318
9 changed files with 49 additions and 17 deletions

View File

@@ -1,5 +1,10 @@
# PragmaStack
<div align="center">
<img src="frontend/public/logo.svg" alt="PragmaStack Logo" width="200" />
<br />
</div>
> **The Pragmatic Full-Stack Template. Production-ready, security-first, and opinionated.**
<!--

View File

@@ -2,7 +2,21 @@
## Logo & Iconography
_Pending logo design._
## Logo
The **PragmaStack** logo represents the core values of the project: structure, speed, and clarity.
<div align="center">
<img src="../../public/logo.svg" alt="PragmaStack Logo" width="300" />
<p><em>The Stack: Geometric layers representing the full-stack architecture.</em></p>
</div>
### Icon
For smaller contexts (favicons, headers), we use the simplified icon:
<div align="center">
<img src="../../public/logo-icon.svg" alt="PragmaStack Icon" width="64" />
</div>
For now, we use the **Lucide React** icon set for all iconography. Icons should be used sparingly and meaningfully to enhance understanding, not just for decoration.

View File

@@ -1,11 +1,11 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="100%">
<linearGradient id="pragma-stack-icon-grad" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#0EA5E9;stop-opacity:1" />
<stop offset="100%" style="stop-color:#2563EB;stop-opacity:1" />
</linearGradient>
</defs>
<path d="M16 26L4 20L16 14L28 20L16 26Z" fill="url(#grad1)" opacity="0.6" />
<path d="M16 21L4 15L16 9L28 15L16 21Z" fill="url(#grad1)" opacity="0.8" />
<path d="M16 16L4 10L16 4L28 10L16 16Z" fill="url(#grad1)" />
<path d="M16 26L4 20L16 14L28 20L16 26Z" fill="url(#pragma-stack-icon-grad)" opacity="0.6" />
<path d="M16 21L4 15L16 9L28 15L16 21Z" fill="url(#pragma-stack-icon-grad)" opacity="0.8" />
<path d="M16 16L4 10L16 4L28 10L16 16Z" fill="url(#pragma-stack-icon-grad)" />
</svg>

Before

Width:  |  Height:  |  Size: 573 B

After

Width:  |  Height:  |  Size: 641 B

View File

@@ -1,10 +1,10 @@
<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="100%">
<linearGradient id="pragma-stack-grad" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#0EA5E9;stop-opacity:1" />
<stop offset="100%" style="stop-color:#2563EB;stop-opacity:1" />
</linearGradient>
<filter id="dropShadow" x="-20%" y="-20%" width="140%" height="140%">
<filter id="pragma-stack-shadow" x="-20%" y="-20%" width="140%" height="140%">
<feGaussianBlur in="SourceAlpha" stdDeviation="10"/>
<feOffset dx="0" dy="10" result="offsetblur"/>
<feComponentTransfer>
@@ -18,11 +18,11 @@
</defs>
<!-- Bottom Layer -->
<path d="M256 420L60 320L256 220L452 320L256 420Z" fill="url(#grad1)" opacity="0.6" />
<path d="M256 420L60 320L256 220L452 320L256 420Z" fill="url(#pragma-stack-grad)" opacity="0.6" />
<!-- Middle Layer -->
<path d="M256 340L60 240L256 140L452 240L256 340Z" fill="url(#grad1)" opacity="0.8" />
<path d="M256 340L60 240L256 140L452 240L256 340Z" fill="url(#pragma-stack-grad)" opacity="0.8" />
<!-- Top Layer -->
<path d="M256 260L60 160L256 60L452 160L256 260Z" fill="url(#grad1)" filter="url(#dropShadow)" />
<path d="M256 260L60 160L256 60L452 160L256 260Z" fill="url(#pragma-stack-grad)" filter="url(#pragma-stack-shadow)" />
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

11
frontend/src/app/icon.svg Normal file
View File

@@ -0,0 +1,11 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#0EA5E9;stop-opacity:1" />
<stop offset="100%" style="stop-color:#2563EB;stop-opacity:1" />
</linearGradient>
</defs>
<path d="M16 26L4 20L16 14L28 20L16 26Z" fill="url(#grad1)" opacity="0.6" />
<path d="M16 21L4 15L16 9L28 15L16 21Z" fill="url(#grad1)" opacity="0.8" />
<path d="M16 16L4 10L16 4L28 10L16 16Z" fill="url(#grad1)" />
</svg>

After

Width:  |  Height:  |  Size: 573 B

View File

@@ -11,7 +11,7 @@
import { Link } from '@/lib/i18n/routing';
import { usePathname } from '@/lib/i18n/routing';
import {
Code2,
Palette,
LayoutDashboard,
Box,
@@ -94,7 +94,7 @@ export function DevLayout({ children }: DevLayoutProps) {
<div className="flex h-14 items-center justify-between gap-6">
{/* Left: Logo + Badge */}
<div className="flex items-center gap-3 shrink-0">
<Code2 className="h-5 w-5 text-primary" />
<img src="/logo-icon.svg" alt="PragmaStack Logo" className="h-6 w-6" />
<h1 className="text-base font-semibold">PragmaStack</h1>
<Badge variant="secondary" className="text-xs">
Dev

View File

@@ -30,11 +30,11 @@ export function Header({ onOpenDemoModal }: HeaderProps) {
<header className="sticky top-0 z-50 w-full border-b bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60">
<div className="container mx-auto flex h-16 items-center justify-between px-6">
{/* Logo */}
<Link href="/" className="font-bold text-xl hover:opacity-80 transition-opacity">
<Link href="/" className="flex items-center gap-2 font-bold text-xl hover:opacity-80 transition-opacity">
<img src="/logo-icon.svg" alt="PragmaStack Logo" className="h-8 w-8" />
<span className="bg-gradient-to-r from-primary to-primary/60 bg-clip-text text-transparent">
PragmaStack
</span>{' '}
<span className="text-foreground">Template</span>
</span>
</Link>
{/* Desktop Navigation */}

View File

@@ -14,8 +14,9 @@ export function Footer() {
<footer className="border-t bg-muted/30">
<div className="container mx-auto px-4 py-6">
<div className="flex flex-col items-center justify-between space-y-4 md:flex-row md:space-y-0">
<div className="text-center text-sm text-muted-foreground md:text-left">
© {currentYear} PragmaStack. All rights reserved.
<div className="flex items-center gap-2 text-center text-sm text-muted-foreground md:text-left">
<img src="/logo-icon.svg" alt="PragmaStack Logo" className="h-5 w-5 opacity-70" />
<span>© {currentYear} PragmaStack. All rights reserved.</span>
</div>
<div className="flex space-x-6">
<Link

View File

@@ -83,6 +83,7 @@ export function Header() {
{/* Logo */}
<div className="flex items-center space-x-8">
<Link href="/" className="flex items-center space-x-2">
<img src="/logo-icon.svg" alt="PragmaStack Logo" className="h-8 w-8" />
<span className="text-xl font-bold text-foreground">PragmaStack</span>
</Link>