implemented new bugs

This commit is contained in:
Nicholai 2025-12-27 07:03:37 -07:00
parent d0016b008c
commit cdf0b9f567
30 changed files with 387 additions and 96 deletions

BIN
dev/brand-identity.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 MiB

View File

@ -21,6 +21,80 @@ Development log for tracking changes, decisions, and next steps.
---
## 2025-12-27 - Logo Integration & Favicon Generation
### Changes
- **Generated Complete Favicon Set**: Used ffmpeg to convert logo-black.png into all standard favicon sizes
- 16x16 favicon.ico (classic browser favicon)
- 32x32 favicon-32.png (standard size)
- 192x192 favicon-192.png (Android/PWA)
- 180x180 apple-touch-icon.png (iOS)
- 512x512 favicon-512.png (high-res/PWA)
- **WebP Optimization**: Converted all three logo variants to WebP format for modern browsers with transparency support
- logo-col.png (2.7MB) → logo-col.webp (513KB) - 81% reduction
- logo-black.png (781KB) → logo-black.webp (423KB) - 46% reduction
- logo-white.png (1.5MB) → logo-white.webp (578KB) - 61% reduction
- Initial attempt with AVIF failed due to libaom-av1 codec not supporting alpha channel transparency
- **Navigation Logo**: Replaced placeholder "S" badge with colored logo (logo-col.webp/png) in src/pages/index.astro:40-55
- Used `<picture>` element with WebP + PNG fallback
- Set to 48x48px size for optimal navigation display
- **Footer Logo**: Replaced placeholder "S" badge with white logo (logo-white.webp/png) in src/pages/index.astro:681-696
- Provides clean contrast against dark footer background
- Maintains brand consistency across page sections
- **HTML Head Updates**: Added complete favicon references in src/layouts/Layout.astro:19-24
- SVG favicon (primary, with dark mode support)
- ICO fallback for legacy browsers
- Multiple PNG sizes for different contexts
- Apple touch icon for iOS home screen
### Decisions
- **Logo Placement Strategy**:
- Navigation: Colored logo for maximum brand presence on light background
- Footer: White logo for contrast on dark background (#1c1917)
- Favicons: Black logo as base for simple, recognizable appearance
- **Image Format Strategy**: Used `<picture>` element with WebP as primary format and PNG fallback for maximum compatibility and performance
- Chose WebP over AVIF due to better transparency (alpha channel) support with current ffmpeg/libaom-av1 build
- **Favicon Approach**: Generated multiple sizes to support all platforms (web browsers, Android, iOS, PWA) from single source
- **Compression**: Leveraged WebP format for 46-81% file size reduction while maintaining quality and transparency
### Technical Details
- Used ffmpeg with lanczos scaling filter for high-quality favicon resizing
- Used libwebp encoder for WebP compression with alpha channel (bgra format) to preserve transparency
- All images maintain RGBA/BGRA color space for transparency support
- Progressive encoding for optimal loading experience
- AVIF attempted first but libaom-av1 codec incompatible with yuva420p pixel format, falling back to yuv420p which strips alpha channel
### Next Steps
- [ ] Test favicon display across different browsers and devices
- [ ] Consider creating a PWA manifest file to complement the favicon set
- [ ] Monitor AVIF adoption and adjust fallback strategy if needed
- [ ] Potentially create additional logo sizes for different marketing contexts
---
## 2025-12-27 - Hybrid "Eden" Design Implementation
### Changes
- **Aesthetic Overhaul**: Transformed the template into "Eden Style" (Editorial + Organic).
- Adopted `Playfair Display` (Serif) for headings.
- Updated color palette to Earth Tones: Deep Forest (`#3A4D39`), Sage (`#739072`), Cream (`#ECE3CE`), and Stone Black (`#1c1917`).
- **Structure Refinement (Hybrid)**:
- Rebuilt "More Than Just Painting" section with a split "List + Floating Cards" layout.
- **Restored** the unified "Rounded Dark Footer" to anchor the page.
- **Cleaned** Hero background shapes (Geometric vs. Blurry) for a crisp look.
- Updated `design.json` with new identity and tokens.
### Decisions
- **Hybrid Approach**: We combined the trustworthy/sturdy feel of the original template (Rounded Footer, Clean Shapes) with the premium/editorial feel of the new reference (Serif fonts, Floating UI cards).
- **Typography**: Paired `Playfair Display` with `Plus Jakarta Sans` to balance elegance with modern readability.
### Next Steps
- [ ] Visual QA of all service pages (if expanding beyond single page).
- [ ] Connect Contact Form to backend/service.
- [ ] Replace placeholder "Map" with actual embed or image.
---
## 2024-12-27 - Minimal Template Setup
### Changes

231
dev/design.json Normal file
View File

@ -0,0 +1,231 @@
{
"brand": {
"name": "Summit Painting & Handyman Services",
"tagline": "Craftsmanship For Your Home",
"essence": [
"Trustworthy",
"Editorial",
"Organic",
"Sturdy"
],
"description": "Premium painting, wood restoration, and handyman services for Colorado Springs."
},
"colors": {
"primary": {
"forest": {
"hex": "#3A4D39",
"rgb": "rgb(58, 77, 57)",
"usage": "Primary brand color, headers, CTA buttons"
}
},
"secondary": {
"sage": {
"hex": "#739072",
"rgb": "rgb(115, 144, 114)",
"usage": "Accent color, secondary elements, backgrounds"
},
"cream": {
"hex": "#ECE3CE",
"rgb": "rgb(236, 227, 206)",
"usage": "Background, light sections, contrast"
}
},
"neutral": {
"stoneBlack": {
"hex": "#1C1917",
"rgb": "rgb(28, 25, 23)",
"usage": "Text, footer, dark elements"
},
"white": {
"hex": "#FFFFFF",
"rgb": "rgb(255, 255, 255)",
"usage": "Background, text on dark"
}
}
},
"typography": {
"headings": {
"fontFamily": "Playfair Display",
"weights": [
400,
500,
600,
700
],
"style": "serif",
"usage": "Headers, titles, hero text",
"characteristics": "Editorial, elegant, trustworthy"
},
"body": {
"fontFamily": "Plus Jakarta Sans",
"weights": [
300,
400,
500,
600,
700
],
"style": "sans-serif",
"usage": "Body text, paragraphs, UI elements",
"characteristics": "Modern, clean, readable"
},
"scale": {
"h1": {
"fontSize": "3.5rem",
"lineHeight": "1.2",
"fontWeight": 700,
"fontFamily": "Playfair Display"
},
"h2": {
"fontSize": "2.5rem",
"lineHeight": "1.3",
"fontWeight": 600,
"fontFamily": "Playfair Display"
},
"h3": {
"fontSize": "2rem",
"lineHeight": "1.4",
"fontWeight": 600,
"fontFamily": "Playfair Display"
},
"h4": {
"fontSize": "1.5rem",
"lineHeight": "1.4",
"fontWeight": 500,
"fontFamily": "Playfair Display"
},
"body": {
"fontSize": "1rem",
"lineHeight": "1.6",
"fontWeight": 400,
"fontFamily": "Plus Jakarta Sans"
},
"small": {
"fontSize": "0.875rem",
"lineHeight": "1.5",
"fontWeight": 400,
"fontFamily": "Plus Jakarta Sans"
}
}
},
"logo": {
"primary": {
"type": "Mountain with paintbrush icon + wordmark",
"variants": [
"full-color",
"white",
"black"
],
"clearSpace": "Minimum 20px on all sides",
"minSize": "120px width"
},
"icon": {
"description": "Mountain peaks with paintbrush overlay",
"style": "Clean, geometric, organic"
},
"lockup": {
"vertical": "Icon above text",
"horizontal": "Icon left of text"
}
},
"spacing": {
"xs": "4px",
"sm": "8px",
"md": "16px",
"lg": "24px",
"xl": "32px",
"2xl": "48px",
"3xl": "64px",
"4xl": "96px"
},
"layout": {
"maxWidth": "1440px",
"containerPadding": "24px",
"grid": {
"columns": 12,
"gutter": "24px"
}
},
"patterns": {
"brushStrokes": {
"description": "Organic paintbrush strokes and mountain silhouettes",
"colors": [
"forest",
"sage"
],
"usage": "Backgrounds, texture, visual interest",
"style": "Hand-painted, organic, natural"
}
},
"components": {
"buttons": {
"primary": {
"background": "#3A4D39",
"color": "#FFFFFF",
"padding": "12px 32px",
"borderRadius": "4px",
"fontFamily": "Plus Jakarta Sans",
"fontWeight": 600,
"hover": {
"background": "#2a3729"
}
},
"secondary": {
"background": "transparent",
"color": "#3A4D39",
"border": "2px solid #3A4D39",
"padding": "12px 32px",
"borderRadius": "4px",
"fontFamily": "Plus Jakarta Sans",
"fontWeight": 600,
"hover": {
"background": "#3A4D39",
"color": "#FFFFFF"
}
}
},
"cards": {
"background": "#FFFFFF",
"border": "1px solid #ECE3CE",
"borderRadius": "8px",
"padding": "32px",
"shadow": "0 2px 8px rgba(0,0,0,0.1)"
},
"footer": {
"background": "#1C1917",
"color": "#FFFFFF",
"sections": [
"Contact Us",
"Hybrid Footer",
"Links"
],
"layout": "Three-column grid"
}
},
"imagery": {
"style": "Natural, authentic, craft-focused",
"subjects": [
"Tools",
"Materials",
"Craftsmanship",
"Colorado landscapes"
],
"treatment": "Clean, well-lit, professional",
"overlays": "Sage or forest tinted overlays at 20-40% opacity"
},
"voice": {
"tone": [
"Professional",
"Approachable",
"Trustworthy",
"Local"
],
"language": "Clear, straightforward, emphasizing quality and craftsmanship",
"messaging": "Premium services with personal touch, Colorado Springs expertise"
},
"contact": {
"phone": "(312) 456-7890",
"email": "summit@gmail.com",
"location": "Colorado Springs"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
public/favicon-512.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
public/media/brush1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

BIN
public/media/brushjar.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

BIN
public/media/logo-black.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 781 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 423 KiB

BIN
public/media/logo-col.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 MiB

BIN
public/media/logo-col.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 513 KiB

BIN
public/media/logo-white.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 578 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 MiB

BIN
src/assets/cards.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

BIN
src/assets/mountains.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

BIN
src/assets/puttyknife2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

View File

@ -17,6 +17,11 @@ import "../styles/global.css";
/>
<meta name="viewport" content="width=device-width" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32.png" />
<link rel="icon" type="image/png" sizes="192x192" href="/favicon-192.png" />
<link rel="icon" type="image/png" sizes="512x512" href="/favicon-512.png" />
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
<link
href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400..900;1,400..900&family=Plus+Jakarta+Sans:wght@400;500;600;700&display=swap"
rel="stylesheet"

View File

@ -20,9 +20,13 @@ import {
// Branding Colors (Refined for Eden Style):
// Primary Dark: #1c1917 (Stone 950)
// Accent Green: #3A4D39 (Deep Forest)
// Soft Sage: #739072 (Muted Green)
// Cream/Beige: #ECE3CE
// Background: #FAF9F6 (Stone 50)
import { Image } from "astro:assets";
import cardsImg from "../assets/cards.png";
import puttyKnifeImg from "../assets/puttyknife2.png";
import closeUpBrushImg from "../assets/closeupbrush4.png";
import mountainsImg from "../assets/mountains.png";
---
<Layout title="Summit Painting & Handyman Services | Colorado Springs">
@ -34,11 +38,16 @@ import {
class="max-w-7xl mx-auto px-6 py-4 flex items-center justify-between"
>
<div class="flex items-center gap-3">
<div
class="w-8 h-8 rounded-full bg-[#3A4D39] flex items-center justify-center text-white"
>
<span class="font-serif font-bold text-lg">S</span>
</div>
<picture>
<source srcset="/media/logo-col.webp" type="image/webp" />
<img
src="/media/logo-col.png"
alt="Summit Painting Logo"
class="w-12 h-12"
width="48"
height="48"
/>
</picture>
<span
class="text-xl font-serif font-medium tracking-tight text-[#1c1917]"
>Summit Painting</span
@ -87,25 +96,16 @@ import {
<div
class="relative bg-[#3A4D39] rounded-[3rem] p-8 md:p-16 overflow-hidden min-h-[600px] flex flex-col items-center justify-center text-center"
>
<!-- Background Decoration (Simplified Geometric) -->
<Image
src={mountainsImg}
alt="Colorado mountains background"
class="absolute inset-0 w-full h-full object-cover opacity-40 mix-blend-overlay"
/>
<!-- Dark Gradient Overlay for Readability -->
<div
class="absolute top-0 left-0 w-full h-full overflow-hidden pointer-events-none"
class="absolute inset-0 bg-gradient-to-b from-[#3A4D39]/80 via-[#3A4D39]/50 to-[#3A4D39]/90"
>
<!-- Circle Top Left -->
<div
class="absolute -top-20 -left-20 w-80 h-80 rounded-full border-[20px] border-[#739072] opacity-20"
>
</div>
<!-- Pill Bottom Right -->
<div
class="absolute bottom-20 right-0 w-64 h-32 bg-[#ECE3CE] rounded-l-full opacity-10"
>
</div>
<!-- Small Dot -->
<div
class="absolute top-40 right-40 w-8 h-8 bg-[#ECE3CE] rounded-full opacity-40"
>
</div>
</div>
<div class="relative z-10 max-w-3xl mx-auto mt-8">
@ -283,6 +283,12 @@ import {
class="absolute -right-20 -bottom-20 w-64 h-64 bg-[#739072]/10 rounded-full blur-3xl group-hover:bg-[#739072]/20 transition-colors"
>
</div>
<!-- Decorative Image (Prop Style) -->
<Image
src={closeUpBrushImg}
alt="Paint brush close up"
class="absolute -right-8 -bottom-16 w-80 h-auto object-contain opacity-100 group-hover:scale-105 transition-transform duration-500 rotate-6"
/>
</div>
<!-- Service 2 -->
@ -328,6 +334,12 @@ import {
class="absolute -right-20 -bottom-20 w-64 h-64 bg-[#ECE3CE]/30 rounded-full blur-3xl group-hover:bg-[#ECE3CE]/50 transition-colors"
>
</div>
<!-- Decorative Image (Prop Style) -->
<Image
src={puttyKnifeImg}
alt="Putty knife tools"
class="absolute -right-8 -bottom-8 w-64 h-auto object-contain opacity-100 group-hover:scale-105 transition-transform duration-500 -rotate-3"
/>
</div>
</div>
</section>
@ -463,75 +475,20 @@ import {
</div>
<div
class="w-full md:w-1/2 relative h-[450px] flex items-center justify-center"
class="w-full md:w-1/2 relative h-[450px] flex items-center justify-center p-8"
>
<!-- Large Sage Circle -->
<!-- Large Sage Circle Back drop -->
<div
class="w-[400px] h-[400px] bg-[#739072]/20 rounded-full absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2"
class="w-[400px] h-[400px] bg-[#739072]/10 rounded-full absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2"
>
</div>
<!-- Floating Card 1 (Top Left) -->
<div
class="absolute top-12 left-8 bg-white p-4 rounded-2xl shadow-lg border border-stone-100 flex items-center gap-4 w-60 z-20 hover:scale-105 transition-transform duration-500"
>
<div
class="w-10 h-10 rounded-full bg-[#1c1917] flex items-center justify-center"
>
<Paintbrush size={18} class="text-white" />
</div>
<div>
<p class="text-sm font-bold text-[#1c1917]">
Interior
</p>
<p class="text-xs text-stone-500">Painting</p>
</div>
<div class="ml-auto text-[#739072]">
<Check size={16} />
</div>
</div>
<!-- Floating Card 2 (Center Right) -->
<div
class="absolute top-1/2 right-6 -translate-y-1/2 bg-white p-5 rounded-2xl shadow-xl border border-stone-100 flex items-center gap-4 w-72 z-30 hover:scale-105 transition-transform duration-500"
>
<div
class="w-12 h-12 rounded-full bg-[#3A4D39] flex items-center justify-center"
>
<LayoutGrid size={20} class="text-white" />
</div>
<div>
<p class="text-base font-bold text-[#1c1917]">
Deck Restoration
</p>
<p class="text-xs text-stone-500">Stain & Seal</p>
</div>
<div class="ml-auto text-[#739072]">
<Check size={20} />
</div>
</div>
<!-- Floating Card 3 (Bottom Left) -->
<div
class="absolute bottom-16 left-12 bg-white p-4 rounded-2xl shadow-lg border border-stone-100 flex items-center gap-4 w-64 z-20 hover:scale-105 transition-transform duration-500"
>
<div
class="w-10 h-10 rounded-full bg-[#ECE3CE] flex items-center justify-center"
>
<Box size={18} class="text-[#3A4D39]" />
</div>
<div>
<p class="text-sm font-bold text-[#1c1917]">
Handyman
</p>
<p class="text-xs text-stone-500">
Fixes & Install
</p>
</div>
<div class="ml-auto text-[#739072]">
<Check size={16} />
</div>
</div>
<!-- Cards Image -->
<Image
src={cardsImg}
alt="Service cards deck"
class="relative z-10 w-full max-w-xl h-auto object-contain drop-shadow-2xl rounded-[2.5rem] hover:scale-105 transition-transform duration-700"
/>
</div>
</div>
</section>
@ -656,11 +613,27 @@ import {
</div>
<div
class="relative w-full md:w-[400px] h-64 bg-stone-800 rounded-2xl overflow-hidden border border-stone-700 flex items-center justify-center"
class="relative w-full md:w-[400px] h-64 bg-[#2a2725] rounded-2xl overflow-hidden border border-stone-700 flex items-center justify-center group"
>
<p class="text-stone-500 text-sm">[Map Placeholder]</p>
<div class="absolute inset-0 bg-[#3A4D39]/20"></div>
<div
class="absolute w-4 h-4 rounded-full bg-[#739072] shadow-[0_0_0_8px_rgba(115,144,114,0.2)] animate-pulse"
class="relative z-10 flex flex-col items-center gap-3"
>
<MapPin
size={32}
class="text-[#739072] drop-shadow-md"
/>
<p
class="text-stone-400 text-sm font-medium tracking-wide"
>
Serving Colorado Springs
</p>
</div>
<!-- Pulse Effect -->
<div
class="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-32 h-32 bg-[#739072]/10 rounded-full blur-xl animate-pulse"
>
</div>
</div>
@ -706,11 +679,19 @@ import {
<div class="flex flex-col md:flex-row justify-between gap-12 mb-16">
<div>
<div class="flex items-center gap-2 mb-6">
<div
class="w-8 h-8 rounded-full bg-[#739072] flex items-center justify-center text-white text-sm font-serif font-bold"
>
S
</div>
<picture>
<source
srcset="/media/logo-white.webp"
type="image/webp"
/>
<img
src="/media/logo-white.png"
alt="Summit Painting Logo"
class="w-12 h-12"
width="48"
height="48"
/>
</picture>
<span
class="text-xl font-serif font-medium tracking-tight"
>Summit Painting</span